ZGlmZiAtLWdpdCBhL2lwcm91dGUyL0FuZHJvaWQubWsgYi9pcHJvdXRlMi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNTNlN2QKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEgQEAKK2luY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvQ09QWUlORyBiL2lwcm91dGUyL0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkxMjEwOQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL0NPUFlJTkcKQEAgLTAsMCArMSwzNDAgQEAKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisJCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQorCisgQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgICAgICAgICAgICAgICAgICAgICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQorc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKwwKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCithIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAorcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCittZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgordGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKK2VpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCitsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCit0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KK2lzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgorV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCitzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKK2NvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKK2NvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKK25vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKK2FuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoreW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CisgICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKKyAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CisgICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAorICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KKyAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKKyAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKKyAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCisgICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKKyAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAorICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KKyAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKwwKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorDAorICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorDAorICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKK3Rob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKK2VpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCit0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLgorCisgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKK3RvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCittYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscworb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAorT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKK1RPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKK1BST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAorUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORworT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCitZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgorUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKwkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIHllYXIgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5CitiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKK2NvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2lwcm91dGUyL0NsZWFuU3BlYy5tayBiL2lwcm91dGUyL0NsZWFuU3BlYy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODRlMWI2Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvQ2xlYW5TcGVjLm1rCkBAIC0wLDAgKzEsNDkgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgSWYgeW91IGRvbid0IG5lZWQgdG8gZG8gYSBmdWxsIGNsZWFuIGJ1aWxkIGJ1dCB3b3VsZCBsaWtlIHRvIHRvdWNoCisjIGEgZmlsZSBvciBkZWxldGUgc29tZSBpbnRlcm1lZGlhdGUgZmlsZXMsIGFkZCBhIGNsZWFuIHN0ZXAgdG8gdGhlIGVuZAorIyBvZiB0aGUgbGlzdC4gIFRoZXNlIHN0ZXBzIHdpbGwgb25seSBiZSBydW4gb25jZSwgaWYgdGhleSBoYXZlbid0IGJlZW4KKyMgcnVuIGJlZm9yZS4KKyMKKyMgRS5nLjoKKyMgICAgICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgdG91Y2ggLWMgZXh0ZXJuYWwvc3FsaXRlL3NxbGl0ZTMuaCkKKyMgICAgICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL29iai9TVEFUSUNfTElCUkFSSUVTL2xpYnpfaW50ZXJtZWRpYXRlcykKKyMKKyMgQWx3YXlzIHVzZSAidG91Y2ggLWMiIGFuZCAicm0gLWYiIG9yICJybSAtcmYiIHRvIGdyYWNlZnVsbHkgZGVhbCB3aXRoCisjIGZpbGVzIHRoYXQgYXJlIG1pc3Npbmcgb3IgaGF2ZSBiZWVuIG1vdmVkLgorIworIyBVc2UgJChQUk9EVUNUX09VVCkgdG8gZ2V0IHRvIHRoZSAib3V0L3RhcmdldC9wcm9kdWN0L2JsYWgvIiBkaXJlY3RvcnkuCisjIFVzZSAkKE9VVF9ESVIpIHRvIHJlZmVyIHRvIHRoZSAib3V0IiBkaXJlY3RvcnkuCisjCisjIElmIHlvdSBuZWVkIHRvIHJlLWRvIHNvbWV0aGluZyB0aGF0J3MgYWxyZWFkeSBtZW50aW9uZWQsIGp1c3QgY29weQorIyB0aGUgY29tbWFuZCBhbmQgYWRkIGl0IHRvIHRoZSBib3R0b20gb2YgdGhlIGxpc3QuICBFLmcuLCBpZiBhIGNoYW5nZQorIyB0aGF0IHlvdSBtYWRlIGxhc3Qgd2VlayByZXF1aXJlZCB0b3VjaGluZyBhIGZpbGUgYW5kIGEgY2hhbmdlIHlvdQorIyBtYWRlIHRvZGF5IHJlcXVpcmVzIHRvdWNoaW5nIHRoZSBzYW1lIGZpbGUsIGp1c3QgY29weSB0aGUgb2xkCisjIHRvdWNoIHN0ZXAgYW5kIGFkZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgorIworIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisjIEZvciBleGFtcGxlOgorIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9vYmovQVBQUy9BbmRyb2lkVGVzdHNfaW50ZXJtZWRpYXRlcykKKyMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2NvcmVfaW50ZXJtZWRpYXRlcykKKyMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIGZpbmQgJChPVVRfRElSKSAtdHlwZSBmIC1uYW1lICJJR1RhbGtTZXNzaW9uKiIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mKQorIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL2RhdGEvKikKKworIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvTU9EVUxFX0xJQ0VOU0VfR1BMIGIvaXByb3V0ZTIvTU9EVUxFX0xJQ0VOU0VfR1BMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9NT0RVTEVfTElDRU5TRV9HUEwKZGlmZiAtLWdpdCBhL2lwcm91dGUyL01ha2VmaWxlIGIvaXByb3V0ZTIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcxNzZiZQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL01ha2VmaWxlCkBAIC0wLDAgKzEsODggQEAKK1BSRUZJWD89L3VzcgorTElCRElSPz0kKFBSRUZJWCkvbGliCitTQklORElSPz0vc2JpbgorQ09ORkRJUj89L2V0Yy9pcHJvdXRlMgorREFUQURJUj89JChQUkVGSVgpL3NoYXJlCitET0NESVI/PSQoREFUQURJUikvZG9jL2lwcm91dGUyCitNQU5ESVI/PSQoREFUQURJUikvbWFuCitBUlBERElSPz0vdmFyL2xpYi9hcnBkCitLRVJORUxfSU5DTFVERT89L3Vzci9pbmNsdWRlCisKKyMgUGF0aCB0byBkYl8xODUuaCBpbmNsdWRlCitEQk1fSU5DTFVERTo9JChERVNURElSKS91c3IvaW5jbHVkZQorCitTSEFSRURfTElCUyA9IHkKKworREVGSU5FUz0gLURSRVNPTFZFX0hPU1ROQU1FUyAtRExJQkRJUj1cIiQoTElCRElSKVwiCitpZm5lcSAoJChTSEFSRURfTElCUykseSkKK0RFRklORVMrPSAtRE5PX1NIQVJFRF9MSUJTCitlbmRpZgorCitERUZJTkVTKz0tRENPTkZESVI9XCIkKENPTkZESVIpXCIKKworI29wdGlvbnMgZm9yIGRlY25ldAorQURETElCKz1kbmV0X250b3AubyBkbmV0X3B0b24ubworCisjb3B0aW9ucyBmb3IgaXB4CitBRERMSUIrPWlweF9udG9wLm8gaXB4X3B0b24ubworCisjb3B0aW9ucyBmb3IgbXBscworQURETElCKz1tcGxzX250b3AubyBtcGxzX3B0b24ubworCitDQyA9IGdjYworSE9TVENDID0gZ2NjCitERUZJTkVTICs9IC1EX0dOVV9TT1VSQ0UKKyMgVHVybiBvbiB0cmFuc3BhcmVudCBzdXBwb3J0IGZvciBMRlMKK0RFRklORVMgKz0gLURfRklMRV9PRkZTRVRfQklUUz02NCAtRF9MQVJHRUZJTEVfU09VUkNFIC1EX0xBUkdFRklMRTY0X1NPVVJDRQorQ0NPUFRTID0gLU8yCitXRkxBR1MgOj0gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAgLVdtaXNzaW5nLXByb3RvdHlwZXMKK1dGTEFHUyArPSAtV21pc3NpbmctZGVjbGFyYXRpb25zIC1Xb2xkLXN0eWxlLWRlZmluaXRpb24gLVdmb3JtYXQ9MgorCitDRkxBR1MgOj0gJChXRkxBR1MpICQoQ0NPUFRTKSAtSS4uL2luY2x1ZGUgJChERUZJTkVTKSAkKENGTEFHUykKK1lBQ0NGTEFHUyA9IC1kIC10IC12CisKK1NVQkRJUlM9bGliIGlwIHRjIGJyaWRnZSBtaXNjIG5ldGVtIGdlbmwgdGlwYyBtYW4KKworTElCTkVUTElOSz0uLi9saWIvbGlibmV0bGluay5hIC4uL2xpYi9saWJ1dGlsLmEKK0xETElCUyArPSAkKExJQk5FVExJTkspCisKK2FsbDogQ29uZmlnCisJQHNldCAtZTsgXAorCWZvciBpIGluICQoU1VCRElSUyk7IFwKKwlkbyAkKE1BS0UpICQoTUZMQUdTKSAtQyAkJGk7IGRvbmUKKworQ29uZmlnOgorCXNoIGNvbmZpZ3VyZSAkKEtFUk5FTF9JTkNMVURFKQorCitpbnN0YWxsOiBhbGwKKwlpbnN0YWxsIC1tIDA3NTUgLWQgJChERVNURElSKSQoU0JJTkRJUikKKwlpbnN0YWxsIC1tIDA3NTUgLWQgJChERVNURElSKSQoQ09ORkRJUikKKwlpbnN0YWxsIC1tIDA3NTUgLWQgJChERVNURElSKSQoQVJQRERJUikKKwlpbnN0YWxsIC1tIDA3NTUgLWQgJChERVNURElSKSQoRE9DRElSKS9leGFtcGxlcworCWluc3RhbGwgLW0gMDc1NSAtZCAkKERFU1RESVIpJChET0NESVIpL2V4YW1wbGVzL2RpZmZzZXJ2CisJaW5zdGFsbCAtbSAwNjQ0IFJFQURNRS5pcHJvdXRlMit0YyAkKHNoZWxsIGZpbmQgZXhhbXBsZXMgLW1heGRlcHRoIDEgLXR5cGUgZikgXAorCQkkKERFU1RESVIpJChET0NESVIpL2V4YW1wbGVzCisJaW5zdGFsbCAtbSAwNjQ0ICQoc2hlbGwgZmluZCBleGFtcGxlcy9kaWZmc2VydiAtbWF4ZGVwdGggMSAtdHlwZSBmKSBcCisJCSQoREVTVERJUikkKERPQ0RJUikvZXhhbXBsZXMvZGlmZnNlcnYKKwlAZm9yIGkgaW4gJChTVUJESVJTKSBkb2M7IGRvICQoTUFLRSkgLUMgJCRpIGluc3RhbGw7IGRvbmUKKwlpbnN0YWxsIC1tIDA2NDQgJChzaGVsbCBmaW5kIGV0Yy9pcHJvdXRlMiAtbWF4ZGVwdGggMSAtdHlwZSBmKSAkKERFU1RESVIpJChDT05GRElSKQorCitzbmFwc2hvdDoKKwllY2hvICJzdGF0aWMgY29uc3QgY2hhciBTTkFQU0hPVFtdID0gXCIiYGRhdGUgKyV5JW0lZGAiXCI7IiBcCisJCT4gaW5jbHVkZS9TTkFQU0hPVC5oCisKK2NsZWFuOgorCUBmb3IgaSBpbiAkKFNVQkRJUlMpIGRvYzsgXAorCWRvICQoTUFLRSkgJChNRkxBR1MpIC1DICQkaSBjbGVhbjsgZG9uZQorCitjbG9iYmVyOgorCXRvdWNoIENvbmZpZworCSQoTUFLRSkgJChNRkxBR1MpIGNsZWFuCisJcm0gLWYgQ29uZmlnIGNzY29wZS4qCisKK2Rpc3RjbGVhbjogY2xvYmJlcgorCitjc2NvcGU6CisJY3Njb3BlIC1iIC1xIC1SIC1JaW5jbHVkZSAtc2lwIC1zbGliIC1zbWlzYyAtc25ldGVtIC1zdGMKKworLkVYUE9SVF9BTExfVkFSSUFCTEVTOgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvTk9USUNFIGIvaXByb3V0ZTIvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MTIxMDkKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9OT1RJQ0UKQEAgLTAsMCArMSwzNDAgQEAKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisJCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQorCisgQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgICAgICAgICAgICAgICAgICAgICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQorc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKwwKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCithIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAorcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCittZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgordGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKK2VpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCitsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCit0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KK2lzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgorV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCitzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKK2NvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKK2NvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKK25vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKK2FuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoreW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CisgICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKKyAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CisgICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAorICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KKyAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKKyAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKKyAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCisgICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKKyAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAorICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KKyAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKwwKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorDAorICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorDAorICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKK3Rob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKK2VpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCit0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLgorCisgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKK3RvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCittYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscworb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAorT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKK1RPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKK1BST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAorUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORworT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCitZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgorUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKwkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIHllYXIgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5CitiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKK2NvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2lwcm91dGUyL1JFQURNRSBiL2lwcm91dGUyL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2E1MTE4Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvUkVBRE1FCkBAIC0wLDAgKzEsNDMgQEAKK1RoaXMgaXMgYSBzZXQgb2YgdXRpbGl0aWVzIGZvciBMaW51eCBuZXR3b3JraW5nLgorCitJbmZvcm1hdGlvbjoKKyAgICBodHRwOi8vd3d3LmxpbnV4Zm91bmRhdGlvbi5vcmcvY29sbGFib3JhdGUvd29ya2dyb3Vwcy9uZXR3b3JraW5nL2lwcm91dGUyCisKK0Rvd25sb2FkOgorICAgIGh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMvbmV0L2lwcm91dGUyLworCitSZXBvc2l0b3J5OgorICAgIGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9zaGVtbWluZ2VyL2lwcm91dGUyLmdpdAorCitIb3cgdG8gY29tcGlsZSB0aGlzLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzEuIGxpYmRibQorCithcnBkIG5lZWRzIHRvIGhhdmUgdGhlIGRiNCBkZXZlbG9wbWVudCBsaWJyYXJpZXMuIEZvciBEZWJpYW4KK3VzZXJzIHRoaXMgaXMgdGhlIHBhY2thZ2Ugd2l0aCBhIG5hbWUgbGlrZSBsaWJkYjQueC1kZXYuCitEQk1fSU5DTFVERSBwb2ludHMgdG8gdGhlIGRpcmVjdG9yeSB3aXRoIGRiXzE4NS5oIHdoaWNoCitpcyB0aGUgaW5jbHVkZSBmaWxlIHVzZWQgYnkgYXJwZCB0byBnZXQgdG8gdGhlIG9sZCBmb3JtYXQgQmVya2VsZXkKK2RhdGFiYXNlIHJvdXRpbmVzLiAgT2Z0ZW4gdGhpcyBpcyBpbiB0aGUgZGItZGV2ZWwgcGFja2FnZS4KKworMi4gbWFrZQorCitUaGUgbWFrZWZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGEgQ29uZmlnIGZpbGUgd2hpY2gKK2NvbnRhaW5zIHdoZXRoZXIgb3Igbm90IEFUTSBpcyBhdmFpbGFibGUsIGV0Yy4KKworMy4gVG8gbWFrZSBkb2N1bWVudGF0aW9uLCBjZCB0byBkb2MvIGRpcmVjdG9yeSAsIHRoZW4KKyAgIGxvb2sgYXQgc3RhcnQgb2YgTWFrZWZpbGUgYW5kIHNldCBjb3JyZWN0IHZhbHVlcyBmb3IKKyAgIFBBR0VTSVpFPWE0CQksIGllOiBhNCAsIGxldHRlciAuLi4JKHN0cmluZykKKyAgIFBBR0VTUEVSUEFHRT0yCSwgaWU6IDEgLCAyIC4uLgkJKG51bWVyaWMpCisgICBhbmQgbWFrZSB0aGVyZS4gSXQgYXNzdW1lcywgdGhhdCBsYXRleCwgZHZpcHMgYW5kIHBzbnVwCisgICBhcmUgaW4geW91ciBwYXRoLgorCis0LiBUaGlzIHBhY2thZ2UgaW5jbHVkZXMgbWF0Y2hpbmcgc2FuaXRpemVkIGtlcm5lbCBoZWFkZXJzIGJlY2F1c2UKKyAgIHRoZSBidWlsZCBlbnZpcm9ubWVudCBtYXkgbm90IGhhdmUgdXAgdG8gZGF0ZSB2ZXJzaW9ucy4gU2VlIE1ha2VmaWxlCisgICBpZiB5b3UgaGF2ZSBzcGVjaWFsIHJlcXVpcmVtZW50cyBhbmQgbmVlZCB0byBwb2ludCBhdCBkaWZmZXJlbnQKKyAgIGtlcm5lbCBpbmNsdWRlIGZpbGVzLgorCitTdGVwaGVuIEhlbW1pbmdlcgorc3RlcGhlbkBuZXR3b3JrcGx1bWJlci5vcmcKKworQWxleGV5IEt1em5ldHNvdgora3V6bmV0QG1zMi5pbnIuYWMucnUKZGlmZiAtLWdpdCBhL2lwcm91dGUyL1JFQURNRS5kZWNuZXQgYi9pcHJvdXRlMi9SRUFETUUuZGVjbmV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMDBmOTAKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9SRUFETUUuZGVjbmV0CkBAIC0wLDAgKzEsMzMgQEAKKworSGVyZSBhcmUgYSBmZXcgcXVpY2sgcG9pbnRzIGFib3V0IERFQ25ldCBzdXBwb3J0Li4uCisKKyBvIGlwcm91dGUyIGlzIHRoZSB0b29sIG9mIGNob2ljZSBmb3IgY29uZmlndXJpbmcgdGhlIERFQ25ldCBzdXBwb3J0IGZvcgorICAgTGludXguIEZvciBtYW55IGZlYXR1cmVzLCBpdCBpcyB0aGUgb25seSB0b29sIHdoaWNoIGNhbiBiZSB1c2VkIHRvCisgICBjb25maWd1cmUgdGhlbS4KKworIG8gTm8gbmFtZSByZXNvbHV0aW9uIGlzIGF2YWlsYWJsZSBhcyB5ZXQsIGFsbCBhZGRyZXNzZXMgbXVzdCBiZQorICAgZW50ZXJlZCBudW1lcmljYWxseS4KKworIG8gUmVtZW1iZXIgdG8gc2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzIG9mIHRoZSBpbnRlcmZhY2UgdXNpbmc6IAorCisgICBpcCBsaW5rIHNldCBldGhYIGFkZHJlc3MgeHg6eHg6eHg6eHg6eHg6eHgKKyAgICAgICh3aGVyZSB4eDp4eDp4eDp4eDp4eDp4eCBpcyB0aGUgTUFDIGFkZHJlc3MgZm9yIHlvdXIgREVDbmV0IG5vZGUKKyAgICAgICBhZGRyZXNzKQorCisgICBpZiB5b3VyIEV0aGVybmV0IGNhcmQgd29uJ3QgbGlzdGVuIHRvIG1vcmUgdGhhbiBvbmUgdW5pY2FzdAorICAgbWFjIGFkZHJlc3MgYXQgb25jZS4gSWYgdGhlIExpbnV4IERFQ25ldCBzdGFjayBkb2Vzbid0IHRhbGsgdG8KKyAgIGFueSBvdGhlciBERUNuZXQgbm9kZXMsIHRoZW4gY2hlY2sgdGhpcyB3aXRoIHRjcGR1bXAgYW5kIGlmIGl0cworICAgYSBwcm9ibGVtLCBjaGFuZ2UgdGhlIG1hYyBhZGRyZXNzIChidXQgZG8gdGhpcyBfYmVmb3JlXyBzdGFydGluZworICAgYW55IG90aGVyIG5ldHdvcmsgcHJvdG9jb2wgb24gdGhlIGludGVyZmFjZSkKKworIG8gV2hpbHN0IHlvdSBjYW4gdXNlIGlwIGFkZHIgYWRkIHRvIGFkZCBtb3JlIHRoYW4gb25lIERFQ25ldCBhZGRyZXNzIHRvIGFuCisgICBpbnRlcmZhY2UsIGRvbid0IGV4cGVjdCBhZGRyZXNzZXMgd2hpY2ggYXJlIG5vdCB0aGUgc2FtZSBhcyB0aGUKKyAgIGtlcm5lbHMgbm9kZSBhZGRyZXNzIHRvIHdvcmsgcHJvcGVybHkgd2l0aCAyLjQga2VybmVscy4gVGhpcyBzaG91bGQKKyAgIGJlIGZpbmUgd2l0aCAyLjYga2VybmVscyBhcyB0aGUgcm91dGluZyBjb2RlIGhhcyBiZWVuIGV4dGVuc2l2ZWx5CisgICBtb2RpZmllZCBhbmQgaW1wcm92ZWQuCisKKyBvIFRoZSBERUNuZXQgc3VwcG9ydCBpcyBjdXJyZW50bHkgc2VsZiBjb250YWluZWQuIEl0IGRvZXMgbm90IGRlcGVuZCBvbgorICAgdGhlIGxpYmRuZXQgbGlicmFyeS4KKworU3RldmUgV2hpdGVob3VzZSA8c3RldmVAY2h5Z3d5bi5jb20+CisKZGlmZiAtLWdpdCBhL2lwcm91dGUyL1JFQURNRS5kZXZlbCBiL2lwcm91dGUyL1JFQURNRS5kZXZlbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjdkMTFlCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvUkVBRE1FLmRldmVsCkBAIC0wLDAgKzEsMTUgQEAKK0lwcm91dGUyIGRldmVsb3BtZW50IGlzIGNsb3NlbHkgdGllZCB0byBMaW51eCBrZXJuZWwgbmV0d29ya2luZworZGV2ZWxvcG1lbnQuIE1vc3QgbmV3IGZlYXR1cmVzIHJlcXVpcmUgYSBrZXJuZWwgYW5kIGEgdXRpbGl0eSBjb21wb25lbnQuCisKK1BsZWFzZSBzdWJtaXQgYm90aCB0byB0aGUgTGludXggbmV0d29ya2luZyBtYWlsaW5nIGxpc3QKKyAgIDxuZXRkZXZAdmdlci5rZXJuZWwub3JnPgorCitUaGUgY3VycmVudCBzb3VyY2UgaXMgaW4gdGhlIGdpdCByZXBvc2l0b3J5OgorICAgIGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9zaGVtbWluZ2VyL2lwcm91dGUyLmdpdAorCitUaGUgbWFzdGVyIGJyYW5jaCBjb250YWlucyB0aGUgc291cmNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQKK2NvZGUgaW4gdGhlIG1haW5saW5lIExpbnV4IGtlcm5lbCAoaWUgZm9sbG93cyBMaW51cykuIFRoZSBuZXQtbmV4dAorYnJhbmNoIGlzIGEgdGVtcG9yYXJ5IGJyYW5jaCB0aGF0IHRyYWNrcyB0aGUgY29kZSBpbnRlbmRlZCBmb3IgdGhlCituZXh0IHJlbGVhc2U7IGl0IGNvcnJlc3BvbmRzIHdpdGggbmV0d29ya2luZyBkZXZlbG9wbWVudCBicmFuY2ggaW4KK3RoZSBrZXJuZWwuCisKZGlmZiAtLWdpdCBhL2lwcm91dGUyL1JFQURNRS5kaXN0cmlidXRpb24gYi9pcHJvdXRlMi9SRUFETUUuZGlzdHJpYnV0aW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMmU4ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9SRUFETUUuZGlzdHJpYnV0aW9uCkBAIC0wLDAgKzEsOTUgQEAKK0kuIEFib3V0IHRoZSBkaXN0cmlidXRpb24gdGFibGVzCisKK1RoZSB0YWJsZSB1c2VkIGZvciAic3ludGhlc2l6aW5nIiB0aGUgZGlzdHJpYnV0aW9uIGlzIGVzc2VudGlhbGx5IGEgc2NhbGVkLAordHJhbnNsYXRlZCwgaW52ZXJzZSB0byB0aGUgY3VtdWxhdGl2ZSBkaXN0cmlidXRpb24gZnVuY3Rpb24uCisKK0hlcmUncyBob3cgdG8gdGhpbmsgYWJvdXQgaXQ6IExldCBGKCkgYmUgdGhlIGN1bXVsYXRpdmUgZGlzdHJpYnV0aW9uCitmdW5jdGlvbiBmb3IgYSBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb24gWC4gIFdlJ2xsIGFzc3VtZSB3ZSd2ZSBzY2FsZWQKK3RoaW5ncyBzbyB0aGF0IFggaGFzIG1lYW4gMCBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIDEsIHRob3VnaCB0aGF0J3Mgbm90CitzbyBpbXBvcnRhbnQgaGVyZS4gIFRoZW46CisKKwlGKHgpID0gUChYIDw9IHgpID0gXGludF97LWluZn1eeCBmCisKK3doZXJlIGYgaXMgdGhlIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb24uCisKK0YgaXMgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLCBzbyBoYXMgYW4gaW52ZXJzZSBmdW5jdGlvbiBHLCB3aXRoIHJhbmdlCiswIHRvIDEuICBIZXJlLCBHKHQpID0gdGhlIHggc3VjaCB0aGF0IFAoWCA8PSB4KSA9IHQuICAoSW4gZ2VuZXJhbCwgRyBtYXkKK2hhdmUgc2luZ3VsYXJpdGllcyBpZiBYIGhhcyBwb2ludCBtYXNzZXMsIGkuZS4sIHBvaW50cyB4IHN1Y2ggdGhhdAorUChYID0geCkgPiAwLikKKworTm93IHdlIGNyZWF0ZSBhIHRhYnVsYXIgcmVwcmVzZW50YXRpb24gb2YgRyBhcyBmb2xsb3dzOiAgQ2hvb3NlIHNvbWUgdGFibGUKK3NpemUgTiwgYW5kIGZvciB0aGUgaXRoIGVudHJ5LCBwdXQgaW4gRyhpL04pLiAgTGV0J3MgY2FsbCB0aGlzIHRhYmxlIFQuCisKK1RoZSBjbGFpbSBub3cgaXMsIEkgY2FuIGNyZWF0ZSBhIChkaXNjcmV0ZSkgcmFuZG9tIHZhcmlhYmxlIFkgd2hvc2UKK2Rpc3RyaWJ1dGlvbiBoYXMgdGhlIHNhbWUgYXBwcm94aW1hdGUgInNoYXBlIiBhcyBYLCBzaW1wbHkgYnkgbGV0dGluZworWSA9IFQoVSksIHdoZXJlIFUgaXMgYSBkaXNjcmV0ZSB1bmlmb3JtIHJhbmRvbSB2YXJpYWJsZSB3aXRoIHJhbmdlIDEgdG8gTi4KK1RvIHNlZSB0aGlzLCBpdCdzIGVub3VnaCB0byBzaG93IHRoYXQgWSdzIGN1bXVsYXRpdmUgZGlzdHJpYnV0aW9uIGZ1bmN0aW9uLAorKGxldCdzIGNhbGwgaXQgSCksIGlzIGEgZGlzY3JldGUgYXBwcm94aW1hdGlvbiB0byBGLiAgQnV0CisKKwlIKHgpID0gUChZIDw9IHgpCisJICAgICA9ICgjIG9mIGVudHJpZXMgaW4gVCA8PSB4KSAvIE4gICAtLSBhcyBZIGNob3NlbiB1bmlmb3JtbHkgZnJvbSBUCisJICAgICA9IGkvTiwgd2hlcmUgaSBpcyB0aGUgbGFyZ2VzdCBpbnRlZ2VyIHN1Y2ggdGhhdCBHKGkvTikgPD0geAorCSAgICAgPSBpL04sIHdoZXJlIGkgaXMgdGhlIGxhcmdlc3QgaW50ZWdlciBzdWNoIHRoYXQgaS9OIDw9IEYoeCkKKwkgICAgIAkJLS0gc2luY2UgRyBhbmQgRiBhcmUgaW52ZXJzZSBmdW5jdGlvbnMgKGFuZCBGIGlzCisJICAgICAJCSAgIGluY3JlYXNpbmcpCisJICAgICA9IGZsb29yKE4qRih4KSkvTgorCithcyBkZXNpcmVkLgorCitJSS4gSG93IHRvIGNyZWF0ZSBkaXN0cmlidXRpb24gdGFibGVzIChpbiB0aGVvcnkpCisKK0hvdyBjYW4gd2UgY3JlYXRlIHRoaXMgdGFibGUgaW4gcHJhY3RpY2U/IEluIHNvbWUgY2FzZXMsIEYgbWF5IGhhdmUgYQorc2ltcGxlIGV4cHJlc3Npb24gd2hpY2ggYWxsb3dzIGV2YWx1YXRpbmcgaXRzIGludmVyc2UgZGlyZWN0bHkuICBUaGUKK1BhcmV0byBkaXN0cmlidXRpb24gaXMgb25lIGV4YW1wbGUgb2YgdGhpcy4gIEluIG90aGVyIGNhc2VzLCBhbmQKK2VzcGVjaWFsbHkgZm9yIG1hdGNoaW5nIGFuIGV4cGVyaW1lbnRhbGx5IG9ic2VydmVkIGRpc3RyaWJ1dGlvbiwgaXQncworZWFzaWVzdCBzaW1wbHkgdG8gY3JlYXRlIGEgdGFibGUgZm9yIEYgYW5kICJpbnZlcnQiIGl0LiAgSGVyZSwgd2UgZ2l2ZQorYSBjb25jcmV0ZSBleGFtcGxlLCBuYW1lbHkgaG93IHRoZSBuZXcgImV4cGVyaW1lbnRhbCIgZGlzdHJpYnV0aW9uIHdhcworY3JlYXRlZC4KKworMS4gQ29sbGVjdCBlbm91Z2ggZGF0YSBwb2ludHMgdG8gY2hhcmFjdGVyaXplIHRoZSBkaXN0cmlidXRpb24uICBIZXJlLCBJCitjb2xsZWN0ZWQgMjUsMDAwICJwaW5nIiByb3VuZHRyaXAgdGltZXMgdG8gYSAiZGlzdGFudCIgcG9pbnQgKHRpbWUubmlzdC5nb3YpLgorVGhhdCdzIGZhciBtb3JlIGRhdGEgdGhhbiBpcyByZWFsbHkgbmVjZXNzYXJ5LCBidXQgaXQgd2FzIGZhaXJseSBwYWlubGVzcyB0bworY29sbGVjdCBpdCwgc28uLi4KKworMi4gTm9ybWFsaXplIHRoZSBkYXRhIHNvIHRoYXQgaXQgaGFzIG1lYW4gMCBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIDEuCisKKzMuIERldGVybWluZSB0aGUgY3VtdWxhdGl2ZSBkaXN0cmlidXRpb24uICBUaGUgY29kZSBJIHdyb3RlIGNyZWF0ZXMgYSB0YWJsZQorY292ZXJpbmcgdGhlIHJhbmdlIC0xMCB0byArMTAsIHdpdGggZ3JhbnVsYXJpdHkgLjAwMDA1LiAgT2J2aW91c2x5LCB0aGlzCitpcyBhYnN1cmRseSBvdmVyLXByZWNpc2UsIGJ1dCBzaW5jZSBpdCdzIGEgb25lLXRpbWUgb25seSBjb21wdXRhdGlvbiwgSQorZmlndXJlZCBpdCBoYXJkbHkgbWF0dGVyZWQuCisKKzQuIEludmVydCB0aGUgdGFibGU6IGZvciBlYWNoIHRhYmxlIGVudHJ5IEYoeCkgPSB5LCBtYWtlIHRoZSB5KlRBQkxFU0laRQorKGhlcmUsIDQwOTYpIGVudHJ5IGJlIHgqVEFCTEVGQUNUT1IgKGhlcmUsIDgxOTIpLiAgVGhpcyBjcmVhdGVzIGEgdGFibGUKK2ZvciB0aGUgKCJub3JtYWxpemVkIikgaW52ZXJzZSBvZiBzaXplIFRBQkxFU0laRSwgY292ZXJpbmcgaXRzIGRvbWFpbiAwCit0byAxIHdpdGggZ3JhbnVsYXJpdHkgMS9UQUJMRVNJWkUuICBOb3RlIHRoYXQgZXZlbiB3aXRoIHRoZSBncmFudWxhcml0eQordXNlZCBpbiBjcmVhdGluZyB0aGUgdGFibGUgZm9yIEYsIGl0J3MgcG9zc2libGUgbm90IGFsbCB0aGUgZW50cmllcyBpbgordGhlIHRhYmxlIGZvciBHIHdpbGwgYmUgZmlsbGVkIGluLiAgU28sIG1ha2UgYSBwYXNzIHRocm91Z2ggdGhlCitpbnZlcnNlJ3MgdGFibGUsIGZpbGxpbmcgaW4gYW55IG1pc3NpbmcgZW50cmllcyBieSBsaW5lYXIgaW50ZXJwb2xhdGlvbi4KKworSUlJLiBIb3cgdG8gY3JlYXRlIGRpc3RyaWJ1dGlvbiB0YWJsZXMgKGluIHByYWN0aWNlKQorCitJZiB5b3Ugd2FudCB0byBkbyBhbGwgdGhpcyB5b3Vyc2VsZiwgSSd2ZSBwcm92aWRlZCBzZXZlcmFsIHRvb2xzIHRvIGhlbHA6CisKKzEuIG1ha2V0YWJsZSBkb2VzIHRoZSBzdGVwcyAyLTQgYWJvdmUsIGFuZCB0aGVuIGdlbmVyYXRlcyB0aGUgYXBwcm9wcmlhdGUKK2hlYWRlciBmaWxlLiAgU28gaWYgeW91IGhhdmUgeW91ciBvd24gdGltZSBkaXN0cmlidXRpb24sIHlvdSBjYW4gZ2VuZXJhdGUKK3RoZSBoZWFkZXIgc2ltcGx5IGJ5OgorCisJbWFrZXRhYmxlIDwgdGltZS52YWx1ZXMgPiBoZWFkZXIuaAorCisyLiBBcyBleHBsYWluZWQgaW4gdGhlIG90aGVyIFJFQURNRSBmaWxlLCB0aGUgc29tZXdoYXQgc2xlYXp5IHdheSBJIGhhdmUKK29mIGdlbmVyYXRpbmcgY29ycmVsYXRlZCB2YWx1ZXMgbmVlZHMgY29ycmVjdGlvbi4gIFlvdSBjYW4gZ2VuZXJhdGUgeW91cgorb3duIGNvcnJlY3Rpb24gdGFibGVzIGJ5IGNvbXBpbGluZyBtYWtlc2lndGFibGUgYW5kIG1ha2VtdXRhYmxlIHdpdGgKK3lvdXIgaGVhZGVyIGZpbGUuICBDaGVjayB0aGUgTWFrZWZpbGUgdG8gc2VlIGhvdyB0aGlzIGlzIGRvbmUuCisKKzMuIFdhcm5pbmc6IG1ha2V0YWJsZSwgbWFrZXNpZ3RhYmxlIGFuZCBlc3BlY2lhbGx5IG1ha2VtdXRhYmxlIGRvCitlbm9ybW91cyBhbW91bnRzIG9mIGZsb2F0aW5nIHBvaW50IGFyaXRobWV0aWMuICBEb24ndCB0cnkgcnVubmluZwordGhlc2Ugb24gYW4gb2xkIDQ4Ni4gIChOSVNUIE5ldCBpdHNlbGYgd2lsbCBydW4gZmluZSBvbiBzdWNoIGEKK3N5c3RlbSwgc2luY2UgaW4gb3BlcmF0aW9uLCBpdCBqdXN0IG5lZWRzIHRvIGRvIGEgZmV3IHNpbXBsZSBpbnRlZ3JhbAorY2FsY3VsYXRpb25zLiAgQnV0IGdldHRpbmcgdGhlcmUgdGFrZXMgc29tZSB3b3JrLikKKworNC4gVGhlIHRhYmxlcyBwcm9kdWNlZCBhcmUgYWxsIG5vcm1hbGl6ZWQgZm9yIG1lYW4gMCBhbmQgc3RhbmRhcmQKK2RldmlhdGlvbiAxLiAgSG93IGRvIHlvdSBrbm93IHdoYXQgdmFsdWVzIHRvIHVzZSBmb3IgcmVhbD8gIEhlcmUsIEkndmUKK3Byb3ZpZGVkIGEgc2ltcGxlICJzdGF0cyIgdXRpbGl0eS4gIEdpdmUgaXQgYSBzZXJpZXMgb2YgZmxvYXRpbmcgcG9pbnQKK3ZhbHVlcywgYW5kIGl0IHdpbGwgcmV0dXJuIHRoZWlyIG1lYW4gKG11KSwgc3RhbmRhcmQgZGV2aWF0aW9uIChzaWdtYSksCithbmQgY29ycmVsYXRpb24gY29lZmZpY2llbnQgKHJobykuICBZb3UgY2FuIHRoZW4gcGx1ZyB0aGVzZSB2YWx1ZXMKK2RpcmVjdGx5IGludG8gTklTVCBOZXQuCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9SRUFETUUuaXByb3V0ZTIrdGMgYi9pcHJvdXRlMi9SRUFETUUuaXByb3V0ZTIrdGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE1NjM4ZAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL1JFQURNRS5pcHJvdXRlMit0YwpAQCAtMCwwICsxLDEyMyBAQAoraXByb3V0ZTIrdGMqCisKK0l0J3MgdGhlIGZpcnN0IHJlbGVhc2Ugb2YgTGludXggdHJhZmZpYyBjb250cm9sIGVuZ2luZS4KKworCitOT1RFUy4KKyogY3N6IHNjaGVkdWxlciBpcyBpbm9wZXJhdGlvbmFsIGF0IHRoZSBtb21lbnQsIGFuZCBwcm9iYWJseQorICBuZXZlciB3aWxsIGJlIHJlcGFpcmVkIGJ1dCByZXBsYWNlZCB3aXRoIGgtcGZxIHNjaGVkdWxlci4KKyogVG8gdXNlICJmdyIgY2xhc3NpZmllciB5b3Ugd2lsbCBuZWVkIGlwZndjaGFpbnMgcGF0Y2guCisqIE5vIG1hbnVhbCBhdmFpbGFibGUuIEFzayBtZSwgaWYgeW91IGhhdmUgcHJvYmxlbXMgKG9ubHkgdHJ5IHRvIGd1ZXNzCisgIGFuc3dlciB5b3Vyc2VsZiBhdCBmaXJzdCA4KSkuCisKKworTWljcm8tbWFudWFsIGhvdyB0byBzdGFydCBpdCB0aGUgZmlyc3QgdGltZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBLiBBdHRhY2ggQ0JRIHRvIGV0aDE6CisKK3RjIHFkaXNjIGFkZCBkZXYgZXRoMSByb290IGhhbmRsZSAxOiBjYnEgYmFuZHdpZHRoIDEwTWJpdCBhbGxvdCAxNTE0IGNlbGwgOCBcCithdnBrdCAxMDAwIG1wdSA2NAorCitCLiBBZGQgcm9vdCBjbGFzczoKKwordGMgY2xhc3MgYWRkIGRldiBldGgxIHBhcmVudCAxOjAgY2xhc3NpZCAxOjEgY2JxIGJhbmR3aWR0aCAxME1iaXQgcmF0ZSAxME1iaXQgXAorYWxsb3QgMTUxNCBjZWxsIDggd2VpZ2h0IDFNYml0IHByaW8gOCBtYXhidXJzdCAyMCBhdnBrdCAxMDAwCisKK0MuIEFkZCBkZWZhdWx0IGludGVyYWN0aXZlIGNsYXNzOgorCit0YyBjbGFzcyBhZGQgZGV2IGV0aDEgcGFyZW50IDE6MSBjbGFzc2lkIDE6MiBjYnEgYmFuZHdpZHRoIDEwTWJpdCByYXRlIDFNYml0IFwKK2FsbG90IDE1MTQgY2VsbCA4IHdlaWdodCAxMDBLYml0IHByaW8gMyBtYXhidXJzdCAyMCBhdnBrdCAxMDAwIHNwbGl0IDE6MCBcCitkZWZtYXAgYzAKKworRC4gQWRkIGRlZmF1bHQgY2xhc3M6CisKK3RjIGNsYXNzIGFkZCBkZXYgZXRoMSBwYXJlbnQgMToxIGNsYXNzaWQgMTozIGNicSBiYW5kd2lkdGggMTBNYml0IHJhdGUgOE1iaXQgXAorYWxsb3QgMTUxNCBjZWxsIDggd2VpZ2h0IDgwMEtiaXQgcHJpbyA3IG1heGJ1cnN0IDIwIGF2cGt0IDEwMDAgc3BsaXQgMTowIFwKK2RlZm1hcCAzZgorCitldGMuIGV0Yy4gZXRjLiBXZWxsLCBpdCBpcyBlbm91Z2ggdG8gc3RhcnQgOCkgVGhlIHJlc3QgY2FuIGJlIGd1ZXNzZWQgOCkKK0xvb2sgYWxzbyBhdCBtb3JlIGVsYWJvcmF0ZWQgZXhhbXBsZSwgcmVhZHkgdG8gc3RhcnQgcnN2cGQsCitpbiByc3ZwL2NicWluaXQuZXRoMS4KKworCitUZXJtaW5vbG9neSBhbmQgYWR2aWNlcyBhYm91dCBzZXR0aW5nIENCUSBwYXJhbWV0ZXJzIG1heSBiZSBmb3VuZCBpbiBTYWxseSBGbG95ZAorcGFwZXJzLiAKKworCitQYWlycyBYOlkgYXJlIGNsYXNzIGhhbmRsZXMsIFg6MCBhcmUgcWRpc2MgaGFuZGxlcy4KK3dlaWdodCBzaG91bGQgYmUgcHJvcG9ydGlvbmFsIHRvIHJhdGUgZm9yIGxlYWYgY2xhc3NlcworKEkgY2hvb3NlZCBpdCB0ZW4gdGltZXMgbGVzcywgYnV0IGl0IGlzIG5vdCBuZWNlc3NhcnkpCisKK2RlZm1hcCBpcyBiaXRtYXAgb2YgbG9naWNhbCBwcmlvcml0aWVzIHNlcnZlZCBieSB0aGlzIGNsYXNzLgorCitFLiBBbm90aGVyIHFkaXNjcyBhcmUgc2ltcGxlci4gRi5lLiBsZXQncyBqb2luIFRCRiBvbiBjbGFzcyAxOjIKKwordGMgcWRpc2MgYWRkIGRldiBldGgxIHBhcmVudCAxOjIgdGJmIHJhdGUgNjRLYml0IGJ1ZmZlciA1S2IvOCBsaW1pdCAxMEtiCisKK0YuIExvb2sgYXQgYWxsIHRoYXQgd2UgY3JlYXRlZDoKKwordGMgcWRpc2MgbHMgZGV2IGV0aDEKK3RjIGNsYXNzIGxzIGRldiBldGgxCisKK0cuIEluc3RhbGwgInJvdXRlIiBjbGFzc2lmaWVyIG9uIHJvb3Qgb2YgY2JxIGFuZCBtYXAgZGVzdGluYXRpb24gZnJvbSByZWFsbQorMSB0byBjbGFzcyAxOjIKKwordGMgZmlsdGVyIGFkZCBkZXYgZXRoMSBwYXJlbnQgMTowIHByb3RvY29sIGlwIHByaW8gMTAwIHJvdXRlIHRvIDEgY2xhc3NpZCAxOjIKKworSC4gQXNzaWduIHJvdXRlcyB0byAxMC4xMS4xMi4wLzI0IHRvIHJlYWxtIDEKKworaXAgcm91dGUgYWRkIDEwLjExLjEyLjAvMjQgZGV2IGV0aDEgdmlhIHdoYXRldmVyIHJlYWxtIDEKKworZXRjLiBUaGUgc2FtZSB0aGluZyBjYW4gYmUgbWFkZSB3aXRoIHJ1bGVzLgorSSBzdGlsbCBkaWQgbm90IHRlc3QgaXBjaGFpbnMsIGJ1dCB0aGV5IHNob3VsZCB3b3JrIHRvby4KKworCitTZXR1cCBhbmQgY29kZSBleGFtcGxlIG9mIEJQRiBjbGFzc2lmaWVyIGFuZCBhY3Rpb24gY2FuIGJlIGZvdW5kIHVuZGVyCitleGFtcGxlcy9icGYvLCB3aGljaCBzaG91bGQgZXhwbGFpbiBldmVyeXRoaW5nIGZvciBnZXR0aW5nIHN0YXJ0ZWQuCisKKworU2V0dXAgb2YgcnN2cCBhbmQgdTMyIGNsYXNzaWZpZXJzIGlzIG1vcmUgaGFpcnkuCitJZiB5b3UgcmVhZCBSU1ZQIHNwZWNzLCB5b3Ugd2lsbCB1bmRlcnN0YW5kIGhvdyByc3ZwIGNsYXNzaWZpZXIKK3dvcmtzIGVhc2lseS4gV2hhdCdzIGFib3V0IHUzMi4uLiBUaGF0J3MgZXhhbXBsZToKKworCisjISAvYmluL3NoCisKK1RDPS9ob21lL3Jvb3QvdGMKKworIyBTZXR1cCBjbGFzc2lmaWVyIHJvb3Qgb24gZXRoMSByb290IChpdCBpcyBjYnEpCiskVEMgZmlsdGVyIGFkZCBkZXYgZXRoMSBwYXJlbnQgMTowIHByaW8gNSBwcm90b2NvbCBpcCB1MzIKKworIyBDcmVhdGUgaGFzaCB0YWJsZSBvZiAyNTYgc2xvdHMgd2l0aCBJRCAxOgorJFRDIGZpbHRlciBhZGQgZGV2IGV0aDEgcGFyZW50IDE6MCBwcmlvIDUgaGFuZGxlIDE6IHUzMiBkaXZpc29yIDI1NgorCisjIEFkZCB0byA2dGggc2xvdCBvZiBoYXNoIHRhYmxlIHJ1bGUgdG8gc2VsZWN0IHRjcC90ZWxuZXQgdG8gMTkzLjIzMy43Ljc1CisjIGRpcmVjdCBpdCB0byBjbGFzcyAxOjQgYW5kIHByZXNjcmliZSB0byBmYWxsIHRvIGJlc3QgZWZmb3J0LAorIyBpZiB0cmFmZmljIHZpb2xhdGUgVEJGICgzMmtiaXQsNUspCiskVEMgZmlsdGVyIGFkZCBkZXYgZXRoMSBwYXJlbnQgMTowIHByaW8gNSB1MzIgaHQgMTo2OiBcCisJbWF0Y2ggaXAgZHN0IDE5My4yMzMuNy43NSBcCisJbWF0Y2ggdGNwIGRzdCAweDE3IDB4ZmZmZiBcCisJZmxvd2lkIDE6NCBcCisJcG9saWNlIHJhdGUgMzJrYml0IGJ1ZmZlciA1a2IvOCBtcHUgNjQgbXR1IDE1MTQgaW5kZXggMQorCisjIEFkZCB0byAxdGggc2xvdCBvZiBoYXNoIHRhYmxlIHJ1bGUgdG8gc2VsZWN0IGljbXAgdG8gMTkzLjIzMy43Ljc1CisjIGRpcmVjdCBpdCB0byBjbGFzcyAxOjQgYW5kIHByZXNjcmliZSB0byBmYWxsIHRvIGJlc3QgZWZmb3J0LAorIyBpZiB0cmFmZmljIHZpb2xhdGUgVEJGICgxMGtiaXQsNUspCiskVEMgZmlsdGVyIGFkZCBkZXYgZXRoMSBwYXJlbnQgMTowIHByaW8gNSB1MzIgaHQgMTo6IFwKKwlzYW1wbGUgaXAgcHJvdG9jb2wgMSAweGZmIFwKKwltYXRjaCBpcCBkc3QgMTkzLjIzMy43Ljc1IFwKKwlmbG93aWQgMTo0IFwKKwlwb2xpY2UgcmF0ZSAxMGtiaXQgYnVmZmVyIDVrYi84IG1wdSA2NCBtdHUgMTUxNCBpbmRleCAyCisKKyMgTG9va3VwIGhhc2ggdGFibGUsIGlmIGl0IGlzIG5vdCBmcmFnbWVudGVkIGZyYW1lCisjIFVzZSBwcm90b2NvbCBhcyBoYXNoIGtleQorJFRDIGZpbHRlciBhZGQgZGV2IGV0aDEgcGFyZW50IDE6MCBwcmlvIDUgaGFuZGxlIDo6MSB1MzIgaHQgODAwOjogXAorCW1hdGNoIGlwIG5vZnJhZyBcCisJb2Zmc2V0IG1hc2sgMHgwRjAwIHNoaWZ0IDYgXAorCWhhc2hrZXkgbWFzayAweDAwZmYwMDAwIGF0IDggXAorCWxpbmsgMToKKworCitBbGV4ZXkgS3V6bmV0c292CitrdXpuZXRAbXMyLmluci5hYy5ydQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvUkVBRE1FLmxuc3RhdCBiL2lwcm91dGUyL1JFQURNRS5sbnN0YXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU3OTI1ZgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL1JFQURNRS5sbnN0YXQKQEAgLTAsMCArMSw4MSBAQAorbG5zdGF0IC0gbGludXggbmV0d29ya2luZyBzdGF0aXN0aWNzCisoQykgMjAwNCBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgdG9vbCBpcyBhIGdlbmVyYWxpemVkIGFuZCBtb3JlIGZlYXR1cmUtY29tcGxldGUgcmVwbGFjZW1lbnQgZm9yIHRoZSBvbGQKKydydHN0YXQnIHByb2dyYW0uCisKK0luIGFkZGl0aW9uIHRvIHJvdXRpbmcgY2FjaGUgc3RhdGlzdGljcywgaXQgc3VwcG9ydHMgYW55IGtpbmQgb2Ygc3RhdGlzdGljcwordGhlIGxpbnV4IGtlcm5lbCBleHBvcnRzIHZpYSBhIGZpbGUgaW4gL3Byb2MvbmV0L3N0YXQuICBJbiBhIHN0b2NrIDIuNi45CitrZXJuZWwsIHRoaXMgaXMgCisJcGVyLXByb3RvY29sIG5laWdoYm91ciBjYWNoZSBzdGF0aXN0aWNzIAorCQkoaXB2NCwgaXB2NiwgYXRtLCBkZWNuZXQpCisJcm91dGluZyBjYWNoZSBzdGF0aXN0aWNzCisJCShpcHY0KQorCWNvbm5lY3Rpb24gdHJhY2tpbmcgc3RhdGlzdGljcworCQkoaXB2NCkKKworUGxlYXNlIG5vdGUgdGhhdCBsbnN0YXQgd2lsbCBhZG9wdCB0byBhbnkgYWRkaXRpb25hbCBzdGF0aXN0aWNzIHRoYXQgbWlnaHQgYmUKK2FkZGVkIHRvIHRoZSBrZXJuZWwgYXQgc29tZSBsYXRlciBwb2ludAorCitJIHBlcnNvbmFsbHkgYWx3YXlzIGxpa2UgZXhhbXBsZXMgbW9yZSB0aGFuIGFueSByZWZlcmVuY2UgZG9jdW1lbnRhdGlvbiwgc28gSQorbGlzdCB0aGUgZm9sbG93aW5nIGV4YW1wbGVzLiAgSWYgc29tZWJvZHkgd2FudHMgdG8gZG8gYSBtYW5wYWdlLCBmZWVsIGZyZWUKK3RvIHNlbmQgbWUgYSBwYXRjaCA6KQorCitFWEFNUExFUzoKKworSW4gb3JkZXIgdG8gZ2V0IGEgbGlzdCBvZiBzdXBwb3J0ZWQgc3RhdGlzdGljcyBmaWxlcywgeW91IGNhbiBydW4KKworCWxuc3RhdCAtZAorCitJdCB3aWxsIGRpc3BsYXkgc29tZXRoaW5nIGxpa2UKKyAKKy9wcm9jL25ldC9zdGF0L2FycF9jYWNoZToKKyAgICAgICAgIDE6IGVudHJpZXMKKyAgICAgICAgIDI6IGFsbG9jcworICAgICAgICAgMzogZGVzdHJveXMKK1suLi5dCisvcHJvYy9uZXQvc3RhdC9ydF9jYWNoZToKKyAgICAgICAgIDE6IGVudHJpZXMKKyAgICAgICAgIDI6IGluX2hpdAorICAgICAgICAgMzogaW5fc2xvd190b3QKKworWW91IGNhbiBub3cgc2VsZWN0IHRoZSBmaWxlcy9rZXlzIHlvdSBhcmUgaW50ZXJlc3RlZCBieSBzb21ldGhpbmcgbGlrZQorCisJbG5zdGF0IC1rIGFycF9jYWNoZTplbnRyaWVzLHJ0X2NhY2hlOmluX2hpdCxhcnBfY2FjaGU6ZGVzdHJveXMKKworYXJwX2NhY2h8cnRfY2FjaGV8YXJwX2NhY2h8CisgZW50cmllc3wgIGluX2hpdHxkZXN0cm95c3wKKyAgICAgICA2fCAgICAgICA2fCAgICAgICAwfAorICAgICAgIDZ8ICAgICAgIDB8ICAgICAgIDB8CisgICAgICAgNnwgICAgICAgMnwgICAgICAgMHwKKworCitZb3UgY2FuIHNwZWNpZnkgdGhlIGludGVydmFsIChlLmcuIDEwIHNlY29uZHMpIGJ5OgorCQorCWxuc3RhdCAtaSAxMAorCitZb3UgY2FuIHNwZWNpZnkgdG8gb25seSB1c2Ugb25lIHBhcnRpY3VsYXIgc3RhdGlzdGljcyBmaWxlOgorCisJbG5zdGF0IC1mIGlwX2Nvbm50cmFjaworCitZb3UgY2FuIHNwZWNpZnkgaW5kaXZpZHVhbCBmaWVsZCB3aWR0aHMgCisKKwlsbnN0YXQgLWsgYXJwX2NhY2hlOmVudHJpZXMscnRfY2FjaGU6ZW50cmllcyAtdyAyMCw4CisKK1lvdSBjYW4gc3BlY2lmeSBub3QgdG8gcHJpbnQgYSBoZWFkZXIgYXQgYWxsCisJCisJbG5zdGF0IC1zIDAKKworWW91IGNhbiBzcGVjaWZ5IHRvIHByaW50IGEgaGVhZGVyIG9ubHkgYXQgc3RhcnQgb2YgdGhlIHByb2dyYW0KKworCWxuc3RhdCAtcyAxCisKK1lvdSBjYW4gc3BlY2lmeSB0byBwcmludCBhIGhlYWRlciBhdCBzdGFydCBhbmQgZXZlcnkgMjAgbGluZXM6CisKKwlsbnN0YXQgLXMgMjAKKworWW91IGNhbiBzcGVjaWZ5IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB5b3Ugd2FudCB0byB0YWtlIChlLmcuIDUpOgorCQorCWxuc3RhdCAtYyA1CisKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2JyaWRnZS9NYWtlZmlsZSBiL2lwcm91dGUyL2JyaWRnZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODAwNzUzCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvYnJpZGdlL01ha2VmaWxlCkBAIC0wLDAgKzEsMTggQEAKK0JST0JKID0gYnJpZGdlLm8gZmRiLm8gbW9uaXRvci5vIGxpbmsubyBtZGIubyB2bGFuLm8KKworaW5jbHVkZSAuLi9Db25maWcKKworaWZlcSAoJChJUF9DT05GSUdfU0VUTlMpLHkpCisJQ0ZMQUdTICs9IC1ESEFWRV9TRVROUworZW5kaWYKKworYWxsOiBicmlkZ2UKKworYnJpZGdlOiAkKEJST0JKKSAkKExJQk5FVExJTkspIAorCitpbnN0YWxsOiBhbGwKKwlpbnN0YWxsIC1tIDA3NTUgYnJpZGdlICQoREVTVERJUikkKFNCSU5ESVIpCisKK2NsZWFuOgorCXJtIC1mICQoQlJPQkopIGJyaWRnZQorCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9icmlkZ2UvYnJfY29tbW9uLmggYi9pcHJvdXRlMi9icmlkZ2UvYnJfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY5YTE2MgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2JyaWRnZS9icl9jb21tb24uaApAQCAtMCwwICsxLDIwIEBACitleHRlcm4gaW50IHByaW50X2xpbmtpbmZvKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLAorCQkJICBzdHJ1Y3Qgbmxtc2doZHIgKm4sCisJCQkgIHZvaWQgKmFyZyk7CitleHRlcm4gaW50IHByaW50X2ZkYihjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobywKKwkJICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZyk7CitleHRlcm4gaW50IHByaW50X21kYihjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobywKKwkJICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZyk7CisKK2V4dGVybiBpbnQgZG9fZmRiKGludCBhcmdjLCBjaGFyICoqYXJndik7CitleHRlcm4gaW50IGRvX21kYihpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworZXh0ZXJuIGludCBkb19tb25pdG9yKGludCBhcmdjLCBjaGFyICoqYXJndik7CitleHRlcm4gaW50IGRvX3ZsYW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKK2V4dGVybiBpbnQgZG9fbGluayhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCitleHRlcm4gaW50IHByZWZlcnJlZF9mYW1pbHk7CitleHRlcm4gaW50IHNob3dfc3RhdHM7CitleHRlcm4gaW50IHNob3dfZGV0YWlsczsKK2V4dGVybiBpbnQgdGltZXN0YW1wOworZXh0ZXJuIGludCBjb21wcmVzc192bGFuczsKK2V4dGVybiBzdHJ1Y3QgcnRubF9oYW5kbGUgcnRoOwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvYnJpZGdlL2JyaWRnZS5jIGIvaXByb3V0ZTIvYnJpZGdlL2JyaWRnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZjE1M2YKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9icmlkZ2UvYnJpZGdlLmMKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBHZXQvc2V0L2RlbGV0ZSBicmlkZ2Ugd2l0aCBuZXRsaW5rCisgKgorICogQXV0aG9yczoJU3RlcGhlbiBIZW1taW5nZXIgPHNoZW1taW5nZXJAdnlhdHRhLmNvbT4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgIlNOQVBTSE9ULmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJicl9jb21tb24uaCIKKyNpbmNsdWRlICJuYW1lc3BhY2UuaCIKKworc3RydWN0IHJ0bmxfaGFuZGxlIHJ0aCA9IHsgLmZkID0gLTEgfTsKK2ludCBwcmVmZXJyZWRfZmFtaWx5ID0gQUZfVU5TUEVDOworaW50IHJlc29sdmVfaG9zdHM7CitpbnQgb25lbGluZTsKK2ludCBzaG93X3N0YXRzOworaW50IHNob3dfZGV0YWlsczsKK2ludCBjb21wcmVzc192bGFuczsKK2ludCB0aW1lc3RhbXA7CitjaGFyICpiYXRjaF9maWxlOworaW50IGZvcmNlOworY29uc3QgY2hhciAqX1NMXzsKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwKKyJVc2FnZTogYnJpZGdlIFsgT1BUSU9OUyBdIE9CSkVDVCB7IENPTU1BTkQgfCBoZWxwIH1cbiIKKyIgICAgICAgYnJpZGdlIFsgLWZvcmNlIF0gLWJhdGNoIGZpbGVuYW1lXG4iCisid2hlcmUJT0JKRUNUIDo9IHsgbGluayB8IGZkYiB8IG1kYiB8IHZsYW4gfCBtb25pdG9yIH1cbiIKKyIJT1BUSU9OUyA6PSB7IC1WW2Vyc2lvbl0gfCAtc1t0YXRpc3RpY3NdIHwgLWRbZXRhaWxzXSB8XG4iCisiCQkgICAgIC1vW25lbGluZV0gfCAtdFtpbWVzdGFtcF0gfCAtbltldG5zXSBuYW1lIHxcbiIKKyIJCSAgICAgLWNbb21wcmVzc3ZsYW5zXSB9XG4iKTsKKwlleGl0KC0xKTsKK30KKworc3RhdGljIGludCBkb19oZWxwKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwl1c2FnZSgpOworfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY21kIHsKKwljb25zdCBjaGFyICpjbWQ7CisJaW50ICgqZnVuYykoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKK30gY21kc1tdID0geworCXsgImxpbmsiLAlkb19saW5rIH0sCisJeyAiZmRiIiwJZG9fZmRiIH0sCisJeyAibWRiIiwJZG9fbWRiIH0sCisJeyAidmxhbiIsCWRvX3ZsYW4gfSwKKwl7ICJtb25pdG9yIiwJZG9fbW9uaXRvciB9LAorCXsgImhlbHAiLAlkb19oZWxwIH0sCisJeyAwIH0KK307CisKK3N0YXRpYyBpbnQgZG9fY21kKGNvbnN0IGNoYXIgKmFyZ3YwLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY29uc3Qgc3RydWN0IGNtZCAqYzsKKworCWZvciAoYyA9IGNtZHM7IGMtPmNtZDsgKytjKSB7CisJCWlmIChtYXRjaGVzKGFyZ3YwLCBjLT5jbWQpID09IDApCisJCQlyZXR1cm4gYy0+ZnVuYyhhcmdjLTEsIGFyZ3YrMSk7CisJfQorCisJZnByaW50ZihzdGRlcnIsCisJCSJPYmplY3QgXCIlc1wiIGlzIHVua25vd24sIHRyeSBcImJyaWRnZSBoZWxwXCIuXG4iLCBhcmd2MCk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGJhdGNoKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY2hhciAqbGluZSA9IE5VTEw7CisJc2l6ZV90IGxlbiA9IDA7CisJaW50IHJldCA9IEVYSVRfU1VDQ0VTUzsKKworCWlmIChuYW1lICYmIHN0cmNtcChuYW1lLCAiLSIpICE9IDApIHsKKwkJaWYgKGZyZW9wZW4obmFtZSwgInIiLCBzdGRpbikgPT0gTlVMTCkgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIkNhbm5vdCBvcGVuIGZpbGUgXCIlc1wiIGZvciByZWFkaW5nOiAlc1xuIiwKKwkJCQluYW1lLCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJfQorCX0KKworCWlmIChydG5sX29wZW4oJnJ0aCwgMCkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9wZW4gcnRuZXRsaW5rXG4iKTsKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwl9CisKKwljbWRsaW5lbm8gPSAwOworCXdoaWxlIChnZXRjbWRsaW5lKCZsaW5lLCAmbGVuLCBzdGRpbikgIT0gLTEpIHsKKwkJY2hhciAqbGFyZ3ZbMTAwXTsKKwkJaW50IGxhcmdjOworCisJCWxhcmdjID0gbWFrZWFyZ3MobGluZSwgbGFyZ3YsIDEwMCk7CisJCWlmIChsYXJnYyA9PSAwKQorCQkJY29udGludWU7ICAgICAgIC8qIGJsYW5rIGxpbmUgKi8KKworCQlpZiAoZG9fY21kKGxhcmd2WzBdLCBsYXJnYywgbGFyZ3YpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNvbW1hbmQgZmFpbGVkICVzOiVkXG4iLAorCQkJCW5hbWUsIGNtZGxpbmVubyk7CisJCQlyZXQgPSBFWElUX0ZBSUxVUkU7CisJCQlpZiAoIWZvcmNlKQorCQkJCWJyZWFrOworCQl9CisJfQorCWlmIChsaW5lKQorCQlmcmVlKGxpbmUpOworCisJcnRubF9jbG9zZSgmcnRoKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXdoaWxlIChhcmdjID4gMSkgeworCQljb25zdCBjaGFyICpvcHQgPSBhcmd2WzFdOworCisJCWlmIChzdHJjbXAob3B0LCAiLS0iKSA9PSAwKSB7CisJCQlhcmdjLS07IGFyZ3YrKzsKKwkJCWJyZWFrOworCQl9CisJCWlmIChvcHRbMF0gIT0gJy0nKQorCQkJYnJlYWs7CisJCWlmIChvcHRbMV0gPT0gJy0nKQorCQkJb3B0Kys7CisKKwkJaWYgKG1hdGNoZXMob3B0LCAiLWhlbHAiKSA9PSAwKSB7CisJCQl1c2FnZSgpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMob3B0LCAiLVZlcnNpb24iKSA9PSAwKSB7CisJCQlwcmludGYoImJyaWRnZSB1dGlsaXR5LCAwLjBcbiIpOworCQkJZXhpdCgwKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKG9wdCwgIi1zdGF0cyIpID09IDAgfHwKKwkJCSAgIG1hdGNoZXMob3B0LCAiLXN0YXRpc3RpY3MiKSA9PSAwKSB7CisJCQkrK3Nob3dfc3RhdHM7CisJCX0gZWxzZSBpZiAobWF0Y2hlcyhvcHQsICItZGV0YWlscyIpID09IDApIHsKKwkJCSsrc2hvd19kZXRhaWxzOworCQl9IGVsc2UgaWYgKG1hdGNoZXMob3B0LCAiLW9uZWxpbmUiKSA9PSAwKSB7CisJCQkrK29uZWxpbmU7CisJCX0gZWxzZSBpZiAobWF0Y2hlcyhvcHQsICItdGltZXN0YW1wIikgPT0gMCkgeworCQkJKyt0aW1lc3RhbXA7CisJCX0gZWxzZSBpZiAobWF0Y2hlcyhvcHQsICItZmFtaWx5IikgPT0gMCkgeworCQkJYXJnYy0tOworCQkJYXJndisrOworCQkJaWYgKGFyZ2MgPD0gMSkKKwkJCQl1c2FnZSgpOworCQkJaWYgKHN0cmNtcChhcmd2WzFdLCAiaW5ldCIpID09IDApCisJCQkJcHJlZmVycmVkX2ZhbWlseSA9IEFGX0lORVQ7CisJCQllbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImluZXQ2IikgPT0gMCkKKwkJCQlwcmVmZXJyZWRfZmFtaWx5ID0gQUZfSU5FVDY7CisJCQllbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImhlbHAiKSA9PSAwKQorCQkJCXVzYWdlKCk7CisJCQllbHNlCisJCQkJaW52YXJnKCJpbnZhbGlkIHByb3RvY29sIGZhbWlseSIsIGFyZ3ZbMV0pOworCQl9IGVsc2UgaWYgKHN0cmNtcChvcHQsICItNCIpID09IDApIHsKKwkJCXByZWZlcnJlZF9mYW1pbHkgPSBBRl9JTkVUOworCQl9IGVsc2UgaWYgKHN0cmNtcChvcHQsICItNiIpID09IDApIHsKKwkJCXByZWZlcnJlZF9mYW1pbHkgPSBBRl9JTkVUNjsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKG9wdCwgIi1uZXRucyIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAobmV0bnNfc3dpdGNoKGFyZ3ZbMV0pKQorCQkJCWV4aXQoLTEpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMob3B0LCAiLWNvbXByZXNzdmxhbnMiKSA9PSAwKSB7CisJCQkrK2NvbXByZXNzX3ZsYW5zOworCQl9IGVsc2UgaWYgKG1hdGNoZXMob3B0LCAiLWZvcmNlIikgPT0gMCkgeworCQkJKytmb3JjZTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKG9wdCwgIi1iYXRjaCIpID09IDApIHsKKwkJCWFyZ2MtLTsKKwkJCWFyZ3YrKzsKKwkJCWlmIChhcmdjIDw9IDEpCisJCQkJdXNhZ2UoKTsKKwkJCWJhdGNoX2ZpbGUgPSBhcmd2WzFdOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIk9wdGlvbiBcIiVzXCIgaXMgdW5rbm93biwgdHJ5IFwiYnJpZGdlIGhlbHBcIi5cbiIsCisJCQkJb3B0KTsKKwkJCWV4aXQoLTEpOworCQl9CisJCWFyZ2MtLTsJYXJndisrOworCX0KKworCV9TTF8gPSBvbmVsaW5lID8gIlxcIiA6ICJcbiI7CisKKwlpZiAoYmF0Y2hfZmlsZSkKKwkJcmV0dXJuIGJhdGNoKGJhdGNoX2ZpbGUpOworCisJaWYgKHJ0bmxfb3BlbigmcnRoLCAwKSA8IDApCisJCWV4aXQoMSk7CisKKwlpZiAoYXJnYyA+IDEpCisJCXJldHVybiBkb19jbWQoYXJndlsxXSwgYXJnYy0xLCBhcmd2KzEpOworCisJcnRubF9jbG9zZSgmcnRoKTsKKwl1c2FnZSgpOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvYnJpZGdlL2ZkYi5jIGIvaXByb3V0ZTIvYnJpZGdlL2ZkYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMTA5MjUKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9icmlkZ2UvZmRiLmMKQEAgLTAsMCArMSw0MDAgQEAKKy8qCisgKiBHZXQvc2V0L2RlbGV0ZSBmZGIgdGFibGUgd2l0aCBuZXRsaW5rCisgKgorICogVE9ETzogbWVyZ2UvcmVwbGFjZSB0aGlzIHdpdGggaXAgbmVpZ2hib3VyCisgKgorICogQXV0aG9yczoJU3RlcGhlbiBIZW1taW5nZXIgPHNoZW1taW5nZXJAdnlhdHRhLmNvbT4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9icmlkZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L25laWdoYm91ci5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSAibGlibmV0bGluay5oIgorI2luY2x1ZGUgImJyX2NvbW1vbi5oIgorI2luY2x1ZGUgInJ0X25hbWVzLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKworc3RhdGljIHVuc2lnbmVkIGludCBmaWx0ZXJfaW5kZXg7CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogYnJpZGdlIGZkYiB7IGFkZCB8IGFwcGVuZCB8IGRlbCB8IHJlcGxhY2UgfSBBRERSIGRldiBERVZcbiIKKwkJCSIgICAgICAgICAgICAgIFsgc2VsZiBdIFsgbWFzdGVyIF0gWyB1c2UgXSBbIHJvdXRlciBdXG4iCisJCQkiICAgICAgICAgICAgICBbIGxvY2FsIHwgdGVtcCBdIFsgZHN0IElQQUREUiBdIFsgdmxhbiBWSUQgXVxuIgorCQkgICAgICAgICIgICAgICAgICAgICAgIFsgcG9ydCBQT1JUXSBbIHZuaSBWTkkgXSBbIHZpYSBERVYgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgYnJpZGdlIGZkYiBbIHNob3cgWyBiciBCUkRFViBdIFsgYnJwb3J0IERFViBdIF1cbiIpOworCWV4aXQoLTEpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqc3RhdGVfbjJhKHVuc2lnbmVkIHMpCit7CisJc3RhdGljIGNoYXIgYnVmWzMyXTsKKworCWlmIChzICYgTlVEX1BFUk1BTkVOVCkKKwkJcmV0dXJuICJwZXJtYW5lbnQiOworCisJaWYgKHMgJiBOVURfTk9BUlApCisJCXJldHVybiAic3RhdGljIjsKKworCWlmIChzICYgTlVEX1NUQUxFKQorCQlyZXR1cm4gInN0YWxlIjsKKworCWlmIChzICYgTlVEX1JFQUNIQUJMRSkKKwkJcmV0dXJuICIiOworCisJc3ByaW50ZihidWYsICJzdGF0ZT0lI3giLCBzKTsKKwlyZXR1cm4gYnVmOworfQorCitpbnQgcHJpbnRfZmRiKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZykKK3sKKwlGSUxFICpmcCA9IGFyZzsKKwlzdHJ1Y3QgbmRtc2cgKnIgPSBOTE1TR19EQVRBKG4pOworCWludCBsZW4gPSBuLT5ubG1zZ19sZW47CisJc3RydWN0IHJ0YXR0ciAqIHRiW05EQV9NQVgrMV07CisKKwlpZiAobi0+bmxtc2dfdHlwZSAhPSBSVE1fTkVXTkVJR0ggJiYgbi0+bmxtc2dfdHlwZSAhPSBSVE1fREVMTkVJR0gpIHsKKwkJZnByaW50ZihzdGRlcnIsICJOb3QgUlRNX05FV05FSUdIOiAlMDh4ICUwOHggJTA4eFxuIiwKKwkJCW4tPm5sbXNnX2xlbiwgbi0+bmxtc2dfdHlwZSwgbi0+bmxtc2dfZmxhZ3MpOworCisJCXJldHVybiAwOworCX0KKworCWxlbiAtPSBOTE1TR19MRU5HVEgoc2l6ZW9mKCpyKSk7CisJaWYgKGxlbiA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJCVUc6IHdyb25nIG5sbXNnIGxlbiAlZFxuIiwgbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChyLT5uZG1fZmFtaWx5ICE9IEFGX0JSSURHRSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZmlsdGVyX2luZGV4ICYmIGZpbHRlcl9pbmRleCAhPSByLT5uZG1faWZpbmRleCkKKwkJcmV0dXJuIDA7CisKKwlwYXJzZV9ydGF0dHIodGIsIE5EQV9NQVgsIE5EQV9SVEEociksCisJCSAgICAgbi0+bmxtc2dfbGVuIC0gTkxNU0dfTEVOR1RIKHNpemVvZigqcikpKTsKKworCWlmIChuLT5ubG1zZ190eXBlID09IFJUTV9ERUxORUlHSCkKKwkJZnByaW50ZihmcCwgIkRlbGV0ZWQgIik7CisKKwlpZiAodGJbTkRBX0xMQUREUl0pIHsKKwkJU1BSSU5UX0JVRihiMSk7CisJCWZwcmludGYoZnAsICIlcyAiLAorCQkJbGxfYWRkcl9uMmEoUlRBX0RBVEEodGJbTkRBX0xMQUREUl0pLAorCQkJCSAgICBSVEFfUEFZTE9BRCh0YltOREFfTExBRERSXSksCisJCQkJICAgIGxsX2luZGV4X3RvX3R5cGUoci0+bmRtX2lmaW5kZXgpLAorCQkJCSAgICBiMSwgc2l6ZW9mKGIxKSkpOworCX0KKworCWlmICghZmlsdGVyX2luZGV4ICYmIHItPm5kbV9pZmluZGV4KQorCQlmcHJpbnRmKGZwLCAiZGV2ICVzICIsIGxsX2luZGV4X3RvX25hbWUoci0+bmRtX2lmaW5kZXgpKTsKKworCWlmICh0YltOREFfRFNUXSkgeworCQlTUFJJTlRfQlVGKGFidWYpOworCQlpbnQgZmFtaWx5ID0gQUZfSU5FVDsKKworCQlpZiAoUlRBX1BBWUxPQUQodGJbTkRBX0RTVF0pID09IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKQorCQkJZmFtaWx5ID0gQUZfSU5FVDY7CisKKwkJZnByaW50ZihmcCwgImRzdCAlcyAiLAorCQkJZm9ybWF0X2hvc3QoZmFtaWx5LAorCQkJCSAgICBSVEFfUEFZTE9BRCh0YltOREFfRFNUXSksCisJCQkJICAgIFJUQV9EQVRBKHRiW05EQV9EU1RdKSwKKwkJCQkgICAgYWJ1Ziwgc2l6ZW9mKGFidWYpKSk7CisJfQorCisJaWYgKHRiW05EQV9WTEFOXSkgeworCQlfX3UxNiB2aWQgPSBydGFfZ2V0YXR0cl91MTYodGJbTkRBX1ZMQU5dKTsKKwkJZnByaW50ZihmcCwgInZsYW4gJWh1ICIsIHZpZCk7CisJfQorCisJaWYgKHRiW05EQV9QT1JUXSkKKwkJZnByaW50ZihmcCwgInBvcnQgJWQgIiwgbnRvaHMocnRhX2dldGF0dHJfdTE2KHRiW05EQV9QT1JUXSkpKTsKKwlpZiAodGJbTkRBX1ZOSV0pCisJCWZwcmludGYoZnAsICJ2bmkgJWQgIiwgcnRhX2dldGF0dHJfdTMyKHRiW05EQV9WTkldKSk7CisJaWYgKHRiW05EQV9JRklOREVYXSkgeworCQl1bnNpZ25lZCBpbnQgaWZpbmRleCA9IHJ0YV9nZXRhdHRyX3UzMih0YltOREFfSUZJTkRFWF0pOworCisJCWlmIChpZmluZGV4KSB7CisJCQljaGFyIGlmbmFtZVtJRl9OQU1FU0laRV07CisKKwkJCWlmICghdGJbTkRBX0xJTktfTkVUTlNJRF0gJiYKKwkJCSAgICBpZl9pbmRleHRvbmFtZShpZmluZGV4LCBpZm5hbWUpKQorCQkJCWZwcmludGYoZnAsICJ2aWEgJXMgIiwgaWZuYW1lKTsKKwkJCWVsc2UKKwkJCQlmcHJpbnRmKGZwLCAidmlhIGlmaW5kZXggJXUgIiwgaWZpbmRleCk7CisJCX0KKwl9CisJaWYgKHRiW05EQV9MSU5LX05FVE5TSURdKQorCQlmcHJpbnRmKGZwLCAibGluay1uZXRuc2lkICVkICIsCisJCQlydGFfZ2V0YXR0cl91MzIodGJbTkRBX0xJTktfTkVUTlNJRF0pKTsKKworCWlmIChzaG93X3N0YXRzICYmIHRiW05EQV9DQUNIRUlORk9dKSB7CisJCXN0cnVjdCBuZGFfY2FjaGVpbmZvICpjaSA9IFJUQV9EQVRBKHRiW05EQV9DQUNIRUlORk9dKTsKKwkJaW50IGh6ID0gZ2V0X3VzZXJfaHooKTsKKworCQlmcHJpbnRmKGZwLCAidXNlZCAlZC8lZCAiLCBjaS0+bmRtX3VzZWQvaHosCisJCSAgICAgICBjaS0+bmRtX3VwZGF0ZWQvaHopOworCX0KKwlpZiAoci0+bmRtX2ZsYWdzICYgTlRGX1NFTEYpCisJCWZwcmludGYoZnAsICJzZWxmICIpOworCWlmICh0YltOREFfTUFTVEVSXSkKKwkJZnByaW50ZihmcCwgIm1hc3RlciAlcyAiLAorCQkJbGxfaW5kZXhfdG9fbmFtZShydGFfZ2V0YXR0cl91MzIodGJbTkRBX01BU1RFUl0pKSk7CisJZWxzZSBpZiAoci0+bmRtX2ZsYWdzICYgTlRGX01BU1RFUikKKwkJZnByaW50ZihmcCwgIm1hc3RlciAiKTsKKwlpZiAoci0+bmRtX2ZsYWdzICYgTlRGX1JPVVRFUikKKwkJZnByaW50ZihmcCwgInJvdXRlciAiKTsKKwlpZiAoci0+bmRtX2ZsYWdzICYgTlRGX0VYVF9MRUFSTkVEKQorCQlmcHJpbnRmKGZwLCAib2ZmbG9hZCAiKTsKKworCWZwcmludGYoZnAsICIlc1xuIiwgc3RhdGVfbjJhKHItPm5kbV9zdGF0ZSkpOworCWZmbHVzaChmcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmZGJfc2hvdyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyIAluOworCQlzdHJ1Y3QgaWZpbmZvbXNnCWlmbTsKKwkJY2hhciAgIAkJCWJ1ZlsyNTZdOworCX0gcmVxOworCisJY2hhciAqZmlsdGVyX2RldiA9IE5VTEw7CisJY2hhciAqYnIgPSBOVUxMOworCWludCBtc2dfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWZpbmZvbXNnKTsKKworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisJcmVxLm4ubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgaWZpbmZvbXNnKSk7CisJcmVxLmlmbS5pZmlfZmFtaWx5ID0gUEZfQlJJREdFOworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmICgoc3RyY21wKCphcmd2LCAiYnJwb3J0IikgPT0gMCkgfHwgc3RyY21wKCphcmd2LCAiZGV2IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWZpbHRlcl9kZXYgPSAqYXJndjsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJiciIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQliciA9ICphcmd2OworCQl9IGVsc2UgeworCQkJaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkKKwkJCQl1c2FnZSgpOworCQl9CisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCWlmIChicikgeworCQlpbnQgYnJfaWZpbmRleCA9IGxsX25hbWVfdG9faW5kZXgoYnIpOworCQlpZiAoYnJfaWZpbmRleCA9PSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBmaW5kIGJyaWRnZSBkZXZpY2UgXCIlc1wiXG4iLCBicik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYWRkYXR0cjMyKCZyZXEubiwgc2l6ZW9mKHJlcSksIElGTEFfTUFTVEVSLCBicl9pZmluZGV4KTsKKwkJbXNnX3NpemUgKz0gUlRBX0xFTkdUSCg0KTsKKwl9CisKKwkvKndlJ2xsIGtlZXAgYXJvdW5kIGZpbHRlcl9kZXYgZm9yIG9sZGVyIGtlcm5lbHMgKi8KKwlpZiAoZmlsdGVyX2RldikgeworCQlmaWx0ZXJfaW5kZXggPSBpZl9uYW1ldG9pbmRleChmaWx0ZXJfZGV2KTsKKwkJaWYgKGZpbHRlcl9pbmRleCA9PSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBmaW5kIGRldmljZSBcIiVzXCJcbiIsCisJCQkJZmlsdGVyX2Rldik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJcmVxLmlmbS5pZmlfaW5kZXggPSBmaWx0ZXJfaW5kZXg7CisJfQorCisJaWYgKHJ0bmxfZHVtcF9yZXF1ZXN0KCZydGgsIFJUTV9HRVRORUlHSCwgJnJlcS5pZm0sIG1zZ19zaXplKSA8IDApIHsKKwkJcGVycm9yKCJDYW5ub3Qgc2VuZCBkdW1wIHJlcXVlc3QiKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAocnRubF9kdW1wX2ZpbHRlcigmcnRoLCBwcmludF9mZGIsIHN0ZG91dCkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRHVtcCB0ZXJtaW5hdGVkXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmZGJfbW9kaWZ5KGludCBjbWQsIGludCBmbGFncywgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCB7CisJCXN0cnVjdCBubG1zZ2hkciAJbjsKKwkJc3RydWN0IG5kbXNnIAkJbmRtOworCQljaGFyICAgCQkJYnVmWzI1Nl07CisJfSByZXE7CisJY2hhciAqYWRkciA9IE5VTEw7CisJY2hhciAqZCA9IE5VTEw7CisJY2hhciBhYnVmW0VUSF9BTEVOXTsKKwlpbnQgZHN0X29rID0gMDsKKwlpbmV0X3ByZWZpeCBkc3Q7CisJdW5zaWduZWQgbG9uZyBwb3J0ID0gMDsKKwl1bnNpZ25lZCBsb25nIHZuaSA9IH4wOworCXVuc2lnbmVkIGludCB2aWEgPSAwOworCWNoYXIgKmVuZHB0cjsKKwlzaG9ydCB2aWQgPSAtMTsKKworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisKKwlyZXEubi5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBuZG1zZykpOworCXJlcS5uLm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVHxmbGFnczsKKwlyZXEubi5ubG1zZ190eXBlID0gY21kOworCXJlcS5uZG0ubmRtX2ZhbWlseSA9IFBGX0JSSURHRTsKKwlyZXEubmRtLm5kbV9zdGF0ZSA9IE5VRF9OT0FSUDsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAoc3RyY21wKCphcmd2LCAiZGV2IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWQgPSAqYXJndjsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJkc3QiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGRzdF9vaykKKwkJCQlkdXBhcmcyKCJkc3QiLCAqYXJndik7CisJCQlnZXRfYWRkcigmZHN0LCAqYXJndiwgcHJlZmVycmVkX2ZhbWlseSk7CisJCQlkc3Rfb2sgPSAxOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInBvcnQiKSA9PSAwKSB7CisKKwkJCU5FWFRfQVJHKCk7CisJCQlwb3J0ID0gc3RydG91bCgqYXJndiwgJmVuZHB0ciwgMCk7CisJCQlpZiAoZW5kcHRyICYmICplbmRwdHIpIHsKKwkJCQlzdHJ1Y3Qgc2VydmVudCAqcHNlOworCisJCQkJcHNlID0gZ2V0c2VydmJ5bmFtZSgqYXJndiwgInVkcCIpOworCQkJCWlmICghcHNlKQorCQkJCQlpbnZhcmcoImludmFsaWQgcG9ydFxuIiwgKmFyZ3YpOworCQkJCXBvcnQgPSBudG9ocyhwc2UtPnNfcG9ydCk7CisJCQl9IGVsc2UgaWYgKHBvcnQgPiAweGZmZmYpCisJCQkJaW52YXJnKCJpbnZhbGlkIHBvcnRcbiIsICphcmd2KTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJ2bmkiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJdm5pID0gc3RydG91bCgqYXJndiwgJmVuZHB0ciwgMCk7CisJCQlpZiAoKGVuZHB0ciAmJiAqZW5kcHRyKSB8fAorCQkJICAgICh2bmkgPj4gMjQpIHx8IHZuaSA9PSBVTE9OR19NQVgpCisJCQkJaW52YXJnKCJpbnZhbGlkIFZOSVxuIiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInZpYSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQl2aWEgPSBpZl9uYW1ldG9pbmRleCgqYXJndik7CisJCQlpZiAodmlhID09IDApCisJCQkJaW52YXJnKCJpbnZhbGlkIGRldmljZVxuIiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInNlbGYiKSA9PSAwKSB7CisJCQlyZXEubmRtLm5kbV9mbGFncyB8PSBOVEZfU0VMRjsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAibWFzdGVyIikgPT0gMCkgeworCQkJcmVxLm5kbS5uZG1fZmxhZ3MgfD0gTlRGX01BU1RFUjsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAicm91dGVyIikgPT0gMCkgeworCQkJcmVxLm5kbS5uZG1fZmxhZ3MgfD0gTlRGX1JPVVRFUjsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAibG9jYWwiKSA9PSAwfHwKKwkJCSAgIG1hdGNoZXMoKmFyZ3YsICJwZXJtYW5lbnQiKSA9PSAwKSB7CisJCQlyZXEubmRtLm5kbV9zdGF0ZSB8PSBOVURfUEVSTUFORU5UOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJ0ZW1wIikgPT0gMCkgeworCQkJcmVxLm5kbS5uZG1fc3RhdGUgfD0gTlVEX1JFQUNIQUJMRTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAidmxhbiIpID09IDApIHsKKwkJCWlmICh2aWQgPj0gMCkKKwkJCQlkdXBhcmcyKCJ2bGFuIiwgKmFyZ3YpOworCQkJTkVYVF9BUkcoKTsKKwkJCXZpZCA9IGF0b2koKmFyZ3YpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJ1c2UiKSA9PSAwKSB7CisJCQlyZXEubmRtLm5kbV9mbGFncyB8PSBOVEZfVVNFOworCQl9IGVsc2UgeworCQkJaWYgKHN0cmNtcCgqYXJndiwgInRvIikgPT0gMCkgeworCQkJCU5FWFRfQVJHKCk7CisJCQl9CisJCQlpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKQorCQkJCXVzYWdlKCk7CisJCQlpZiAoYWRkcikKKwkJCQlkdXBhcmcyKCJ0byIsICphcmd2KTsKKwkJCWFkZHIgPSAqYXJndjsKKwkJfQorCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisKKwlpZiAoZCA9PSBOVUxMIHx8IGFkZHIgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkRldmljZSBhbmQgYWRkcmVzcyBhcmUgcmVxdWlyZWQgYXJndW1lbnRzLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBBc3N1bWUgc2VsZiAqLworCWlmICghKHJlcS5uZG0ubmRtX2ZsYWdzJihOVEZfU0VMRnxOVEZfTUFTVEVSKSkpCisJCXJlcS5uZG0ubmRtX2ZsYWdzIHw9IE5URl9TRUxGOworCisJLyogQXNzdW1lIHBlcm1hbmVudCAqLworCWlmICghKHJlcS5uZG0ubmRtX3N0YXRlJihOVURfUEVSTUFORU5UfE5VRF9SRUFDSEFCTEUpKSkKKwkJcmVxLm5kbS5uZG1fc3RhdGUgfD0gTlVEX1BFUk1BTkVOVDsKKworCWlmIChzc2NhbmYoYWRkciwgIiVoaHg6JWhoeDolaGh4OiVoaHg6JWhoeDolaGh4IiwKKwkJICAgYWJ1ZiwgYWJ1ZisxLCBhYnVmKzIsCisJCSAgIGFidWYrMywgYWJ1Zis0LCBhYnVmKzUpICE9IDYpIHsKKwkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIG1hYyBhZGRyZXNzICVzXG4iLCBhZGRyKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBOREFfTExBRERSLCBhYnVmLCBFVEhfQUxFTik7CisJaWYgKGRzdF9vaykKKwkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIE5EQV9EU1QsICZkc3QuZGF0YSwgZHN0LmJ5dGVsZW4pOworCisJaWYgKHZpZCA+PSAwKQorCQlhZGRhdHRyMTYoJnJlcS5uLCBzaXplb2YocmVxKSwgTkRBX1ZMQU4sIHZpZCk7CisKKwlpZiAocG9ydCkgeworCQl1bnNpZ25lZCBzaG9ydCBkcG9ydDsKKworCQlkcG9ydCA9IGh0b25zKCh1bnNpZ25lZCBzaG9ydClwb3J0KTsKKwkJYWRkYXR0cjE2KCZyZXEubiwgc2l6ZW9mKHJlcSksIE5EQV9QT1JULCBkcG9ydCk7CisJfQorCWlmICh2bmkgIT0gfjApCisJCWFkZGF0dHIzMigmcmVxLm4sIHNpemVvZihyZXEpLCBOREFfVk5JLCB2bmkpOworCWlmICh2aWEpCisJCWFkZGF0dHIzMigmcmVxLm4sIHNpemVvZihyZXEpLCBOREFfSUZJTkRFWCwgdmlhKTsKKworCXJlcS5uZG0ubmRtX2lmaW5kZXggPSBsbF9uYW1lX3RvX2luZGV4KGQpOworCWlmIChyZXEubmRtLm5kbV9pZmluZGV4ID09IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDYW5ub3QgZmluZCBkZXZpY2UgXCIlc1wiXG4iLCBkKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChydG5sX3RhbGsoJnJ0aCwgJnJlcS5uLCBOVUxMLCAwKSA8IDApCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCitpbnQgZG9fZmRiKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlsbF9pbml0X21hcCgmcnRoKTsKKworCWlmIChhcmdjID4gMCkgeworCQlpZiAobWF0Y2hlcygqYXJndiwgImFkZCIpID09IDApCisJCQlyZXR1cm4gZmRiX21vZGlmeShSVE1fTkVXTkVJR0gsIE5MTV9GX0NSRUFURXxOTE1fRl9FWENMLCBhcmdjLTEsIGFyZ3YrMSk7CisJCWlmIChtYXRjaGVzKCphcmd2LCAiYXBwZW5kIikgPT0gMCkKKwkJCXJldHVybiBmZGJfbW9kaWZ5KFJUTV9ORVdORUlHSCwgTkxNX0ZfQ1JFQVRFfE5MTV9GX0FQUEVORCwgYXJnYy0xLCBhcmd2KzEpOworCQlpZiAobWF0Y2hlcygqYXJndiwgInJlcGxhY2UiKSA9PSAwKQorCQkJcmV0dXJuIGZkYl9tb2RpZnkoUlRNX05FV05FSUdILCBOTE1fRl9DUkVBVEV8TkxNX0ZfUkVQTEFDRSwgYXJnYy0xLCBhcmd2KzEpOworCQlpZiAobWF0Y2hlcygqYXJndiwgImRlbGV0ZSIpID09IDApCisJCQlyZXR1cm4gZmRiX21vZGlmeShSVE1fREVMTkVJR0gsIDAsIGFyZ2MtMSwgYXJndisxKTsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJzaG93IikgPT0gMCB8fAorCQkgICAgbWF0Y2hlcygqYXJndiwgImxzdCIpID09IDAgfHwKKwkJICAgIG1hdGNoZXMoKmFyZ3YsICJsaXN0IikgPT0gMCkKKwkJCXJldHVybiBmZGJfc2hvdyhhcmdjLTEsIGFyZ3YrMSk7CisJCWlmIChtYXRjaGVzKCphcmd2LCAiaGVscCIpID09IDApCisJCQl1c2FnZSgpOworCX0gZWxzZQorCQlyZXR1cm4gZmRiX3Nob3coMCwgTlVMTCk7CisKKwlmcHJpbnRmKHN0ZGVyciwgIkNvbW1hbmQgXCIlc1wiIGlzIHVua25vd24sIHRyeSBcImJyaWRnZSBmZGIgaGVscFwiLlxuIiwgKmFyZ3YpOworCWV4aXQoLTEpOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvYnJpZGdlL2xpbmsuYyBiL2lwcm91dGUyL2JyaWRnZS9saW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTliMTI2MgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2JyaWRnZS9saW5rLmMKQEAgLTAsMCArMSw0NzYgQEAKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2JyaWRnZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworI2luY2x1ZGUgImxpYm5ldGxpbmsuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgImJyX2NvbW1vbi5oIgorCitzdGF0aWMgdW5zaWduZWQgaW50IGZpbHRlcl9pbmRleDsKKworc3RhdGljIGNvbnN0IGNoYXIgKnBvcnRfc3RhdGVzW10gPSB7CisJW0JSX1NUQVRFX0RJU0FCTEVEXSA9ICJkaXNhYmxlZCIsCisJW0JSX1NUQVRFX0xJU1RFTklOR10gPSAibGlzdGVuaW5nIiwKKwlbQlJfU1RBVEVfTEVBUk5JTkddID0gImxlYXJuaW5nIiwKKwlbQlJfU1RBVEVfRk9SV0FSRElOR10gPSAiZm9yd2FyZGluZyIsCisJW0JSX1NUQVRFX0JMT0NLSU5HXSA9ICJibG9ja2luZyIsCit9OworCitleHRlcm4gY2hhciAqaWZfaW5kZXh0b25hbWUgKHVuc2lnbmVkIGludCBfX2lmaW5kZXgsIGNoYXIgKl9faWZuYW1lKTsKKworc3RhdGljIHZvaWQgcHJpbnRfbGlua19mbGFncyhGSUxFICpmcCwgdW5zaWduZWQgZmxhZ3MpCit7CisJZnByaW50ZihmcCwgIjwiKTsKKwlpZiAoZmxhZ3MgJiBJRkZfVVAgJiYgIShmbGFncyAmIElGRl9SVU5OSU5HKSkKKwkJZnByaW50ZihmcCwgIk5PLUNBUlJJRVIlcyIsIGZsYWdzID8gIiwiIDogIiIpOworCWZsYWdzICY9IH5JRkZfUlVOTklORzsKKyNkZWZpbmUgX1BGKGYpIGlmIChmbGFncyZJRkZfIyNmKSB7IFwKKyAgICAgICAgICAgICAgICAgIGZsYWdzICY9IH5JRkZfIyNmIDsgXAorICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwgI2YgIiVzIiwgZmxhZ3MgPyAiLCIgOiAiIik7IH0KKwlfUEYoTE9PUEJBQ0spOworCV9QRihCUk9BRENBU1QpOworCV9QRihQT0lOVE9QT0lOVCk7CisJX1BGKE1VTFRJQ0FTVCk7CisJX1BGKE5PQVJQKTsKKwlfUEYoQUxMTVVMVEkpOworCV9QRihQUk9NSVNDKTsKKwlfUEYoTUFTVEVSKTsKKwlfUEYoU0xBVkUpOworCV9QRihERUJVRyk7CisJX1BGKERZTkFNSUMpOworCV9QRihBVVRPTUVESUEpOworCV9QRihQT1JUU0VMKTsKKwlfUEYoTk9UUkFJTEVSUyk7CisJX1BGKFVQKTsKKwlfUEYoTE9XRVJfVVApOworCV9QRihET1JNQU5UKTsKKwlfUEYoRUNITyk7CisjdW5kZWYgX1BGCisgICAgICAgIGlmIChmbGFncykKKwkJZnByaW50ZihmcCwgIiV4IiwgZmxhZ3MpOworCWZwcmludGYoZnAsICI+ICIpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqb3Blcl9zdGF0ZXNbXSA9IHsKKwkiVU5LTk9XTiIsICJOT1RQUkVTRU5UIiwgIkRPV04iLCAiTE9XRVJMQVlFUkRPV04iLAorCSJURVNUSU5HIiwgIkRPUk1BTlQiLAkgIlVQIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmh3X21vZGVbXSA9IHsiVkVCIiwgIlZFUEEifTsKKworc3RhdGljIHZvaWQgcHJpbnRfb3BlcnN0YXRlKEZJTEUgKmYsIF9fdTggc3RhdGUpCit7CisJaWYgKHN0YXRlID49IHNpemVvZihvcGVyX3N0YXRlcykvc2l6ZW9mKG9wZXJfc3RhdGVzWzBdKSkKKwkJZnByaW50ZihmLCAic3RhdGUgJSN4ICIsIHN0YXRlKTsKKwllbHNlCisJCWZwcmludGYoZiwgInN0YXRlICVzICIsIG9wZXJfc3RhdGVzW3N0YXRlXSk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3BvcnRzdGF0ZShGSUxFICpmLCBfX3U4IHN0YXRlKQoreworCWlmIChzdGF0ZSA8PSBCUl9TVEFURV9CTE9DS0lORykKKwkJZnByaW50ZihmLCAic3RhdGUgJXMgIiwgcG9ydF9zdGF0ZXNbc3RhdGVdKTsKKwllbHNlCisJCWZwcmludGYoZiwgInN0YXRlICglZCkgIiwgc3RhdGUpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9vbm9mZihGSUxFICpmLCBjaGFyICpmbGFnLCBfX3U4IHZhbCkKK3sKKwlmcHJpbnRmKGYsICIlcyAlcyAiLCBmbGFnLCB2YWwgPyAib24iIDogIm9mZiIpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9od21vZGUoRklMRSAqZiwgX191MTYgbW9kZSkKK3sKKwlpZiAobW9kZSA+PSBzaXplb2YoaHdfbW9kZSkvc2l6ZW9mKGh3X21vZGVbMF0pKQorCQlmcHJpbnRmKGYsICJod21vZGUgJSNoeCAiLCBtb2RlKTsKKwllbHNlCisJCWZwcmludGYoZiwgImh3bW9kZSAlcyAiLCBod19tb2RlW21vZGVdKTsKK30KKworaW50IHByaW50X2xpbmtpbmZvKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLAorCQkgICBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZykKK3sKKwlGSUxFICpmcCA9IGFyZzsKKwlpbnQgbGVuID0gbi0+bmxtc2dfbGVuOworCXN0cnVjdCBpZmluZm9tc2cgKmlmaSA9IE5MTVNHX0RBVEEobik7CisJc3RydWN0IHJ0YXR0ciAqIHRiW0lGTEFfTUFYKzFdOworCWNoYXIgYjFbSUZOQU1TSVpdOworCisJbGVuIC09IE5MTVNHX0xFTkdUSChzaXplb2YoKmlmaSkpOworCWlmIChsZW4gPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTWVzc2FnZSB0b28gc2hvcnQhXG4iKTsKKwkJcmV0dXJuIC0xOworICAgICAgICB9CisKKwlpZiAoIShpZmktPmlmaV9mYW1pbHkgPT0gQUZfQlJJREdFIHx8IGlmaS0+aWZpX2ZhbWlseSA9PSBBRl9VTlNQRUMpKQorCQlyZXR1cm4gMDsKKworCWlmIChmaWx0ZXJfaW5kZXggJiYgZmlsdGVyX2luZGV4ICE9IGlmaS0+aWZpX2luZGV4KQorCQlyZXR1cm4gMDsKKworCXBhcnNlX3J0YXR0cl9mbGFncyh0YiwgSUZMQV9NQVgsIElGTEFfUlRBKGlmaSksIGxlbiwgTkxBX0ZfTkVTVEVEKTsKKworCWlmICh0YltJRkxBX0lGTkFNRV0gPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkJVRzogbmlsIGlmbmFtZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAobi0+bmxtc2dfdHlwZSA9PSBSVE1fREVMTElOSykKKwkJZnByaW50ZihmcCwgIkRlbGV0ZWQgIik7CisKKwlmcHJpbnRmKGZwLCAiJWQ6ICVzICIsIGlmaS0+aWZpX2luZGV4LAorCQl0YltJRkxBX0lGTkFNRV0gPyBydGFfZ2V0YXR0cl9zdHIodGJbSUZMQV9JRk5BTUVdKSA6ICI8bmlsPiIpOworCisJaWYgKHRiW0lGTEFfT1BFUlNUQVRFXSkKKwkJcHJpbnRfb3BlcnN0YXRlKGZwLCBydGFfZ2V0YXR0cl91OCh0YltJRkxBX09QRVJTVEFURV0pKTsKKworCWlmICh0YltJRkxBX0xJTktdKSB7CisJCVNQUklOVF9CVUYoYjEpOworCQlpbnQgaWZsaW5rID0gcnRhX2dldGF0dHJfdTMyKHRiW0lGTEFfTElOS10pOworCQlpZiAoaWZsaW5rID09IDApCisJCQlmcHJpbnRmKGZwLCAiQE5PTkU6ICIpOworCQllbHNlCisJCQlmcHJpbnRmKGZwLCAiQCVzOiAiLAorCQkJCWlmX2luZGV4dG9uYW1lKGlmbGluaywgYjEpKTsKKwl9IGVsc2UKKwkJZnByaW50ZihmcCwgIjogIik7CisKKwlwcmludF9saW5rX2ZsYWdzKGZwLCBpZmktPmlmaV9mbGFncyk7CisKKwlpZiAodGJbSUZMQV9NVFVdKQorCQlmcHJpbnRmKGZwLCAibXR1ICV1ICIsIHJ0YV9nZXRhdHRyX3UzMih0YltJRkxBX01UVV0pKTsKKworCWlmICh0YltJRkxBX01BU1RFUl0pCisJCWZwcmludGYoZnAsICJtYXN0ZXIgJXMgIiwKKwkJCWlmX2luZGV4dG9uYW1lKHJ0YV9nZXRhdHRyX3UzMih0YltJRkxBX01BU1RFUl0pLCBiMSkpOworCisJaWYgKHRiW0lGTEFfUFJPVElORk9dKSB7CisJCWlmICh0YltJRkxBX1BST1RJTkZPXS0+cnRhX3R5cGUgJiBOTEFfRl9ORVNURUQpIHsKKwkJCXN0cnVjdCBydGF0dHIgKnBydGJbSUZMQV9CUlBPUlRfTUFYKzFdOworCisJCQlwYXJzZV9ydGF0dHJfbmVzdGVkKHBydGIsIElGTEFfQlJQT1JUX01BWCwKKwkJCQkJICAgIHRiW0lGTEFfUFJPVElORk9dKTsKKworCQkJaWYgKHBydGJbSUZMQV9CUlBPUlRfU1RBVEVdKQorCQkJCXByaW50X3BvcnRzdGF0ZShmcCwKKwkJCQkJCXJ0YV9nZXRhdHRyX3U4KHBydGJbSUZMQV9CUlBPUlRfU1RBVEVdKSk7CisJCQlpZiAocHJ0YltJRkxBX0JSUE9SVF9QUklPUklUWV0pCisJCQkJZnByaW50ZihmcCwgInByaW9yaXR5ICVodSAiLAorCQkJCQlydGFfZ2V0YXR0cl91MTYocHJ0YltJRkxBX0JSUE9SVF9QUklPUklUWV0pKTsKKwkJCWlmIChwcnRiW0lGTEFfQlJQT1JUX0NPU1RdKQorCQkJCWZwcmludGYoZnAsICJjb3N0ICV1ICIsCisJCQkJCXJ0YV9nZXRhdHRyX3UzMihwcnRiW0lGTEFfQlJQT1JUX0NPU1RdKSk7CisKKwkJCWlmIChzaG93X2RldGFpbHMpIHsKKwkJCQlmcHJpbnRmKGZwLCAiJXMgICAgIiwgX1NMXyk7CisKKwkJCQlpZiAocHJ0YltJRkxBX0JSUE9SVF9NT0RFXSkKKwkJCQkJcHJpbnRfb25vZmYoZnAsICJoYWlycGluIiwKKwkJCQkJCSAgICBydGFfZ2V0YXR0cl91OChwcnRiW0lGTEFfQlJQT1JUX01PREVdKSk7CisJCQkJaWYgKHBydGJbSUZMQV9CUlBPUlRfR1VBUkRdKQorCQkJCQlwcmludF9vbm9mZihmcCwgImd1YXJkIiwKKwkJCQkJCSAgICBydGFfZ2V0YXR0cl91OChwcnRiW0lGTEFfQlJQT1JUX0dVQVJEXSkpOworCQkJCWlmIChwcnRiW0lGTEFfQlJQT1JUX1BST1RFQ1RdKQorCQkJCQlwcmludF9vbm9mZihmcCwgInJvb3RfYmxvY2siLAorCQkJCQkJICAgIHJ0YV9nZXRhdHRyX3U4KHBydGJbSUZMQV9CUlBPUlRfUFJPVEVDVF0pKTsKKwkJCQlpZiAocHJ0YltJRkxBX0JSUE9SVF9GQVNUX0xFQVZFXSkKKwkJCQkJcHJpbnRfb25vZmYoZnAsICJmYXN0bGVhdmUiLAorCQkJCQkJICAgIHJ0YV9nZXRhdHRyX3U4KHBydGJbSUZMQV9CUlBPUlRfRkFTVF9MRUFWRV0pKTsKKwkJCQlpZiAocHJ0YltJRkxBX0JSUE9SVF9MRUFSTklOR10pCisJCQkJCXByaW50X29ub2ZmKGZwLCAibGVhcm5pbmciLAorCQkJCQkJICAgIHJ0YV9nZXRhdHRyX3U4KHBydGJbSUZMQV9CUlBPUlRfTEVBUk5JTkddKSk7CisJCQkJaWYgKHBydGJbSUZMQV9CUlBPUlRfTEVBUk5JTkdfU1lOQ10pCisJCQkJCXByaW50X29ub2ZmKGZwLCAibGVhcm5pbmdfc3luYyIsCisJCQkJCQkgICAgcnRhX2dldGF0dHJfdTgocHJ0YltJRkxBX0JSUE9SVF9MRUFSTklOR19TWU5DXSkpOworCQkJCWlmIChwcnRiW0lGTEFfQlJQT1JUX1VOSUNBU1RfRkxPT0RdKQorCQkJCQlwcmludF9vbm9mZihmcCwgImZsb29kIiwKKwkJCQkJCSAgICBydGFfZ2V0YXR0cl91OChwcnRiW0lGTEFfQlJQT1JUX1VOSUNBU1RfRkxPT0RdKSk7CisJCQl9CisJCX0gZWxzZQorCQkJcHJpbnRfcG9ydHN0YXRlKGZwLCBydGFfZ2V0YXR0cl91OCh0YltJRkxBX1BST1RJTkZPXSkpOworCX0KKworCWlmICh0YltJRkxBX0FGX1NQRUNdKSB7CisJCS8qIFRoaXMgaXMgcmVwb3J0ZWQgYnkgSFcgZGV2aWNlcyB0aGF0IGhhdmUgc29tZSBicmlkZ2luZworCQkgKiBjYXBhYmlsaXRpZXMuCisJCSAqLworCQlzdHJ1Y3QgcnRhdHRyICphZnRiW0lGTEFfQlJJREdFX01BWCsxXTsKKworCQlwYXJzZV9ydGF0dHJfbmVzdGVkKGFmdGIsIElGTEFfQlJJREdFX01BWCwgdGJbSUZMQV9BRl9TUEVDXSk7CisKKwkJaWYgKGFmdGJbSUZMQV9CUklER0VfTU9ERV0pCisJCQlwcmludF9od21vZGUoZnAsIHJ0YV9nZXRhdHRyX3UxNihhZnRiW0lGTEFfQlJJREdFX01PREVdKSk7CisJfQorCisJZnByaW50ZihmcCwgIlxuIik7CisJZmZsdXNoKGZwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBicmlkZ2UgbGluayBzZXQgZGV2IERFViBbIGNvc3QgQ09TVCBdIFsgcHJpb3JpdHkgUFJJTyBdIFsgc3RhdGUgU1RBVEUgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBndWFyZCB7b24gfCBvZmZ9IF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgaGFpcnBpbiB7b24gfCBvZmZ9IF0gXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIGZhc3RsZWF2ZSB7b24gfCBvZmZ9IF1cbiIpOworCWZwcmludGYoc3RkZXJyLAkiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgcm9vdF9ibG9jayB7b24gfCBvZmZ9IF1cbiIpOworCWZwcmludGYoc3RkZXJyLAkiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgbGVhcm5pbmcge29uIHwgb2ZmfSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwJIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIGxlYXJuaW5nX3N5bmMge29uIHwgb2ZmfSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwJIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIGZsb29kIHtvbiB8IG9mZn0gXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBod21vZGUge3ZlcGEgfCB2ZWJ9IF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgc2VsZiBdIFsgbWFzdGVyIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgIGJyaWRnZSBsaW5rIHNob3cgW2RldiBERVZdXG4iKTsKKwlleGl0KC0xKTsKK30KKworc3RhdGljIGJvb2wgb25fb2ZmKGNoYXIgKmFyZywgX19zOCAqYXR0ciwgY2hhciAqdmFsKQoreworCWlmIChzdHJjbXAodmFsLCAib24iKSA9PSAwKQorCQkqYXR0ciA9IDE7CisJZWxzZSBpZiAoc3RyY21wKHZhbCwgIm9mZiIpID09IDApCisJCSphdHRyID0gMDsKKwllbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiRXJyb3I6IGFyZ3VtZW50IG9mIFwiJXNcIiBtdXN0IGJlIFwib25cIiBvciBcIm9mZlwiXG4iLAorCQkJYXJnKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IGJybGlua19tb2RpZnkoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCB7CisJCXN0cnVjdCBubG1zZ2hkciAgbjsKKwkJc3RydWN0IGlmaW5mb21zZyBpZm07CisJCWNoYXIgICAgICAgICAgICAgYnVmWzUxMl07CisJfSByZXE7CisJY2hhciAqZCA9IE5VTEw7CisJX19zOCBsZWFybmluZyA9IC0xOworCV9fczggbGVhcm5pbmdfc3luYyA9IC0xOworCV9fczggZmxvb2QgPSAtMTsKKwlfX3M4IGhhaXJwaW4gPSAtMTsKKwlfX3M4IGJwZHVfZ3VhcmQgPSAtMTsKKwlfX3M4IGZhc3RfbGVhdmUgPSAtMTsKKwlfX3M4IHJvb3RfYmxvY2sgPSAtMTsKKwlfX3UzMiBjb3N0ID0gMDsKKwlfX3MxNiBwcmlvcml0eSA9IC0xOworCV9fczggc3RhdGUgPSAtMTsKKwlfX3MxNiBtb2RlID0gLTE7CisJX191MTYgZmxhZ3MgPSAwOworCXN0cnVjdCBydGF0dHIgKm5lc3Q7CisKKwltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCisJcmVxLm4ubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgaWZpbmZvbXNnKSk7CisJcmVxLm4ubmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUOworCXJlcS5uLm5sbXNnX3R5cGUgPSBSVE1fU0VUTElOSzsKKwlyZXEuaWZtLmlmaV9mYW1pbHkgPSBQRl9CUklER0U7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgImRldiIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlkID0gKmFyZ3Y7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZ3VhcmQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKCFvbl9vZmYoImd1YXJkIiwgJmJwZHVfZ3VhcmQsICphcmd2KSkKKwkJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaGFpcnBpbiIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoIW9uX29mZigiaGFpcnBpbmciLCAmaGFpcnBpbiwgKmFyZ3YpKQorCQkJCXJldHVybiAtMTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJmYXN0bGVhdmUiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKCFvbl9vZmYoImZhc3RsZWF2ZSIsICZmYXN0X2xlYXZlLCAqYXJndikpCisJCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInJvb3RfYmxvY2siKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKCFvbl9vZmYoInJvb3RfYmxvY2siLCAmcm9vdF9ibG9jaywgKmFyZ3YpKQorCQkJCXJldHVybiAtMTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJsZWFybmluZyIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoIW9uX29mZigibGVhcm5pbmciLCAmbGVhcm5pbmcsICphcmd2KSkKKwkJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibGVhcm5pbmdfc3luYyIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoIW9uX29mZigibGVhcm5pbmdfc3luYyIsICZsZWFybmluZ19zeW5jLCAqYXJndikpCisJCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImZsb29kIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmICghb25fb2ZmKCJmbG9vZCIsICZmbG9vZCwgKmFyZ3YpKQorCQkJCXJldHVybiAtMTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJjb3N0IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWNvc3QgPSBhdG9pKCphcmd2KTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJwcmlvcml0eSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlwcmlvcml0eSA9IGF0b2koKmFyZ3YpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInN0YXRlIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWNoYXIgKmVuZHB0cjsKKwkJCXNpemVfdCBuc3RhdGVzID0gc2l6ZW9mKHBvcnRfc3RhdGVzKSAvIHNpemVvZigqcG9ydF9zdGF0ZXMpOworCQkJc3RhdGUgPSBzdHJ0b2woKmFyZ3YsICZlbmRwdHIsIDEwKTsKKwkJCWlmICghKCoqYXJndiAhPSAnXDAnICYmICplbmRwdHIgPT0gJ1wwJykpIHsKKwkJCQlmb3IgKHN0YXRlID0gMDsgc3RhdGUgPCBuc3RhdGVzOyBzdGF0ZSsrKQorCQkJCQlpZiAoc3RyY21wKHBvcnRfc3RhdGVzW3N0YXRlXSwgKmFyZ3YpID09IDApCisJCQkJCQlicmVhazsKKwkJCQlpZiAoc3RhdGUgPT0gbnN0YXRlcykgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJCSJFcnJvcjogaW52YWxpZCBTVFAgcG9ydCBzdGF0ZVxuIik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaHdtb2RlIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWZsYWdzID0gQlJJREdFX0ZMQUdTX1NFTEY7CisJCQlpZiAoc3RyY21wKCphcmd2LCAidmVwYSIpID09IDApCisJCQkJbW9kZSA9IEJSSURHRV9NT0RFX1ZFUEE7CisJCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJ2ZWIiKSA9PSAwKQorCQkJCW1vZGUgPSBCUklER0VfTU9ERV9WRUI7CisJCQllbHNlIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJIk1vZGUgYXJndW1lbnQgbXVzdCBiZSBcInZlcGFcIiBvciAiCisJCQkJCSJcInZlYlwiLlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInNlbGYiKSA9PSAwKSB7CisJCQlmbGFncyB8PSBCUklER0VfRkxBR1NfU0VMRjsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJtYXN0ZXIiKSA9PSAwKSB7CisJCQlmbGFncyB8PSBCUklER0VfRkxBR1NfTUFTVEVSOworCQl9IGVsc2UgeworCQkJdXNhZ2UoKTsKKwkJfQorCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisJaWYgKGQgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkRldmljZSBpcyBhIHJlcXVpcmVkIGFyZ3VtZW50LlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKworCXJlcS5pZm0uaWZpX2luZGV4ID0gbGxfbmFtZV90b19pbmRleChkKTsKKwlpZiAocmVxLmlmbS5pZmlfaW5kZXggPT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBmaW5kIGJyaWRnZSBkZXZpY2UgXCIlc1wiXG4iLCBkKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIE5lc3RlZCBQUk9USU5GTyBhdHRyaWJ1dGUuICBDb250YWluczogcG9ydCBmbGFncywgY29zdCwgcHJpb3JpdHkgYW5kCisJICogc3RhdGUuCisJICovCisJbmVzdCA9IGFkZGF0dHJfbmVzdCgmcmVxLm4sIHNpemVvZihyZXEpLAorCQkJICAgIElGTEFfUFJPVElORk8gfCBOTEFfRl9ORVNURUQpOworCS8qIEZsYWdzIGZpcnN0ICovCisJaWYgKGJwZHVfZ3VhcmQgPj0gMCkKKwkJYWRkYXR0cjgoJnJlcS5uLCBzaXplb2YocmVxKSwgSUZMQV9CUlBPUlRfR1VBUkQsIGJwZHVfZ3VhcmQpOworCWlmIChoYWlycGluID49IDApCisJCWFkZGF0dHI4KCZyZXEubiwgc2l6ZW9mKHJlcSksIElGTEFfQlJQT1JUX01PREUsIGhhaXJwaW4pOworCWlmIChmYXN0X2xlYXZlID49IDApCisJCWFkZGF0dHI4KCZyZXEubiwgc2l6ZW9mKHJlcSksIElGTEFfQlJQT1JUX0ZBU1RfTEVBVkUsCisJCQkgZmFzdF9sZWF2ZSk7CisJaWYgKHJvb3RfYmxvY2sgPj0gMCkKKwkJYWRkYXR0cjgoJnJlcS5uLCBzaXplb2YocmVxKSwgSUZMQV9CUlBPUlRfUFJPVEVDVCwgcm9vdF9ibG9jayk7CisJaWYgKGZsb29kID49IDApCisJCWFkZGF0dHI4KCZyZXEubiwgc2l6ZW9mKHJlcSksIElGTEFfQlJQT1JUX1VOSUNBU1RfRkxPT0QsIGZsb29kKTsKKwlpZiAobGVhcm5pbmcgPj0gMCkKKwkJYWRkYXR0cjgoJnJlcS5uLCBzaXplb2YocmVxKSwgSUZMQV9CUlBPUlRfTEVBUk5JTkcsIGxlYXJuaW5nKTsKKwlpZiAobGVhcm5pbmdfc3luYyA+PSAwKQorCQlhZGRhdHRyOCgmcmVxLm4sIHNpemVvZihyZXEpLCBJRkxBX0JSUE9SVF9MRUFSTklOR19TWU5DLAorCQkJIGxlYXJuaW5nX3N5bmMpOworCisJaWYgKGNvc3QgPiAwKQorCQlhZGRhdHRyMzIoJnJlcS5uLCBzaXplb2YocmVxKSwgSUZMQV9CUlBPUlRfQ09TVCwgY29zdCk7CisKKwlpZiAocHJpb3JpdHkgPj0gMCkKKwkJYWRkYXR0cjE2KCZyZXEubiwgc2l6ZW9mKHJlcSksIElGTEFfQlJQT1JUX1BSSU9SSVRZLCBwcmlvcml0eSk7CisKKwlpZiAoc3RhdGUgPj0gMCkKKwkJYWRkYXR0cjgoJnJlcS5uLCBzaXplb2YocmVxKSwgSUZMQV9CUlBPUlRfU1RBVEUsIHN0YXRlKTsKKworCWFkZGF0dHJfbmVzdF9lbmQoJnJlcS5uLCBuZXN0KTsKKworCS8qIElGTEFfQUZfU1BFQyBuZXN0ZWQgYXR0cmlidXRlLiBDb250YWlucyBJRkxBX0JSSURHRV9GTEFHUyB0aGF0CisJICogZGVzaWduYXRlcyBtYXN0ZXIgb3Igc2VsZiBvcGVyYXRpb24gYW5kIElGTEFfQlJJREdFX01PREUKKwkgKiBmb3IgaHcgJ3ZlcGEnIG9yICd2ZWInIG9wZXJhdGlvbiBtb2Rlcy4gVGhlIGh3bW9kZXMgYXJlCisJICogb25seSB2YWxpZCBpbiAnc2VsZicgbW9kZSBvbiBzb21lIGRldmljZXMgc28gZmFyLgorCSAqLworCWlmIChtb2RlID49IDAgfHwgZmxhZ3MgPiAwKSB7CisJCW5lc3QgPSBhZGRhdHRyX25lc3QoJnJlcS5uLCBzaXplb2YocmVxKSwgSUZMQV9BRl9TUEVDKTsKKworCQlpZiAoZmxhZ3MgPiAwKQorCQkJYWRkYXR0cjE2KCZyZXEubiwgc2l6ZW9mKHJlcSksIElGTEFfQlJJREdFX0ZMQUdTLCBmbGFncyk7CisKKwkJaWYgKG1vZGUgPj0gMCkKKwkJCWFkZGF0dHIxNigmcmVxLm4sIHNpemVvZihyZXEpLCBJRkxBX0JSSURHRV9NT0RFLCBtb2RlKTsKKworCQlhZGRhdHRyX25lc3RfZW5kKCZyZXEubiwgbmVzdCk7CisJfQorCisJaWYgKHJ0bmxfdGFsaygmcnRoLCAmcmVxLm4sIE5VTEwsIDApIDwgMCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnJsaW5rX3Nob3coaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKmZpbHRlcl9kZXYgPSBOVUxMOworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChzdHJjbXAoKmFyZ3YsICJkZXYiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGZpbHRlcl9kZXYpCisJCQkJZHVwYXJnKCJkZXYiLCAqYXJndik7CisJCQlmaWx0ZXJfZGV2ID0gKmFyZ3Y7CisJCX0KKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJaWYgKGZpbHRlcl9kZXYpIHsKKwkJaWYgKChmaWx0ZXJfaW5kZXggPSBsbF9uYW1lX3RvX2luZGV4KGZpbHRlcl9kZXYpKSA9PSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBmaW5kIGRldmljZSBcIiVzXCJcbiIsCisJCQkJZmlsdGVyX2Rldik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlpZiAocnRubF93aWxkZHVtcF9yZXF1ZXN0KCZydGgsIFBGX0JSSURHRSwgUlRNX0dFVExJTkspIDwgMCkgeworCQlwZXJyb3IoIkNhbm5vbiBzZW5kIGR1bXAgcmVxdWVzdCIpOworCQlleGl0KDEpOworCX0KKworCWlmIChydG5sX2R1bXBfZmlsdGVyKCZydGgsIHByaW50X2xpbmtpbmZvLCBzdGRvdXQpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkR1bXAgdGVybWluYXRlZFxuIik7CisJCWV4aXQoMSk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgZG9fbGluayhpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJbGxfaW5pdF9tYXAoJnJ0aCk7CisJaWYgKGFyZ2MgPiAwKSB7CisJCWlmIChtYXRjaGVzKCphcmd2LCAic2V0IikgPT0gMCB8fAorCQkgICAgbWF0Y2hlcygqYXJndiwgImNoYW5nZSIpID09IDApCisJCQlyZXR1cm4gYnJsaW5rX21vZGlmeShhcmdjLTEsIGFyZ3YrMSk7CisJCWlmIChtYXRjaGVzKCphcmd2LCAic2hvdyIpID09IDAgfHwKKwkJICAgIG1hdGNoZXMoKmFyZ3YsICJsc3QiKSA9PSAwIHx8CisJCSAgICBtYXRjaGVzKCphcmd2LCAibGlzdCIpID09IDApCisJCQlyZXR1cm4gYnJsaW5rX3Nob3coYXJnYy0xLCBhcmd2KzEpOworCQlpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKQorCQkJdXNhZ2UoKTsKKwl9IGVsc2UKKwkJcmV0dXJuIGJybGlua19zaG93KDAsIE5VTEwpOworCisJZnByaW50ZihzdGRlcnIsICJDb21tYW5kIFwiJXNcIiBpcyB1bmtub3duLCB0cnkgXCJicmlkZ2UgbGluayBoZWxwXCIuXG4iLCAqYXJndik7CisJZXhpdCgtMSk7Cit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9icmlkZ2UvbWRiLmMgYi9pcHJvdXRlMi9icmlkZ2UvbWRiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRjNDkwMwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2JyaWRnZS9tZGIuYwpAQCAtMCwwICsxLDI3OSBAQAorLyoKKyAqIEdldCBtZGIgdGFibGUgd2l0aCBuZXRsaW5rCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2JyaWRnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlICJsaWJuZXRsaW5rLmgiCisjaW5jbHVkZSAiYnJfY29tbW9uLmgiCisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCisjaWZuZGVmIE1EQkFfUlRBCisjZGVmaW5lIE1EQkFfUlRBKHIpIFwKKwkoKHN0cnVjdCBydGF0dHIqKSgoKGNoYXIqKShyKSkgKyBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IGJyX3BvcnRfbXNnKSkpKQorI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZmlsdGVyX2luZGV4OworCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGJyaWRnZSBtZGIgeyBhZGQgfCBkZWwgfSBkZXYgREVWIHBvcnQgUE9SVCBncnAgR1JPVVAgW3Blcm1hbmVudCB8IHRlbXBdIFt2aWQgVklEXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgYnJpZGdlIG1kYiB7c2hvd30gWyBkZXYgREVWIF1cbiIpOworCWV4aXQoLTEpOworfQorCitzdGF0aWMgdm9pZCBicl9wcmludF9yb3V0ZXJfcG9ydHMoRklMRSAqZiwgc3RydWN0IHJ0YXR0ciAqYXR0cikKK3sKKwl1aW50MzJfdCAqcG9ydF9pZmluZGV4OworCXN0cnVjdCBydGF0dHIgKmk7CisJaW50IHJlbTsKKworCXJlbSA9IFJUQV9QQVlMT0FEKGF0dHIpOworCWZvciAoaSA9IFJUQV9EQVRBKGF0dHIpOyBSVEFfT0soaSwgcmVtKTsgaSA9IFJUQV9ORVhUKGksIHJlbSkpIHsKKwkJcG9ydF9pZmluZGV4ID0gUlRBX0RBVEEoaSk7CisJCWZwcmludGYoZiwgIiVzICIsIGxsX2luZGV4X3RvX25hbWUoKnBvcnRfaWZpbmRleCkpOworCX0KKworCWZwcmludGYoZiwgIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X21kYl9lbnRyeShGSUxFICpmLCBpbnQgaWZpbmRleCwgc3RydWN0IGJyX21kYl9lbnRyeSAqZSwKKwkJCSAgICBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJU1BSSU5UX0JVRihhYnVmKTsKKwljb25zdCB2b2lkICpzcmM7CisJaW50IGFmOworCisJYWYgPSBlLT5hZGRyLnByb3RvID09IGh0b25zKEVUSF9QX0lQKSA/IEFGX0lORVQgOiBBRl9JTkVUNjsKKwlzcmMgPSBhZiA9PSBBRl9JTkVUID8gKGNvbnN0IHZvaWQgKikmZS0+YWRkci51LmlwNCA6CisJCQkgICAgICAoY29uc3Qgdm9pZCAqKSZlLT5hZGRyLnUuaXA2OworCWlmIChuLT5ubG1zZ190eXBlID09IFJUTV9ERUxNREIpCisJCWZwcmludGYoZiwgIkRlbGV0ZWQgIik7CisJZnByaW50ZihmLCAiZGV2ICVzIHBvcnQgJXMgZ3JwICVzICVzIiwgbGxfaW5kZXhfdG9fbmFtZShpZmluZGV4KSwKKwkJbGxfaW5kZXhfdG9fbmFtZShlLT5pZmluZGV4KSwKKwkJaW5ldF9udG9wKGFmLCBzcmMsIGFidWYsIHNpemVvZihhYnVmKSksCisJCShlLT5zdGF0ZSAmIE1EQl9QRVJNQU5FTlQpID8gInBlcm1hbmVudCIgOiAidGVtcCIpOworCWlmIChlLT52aWQpCisJCWZwcmludGYoZiwgIiB2aWQgJWh1IiwgZS0+dmlkKTsKKwlmcHJpbnRmKGYsICJcbiIpOworfQorCitzdGF0aWMgdm9pZCBicl9wcmludF9tZGJfZW50cnkoRklMRSAqZiwgaW50IGlmaW5kZXgsIHN0cnVjdCBydGF0dHIgKmF0dHIsCisJCQkgICAgICAgc3RydWN0IG5sbXNnaGRyICpuKQoreworCXN0cnVjdCBydGF0dHIgKmk7CisJaW50IHJlbTsKKwlzdHJ1Y3QgYnJfbWRiX2VudHJ5ICplOworCisJcmVtID0gUlRBX1BBWUxPQUQoYXR0cik7CisJZm9yIChpID0gUlRBX0RBVEEoYXR0cik7IFJUQV9PSyhpLCByZW0pOyBpID0gUlRBX05FWFQoaSwgcmVtKSkgeworCQllID0gUlRBX0RBVEEoaSk7CisJCXByaW50X21kYl9lbnRyeShmLCBpZmluZGV4LCBlLCBuKTsKKwl9Cit9CisKK2ludCBwcmludF9tZGIoY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8sIHN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqYXJnKQoreworCUZJTEUgKmZwID0gYXJnOworCXN0cnVjdCBicl9wb3J0X21zZyAqciA9IE5MTVNHX0RBVEEobik7CisJaW50IGxlbiA9IG4tPm5sbXNnX2xlbjsKKwlzdHJ1Y3QgcnRhdHRyICp0YltNREJBX01BWCsxXSwgKmk7CisKKwlpZiAobi0+bmxtc2dfdHlwZSAhPSBSVE1fR0VUTURCICYmIG4tPm5sbXNnX3R5cGUgIT0gUlRNX05FV01EQiAmJiBuLT5ubG1zZ190eXBlICE9IFJUTV9ERUxNREIpIHsKKwkJZnByaW50ZihzdGRlcnIsICJOb3QgUlRNX0dFVE1EQiwgUlRNX05FV01EQiBvciBSVE1fREVMTURCOiAlMDh4ICUwOHggJTA4eFxuIiwKKwkJCW4tPm5sbXNnX2xlbiwgbi0+bmxtc2dfdHlwZSwgbi0+bmxtc2dfZmxhZ3MpOworCisJCXJldHVybiAwOworCX0KKworCWxlbiAtPSBOTE1TR19MRU5HVEgoc2l6ZW9mKCpyKSk7CisJaWYgKGxlbiA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJCVUc6IHdyb25nIG5sbXNnIGxlbiAlZFxuIiwgbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChmaWx0ZXJfaW5kZXggJiYgZmlsdGVyX2luZGV4ICE9IHItPmlmaW5kZXgpCisJCXJldHVybiAwOworCisJcGFyc2VfcnRhdHRyKHRiLCBNREJBX01BWCwgTURCQV9SVEEociksIG4tPm5sbXNnX2xlbiAtIE5MTVNHX0xFTkdUSChzaXplb2YoKnIpKSk7CisKKwlpZiAodGJbTURCQV9NREJdKSB7CisJCWludCByZW0gPSBSVEFfUEFZTE9BRCh0YltNREJBX01EQl0pOworCisJCWZvciAoaSA9IFJUQV9EQVRBKHRiW01EQkFfTURCXSk7IFJUQV9PSyhpLCByZW0pOyBpID0gUlRBX05FWFQoaSwgcmVtKSkKKwkJCWJyX3ByaW50X21kYl9lbnRyeShmcCwgci0+aWZpbmRleCwgaSwgbik7CisJfQorCisJaWYgKHRiW01EQkFfUk9VVEVSXSkgeworCQlpZiAobi0+bmxtc2dfdHlwZSA9PSBSVE1fR0VUTURCKSB7CisJCQlpZiAoc2hvd19kZXRhaWxzKSB7CisJCQkJZnByaW50ZihmcCwgInJvdXRlciBwb3J0cyBvbiAlczogIiwKKwkJCQkJbGxfaW5kZXhfdG9fbmFtZShyLT5pZmluZGV4KSk7CisJCQkJYnJfcHJpbnRfcm91dGVyX3BvcnRzKGZwLCB0YltNREJBX1JPVVRFUl0pOworCQkJfQorCQl9IGVsc2UgeworCQkJdWludDMyX3QgKnBvcnRfaWZpbmRleDsKKworCQkJaSA9IFJUQV9EQVRBKHRiW01EQkFfUk9VVEVSXSk7CisJCQlwb3J0X2lmaW5kZXggPSBSVEFfREFUQShpKTsKKwkJCWlmIChuLT5ubG1zZ190eXBlID09IFJUTV9ERUxNREIpCisJCQkJZnByaW50ZihmcCwgIkRlbGV0ZWQgIik7CisJCQlmcHJpbnRmKGZwLCAicm91dGVyIHBvcnQgZGV2ICVzIG1hc3RlciAlc1xuIiwKKwkJCQlsbF9pbmRleF90b19uYW1lKCpwb3J0X2lmaW5kZXgpLAorCQkJCWxsX2luZGV4X3RvX25hbWUoci0+aWZpbmRleCkpOworCQl9CisJfQorCisJZmZsdXNoKGZwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1kYl9zaG93KGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpmaWx0ZXJfZGV2ID0gTlVMTDsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAoc3RyY21wKCphcmd2LCAiZGV2IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChmaWx0ZXJfZGV2KQorCQkJCWR1cGFyZygiZGV2IiwgKmFyZ3YpOworCQkJZmlsdGVyX2RldiA9ICphcmd2OworCQl9CisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCWlmIChmaWx0ZXJfZGV2KSB7CisJCWZpbHRlcl9pbmRleCA9IGlmX25hbWV0b2luZGV4KGZpbHRlcl9kZXYpOworCQlpZiAoZmlsdGVyX2luZGV4ID09IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IGZpbmQgZGV2aWNlIFwiJXNcIlxuIiwKKwkJCQlmaWx0ZXJfZGV2KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWlmIChydG5sX3dpbGRkdW1wX3JlcXVlc3QoJnJ0aCwgUEZfQlJJREdFLCBSVE1fR0VUTURCKSA8IDApIHsKKwkJcGVycm9yKCJDYW5ub3Qgc2VuZCBkdW1wIHJlcXVlc3QiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChydG5sX2R1bXBfZmlsdGVyKCZydGgsIHByaW50X21kYiwgc3Rkb3V0KSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJEdW1wIHRlcm1pbmF0ZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWRiX21vZGlmeShpbnQgY21kLCBpbnQgZmxhZ3MsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgbmxtc2doZHIgCW47CisJCXN0cnVjdCBicl9wb3J0X21zZwlicG07CisJCWNoYXIgICAJCQlidWZbMTAyNF07CisJfSByZXE7CisJc3RydWN0IGJyX21kYl9lbnRyeSBlbnRyeTsKKwljaGFyICpkID0gTlVMTCwgKnAgPSBOVUxMLCAqZ3JwID0gTlVMTDsKKwlzaG9ydCB2aWQgPSAwOworCisJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKwltZW1zZXQoJmVudHJ5LCAwLCBzaXplb2YoZW50cnkpKTsKKworCXJlcS5uLm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IGJyX3BvcnRfbXNnKSk7CisJcmVxLm4ubmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUfGZsYWdzOworCXJlcS5uLm5sbXNnX3R5cGUgPSBjbWQ7CisJcmVxLmJwbS5mYW1pbHkgPSBQRl9CUklER0U7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgImRldiIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlkID0gKmFyZ3Y7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZ3JwIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWdycCA9ICphcmd2OworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInBvcnQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJcCA9ICphcmd2OworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInBlcm1hbmVudCIpID09IDApIHsKKwkJCWlmIChjbWQgPT0gUlRNX05FV01EQikKKwkJCQllbnRyeS5zdGF0ZSB8PSBNREJfUEVSTUFORU5UOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInRlbXAiKSA9PSAwKSB7CisJCQk7Lyogbm90aGluZyAqLworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInZpZCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQl2aWQgPSBhdG9pKCphcmd2KTsKKwkJfSBlbHNlIHsKKwkJCWlmIChtYXRjaGVzKCphcmd2LCAiaGVscCIpID09IDApCisJCQkJdXNhZ2UoKTsKKwkJfQorCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisKKwlpZiAoZCA9PSBOVUxMIHx8IGdycCA9PSBOVUxMIHx8IHAgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkRldmljZSwgZ3JvdXAgYWRkcmVzcyBhbmQgcG9ydCBuYW1lIGFyZSByZXF1aXJlZCBhcmd1bWVudHMuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJlcS5icG0uaWZpbmRleCA9IGxsX25hbWVfdG9faW5kZXgoZCk7CisJaWYgKHJlcS5icG0uaWZpbmRleCA9PSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IGZpbmQgZGV2aWNlIFwiJXNcIlxuIiwgZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwllbnRyeS5pZmluZGV4ID0gbGxfbmFtZV90b19pbmRleChwKTsKKwlpZiAoZW50cnkuaWZpbmRleCA9PSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IGZpbmQgZGV2aWNlIFwiJXNcIlxuIiwgcCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoIWluZXRfcHRvbihBRl9JTkVULCBncnAsICZlbnRyeS5hZGRyLnUuaXA0KSkgeworCQlpZiAoIWluZXRfcHRvbihBRl9JTkVUNiwgZ3JwLCAmZW50cnkuYWRkci51LmlwNikpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBhZGRyZXNzIFwiJXNcIlxuIiwgZ3JwKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlCisJCQllbnRyeS5hZGRyLnByb3RvID0gaHRvbnMoRVRIX1BfSVBWNik7CisJfSBlbHNlCisJCWVudHJ5LmFkZHIucHJvdG8gPSBodG9ucyhFVEhfUF9JUCk7CisKKwllbnRyeS52aWQgPSB2aWQ7CisJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIE1EQkFfU0VUX0VOVFJZLCAmZW50cnksIHNpemVvZihlbnRyeSkpOworCisJaWYgKHJ0bmxfdGFsaygmcnRoLCAmcmVxLm4sIE5VTEwsIDApIDwgMCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkb19tZGIoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWxsX2luaXRfbWFwKCZydGgpOworCisJaWYgKGFyZ2MgPiAwKSB7CisJCWlmIChtYXRjaGVzKCphcmd2LCAiYWRkIikgPT0gMCkKKwkJCXJldHVybiBtZGJfbW9kaWZ5KFJUTV9ORVdNREIsIE5MTV9GX0NSRUFURXxOTE1fRl9FWENMLCBhcmdjLTEsIGFyZ3YrMSk7CisJCWlmIChtYXRjaGVzKCphcmd2LCAiZGVsZXRlIikgPT0gMCkKKwkJCXJldHVybiBtZGJfbW9kaWZ5KFJUTV9ERUxNREIsIDAsIGFyZ2MtMSwgYXJndisxKTsKKworCQlpZiAobWF0Y2hlcygqYXJndiwgInNob3ciKSA9PSAwIHx8CisJCSAgICBtYXRjaGVzKCphcmd2LCAibHN0IikgPT0gMCB8fAorCQkgICAgbWF0Y2hlcygqYXJndiwgImxpc3QiKSA9PSAwKQorCQkJcmV0dXJuIG1kYl9zaG93KGFyZ2MtMSwgYXJndisxKTsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkKKwkJCXVzYWdlKCk7CisJfSBlbHNlCisJCXJldHVybiBtZGJfc2hvdygwLCBOVUxMKTsKKworCWZwcmludGYoc3RkZXJyLCAiQ29tbWFuZCBcIiVzXCIgaXMgdW5rbm93biwgdHJ5IFwiYnJpZGdlIG1kYiBoZWxwXCIuXG4iLCAqYXJndik7CisJZXhpdCgtMSk7Cit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9icmlkZ2UvbW9uaXRvci5jIGIvaXByb3V0ZTIvYnJpZGdlL21vbml0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODM0MWVjCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvYnJpZGdlL21vbml0b3IuYwpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIGJybW9uaXRvci5jCQkiYnJpZGdlIG1vbml0b3IiCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJU3RlcGhlbiBIZW1taW5nZXIgPHNoZW1taW5nZXJAdnlhdHRhLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9icmlkZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZWlnaGJvdXIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiYnJfY29tbW9uLmgiCisKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKK2ludCBwcmVmaXhfYmFubmVyOworCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGJyaWRnZSBtb25pdG9yIFtmaWxlIHwgbGluayB8IGZkYiB8IG1kYiB8IGFsbF1cbiIpOworCWV4aXQoLTEpOworfQorCitzdGF0aWMgaW50IGFjY2VwdF9tc2coY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8sCisJCSAgICAgIHN0cnVjdCBydG5sX2N0cmxfZGF0YSAqY3RybCwKKwkJICAgICAgc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcpCit7CisJRklMRSAqZnAgPSBhcmc7CisKKwlpZiAodGltZXN0YW1wKQorCQlwcmludF90aW1lc3RhbXAoZnApOworCisJc3dpdGNoIChuLT5ubG1zZ190eXBlKSB7CisJY2FzZSBSVE1fTkVXTElOSzoKKwljYXNlIFJUTV9ERUxMSU5LOgorCQlpZiAocHJlZml4X2Jhbm5lcikKKwkJCWZwcmludGYoZnAsICJbTElOS10iKTsKKworCQlyZXR1cm4gcHJpbnRfbGlua2luZm8od2hvLCBuLCBhcmcpOworCisJY2FzZSBSVE1fTkVXTkVJR0g6CisJY2FzZSBSVE1fREVMTkVJR0g6CisJCWlmIChwcmVmaXhfYmFubmVyKQorCQkJZnByaW50ZihmcCwgIltORUlHSF0iKTsKKwkJcmV0dXJuIHByaW50X2ZkYih3aG8sIG4sIGFyZyk7CisKKwljYXNlIFJUTV9ORVdNREI6CisJY2FzZSBSVE1fREVMTURCOgorCQlpZiAocHJlZml4X2Jhbm5lcikKKwkJCWZwcmludGYoZnAsICJbTURCXSIpOworCQlyZXR1cm4gcHJpbnRfbWRiKHdobywgbiwgYXJnKTsKKworCWNhc2UgTkxNU0dfVFNUQU1QOgorCQlwcmludF9ubG1zZ190aW1lc3RhbXAoZnAsIG4pOworCQlyZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworaW50IGRvX21vbml0b3IoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKmZpbGUgPSBOVUxMOworCXVuc2lnbmVkIGdyb3VwcyA9IH5SVE1HUlBfVEM7CisJaW50IGxsaW5rPTA7CisJaW50IGxuZWlnaD0wOworCWludCBsbWRiPTA7CisKKwlydG5sX2Nsb3NlKCZydGgpOworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChtYXRjaGVzKCphcmd2LCAiZmlsZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlmaWxlID0gKmFyZ3Y7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImxpbmsiKSA9PSAwKSB7CisJCQlsbGluaz0xOworCQkJZ3JvdXBzID0gMDsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiZmRiIikgPT0gMCkgeworCQkJbG5laWdoID0gMTsKKwkJCWdyb3VwcyA9IDA7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgIm1kYiIpID09IDApIHsKKwkJCWxtZGIgPSAxOworCQkJZ3JvdXBzID0gMDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJhbGwiKSA9PSAwKSB7CisJCQlncm91cHMgPSB+UlRNR1JQX1RDOworCQkJcHJlZml4X2Jhbm5lcj0xOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJdXNhZ2UoKTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQXJndW1lbnQgXCIlc1wiIGlzIHVua25vd24sIHRyeSBcImJyaWRnZSBtb25pdG9yIGhlbHBcIi5cbiIsICphcmd2KTsKKwkJCWV4aXQoLTEpOworCQl9CisJCWFyZ2MtLTsJYXJndisrOworCX0KKworCWlmIChsbGluaykKKwkJZ3JvdXBzIHw9IG5sX21ncnAoUlROTEdSUF9MSU5LKTsKKworCWlmIChsbmVpZ2gpIHsKKwkJZ3JvdXBzIHw9IG5sX21ncnAoUlROTEdSUF9ORUlHSCk7CisJfQorCisJaWYgKGxtZGIpIHsKKwkJZ3JvdXBzIHw9IG5sX21ncnAoUlROTEdSUF9NREIpOworCX0KKworCWlmIChmaWxlKSB7CisJCUZJTEUgKmZwOworCQlpbnQgZXJyOworCQlmcCA9IGZvcGVuKGZpbGUsICJyIik7CisJCWlmIChmcCA9PSBOVUxMKSB7CisJCQlwZXJyb3IoIkNhbm5vdCBmb3BlbiIpOworCQkJZXhpdCgtMSk7CisJCX0KKwkJZXJyID0gcnRubF9mcm9tX2ZpbGUoZnAsIGFjY2VwdF9tc2csIHN0ZG91dCk7CisJCWZjbG9zZShmcCk7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKHJ0bmxfb3BlbigmcnRoLCBncm91cHMpIDwgMCkKKwkJZXhpdCgxKTsKKwlsbF9pbml0X21hcCgmcnRoKTsKKworCWlmIChydG5sX2xpc3RlbigmcnRoLCBhY2NlcHRfbXNnLCBzdGRvdXQpIDwgMCkKKwkJZXhpdCgyKTsKKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9icmlkZ2Uvdmxhbi5jIGIvaXByb3V0ZTIvYnJpZGdlL3ZsYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzJmNTIzCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvYnJpZGdlL3ZsYW4uYwpAQCAtMCwwICsxLDI2MyBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2JyaWRnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJuZXRsaW5rLmgiCisjaW5jbHVkZSAiYnJfY29tbW9uLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKworc3RhdGljIHVuc2lnbmVkIGludCBmaWx0ZXJfaW5kZXg7CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogYnJpZGdlIHZsYW4geyBhZGQgfCBkZWwgfSB2aWQgVkxBTl9JRCBkZXYgREVWIFsgcHZpZF0gWyB1bnRhZ2dlZCBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBzZWxmIF0gWyBtYXN0ZXIgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgYnJpZGdlIHZsYW4geyBzaG93IH0gWyBkZXYgREVWIF1cbiIpOworCWV4aXQoLTEpOworfQorCitzdGF0aWMgaW50IHZsYW5fbW9kaWZ5KGludCBjbWQsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgbmxtc2doZHIgCW47CisJCXN0cnVjdCBpZmluZm9tc2cgCWlmbTsKKwkJY2hhciAgIAkJCWJ1ZlsxMDI0XTsKKwl9IHJlcTsKKwljaGFyICpkID0gTlVMTDsKKwlzaG9ydCB2aWQgPSAtMTsKKwlzaG9ydCB2aWRfZW5kID0gLTE7CisJc3RydWN0IHJ0YXR0ciAqYWZzcGVjOworCXN0cnVjdCBicmlkZ2Vfdmxhbl9pbmZvIHZpbmZvOworCXVuc2lnbmVkIHNob3J0IGZsYWdzID0gMDsKKworCW1lbXNldCgmdmluZm8sIDAsIHNpemVvZih2aW5mbykpOworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisKKwlyZXEubi5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBpZmluZm9tc2cpKTsKKwlyZXEubi5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1Q7CisJcmVxLm4ubmxtc2dfdHlwZSA9IGNtZDsKKwlyZXEuaWZtLmlmaV9mYW1pbHkgPSBQRl9CUklER0U7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgImRldiIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlkID0gKmFyZ3Y7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAidmlkIikgPT0gMCkgeworCQkJY2hhciAqcDsKKwkJCU5FWFRfQVJHKCk7CisJCQlwID0gc3RyY2hyKCphcmd2LCAnLScpOworCQkJaWYgKHApIHsKKwkJCQkqcCA9ICdcMCc7CisJCQkJcCsrOworCQkJCXZpZCA9IGF0b2koKmFyZ3YpOworCQkJCXZpZF9lbmQgPSBhdG9pKHApOworCQkJCXZpbmZvLmZsYWdzIHw9IEJSSURHRV9WTEFOX0lORk9fUkFOR0VfQkVHSU47CisJCQl9IGVsc2UgeworCQkJCXZpZCA9IGF0b2koKmFyZ3YpOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInNlbGYiKSA9PSAwKSB7CisJCQlmbGFncyB8PSBCUklER0VfRkxBR1NfU0VMRjsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJtYXN0ZXIiKSA9PSAwKSB7CisJCQlmbGFncyB8PSBCUklER0VfRkxBR1NfTUFTVEVSOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInB2aWQiKSA9PSAwKSB7CisJCQl2aW5mby5mbGFncyB8PSBCUklER0VfVkxBTl9JTkZPX1BWSUQ7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAidW50YWdnZWQiKSA9PSAwKSB7CisJCQl2aW5mby5mbGFncyB8PSBCUklER0VfVkxBTl9JTkZPX1VOVEFHR0VEOworCQl9IGVsc2UgeworCQkJaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJCU5FWFRfQVJHKCk7CisJCQl9CisJCX0KKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJaWYgKGQgPT0gTlVMTCB8fCB2aWQgPT0gLTEpIHsKKwkJZnByaW50ZihzdGRlcnIsICJEZXZpY2UgYW5kIFZMQU4gSUQgYXJlIHJlcXVpcmVkIGFyZ3VtZW50cy5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmVxLmlmbS5pZmlfaW5kZXggPSBsbF9uYW1lX3RvX2luZGV4KGQpOworCWlmIChyZXEuaWZtLmlmaV9pbmRleCA9PSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IGZpbmQgYnJpZGdlIGRldmljZSBcIiVzXCJcbiIsIGQpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHZpZCA+PSA0MDk2KSB7CisJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBWTEFOIElEIFwiJWh1XCJcbiIsIHZpZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAodmluZm8uZmxhZ3MgJiBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOKSB7CisJCWlmICh2aWRfZW5kID09IC0xIHx8IHZpZF9lbmQgPj0gNDA5NiB8fCB2aWQgPj0gdmlkX2VuZCkgeworCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIFZMQU4gcmFuZ2UgXCIlaHUtJWh1XCJcbiIsCisJCQkJdmlkLCB2aWRfZW5kKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAodmluZm8uZmxhZ3MgJiBCUklER0VfVkxBTl9JTkZPX1BWSUQpIHsKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJwdmlkIGNhbm5vdCBiZSBjb25maWd1cmVkIGZvciBhIHZsYW4gcmFuZ2VcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJYWZzcGVjID0gYWRkYXR0cl9uZXN0KCZyZXEubiwgc2l6ZW9mKHJlcSksIElGTEFfQUZfU1BFQyk7CisKKwlpZiAoZmxhZ3MpCisJCWFkZGF0dHIxNigmcmVxLm4sIHNpemVvZihyZXEpLCBJRkxBX0JSSURHRV9GTEFHUywgZmxhZ3MpOworCisJdmluZm8udmlkID0gdmlkOworCWlmICh2aWRfZW5kICE9IC0xKSB7CisJCS8qIHNlbmQgdmxhbiByYW5nZSBzdGFydCAqLworCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgSUZMQV9CUklER0VfVkxBTl9JTkZPLCAmdmluZm8sCisJCQkgIHNpemVvZih2aW5mbykpOworCQl2aW5mby5mbGFncyAmPSB+QlJJREdFX1ZMQU5fSU5GT19SQU5HRV9CRUdJTjsKKworCQkvKiBOb3cgc2VuZCB0aGUgdmxhbiByYW5nZSBlbmQgKi8KKwkJdmluZm8uZmxhZ3MgfD0gQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9FTkQ7CisJCXZpbmZvLnZpZCA9IHZpZF9lbmQ7CisJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBJRkxBX0JSSURHRV9WTEFOX0lORk8sICZ2aW5mbywKKwkJCSAgc2l6ZW9mKHZpbmZvKSk7CisJfSBlbHNlIHsKKwkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIElGTEFfQlJJREdFX1ZMQU5fSU5GTywgJnZpbmZvLAorCQkJICBzaXplb2YodmluZm8pKTsKKwl9CisKKwlhZGRhdHRyX25lc3RfZW5kKCZyZXEubiwgYWZzcGVjKTsKKworCWlmIChydG5sX3RhbGsoJnJ0aCwgJnJlcS5uLCBOVUxMLCAwKSA8IDApCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByaW50X3ZsYW4oY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8sCisJCSAgICAgIHN0cnVjdCBubG1zZ2hkciAqbiwKKwkJICAgICAgdm9pZCAqYXJnKQoreworCUZJTEUgKmZwID0gYXJnOworCXN0cnVjdCBpZmluZm9tc2cgKmlmbSA9IE5MTVNHX0RBVEEobik7CisJaW50IGxlbiA9IG4tPm5sbXNnX2xlbjsKKwlzdHJ1Y3QgcnRhdHRyICogdGJbSUZMQV9NQVgrMV07CisKKwlpZiAobi0+bmxtc2dfdHlwZSAhPSBSVE1fTkVXTElOSykgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vdCBSVE1fTkVXTElOSzogJTA4eCAlMDh4ICUwOHhcbiIsCisJCQluLT5ubG1zZ19sZW4sIG4tPm5sbXNnX3R5cGUsIG4tPm5sbXNnX2ZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbGVuIC09IE5MTVNHX0xFTkdUSChzaXplb2YoKmlmbSkpOworCWlmIChsZW4gPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQlVHOiB3cm9uZyBubG1zZyBsZW4gJWRcbiIsIGxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoaWZtLT5pZmlfZmFtaWx5ICE9IEFGX0JSSURHRSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZmlsdGVyX2luZGV4ICYmIGZpbHRlcl9pbmRleCAhPSBpZm0tPmlmaV9pbmRleCkKKwkJcmV0dXJuIDA7CisKKwlwYXJzZV9ydGF0dHIodGIsIElGTEFfTUFYLCBJRkxBX1JUQShpZm0pLCBsZW4pOworCisJLyogaWYgQUZfU1BFQyBpc24ndCB0aGVyZSwgdmxhbiB0YWJsZSBpcyBub3QgcHJlc2V0IGZvciB0aGlzIHBvcnQgKi8KKwlpZiAoIXRiW0lGTEFfQUZfU1BFQ10pIHsKKwkJZnByaW50ZihmcCwgIiVzXHROb25lXG4iLCBsbF9pbmRleF90b19uYW1lKGlmbS0+aWZpX2luZGV4KSk7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXN0cnVjdCBydGF0dHIgKmksICpsaXN0ID0gdGJbSUZMQV9BRl9TUEVDXTsKKwkJaW50IHJlbSA9IFJUQV9QQVlMT0FEKGxpc3QpOworCisJCWZwcmludGYoZnAsICIlcyIsIGxsX2luZGV4X3RvX25hbWUoaWZtLT5pZmlfaW5kZXgpKTsKKwkJZm9yIChpID0gUlRBX0RBVEEobGlzdCk7IFJUQV9PSyhpLCByZW0pOyBpID0gUlRBX05FWFQoaSwgcmVtKSkgeworCQkJc3RydWN0IGJyaWRnZV92bGFuX2luZm8gKnZpbmZvOworCisJCQlpZiAoaS0+cnRhX3R5cGUgIT0gSUZMQV9CUklER0VfVkxBTl9JTkZPKQorCQkJCWNvbnRpbnVlOworCisJCQl2aW5mbyA9IFJUQV9EQVRBKGkpOworCQkJaWYgKHZpbmZvLT5mbGFncyAmIEJSSURHRV9WTEFOX0lORk9fUkFOR0VfRU5EKQorCQkJCWZwcmludGYoZnAsICItJWh1IiwgdmluZm8tPnZpZCk7CisJCQllbHNlCisJCQkJZnByaW50ZihmcCwgIlx0ICVodSIsIHZpbmZvLT52aWQpOworCQkJaWYgKHZpbmZvLT5mbGFncyAmIEJSSURHRV9WTEFOX0lORk9fUkFOR0VfQkVHSU4pCisJCQkJY29udGludWU7CisJCQlpZiAodmluZm8tPmZsYWdzICYgQlJJREdFX1ZMQU5fSU5GT19QVklEKQorCQkJCWZwcmludGYoZnAsICIgUFZJRCIpOworCQkJaWYgKHZpbmZvLT5mbGFncyAmIEJSSURHRV9WTEFOX0lORk9fVU5UQUdHRUQpCisJCQkJZnByaW50ZihmcCwgIiBFZ3Jlc3MgVW50YWdnZWQiKTsKKwkJCWZwcmludGYoZnAsICJcbiIpOworCQl9CisJfQorCWZwcmludGYoZnAsICJcbiIpOworCWZmbHVzaChmcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmxhbl9zaG93KGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpmaWx0ZXJfZGV2ID0gTlVMTDsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAoc3RyY21wKCphcmd2LCAiZGV2IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChmaWx0ZXJfZGV2KQorCQkJCWR1cGFyZygiZGV2IiwgKmFyZ3YpOworCQkJZmlsdGVyX2RldiA9ICphcmd2OworCQl9CisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCWlmIChmaWx0ZXJfZGV2KSB7CisJCWlmICgoZmlsdGVyX2luZGV4ID0gaWZfbmFtZXRvaW5kZXgoZmlsdGVyX2RldikpID09IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IGZpbmQgZGV2aWNlIFwiJXNcIlxuIiwKKwkJCSAgICAgICBmaWx0ZXJfZGV2KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWlmIChydG5sX3dpbGRkdW1wX3JlcV9maWx0ZXIoJnJ0aCwgUEZfQlJJREdFLCBSVE1fR0VUTElOSywKKwkJCQkgICAgKGNvbXByZXNzX3ZsYW5zID8KKwkJCQkgICAgUlRFWFRfRklMVEVSX0JSVkxBTl9DT01QUkVTU0VEIDoKKwkJCQkgICAgUlRFWFRfRklMVEVSX0JSVkxBTikpIDwgMCkgeworCQlwZXJyb3IoIkNhbm5vbnQgc2VuZCBkdW1wIHJlcXVlc3QiKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlwcmludGYoInBvcnRcdHZsYW4gaWRzXG4iKTsKKwlpZiAocnRubF9kdW1wX2ZpbHRlcigmcnRoLCBwcmludF92bGFuLCBzdGRvdXQpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkR1bXAgdGVybm1pbmF0ZWRcbiIpOworCQlleGl0KDEpOworCX0KKworCXJldHVybiAwOworfQorCisKK2ludCBkb192bGFuKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlsbF9pbml0X21hcCgmcnRoKTsKKworCWlmIChhcmdjID4gMCkgeworCQlpZiAobWF0Y2hlcygqYXJndiwgImFkZCIpID09IDApCisJCQlyZXR1cm4gdmxhbl9tb2RpZnkoUlRNX1NFVExJTkssIGFyZ2MtMSwgYXJndisxKTsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJkZWxldGUiKSA9PSAwKQorCQkJcmV0dXJuIHZsYW5fbW9kaWZ5KFJUTV9ERUxMSU5LLCBhcmdjLTEsIGFyZ3YrMSk7CisJCWlmIChtYXRjaGVzKCphcmd2LCAic2hvdyIpID09IDAgfHwKKwkJICAgIG1hdGNoZXMoKmFyZ3YsICJsc3QiKSA9PSAwIHx8CisJCSAgICBtYXRjaGVzKCphcmd2LCAibGlzdCIpID09IDApCisJCQlyZXR1cm4gdmxhbl9zaG93KGFyZ2MtMSwgYXJndisxKTsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkKKwkJCXVzYWdlKCk7CisJfSBlbHNlCisJCXJldHVybiB2bGFuX3Nob3coMCwgTlVMTCk7CisKKwlmcHJpbnRmKHN0ZGVyciwgIkNvbW1hbmQgXCIlc1wiIGlzIHVua25vd24sIHRyeSBcImJyaWRnZSBmZGIgaGVscFwiLlxuIiwgKmFyZ3YpOworCWV4aXQoLTEpOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvY29uZmlndXJlIGIvaXByb3V0ZTIvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQyNTQwYjAKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9jb25maWd1cmUKQEAgLTAsMCArMSwzNTkgQEAKKyMhIC9iaW4vYmFzaAorIyBUaGlzIGlzIG5vdCBhbiBhdXRvY29uZiBnZW5lcmF0ZWQgY29uZmlndXJlCisjCitJTkNMVURFPSR7MTotIiRQV0QvaW5jbHVkZSJ9CisKKyMgTWFrZSBhIHRlbXAgZGlyZWN0b3J5IGluIGJ1aWxkIHRyZWUuCitUTVBESVI9JChta3RlbXAgLWQgY29uZmlnLlhYWFhYWCkKK3RyYXAgJ3N0YXR1cz0kPzsgcm0gLXJmICRUTVBESVI7IGV4aXQgJHN0YXR1cycgRVhJVCBIVVAgSU5UIFFVSVQgVEVSTQorCitjaGVja19wcm9nKCkKK3sKKyAgICBlY2hvIC1uICIkMiIKKyAgICBjb21tYW5kIC12ICQxID4vZGV2L251bGwgMj4mMSAmJiAoZWNobyAiJDM6PXkiID4+IENvbmZpZzsgZWNobyAieWVzIikgfHwgKGVjaG8gIm5vIjsgcmV0dXJuIDEpCit9CisKK2NoZWNrX2RvY3MoKQoreworICAgIGlmIGNoZWNrX3Byb2cgbGF0ZXggIiBsYXRleDogIiBIQVZFX0xBVEVYOyB0aGVuCisgICAgICAgIGNoZWNrX3Byb2cgcGRmbGF0ZXggIiBwZGZsYXRleDogIiBIQVZFX1BERkxBVEVYIHx8IGVjaG8gIiBXQVJOSU5HOiBubyBQREYgZG9jcyBjYW4gYmUgYnVpbHQgZnJvbSBMYVRlWCBmaWxlcyIKKyAgICAgICAgY2hlY2tfcHJvZyBzZ21sMmxhdGV4ICIgc2dtbDJsYXRleDogIiBIQVZFX1NHTUwyTEFURVggfHwgZWNobyAiIFdBUk5JTkc6IG5vIExhVGVYIGZpbGVzIGNhbiBiZSBidWlsZCBmcm9tIFNHTUwgZmlsZXMiCisgICAgZWxzZQorICAgICAgICBlY2hvICIgV0FSTklORzogbm8gZG9jcyBjYW4gYmUgYnVpbHQgZnJvbSBMYVRlWCBmaWxlcyIKKyAgICBmaQorCisgICAgY2hlY2tfcHJvZyBzZ21sMmh0bWwgIiBzZ21sMmh0bWw6ICIgSEFWRV9TR01MMkhUTUwgfHwgZWNobyAiIFdBUk5JTkc6IG5vIEhUTUwgZG9jcyBjYW4gYmUgYnVpbHQgZnJvbSBTR01MIgorfQorCitjaGVja190b29sY2hhaW4oKQoreworICAgIDogJHtQS0dfQ09ORklHOj1wa2ctY29uZmlnfQorICAgIDogJHtBUj1hcn0KKyAgICA6ICR7Q0M9Z2NjfQorICAgIGVjaG8gIlBLR19DT05GSUc6PSR7UEtHX0NPTkZJR30iID4+Q29uZmlnCisgICAgZWNobyAiQVI6PSR7QVJ9IiA+PkNvbmZpZworICAgIGVjaG8gIkNDOj0ke0NDfSIgPj5Db25maWcKK30KKworY2hlY2tfYXRtKCkKK3sKKyAgICBjYXQgPiRUTVBESVIvYXRtdGVzdC5jIDw8RU9GCisjaW5jbHVkZSA8YXRtLmg+CitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKwlzdHJ1Y3QgYXRtX3FvcyBxb3M7CisJKHZvaWQpIHRleHQycW9zKCJhYWw1LHVicjpzZHU9OTE4MCxyeDpub25lIiwmcW9zLDApOworCXJldHVybiAwOworfQorRU9GCisKKyAgICAkQ0MgLUkkSU5DTFVERSAtbyAkVE1QRElSL2F0bXRlc3QgJFRNUERJUi9hdG10ZXN0LmMgLWxhdG0gPi9kZXYvbnVsbCAyPiYxCisgICAgaWYgWyAkPyAtZXEgMCBdCisgICAgdGhlbgorCWVjaG8gIlRDX0NPTkZJR19BVE06PXkiID4+Q29uZmlnCisJZWNobyB5ZXMKKyAgICBlbHNlCisJZWNobyBubworICAgIGZpCisgICAgcm0gLWYgJFRNUERJUi9hdG10ZXN0LmMgJFRNUERJUi9hdG10ZXN0Cit9CisKK2NoZWNrX3h0KCkKK3sKKyAgICAjY2hlY2sgaWYgd2UgaGF2ZSB4dGFibGVzIGZyb20gaXB0YWJsZXMgPj0gMS40LjUuCisgICAgY2F0ID4kVE1QRElSL2lwdHRlc3QuYyA8PEVPRgorI2luY2x1ZGUgPHh0YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KK3N0YXRpYyBzdHJ1Y3QgeHRhYmxlc19nbG9iYWxzIHRlc3RfZ2xvYmFscyA9IHsKKwkub3B0aW9uX29mZnNldCA9IDAsCisJLnByb2dyYW1fbmFtZSA9ICJ0Yy1pcHQiLAorCS5wcm9ncmFtX3ZlcnNpb24gPSBYVEFCTEVTX1ZFUlNJT04sCisJLm9yaWdfb3B0cyA9IE5VTEwsCisJLm9wdHMgPSBOVUxMLAorCS5leGl0X2VyciA9IE5VTEwsCit9OworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJeHRhYmxlc19pbml0X2FsbCgmdGVzdF9nbG9iYWxzLCBORlBST1RPX0lQVjQpOworCXJldHVybiAwOworfQorRU9GCisKKyAgICBpZiAkQ0MgLUkkSU5DTFVERSAkSVBUQyAtbyAkVE1QRElSL2lwdHRlc3QgJFRNUERJUi9pcHR0ZXN0LmMgJElQVEwgXAorCSQoJHtQS0dfQ09ORklHfSB4dGFibGVzIC0tY2ZsYWdzIC0tbGlicykgLWxkbCA+L2Rldi9udWxsIDI+JjEKKyAgICB0aGVuCisJZWNobyAiVENfQ09ORklHX1hUOj15IiA+PkNvbmZpZworCWVjaG8gInVzaW5nIHh0YWJsZXMiCisgICAgZmkKKyAgICBybSAtZiAkVE1QRElSL2lwdHRlc3QuYyAkVE1QRElSL2lwdHRlc3QKK30KKworY2hlY2tfeHRfb2xkKCkKK3sKKyAgICAjIGJhaWwgaWYgcHJldmlvdXMgWFQgY2hlY2tzIGhhcyBhbHJlYWR5IHN1Y2NlZGVkLgorICAgIGlmIGdyZXAgLXEgVENfQ09ORklHX1hUIENvbmZpZworICAgIHRoZW4KKwlyZXR1cm4KKyAgICBmaQorCisgICAgI2NoZWNrIGlmIHdlIGRvbnQgbmVlZCBvdXIgaW50ZXJuYWwgaGVhZGVyIC4uCisgICAgY2F0ID4kVE1QRElSL2lwdHRlc3QuYyA8PEVPRgorI2luY2x1ZGUgPHh0YWJsZXMuaD4KK2NoYXIgKmxpYl9kaXI7Cit1bnNpZ25lZCBpbnQgZ2xvYmFsX29wdGlvbl9vZmZzZXQgPSAwOworY29uc3QgY2hhciAqcHJvZ3JhbV92ZXJzaW9uID0gWFRBQkxFU19WRVJTSU9OOworY29uc3QgY2hhciAqcHJvZ3JhbV9uYW1lID0gInRjLWlwdCI7CitzdHJ1Y3QgYWZpbmZvIGFmaW5mbyA9IHsKKwkubGlicHJlZml4ICAgICAgPSAibGlieHRfIiwKK307CisKK3ZvaWQgZXhpdF9lcnJvcihlbnVtIGV4aXR0eXBlIHN0YXR1cywgY29uc3QgY2hhciAqbXNnLCAuLi4pCit7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworCisJcmV0dXJuIDA7Cit9CisKK0VPRgorCisgICAgJENDIC1JJElOQ0xVREUgJElQVEMgLW8gJFRNUERJUi9pcHR0ZXN0ICRUTVBESVIvaXB0dGVzdC5jICRJUFRMIC1sZGwgPi9kZXYvbnVsbCAyPiYxCisgICAgaWYgWyAkPyAtZXEgMCBdCisgICAgdGhlbgorCWVjaG8gIlRDX0NPTkZJR19YVF9PTEQ6PXkiID4+Q29uZmlnCisJZWNobyAidXNpbmcgb2xkIHh0YWJsZXMgKG5vIG5lZWQgZm9yIHh0LWludGVybmFsLmgpIgorICAgIGZpCisgICAgcm0gLWYgJFRNUERJUi9pcHR0ZXN0LmMgJFRNUERJUi9pcHR0ZXN0Cit9CisKK2NoZWNrX3h0X29sZF9pbnRlcm5hbF9oKCkKK3sKKyAgICAjIGJhaWwgaWYgcHJldmlvdXMgWFQgY2hlY2tzIGhhcyBhbHJlYWR5IHN1Y2NlZGVkLgorICAgIGlmIGdyZXAgLXEgVENfQ09ORklHX1hUIENvbmZpZworICAgIHRoZW4KKwlyZXR1cm4KKyAgICBmaQorCisgICAgI2NoZWNrIGlmIHdlIG5lZWQgb3VyIG93biBpbnRlcm5hbC5oCisgICAgY2F0ID4kVE1QRElSL2lwdHRlc3QuYyA8PEVPRgorI2luY2x1ZGUgPHh0YWJsZXMuaD4KKyNpbmNsdWRlICJ4dC1pbnRlcm5hbC5oIgorY2hhciAqbGliX2RpcjsKK3Vuc2lnbmVkIGludCBnbG9iYWxfb3B0aW9uX29mZnNldCA9IDA7Citjb25zdCBjaGFyICpwcm9ncmFtX3ZlcnNpb24gPSBYVEFCTEVTX1ZFUlNJT047Citjb25zdCBjaGFyICpwcm9ncmFtX25hbWUgPSAidGMtaXB0IjsKK3N0cnVjdCBhZmluZm8gYWZpbmZvID0geworCS5saWJwcmVmaXggICAgICA9ICJsaWJ4dF8iLAorfTsKKwordm9pZCBleGl0X2Vycm9yKGVudW0gZXhpdHR5cGUgc3RhdHVzLCBjb25zdCBjaGFyICptc2csIC4uLikKK3sKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisKKwlyZXR1cm4gMDsKK30KKworRU9GCisJJENDIC1JJElOQ0xVREUgJElQVEMgLW8gJFRNUERJUi9pcHR0ZXN0ICRUTVBESVIvaXB0dGVzdC5jICRJUFRMIC1sZGwgPi9kZXYvbnVsbCAyPiYxCisKKwlpZiBbICQ/IC1lcSAwIF0KKwl0aGVuCisJICAgIGVjaG8gInVzaW5nIG9sZCB4dGFibGVzIHdpdGggeHQtaW50ZXJuYWwuaCIKKwkgICAgZWNobyAiVENfQ09ORklHX1hUX09MRF9IOj15IiA+PkNvbmZpZworCWZpCisJcm0gLWYgJFRNUERJUi9pcHR0ZXN0LmMgJFRNUERJUi9pcHR0ZXN0Cit9CisKK2NoZWNrX2lwdCgpCit7CisJaWYgISBncmVwIFRDX0NPTkZJR19YVCBDb25maWcgPiAvZGV2L251bGwKKwl0aGVuCisJCWVjaG8gInVzaW5nIGlwdGFibGVzIgorCWZpCit9CisKK2NoZWNrX2lwdF9saWJfZGlyKCkKK3sKKwlJUFRfTElCX0RJUj0kKCR7UEtHX0NPTkZJR30gLS12YXJpYWJsZT14dGxpYmRpciB4dGFibGVzKQorCWlmIFsgLW4gIiRJUFRfTElCX0RJUiIgXTsgdGhlbgorCQllY2hvICRJUFRfTElCX0RJUgorCQllY2hvICJJUFRfTElCX0RJUjo9JElQVF9MSUJfRElSIiA+PiBDb25maWcKKwkJcmV0dXJuCisJZmkKKworCWZvciBkaXIgaW4gL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYgorCWRvCisJCWZvciBmaWxlIGluICRkaXIve3h0YWJsZXMsaXB0YWJsZXN9L2xpYip0XypzbyA7IGRvCisJCQlpZiBbIC1mICRmaWxlIF07IHRoZW4KKwkJCQllY2hvICR7ZmlsZSUvKn0KKwkJCQllY2hvICJJUFRfTElCX0RJUjo9JHtmaWxlJS8qfSIgPj4gQ29uZmlnCisJCQkJcmV0dXJuCisJCQlmaQorCQlkb25lCisJZG9uZQorCWVjaG8gIm5vdCBmb3VuZCEiCit9CisKK2NoZWNrX3NldG5zKCkKK3sKKyAgICBjYXQgPiRUTVBESVIvc2V0bnN0ZXN0LmMgPDxFT0YKKyNpbmNsdWRlIDxzY2hlZC5oPgoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCSh2b2lkKXNldG5zKDAsMCk7CisJcmV0dXJuIDA7Cit9CitFT0YKKyAgICAkQ0MgLUkkSU5DTFVERSAtbyAkVE1QRElSL3NldG5zdGVzdCAkVE1QRElSL3NldG5zdGVzdC5jID4vZGV2L251bGwgMj4mMQorICAgIGlmIFsgJD8gLWVxIDAgXQorICAgIHRoZW4KKwllY2hvICJJUF9DT05GSUdfU0VUTlM6PXkiID4+Q29uZmlnCisJZWNobyAieWVzIgorICAgIGVsc2UKKwllY2hvICJubyIKKyAgICBmaQorICAgIHJtIC1mICRUTVBESVIvc2V0bnN0ZXN0LmMgJFRNUERJUi9zZXRuc3Rlc3QKK30KKworY2hlY2tfaXBzZXQoKQoreworICAgIGNhdCA+JFRNUERJUi9pcHNldHRlc3QuYyA8PEVPRgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9pcHNldC9pcF9zZXQuaD4KKyNpZm5kZWYgSVBfU0VUX0lOVkFMSUQKKyNkZWZpbmUgSVBTRVRfRElNX01BWCAzCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGlwX3NldF9pZF90OworI2VuZGlmCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3NldC5oPgorCitzdHJ1Y3QgeHRfc2V0X2luZm8gaW5mbzsKKyNpZiBJUFNFVF9QUk9UT0NPTCA9PSA2CitpbnQgbWFpbih2b2lkKQoreworCXJldHVybiBJUFNFVF9NQVhOQU1FTEVOOworfQorI2Vsc2UKKyNlcnJvciB1bmtub3duIGlwc2V0IHZlcnNpb24KKyNlbmRpZgorRU9GCisKKyAgICBpZiAkQ0MgLUkkSU5DTFVERSAtbyAkVE1QRElSL2lwc2V0dGVzdCAkVE1QRElSL2lwc2V0dGVzdC5jID4vZGV2L251bGwgMj4mMQorICAgIHRoZW4KKwllY2hvICJUQ19DT05GSUdfSVBTRVQ6PXkiID4+Q29uZmlnCisJZWNobyAieWVzIgorICAgIGVsc2UKKwllY2hvICJubyIKKyAgICBmaQorICAgIHJtIC1mICRUTVBESVIvaXBzZXR0ZXN0LmMgJFRNUERJUi9pcHNldHRlc3QKK30KKworY2hlY2tfZWxmKCkKK3sKKyAgICBjYXQgPiRUTVBESVIvZWxmdGVzdC5jIDw8RU9GCisjaW5jbHVkZSA8bGliZWxmLmg+CisjaW5jbHVkZSA8Z2VsZi5oPgoraW50IG1haW4odm9pZCkKK3sKKwlFbGZfU2NuICpzY247CisJR0VsZl9TaGRyIHNoZHI7CisJcmV0dXJuIGVsZl92ZXJzaW9uKEVWX0NVUlJFTlQpOworfQorRU9GCisKKyAgICBpZiAkQ0MgLUkkSU5DTFVERSAtbyAkVE1QRElSL2VsZnRlc3QgJFRNUERJUi9lbGZ0ZXN0LmMgLWxlbGYgPi9kZXYvbnVsbCAyPiYxCisgICAgdGhlbgorCWVjaG8gIlRDX0NPTkZJR19FTEY6PXkiID4+Q29uZmlnCisJZWNobyAieWVzIgorICAgIGVsc2UKKwllY2hvICJubyIKKyAgICBmaQorICAgIHJtIC1mICRUTVBESVIvZWxmdGVzdC5jICRUTVBESVIvZWxmdGVzdAorfQorCitjaGVja19zZWxpbnV4KCkKKyMgU0VMaW51eCBpcyBhIGNvbXBpbGUgdGltZSBvcHRpb24gaW4gdGhlIHNzIHV0aWxpdHkKK3sKKwlpZiAke1BLR19DT05GSUd9IGxpYnNlbGludXggLS1leGlzdHMKKwl0aGVuCisJCWVjaG8gIkhBVkVfU0VMSU5VWDo9eSIgPj5Db25maWcKKwkJZWNobyAieWVzIgorCWVsc2UKKwkJZWNobyAibm8iCisJZmkKK30KKworY2hlY2tfbW5sKCkKK3sKKwlpZiAke1BLR19DT05GSUd9IGxpYm1ubCAtLWV4aXN0cworCXRoZW4KKwkJZWNobyAiSEFWRV9NTkw6PXkiID4+Q29uZmlnCisJCWVjaG8gInllcyIKKwllbHNlCisJCWVjaG8gIm5vIgorCWZpCit9CisKK2NoZWNrX2JlcmtlbGV5X2RiKCkKK3sKKyAgICBjYXQgPiRUTVBESVIvZGJ0ZXN0LmMgPDxFT0YKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGRiXzE4NS5oPgoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisJZGJvcGVuKCIvdG1wL3h4eF90ZXN0X2RiLmRiIiwgT19DUkVBVHxPX1JEV1IsIDA2NDQsIERCX0hBU0gsIE5VTEwpOworCXJldHVybiAwOworfQorRU9GCisgICAgJENDIC1JJElOQ0xVREUgLW8gJFRNUERJUi9kYnRlc3QgJFRNUERJUi9kYnRlc3QuYyAtbGRiID4vZGV2L251bGwgMj4mMQorICAgIGlmIFsgJD8gLWVxIDAgXQorICAgIHRoZW4KKwllY2hvICJIQVZFX0JFUktFTEVZX0RCOj15IiA+PkNvbmZpZworCWVjaG8gInllcyIKKyAgICBlbHNlCisJZWNobyAibm8iCisgICAgZmkKKyAgICBybSAtZiAkVE1QRElSL2RidGVzdC5jICRUTVBESVIvZGJ0ZXN0Cit9CisKK2VjaG8gIiMgR2VuZXJhdGVkIGNvbmZpZyBiYXNlZCBvbiIgJElOQ0xVREUgPkNvbmZpZworY2hlY2tfdG9vbGNoYWluCisKK2VjaG8gIlRDIHNjaGVkdWxlcnMiCisKK2VjaG8gLW4gIiBBVE0JIgorY2hlY2tfYXRtCisKK2VjaG8gLW4gIiBJUFQJIgorY2hlY2tfeHQKK2NoZWNrX3h0X29sZAorY2hlY2tfeHRfb2xkX2ludGVybmFsX2gKK2NoZWNrX2lwdAorCitlY2hvIC1uICIgSVBTRVQgICIKK2NoZWNrX2lwc2V0CisKK2VjaG8KK2VjaG8gLW4gImlwdGFibGVzIG1vZHVsZXMgZGlyZWN0b3J5OiAiCitjaGVja19pcHRfbGliX2RpcgorCitlY2hvIC1uICJsaWJjIGhhcyBzZXRuczogIgorY2hlY2tfc2V0bnMKKworZWNobyAtbiAiU0VMaW51eCBzdXBwb3J0OiAiCitjaGVja19zZWxpbnV4CisKK2VjaG8gLW4gIkVMRiBzdXBwb3J0OiAiCitjaGVja19lbGYKKworZWNobyAtbiAibGlibW5sIHN1cHBvcnQ6ICIKK2NoZWNrX21ubAorCitlY2hvIC1uICJCZXJrZWxleSBEQjogIgorY2hlY2tfYmVya2VsZXlfZGIKKworZWNobworZWNobyAtbiAiZG9jczoiCitjaGVja19kb2NzCitlY2hvCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9kb2MvTWFrZWZpbGUgYi9pcHJvdXRlMi9kb2MvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTljMGZmNwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2RvYy9NYWtlZmlsZQpAQCAtMCwwICsxLDczIEBACitQU0ZJTEVTPWlwLWNyZWYucHMgaXAtdHVubmVscy5wcyBhcGktaXA2LWZsb3dsYWJlbHMucHMgc3MucHMgbnN0YXQucHMgYXJwZC5wcyBydHN0YXQucHMKKyMgdGMtY3JlZi5wcworIyBhcGktcnRubC50ZXggYXBpLXBtdHVkaXNjLnRleCBhcGktbmV3cy50ZXgKKyMgaWtpLW5ldGRldi5wcyBpa2ktbmVpZ2hkc3QucHMKKworCitMQVRFWD1sYXRleAorRFZJUFM9ZHZpcHMKK1NHTUwyRFZJPXNnbWwybGF0ZXgKK1NHTUwySFRNTD1zZ21sMmh0bWwgLXMgMAorTFBSPWxwciAtWnNkdXBsZXgKK1NIRUxMPWJhc2gKK1BBR0VTSVpFPWE0CitQQUdFU1BFUlBBR0U9MgorCitIVE1MRklMRVM9JChzdWJzdCAuc2dtbCwuaHRtbCwkKHNoZWxsIGVjaG8gKi5zZ21sKSkKK0RWSUZJTEVTPSQoc3Vic3QgLnBzLC5kdmksJChQU0ZJTEVTKSkKK1BERkZJTEVTPSQoc3Vic3QgLnBzLC5wZGYsJChQU0ZJTEVTKSkKKworCithbGw6IHBzdHdvY29sCisKK3BzdHdvY29sOiAkKFBTRklMRVMpCisKK2h0bWw6ICQoSFRNTEZJTEVTKQorCitkdmk6ICQoRFZJRklMRVMpCisKK3BkZjogJChQREZGSUxFUykKKworcHJpbnQ6ICQoUFNGSUxFUykKKwkkKExQUikgJChQU0ZJTEVTKQorCislLnRleDogJS5zZ21sCisJJChTR01MMkRWSSkgLS1vdXRwdXQ9dGV4ICQ8CisKKyUuZHZpOiAlLnNnbWwKKwkkKFNHTUwyRFZJKSAtLW91dHB1dD1kdmkgJDwKKworJS5kdmk6ICUudGV4CisJQHNldCAtZTsgcGFzcz0yOyBlY2hvICJSdW5uaW5nIExhVGVYICQ8IjsgXAorCXdoaWxlIFsgYCQoTEFURVgpICQ8IDwvZGV2L251bGwgMj4mMSB8IFwKKwkJIGdyZXAgLWMgJ15cKExhVGVYIFdhcm5pbmc6IExhYmVsKHMpIG1heVx8Tm8gZmlsZSBcfCEgRW1lcmdlbmN5IHN0b3BcKSdgIC1nZSAxIF07IGRvIFwKKwkJaWYgWyAkJHBhc3MgLWd0IDMgXTsgdGhlbiBcCisJCQllY2hvICJTZWVtcywgc29tZXRoaW5nIGlzIHdyb25nLiBUcnkgYnkgaGFuZHMuIiA7IGV4aXQgMSA7IFwKKwkJZmk7IFwKKwkJZWNobyAiUmUtcnVubmluZyBMYVRlWCAkPCwgJCR7cGFzc31kIHBhc3MiOyBwYXNzPSQkWyQkcGFzcyArIDFdOyBcCisJZG9uZQorCislLnBkZjogJS50ZXgKKwlAc2V0IC1lOyBwYXNzPTI7IGVjaG8gIlJ1bm5pbmcgcGRmTGFUZVggJDwiOyBcCisJd2hpbGUgWyBgcGRmbGF0ZXggJDwgPC9kZXYvbnVsbCAyPiYxIHwgXAorCQkgZ3JlcCAtYyAnXlwoTGFUZVggV2FybmluZzogTGFiZWwocykgbWF5XHxObyBmaWxlIFx8ISBFbWVyZ2VuY3kgc3RvcFwpJ2AgLWdlIDEgXTsgZG8gXAorCQlpZiBbICQkcGFzcyAtZ3QgMyBdOyB0aGVuIFwKKwkJCWVjaG8gIlNlZW1zLCBzb21ldGhpbmcgaXMgd3JvbmcuIFRyeSBieSBoYW5kcy4iIDsgZXhpdCAxIDsgXAorCQlmaTsgXAorCQllY2hvICJSZS1ydW5uaW5nIHBkZkxhVGVYICQ8LCAkJHtwYXNzfWQgcGFzcyI7IHBhc3M9JCRbJCRwYXNzICsgMV07IFwKKwlkb25lCisjJS5wZGY6ICUucHMKKyMJcHMycGRmICQ8CisKKyUucHM6ICUuZHZpCisJJChEVklQUykgJDwgLW8gJEAKKworJS5odG1sOiAlLnNnbWwKKwkkKFNHTUwySFRNTCkgJDwKKworaW5zdGFsbDoKKwlpbnN0YWxsIC1tIDA2NDQgJChzaGVsbCBlY2hvICoudGV4KSAkKERFU1RESVIpJChET0NESVIpCisJaW5zdGFsbCAtbSAwNjQ0ICQoc2hlbGwgZWNobyAqLnNnbWwpICQoREVTVERJUikkKERPQ0RJUikKKworY2xlYW46CisJcm0gLWYgKi5hdXggKi5sb2cgKi50b2MgJChQU0ZJTEVTKSAkKERWSUZJTEVTKSAqLmh0bWwgKi5wZGYKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2RvYy9QbGFuIGIvaXByb3V0ZTIvZG9jL1BsYW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVmNDc4ZQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2RvYy9QbGFuCkBAIC0wLDAgKzEsMTYgQEAKK1BhcnRpYWxseSBmaW5pc2hlZCB3b3JrLgorCisxLiAgVXNlciBSZWZlcmVuY2UgbWFudWFscy4KKzEuMSBJUCBDb21tYW5kIHJlZmVyZW5jZSAoaXAtY3JlZi50ZXgsIHB1Ymxpc2hlZCkKKzEuMiBUQyBDb21tYW5kIHJlZmVyZW5jZSAodGMtY3JlZi50ZXgpCisxLjMgSVAgdHVubmVscyAoaXAtdHVubmVscy50ZXgsIHB1Ymxpc2hlZCkKKworMi4gIExpbnV4LTIuMiBOZXR3b3JraW5nIEFQSQorMi4xIFJUTkVUTElOSyAoYXBpLXJ0bmwudGV4KQorMi4yIFBhdGggTVRVIERpc2NvdmVyeSAoYXBpLXBtdHVkaXNjLnRleCkKKzIuMyBJUHY2IEZsb3cgTGFiZWxzIChhcGktaXA2LWZsb3dsYWJlbHMudGV4LCBwdWJsaXNoZWQpCisyLjQgTWlzY2VsbGFuZW91cyBleHRlbnNpb25zIChhcGktbWlzYy50ZXgpCisKKzMuICBMaW51eC0yLjIgTmV0d29ya2luZyBJbnRyYS1LZXJuZWwgSW50ZXJmYWNlcworMy4xIE5ldERldiAtLS0gTmV0d29ya2luZyBEZXZpY2VzIGFuZCBuZXRkZXYuLi4gKGlraS1uZXRkZXYudGV4KQorMy4yIE5laWdoYm91ciBjYWNoZSBhbmQgZGVzdGluYXRpb24gY2FjaGUuIChpa2ktbmVpZ2hkc3QudGV4KQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvZG9jL1NOQVBTSE9ULnRleCBiL2lwcm91dGUyL2RvYy9TTkFQU0hPVC50ZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VkMDI5OAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2RvYy9TTkFQU0hPVC50ZXgKQEAgLTAsMCArMSBAQAorXGRlZlxEcmFmdHswMjAxMTZ9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9kb2MvYWN0aW9ucy9hY3Rpb25zLWdlbmVyYWwgYi9pcHJvdXRlMi9kb2MvYWN0aW9ucy9hY3Rpb25zLWdlbmVyYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBmN2NkNgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2RvYy9hY3Rpb25zL2FjdGlvbnMtZ2VuZXJhbApAQCAtMCwwICsxLDI1NyBAQAorCitUaGlzIGRvY3VtZW50ZWQgaXMgc2xpZ2h0bHkgZGF0ZWQgYnV0IHNob3VsZCBnaXZlIHlvdSBpZGVhIG9mIGhvdyB0aGluZ3MKK3dvcmsuCisKK1doYXQgaXMgaXQ/CistLS0tLS0tLS0tLQorCitBbiBleHRlbnNpb24gdG8gdGhlIGZpbHRlcmluZy9jbGFzc2lmaWNhdGlvbiBhcmNoaXRlY3R1cmUgb2YgTGludXggVHJhZmZpYworQ29udHJvbC4gCitVcCB0byAyLjYuOCB0aGUgb25seSBhY3Rpb24gdGhhdCBjb3VsZCBiZSAiYXR0YWNoZWQiIHRvIGEgZmlsdGVyIHdhcyBwb2xpY2luZy4gCitpLmUgeW91IGNvdWxkIHNheSBzb21ldGhpbmcgbGlrZToKKworLS0tLS0KK3RjIGZpbHRlciBhZGQgZGV2IGxvIHBhcmVudCBmZmZmOiBwcm90b2NvbCBpcCBwcmlvIDEwIHUzMiBtYXRjaCBpcCBzcmMgXAorMTI3LjAuMC4xLzMyIGZsb3dpZCAxOjEgcG9saWNlIG10dSA0MDAwIHJhdGUgMTUwMGtiaXQgYnVyc3QgOTBrCistLS0tLQorCit3aGljaCBpbXBsaWVzICJpZiBhIHBhY2tldCBpcyBzZWVuIG9uIHRoZSBpbmdyZXNzIG9mIHRoZSBsbyBkZXZpY2Ugd2l0aAorYSBzb3VyY2UgSVAgYWRkcmVzcyBvZiAxMjcuMC4wLjEvMzIgd2UgZ2l2ZSBpdCBhIGNsYXNzaWZpY2F0aW9uIGlkICBvZiAxOjEgYW5kCit3ZSBleGVjdXRlIGEgcG9saWNpbmcgYWN0aW9uIHdoaWNoIHJhdGUgbGltaXRzIGl0cyBiYW5kd2lkdGggdXRpbGl6YXRpb24gCit0byAxLjVNYnBzIi4KKworVGhlIG5ldyBleHRlbnNpb25zIGFsbG93IGZvciBtb3JlIHRoYW4ganVzdCBwb2xpY2luZyBhY3Rpb25zIHRvIGJlIGFkZGVkLgorVGhleSBhcmUgYWxzbyBmdWxseSBiYWNrd2FyZCBjb21wYXRpYmxlLiBJZiB5b3UgaGF2ZSBhIGtlcm5lbCB0aGF0IGRvZXNudAordW5kZXJzdGFuZCB0aGVtLCB0aGVuIHRoZSBlZmZlY3QgaXMgbnVsbCBpLmUgaWYgeW91IGhhdmUgYSBuZXdlciB0YworYnV0IG9sZGVyIGtlcm5lbCwgdGhlIGFjdGlvbnMgYXJlIG5vdCBpbnN0YWxsZWQuIExpa2V3aXNlIGlmIHlvdQoraGF2ZSBhIG5ld2VyIGtlcm5lbCBidXQgb2xkZXIgdGMsIG9idmlvdXNseSB0aGUgdGMgd2lsbCB1c2UgY3VycmVudAorc3ludGF4IHdoaWNoIHdpbGwgd29yayBmaW5lLiBPZiBjb3Vyc2UgdG8gZ2V0IHRoZSByZXF1aXJlZCBlZmZlY3QgeW91IG5lZWQKK2JvdGggbmV3ZXIgdGMgYW5kIGtlcm5lbC4gSWYgeW91IGFyZSByZWFkaW5nIHRoaXMgeW91IGhhdmUgdGhlCityaWdodCB0YyA7LT4KKworQSBzaWRlIGVmZmVjdCBpcyB0aGF0IHdlIGNhbiBub3cgZ2V0IHN0YXRlbGVzcyBmaXJld2FsbGluZyB0byB3b3JrIHdpdGggdGMuIAorRXNzZW50aWFsbHkgdGhpcyBpcyBub3cgYW4gYWx0ZXJuYXRpdmUgdG8gaXB0YWJsZXMuCitJIHdvbnQgZ28gaW50byBkZXRhaWxzIG9mIG15IGRpc2xpa2UgZm9yIGlwdGFibGVzIGF0IHRpbWVzLCBidXQgCitzY2FsYWJpbGl0eSBpcyBvbmUgb2YgdGhlIG1haW4gaXNzdWVzOyBob3dldmVyLCBpZiB5b3UgbmVlZCBzdGF0ZWZ1bAorY2xhc3NpZmljYXRpb24gLSB1c2UgbmV0ZmlsdGVyIChmb3Igbm93KS4KKworVGhpcyBzdHVmZiB3b3JrcyBvbiBib3RoIGluZ3Jlc3MgYW5kIGVncmVzcyBxZGlzY3MuCisKK0ZlYXR1cmVzCistLS0tLS0tLQorCisxKSBuZXcgYWRkaXRpb25hbCBzeW50YXggYW5kIGFjdGlvbnMgZW5hYmxlZC4gTm90ZSBvbGQgc3ludGF4IGlzIHN0aWxsIHZhbGlkLgorCitFc3NlbnRpYWxseSB0aGlzIGlzIHN0aWxsIHRoZSBzYW1lIHN5bnRheCBhcyB0YyB3aXRoIGEgbmV3IGNvbnN0cnVjdAorImFjdGlvbiIuIFRoZSBzeW50YXggaXMgb2YgdGhlIGZvcm06Cit0YyBmaWx0ZXIgYWRkIDxERVZJQ0U+IHBhcmVudCAxOjAgcHJvdG9jb2wgaXAgcHJpbyAxMCA8RmlsdGVyIGRlc2NyaXB0aW9uPgorZmxvd2lkIDE6MSBhY3Rpb24gPEFDVElPTiBkZXNjcmlwdGlvbj4qCisKK1lvdSBjYW4gaGF2ZSBhcyBtYW55IGFjdGlvbnMgYXMgeW91IHdhbnQgKHdpdGhpbiBzZW5zaWJsZSByZWFzb25pbmcpLgorCitJbiB0aGUgcGFzdCB0aGUgb25seSByZWFsIGFjdGlvbiB3YXMgdGhlIHBvbGljZXI7IGkuZSB5b3UgY291bGQgZG8gc29tZXRoaW5nCithbG9uZyB0aGUgbGluZXMgb2Y6Cit0YyBmaWx0ZXIgYWRkIGRldiBsbyBwYXJlbnQgZmZmZjogcHJvdG9jb2wgaXAgcHJpbyAxMCB1MzIgXAorbWF0Y2ggaXAgc3JjIDEyNy4wLjAuMS8zMiBmbG93aWQgMToxIFwKK3BvbGljZSBtdHUgNDAwMCByYXRlIDE1MDBrYml0IGJ1cnN0IDkwaworCitBbHRob3VnaCB5b3UgY2FuIHN0aWxsIHVzZSB0aGUgc2FtZSBzeW50YXgsIG5vdyB5b3UgY2FuIHNheToKKwordGMgZmlsdGVyIGFkZCBkZXYgbG8gcGFyZW50IDE6MCBwcm90b2NvbCBpcCBwcmlvIDEwIHUzMiBcCittYXRjaCBpcCBzcmMgMTI3LjAuMC4xLzMyIGZsb3dpZCAxOjEgXAorYWN0aW9uIHBvbGljZSBtdHUgNDAwMCByYXRlIDE1MDBrYml0IGJ1cnN0IDkwaworCisiIGdlbmVyaWMgQWN0aW9ucyIgKGdhY3QpIGF0IHRoZSBtb21lbnQgYXJlOiAKK3sgZHJvcCwgcGFzcywgcmVjbGFzc2lmeSwgY29udGludWV9CisoSWYgeW91IGhhdmUgb3RoZXJzLCBubyBsaXN0ZWQgaGVyZSBnaXZlIG1lIGEgcmVhc29uIGFuZCB3ZSB3aWxsIGFkZCB0aGVtKQorK2Ryb3Agc2F5cyB0byBkcm9wIHRoZSBwYWNrZXQKKytwYXNzIGFuZCBvayAoYXJlIGVxdWl2YWxlbnQpIHNheXMgdG8gYWNjZXB0IGl0CisrcmVjbGFzc2lmeSByZXF1ZXN0cyBmb3IgcmVjbGFzc2lmaWNhdGlvbiBvZiB0aGUgcGFja2V0CisrY29udGludWUgcmVxdWVzdHMgZm9yIG5leHQgbG9va3VwIHRvIG1hdGNoCisKKzIpSW4gb3JkZXIgdG8gdGFrZSBhZHZhbnRhZ2Ugb2Ygc29tZSBvZiB0aGUgdGFyZ2V0cyB3cml0dGVuIGJ5IHRoZQoraXB0YWJsZXMgcGVvcGxlLCBhIGNsYXNzaWZpZXIgY2FuIGhhdmUgYSBwYWNrZXQgYmVpbmcgbWFzc2FnZWQgYnkgYW4KK2lwdGFibGUgdGFyZ2V0LiBJIGhhdmUgb25seSB0ZXN0ZWQgd2l0aCBtYW5nbGVyIHRhcmdldHMgdXAgdG8gbm93LgorKGluZmFjdCBhbnl0aGluZyB0aGF0IGlzIG5vdCBpbiB0aGUgbWFuZ2xpbmcgdGFibGUgaXMgZGlzYWJsZWQgcmlnaHQgbm93KQorCitJbiB0ZXJtcyBvZiBob29rczoKKyppbmdyZXNzIGlzIG1hcHBlZCB0byBwcmUtcm91dGluZyBob29rCisqZWdyZXNzIGlzIG1hcHBlZCB0byBwb3N0LXJvdXRpbmcgaG9vaworSSBkb250IHNlZSBtdWNoIHZhbHVlIGluIHRoZSBvdGhlciBob29rcywgaWYgeW91IHNlZSBpdCBhbmQgZW1haWwgbWUgZ29vZAorcmVhc29ucywgdGhlIGFkZGl0aW9uIGlzIHRyaXZpYWwuCisKK0V4YW1wbGUgc3ludGF4IGZvciBpcHRhYmxlcyB0YXJnZXRzIHVzYWdlIGJlY29tZXM6Cit0YyBmaWx0ZXIgYWRkIC4uLi4uIHUzMiA8dTMyIHN5bnRheD4gYWN0aW9uIGlwdCAtaiA8aXB0YWJsZXMgdGFyZ2V0IHN5bnRheD4KKworZXhhbXBsZToKK3RjIGZpbHRlciBhZGQgZGV2IGxvIHBhcmVudCBmZmZmOiBwcm90b2NvbCBpcCBwcmlvIDggdTMyIFwKK21hdGNoIGlwIGRzdCAxMjcuMC4wLjgvMzIgZmxvd2lkIDE6MTIgXAorYWN0aW9uIGlwdCAtaiBtYXJrIC0tc2V0LW1hcmsgMgorCitOT1RFOiBmbG93aWQgMToxMiBpcyBwYXJzZWQgZmxvd2lkIDB4MToweDEyLiAgTWFrZSBzdXJlIGlmIHlvdSB3YW50IGZsb3dpZAorZGVjaW1hbCAxMiwgdGhlbiB1c2UgZmxvd2lkIDE6Yy4KKworMykgQSBmZWF0dXJlIGkgY2FsbCBwaXBlCitUaGUgbW90aXZhdGlvbiBpcyBkZXJpdmVkIGZyb20gVW5peCBwaXBlIG1lY2hhbmlzbSBidXQgYXBwbGllZCB0byBwYWNrZXRzLgorRXNzZW50aWFsbHkgdGFrZSBhIG1hdGNoaW5nIHBhY2tldCBhbmQgcGFzcyBpdCB0aHJvdWdoIAorYWN0aW9uMSB8IGFjdGlvbjIgfCBhY3Rpb24zIGV0Yy4KK1lvdSBjb3VsZCBkbyBzb21ldGhpbmcgc2ltaWxhciB0byB0aGlzIHdpdGggdGhlIHRjIHBvbGljZXIgYW5kIHRoZSAiY29udGludWUiCitvcGVyYXRvciBidXQgdGhpcyByYXRoZXIgcmVzdHJpY3RzIGl0IHRvIGp1c3QgdGhlIHBvbGljZXIgYW5kIHJlcXVpcmVzIAorbXVsdGlwbGUgcnVsZXMgKGFuZCBsb29rdXBzLCBoZW5jZSBxdWlldCBpbmVmZmljaWVudCk7IAorCithcyBhbiBleGFtcGxlIC0tIGFuZCBwbGVhc2Ugbm90ZSB0aGF0IHRoaXMgaXMganVzdCBhbiBleGFtcGxlIF9ub3RfIFRoZSAKK1dvcmQgWW91dmUgQmVlbiBXYWl0aW5nIEZvciAoeWVzIGkgaGF2ZSBoYWQgcHJvYmxlbXMgZ2l2aW5nIGV4YW1wbGVzCit3aGljaCBlbmRlZCBiZWNvbWluZyBkb2dtYSBpbiBkb2N1bWVudHMgYW5kIHBlb3BsZSBtb2RpZnlpbmcgdGhlbSBhIGxpdHRsZQordG8gbG9vayBjbGV2ZXIpOyAKKworaSBzZWxlY3RlZCB0aGUgbWV0ZXJpbmcgcmF0ZXMgdG8gYmUgc21hbGwgc28gdGhhdCBpIGNhbiBzaG93IGJldHRlciBob3cgCit0aGluZ3Mgd29yay4KKyAKK1RoZSBzY3JpcHQgYmVsb3cgZG9lcyB0aGUgZm9sbG93aW5nOiAKKy0gYW4gaW5jb21pbmcgcGFja2V0IGZyb20gMTAuMC4wLjIxIGlzIGZpcnN0IGdpdmVuIGEgZmlyZXdhbGwgbWFyayBvZiAxLiAKKworLSBJdCBpcyB0aGVuIG1ldGVyZWQgdG8gbWFrZSBzdXJlIGl0IGRvZXMgbm90IGV4Y2VlZCBpdHMgYWxsb2NhdGVkIHJhdGUgb2YgCisxS2Jwcy4gSWYgaXQgZG9lc250IGV4Y2VlZCByYXRlLCB0aGlzIGlzIHdoZXJlIHdlIHRlcm1pbmF0ZSBhY3Rpb24gZXhlY3V0aW9uLgorCistIElmIGl0IGRvZXMgZXhjZWVkIGl0cyByYXRlLCBpdHMgImNvbG9yIiBjaGFuZ2VzIHRvIGEgbWFyayBvZiAyIGFuZCBpdCBpcyAKK3RoZW4gcGFzc2VkIHRocm91Z2ggYSBzZWNvbmQgbWV0ZXIuCisKKy1UaGUgc2Vjb25kIG1ldGVyIGlzIHNoYXJlZCBhY3Jvc3MgYWxsIGZsb3dzIG9uIHRoYXQgZGV2aWNlIFtpIGFtIHN1cHJpc2VkIAordGhhdCB0aGlzIHNlZW1zIHRvIGJlIG5vdCBhIHdlbGwga25vdyBmZWF0dXJlIG9mIHRoZSBwb2xpY2VyOyBCZXJ0IHdhcyB0ZWxsaW5nIAorbWUgdGhhdCBzb21lb25lIHdhcyB3cml0aW5nIGEgcWRpc2MganVzdCB0byBkbyBzaGFyaW5nIGFjcm9zcyBtdWx0aXBsZSBkZXZpY2VzOworaXQgbXVzdCBiZSB0aGUgc3VtbWVyIGhlYXQgYWdhaW47IHdldmUgaGFkIHNvbWVvbmUgZG9pbmcgdGhhdCBldmVyeSB5ZWFyIGFyb3VuZAorc3VtbWVyICAtLSB0aGUga2V5IHRvIHNoYXJpbmcgaXMgdG8gdXNlIGEgb3BlcmF0b3IgImluZGV4IiBpbiB5b3VyIHBvbGljZXIgCitydWxlcyAoZXhhbXBsZSAiaW5kZXggMjAiKS4gQWxsIHlvdXIgcnVsZXMgaGF2ZSB0byB1c2UgdGhlIHNhbWUgaW5kZXggdG8gCitzaGFyZS5dCisgCistSWYgdGhlIHNlY29uZCBtZXRlciBpcyBleGNlZWRlZCB0aGUgY29sb3Igb2YgdGhlIGZsb3cgY2hhbmdlcyBmdXJ0aGVyIHRvIDMuCisKKy1XZSB0aGVuIHBhc3MgdGhlIHBhY2tldCB0byBhbm90aGVyIG1ldGVyIHdoaWNoIGlzIHNoYXJlZCBhY3Jvc3MgYWxsIGRldmljZXMKK2luIHRoZSBzeXN0ZW0uIElmIHRoaXMgbWV0ZXIgaXMgZXhjZWVkZWQgd2UgZHJvcCB0aGUgcGFja2V0LgorCitOb3RlIHRoZSBtYXJrIGNhbiBiZSB1c2VkIGZ1cnRoZXIgdXAgdGhlIHN5c3RlbSB0byBkbyB0aGluZ3MgbGlrZSBwb2xpY3kgCitvciBtb3JlIGludGVyZXN0aW5nIHRoaW5ncyBvbiB0aGUgZWdyZXNzLgorCistLS0tLS0tLS0tLS0tLS0tLS0gY3V0IGhlcmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIworIyBBZGQgYW4gaW5ncmVzcyBxZGlzYyBvbiBldGgwCit0YyBxZGlzYyBhZGQgZGV2IGV0aDAgaW5ncmVzcworIworI2lmIHlvdSBzZWUgYW4gaW5jb21pbmcgcGFja2V0IGZyb20gMTAuMC4wLjIxCit0YyBmaWx0ZXIgYWRkIGRldiBldGgwIHBhcmVudCBmZmZmOiBwcm90b2NvbCBpcCBwcmlvIDEgXAordTMyIG1hdGNoIGlwIHNyYyAxMC4wLjAuMjEvMzIgZmxvd2lkIDE6MTUgXAorIworIyBmaXJzdCBnaXZlIGl0IGEgbWFyayBvZiAxCithY3Rpb24gaXB0IC1qIG1hcmsgLS1zZXQtbWFyayAxIGluZGV4IDIgXAorIworIyB0aGVuIHBhc3MgaXQgdGhyb3VnaCBhIHBvbGljZXIgd2hpY2ggYWxsb3dzIDFrYnBzOyBpZiB0aGUgZmxvdworIyBkb2VzbnQgZXhjZWVkIHRoYXQgcmF0ZSwgdGhpcyBpcyB3aGVyZSB3ZSBzdG9wLCBpZiBpdCBleGNlZWRzIHdlCisjIHBpcGUgdGhlIHBhY2tldCB0byB0aGUgbmV4dCBhY3Rpb24KK2FjdGlvbiBwb2xpY2UgcmF0ZSAxa2JpdCBidXJzdCA5ayBwaXBlIFwKKyMKKyMgd2hpY2ggbWFya3MgdGhlIHBhY2tldCBmd21hcmsgYXMgMiBhbmQgcGlwZXMKK2FjdGlvbiBpcHQgLWogbWFyayAtLXNldC1tYXJrIDIgXAorIworIyBuZXh0IGF0dGVtcHQgdG8gYm9ycm93IGIvd2lkdGggZnJvbSBhIG1ldGVyCisjIHVzZWQgYWNyb3NzIGFsbCBmbG93cyBpbmNvbWluZyBvbiBldGgwKCJpbmRleCAzMCIpCisjIGFuZCBpZiB0aGF0IGlzIGV4Y2VlZGVkIHdlIHBpcGUgdG8gdGhlIG5leHQgYWN0aW9uCithY3Rpb24gcG9saWNlIGluZGV4IDMwIG10dSA1MDAwIHJhdGUgMWtiaXQgYnVyc3QgMTBrIHBpcGUgXAorIyBtYXJrIGl0IGFzIGZ3bWFyayAzIGlmIGV4Y2VlZGVkCithY3Rpb24gaXB0IC1qIG1hcmsgLS1zZXQtbWFyayAzIFwKKyMgYW5kIHRoZW4gYXR0ZW1wdCB0byBib3Jyb3cgZnJvbSBhIG1ldGVyIHVzZWQgYnkgYWxsIGRldmljZXMgaW4gdGhlCisjIHN5c3RlbS4gU2hvdWxkIHRoaXMgYmUgZXhjZWVkZWQsIGRyb3AgdGhlIHBhY2tldCBvbiB0aGUgZmxvb3IuCithY3Rpb24gcG9saWNlIGluZGV4IDIwIG10dSA1MDAwIHJhdGUgMWtiaXQgYnVyc3QgOTBrIGRyb3AKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKworTm93IGxldHMgc2VlIHRoZSBhY3Rpb25zIGluc3RhbGxlZCB3aXRoIAorInRjIGZpbHRlciBzaG93IHBhcmVudCBmZmZmOiBkZXYgZXRoMCIKKworLS0tLS0tLS0gb3V0cHV0IC0tLS0tLS0tLS0tCitqcm9vdCMgdGMgZmlsdGVyIHNob3cgcGFyZW50IGZmZmY6IGRldiBldGgwCitmaWx0ZXIgcHJvdG9jb2wgaXAgcHJlZiAxIHUzMiAKK2ZpbHRlciBwcm90b2NvbCBpcCBwcmVmIDEgdTMyIGZoIDgwMDogaHQgZGl2aXNvciAxIAorZmlsdGVyIHByb3RvY29sIGlwIHByZWYgMSB1MzIgZmggODAwOjo4MDAgb3JkZXIgMjA0OCBrZXkgaHQgODAwIGJrdCAwIGZsb3dpZCAxOjE1IAorCisgICBhY3Rpb24gb3JkZXIgMTogdGFibGVuYW1lOiBtYW5nbGUgIGhvb2s6IE5GX0lQX1BSRV9ST1VUSU5HIAorICAgICAgICB0YXJnZXQgTUFSSyBzZXQgMHgxICBpbmRleCAyCisKKyAgIGFjdGlvbiBvcmRlciAyOiBwb2xpY2UgMSBhY3Rpb24gcGlwZSByYXRlIDFLYml0IGJ1cnN0IDlLYiBtdHUgMktiIAorCisgICBhY3Rpb24gb3JkZXIgMzogdGFibGVuYW1lOiBtYW5nbGUgIGhvb2s6IE5GX0lQX1BSRV9ST1VUSU5HIAorICAgICAgICB0YXJnZXQgTUFSSyBzZXQgMHgyICBpbmRleCAxCisKKyAgIGFjdGlvbiBvcmRlciA0OiBwb2xpY2UgMzAgYWN0aW9uIHBpcGUgcmF0ZSAxS2JpdCBidXJzdCAxMEtiIG10dSA1MDAwYiAKKworICAgYWN0aW9uIG9yZGVyIDU6IHRhYmxlbmFtZTogbWFuZ2xlICBob29rOiBORl9JUF9QUkVfUk9VVElORyAKKyAgICAgICAgdGFyZ2V0IE1BUksgc2V0IDB4MyAgaW5kZXggMworCisgICBhY3Rpb24gb3JkZXIgNjogcG9saWNlIDIwIGFjdGlvbiBkcm9wIHJhdGUgMUtiaXQgYnVyc3QgOTBLYiBtdHUgNTAwMGIgCisKKyAgbWF0Y2ggMGEwMDAwMTUvZmZmZmZmZmYgYXQgMTIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTm90ZSB0aGUgb3JkZXJpbmcgb2YgdGhlIGFjdGlvbnMgaXMgYmFzZWQgb24gdGhlIG9yZGVyIGluIHdoaWNoIHdlIGVudGVyZWQKK3RoZW0uIEluIHRoZSBmdXR1cmUgaSB3aWxsIGFkZCBleHBsaWNpdCBwcmlvcml0aWVzLgorCitOb3cgbGV0cyBydW4gYSBwaW5nIC1mIGZyb20gMTAuMC4wLjIxIHRvIHRoaXMgaG9zdDsgc3RvcCB0aGUgcGluZyBhZnRlcgoreW91IHNlZSBhIGZldyBsaW5lcyBvZiBkb3RzCisKKy0tLS0KK1tyb290QGp6bnkgaGFkaV0jIHBpbmcgLWYgIDEwLjAuMC4yMgorUElORyAxMC4wLjAuMjIgKDEwLjAuMC4yMik6IDU2IGRhdGEgYnl0ZXMKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKy0tLSAxMC4wLjAuMjIgcGluZyBzdGF0aXN0aWNzIC0tLQorMjI0OCBwYWNrZXRzIHRyYW5zbWl0dGVkLCAxODExIHBhY2tldHMgcmVjZWl2ZWQsIDE5JSBwYWNrZXQgbG9zcworcm91bmQtdHJpcCBtaW4vYXZnL21heCA9IDAuNy85LjMvMjAuMSBtcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTm93IGxldHMgdGFrZSBhIGxvb2sgYXQgdGhlIHN0YXRzIHdpdGggInRjIC1zIGZpbHRlciBzaG93IHBhcmVudCBmZmZmOiBkZXYgZXRoMCIKKworLS0tLS0tLS0tLS0tLS0KK2pyb290IyB0YyAtcyBmaWx0ZXIgc2hvdyBwYXJlbnQgZmZmZjogZGV2IGV0aDAKK2ZpbHRlciBwcm90b2NvbCBpcCBwcmVmIDEgdTMyIAorZmlsdGVyIHByb3RvY29sIGlwIHByZWYgMSB1MzIgZmggODAwOiBodCBkaXZpc29yIDEgCitmaWx0ZXIgcHJvdG9jb2wgaXAgcHJlZiAxIHUzMiBmaCA4MDA6OjgwMCBvcmRlciAyMDQ4IGtleSBodCA4MDAgYmt0IDAgZmxvd2lkIDE6MQorNSAKKworICAgYWN0aW9uIG9yZGVyIDE6IHRhYmxlbmFtZTogbWFuZ2xlICBob29rOiBORl9JUF9QUkVfUk9VVElORyAKKyAgICAgICAgdGFyZ2V0IE1BUksgc2V0IDB4MSAgaW5kZXggMgorICAgICAgICAgU2VudCAxODg4MzIgYnl0ZXMgMjI0OCBwa3RzIChkcm9wcGVkIDAsIG92ZXJsaW1pdHMgMCkgCisKKyAgIGFjdGlvbiBvcmRlciAyOiBwb2xpY2UgMSBhY3Rpb24gcGlwZSByYXRlIDFLYml0IGJ1cnN0IDlLYiBtdHUgMktiIAorICAgICAgICAgU2VudCAxODg4MzIgYnl0ZXMgMjI0OCBwa3RzIChkcm9wcGVkIDAsIG92ZXJsaW1pdHMgMjEyMikgCisKKyAgIGFjdGlvbiBvcmRlciAzOiB0YWJsZW5hbWU6IG1hbmdsZSAgaG9vazogTkZfSVBfUFJFX1JPVVRJTkcgCisgICAgICAgIHRhcmdldCBNQVJLIHNldCAweDIgIGluZGV4IDEKKyAgICAgICAgIFNlbnQgMTc4MjQ4IGJ5dGVzIDIxMjIgcGt0cyAoZHJvcHBlZCAwLCBvdmVybGltaXRzIDApIAorCisgICBhY3Rpb24gb3JkZXIgNDogcG9saWNlIDMwIGFjdGlvbiBwaXBlIHJhdGUgMUtiaXQgYnVyc3QgMTBLYiBtdHUgNTAwMGIgCisgICAgICAgICBTZW50IDE3ODI0OCBieXRlcyAyMTIyIHBrdHMgKGRyb3BwZWQgMCwgb3ZlcmxpbWl0cyAxOTQ1KSAKKworICAgYWN0aW9uIG9yZGVyIDU6IHRhYmxlbmFtZTogbWFuZ2xlICBob29rOiBORl9JUF9QUkVfUk9VVElORyAKKyAgICAgICAgdGFyZ2V0IE1BUksgc2V0IDB4MyAgaW5kZXggMworICAgICAgICAgU2VudCAxNjMzODAgYnl0ZXMgMTk0NSBwa3RzIChkcm9wcGVkIDAsIG92ZXJsaW1pdHMgMCkgCisKKyAgIGFjdGlvbiBvcmRlciA2OiBwb2xpY2UgMjAgYWN0aW9uIGRyb3AgcmF0ZSAxS2JpdCBidXJzdCA5MEtiIG10dSA1MDAwYiAKKyAgICAgICAgIFNlbnQgMTYzMzgwIGJ5dGVzIDE5NDUgcGt0cyAoZHJvcHBlZCAwLCBvdmVybGltaXRzIDQzNykgCisKKyAgbWF0Y2ggMGEwMDAwMTUvZmZmZmZmZmYgYXQgMTIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmVhdCwgZWg/CisKKworV2FubmEgd3JpdGUgYW4gYWN0aW9uIG1vZHVsZT8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSXRzIGVhc3kuIEVpdGhlciBsb29rIGF0IHRoZSBjb2RlIG9yIHNlbmQgbWUgZW1haWwuIEkgd2lsbCBkb2N1bWVudCBhdAorc29tZSBwb2ludDsgd2lsbCBhbHNvIGFjY2VwdCBkb2N1bWVudGF0aW9uLgorCitUT0RPCistLS0tCisKK0xvdHNhIGdvb2RpZXMvZmVhdHVyZXMgY29taW5nLiBSZXF1ZXN0cyBhbHNvIGJlaW5nIGFjY2VwdGVkLgorQXQgdGhlIG1vbWVudCB0aGUgZm9jdXMgaGFzIGJlZW4gb24gZ2V0dGluZyB0aGUgYXJjaGl0ZWN0dXJlIGluIHBsYWNlLgorRXhwZWN0IG5ldyB0aGluZ3MgaW4gdGhlIHNwdXJpb3VzIHRpbWUgaSBoYXZlIHRvIHdvcmsgb24gdGhpcworKHBhcnRpY3VsYXJseSBhcm91bmQgZW5kIG9mIHllYXIgd2hlbiBpIGhhdmUgdHlwaWNhbGx5IGdldCB0aW1lIG9mZgorZnJvbSB3b3JrKS4KKwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvZG9jL2FjdGlvbnMvZ2FjdC11c2FnZSBiL2lwcm91dGUyL2RvYy9hY3Rpb25zL2dhY3QtdXNhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUxMzA4ZAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2RvYy9hY3Rpb25zL2dhY3QtdXNhZ2UKQEAgLTAsMCArMSw3OSBAQAorCitnYWN0IDxBQ1RJT04+IFtSQU5EXSBbSU5ERVhdCisKK1doZXJlOiAKKwlBQ1RJT04gOj0gcmVjbGFzc2lmeSB8IGRyb3AgfCBjb250aW51ZSB8IHBhc3MgfCBvayAKKwlSQU5EIDo9IHJhbmRvbSA8UkFORFRZUEU+IDxBQ1RJT04+IDxWQUw+CisJUkFORFRZUEUgOj0gbmV0cmFuZCB8IGRldGVybQorICAgICAgICBWQUwgOiA9IHZhbHVlIG5vdCBleGNlZWRpbmcgMTAwMDAKKyAgICAgICAgSU5ERVggOj0gaW5kZXggdmFsdWUgdXNlZAorICAgICAgCitBQ1RJT04gc2VtYW50aWNzCistIHBhc3MgYW5kIG9rIGFyZSBlcXVpdmFsZW50IHRvIGFjY2VwdAorLSBjb250aW51ZSBhbGxvd3MgdG8gcmVzdGFydCBjbGFzc2lmaWNhdGlvbiBsb29rdXAKKy0gZHJvcCBkcm9wcyBwYWNrZXRzCistIHJlY2xhc3NpZnkgaW1wbGllcyBjb250aW51ZSBjbGFzc2lmaWNhdGlvbiB3aGVyZSB3ZSBsZWZ0IG9mZgorCityYW5kb21pemF0aW9uCistLS0tLS0tLS0tLS0tLQorCitBdCB0aGUgbW9tZW50IHRoZXJlIGFyZSBvbmx5IHR3byBhbGdvcml0aG1zLiBPbmUgaXMgZGV0ZXJtaW5pc3RpYworYW5kIHRoZSBvdGhlciB1c2VzIGludGVybmFsIGtlcm5lbCBuZXRyYW5kLgorCitFeGFtcGxlczoKKworUnVsZXMgY2FuIGJlIGluc3RhbGxlZCBvbiBib3RoIGluZ3Jlc3MgYW5kIGVncmVzcyAtIHRoaXMgc2hvd3MgaW5ncmVzcworb25seQorCit0YyBxZGlzYyBhZGQgZGV2IGV0aDAgaW5ncmVzcworCisjIGV4YW1wbGUgMQordGMgZmlsdGVyIGFkZCBkZXYgZXRoMCBwYXJlbnQgZmZmZjogcHJvdG9jb2wgaXAgcHJpbyA2IHUzMiBtYXRjaCBpcCBzcmMgXAorMTAuMC4wLjkvMzIgZmxvd2lkIDE6MTYgYWN0aW9uIGRyb3AKKworcGluZyAtYyAyMCAxMC4wLjAuOQorCistLQorZmlsdGVyIHUzMgorZmlsdGVyIHUzMiBmaCA4MDA6IGh0IGRpdmlzb3IgMQorZmlsdGVyIHUzMiBmaCA4MDA6OjgwMCBvcmRlciAyMDQ4IGtleSBodCA4MDAgYmt0IDAgZmxvd2lkIDE6MTYgIChydWxlIGhpdCAzMiBzdWNjZXNzIDIwKQorICBtYXRjaCAwYTAwMDAwOS9mZmZmZmZmZiBhdCAxMiAoc3VjY2VzcyAyMCApCisgICAgICAgIGFjdGlvbiBvcmRlciAxOiBnYWN0IGFjdGlvbiBkcm9wCisgICAgICAgICByYW5kb20gdHlwZSBub25lIHBhc3MgdmFsIDAKKyAgICAgICAgIGluZGV4IDEgcmVmIDEgYmluZCAxIGluc3RhbGxlZCA1OSBzZWMgdXNlZCAzNSBzZWMKKyAgICAgICAgIFNlbnQgMTY4MCBieXRlcyAyMCBwa3RzIChkcm9wcGVkIDIwLCBvdmVybGltaXRzIDAgKQorIAorLS0tLQorCisjIGV4YW1wbGUgMgorI2FsbG93IDEgb3V0IDEwIHJhbmRvbWx5IHVzaW5nIHRoZSBuZXRyYW5kIGdlbmVyYXRvcgordGMgZmlsdGVyIGFkZCBkZXYgZXRoMCBwYXJlbnQgZmZmZjogcHJvdG9jb2wgaXAgcHJpbyA2IHUzMiBtYXRjaCBpcCBzcmMgXAorMTAuMC4wLjkvMzIgZmxvd2lkIDE6MTYgYWN0aW9uIGRyb3AgcmFuZG9tIG5ldHJhbmQgb2sgMTAKKyAKK3BpbmcgLWMgMjAgMTAuMC4wLjkKKworLS0tLQorZmlsdGVyIHByb3RvY29sIGlwIHByZWYgNiB1MzIgZmlsdGVyIHByb3RvY29sIGlwIHByZWYgNiB1MzIgZmggODAwOiBodCBkaXZpc29yIDFmaWx0ZXIgcHJvdG9jb2wgaXAgcHJlZiA2IHUzMiBmaCA4MDA6OjgwMCBvcmRlciAyMDQ4IGtleSBodCA4MDAgYmt0IDAgZmxvd2lkIDE6MTYgIChydWxlIGhpdCAyMCBzdWNjZXNzIDIwKQorICBtYXRjaCAwYTAwMDAwOS9mZmZmZmZmZiBhdCAxMiAoc3VjY2VzcyAyMCApCisgICAgICAgIGFjdGlvbiBvcmRlciAxOiBnYWN0IGFjdGlvbiBkcm9wCisgICAgICAgICByYW5kb20gdHlwZSBuZXRyYW5kIHBhc3MgdmFsIDEwCisgICAgICAgICBpbmRleCA1IHJlZiAxIGJpbmQgMSBpbnN0YWxsZWQgNDkgc2VjIHVzZWQgMjUgc2VjCisgICAgICAgICBTZW50IDE2ODAgYnl0ZXMgMjAgcGt0cyAoZHJvcHBlZCAxNiwgb3ZlcmxpbWl0cyAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLQorI2FsdGVybmF0aXZlOiBkZXRlcm1pbmlzdGljYWxseSBhY2NlcHQgZXZlcnkgc2Vjb25kIHBhY2tldAordGMgZmlsdGVyIGFkZCBkZXYgZXRoMCBwYXJlbnQgZmZmZjogcHJvdG9jb2wgaXAgcHJpbyA2IHUzMiBtYXRjaCBpcCBzcmMgXAorMTAuMC4wLjkvMzIgZmxvd2lkIDE6MTYgYWN0aW9uIGRyb3AgcmFuZG9tIGRldGVybSBvayAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorcGluZyAtYyAyMCAxMC4wLjAuOQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK3RjIC1zIGZpbHRlciBzaG93IHBhcmVudCBmZmZmOiBkZXYgZXRoMAorLS0tLS0KK2ZpbHRlciBwcm90b2NvbCBpcCBwcmVmIDYgdTMyIGZpbHRlciBwcm90b2NvbCBpcCBwcmVmIDYgdTMyIGZoIDgwMDogaHQgZGl2aXNvciAxZmlsdGVyIHByb3RvY29sIGlwIHByZWYgNiB1MzIgZmggODAwOjo4MDAgb3JkZXIgMjA0OCBrZXkgaHQgODAwIGJrdCAwIGZsb3dpZCAxOjE2ICAocnVsZSBoaXQgMjAgc3VjY2VzcyAyMCkKKyAgbWF0Y2ggMGEwMDAwMDkvZmZmZmZmZmYgYXQgMTIgKHN1Y2Nlc3MgMjAgKQorICAgICAgICBhY3Rpb24gb3JkZXIgMTogZ2FjdCBhY3Rpb24gZHJvcAorICAgICAgICAgcmFuZG9tIHR5cGUgZGV0ZXJtIHBhc3MgdmFsIDIKKyAgICAgICAgIGluZGV4IDQgcmVmIDEgYmluZCAxIGluc3RhbGxlZCAxMTggc2VjIHVzZWQgODIgc2VjCisgICAgICAgICBTZW50IDE2ODAgYnl0ZXMgMjAgcGt0cyAoZHJvcHBlZCAxMCwgb3ZlcmxpbWl0cyAwICkKKy0tLS0tCisKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2RvYy9hY3Rpb25zL2lmYi1SRUFETUUgYi9pcHJvdXRlMi9kb2MvYWN0aW9ucy9pZmItUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMDExNzkKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9kb2MvYWN0aW9ucy9pZmItUkVBRE1FCkBAIC0wLDAgKzEsMTI1IEBACisKK0lGQiBpcyBpbnRlbmRlZCB0byByZXBsYWNlIElNUS4KK0FkdmFudGFnZSBvdmVyIGN1cnJlbnQgSU1ROyBjbGVhbmVyIGluIHBhcnRpY3VsYXIgaW4gaW4gU01QOword2l0aCBhIF9sb3RfIGxlc3MgY29kZS4KKworS25vd24gSU1RL0lGQiBVU0VTCistLS0tLS0tLS0tLS0tLS0tLS0KKworQXMgZmFyIGFzIGkga25vdyB0aGUgcmVhc29ucyBsaXN0ZWQgYmVsb3cgaXMgd2h5IHBlb3BsZSB1c2UgSU1RLiAKK0l0IHdvdWxkIGJlIG5pY2UgdG8ga25vdyBvZiBhbnl0aGluZyBlbHNlIHRoYXQgaSBtaXNzZWQuCisKKzEpIHFkaXNjcy9wb2xpY2llcyB0aGF0IGFyZSBwZXIgZGV2aWNlIGFzIG9wcG9zZWQgdG8gc3lzdGVtIHdpZGUuCitJRkIgYWxsb3dzIGZvciBzaGFyaW5nLgorCisyKSBBbGxvd3MgZm9yIHF1ZXVlaW5nIGluY29taW5nIHRyYWZmaWMgZm9yIHNoYXBpbmcgaW5zdGVhZCBvZgorZHJvcHBpbmcuIEkgYW0gbm90IGF3YXJlIG9mIGFueSBzdHVkeSB0aGF0IHNob3dzIHBvbGljaW5nIGlzIAord29yc2UgdGhhbiBzaGFwaW5nIGluIGFjaGlldmluZyB0aGUgZW5kIGdvYWwgb2YgcmF0ZSBjb250cm9sLgorSSB3b3VsZCBiZSBpbnRlcmVzdGVkIGlmIGFueW9uZSBpcyBleHBlcmltZW50aW5nLgorCiszKSBWZXJ5IGludGVyZXN0aW5nIHVzZTogaWYgeW91IGFyZSBzZXJ2aW5nIHAycCB5b3UgbWF5IHdhbm5hIGdpdmUgCitwcmVmZXJlbmNlIHRvIHlvdXIgb3duIGxvY2FseSBvcmlnaW5hdGVkIHRyYWZmaWMgKHdoZW4gcmVzcG9uc2VzIGNvbWUgYmFjaykKK3ZzIHNvbWVvbmUgdXNpbmcgeW91ciBzeXN0ZW0gdG8gZG8gYml0dG9yZW50LiBTbyBRb1NpbmcgYmFzZWQgb24gc3RhdGUKK2NvbWVzIGluIGFzIHRoZSBzb2x1dGlvbi4gV2hhdCBwZW9wbGUgZGlkIHRvIGFjaGl2ZSB0aGlzIHdhcyBzdGljawordGhlIElNUSBzb21ld2hlcmUgcHJlbG9jYWwgaG9vay4KK0kgdGhpbmsgdGhpcyBpcyBhIHByZXR0eSBuZWF0IGZlYXR1cmUgdG8gaGF2ZSBpbiBMaW51eCBpbiBnZW5lcmFsLgorKGkuZSBub3QganVzdCBmb3IgSU1RKS4KK0J1dCBpIHdvbnQgZ28gYmFjayB0byBwdXR0aW5nIG5ldGZpbHRlciBob29rcyBpbiB0aGUgZGV2aWNlIHRvIHNhdGlzZnkKK3RoaXMuICBJIGFsc28gZG9udCB0aGluayBpdHMgd29ydGggaXQgaGFja2luZyBpZmIgc29tZSBtb3JlIHRvIGJlIAorYXdhcmUgb2Ygc2F5IEwzIGluZm8gYW5kIHBsYXkgaXAgcnVsZSB0cmlja3MgdG8gYWNoaWV2ZSB0aGlzLgorLS0+IEluc3RlYWQgdGhlIHBsYW4gaXMgdG8gaGF2ZSBhIGNvbnRyYWNrIHJlbGF0ZWQgYWN0aW9uLiBUaGlzIGFjdGlvbiB3aWxsCitzZWxlY3RpdmVseSBlaXRoZXIgcXVlcnkvY3JlYXRlIGNvbnRyYWNrIHN0YXRlIG9uIGluY29taW5nIHBhY2tldHMuIAorUGFja2V0cyBjb3VsZCB0aGVuIGJlIHJlZGlyZWN0ZWQgdG8gaWZiIGJhc2VkIG9uIHdoYXQgaGFwcGVucyAtPiBlZyAKK29uIGluY29taW5nIHBhY2tldHM7IGlmIHdlIGZpbmQgdGhleSBhcmUgb2Yga25vd24gc3RhdGUgd2UgY291bGQgc2VuZCB0byAKK2EgZGlmZmVyZW50IHF1ZXVlIHRoYW4gb25lIHdoaWNoIGRpZG50IGhhdmUgZXhpc3Rpbmcgc3RhdGUuIFRoaXMKK2FsbCBob3dldmVyIGlzIGRlcGVuZGVudCBvbiB3aGF0ZXZlciBydWxlcyB0aGUgYWRtaW4gZW50ZXJzLgorCitBdCB0aGUgbW9tZW50IHRoaXMgM3JkIGZ1bmN0aW9uIGRvZXMgbm90IGV4aXN0IHlldC4gSSBoYXZlIGRlY2lkZWQgdGhhdAoraW5zdGVhZCBvZiBzaXR0aW5nIG9uIHRoZSBwYXRjaCBmb3IgYW5vdGhlciB5ZWFyLCB0byByZWxlYXNlIGl0IGFuZCB0aGVuIAoraWYgdGhlcmVzIHByZXNzdXJlIGkgd2lsbCBhZGQgdGhpcyBmZWF0dXJlLgorCitBbiBleGFtcGxlLCB0byBwcm92aWRlIGZ1bmN0aW9uYWxpdHkgdGhhdCBtb3N0IHBlb3BsZSB1c2UgSU1RIGZvciBiZWxvdzoKKworLS0tLS0tLS0KK2V4cG9ydCBUQz0iL3NiaW4vdGMiCisKKyRUQyBxZGlzYyBhZGQgZGV2IGlmYjAgcm9vdCBoYW5kbGUgMTogcHJpbyAKKyRUQyBxZGlzYyBhZGQgZGV2IGlmYjAgcGFyZW50IDE6MSBoYW5kbGUgMTA6IHNmcQorJFRDIHFkaXNjIGFkZCBkZXYgaWZiMCBwYXJlbnQgMToyIGhhbmRsZSAyMDogdGJmIHJhdGUgMjBrYml0IGJ1ZmZlciAxNjAwIGxpbWl0IDMwMDAKKyRUQyBxZGlzYyBhZGQgZGV2IGlmYjAgcGFyZW50IDE6MyBoYW5kbGUgMzA6IHNmcSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiskVEMgZmlsdGVyIGFkZCBkZXYgaWZiMCBwcm90b2NvbCBpcCBwcmVmIDEgcGFyZW50IDE6IGhhbmRsZSAxIGZ3IGNsYXNzaWQgMToxCiskVEMgZmlsdGVyIGFkZCBkZXYgaWZiMCBwcm90b2NvbCBpcCBwcmVmIDIgcGFyZW50IDE6IGhhbmRsZSAyIGZ3IGNsYXNzaWQgMToyCisKK2lmY29uZmlnIGlmYjAgdXAKKworJFRDIHFkaXNjIGFkZCBkZXYgZXRoMCBpbmdyZXNzCisKKyMgcmVkaXJlY3QgYWxsIElQIHBhY2tldHMgYXJyaXZpbmcgaW4gZXRoMCB0byBpZmIwIAorIyB1c2UgbWFyayAxIC0tPiBwdXRzIHRoZW0gb250byBjbGFzcyAxOjEKKyRUQyBmaWx0ZXIgYWRkIGRldiBldGgwIHBhcmVudCBmZmZmOiBwcm90b2NvbCBpcCBwcmlvIDEwIHUzMiBcCittYXRjaCB1MzIgMCAwIGZsb3dpZCAxOjEgXAorYWN0aW9uIGlwdCAtaiBNQVJLIC0tc2V0LW1hcmsgMSBcCithY3Rpb24gbWlycmVkIGVncmVzcyByZWRpcmVjdCBkZXYgaWZiMAorCistLS0tLS0tLQorCisKK1J1biBBIExpdHRsZSB0ZXN0OgorCitmcm9tIGFub3RoZXIgbWFjaGluZSBwaW5nIHNvIHRoYXQgeW91IGhhdmUgcGFja2V0cyBnb2luZyBpbnRvIHRoZSBib3g6CistLS0tLQorW3Jvb3RAanpueSBhY3Rpb24tdGVzdHNdIyBwaW5nIDEwLjIyCitQSU5HIDEwLjIyICgxMC4wLjAuMjIpOiA1NiBkYXRhIGJ5dGVzCis2NCBieXRlcyBmcm9tIDEwLjAuMC4yMjogaWNtcF9zZXE9MCB0dGw9NjQgdGltZT0yLjggbXMKKzY0IGJ5dGVzIGZyb20gMTAuMC4wLjIyOiBpY21wX3NlcT0xIHR0bD02NCB0aW1lPTAuNiBtcworNjQgYnl0ZXMgZnJvbSAxMC4wLjAuMjI6IGljbXBfc2VxPTIgdHRsPTY0IHRpbWU9MC42IG1zCisKKy0tLSAxMC4yMiBwaW5nIHN0YXRpc3RpY3MgLS0tCiszIHBhY2tldHMgdHJhbnNtaXR0ZWQsIDMgcGFja2V0cyByZWNlaXZlZCwgMCUgcGFja2V0IGxvc3MKK3JvdW5kLXRyaXAgbWluL2F2Zy9tYXggPSAwLjYvMS4zLzIuOCBtcworW3Jvb3RAanpueSBhY3Rpb24tdGVzdHNdIyAKKy0tLS0tCitOb3cgbG9vayBhdCBzb21lIHN0YXRzOgorCistLS0KK1tyb290QGptYW5kcmFrZV06fiMgJFRDIC1zIGZpbHRlciBzaG93IHBhcmVudCBmZmZmOiBkZXYgZXRoMAorZmlsdGVyIHByb3RvY29sIGlwIHByZWYgMTAgdTMyIAorZmlsdGVyIHByb3RvY29sIGlwIHByZWYgMTAgdTMyIGZoIDgwMDogaHQgZGl2aXNvciAxIAorZmlsdGVyIHByb3RvY29sIGlwIHByZWYgMTAgdTMyIGZoIDgwMDo6ODAwIG9yZGVyIDIwNDgga2V5IGh0IDgwMCBia3QgMCBmbG93aWQgMToxIAorICBtYXRjaCAwMDAwMDAwMC8wMDAwMDAwMCBhdCAwCisgICAgICAgIGFjdGlvbiBvcmRlciAxOiB0YWJsZW5hbWU6IG1hbmdsZSAgaG9vazogTkZfSVBfUFJFX1JPVVRJTkcgCisgICAgICAgIHRhcmdldCBNQVJLIHNldCAweDEgIAorICAgICAgICBpbmRleCAxIHJlZiAxIGJpbmQgMSBpbnN0YWxsZWQgNDE5NXNlYyAgdXNlZCAyN3NlYyAKKyAgICAgICAgIFNlbnQgMjUyIGJ5dGVzIDMgcGt0cyAoZHJvcHBlZCAwLCBvdmVybGltaXRzIDApIAorCisgICAgICAgIGFjdGlvbiBvcmRlciAyOiBtaXJyZWQgKEVncmVzcyBSZWRpcmVjdCB0byBkZXZpY2UgaWZiMCkgc3RvbGVuCisgICAgICAgIGluZGV4IDEgcmVmIDEgYmluZCAxIGluc3RhbGxlZCAxNjUgc2VjIHVzZWQgMjcgc2VjCisgICAgICAgICBTZW50IDI1MiBieXRlcyAzIHBrdHMgKGRyb3BwZWQgMCwgb3ZlcmxpbWl0cyAwKSAKKworW3Jvb3RAam1hbmRyYWtlXTp+IyAkVEMgLXMgcWRpc2MKK3FkaXNjIHNmcSAzMDogZGV2IGlmYjAgbGltaXQgMTI4cCBxdWFudHVtIDE1MTRiIAorIFNlbnQgMCBieXRlcyAwIHBrdHMgKGRyb3BwZWQgMCwgb3ZlcmxpbWl0cyAwKSAKK3FkaXNjIHRiZiAyMDogZGV2IGlmYjAgcmF0ZSAyMEtiaXQgYnVyc3QgMTU3NWIgbGF0IDIxNDcuNXMgCisgU2VudCAyMTAgYnl0ZXMgMyBwa3RzIChkcm9wcGVkIDAsIG92ZXJsaW1pdHMgMCkgCitxZGlzYyBzZnEgMTA6IGRldiBpZmIwIGxpbWl0IDEyOHAgcXVhbnR1bSAxNTE0YiAKKyBTZW50IDI5NCBieXRlcyAzIHBrdHMgKGRyb3BwZWQgMCwgb3ZlcmxpbWl0cyAwKSAKK3FkaXNjIHByaW8gMTogZGV2IGlmYjAgYmFuZHMgMyBwcmlvbWFwICAxIDIgMiAyIDEgMiAwIDAgMSAxIDEgMSAxIDEgMSAxCisgU2VudCA1MDQgYnl0ZXMgNiBwa3RzIChkcm9wcGVkIDAsIG92ZXJsaW1pdHMgMCkgCitxZGlzYyBpbmdyZXNzIGZmZmY6IGRldiBldGgwIC0tLS0tLS0tLS0tLS0tLS0gCisgU2VudCAzMDggYnl0ZXMgNSBwa3RzIChkcm9wcGVkIDAsIG92ZXJsaW1pdHMgMCkgCisKK1tyb290QGptYW5kcmFrZV06fiMgaWZjb25maWcgaWZiMAoraWZiMCAgICBMaW5rIGVuY2FwOkV0aGVybmV0ICBIV2FkZHIgMDA6MDA6MDA6MDA6MDA6MDAgIAorICAgICAgICAgIGluZXQ2IGFkZHI6IGZlODA6OjIwMDpmZjpmZTAwOjAvNjQgU2NvcGU6TGluaworICAgICAgICAgIFVQIEJST0FEQ0FTVCBSVU5OSU5HIE5PQVJQICBNVFU6MTUwMCAgTWV0cmljOjEKKyAgICAgICAgICBSWCBwYWNrZXRzOjYgZXJyb3JzOjAgZHJvcHBlZDozIG92ZXJydW5zOjAgZnJhbWU6MAorICAgICAgICAgIFRYIHBhY2tldHM6MyBlcnJvcnM6MCBkcm9wcGVkOjAgb3ZlcnJ1bnM6MCBjYXJyaWVyOjAKKyAgICAgICAgICBjb2xsaXNpb25zOjAgdHhxdWV1ZWxlbjozMiAKKyAgICAgICAgICBSWCBieXRlczo1MDQgKDUwNC4wIGIpICBUWCBieXRlczoyNTIgKDI1Mi4wIGIpCistLS0tLQorCitZb3Ugc2VuZCBpdCBhbnkgcGFja2V0IG5vdCBvcmlnaW5hdGluZyBmcm9tIHRoZSBhY3Rpb25zIGl0IHdpbGwgZHJvcCB0aGVtLgorW0luIHRoaXMgY2FzZSB0aGUgdGhyZWUgZHJvcHBlZCBwYWNrZXRzIHdlcmUgaXB2NiBuZGlzY10uCisKK2NoZWVycywKK2phbWFsCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9kb2MvYWN0aW9ucy9taXJyZWQtdXNhZ2UgYi9pcHJvdXRlMi9kb2MvYWN0aW9ucy9taXJyZWQtdXNhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYyMmM0MwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2RvYy9hY3Rpb25zL21pcnJlZC11c2FnZQpAQCAtMCwwICsxLDE2NCBAQAorCitWZXJ5IGZ1bmt5IGFjdGlvbi4gSSBkbyBwbGFuIHRvIGFkZCB0byBhIGZldyBtb3JlIHRoaW5ncyB0byBpdAorVGhpcyBpcyB0aGUgYmFzaWMgc3R1ZmYuIElkZWEgYm9ycm93ZWQgZnJvbSB0aGUgd2F5IGV0aGVybmV0IHN3aXRjaGVzCittaXJyb3IgYW5kIHJlZGlyZWN0IHBhY2tldHMuIFRoZSBtYWluIGRpZmZlcmVuY2Ugd2l0aCBzYXkgYSB2YW5uaWxhCitldGhlcm5ldCBzd2l0Y2ggaXMgdGhhdCB5b3UgY2FuIHVzZSB1MzIgY2xhc3NpZmllciB0byBzZWxlY3QgYQorZmxvdyB0byBiZSBtaXJyb3JlZC4gSGlnaCBlbmQgc3dpdGNoZXMgdHlwaWNhbGx5IGNhbiBzZWxlY3QgYmFzZWQKK29uIG1vcmUgdGhhbiBqdXN0IGEgcG9ydCAoZWcgYSA1IHR1cGxlIGNsYXNzaWZpZXIpLiBUaGV5IG1heSBhbHNvIGJlCitjYXBhYmxlIG9mIHJlZGlyZWN0aW5nLgorCitVc2FnZTogCisKK21pcnJlZCA8RElSRUNUSU9OPiA8QUNUSU9OPiBbaW5kZXggSU5ERVhdIDxkZXYgREVWSUNFTkFNRT4gCit3aGVyZTogCitESVJFQ1RJT04gOj0gPGluZ3Jlc3MgfCBlZ3Jlc3M+CitBQ1RJT04gOj0gPG1pcnJvciB8IHJlZGlyZWN0PgorSU5ERVggaXMgdGhlIHNwZWNpZmljIHBvbGljeSBpbnN0YW5jZSBpZAorREVWSUNFTkFNRSBpcyB0aGUgZGV2aWNlbmFtZQorCitEaXJlY3Rpb246CistIEluZ3Jlc3MgaXMgbm90IHN1cHBvcnRlZCBhdCB0aGUgbW9tZW50LiBJdCB3aWxsIGJlIGluIHRoZQorZnV0dXJlIGFzIHdlbGwgYXMgbWlycm9yL3JlZGlyZWN0aW5nIHRvIGEgc29ja2V0LiAKKworQWN0aW9uOgorLSBNaXJyb3IgdGFrZXMgYSBjb3B5IG9mIHRoZSBwYWNrZXQgYW5kIHNlbmRzIGl0IHRvIHNwZWNpZmllZAorZGV2ICgicG9ydCIgaW4gZXRoZXJuZXQgc3dpdGNoL2JyaWRnaW5nIHRlcm1pbm9sb2d5KQorLSByZWRpcmVjdAorc3RlYWxzIHRoZSBwYWNrZXQgYW5kIHJlZGlyZWN0cyB0byBzcGVjaWZpZWQgZGVzdGluYXRpb24gZGV2LgorCitXaGF0IE5PVCB0byBkbyBpZiB5b3UgZG9udCB3YW50IHlvdXIgbWFjaGluZSB0byBjcmFzaDoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitEbyBub3QgY3JlYXRlIGxvb3BzISAKK0xvb3BzIGFyZSBub3QgaGFyZCB0byBjcmVhdGUgaW4gdGhlIGVncmVzcyBxZGlzY3MuCisKK0hlcmUgYXJlIHNpbXBsZSBydWxlcyB0byBmb2xsb3cgaWYgeW91IGRvbnQgd2FudCB0byBnZXQKK2h1cnQ6CitBKSBEbyBub3QgaGF2ZSB0aGUgc2FtZSBwYWNrZXQgZ28gdG8gc2FtZSBuZXRkZXZpY2UgdHdpY2UKK2luIGEgc2luZ2xlIGdyYXBoIG9mIHBvbGljaWVzLiBZb3VyIG1hY2hpbmUgd2lsbCBqdXN0IGhhbmchCitUaGlzIGlzIGRlc2lnbiBpbnRlbnQgX25vdCBhIGJ1Z18gdG8gdGVhY2ggeW91IHNvbWUgbGVzc29ucy4gCisKK0luIHRoZSBmdXR1cmUgaWYgdGhlcmUgYXJlIGVhc3kgd2F5cyB0byBkbyB0aGlzIGluIHRoZSBrZXJuZWwKK3dpdGhvdXQgYWZmZWN0aW5nIG90aGVyIHBhY2tldHMgbm90IGludGVyZXN0ZWQgaW4gdGhpcyBmZWF0dXJlCitJIHdpbGwgYWRkIHRoZW0uIEF0IHRoZSBtb21lbnQgdGhhdCBpcyBub3QgY2xlYXIuCisKK1NvbWUgZXhhbXBsZXMgb2YgYmFkIHRoaW5ncyBOT1QgdG8gZG86CisxKSByZWRpcmVjdGluZyBldGgwIHRvIGV0aDAKKzIpIGV0aDAtPmV0aDEtPiBldGgwCiszKSBldGgwLT5sby0+IGV0aDEtPiBldGgwCisKK0IpIERvIG5vdCByZWRpcmVjdCBmcm9tIG9uZSBJRkIgZGV2aWNlIHRvIGFub3RoZXIuCitSZW1lbWJlciB0aGF0IElGQiBpcyBhIHZlcnkgc3BlY2lhbGl6ZWQgY2FzZSBvZiBwYWNrZXQgcmVkaXJlY3RpbmcKK2RldmljZS4gSW5zdGVhZCBvZiByZWRpcmVjdGluZyBpdCBwdXRzIHBhY2tldHMgYXQgdGhlIGV4YWN0IHNwb3QKK29uIHRoZSBzdGFjayBpdCBmb3VuZCB0aGVtIGZyb20uCitSZWRpcmVjdGluZyBmcm9tIGlmYlgtPmlmYlkgd2lsbCBhY3R1YWxseSBub3QgY3Jhc2ggeW91ciBtYWNoaW5lIGJ1dCB5b3VyIAorcGFja2V0cyB3aWxsIGFsbCBiZSBkcm9wcGVkICh0aGlzIGlzIG11Y2ggc2ltcGxlciB0byBkZXRlY3QKK2FuZCByZXNvbHZlIGFuZCBpcyBvbmx5IGFmZmVjdGluZyB1c2VycyBvZiBpZmIgYXMgb3Bwb3NlZCB0byB0aGUKK3dob2xlIHN0YWNrKS4KKworSW4gdGhlIGNhc2Ugb2YgQSkgdGhlIHByb2JsZW0gaGFzIHRvIGRvIHdpdGggYSByZWN1cnNpdmUgY29udGVudGlvbgorZm9yIHRoZSBkZXZpY2VzIHF1ZXVlIGxvY2sgYW5kIGluIHRoZSBzZWNvbmQgY2FzZSBmb3IgdGhlIHRyYW5zbWl0IGxvY2suCisKK1NvbWUgZXhhbXBsZXM6CistLS0tLS0tLS0tLS0tCisKKzEpIE1pcnJvciBhbGwgcGFja2V0cyBhcnJpdmluZyBvbiBldGgwIHRvIGJlIHNlbnQgb3V0IG9uIGV0aDEuCitZb3UgbWF5IGhhdmUgYSBzbmlmZmVyIG9yIHNvbWUgYWNjb3VudGluZyBib3ggaG9va2VkIHVwIG9uIGV0aDEuCisgCistLS0KK3RjIHFkaXNjIGFkZCBkZXYgZXRoMCBpbmdyZXNzCit0YyBmaWx0ZXIgYWRkIGRldiBldGgwIHBhcmVudCBmZmZmOiBwcm90b2NvbCBpcCBwcmlvIDEwIHUzMiBcCittYXRjaCB1MzIgMCAwIGZsb3dpZCAxOjIgYWN0aW9uIG1pcnJlZCBlZ3Jlc3MgbWlycm9yIGRldiBldGgxCistLS0KKworSWYgeW91IHJlcGxhY2UgIm1pcnJvciIgd2l0aCAicmVkaXJlY3QiIHRoZW4gbm90IGEgY29weSBidXQgcmF0aGVyCit0aGUgb3JpZ2luYWwgcGFja2V0IGlzIHNlbnQgdG8gZXRoMS4KKworMikgSG9zdCBBIGlzIGhvb2tlZCAgdXAgdG8gdXMgb24gZXRoMAorCisjIHJlZGlyZWN0IGFsbCBwYWNrZXRzIGFycml2aW5nIG9uIGluZ3Jlc3Mgb2YgbG8gdG8gZXRoMAorLS0tCit0YyBxZGlzYyBhZGQgZGV2IGxvIGluZ3Jlc3MKK3RjIGZpbHRlciBhZGQgZGV2IGxvIHBhcmVudCBmZmZmOiBwcm90b2NvbCBpcCBwcmlvIDEwIHUzMiBcCittYXRjaCB1MzIgMCAwIGZsb3dpZCAxOjIgYWN0aW9uIG1pcnJlZCBlZ3Jlc3MgcmVkaXJlY3QgZGV2IGV0aDAKKy0tLQorCitPbiBob3N0IEEgc3RhcnQgYSB0Y3BkdW1wIG9uIGludGVyZmFjZSBjb25uZWN0aW5nIHRvIHVzLgorCitvbiBvdXIgaG9zdCBwaW5nIC1jIDIgMTI3LjAuMC4xCisKK1Bpbmcgd291bGQgZmFpbCBzaW5jZSBhbGwgcGFja2V0cyBhcmUgaGVhZGluZyBvdXQgZXRoMAordGNwdWRtcCBvbiBob3N0IEEgd291bGQgc2hvdyB0aGVtCisKK2lmIHlvdSBzdWJzdGl0dXRlIHRoZSByZWRpcmVjdCB3aXRoIG1pcnJvciBhYm92ZSBhcyBpbjoKK3RjIGZpbHRlciBhZGQgZGV2IGxvIHBhcmVudCBmZmZmOiBwcm90b2NvbCBpcCBwcmlvIDEwIHUzMiBcCittYXRjaCB1MzIgMCAwIGZsb3dpZCAxOjIgYWN0aW9uIG1pcnJlZCBlZ3Jlc3MgbWlycm9yIGRldiBldGgwCisKK1RoZW4geW91IHNob3VsZCBzZWUgdGhlIHBhY2tldHMgb24gYm90aCBob3N0IEEgYW5kIHRoZSBsb2NhbAorc3RhY2sgKGkuZSBwaW5nIHdvdWxkIHdvcmspLgorCiszKSBFdmVuIG1vcmUgZnVua3kgZXhhbXBsZToKKworIworI2FsbG93IDEgb3V0IDEwIHBhY2tldHMgb24gaW5ncmVzcyBvZiBsbyB0byByYW5kb21seSBtYWtlIGl0IHRvIHRoZSAKKyMgaG9zdCBBIChSYW5kb21uZXNzIHVzZXMgdGhlIG5ldHJhbmQgZ2VuZXJhdG9yKQorIworLS0tCit0YyBmaWx0ZXIgYWRkIGRldiBsbyBwYXJlbnQgZmZmZjogcHJvdG9jb2wgaXAgcHJpbyAxMCB1MzIgXAorbWF0Y2ggdTMyIDAgMCBmbG93aWQgMToyIFwKK2FjdGlvbiBkcm9wIHJhbmRvbSBkZXRlcm0gb2sgMTBcCithY3Rpb24gbWlycmVkIGVncmVzcyBtaXJyb3IgZGV2IGV0aDAKKy0tLQorCis0KQorIyBmb3IgcGFja2V0cyBmcm9tIDEwLjAuMC45IGdvaW5nIG91dCBvbiBldGgwIChjb3VsZCBiZSBsb2NhbCAKKyMgSVAgb3Igc29tZXRoaW5nICMgd2UgYXJlIGZvcndhcmRpbmcpIC0gCisjIGlmIGV4Y2VlZGluZyBhIDEwMEticHMgcmF0ZSwgdGhlbiByZWRpcmVjdCB0byBldGgxIAorIworCistLS0KK3RjIHFkaXNjIGFkZCBkZXYgZXRoMCBoYW5kbGUgMTowIHJvb3QgcHJpbwordGMgZmlsdGVyIGFkZCBkZXYgZXRoMCBwYXJlbnQgMTowIHByb3RvY29sIGlwIHByaW8gNiB1MzIgXAorbWF0Y2ggaXAgc3JjIDEwLjAuMC45LzMyIGZsb3dpZCAxOjE2IFwKK2FjdGlvbiBwb2xpY2UgcmF0ZSAxMDBrYml0IGJ1cnN0IDkwayBvayBcCithY3Rpb24gbWlycmVkIGVncmVzcyBtaXJyb3IgZGV2IGV0aDEKKy0tLQorCitBIG1vcmUgaW50ZXJlc3RpbmcgZXhhbXBsZSBpcyB3aGVuIHlvdSBtaXJyb3IgZmxvd3MgdG8gYSBkdW1teSBkZXZpY2UKK3NvIHlvdSBjb3VsZCB0Y3BkdW1wIHRoZW0gKGR1bW15IGJ5IGRlZmF1bHRzIGRyb3BzIGFsbCBwYWNrZXRzIGl0IHNlZXMpLgorVGhpcyBpcyBhIHZlcnkgdXNlZnVsIGRlYnVnIGZlYXR1cmUuCisKK0xldHMgc2F5IHlvdSBhcmUgcG9saWNpbmcgcGFja2V0cyBmcm9tIGFsaWFzIDE5Mi4xNjguMjAwLjIwMC8zMgoreW91IGRvbnQgd2FudCB0aG9zZSB0byBleGNlZWQgMTAwa2JwcyBnb2luZyBvdXQuCisKKy0tLQordGMgcWRpc2MgYWRkIGRldiBldGgwIGhhbmRsZSAxOjAgcm9vdCBwcmlvCit0YyBmaWx0ZXIgYWRkIGRldiBldGgwIHBhcmVudCAxOiBwcm90b2NvbCBpcCBwcmlvIDEwIHUzMiBcCittYXRjaCBpcCBzcmMgMTkyLjE2OC4yMDAuMjAwLzMyIGZsb3dpZCAxOjIgXAorYWN0aW9uIHBvbGljZSByYXRlIDEwMGtiaXQgYnVyc3QgOTBrIGRyb3AKKy0tLQorCitJZiB5b3UgcnVuIHRjcGR1bXAgb24gZXRoMCB5b3Ugd2lsbCBzZWUgYWxsIHBhY2tldHMgZ29pbmcgb3V0Cit3aXRoIHNyYyAxOTIuMTY4LjIwMC4yMDAvMzIgZHJvcHBlZCBvciBub3QgKHNpbmNlIHRjcGR1bXAgc2hvd3MKK2FsbCBwYWNrZXRzIGJlaW5nIGVncmVzc2VkKS4KK0V4dGVuZCB0aGUgcnVsZSBhIGxpdHRsZSB0byBzZWUgb25seSB0aGUgcGFja2V0cyBtYWtpbmcgaXQgb3V0LgorCistLS0KK3RjIHFkaXNjIGFkZCBkZXYgZXRoMCBoYW5kbGUgMTowIHJvb3QgcHJpbwordGMgZmlsdGVyIGFkZCBkZXYgZXRoMCBwYXJlbnQgMTogcHJvdG9jb2wgaXAgcHJpbyAxMCB1MzIgXAorbWF0Y2ggaXAgc3JjIDE5Mi4xNjguMjAwLjIwMC8zMiBmbG93aWQgMToyIFwKK2FjdGlvbiBwb2xpY2UgcmF0ZSAxMGtiaXQgYnVyc3QgOTBrIGRyb3AgXAorYWN0aW9uIG1pcnJlZCBlZ3Jlc3MgbWlycm9yIGRldiBkdW1teTAKKy0tLQorCitOb3cgZmlyZSB0Y3BkdW1wIG9uIGR1bW15MCB0byBzZWUgb25seSB0aG9zZSBwYWNrZXRzIC4uCit0Y3BkdW1wIC1uIC1pIGR1bW15MCAteCAtZSAtdAorCitFc3NlbnRpYWxseSBhIGdvb2QgZGVidWdnaW5nL2xvZ2dpbmcgaW50ZXJmYWNlIChzb3J0IG9mIGxpa2UKK0JTRHMgc3BlYWNpYWxpemVkIGxvZyBkZXZpY2UgZG9lcyB3aXRob3V0IG5lZWRpbmcgb25lKS4KKworSWYgeW91IHJlcGxhY2UgbWlycm9yIHdpdGggcmVkaXJlY3QsIHRob3NlIHBhY2tldHMgd2lsbCBiZQorYmxhY2tob2xlZCBhbmQgd2lsbCBuZXZlciBtYWtlIGl0IG91dC4gCisKK2NoZWVycywKK2phbWFsCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9kb2MvYXBpLWlwNi1mbG93bGFiZWxzLnRleCBiL2lwcm91dGUyL2RvYy9hcGktaXA2LWZsb3dsYWJlbHMudGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMzRlOTQKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9kb2MvYXBpLWlwNi1mbG93bGFiZWxzLnRleApAQCAtMCwwICsxLDQyOSBAQAorXGRvY3VtZW50c3R5bGVbMTJwdCx0d29zaWRlXXthcnRpY2xlfQorXGRlZlxUSVRMRXtJUHY2IEZsb3cgTGFiZWxzfQorXGlucHV0IHByZWFtYmxlCitcYmVnaW57Y2VudGVyfQorXExhcmdlXGJmIElQdjYgRmxvdyBMYWJlbHMgaW4gTGludXgtMi4yLgorXGVuZHtjZW50ZXJ9CisKKworXGJlZ2lue2NlbnRlcn0KK3sgXGxhcmdlIEFsZXhleX5OLn5LdXpuZXRzb3YgfSBcXAorXGVtIEluc3RpdHV0ZSBmb3IgTnVjbGVhciBSZXNlYXJjaCwgTW9zY293IFxcCitcdmVyYnxrdXpuZXRAbXMyLmluci5hYy5ydXwgXFwKK1xybSBBcHJpbCAxMSwgMTk5OQorXGVuZHtjZW50ZXJ9CisKK1x2c3BhY2V7NW1tfQorCitcdGFibGVvZmNvbnRlbnRzCisKK1xzZWN0aW9ue0ludHJvZHVjdGlvbi59CisKK0V2ZXJ5IElQdjYgcGFja2V0IGNhcnJpZXMgMjggYml0cyBvZiBmbG93IGluZm9ybWF0aW9uLiBSRkMyNDYwIHNwbGl0cwordGhlc2UgYml0cyB0byB0d28gZmllbGRzOiA4IGJpdHMgb2YgdHJhZmZpYyBjbGFzcyAob3IgRFMgZmllbGQsIGlmIHlvdQorcHJlZmVyIHRoaXMgdGVybSkgYW5kIDIwIGJpdHMgb2YgZmxvdyBsYWJlbC4gQ3VycmVudGx5IHRoZXJlIGV4aXN0CitubyB3ZWxsLWRlZmluZWQgQVBJIHRvIG1hbmFnZSBJUHY2IGZsb3cgaW5mb3JtYXRpb24uIEluIHRoaXMgZG9jdW1lbnQKK0kgZGVzY3JpYmUgYW4gYXR0ZW1wdCB0byBkZXNpZ24gdGhlIEFQSSBmb3IgTGludXgtMi4yIElQdjYgc3RhY2suCisKK1x2c2tpcCAxbW0KKworVGhlIEFQSSBtdXN0IHNvbHZlIHRoZSBmb2xsb3dpbmcgdGFza3M6CisKK1xiZWdpbntlbnVtZXJhdGV9CisKK1xpdGVtIFRvIGFsbG93IHVzZXIgdG8gc2V0IHRyYWZmaWMgY2xhc3MgYml0cy4KKworXGl0ZW0gVG8gYWxsb3cgdXNlciB0byByZWFkIHRyYWZmaWMgY2xhc3MgYml0cyBvZiByZWNlaXZlZCBwYWNrZXRzLgorVGhpcyBmZWF0dXJlIGlzIG5vdCBzbyB1c2VmdWwgYXMgdGhlIGZpcnN0IG9uZSwgaG93ZXZlciBpdCB3aWxsIGJlCituZWNlc3NhcnkgZi5lLlwgdG8gaW1wbGVtZW50IEVDTiBbUkZDMjQ4MV0gZm9yIGRhdGFncmFtIG9yaWVudGVkIHNlcnZpY2VzCitvciB0byBpbXBsZW1lbnQgcmVjZWl2ZXIgc2lkZSBvZiBTUlAgb3IgYW5vdGhlciBlbmQtdG8tZW5kIHByb3RvY29sCit1c2luZyB0cmFmZmljIGNsYXNzIGJpdHMuCisKK1xpdGVtIFRvIGFzc2lnbiBmbG93IGxhYmVscyB0byBwYWNrZXRzIHNlbnQgYnkgdXNlci4KKworXGl0ZW0gVG8gZ2V0IGZsb3cgbGFiZWxzIG9mIHJlY2VpdmVkIHBhY2tldHMuIEkgZG8gbm90IGtub3cKK2FueSBhcHBsaWNhdGlvbnMgb2YgdGhpcyBmZWF0dXJlLCBidXQgaXQgaXMgcG9zc2libGUgdGhhdCByZWNlaXZlciB3aWxsCit3YW50IHRvIHVzZSBmbG93IGxhYmVscyB0byBkaXN0aW5ndWlzaCBzdWItZmxvd3MuCisKK1xpdGVtIFRvIGFsbG9jYXRlIGZsb3cgbGFiZWxzIGluIHRoZSB3YXksIGNvbXBsaWFudCB0byBSRkMyNDYwLiBOYW1lbHk6CisKK1xiZWdpbntpdGVtaXplfQorXGl0ZW0KK0Zsb3cgbGFiZWxzIG11c3QgYmUgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIChwc2V1ZG8tKXJhbmRvbSBudW1iZXJzLAorc28gdGhhdCBhbnkgc3Vic2V0IG9mIDIwIGJpdHMgY2FuIGJlIHVzZWQgYXMgaGFzaCBrZXkuCisKK1xpdGVtCitGbG93cyB3aXRoIGNvaW5jaWRpbmcgc291cmNlIGFkZHJlc3MgYW5kIGZsb3cgbGFiZWwgbXVzdCBoYXZlIGlkZW50aWNhbAorZGVzdGluYXRpb24gYWRkcmVzcyBhbmQgbm90LWZyYWdtZW50YWJsZSBleHRlbnNpb25zIGhlYWRlcnMgKGkuZS5cIAoraG9wIGJ5IGhvcCBvcHRpb25zIGFuZCBhbGwgdGhlIGhlYWRlcnMgdXAgdG8gYW5kIGluY2x1ZGluZyByb3V0aW5nIGhlYWRlciwKK2lmIGl0IGlzIHByZXNlbnQuKQorCitcYmVnaW57TkJ9CitUaGVyZSBpcyBhIGhvbGUgaW4gc3BlY3M6IHNvbWUgaG9wLWJ5LWhvcCBvcHRpb25zIGNhbiBiZQorZGVmaW5lZCBvbmx5IG9uIHBlci1wYWNrZXQgYmFzZSAoZi5lLlwgIGp1bWJvIHBheWxvYWQgb3B0aW9uKS4KK0Vzc2VudGlhbGx5LCBpdCBtZWFucyB0aGF0IHN1Y2ggb3B0aW9ucyBjYW5ub3QgcHJlc2VudCBpbiBwYWNrZXRzCit3aXRoIGZsb3cgbGFiZWxzLgorXGVuZHtOQn0KK1xiZWdpbntOQn0KK05CIG5vdGVzIGhlcmUgYW5kIGJlbG93IHJlZmxlY3Qgb25seSBteSBwZXJzb25hbCBvcGluaW9uLAordGhleSBzaG91bGQgYmUgcmVhZCB3aXRoIHNtaWxlIG9yIHNob3VsZCBub3QgYmUgcmVhZCBhdCBhbGwgOi0pLgorXGVuZHtOQn0KKworCitcaXRlbQorRmxvdyBsYWJlbHMgaGF2ZSBmaW5pdGUgbGlmZXRpbWUgYW5kIHNvdXJjZSBpcyBub3QgYWxsb3dlZCB0byByZXVzZQorZmxvdyBsYWJlbCBmb3IgYW5vdGhlciBmbG93IHdpdGhpbiB0aGUgbWF4aW1hbCBsaWZldGltZSBoYXMgZXhwaXJlZCwKK3NvIHRoYXQgaW50ZXJtZWRpYXRlIG5vZGVzIHdpbGwgYmUgYWJsZSB0byBpbnZhbGlkYXRlIGZsb3cgc3RhdGUgYmVmb3JlCit0aGUgbGFiZWwgaXMgdGFrZW4gb3ZlciBieSBhbm90aGVyIGZsb3cuCitGbG93IHN0YXRlLCBpbmNsdWRpbmcgbGlmZXRpbWUsIGlzIHByb3BhZ2F0ZWQgYWxvbmcgZGF0YWdyYW0gcGF0aAorYnkgc29tZSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBtZXRob2RzCisoZi5lLlwgaW4gUlNWUCBQQVRIIG1lc3NhZ2VzIG9yIGluIHNvbWUgaG9wLWJ5LWhvcCBvcHRpb24pLgorCisKK1xlbmR7aXRlbWl6ZX0KKworXGVuZHtlbnVtZXJhdGV9CisKK1xzZWN0aW9ue1NlbmRpbmcvcmVjZWl2aW5nIGZsb3cgaW5mb3JtYXRpb24ufQorCitccGFyYWdyYXBoe0Rpc2N1c3Npb24ufQorXGFkZGNvbnRlbnRzbGluZXt0b2N9e3N1YnNlY3Rpb259e0Rpc2N1c3Npb259CitJdCB3YXMgcHJvcG9zZWQgKFdoZXJlPyBJIGRvIG5vdCByZW1lbWJlciBhbnkgZXhwbGljaXQgc3RhdGVtZW50KQordG8gc29sdmUgdGhlIGZpcnN0IGZvdXIgdGFza3MgdXNpbmcKK1x2ZXJifHNpbjZfZmxvd2luZm98IGZpZWxkIGFkZGVkIHRvIFx2ZXJifHN0cnVjdHwgXHZlcmJ8c29ja2FkZHJfaW42fAorKHNlZSBSRkMyNTUzKS4KKworXGJlZ2lue05CfQorCVRoaXMgbWV0aG9kIGlzIGRpZmZpY3VsdCB0byBjb25zaWRlciBhcyByZWFzb25hYmxlLCBiZWNhdXNlIGl0CisJcHV0cyBhZGRpdGlvbmFsIG92ZXJoZWFkIHRvIGFsbCB0aGUgc2VydmljZXMsIGRlc3BpdGUgb2Ygb25seQorCXZlcnkgc21hbGwgc3Vic2V0IG9mIHRoZW0gKG5vbmUsIHRvIGJlIG1vcmUgZXhhY3QpIHJlYWxseSB1c2UgaXQuCisJSXQgY29udHJhZGljdHMgYm90aCB0byBJRVRGIHNwaXJpdCBhbmQgdGhlIGxldHRlci4gQmVmb3JlIFJGQzI1NTMKKwlvbmUganVzdGlmaWNhdGlvbiBleGlzdGVkLCBJUHY2IGFkZHJlc3MgYWxpZ25tZW50IGxlZnQgNCBieXRlCisJaG9sZSBpbiBcdmVyYnxzb2NrYWRkcl9pbjZ8IGluIGFueSBjYXNlLiBOb3cgaXQgaGFzIG5vIGp1c3RpZmljYXRpb24uCitcZW5ke05CfQorCitXZSBoYXZlIHR3byBwcm9ibGVtcyB3aXRoIHRoaXMgbWV0aG9kLiBUaGUgZmlyc3Qgb25lIGlzIGNvbW1vbiBmb3IgYWxsIE9TZXM6CitpZiBcdmVyYnxyZWN2bXNnKCl8IGluaXRpYWxpemVzIFx2ZXJifHNpbjZfZmxvd2luZm98IHRvIGZsb3cgaW5mbworb2YgcmVjZWl2ZWQgcGFja2V0LCB3ZSBsb29zZSBvbmUgdmVyeSBpbXBvcnRhbnQgcHJvcGVydHkgb2YgQlNEIHNvY2tldCBBUEksCituYW1lbHksIHdlIGFyZSBub3QgYWxsb3dlZCB0byB1c2UgcmVjZWl2ZWQgYWRkcmVzcyBmb3IgcmVwbHkgZGlyZWN0bHkKK2FuZCBoYXZlIHRvIG1hbmdsZSBpdCwgZXZlbiBpZiB3ZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gZmxvd2luZm8gc3VidGxldGllcy4KKworXGJlZ2lue05CfQorCVJGQzI1NTMgYWRkcyBuZXcgcmVxdWlyZW1lbnQ6IHRvIGNsZWFyIFx2ZXJifHNpbjZfZmxvd2luZm98LgorCUNlcnRhaW5seSwgaXQgaXMgbm90IHNvbHV0aW9uIGJ1dCByYXRoZXIgYXR0ZW1wdCB0byBmb3JjZSBhcHBsaWNhdGlvbnMKKwl0byBtYWtlIHVubmVjZXNzYXJ5IHdvcmsuIFdlbGwsIGFzIHVzdWFsbHksIG9uZSBtaXN0YWtlIGluIGRlc2lnbgorCWlzIGZvbGxvd2VkIGJ5IGF0dGVtcHRzCXRvIHBhdGNoIHRoZSBob2xlIGFuZCBtb3JlIG1pc3Rha2VzLi4uCitcZW5ke05CfQorCitBbm90aGVyIHByb2JsZW0gaXMgTGludXggc3BlY2lmaWMuIEhpc3RvcmljYWxseSBMaW51eCBJUHY2IGRpZCBub3QKK2luaXRpYWxpemUgXHZlcmJ8c2luNl9mbG93aW5mb3wgYXQgYWxsLCBzbyB0aGF0LCBpZiBrZXJuZWwgZG9lcyBub3QKK3N1cHBvcnQgZmxvdyBsYWJlbHMsIHRoaXMgZmllbGQgaXMgbm90IHplcm8sIGJ1dCBhIHJhbmRvbSBudW1iZXIuCitTb21lIGFwcGxpY2F0aW9ucyBhbHNvIGRpZCBub3QgdGFrZSBjYXJlIGFib3V0IGl0LiAKKworXGJlZ2lue05CfQorRm9sbG93aW5nIFJGQzI1NTMgc3VjaCBhcHBsaWNhdGlvbnMgY2FuIGJlIGNvbnNpZGVyZWQgYXMgYnJva2VuLAorYnV0IEkgc3RpbGwgdGhpbmsgdGhhdCB0aGV5IGFyZSByaWdodDogY2xlYXJpbmcgYWxsIHRoZSBhZGRyZXNzCitiZWZvcmUgZmlsbGluZyBrbm93biBmaWVsZHMgaXMgcm9idXN0IGJ1dCBzdHVwaWQgc29sdXRpb24uCitVc2VsZXNzIHdhc3RpbmcgQ1BVIGN5Y2xlcyBhbmQKK21lbW9yeSBiYW5kd2lkdGggaXMgbm90IGEgZ29vZCBpZGVhLiBTdWNoIHBhdGNoZXMgYXJlIGFjY2VwdGFibGUKK2FzIHRlbXBvcmFyeSBoYWNrcywgYnV0IG5vdCBhcyBzdGFuZGFyZCBvZiB0aGUgZnV0dXJlLgorXGVuZHtOQn0KKworCitccGFyYWdyYXBoe0ltcGxlbWVudGF0aW9uLn0KK1xhZGRjb250ZW50c2xpbmV7dG9jfXtzdWJzZWN0aW9ufXtJbXBsZW1lbnRhdGlvbn0KK0J5IGRlZmF1bHQgTGludXggSVB2NiBkb2VzIG5vdCByZWFkIFx2ZXJifHNpbjZfZmxvd2luZm98IGZpZWxkCithc3N1bWluZyB0aGF0IGNvbW1vbiBhcHBsaWNhdGlvbnMgYXJlIG5vdCBvYmxpZ2VkIHRvIGluaXRpYWxpemUgaXQKK2FuZCBhcmUgcGVybWl0dGVkIHRvIGNvbnNpZGVyIGl0IGFzIHB1cmUgYWxpZ25tZW50IHBhZGRpbmcuCitJbiBvcmRlciB0byB0ZWxsIGtlcm5lbCB0aGF0IGFwcGxpY2F0aW9uCitpcyBhd2FyZSBvZiB0aGlzIGZpZWxkLCBpdCBpcyBuZWNlc3NhcnkgdG8gc2V0IHNvY2tldCBvcHRpb24KK1x2ZXJifElQVjZfRkxPV0lORk9fU0VORHwuCisKK1xiZWdpbnt2ZXJiYXRpbX0KKyAgaW50IG9uID0gMTsKKyAgc2V0c29ja29wdChzb2NrLCBTT0xfSVBWNiwgSVBWNl9GTE9XSU5GT19TRU5ELAorICAgICAgICAgICAgICh2b2lkKikmb24sIHNpemVvZihvbikpOworXGVuZHt2ZXJiYXRpbX0KKworTGludXgga2VybmVsIG5ldmVyIGZpbGxzIFx2ZXJifHNpbjZfZmxvd2luZm98IGZpZWxkLCB3aGVuIHBhc3NpbmcKK21lc3NhZ2UgdG8gdXNlciBzcGFjZSwgdGhvdWdoIHRoZSBrZXJuZWxzIHdoaWNoIHN1cHBvcnQgZmxvdyBsYWJlbHMKK2luaXRpYWxpemUgaXQgdG8gemVyby4gSWYgdXNlciB3YW50cyB0byBnZXQgcmVjZWl2ZWQgZmxvd2luZm8sIGhlCit3aWxsIHNldCBvcHRpb24gXHZlcmJ8SVBWNl9GTE9XSU5GT3wgYW5kIGFmdGVyIHRoaXMgaGUgd2lsbCByZWNlaXZlCitmbG93aW5mbyBhcyBhbmNpbGxhcnkgZGF0YSBvYmplY3Qgb2YgdHlwZSBcdmVyYnxJUFY2X0ZMT1dJTkZPfAorKGNmLlwgUkZDMjI5MikuCisKK1xiZWdpbnt2ZXJiYXRpbX0KKyAgaW50IG9uID0gMTsKKyAgc2V0c29ja29wdChzb2NrLCBTT0xfSVBWNiwgSVBWNl9GTE9XSU5GTywgKHZvaWQqKSZvbiwgc2l6ZW9mKG9uKSk7CitcZW5ke3ZlcmJhdGltfQorCitGbG93aW5mbyByZWNlaXZlZCBhbmQgbGF0Y2hlZCBieSBhIGNvbm5lY3RlZCBUQ1Agc29ja2V0IGFsc28gbWF5IGJlIGZldGNoZWQKK3dpdGggXHZlcmJ8Z2V0c29ja29wdCgpfCBcdmVyYnxJUFY2X1BLVE9QVElPTlN8IHRvZ2V0aGVyIHdpdGgKK2Fub3RoZXIgb3B0aW9uYWwgaW5mb3JtYXRpb24uCisKK0Jlc2lkZXMgdGhhdCwgaW4gdGhlIHNwaXJpdCBvZiBSRkMyMjkyIHRoZSBvcHRpb24gXHZlcmJ8SVBWNl9GTE9XSU5GT3wKK21heSBiZSB1c2VkIGFzIGFsdGVybmF0aXZlIHdheSB0byBzZW5kIGZsb3dpbmZvIHdpdGggXHZlcmJ8c2VuZG1zZygpfCBvcgordG8gbGF0Y2ggaXQgd2l0aCBcdmVyYnxJUFY2X1BLVE9QVElPTlN8LgorCitccGFyYWdyYXBoe05vdGUgYWJvdXQgSVB2NiBvcHRpb25zIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzLn0KK1xhZGRjb250ZW50c2xpbmV7dG9jfXtzdWJzZWN0aW9ufXtJUHY2IG9wdGlvbnMgYW5kIGRlc3RpbmF0aW9uIGFkZHJlc3N9CitJZiBcdmVyYnxzaW42X2Zsb3dpbmZvfCBkb2VzIGNvbnRhaW4gbm90IHplcm8gZmxvdyBsYWJlbCwKK2Rlc3RpbmF0aW9uIGFkZHJlc3MgaW4gXHZlcmJ8c2luNl9hZGRyfCBhbmQgbm9uLWZyYWdtZW50YWJsZQorZXh0ZW5zaW9uIGhlYWRlcnMgYXJlIGlnbm9yZWQuIEluc3RlYWQsIGtlcm5lbCB1c2VzIHRoZSB2YWx1ZXMKK2NhY2hlZCBhdCBmbG93IHNldHVwIChzZWUgYmVsb3cpLiBIb3dldmVyLCBmb3IgY29ubmVjdGVkIHNvY2tldHMKK2tlcm5lbCBwcmVmZXJzIHRoZSB2YWx1ZXMgc2V0IGF0IGNvbm5lY3Rpb24gdGltZS4KKworXHBhcmFncmFwaHtFeGFtcGxlLn0KK1xhZGRjb250ZW50c2xpbmV7dG9jfXtzdWJzZWN0aW9ufXtFeGFtcGxlfQorQWZ0ZXIgc2V0dGluZyBzb2NrZXQgb3B0aW9uIFx2ZXJifElQVjZfRkxPV0lORk98CitmbG93bGFiZWwgYW5kIERTIGZpZWxkIGFyZSByZWNlaXZlZCBhcyBhbmNpbGxhcnkgZGF0YSBvYmplY3QKK29mIHR5cGUgXHZlcmJ8SVBWNl9GTE9XSU5GT3wgYW5kIGxldmVsIFx2ZXJifFNPTF9JUFY2fC4KK0luIHRoZSBjYXNlcyB3aGVuIGl0IGlzIGNvbnZlbmllbnQgdG8gdXNlIFx2ZXJifHJlY3Zmcm9tKDIpfCwKK2l0IGlzIHBvc3NpYmxlIHRvIHJlcGxhY2UgbGlicmFyeSB2YXJpYW50IHdpdGggeW91ciBvd24gb25lLAorc29ydCBvZjoKKworXGJlZ2lue3ZlcmJhdGltfQorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luNi5oPgorCitzaXplX3QgcmVjdmZyb20oaW50IGZkLCBjaGFyICpidWYsIHNpemVfdCBsZW4sIGludCBmbGFncywKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCAqYWRkcmxlbikKK3sKKyAgc2l6ZV90IGNjOworICBjaGFyIGNidWZbMTI4XTsKKyAgc3RydWN0IGNtc2doZHIgKmM7CisgIHN0cnVjdCBpb3ZlYyBpb3YgPSB7IGJ1ZiwgbGVuIH07CisgIHN0cnVjdCBtc2doZHIgbXNnID0geyBhZGRyLCAqYWRkcmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZpb3YsICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgY2J1Ziwgc2l6ZW9mKGNidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgMCB9OworCisgIGNjID0gcmVjdm1zZyhmZCwgJm1zZywgZmxhZ3MpOworICBpZiAoY2MgPCAwKQorICAgIHJldHVybiBjYzsKKyAgKChzdHJ1Y3Qgc29ja2FkZHJfaW42KilhZGRyKS0+c2luNl9mbG93aW5mbyA9IDA7CisgICphZGRybGVuID0gbXNnLm1zZ19uYW1lbGVuOworICBmb3IgKGM9Q01TR19GSVJTVEhEUigmbXNnKTsgYzsgYyA9IENNU0dfTkVYVEhEUigmbXNnLCBjKSkgeworICAgIGlmIChjLT5jbXNnX2xldmVsICE9IFNPTF9JUFY2IHx8CisgICAgICBjLT5jbXNnX3R5cGUgIT0gSVBWNl9GTE9XSU5GTykKKyAgICAgICAgY29udGludWU7CisgICAgKChzdHJ1Y3Qgc29ja2FkZHJfaW42KilhZGRyKS0+c2luNl9mbG93aW5mbyA9ICooX191MzIqKUNNU0dfREFUQShjKTsKKyAgfQorICByZXR1cm4gY2M7Cit9CitcZW5ke3ZlcmJhdGltfQorCisKKworXHNlY3Rpb257RmxvdyBsYWJlbCBtYW5hZ2VtZW50Ln0KKworXHBhcmFncmFwaHtEaXNjdXNzaW9uLn0KK1xhZGRjb250ZW50c2xpbmV7dG9jfXtzdWJzZWN0aW9ufXtEaXNjdXNzaW9ufQorUmVxdWlyZW1lbnRzIG9mIFJGQzI0NjAgYXJlIHByZXR0eSB0b3VnaC4gUGFydGljdWxhcmx5LCBsaWZldGltZXMKK2xvbmdlciB0aGFuIGJvb3QgdGltZSByZXF1aXJlIHRvIHN0b3JlIGFsbG9jYXRlZCBsYWJlbHMgYXQgc3RhYmxlCitzdG9yYWdlLCBzbyB0aGF0IHRoZSBmdWxsIGltcGxlbWVudGF0aW9uIG5lY2Vzc2FyaWx5IGluY2x1ZGVzIHVzZXIgc3BhY2UgZmxvdworbGFiZWwgbWFuYWdlci4gVGhlcmUgYXJlIGF0IGxlYXN0IHRocmVlIGRpZmZlcmVudCBhcHByb2FjaGVzOgorCitcYmVnaW57ZW51bWVyYXRlfQorXGl0ZW0ge1xiZiBgYENvb3BlcmF0aXZlJycuIH0gV2UgY291bGQgbGVhdmUgZmxvdyBsYWJlbCBhbGxvY2F0aW9uIHdob2xseQordG8gdXNlciBzcGFjZS4gV2hlbiB1c2VyIG5lZWRzIGxhYmVsIGhlIHJlcXVlc3RzIG1hbmFnZXIgZGlyZWN0bHkuIFRoZSBhcHByb2FjaAoraXMgdmFsaWQsIGJ1dCBhcyBhbnkgYGBjb29wZXJhdGl2ZScnIGFwcHJvYWNoIGl0IHN1ZmZlcnMgb2Ygc2VjdXJpdHkgcHJvYmxlbXMuCisKK1xiZWdpbntOQn0KK09uZSBpZGVhIGlzIHRvIGRpc2FsbG93IG5vdCBwcml2aWxlZ2VkIHVzZXIgdG8gYWxsb2NhdGUgZmxvdworbGFiZWxzLCBidXQgaW5zdGVhZCB0byBwYXNzIHRoZSBzb2NrZXQgdG8gbWFuYWdlciB2aWEgXHZlcmJ8U0NNX1JJR0hUU3wKK2NvbnRyb2wgbWVzc2FnZSwgc28gdGhhdCBpdCB3aWxsIGFsbG9jYXRlIGxhYmVsIGFuZCBhc3NpZ24gaXQgdG8gc29ja2V0CitpdHNlbGYuIEhtbS4uLiB0aGUgaWRlYSBpcyBpbnRlcmVzdGluZy4KK1xlbmR7TkJ9CisKK1xpdGVtIHtcYmYgYGBJbmRpcmVjdCcnLn0gS2VybmVsIHJlZGlyZWN0cyByZXF1ZXN0cyB0byB1c2VyIGxldmVsIGRhZW1vbgorYW5kIGRvZXMgbm90IGluc3RhbGwgbGFiZWwgdW50aWwgdGhlIGRhZW1vbiBhY2tub3dsZWRnZWQgdGhlIHJlcXVlc3QuCitUaGUgYXBwcm9hY2ggaXMgdGhlIG1vc3QgcHJvbWlzaW5nLCBpdCBpcyBlc3BlY2lhbGx5IHBsZWFzYW50IHRvIHJlY29nbml6ZQorcGFyYWxsZWwgd2l0aCBJUHNlYyBBUEkgW1JGQzIzNjcsQ3JhaWddLiBBY3R1YWxseSwgaXQgbWF5IHNoYXJlIEFQSSB3aXRoCitJUHNlYy4KKworXGl0ZW0ge1xiZiBgYFN0dXBpZCcnLn0gVG8gYWxsb2NhdGUgbGFiZWxzIGluIGtlcm5lbCBzcGFjZS4gSXQgaXMgdGhlIHNpbXBsZXN0CittZXRob2QsIGJ1dCBpdCBzdWZmZXJzIG9mIHR3byBzZXJpb3VzIGZsYXdzOiB0aGUgZmlyc3QsCit3ZSBjYW5ub3QgbGVhc2UgbGFiZWxzIHdpdGggbGlmZXRpbWVzIGxvbmdlciB0aGFuIGJvb3QgdGltZSwgdGhlIHNlY29uZCwgCitpdCBpcyBzZW5zaXRpdmUgdG8gRG9TIGF0dGFja3MuIEtlcm5lbCBoYXZlIHRvIHJlbWVtYmVyIGFsbCB0aGUgb2Jzb2xldGUKK2xhYmVscyB1bnRpbCB0aGVpciBleHBpcmF0aW9uIGFuZCBtYWxpY2lvdXMgdXNlciBtYXkgZmFzdGx5IGVhdCBhbGwgdGhlCitmbG93IGxhYmVsIHNwYWNlLgorCitcZW5ke2VudW1lcmF0ZX0KKworQ2VydGFpbmx5LCBJIGNob29zZSB0aGUgbW9zdCBgYHN0dXBpZCcnIG1ldGhvZC4gSXQgaXMgdGhlIGNoZWFwZXN0IG9uZQorZm9yIGltcGxlbWVudG9yIChpLmUuXCBtZSksIGFuZCB0YWtpbmcgaW50byBhY2NvdW50IHRoYXQgZmxvdyBsYWJlbHMKK3N0aWxsIGhhdmUgbm8gc2VyaW91cyBhcHBsaWNhdGlvbnMgaXQgaXMgbm90IHVzZWZ1bCB0byB3b3JrIG9uIG1vcmUKK2FkdmFuY2VkIEFQSSwgZXNwZWNpYWxseSwgdGFraW5nIGludG8gYWNjb3VudCB0aGF0IGV2ZW50dWFsbHkgd2UKK3dpbGwgZ2V0IGl0IGZvciBubyBmZWUgdG9nZXRoZXIgd2l0aCBJUHNlYy4KKworCitccGFyYWdyYXBoe0ltcGxlbWVudGF0aW9uLn0KK1xhZGRjb250ZW50c2xpbmV7dG9jfXtzdWJzZWN0aW9ufXtJbXBsZW1lbnRhdGlvbn0KK1NvY2tldCBvcHRpb24gXHZlcmJ8SVBWNl9GTE9XTEFCRUxfTUdSfCBhbGxvd3MgdG8KK3JlcXVlc3QgZmxvdyBsYWJlbCBtYW5hZ2VyIHRvIGFsbG9jYXRlIG5ldyBmbG93IGxhYmVsLCB0byByZXVzZQorYWxyZWFkeSBhbGxvY2F0ZWQgb25lIG9yIHRvIGRlbGV0ZSBvbGQgZmxvdyBsYWJlbC4KK0l0cyBhcmd1bWVudCBpcyBcdmVyYnxzdHJ1Y3R8IFx2ZXJifGluNl9mbG93bGFiZWxfcmVxfDoKKworXGJlZ2lue3ZlcmJhdGltfQorc3RydWN0IGluNl9mbG93bGFiZWxfcmVxCit7CisgICAgICAgIHN0cnVjdCBpbjZfYWRkciBmbHJfZHN0OworICAgICAgICBfX3UzMiAgICAgICAgICAgZmxyX2xhYmVsOworICAgICAgICBfX3U4ICAgICAgICAgICAgZmxyX2FjdGlvbjsKKyAgICAgICAgX191OCAgICAgICAgICAgIGZscl9zaGFyZTsKKyAgICAgICAgX191MTYgICAgICAgICAgIGZscl9mbGFnczsKKyAgICAgICAgX191MTYgICAgICAgICAgIGZscl9leHBpcmVzOworICAgICAgICBfX3UxNiAgICAgICAgICAgZmxyX2xpbmdlcjsKKyAgICAgICAgX191MzIgICAgICAgICBfX2Zscl9yZXNlcnZlZDsKKyAgICAgICAgLyogT3B0aW9ucyBpbiBmb3JtYXQgb2YgSVBWNl9QS1RPUFRJT05TICovCit9OworXGVuZHt2ZXJiYXRpbX0KKworXGJlZ2lue2l0ZW1pemV9CisKK1xpdGVtIFx2ZXJifGRzdHwgaXMgSVB2NiBkZXN0aW5hdGlvbiBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGFiZWwuCisKK1xpdGVtIFx2ZXJifGxhYmVsfCBpcyBmbG93IGxhYmVsIHZhbHVlIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4gSWYgaXQgaXMgemVybywKK2tlcm5lbCB3aWxsIGFsbG9jYXRlIG5ldyBwc2V1ZG8tcmFuZG9tIG51bWJlci4gT3RoZXJ3aXNlLCBrZXJuZWwgd2lsbCB0cnkKK3RvIGxlYXNlIGZsb3cgbGFiZWwgb3JkZXJlZCBieSB1c2VyLiBJbiB0aGlzIGNhc2UsIGl0IGlzIHVzZXIgdGFzayB0byBwcm92aWRlCituZWNlc3NhcnkgZmxvdyBsYWJlbCByYW5kb21uZXNzLgorCitcaXRlbSBcdmVyYnxhY3Rpb258IGlzIHJlcXVlc3RlZCBvcGVyYXRpb24uIEN1cnJlbnRseSwgb25seSB0aHJlZSBvcGVyYXRpb25zCithcmUgZGVmaW5lZDoKKworXGJlZ2lue3ZlcmJhdGltfQorI2RlZmluZSBJUFY2X0ZMX0FfR0VUICAgMCAgIC8qIEdldCBmbG93IGxhYmVsICovCisjZGVmaW5lIElQVjZfRkxfQV9QVVQgICAxICAgLyogUmVsZWFzZSBmbG93IGxhYmVsICovCisjZGVmaW5lIElQVjZfRkxfQV9SRU5FVyAyICAgLyogVXBkYXRlIGV4cGlyZSB0aW1lICovCitcZW5ke3ZlcmJhdGltfQorCitcaXRlbSBcdmVyYnxmbGFnc3wgYXJlIG9wdGlvbmFsIG1vZGlmaWVycy4gQ3VycmVudGx5Citvbmx5IFx2ZXJifElQVjZfRkxfQV9HRVR8IGhhcyBtb2RpZmllcnM6CisKK1xiZWdpbnt2ZXJiYXRpbX0KKyNkZWZpbmUgSVBWNl9GTF9GX0NSRUFURSAxICAgLyogQWxsb3dlZCB0byBjcmVhdGUgbmV3IGxhYmVsICovCisjZGVmaW5lIElQVjZfRkxfRl9FWENMICAgMiAgIC8qIERvIG5vdCBjcmVhdGUgbmV3IGxhYmVsICovCitcZW5ke3ZlcmJhdGltfQorCisKK1xpdGVtIFx2ZXJifHNoYXJlfCBkZWZpbmVzIHdobyBpcyBhbGxvd2VkIHRvIHJldXNlIHRoZSBzYW1lIGZsb3cgbGFiZWwuCisKK1xiZWdpbnt2ZXJiYXRpbX0KKyNkZWZpbmUgSVBWNl9GTF9TX05PTkUgICAgMCAgIC8qIE5vdCBkZWZpbmVkICovCisjZGVmaW5lIElQVjZfRkxfU19FWENMICAgIDEgICAvKiBMYWJlbCBpcyBwcml2YXRlICovCisjZGVmaW5lIElQVjZfRkxfU19QUk9DRVNTIDIgICAvKiBNYXkgYmUgcmV1c2VkIGJ5IHRoaXMgcHJvY2VzcyAqLworI2RlZmluZSBJUFY2X0ZMX1NfVVNFUiAgICAzICAgLyogTWF5IGJlIHJldXNlZCBieSB0aGlzIHVzZXIgKi8KKyNkZWZpbmUgSVBWNl9GTF9TX0FOWSAgICAgMjU1IC8qIEFueW9uZSBtYXkgcmV1c2UgaXQgKi8KK1xlbmR7dmVyYmF0aW19CisKK1xpdGVtIFx2ZXJifGxpbmdlcnwgaXMgdGltZSBpbiBzZWNvbmRzLiBBZnRlciB0aGUgbGFzdCB1c2VyIHJlbGVhc2VzIGZsb3cKK2xhYmVsLCBpdCB3aWxsIG5vdCBiZSByZXVzZWQgd2l0aCBkaWZmZXJlbnQgZGVzdGluYXRpb24gYW5kIG9wdGlvbnMgYXQgbGVhc3QKK2R1cmluZyB0aGlzIHRpbWUuIElmIFx2ZXJifHNoYXJlfCBpcyBub3QgXHZlcmJ8SVBWNl9GTF9TX0VYQ0x8IHRoZSBsYWJlbAorc3RpbGwgY2FuIGJlIHNoYXJlZCBieSBhbm90aGVyIHNvY2tldHMuIEN1cnJlbnQgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgYWxsb3cKK3VucHJpdmlsZWdlZCB1c2VyIHRvIHNldCBsaW5nZXIgbG9uZ2VyIHRoYW4gNjAgc2VjLgorCitcaXRlbSBcdmVyYnxleHBpcmVzfCBpcyB0aW1lIGluIHNlY29uZHMuIEZsb3cgbGFiZWwgd2lsbCBiZSBrZXB0IGF0IGxlYXN0Citmb3IgdGhpcyB0aW1lLCBidXQgaXQgd2lsbCBub3QgYmUgZGVzdHJveWVkIGJlZm9yZSB1c2VyIHJlbGVhc2VkIGl0IGV4cGxpY2l0bHkKK29yIGNsb3NlZCBhbGwgdGhlIHNvY2tldHMgdXNpbmcgaXQuIEN1cnJlbnQgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgYWxsb3cKK3VucHJpdmlsZWdlZCB1c2VyIHRvIHNldCB0aW1lb3V0IGxvbmdlciB0aGFuIDYwIHNlYy4gUHJvdmlsZWRnZWQgYXBwbGljYXRpb25zCitNQVkgc2V0IGxvbmdlciBsaWZldGltZXMsIGJ1dCBpbiB0aGlzIGNhc2UgdGhleSBNVVNUIHNhdmUgYWxsb2NhdGVkCitsYWJlbHMgYXQgc3RhYmxlIHN0b3JhZ2UgYW5kIHJlc3RvcmUgdGhlbSBiYWNrIGFmdGVyIHJlYm9vdCBiZWZvcmUgdGhlIGZpcnN0CithcHBsaWNhdGlvbiBhbGxvY2F0ZXMgbmV3IGZsb3cuCisKK1xlbmR7aXRlbWl6ZX0KKworVGhpcyBzdHJ1Y3R1cmUgaXMgZm9sbG93ZWQgYnkgb3B0aW9uYWwgZXh0ZW5zaW9uIGhlYWRlcnMgYXNzb2NpYXRlZAord2l0aCB0aGlzIGZsb3cgbGFiZWwgaW4gZm9ybWF0IG9mIFx2ZXJifElQVjZfUEtUT1BUSU9OU3wuIE9ubHkKK1x2ZXJifElQVjZfSE9QT1BUU3wsIFx2ZXJifElQVjZfUlRIRFJ8IGFuZCwgaWYgXHZlcmJ8SVBWNl9SVEhEUnwgcHJlc2VudHMsCitcdmVyYnxJUFY2X0RTVE9QVFN8IGFyZSBhbGxvd2VkLgorCitccGFyYWdyYXBoe0V4YW1wbGUufQorXGFkZGNvbnRlbnRzbGluZXt0b2N9e3N1YnNlY3Rpb259e0V4YW1wbGV9CisgVGhlIGZ1bmN0aW9uIFx2ZXJifGdldF9mbG93X2xhYmVsfCBhbGxvY2F0ZXMKK3ByaXZhdGUgZmxvdyBsYWJlbC4KKworXGJlZ2lue3ZlcmJhdGltfQoraW50IGdldF9mbG93X2xhYmVsKGludCBmZCwgc3RydWN0IHNvY2thZGRyX2luNiAqZHN0LCBfX3UzMiBmbCkKK3sKKyAgICAgICAgaW50IG9uID0gMTsKKyAgICAgICAgc3RydWN0IGluNl9mbG93bGFiZWxfcmVxIGZyZXE7CisKKyAgICAgICAgbWVtc2V0KCZmcmVxLCAwLCBzaXplb2YoZnJlcSkpOworICAgICAgICBmcmVxLmZscl9sYWJlbCA9IGh0b25sKGZsKTsKKyAgICAgICAgZnJlcS5mbHJfYWN0aW9uID0gSVBWNl9GTF9BX0dFVDsKKyAgICAgICAgZnJlcS5mbHJfZmxhZ3MgPSBJUFY2X0ZMX0ZfQ1JFQVRFIHwgSVBWNl9GTF9GX0VYQ0w7CisgICAgICAgIGZyZXEuZmxyX3NoYXJlID0gSVBWNl9GTF9TX0VYQ0w7CisgICAgICAgIG1lbWNweSgmZnJlcS5mbHJfZHN0LCAmZHN0LT5zaW42X2FkZHIsIDE2KTsKKyAgICAgICAgaWYgKHNldHNvY2tvcHQoZmQsIFNPTF9JUFY2LCBJUFY2X0ZMT1dMQUJFTF9NR1IsCisgICAgICAgICAgICAgICAgICAgICAgICZmcmVxLCBzaXplb2YoZnJlcSkpID09IC0xKSB7CisgICAgICAgICAgICAgICAgcGVycm9yICgiY2FuJ3QgbGVhc2UgZmxvd2xhYmVsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGRzdC0+c2luNl9mbG93aW5mbyB8PSBmcmVxLmZscl9sYWJlbDsKKworICAgICAgICBpZiAoc2V0c29ja29wdChmZCwgU09MX0lQVjYsIElQVjZfRkxPV0lORk9fU0VORCwKKyAgICAgICAgICAgICAgICAgICAgICAgJm9uLCBzaXplb2Yob24pKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIHBlcnJvciAoImNhbid0IHNlbmQgZmxvd2luZm8iKTsKKworICAgICAgICAgICAgICAgIGZyZXEuZmxyX2FjdGlvbiA9IElQVjZfRkxfQV9QVVQ7CisgICAgICAgICAgICAgICAgc2V0c29ja29wdChmZCwgU09MX0lQVjYsIElQVjZfRkxPV0xBQkVMX01HUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmVxLCBzaXplb2YoZnJlcSkpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKK30KK1xlbmR7dmVyYmF0aW19CisKK0EgYml0IG1vcmUgY29tcGxpY2F0ZWQgZXhhbXBsZSB1c2luZyByb3V0aW5nIGhlYWRlciBjYW4gYmUgZm91bmQKK2luIFx2ZXJifHBpbmc2fCB1dGlsaXR5IChcdmVyYnxpcHV0aWxzfCBwYWNrYWdlKS4gTGludXggcnN2cGQgYmFja2VuZAorY29udGFpbnMgYW4gZXhhbXBsZSBvZiB1c2luZyBvcGVyYXRpb24gXHZlcmJ8SVBWNl9GTF9BX1JFTkVXfC4KKworXHBhcmFncmFwaHtMaXN0aW5nIGZsb3cgbGFiZWxzLn0gCitcYWRkY29udGVudHNsaW5le3RvY317c3Vic2VjdGlvbn17TGlzdGluZyBmbG93IGxhYmVsc30KK0xpc3Qgb2YgY3VycmVudGx5IGFsbG9jYXRlZAorZmxvdyBsYWJlbHMgbWF5IGJlIHJlYWQgZnJvbSBcdmVyYnwvcHJvYy9uZXQvaXA2X2Zsb3dsYWJlbHwuCisKK1xiZWdpbnt2ZXJiYXRpbX0KK0xhYmVsIFMgT3duZXIgVXNlcnMgTGluZ2VyIEV4cGlyZXMgRHN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0CitBMUJFNSAxIDAgICAgIDAgICAgIDYgICAgICAzICAgICAgIDNmZmUyNDAwMDAwMDAwMDEwYTAwMjBmZmZlNzFmYjMwIDAKK1xlbmR7dmVyYmF0aW19CisKK1xiZWdpbntpdGVtaXplfQorXGl0ZW0gXHZlcmJ8TGFiZWx8IGlzIGhleGFkZWNpbWFsIGZsb3cgbGFiZWwgdmFsdWUuCitcaXRlbSBcdmVyYnxTfCBpcyBzaGFyaW5nIHN0eWxlLgorXGl0ZW0gXHZlcmJ8T3duZXJ8IGlzIElEIG9mIGNyZWF0b3IsIGl0IGlzIHplcm8sIHBpZCBvciB1aWQsIGRlcGVuZGluZyBvbgorCQlzaGFyaW5nIHN0eWxlLgorXGl0ZW0gXHZlcmJ8VXNlcnN8IGlzIG51bWJlciBvZiBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGxhYmVsIG5vdy4KK1xpdGVtIFx2ZXJifExpbmdlcnwgaXMgXHZlcmJ8bGluZ2VyfCBvZiB0aGlzIGxhYmVsIGluIHNlY29uZHMuCitcaXRlbSBcdmVyYnxFeHBpcmVzfCBpcyB0aW1lIHVudGlsIGV4cGlyYXRpb24gb2YgdGhlIGxhYmVsIGluIHNlY29uZHMuIEl0IG1heQorCWJlIG5lZ2F0aXZlLCBpZiB0aGUgbGFiZWwgaXMgaW4gdXNlLgorXGl0ZW0gXHZlcmJ8RHN0fCBpcyBJUHY2IGRlc3RpbmF0aW9uIGFkZHJlc3MuCitcaXRlbSBcdmVyYnxPcHR8IGlzIGxlbmd0aCBvZiBvcHRpb25zLCBhc3NvY2lhdGVkIHdpdGggdGhlIGxhYmVsLiBPcHRpb24KKwlkYXRhIGFyZSBub3QgYWNjZXNzaWJsZS4KK1xlbmR7aXRlbWl6ZX0KKworCitccGFyYWdyYXBoe0Zsb3cgbGFiZWxzIGFuZCBSU1ZQLn0gCitcYWRkY29udGVudHNsaW5le3RvY317c3Vic2VjdGlvbn17RmxvdyBsYWJlbHMgYW5kIFJTVlB9CitSU1ZQIGRhZW1vbiBzdXBwb3J0cyBJUHY2IGZsb3cgbGFiZWxzCit3aXRob3V0IGFueSBtb2RpZmljYXRpb25zIHRvIHN0YW5kYXJkIElTSSBSQVBJLiBTZW5kZXIgbXVzdCBhbGxvY2F0ZQorZmxvdyBsYWJlbCwgZmlsbCBjb3JyZXNwb25kaW5nIHNlbmRlciB0ZW1wbGF0ZSBhbmQgc3VibWl0IGl0IHRvIGxvY2FsIHJzdnAKK2RhZW1vbi4gcnN2cGQgd2lsbCBjaGVjayB0aGUgbGFiZWwgYW5kIHN0YXJ0IHRvIGFubm91bmNlIGl0IGluIFBBVEgKK21lc3NhZ2VzLiBSc3ZwZCBvbiBzZW5kZXIgbm9kZSB3aWxsIHJlbmV3IHRoZSBmbG93IGxhYmVsLCBzbyB0aGF0IGl0IHdpbGwgbm90CitiZSByZXVzZWQgYmVmb3JlIHBhdGggc3RhdGUgZXhwaXJlcyBhbmQgYWxsIHRoZSBpbnRlcm1lZGlhdGUKK3JvdXRlcnMgYW5kIHJlY2VpdmVyIHB1cmdlIGZsb3cgc3RhdGUuCisKK1x2ZXJifHJ0YXB8IHV0aWxpdHkgaXMgbW9kaWZpZWQgdG8gcGFyc2UgZmxvdyBsYWJlbHMuIEYuZS5cIGlmIHVzZXIgYWxsb2NhdGVkCitmbG93IGxhYmVsIFx2ZXJifDB4QTEyMzR8LCBoZSBtYXkgd3JpdGU6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK1JUQVA+IHNlbmRlciAzZmZlOjI0MDA6OjEvRkwweEExMjM0IDxUc3BlYz4KK1xlbmR7dmVyYmF0aW19CisKK1JlY2VpdmVyIG1ha2VzIHJlc2VydmF0aW9uIHdpdGggY29tbWFuZDoKK1xiZWdpbnt2ZXJiYXRpbX0KK1JUQVA+IHJlc2VydmUgZmYgM2ZmZToyNDAwOjoxL0ZMMHhBMTIzNCA8Rmxvd3NwZWM+CitcZW5ke3ZlcmJhdGltfQorCitcZW5ke2RvY3VtZW50fQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvZG9jL2FycGQuc2dtbCBiL2lwcm91dGUyL2RvYy9hcnBkLnNnbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFiNzljNgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2RvYy9hcnBkLnNnbWwKQEAgLTAsMCArMSwxMzAgQEAKKzwhZG9jdHlwZSBsaW51eGRvYyBzeXN0ZW0+CisKKzxhcnRpY2xlPgorCis8dGl0bGU+QVJQRCBEYWVtb24KKzxhdXRob3I+QWxleGV5IEt1em5ldHNvdiwgPHR0L2t1em5ldEBtczIuaW5yLmFjLnJ1LworPGRhdGU+c29tZV9uZWdhdGl2ZV9udW1iZXIsIDIwIFNlcCAyMDAxCis8YWJzdHJhY3Q+Cis8dHQvYXJwZC8gaXMgZGFlbW9uIGNvbGxlY3RpbmcgZ3JhdHVpdG91cyBBUlAgaW5mb3JtYXRpb24sIHNhdmluZworaXQgb24gbG9jYWwgZGlzayBhbmQgZmVlZGluZyBpdCB0byBrZXJuZWwgb24gZGVtYW5kIHRvIGF2b2lkCityZWR1bmRhbnQgYnJvYWRjYXN0aW5nIGR1ZSB0byBsaW1pdGVkIHNpemUgb2Yga2VybmVsIEFSUCBjYWNoZS4gCis8L2Fic3RyYWN0PgorCisKKzxwPjxiZi9EZXNjcmlwdGlvbi8KKworPHA+VGhlIGZvcm1hdCBvZiB0aGUgY29tbWFuZCBpczoKKworPHRzY3JlZW4+PHZlcmI+CisgICAgICAgYXJwZCBPUFRJT05TIFsgSU5URVJGQUNFIFsgSU5URVJGQUNFIC4uLiBdIF0KKzwvdmVyYj48L3RzY3JlZW4+CisKKzxwPiA8dHQvT1BUSU9OUy8gYXJlOgorCis8aXRlbWl6ZT4KKworPGl0ZW0+PHR0Ly1sLyAtIGR1bXAgPHR0L2FycGQvIGRhdGFiYXNlIHRvIHN0ZG91dCBhbmQgZXhpdC4gT3V0cHV0IGNvbnNpc3RzCitvZiB0aHJlZSBjb2x1bW5zOiBpbnRlcmZhY2UgaW5kZXgsIElQIGFkZHJlc3MgYW5kIE1BQyBhZGRyZXNzLgorTmVnYXRpdmUgZW50cmllcyBmb3IgZGVhZCBob3N0cyBhcmUgYWxzbyBzaG93biwgaW4gdGhpcyBjYXNlIE1BQyBhZGRyZXNzCitpcyByZXBsYWNlZCBieSB3b3JkIDx0dC9GQUlMRUQvIGZvbGxvd2VkIGJ5IGNvbG9uIGFuZCB0aW1lIHdoZW4gdGhlIGZhY3QKK3RoYXQgaG9zdCBpcyBkZWFkIHdhcyBwcm92ZW4gdGhlIGxhc3QgdGltZS4KKworPGl0ZW0+PHR0Ly1mIEZJTEUvICAtIHJlYWQgYW5kIGxvYWQgPHR0L2FycGQvIGRhdGFiYXNlIGZyb20gPHR0L0ZJTEUvCitpbiB0ZXh0IGZvcm1hdCBzaW1pbGFyIGR1bXBlZCBieSBvcHRpb24gPHR0Ly1sLy4gRXhpdCBhZnRlciBsb2FkLAorcHJvYmFibHkgbGlzdGluZyByZXN1bHRpbmcgZGF0YWJhc2UsIGlmIG9wdGlvbiA8dHQvLWwvIGlzIGFsc28gZ2l2ZW4uCitJZiA8dHQvRklMRS8gaXMgPHR0Ly0vLCA8dHQvc3RkaW4vIGlzIHJlYWQgdG8gZ2V0IEFSUCB0YWJsZS4KKyAKKzxpdGVtPjx0dC8tYiBEQVRBQkFTRS8gIC0gbG9jYXRpb24gb2YgZGF0YWJhc2UgZmlsZS4gRGVmYXVsdCBsb2NhdGlvbiBpcworPHR0Pi92YXIvbGliL2FycGQvYXJwZC5kYjwvdHQ+LgorCis8aXRlbT48dHQvLWEgTlVNQkVSLyAtIDx0dC9hcnBkLyBub3Qgb25seSBwYXNzaXZlbHkgbGlzdGVucyBBUlAgb24gd2lyZSwgYnV0CithbHNvIHNlbmQgYnJvZGNhc3QgcXVlcmllcyBpdHNlbGYuIDx0dC9OVU1CRVIvIGlzIG51bWJlciBvZiBzdWNoIHF1ZXJpZXMKK3RvIG1ha2UgYmVmb3JlIGRlc3RpbmF0aW9uIGlzIGNvbnNpZGVyZWQgYXMgZGVhZC4gV2hlbiA8dHQvYXJwZC8gaXMgc3RhcnRlZAorYXMga2VybmVsIGhlbHBlciAoaS5lLiB3aXRoIDx0dC9hcHBfc29saWNpdC8gZW5hYmxlZCBpbiA8dHQvc3lzY3RsLworb3IgZXZlbiB3aXRoIG9wdGlvbiA8dHQvLWsvKSB3aXRob3V0IHRoaXMgb3B0aW9uIGFuZCBzdGlsbCBkaWQgbm90IGxlYXJuIGVub3VnaAoraW5mb3JtYXRpb24sIHlvdSBjYW4gb2JzZXJ2ZSAxIHNlY29uZCBnYXBzIGluIHNlcnZpY2UuIE5vdCBmYXRhbCwgYnV0Citub3QgZ29vZC4KKworPGl0ZW0+PHR0Ly1rLyAtIHN1cHByZXNzIHNlbmRpbmcgYnJvYWRjYXN0IHF1ZXJpZXMgYnkga2VybmVsLiBJdCB0YWtlcworc2Vuc2UgdG9nZXRoZXIgd2l0aCBvcHRpb24gPHR0Ly1hLy4KKworPGl0ZW0+PHR0Ly1uIFRJTUUvIC0gdGltZW91dCBvZiBuZWdhdGl2ZSBjYWNoZS4gV2hlbiByZXNvbHV0aW9uIGZhaWxzIDx0dC9hcnBkLworc3VwcHJlc3NlcyBmdXJ0aGVyIGF0dGVtcHRzIHRvIHJlc29sdmUgZm9yIHRoaXMgcGVyaW9kLiBJdCBtYWtlcyBzZW5zZQorb25seSB0b2dldGhlciB3aXRoIG9wdGlvbiA8dHQvLWsvLiBUaGlzIHRpbWVvdXQgc2hvdWxkIG5vdCBiZSB0b28gbXVjaAorbG9uZ2VyIHRoYW4gYm9vdCB0aW1lIG9mIGEgdHlwaWNhbCBob3N0IG5vdCBzdXBwb3J0aW5nIGdyYXR1aXRvdXMgQVJQLgorRGVmYXVsdCB2YWx1ZSBpcyA2MCBzZWNvbmRzLgorCis8aXRlbT48dHQvLVIgUkFURS8gLSBtYXhpbWFsIHN0ZWFkeSByYXRlIG9mIGJyb2FkY2FzdHMgc2VudCBieSA8dHQvYXJwZC8KK2luIHBhY2tldHMgcGVyIHNlY29uZC4gRGVmYXVsdCB2YWx1ZSBpcyAxLgorCis8aXRlbT48dHQvLUIgTlVNQkVSLyAtIG51bWJlciBvZiBicm9hZGNhc3RzIHNlbnQgYnkgPHR0L2FycGQvIGJhY2sgdG8gYmFjay4KK0RlZmF1bHQgdmFsdWUgaXMgMy4gVG9nZXRoZXIgd2l0aCBvcHRpb24gPHR0Ly1SLyB0aGlzIG9wdGlvbiBhbGxvd3MKK3RvIHBvbGljZSBicm9hZGNhc3Rpbmcgbm90IHRvIGV4Y2VlZCA8dHQvQitSKlQvIG92ZXIgYW55IGludGVydmFsCitvZiB0aW1lIDx0dC9ULy4KKworPC9pdGVtaXplPgorCis8cD48dHQvSU5URVJGQUNFLyBpcyBuYW1lIG9mIG5ldHdvcmtpbmcgaW50ZWZhY2UgdG8gd2F0Y2guCitJZiBubyBpbnRlcmZhY2VzIGdpdmVuLCA8dHQvYXJwZC8gbW9uaXRvcnMgYWxsIHRoZSBpbnRlcmZhY2VzLgorSW4gdGhpcyBjYXNlIDx0dC9hcnBkLyBkb2VzIG5vdCBhZGp1c3QgPHR0L3N5c2N0bC8gcGFyYW1ldGVycywKK2l0IGlzIHN1cHBvc2VkIHVzZXIgZG9lcyB0aGlzIGhpbXNlbGYgYWZ0ZXIgPHR0L2FycGQvIGlzIHN0YXJ0ZWQuCisKKworPHA+IFNpZ25hbHMKKworPHA+IDx0dC9hcnBkLyBleGl0cyBncmFjZWZ1bGx5IHN5bmNpbmcgZGF0YWJhc2UgYW5kIHJlc3RvcmluZyBhZGp1c3RlZAorPHR0L3N5c2N0bC8gcGFyYW1ldGVycywgd2hlbiByZWNlaXZlcyA8dHQvU0lHSU5ULyBvciA8dHQvU0lHVEVSTS8uCis8dHQvU0lHSFVQLyBzeW5jcyBkYXRhYmFzZSB0byBkaXNrLiA8dHQvU0lHVVNSMS8gc2VuZHMgc29tZSBzdGF0aXN0aWNzCit0byA8dHQvc3lzbG9nLy4gRWZmZWN0IG9mIGFub3RoZXIgc2lnbmFscyBpcyB1bmRlZmluZWQsIHRoZXkgbWF5IGNvcnJ1cHQKK2RhdGFiYXNlIGFuZCBsZWF2ZSA8dHQvc3lzY3RsLyBwYXJhbWV0ZXJzIGluIGFuIHVucHJlZGljdGFibGUgc3RhdGUuCisKKzxwPiBOb3RlCisKKzxwPiBJbiBvcmRlciB0byA8dHQvYXJwZC8gYmUgYWJsZSB0byBzZXJ2ZSBhcyBBUlAgcmVzb2x2ZXIsIGtlcm5lbCBtdXN0IGJlCitjb21waWxlZCB3aXRoIHRoZSBvcHRpb24gPHR0L0NPTkZJR19BUlBELyBhbmQsIGluIHRoZSBjYXNlIHdoZW4gaW50ZXJmYWNlIGxpc3QKK2lzIG5vdCBnaXZlbiBvbiBjb21tYW5kIGxpbmUsIHZhcmlhYmxlIDx0dC9hcHBfc29saWNpdC8KK29uIGludGVyZmFjZXMgb2YgaW50ZXJlc3Qgc2hvdWxkIGJlIHNldCBpbiA8dHQ+L3Byb2Mvc3lzL25ldC9pcHY0L25laWdoLyo8L3R0Pi4KK0lmIHRoaXMgaXMgbm90IG1hZGUgPHR0L2FycGQvIHN0aWxsIGNvbGxlY3RzIGdyYXR1aXRvdXMgQVJQIGluZm9ybWF0aW9uCitpbiBpdHMgZGF0YWJhc2UuCisKKzxwPiBFeGFtcGxlcworCis8ZW51bT4KKzxpdGVtPiBTdGFydCA8dHQvYXJwZC8gdG8gY29sbGVjdCBncmF0dWl0b3VzIEFSUCwgYnV0IG5vdCBtZXNzaW5nCit3aXRoIGtlcm5lbCBmdW5jdGlvbmFsaXR5OgorCis8dHNjcmVlbj48dmVyYj4KKyAgIGFycGQgLWIgL3Zhci90bXAvYXJwZC5kYgorPC92ZXJiPjwvdHNjcmVlbj4KKworPGl0ZW0+IExvb2sgYXQgcmVzdWx0IGFmdGVyIHNvbWUgdGltZToKKworPHRzY3JlZW4+PHZlcmI+CisgICBraWxsYWxsIGFycGQKKyAgIGFycGQgLWwgLWIgL3Zhci90bXAvYXJwZC5kYgorPC92ZXJiPjwvdHNjcmVlbj4KKworPGl0ZW0+IFRvIGVuYWJsZSBrZXJuZWwgaGVscGVyLCBsZWF2aW5nIGxlYWRpbmcgcm9sZSB0byBrZXJuZWw6CisKKzx0c2NyZWVuPjx2ZXJiPgorICAgYXJwZCAtYiAvdmFyL3RtcC9hcnBkLmRiIC1hIDEgZXRoMCBldGgxCis8L3ZlcmI+PC90c2NyZWVuPgorCis8aXRlbT4gQ29tcGxldGVseSByZXBsYWNlIGtlcm5lbCByZXNvbHV0aW9uIG9uIGludGVyZmFjZXMgPHR0L2V0aDAvCithbmQgPHR0L2V0aDEvLiBJbiB0aGlzIGNhc2Uga2VybmVsIHN0aWxsIGRvZXMgdW5pY2FzdCBwcm9iaW5nIHRvCit2YWxpZGF0ZSBlbnRyaWVzLCBidXQgYWxsIHRoZSBicm9hZGNhc3QgYWN0aXZpdHkgaXMgc3VwcHJlc3NlZAorYW5kIG1hZGUgdW5kZXIgYXV0aG9yaXR5IG9mIDx0dC9hcnBkLzogCisKKzx0c2NyZWVuPjx2ZXJiPgorICAgYXJwZCAtYiAvdmFyL3RtcC9hcnBkLmRiIC1hIDMgLWsgZXRoMCBldGgxCis8L3ZlcmI+PC90c2NyZWVuPgorCitUaGlzIGlzIG1vZGUgd2hpY2ggPHR0L2FycGQvIGlzIHN1cHBvc2VkIHRvIHdvcmsgbm9ybWFsbHkuCitJdCBpcyBub3QgZGVmYXVsdCBqdXN0IHRvIHByZXZlbnQgb2NjYXNpb25hbCBlbmFibGluZyBvZiB0b28gYWdncmVzc2l2ZQorbW9kZSBvY2Nhc2lvbmFsbHkuCisKKzwvZW51bT4KKworPC9hcnRpY2xlPgorCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9kb2MvZG8tcHNudXAgYi9pcHJvdXRlMi9kb2MvZG8tcHNudXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRjZTg0OAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2RvYy9kby1wc251cApAQCAtMCwwICsxLDE2IEBACisjISAvYmluL2Jhc2gKKyMgJDEgPSBUZW1wb3JhcnkgZmlsZSAuICJzdHJpbmciCisjICQyID0gRmlsZSB0byBwcm9jZXNzIC4gInN0cmluZyIKKyMgJDMgPSBQYWdlIHNpemUgLiBpZTogYTQgLCBsZXR0ZXIgLi4uICJzdHJpbmciCisjICQ0ID0gTnVtYmVyIG9mIHBhZ2VzIHRvIGZpdCBvbiBhIHNpbmdsZSBzaGVldCAuICJudW1lcmljIgorCitpZiB0eXBlIHBzbnVwID4mL2Rldi9udWxsOyB0aGVuCisJZWNobyAicHNudXAgLSQ0IC1wJDMgJDEgJDIiCisJcHNudXAgLSQ0IC1wJDMgJDEgJDIKK2VsaWYgdHlwZSBwc211bHRpID4mL2Rldi9udWxsOyB0aGVuCisJZWNobyAicHNtdWx0aSAkMSA+ICQyIgorCXBzbXVsdGkgJDEgPiAkMgorZWxzZQorCWVjaG8gImNwICQxICQyIgorCWNwICQxICQyCitmaQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvZG9jL2lwLWNyZWYudGV4IGIvaXByb3V0ZTIvZG9jL2lwLWNyZWYudGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MDk0YzkKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9kb2MvaXAtY3JlZi50ZXgKQEAgLTAsMCArMSwzNDQ5IEBACitcZG9jdW1lbnRzdHlsZVsxMnB0LHR3b3NpZGVde2FydGljbGV9CitcZGVmXFRJVExFe0lQIENvbW1hbmQgUmVmZXJlbmNlfQorXGlucHV0IHByZWFtYmxlCitcYmVnaW57Y2VudGVyfQorXExhcmdlXGJmIElQIENvbW1hbmQgUmVmZXJlbmNlLgorXGVuZHtjZW50ZXJ9CisKKworXGJlZ2lue2NlbnRlcn0KK3sgXGxhcmdlIEFsZXhleX5OLn5LdXpuZXRzb3YgfSBcXAorXGVtIEluc3RpdHV0ZSBmb3IgTnVjbGVhciBSZXNlYXJjaCwgTW9zY293IFxcCitcdmVyYnxrdXpuZXRAbXMyLmluci5hYy5ydXwgXFwKK1xybSBBcHJpbCAxNCwgMTk5OQorXGVuZHtjZW50ZXJ9CisKK1x2c3BhY2V7NW1tfQorCitcdGFibGVvZmNvbnRlbnRzCisKK1xuZXdwYWdlCisKK1xzZWN0aW9ue0Fib3V0IHRoaXMgZG9jdW1lbnR9CisKK1RoaXMgZG9jdW1lbnQgcHJlc2VudHMgYSBjb21wcmVoZW5zaXZlIGRlc2NyaXB0aW9uIG9mIHRoZSBcdmVyYnxpcHwgdXRpbGl0eQorZnJvbSB0aGUgXHZlcmJ8aXByb3V0ZTJ8IHBhY2thZ2UuIEl0IGlzIG5vdCBhIHR1dG9yaWFsIG9yIHVzZXIncyBndWlkZS4KK0l0IGlzIGEge1xlbSBkaWN0aW9uYXJ5XC99LCBub3QgZXhwbGFpbmluZyB0ZXJtcywKK2J1dCB0cmFuc2xhdGluZyB0aGVtIGludG8gb3RoZXIgdGVybXMsIHdoaWNoIG1heSBhbHNvIGJlIHVua25vd24gdG8gdGhlIHJlYWRlci4KK0hvd2V2ZXIsIHRoZSBkb2N1bWVudCBpcyBzZWxmLWNvbnRhaW5lZCBhbmQgdGhlIHJlYWRlciwgcHJvdmlkZWQgdGhleSBoYXZlIGEKK2Jhc2ljIG5ldHdvcmtpbmcgYmFja2dyb3VuZCwgd2lsbCBmaW5kIGVub3VnaCBpbmZvcm1hdGlvbgorYW5kIGV4YW1wbGVzIHRvIHVuZGVyc3RhbmQgYW5kIGNvbmZpZ3VyZSBMaW51eC0yLjIgSVAgYW5kIElQdjYKK25ldHdvcmtpbmcuCisKK1RoaXMgZG9jdW1lbnQgaXMgc3BsaXQgaW50byBzZWN0aW9ucyBleHBsYWluaW5nIFx2ZXJifGlwfCBjb21tYW5kcworYW5kIG9wdGlvbnMsIGRlY3J5cHRpbmcgXHZlcmJ8aXB8IG91dHB1dCBhbmQgY29udGFpbmluZyBhIGZldyBleGFtcGxlcy4KK01vcmUgdm9sdW1pbm91cyBleGFtcGxlcyBhbmQgc29tZSB0b3BpY3MsIHdoaWNoIHJlcXVpcmUgbW9yZSBlbGFib3JhdGUKK2Rpc2N1c3Npb24sIGFyZSBpbiB0aGUgYXBwZW5kaXguCisKK1RoZSBwYXJhZ3JhcGhzIGJlZ2lubmluZyB3aXRoIE5CIGNvbnRhaW4gc2lkZSBub3Rlcywgd2FybmluZ3MgYWJvdXQKK2J1Z3MgYW5kIGRlc2lnbiBkcmF3YmFja3MuIFRoZXkgbWF5IGJlIHNraXBwZWQgYXQgdGhlIGZpcnN0IHJlYWRpbmcuCisKK1xzZWN0aW9ue3tcdHQgaXB9IC0tLSBjb21tYW5kIHN5bnRheH0KKworVGhlIGdlbmVyaWMgZm9ybSBvZiBhbiBcdmVyYnxpcHwgY29tbWFuZCBpczoKK1xiZWdpbnt2ZXJiYXRpbX0KK2lwIFsgT1BUSU9OUyBdIE9CSkVDVCBbIENPTU1BTkQgWyBBUkdVTUVOVFMgXV0KK1xlbmR7dmVyYmF0aW19Cit3aGVyZSBcdmVyYnxPUFRJT05TfCBpcyBhIHNldCBvZiBvcHRpb25hbCBtb2RpZmllcnMgYWZmZWN0aW5nIHRoZQorZ2VuZXJhbCBiZWhhdmlvdXIgb2YgdGhlIFx2ZXJifGlwfCB1dGlsaXR5IG9yIGNoYW5naW5nIGl0cyBvdXRwdXQuIEFsbCBvcHRpb25zCitiZWdpbiB3aXRoIHRoZSBjaGFyYWN0ZXIgXHZlcmJ8Jy0nfCBhbmQgbWF5IGJlIHVzZWQgaW4gZWl0aGVyIGxvbmcgb3IgYWJicmV2aWF0ZWQgCitmb3Jtcy4gQ3VycmVudGx5LCB0aGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZToKKworXGJlZ2lue2l0ZW1pemV9CitcaXRlbSBcdmVyYnwtVnwsIFx2ZXJifC1WZXJzaW9ufAorCistLS0gcHJpbnQgdGhlIHZlcnNpb24gb2YgdGhlIFx2ZXJifGlwfCB1dGlsaXR5IGFuZCBleGl0LgorCisKK1xpdGVtIFx2ZXJifC1zfCwgXHZlcmJ8LXN0YXRzfCwgXHZlcmJ8LXN0YXRpc3RpY3N8CisKKy0tLSBvdXRwdXQgbW9yZSBpbmZvcm1hdGlvbi4gSWYgdGhlIG9wdGlvbgorYXBwZWFycyB0d2ljZSBvciBtb3JlLCB0aGUgYW1vdW50IG9mIGluZm9ybWF0aW9uIGluY3JlYXNlcy4KK0FzIGEgcnVsZSwgdGhlIGluZm9ybWF0aW9uIGlzIHN0YXRpc3RpY3Mgb3Igc29tZSB0aW1lIHZhbHVlcy4KKworXGl0ZW0gXHZlcmJ8LWR8LCBcdmVyYnwtZGV0YWlsc3wKKworLS0tIG91dHB1dCBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uLgorCitcaXRlbSBcdmVyYnwtZnwsIFx2ZXJifC1mYW1pbHl8IGZvbGxvd2VkIGJ5IGEgcHJvdG9jb2wgZmFtaWx5CitpZGVudGlmaWVyOiBcdmVyYnxpbmV0fCwgXHZlcmJ8aW5ldDZ8IG9yIFx2ZXJifGxpbmt8LgorCistLS0gZW5mb3JjZSB0aGUgcHJvdG9jb2wgZmFtaWx5IHRvIHVzZS4gSWYgdGhlIG9wdGlvbiBpcyBub3QgcHJlc2VudCwKK3RoZSBwcm90b2NvbCBmYW1pbHkgaXMgZ3Vlc3NlZCBmcm9tIG90aGVyIGFyZ3VtZW50cy4gSWYgdGhlIHJlc3Qgb2YgdGhlIGNvbW1hbmQKK2xpbmUgZG9lcyBub3QgZ2l2ZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gZ3Vlc3MgdGhlIGZhbWlseSwgXHZlcmJ8aXB8IGZhbGxzIGJhY2sgdG8gdGhlIGRlZmF1bHQKK29uZSwgdXN1YWxseSBcdmVyYnxpbmV0fCBvciBcdmVyYnxhbnl8LiBcdmVyYnxsaW5rfCBpcyBhIHNwZWNpYWwgZmFtaWx5CitpZGVudGlmaWVyIG1lYW5pbmcgdGhhdCBubyBuZXR3b3JraW5nIHByb3RvY29sIGlzIGludm9sdmVkLgorCitcaXRlbSBcdmVyYnwtNHwKKworLS0tIHNob3J0Y3V0IGZvciBcdmVyYnwtZmFtaWx5IGluZXR8LgorCitcaXRlbSBcdmVyYnwtNnwKKworLS0tIHNob3J0Y3V0IGZvciBcdmVyYnwtZmFtaWx5IGluZXQ2fC4KKworXGl0ZW0gXHZlcmJ8LTB8CisKKy0tLSBzaG9ydGN1dCBmb3IgXHZlcmJ8LWZhbWlseSBsaW5rfC4KKworCitcaXRlbSBcdmVyYnwtb3wsIFx2ZXJifC1vbmVsaW5lfAorCistLS0gb3V0cHV0IGVhY2ggcmVjb3JkIG9uIGEgc2luZ2xlIGxpbmUsIHJlcGxhY2luZyBsaW5lIGZlZWRzCit3aXRoIHRoZSBcdmVyYnwnXCd8IGNoYXJhY3Rlci4gVGhpcyBpcyBjb252ZW5pZW50IHdoZW4geW91IHdhbnQgdG8KK2NvdW50IHJlY29yZHMgd2l0aCBcdmVyYnx3Y3wgb3IgdG8gXHZlcmJ8Z3JlcHwgdGhlIG91dHB1dC4gVGhlIHRyaXZpYWwKK3NjcmlwdCBcdmVyYnxydHByfCBjb252ZXJ0cyB0aGUgb3V0cHV0IGJhY2sgaW50byByZWFkYWJsZSBmb3JtLgorCitcaXRlbSBcdmVyYnwtcnwsIFx2ZXJifC1yZXNvbHZlfAorCistLS0gdXNlIHRoZSBzeXN0ZW0ncyBuYW1lIHJlc29sdmVyIHRvIHByaW50IEROUyBuYW1lcyBpbnN0ZWFkIG9mCitob3N0IGFkZHJlc3Nlcy4KKworXGJlZ2lue05CfQorIERvIG5vdCB1c2UgdGhpcyBvcHRpb24gd2hlbiByZXBvcnRpbmcgYnVncyBvciBhc2tpbmcgZm9yIGFkdmljZS4KK1xlbmR7TkJ9CitcYmVnaW57TkJ9CisgXHZlcmJ8aXB8IG5ldmVyIHVzZXMgRE5TIHRvIHJlc29sdmUgbmFtZXMgdG8gYWRkcmVzc2VzLgorXGVuZHtOQn0KKworXGl0ZW0gXHZlcmJ8LWJ8LCBcdmVyYnwtYmF0Y2ggRklMRXwKKworLS0tIHJlYWQgY29tbWFuZHMgZnJvbSBwcm92aWRlZCBmaWxlIG9yIHN0YW5kYXJ0IGlucHV0IGFuZCBpbnZva2UgdGhlbS4KK0ZpcnN0IGZhaWx1cmUgd2lsbCBjYXVzZSB0ZXJtaW5hdGlvbiBvZiBcdmVyYnxpcHwuCitJbiBiYXRjaCBcdmVyYnxGSUxFfCBldmVyeXRoaW5nIHdoaWNoIGJlZ2lucyB3aXRoIFx2ZXJifCN8IHN5bWJvbCBpcworaWdub3JlZCBhbmQgY2FuIGJlIHVzZWQgZm9yIGNvbW1lbnRzLgorXHBhcmFncmFwaHtFeGFtcGxlOn0KK1xiZWdpbnt2ZXJiYXRpbX0KK2t1em5ldEBrYWlzZXIgJCBjYXQgL3RtcC9pcF9iYXRjaC5pcAorIyBUaGlzIGlzIGEgY29tbWVudAordHVudGFwIGFkZCBtb2RlIHRhcCB0YXAxICMgVGhpcyBpcyBhbiBhbm90aGVyIGNvbW1lbnQKK2xpbmsgc2V0IHVwIGRldiB0YXAxCithZGRyIGFkZCAxMC4wLjAuMS8yNCBkZXYgdGFwMQora3V6bmV0QGthaXNlciAkIHN1ZG8gaXAgLWIgL3RtcC9pcF9iYXRjaC5pcAorXGVuZHt2ZXJiYXRpbX0KK29yIGZyb20gc3RhbmRhcnQgaW5wdXQ6CitcYmVnaW57dmVyYmF0aW19CitrdXpuZXRAa2Fpc2VyICQgY2F0IC90bXAvaXBfYmF0Y2guaXAgfCBzdWRvIGlwIC1iIC0KK1xlbmR7dmVyYmF0aW19CisKK1xpdGVtIFx2ZXJifC1mb3JjZXwKKworLS0tIGRvbid0IHRlcm1pbmF0ZSBpcCBvbiBlcnJvcnMgaW4gYmF0Y2ggbW9kZS4KK0lmIHRoZXJlIHdlcmUgYW55IGVycm9ycyBkdXJpbmcgZXhlY3V0aW9uIG9mIHRoZSBjb21tYW5kcywKK3RoZSBhcHBsaWNhdGlvbiByZXR1cm4gY29kZSB3aWxsIGJlIG5vbiB6ZXJvLgorCitcaXRlbSBcdmVyYnwtbHwsIFx2ZXJifC1sb29wcyBDT1VOVHwKKworLS0tIHNwZWNpZnkgbWF4aW11bSBudW1iZXIgb2YgbG9vcHMgdGhlICdpcCBhZGRyIGZsdXNoJyBsb2dpYyB3aWxsIGF0dGVtcHQKK2JlZm9yZSBnaXZpbmcgdXAuIFRoZSBkZWZhdWx0IGlzIDEwLiAgWmVybyAoMCkgbWVhbnMgbG9vcCB1bnRpbCBhbGwKK2FkZHJlc3NlcyBhcmUgcmVtb3ZlZC4KKworXGVuZHtpdGVtaXplfQorCitcdmVyYnxPQkpFQ1R8IGlzIHRoZSBvYmplY3QgdG8gbWFuYWdlIG9yIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dC4KK1RoZSBvYmplY3QgdHlwZXMgY3VycmVudGx5IHVuZGVyc3Rvb2QgYnkgXHZlcmJ8aXB8IGFyZToKKworXGJlZ2lue2l0ZW1pemV9CitcaXRlbSBcdmVyYnxsaW5rfCAtLS0gbmV0d29yayBkZXZpY2UKK1xpdGVtIFx2ZXJifGFkZHJlc3N8IC0tLSBwcm90b2NvbCAoSVAgb3IgSVB2NikgYWRkcmVzcyBvbiBhIGRldmljZQorXGl0ZW0gXHZlcmJ8bmVpZ2hib3VyfCAtLS0gQVJQIG9yIE5ESVNDIGNhY2hlIGVudHJ5CitcaXRlbSBcdmVyYnxyb3V0ZXwgLS0tIHJvdXRpbmcgdGFibGUgZW50cnkKK1xpdGVtIFx2ZXJifHJ1bGV8IC0tLSBydWxlIGluIHJvdXRpbmcgcG9saWN5IGRhdGFiYXNlCitcaXRlbSBcdmVyYnxtYWRkcmVzc3wgLS0tIG11bHRpY2FzdCBhZGRyZXNzCitcaXRlbSBcdmVyYnxtcm91dGV8IC0tLSBtdWx0aWNhc3Qgcm91dGluZyBjYWNoZSBlbnRyeQorXGl0ZW0gXHZlcmJ8dHVubmVsfCAtLS0gdHVubmVsIG92ZXIgSVAKK1xlbmR7aXRlbWl6ZX0KKworQWdhaW4sIHRoZSBuYW1lcyBvZiBhbGwgb2JqZWN0cyBtYXkgYmUgd3JpdHRlbiBpbiBmdWxsIG9yCithYmJyZXZpYXRlZCBmb3JtLCBmLmUuXCBcdmVyYnxhZGRyZXNzfCBpcyBhYmJyZXZpYXRlZCBhcyBcdmVyYnxhZGRyfAorb3IganVzdCBcdmVyYnxhfC4KKworXHZlcmJ8Q09NTUFORHwgc3BlY2lmaWVzIHRoZSBhY3Rpb24gdG8gcGVyZm9ybSBvbiB0aGUgb2JqZWN0LgorVGhlIHNldCBvZiBwb3NzaWJsZSBhY3Rpb25zIGRlcGVuZHMgb24gdGhlIG9iamVjdCB0eXBlLgorQXMgYSBydWxlLCBpdCBpcyBwb3NzaWJsZSB0byBcdmVyYnxhZGR8LCBcdmVyYnxkZWxldGV8IGFuZAorXHZlcmJ8c2hvd3wgKG9yIFx2ZXJifGxpc3R8KSBvYmplY3RzLCBidXQgc29tZSBvYmplY3RzCitkbyBub3QgYWxsb3cgYWxsIG9mIHRoZXNlIG9wZXJhdGlvbnMgb3IgaGF2ZSBzb21lIGFkZGl0aW9uYWwgY29tbWFuZHMuCitUaGUgXHZlcmJ8aGVscHwgY29tbWFuZCBpcyBhdmFpbGFibGUgZm9yIGFsbCBvYmplY3RzLiBJdCBwcmludHMKK291dCBhIGxpc3Qgb2YgYXZhaWxhYmxlIGNvbW1hbmRzIGFuZCBhcmd1bWVudCBzeW50YXggY29udmVudGlvbnMuCisKK0lmIG5vIGNvbW1hbmQgaXMgZ2l2ZW4sIHNvbWUgZGVmYXVsdCBjb21tYW5kIGlzIGFzc3VtZWQuCitVc3VhbGx5IGl0IGlzIFx2ZXJifGxpc3R8IG9yLCBpZiB0aGUgb2JqZWN0cyBvZiB0aGlzIGNsYXNzCitjYW5ub3QgYmUgbGlzdGVkLCBcdmVyYnxoZWxwfC4KKworXHZlcmJ8QVJHVU1FTlRTfCBpcyBhIGxpc3Qgb2YgYXJndW1lbnRzIHRvIHRoZSBjb21tYW5kLgorVGhlIGFyZ3VtZW50cyBkZXBlbmQgb24gdGhlIGNvbW1hbmQgYW5kIG9iamVjdC4gVGhlcmUgYXJlIHR3byB0eXBlcyBvZiBhcmd1bWVudHM6Cit7XGVtIGZsYWdzXC99LCBjb25zaXN0aW5nIG9mIGEgc2luZ2xlIGtleXdvcmQsIGFuZCB7XGVtIHBhcmFtZXRlcnNcL30sCitjb25zaXN0aW5nIG9mIGEga2V5d29yZCBmb2xsb3dlZCBieSBhIHZhbHVlLiBGb3IgY29udmVuaWVuY2UsCitlYWNoIGNvbW1hbmQgaGFzIHNvbWUge1xlbSBkZWZhdWx0IHBhcmFtZXRlclwvfQord2hpY2ggbWF5IGJlIG9taXR0ZWQuIEYuZS5cIHBhcmFtZXRlciBcdmVyYnxkZXZ8IGlzIHRoZSBkZWZhdWx0Citmb3IgdGhlIHtcdHQgaXAgbGlua30gY29tbWFuZCwgc28ge1x0dCBpcCBsaW5rIGxzIGV0aDB9IGlzIGVxdWl2YWxlbnQKK3RvIHtcdHQgaXAgbGluayBscyBkZXYgZXRoMH0uCitJbiB0aGUgY29tbWFuZCBkZXNjcmlwdGlvbnMgYmVsb3cgc3VjaCBwYXJhbWV0ZXJzCithcmUgZGlzdGluZ3Vpc2hlZCB3aXRoIHRoZSBtYXJrZXI6IGBgKGRlZmF1bHQpJycuCisKK0FsbW9zdCBhbGwga2V5d29yZHMgbWF5IGJlIGFiYnJldmlhdGVkIHdpdGggc2V2ZXJhbCBmaXJzdCAob3IgZXZlbiBzaW5nbGUpCitsZXR0ZXJzLiBUaGUgc2hvcnRjdXRzIGFyZSBjb252ZW5pZW50IHdoZW4gXHZlcmJ8aXB8IGlzIHVzZWQgaW50ZXJhY3RpdmVseSwKK2J1dCB0aGV5IGFyZSBub3QgcmVjb21tZW5kZWQgaW4gc2NyaXB0cyBvciB3aGVuIHJlcG9ydGluZyBidWdzCitvciBhc2tpbmcgZm9yIGFkdmljZS4gYGBPZmZpY2lhbGx5JycgYWxsb3dlZCBhYmJyZXZpYXRpb25zIGFyZSBsaXN0ZWQKK2luIHRoZSBkb2N1bWVudCBib2R5LgorCisKKworXHNlY3Rpb257e1x0dCBpcH0gLS0tIGVycm9yIG1lc3NhZ2VzfQorCitcdmVyYnxpcHwgbWF5IGZhaWwgZm9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6CisKK1xiZWdpbntpdGVtaXplfQorXGl0ZW0KK0Egc3ludGF4IGVycm9yIG9uIHRoZSBjb21tYW5kIGxpbmU6IGFuIHVua25vd24ga2V5d29yZCwgaW5jb3JyZWN0bHkgZm9ybWF0dGVkCitJUCBhZGRyZXNzIHtcZW0gZXQgYWxcL30uIEluIHRoaXMgY2FzZSBcdmVyYnxpcHwgcHJpbnRzIGFuIGVycm9yIG1lc3NhZ2UKK2FuZCBleGl0cy4gQXMgYSBydWxlLCB0aGUgZXJyb3IgbWVzc2FnZSB3aWxsIGNvbnRhaW4gaW5mb3JtYXRpb24KK2Fib3V0IHRoZSByZWFzb24gZm9yIHRoZSBmYWlsdXJlLiBTb21ldGltZXMgaXQgYWxzbyBwcmludHMgYSBoZWxwIHBhZ2UuCisKK1xpdGVtCitUaGUgYXJndW1lbnRzIGRpZCBub3QgcGFzcyB2ZXJpZmljYXRpb24gZm9yIHNlbGYtY29uc2lzdGVuY3kuCisKK1xpdGVtCitcdmVyYnxpcHwgZmFpbGVkIHRvIGNvbXBpbGUgYSBrZXJuZWwgcmVxdWVzdCBmcm9tIHRoZSBhcmd1bWVudHMKK2JlY2F1c2UgdGhlIHVzZXIgZGlkbid0IGdpdmUgZW5vdWdoIGluZm9ybWF0aW9uLgorCitcaXRlbQorVGhlIGtlcm5lbCByZXR1cm5lZCBhbiBlcnJvciB0byBzb21lIHN5c2NhbGwuIEluIHRoaXMgY2FzZSBcdmVyYnxpcHwKK3ByaW50cyB0aGUgZXJyb3IgbWVzc2FnZSwgYXMgaXQgaXMgb3V0cHV0IHdpdGggXHZlcmJ8cGVycm9yKDMpfCwKK3ByZWZpeGVkIHdpdGggYSBjb21tZW50IGFuZCBhIHN5c2NhbGwgaWRlbnRpZmllci4KKworXGl0ZW0KK1RoZSBrZXJuZWwgcmV0dXJuZWQgYW4gZXJyb3IgdG8gc29tZSBSVE5FVExJTksgcmVxdWVzdC4KK0luIHRoaXMgY2FzZSBcdmVyYnxpcHwgcHJpbnRzIHRoZSBlcnJvciBtZXNzYWdlLCBhcyBpdCBpcyBvdXRwdXQKK3dpdGggXHZlcmJ8cGVycm9yKDMpfCBwcmVmaXhlZCB3aXRoIGBgUlRORVRMSU5LIGFuc3dlcnM6JycuCisKK1xlbmR7aXRlbWl6ZX0KKworQWxsIHRoZSBvcGVyYXRpb25zIGFyZSBhdG9taWMsIGkuZS5cIAoraWYgdGhlIFx2ZXJifGlwfCB1dGlsaXR5IGZhaWxzLCBpdCBkb2VzIG5vdCBjaGFuZ2UgYW55dGhpbmcKK2luIHRoZSBzeXN0ZW0uIE9uZSBoYXJtZnVsIGV4Y2VwdGlvbiBpcyBcdmVyYnxpcCBsaW5rfCBjb21tYW5kCisoU2VjLlxyZWZ7SVAtTElOS30sIHAuXHBhZ2VyZWZ7SVAtTElOS30pLAord2hpY2ggbWF5IGNoYW5nZSBvbmx5IHNvbWUgb2YgdGhlIGRldmljZSBwYXJhbWV0ZXJzIGdpdmVuCitvbiBjb21tYW5kIGxpbmUuCisKK0l0IGlzIGRpZmZpY3VsdCB0byBsaXN0IGFsbCB0aGUgZXJyb3IgbWVzc2FnZXMgKGVzcGVjaWFsbHkKK3N5bnRheCBlcnJvcnMpLiBIb3dldmVyLCBhcyBhIHJ1bGUsIHRoZWlyIG1lYW5pbmcgaXMgY2xlYXIKK2Zyb20gdGhlIGNvbnRleHQgb2YgdGhlIGNvbW1hbmQuCisKK1RoZSBtb3N0IGNvbW1vbiBtaXN0YWtlcyBhcmU6CisKK1xiZWdpbntlbnVtZXJhdGV9CitcaXRlbSBOZXRsaW5rIGlzIG5vdCBjb25maWd1cmVkIGluIHRoZSBrZXJuZWwuIFRoZSBtZXNzYWdlIGlzOgorXGJlZ2lue3ZlcmJhdGltfQorQ2Fubm90IG9wZW4gbmV0bGluayBzb2NrZXQ6IEludmFsaWQgdmFsdWUKK1xlbmR7dmVyYmF0aW19CisKK1xpdGVtIFJUTkVUTElOSyBpcyBub3QgY29uZmlndXJlZCBpbiB0aGUga2VybmVsLiBJbiB0aGlzIGNhc2UKK29uZSBvZiB0aGUgZm9sbG93aW5nIG1lc3NhZ2VzIG1heSBiZSBwcmludGVkLCBkZXBlbmRpbmcgb24gdGhlIGNvbW1hbmQ6CitcYmVnaW57dmVyYmF0aW19CitDYW5ub3QgdGFsayB0byBydG5ldGxpbms6IENvbm5lY3Rpb24gcmVmdXNlZAorQ2Fubm90IHNlbmQgZHVtcCByZXF1ZXN0OiBDb25uZWN0aW9uIHJlZnVzZWQKK1xlbmR7dmVyYmF0aW19CisKK1xpdGVtIFRoZSBcdmVyYnxDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTfCBvcHRpb24gd2FzIG5vdCBzZWxlY3RlZAord2hlbiBjb25maWd1cmluZyB0aGUga2VybmVsLiBJbiB0aGlzIGNhc2UgYW55IGF0dGVtcHQgdG8gdXNlIHRoZQorXHZlcmJ8aXB8IFx2ZXJifHJ1bGV8IGNvbW1hbmQgd2lsbCBmYWlsLCBmLmUuCitcYmVnaW57dmVyYmF0aW19CitrdXpuZXRAa2Fpc2VyICQgaXAgcnVsZSBsaXN0CitSVE5FVExJTksgZXJyb3I6IEludmFsaWQgYXJndW1lbnQKK2R1bXAgdGVybWluYXRlZAorXGVuZHt2ZXJiYXRpbX0KKworXGVuZHtlbnVtZXJhdGV9CisKKworXHNlY3Rpb257e1x0dCBpcCBsaW5rfSAtLS0gbmV0d29yayBkZXZpY2UgY29uZmlndXJhdGlvbn0KK1xsYWJlbHtJUC1MSU5LfQorCitccGFyYWdyYXBoe09iamVjdDp9IEEgXHZlcmJ8bGlua3wgaXMgYSBuZXR3b3JrIGRldmljZSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcKK2NvbW1hbmRzIGRpc3BsYXkgYW5kIGNoYW5nZSB0aGUgc3RhdGUgb2YgZGV2aWNlcy4KKworXHBhcmFncmFwaHtDb21tYW5kczp9IFx2ZXJifHNldHwgYW5kIFx2ZXJifHNob3d8IChvciBcdmVyYnxsaXN0fCkuCisKK1xzdWJzZWN0aW9ue3tcdHQgaXAgbGluayBzZXR9IC0tLSBjaGFuZ2UgZGV2aWNlIGF0dHJpYnV0ZXN9CisKK1xwYXJhZ3JhcGh7QWJicmV2aWF0aW9uczp9IFx2ZXJifHNldHwsIFx2ZXJifHN8LgorCitccGFyYWdyYXBoe0FyZ3VtZW50czp9CisKK1xiZWdpbntpdGVtaXplfQorXGl0ZW0gXHZlcmJ8ZGV2IE5BTUV8IChkZWZhdWx0KQorCistLS0gXHZlcmJ8TkFNRXwgc3BlY2lmaWVzIHRoZSBuZXR3b3JrIGRldmljZSBvbiB3aGljaCB0byBvcGVyYXRlLgorCitcaXRlbSBcdmVyYnx1cHwgYW5kIFx2ZXJifGRvd258CisKKy0tLSBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZSBkZXZpY2UgdG8gXHZlcmJ8VVB8IG9yIFx2ZXJifERPV058LgorCitcaXRlbSBcdmVyYnxhcnAgb258IG9yIFx2ZXJifGFycCBvZmZ8CisKKy0tLSBjaGFuZ2UgdGhlIFx2ZXJifE5PQVJQfCBmbGFnIG9uIHRoZSBkZXZpY2UuCisKK1xiZWdpbntOQn0KK1RoaXMgb3BlcmF0aW9uIGlzIHtcZW0gbm90IGFsbG93ZWRcL30gaWYgdGhlIGRldmljZSBpcyBpbiBzdGF0ZSBcdmVyYnxVUHwuCitUaG91Z2ggbmVpdGhlciB0aGUgXHZlcmJ8aXB8IHV0aWxpdHkgbm9yIHRoZSBrZXJuZWwgY2hlY2sgZm9yIHRoaXMgY29uZGl0aW9uLgorWW91IGNhbiBnZXQgdW5wcmVkaWN0YWJsZSByZXN1bHRzIGNoYW5naW5nIHRoaXMgZmxhZyB3aGlsZSB0aGUKK2RldmljZSBpcyBydW5uaW5nLgorXGVuZHtOQn0KKworXGl0ZW0gXHZlcmJ8bXVsdGljYXN0IG9ufCBvciBcdmVyYnxtdWx0aWNhc3Qgb2ZmfAorCistLS0gY2hhbmdlIHRoZSBcdmVyYnxNVUxUSUNBU1R8IGZsYWcgb24gdGhlIGRldmljZS4KKworXGl0ZW0gXHZlcmJ8ZHluYW1pYyBvbnwgb3IgXHZlcmJ8ZHluYW1pYyBvZmZ8CisKKy0tLSBjaGFuZ2UgdGhlIFx2ZXJifERZTkFNSUN8IGZsYWcgb24gdGhlIGRldmljZS4KKworXGl0ZW0gXHZlcmJ8bmFtZSBOQU1FfAorCistLS0gY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBkZXZpY2UuIFRoaXMgb3BlcmF0aW9uIGlzIG5vdAorcmVjb21tZW5kZWQgaWYgdGhlIGRldmljZSBpcyBydW5uaW5nIG9yIGhhcyBzb21lIGFkZHJlc3NlcworYWxyZWFkeSBjb25maWd1cmVkLgorCitcaXRlbSBcdmVyYnx0eHF1ZXVlbGVuIE5VTUJFUnwgb3IgXHZlcmJ8dHhxbGVuIE5VTUJFUnwKKworLS0tIGNoYW5nZSB0aGUgdHJhbnNtaXQgcXVldWUgbGVuZ3RoIG9mIHRoZSBkZXZpY2UuCisKK1xpdGVtIFx2ZXJifG10dSBOVU1CRVJ8CisKKy0tLSBjaGFuZ2UgdGhlIE1UVSBvZiB0aGUgZGV2aWNlLgorCitcaXRlbSBcdmVyYnxhZGRyZXNzIExMQUREUkVTU3wKKworLS0tIGNoYW5nZSB0aGUgc3RhdGlvbiBhZGRyZXNzIG9mIHRoZSBpbnRlcmZhY2UuCisKK1xpdGVtIFx2ZXJifGJyb2FkY2FzdCBMTEFERFJFU1N8LCBcdmVyYnxicmQgTExBRERSRVNTfCBvciBcdmVyYnxwZWVyIExMQUREUkVTU3wKKworLS0tIGNoYW5nZSB0aGUgbGluayBsYXllciBicm9hZGNhc3QgYWRkcmVzcyBvciB0aGUgcGVlciBhZGRyZXNzIHdoZW4KK3RoZSBpbnRlcmZhY2UgaXMgXHZlcmJ8UE9JTlRPUE9JTlR8LgorCitcdnNraXAgMW1tCitcYmVnaW57TkJ9CitGb3IgbW9zdCBkZXZpY2VzIChmLmUuXCBmb3IgRXRoZXJuZXQpIGNoYW5naW5nIHRoZSBsaW5rIGxheWVyCiticm9hZGNhc3QgYWRkcmVzcyB3aWxsIGJyZWFrIG5ldHdvcmtpbmcuCitEbyBub3QgdXNlIGl0LCBpZiB5b3UgZG8gbm90IHVuZGVyc3RhbmQgd2hhdCB0aGlzIG9wZXJhdGlvbiByZWFsbHkgZG9lcy4KK1xlbmR7TkJ9CisKK1xpdGVtIFx2ZXJifG5ldG5zIFBJRHwKKworLS0tIG1vdmUgdGhlIGRldmljZSB0byB0aGUgbmV0d29yayBuYW1lc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzIFBJRC4KKworXGVuZHtpdGVtaXplfQorCitcdnNraXAgMW1tCitcYmVnaW57TkJ9CitUaGUgXHZlcmJ8UFJPTUlTQ3wgYW5kIFx2ZXJifEFMTE1VTFRJfCBmbGFncyBhcmUgY29uc2lkZXJlZAorb2Jzb2xldGUgYW5kIHNob3VsZCBub3QgYmUgY2hhbmdlZCBhZG1pbmlzdHJhdGl2ZWx5LCB0aG91Z2gKK3RoZSB7XHR0IGlwfSB1dGlsaXR5IHdpbGwgYWxsb3cgdGhhdC4KK1xlbmR7TkJ9CisKK1xwYXJhZ3JhcGh7V2FybmluZzp9IElmIG11bHRpcGxlIHBhcmFtZXRlciBjaGFuZ2VzIGFyZSByZXF1ZXN0ZWQsCitcdmVyYnxpcHwgYWJvcnRzIGltbWVkaWF0ZWx5IGFmdGVyIGFueSBvZiB0aGUgY2hhbmdlcyBoYXZlIGZhaWxlZC4KK1RoaXMgaXMgdGhlIG9ubHkgY2FzZSB3aGVuIFx2ZXJifGlwfCBjYW4gbW92ZSB0aGUgc3lzdGVtIHRvCithbiB1bnByZWRpY3RhYmxlIHN0YXRlLiBUaGUgc29sdXRpb24gaXMgdG8gYXZvaWQgY2hhbmdpbmcKK3NldmVyYWwgcGFyYW1ldGVycyB3aXRoIG9uZSB7XHR0IGlwIGxpbmsgc2V0fSBjYWxsLgorCitccGFyYWdyYXBoe0V4YW1wbGVzOn0KK1xiZWdpbntpdGVtaXplfQorXGl0ZW0gXHZlcmJ8aXAgbGluayBzZXQgZHVtbXkgYWRkcmVzcyAwMDowMDowMDowMDowMDowMXwKKworLS0tIGNoYW5nZSB0aGUgc3RhdGlvbiBhZGRyZXNzIG9mIHRoZSBpbnRlcmZhY2UgXHZlcmJ8ZHVtbXl8LgorCitcaXRlbSBcdmVyYnxpcCBsaW5rIHNldCBkdW1teSB1cHwKKworLS0tIHN0YXJ0IHRoZSBpbnRlcmZhY2UgXHZlcmJ8ZHVtbXl8LgorCitcZW5ke2l0ZW1pemV9CisKKworXHN1YnNlY3Rpb257e1x0dCBpcCBsaW5rIHNob3d9IC0tLSBkaXNwbGF5IGRldmljZSBhdHRyaWJ1dGVzfQorXGxhYmVse0lQLUxJTkstU0hPV30KKworXHBhcmFncmFwaHtBYmJyZXZpYXRpb25zOn0gXHZlcmJ8c2hvd3wsIFx2ZXJifGxpc3R8LCBcdmVyYnxsc3R8LCBcdmVyYnxzaHwsIFx2ZXJifGxzfCwKK1x2ZXJifGx8LgorCitccGFyYWdyYXBoe0FyZ3VtZW50czp9CitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIFx2ZXJifGRldiBOQU1FfCAoZGVmYXVsdCkKKworLS0tIFx2ZXJifE5BTUV8IHNwZWNpZmllcyB0aGUgbmV0d29yayBkZXZpY2UgdG8gc2hvdy4KK0lmIHRoaXMgYXJndW1lbnQgaXMgb21pdHRlZCBhbGwgZGV2aWNlcyBhcmUgbGlzdGVkLgorCitcaXRlbSBcdmVyYnx1cHwKKworLS0tIG9ubHkgZGlzcGxheSBydW5uaW5nIGludGVyZmFjZXMuCisKK1xlbmR7aXRlbWl6ZX0KKworCitccGFyYWdyYXBoe091dHB1dCBmb3JtYXQ6fQorCitcYmVnaW57dmVyYmF0aW19CitrdXpuZXRAYWxpc2E6fiAkIGlwIGxpbmsgbHMgZXRoMAorMzogZXRoMDogPEJST0FEQ0FTVCxNVUxUSUNBU1QsVVA+IG10dSAxNTAwIHFkaXNjIGNicSBxbGVuIDEwMAorICAgIGxpbmsvZXRoZXIgMDA6YTA6Y2M6NjY6MTg6NzggYnJkIGZmOmZmOmZmOmZmOmZmOmZmCitrdXpuZXRAYWxpc2E6fiAkIGlwIGxpbmsgbHMgc2l0MAorNTogc2l0MEBOT05FOiA8Tk9BUlAsVVA+IG10dSAxNDgwIHFkaXNjIG5vcXVldWUKKyAgICBsaW5rL3NpdCAwLjAuMC4wIGJyZCAwLjAuMC4wCitrdXpuZXRAYWxpc2E6fiAkIGlwIGxpbmsgbHMgZHVtbXkKKzI6IGR1bW15OiA8QlJPQURDQVNULE5PQVJQPiBtdHUgMTUwMCBxZGlzYyBub29wCisgICAgbGluay9ldGhlciAwMDowMDowMDowMDowMDowMCBicmQgZmY6ZmY6ZmY6ZmY6ZmY6ZmYKK2t1em5ldEBhbGlzYTp+ICQgCitcZW5ke3ZlcmJhdGltfQorCisKK1RoZSBudW1iZXIgYmVmb3JlIGVhY2ggY29sb24gaXMgYW4ge1xlbSBpbnRlcmZhY2UgaW5kZXhcL30gb3Ige1xlbSBpZmluZGV4XC99LgorVGhpcyBudW1iZXIgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgaW50ZXJmYWNlLiBUaGlzIGlzIGZvbGxvd2VkIGJ5IHRoZSB7XGVtIGludGVyZmFjZSBuYW1lXC99CisoXHZlcmJ8ZXRoMHwsIFx2ZXJifHNpdDB8IGV0Yy4pLiBUaGUgaW50ZXJmYWNlIG5hbWUgaXMgYWxzbwordW5pcXVlIGF0IGV2ZXJ5IGdpdmVuIG1vbWVudC4gSG93ZXZlciwgdGhlIGludGVyZmFjZSBtYXkgZGlzYXBwZWFyIGZyb20gdGhlCitsaXN0IChmLmUuXCB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIGRyaXZlciBtb2R1bGUgaXMgdW5sb2FkZWQpIGFuZCBhbm90aGVyCitvbmUgd2l0aCB0aGUgc2FtZSBuYW1lIG1heSBiZSBjcmVhdGVkIGxhdGVyLiBCZXNpZGVzIHRoYXQsCit0aGUgYWRtaW5pc3RyYXRvciBtYXkgY2hhbmdlIHRoZSBuYW1lIG9mIGFueSBkZXZpY2Ugd2l0aAorXHZlcmJ8aXB8IFx2ZXJifGxpbmt8IFx2ZXJifHNldHwgXHZlcmJ8bmFtZXwKK3RvIG1ha2UgaXQgbW9yZSBpbnRlbGxpZ2libGUuCisKK1RoZSBpbnRlcmZhY2UgbmFtZSBtYXkgaGF2ZSBhbm90aGVyIG5hbWUgb3IgXHZlcmJ8Tk9ORXwgYXBwZW5kZWQgCithZnRlciB0aGUgXHZlcmJ8QHwgc2lnbi4gVGhpcyBtZWFucyB0aGF0IHRoaXMgZGV2aWNlIGlzIGJvdW5kIHRvIHNvbWUgb3RoZXIKK2RldmljZSwKK2kuZS5cIHBhY2tldHMgc2VuZCB0aHJvdWdoIGl0IGFyZSBlbmNhcHN1bGF0ZWQgYW5kIHNlbnQgdmlhIHRoZSBgYG1hc3RlcicnCitkZXZpY2UuIElmIHRoZSBuYW1lIGlzIFx2ZXJifE5PTkV8LCB0aGUgbWFzdGVyIGlzIHVua25vd24uCisKK1RoZW4gd2Ugc2VlIHRoZSBpbnRlcmZhY2Uge1xlbSBtdHVcL30gKGBgbWF4aW1hbCB0cmFuc2ZlciB1bml0JycpLiBUaGlzIGRldGVybWluZXMKK3RoZSBtYXhpbWFsIHNpemUgb2YgZGF0YSB3aGljaCBjYW4gYmUgc2VudCBhcyBhIHNpbmdsZSBwYWNrZXQgb3ZlciB0aGlzIGludGVyZmFjZS4KKwore1xlbSBxZGlzY1wvfSAoYGBxdWV1aW5nIGRpc2NpcGxpbmUnJykgc2hvd3MgdGhlIHF1ZXVpbmcgYWxnb3JpdGhtIHVzZWQKK29uIHRoZSBpbnRlcmZhY2UuIFBhcnRpY3VsYXJseSwgXHZlcmJ8bm9xdWV1ZXwgbWVhbnMgdGhhdCB0aGlzIGludGVyZmFjZQorZG9lcyBub3QgcXVldWUgYW55dGhpbmcgYW5kIFx2ZXJifG5vb3B8IG1lYW5zIHRoYXQgdGhlIGludGVyZmFjZSBpcyBpbiBibGFja2hvbGUKK21vZGUgaS5lLlwgYWxsIHBhY2tldHMgc2VudCB0byBpdCBhcmUgaW1tZWRpYXRlbHkgZGlzY2FyZGVkLgore1xlbSBxbGVuXC99IGlzIHRoZSBkZWZhdWx0IHRyYW5zbWl0IHF1ZXVlIGxlbmd0aCBvZiB0aGUgZGV2aWNlIG1lYXN1cmVkCitpbiBwYWNrZXRzLgorCitUaGUgaW50ZXJmYWNlIGZsYWdzIGFyZSBzdW1tYXJpemVkIGluIHRoZSBhbmdsZSBicmFja2V0cy4KKworXGJlZ2lue2l0ZW1pemV9CitcaXRlbSBcdmVyYnxVUHwgLS0tIHRoZSBkZXZpY2UgaXMgdHVybmVkIG9uLiBJdCBpcyByZWFkeSB0byBhY2NlcHQKK3BhY2tldHMgZm9yIHRyYW5zbWlzc2lvbiBhbmQgaXQgbWF5IGluamVjdCBpbnRvIHRoZSBrZXJuZWwgcGFja2V0cyByZWNlaXZlZAorZnJvbSBvdGhlciBub2RlcyBvbiB0aGUgbmV0d29yay4KKworXGl0ZW0gXHZlcmJ8TE9PUEJBQ0t8IC0tLSB0aGUgaW50ZXJmYWNlIGRvZXMgbm90IGNvbW11bmljYXRlIHdpdGggb3RoZXIKK2hvc3RzLiBBbGwgcGFja2V0cyBzZW50IHRocm91Z2ggaXQgd2lsbCBiZSByZXR1cm5lZAorYW5kIG5vdGhpbmcgYnV0IGJvdW5jZWQgcGFja2V0cyBjYW4gYmUgcmVjZWl2ZWQuCisKK1xpdGVtIFx2ZXJifEJST0FEQ0FTVHwgLS0tIHRoZSBkZXZpY2UgaGFzIHRoZSBmYWNpbGl0eSB0byBzZW5kIHBhY2tldHMKK3RvIGFsbCBob3N0cyBzaGFyaW5nIHRoZSBzYW1lIGxpbmsuIEEgdHlwaWNhbCBleGFtcGxlIGlzIGFuIEV0aGVybmV0IGxpbmsuCisKK1xpdGVtIFx2ZXJifFBPSU5UT1BPSU5UfCAtLS0gdGhlIGxpbmsgaGFzIG9ubHkgdHdvIGVuZHMgd2l0aCBvbmUgbm9kZQorYXR0YWNoZWQgdG8gZWFjaCBlbmQuIEFsbCBwYWNrZXRzIHNlbnQgdG8gdGhpcyBsaW5rIHdpbGwgcmVhY2ggdGhlIHBlZXIKK2FuZCBhbGwgcGFja2V0cyByZWNlaXZlZCBieSB1cyBjYW1lIGZyb20gdGhpcyBzaW5nbGUgcGVlci4KKworSWYgbmVpdGhlciBcdmVyYnxMT09QQkFDS3wgbm9yIFx2ZXJifEJST0FEQ0FTVHwgbm9yIFx2ZXJifFBPSU5UT1BPSU5UfAorYXJlIHNldCwgdGhlIGludGVyZmFjZSBpcyBhc3N1bWVkIHRvIGJlIE5NQkEgKE5vbi1Ccm9hZGNhc3QgTXVsdGktQWNjZXNzKS4KK1RoaXMgaXMgdGhlIG1vc3QgZ2VuZXJpYyB0eXBlIG9mIGRldmljZSBhbmQgdGhlIG1vc3QgY29tcGxpY2F0ZWQgb25lLCBiZWNhdXNlCit0aGUgaG9zdCBhdHRhY2hlZCB0byBhIE5CTUEgbGluayBoYXMgbm8gbWVhbnMgdG8gc2VuZCB0byBhbnlvbmUKK3dpdGhvdXQgYWRkaXRpb25hbGx5IGNvbmZpZ3VyZWQgaW5mb3JtYXRpb24uCisKK1xpdGVtIFx2ZXJifE1VTFRJQ0FTVHwgLS0tIGlzIGFuIGFkdmlzb3J5IGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBpbnRlcmZhY2UKK2lzIGF3YXJlIG9mIG11bHRpY2FzdGluZyBpLmUuXCBzZW5kaW5nIHBhY2tldHMgdG8gc29tZSBzdWJzZXQgb2YgbmVpZ2hib3VyaW5nCitub2Rlcy4gQnJvYWRjYXN0aW5nIGlzIGEgcGFydGljdWxhciBjYXNlIG9mIG11bHRpY2FzdGluZywgd2hlcmUgdGhlIG11bHRpY2FzdAorZ3JvdXAgY29uc2lzdHMgb2YgYWxsIG5vZGVzIG9uIHRoZSBsaW5rLiBJdCBpcyBpbXBvcnRhbnQgdG8gZW1waGFzaXplCit0aGF0IHNvZnR3YXJlIHtcZW0gbXVzdCBub3RcL30gaW50ZXJwcmV0IHRoZSBhYnNlbmNlIG9mIHRoaXMgZmxhZyBhcyB0aGUgaW5hYmlsaXR5Cit0byB1c2UgbXVsdGljYXN0aW5nIG9uIHRoaXMgaW50ZXJmYWNlLiBBbnkgXHZlcmJ8UE9JTlRPUE9JTlR8IGFuZAorXHZlcmJ8QlJPQURDQVNUfCBsaW5rIGlzIG11bHRpY2FzdGluZyBieSBkZWZpbml0aW9uLCBiZWNhdXNlIHdlIGhhdmUKK2RpcmVjdCBhY2Nlc3MgdG8gYWxsIHRoZSBuZWlnaGJvdXJzIGFuZCwgaGVuY2UsIHRvIGFueSBwYXJ0IG9mIHRoZW0uCitDZXJ0YWlubHksIHRoZSB1c2Ugb2YgaGlnaCBiYW5kd2lkdGggbXVsdGljYXN0IHRyYW5zZmVycyBpcyBub3QgcmVjb21tZW5kZWQKK29uIGJyb2FkY2FzdC1vbmx5IGxpbmtzIGJlY2F1c2Ugb2YgaGlnaCBleHBlbnNlLCBidXQgaXQgaXMgbm90IHN0cmljdGx5Citwcm9oaWJpdGVkLgorCitcaXRlbSBcdmVyYnxQUk9NSVNDfCAtLS0gdGhlIGRldmljZSBsaXN0ZW5zIHRvIGFuZCBmZWVkcyB0byB0aGUga2VybmVsIGFsbAordHJhZmZpYyBvbiB0aGUgbGluayBldmVuIGlmIGl0IGlzIG5vdCBkZXN0aW5lZCBmb3IgdXMsIG5vdCBicm9hZGNhc3RlZAorYW5kIG5vdCBkZXN0aW5lZCBmb3IgYSBtdWx0aWNhc3QgZ3JvdXAgb2Ygd2hpY2ggd2UgYXJlIG1lbWJlci4gVXN1YWxseQordGhpcyBtb2RlIGV4aXN0cyBvbmx5IG9uIGJyb2FkY2FzdCBsaW5rcyBhbmQgaXMgdXNlZCBieSBicmlkZ2VzIGFuZCBmb3IgbmV0d29yaworbW9uaXRvcmluZy4KKworXGl0ZW0gXHZlcmJ8QUxMTVVMVEl8IC0tLSB0aGUgZGV2aWNlIHJlY2VpdmVzIGFsbCBtdWx0aWNhc3QgcGFja2V0cword2FuZGVyaW5nIG9uIHRoZSBsaW5rLiBUaGlzIG1vZGUgaXMgdXNlZCBieSBtdWx0aWNhc3Qgcm91dGVycy4KKworXGl0ZW0gXHZlcmJ8Tk9BUlB8IC0tLSB0aGlzIGZsYWcgaXMgZGlmZmVyZW50IGZyb20gdGhlIG90aGVyIG9uZXMuIEl0IGhhcworbm8gaW52YXJpYW50IHZhbHVlIGFuZCBpdHMgaW50ZXJwcmV0YXRpb24gZGVwZW5kcyBvbiB0aGUgbmV0d29yayBwcm90b2NvbHMKK2ludm9sdmVkLiBBcyBhIHJ1bGUsIGl0IGluZGljYXRlcyB0aGF0IHRoZSBkZXZpY2UgbmVlZHMgbm8gYWRkcmVzcworcmVzb2x1dGlvbiBhbmQgdGhhdCB0aGUgc29mdHdhcmUgb3IgaGFyZHdhcmUga25vd3MgaG93IHRvIGRlbGl2ZXIgcGFja2V0cword2l0aG91dCBhbnkgaGVscCBmcm9tIHRoZSBwcm90b2NvbCBzdGFja3MuCisKK1xpdGVtIFx2ZXJifERZTkFNSUN8IC0tLSBpcyBhbiBhZHZpc29yeSBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgaW50ZXJmYWNlIGlzCitkeW5hbWljYWxseSBjcmVhdGVkIGFuZCBkZXN0cm95ZWQuCisKK1xpdGVtIFx2ZXJifFNMQVZFfCAtLS0gdGhpcyBpbnRlcmZhY2UgaXMgYm9uZGVkIHRvIHNvbWUgb3RoZXIgaW50ZXJmYWNlcwordG8gc2hhcmUgbGluayBjYXBhY2l0aWVzLgorCitcZW5ke2l0ZW1pemV9CisKK1x2c2tpcCAxbW0KK1xiZWdpbntOQn0KK1RoZXJlIGFyZSBvdGhlciBmbGFncyBidXQgdGhleSBhcmUgZWl0aGVyIG9ic29sZXRlIChcdmVyYnxOT1RSQUlMRVJTfCkKK29yIG5vdCBpbXBsZW1lbnRlZCAoXHZlcmJ8REVCVUd8KSBvciBzcGVjaWZpYyB0byBzb21lIGRldmljZXMKKyhcdmVyYnxNQVNURVJ8LCBcdmVyYnxBVVRPTUVESUF8IGFuZCBcdmVyYnxQT1JUU0VMfCkuIFdlIGRvIG5vdCBkaXNjdXNzCit0aGVtIGhlcmUuCitcZW5ke05CfQorCisKK1RoZSBzZWNvbmQgbGluZSBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgbGluayBsYXllciBhZGRyZXNzZXMKK2Fzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlLiBUaGUgZmlyc3Qgd29yZCAoXHZlcmJ8ZXRoZXJ8LCBcdmVyYnxzaXR8KQorZGVmaW5lcyB0aGUgaW50ZXJmYWNlIGhhcmR3YXJlIHR5cGUuIFRoaXMgdHlwZSBkZXRlcm1pbmVzIHRoZSBmb3JtYXQgYW5kIHNlbWFudGljcworb2YgdGhlIGFkZHJlc3NlcyBhbmQgaXMgbG9naWNhbGx5IHBhcnQgb2YgdGhlIGFkZHJlc3MuCitUaGUgZGVmYXVsdCBmb3JtYXQgb2YgdGhlIHN0YXRpb24gYWRkcmVzcyBhbmQgdGhlIGJyb2FkY2FzdCBhZGRyZXNzCisob3IgdGhlIHBlZXIgYWRkcmVzcyBmb3IgcG9pbnRvcG9pbnQgbGlua3MpIGlzIGEKK3NlcXVlbmNlIG9mIGhleGFkZWNpbWFsIGJ5dGVzIHNlcGFyYXRlZCBieSBjb2xvbnMsIGJ1dCBzb21lIGxpbmsKK3R5cGVzIG1heSBoYXZlIHRoZWlyIG5hdHVyYWwgYWRkcmVzcyBmb3JtYXQsIGYuZS5cIGFkZHJlc3Nlcworb2YgdHVubmVscyBvdmVyIElQIGFyZSBwcmludGVkIGFzIGRvdHRlZC1xdWFkIElQIGFkZHJlc3Nlcy4KKworXHZza2lwIDFtbQorXGJlZ2lue05CfQorICBOQk1BIGxpbmtzIGhhdmUgbm8gd2VsbC1kZWZpbmVkIGJyb2FkY2FzdCBvciBwZWVyIGFkZHJlc3MsCisgIGhvd2V2ZXIgdGhpcyBmaWVsZCBtYXkgY29udGFpbiB1c2VmdWwgaW5mb3JtYXRpb24sIGYuZS5cCisgIGFib3V0IHRoZSBhZGRyZXNzIG9mIGJyb2FkY2FzdCByZWxheSBvciBhYm91dCB0aGUgYWRkcmVzcyBvZiB0aGUgQVJQIHNlcnZlci4KK1xlbmR7TkJ9CitcYmVnaW57TkJ9CitNdWx0aWNhc3QgYWRkcmVzc2VzIGFyZSBub3Qgc2hvd24gYnkgdGhpcyBjb21tYW5kLCBzZWUKK1x2ZXJifGlwIG1hZGRyIGxzfCBpbn5TZWMuXHJlZntJUC1NQUREUn0gKHAuXHBhZ2VyZWZ7SVAtTUFERFJ9IG9mIHRoaXMKK2RvY3VtZW50KS4KK1xlbmR7TkJ9CisKKworXHBhcmFncmFwaHtTdGF0aXN0aWNzOn0gV2l0aCB0aGUgXHZlcmJ8LXN0YXRpc3RpY3N8IG9wdGlvbiwgXHZlcmJ8aXB8IGFsc28KK3ByaW50cyBpbnRlcmZhY2Ugc3RhdGlzdGljczoKKworXGJlZ2lue3ZlcmJhdGltfQora3V6bmV0QGFsaXNhOn4gJCBpcCAtcyBsaW5rIGxzIGV0aDAKKzM6IGV0aDA6IDxCUk9BRENBU1QsTVVMVElDQVNULFVQPiBtdHUgMTUwMCBxZGlzYyBjYnEgcWxlbiAxMDAKKyAgICBsaW5rL2V0aGVyIDAwOmEwOmNjOjY2OjE4Ojc4IGJyZCBmZjpmZjpmZjpmZjpmZjpmZgorICAgIFJYOiBieXRlcyAgcGFja2V0cyAgZXJyb3JzICBkcm9wcGVkIG92ZXJydW4gbWNhc3QgICAKKyAgICAyNDQ5OTQ5MzYyIDI3ODYxODcgIDAgICAgICAgMCAgICAgICAwICAgICAgIDAgICAgICAKKyAgICBUWDogYnl0ZXMgIHBhY2tldHMgIGVycm9ycyAgZHJvcHBlZCBjYXJyaWVyIGNvbGxzbnMgCisgICAgMTc4NTU4NDk3ICAxNzgzOTQ1ICAzMzIgICAgIDAgICAgICAgMzMyICAgICAzNTE3MiAgCitrdXpuZXRAYWxpc2E6fiAkCitcZW5ke3ZlcmJhdGltfQorXHZlcmJ8Ulg6fCBhbmQgXHZlcmJ8VFg6fCBsaW5lcyBzdW1tYXJpemUgcmVjZWl2ZXIgYW5kIHRyYW5zbWl0dGVyCitzdGF0aXN0aWNzLiBUaGV5IGNvbnRhaW46CitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIFx2ZXJifGJ5dGVzfCAtLS0gdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCBvciB0cmFuc21pdHRlZAorb24gdGhlIGludGVyZmFjZS4gVGhpcyBudW1iZXIgd3JhcHMgd2hlbiB0aGUgbWF4aW1hbCBsZW5ndGggb2YgdGhlIGRhdGEgdHlwZQorbmF0dXJhbCBmb3IgdGhlIGFyY2hpdGVjdHVyZSBpcyBleGNlZWRlZCwgc28gY29udGludW91cyBtb25pdG9yaW5nIHJlcXVpcmVzCithIHVzZXIgbGV2ZWwgZGFlbW9uIHNuYXBwaW5nIGl0IHBlcmlvZGljYWxseS4KK1xpdGVtIFx2ZXJifHBhY2tldHN8IC0tLSB0aGUgdG90YWwgbnVtYmVyIG9mIHBhY2tldHMgcmVjZWl2ZWQgb3IgdHJhbnNtaXR0ZWQKK29uIHRoZSBpbnRlcmZhY2UuCitcaXRlbSBcdmVyYnxlcnJvcnN8IC0tLSB0aGUgdG90YWwgbnVtYmVyIG9mIHJlY2VpdmVyIG9yIHRyYW5zbWl0dGVyIGVycm9ycy4KK1xpdGVtIFx2ZXJifGRyb3BwZWR8IC0tLSB0aGUgdG90YWwgbnVtYmVyIG9mIHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gbGFjaworb2YgcmVzb3VyY2VzLgorXGl0ZW0gXHZlcmJ8b3ZlcnJ1bnwgLS0tIHRoZSB0b3RhbCBudW1iZXIgb2YgcmVjZWl2ZXIgb3ZlcnJ1bnMgcmVzdWx0aW5nCitpbiBkcm9wcGVkIHBhY2tldHMuIEFzIGEgcnVsZSwgaWYgdGhlIGludGVyZmFjZSBpcyBvdmVycnVuLCBpdCBtZWFucworc2VyaW91cyBwcm9ibGVtcyBpbiB0aGUga2VybmVsIG9yIHRoYXQgeW91ciBtYWNoaW5lIGlzIHRvbyBzbG93Citmb3IgdGhpcyBpbnRlcmZhY2UuCitcaXRlbSBcdmVyYnxtY2FzdHwgLS0tIHRoZSB0b3RhbCBudW1iZXIgb2YgcmVjZWl2ZWQgbXVsdGljYXN0IHBhY2tldHMuIFRoaXMgb3B0aW9uCitpcyBvbmx5IHN1cHBvcnRlZCBieSBhIGZldyBkZXZpY2VzLgorXGl0ZW0gXHZlcmJ8Y2FycmllcnwgLS0tIHRvdGFsIG51bWJlciBvZiBsaW5rIG1lZGlhIGZhaWx1cmVzIGYuZS5cIGJlY2F1c2UKK29mIGxvc3QgY2Fycmllci4KK1xpdGVtIFx2ZXJifGNvbGxzbnN8IC0tLSB0aGUgdG90YWwgbnVtYmVyIG9mIGNvbGxpc2lvbiBldmVudHMKK29uIEV0aGVybmV0LWxpa2UgbWVkaWEuIFRoaXMgbnVtYmVyIG1heSBoYXZlIGEgZGlmZmVyZW50IHNlbnNlIG9uIG90aGVyCitsaW5rIHR5cGVzLgorXGl0ZW0gXHZlcmJ8Y29tcHJlc3NlZHwgLS0tIHRoZSB0b3RhbCBudW1iZXIgb2YgY29tcHJlc3NlZCBwYWNrZXRzLiBUaGlzIGlzCithdmFpbGFibGUgb25seSBmb3IgbGlua3MgdXNpbmcgVkogaGVhZGVyIGNvbXByZXNzaW9uLgorXGVuZHtpdGVtaXplfQorCisKK0lmIHRoZSBcdmVyYnwtc3wgb3B0aW9uIGlzIGVudGVyZWQgdHdpY2Ugb3IgbW9yZSwKK1x2ZXJifGlwfCBwcmludHMgbW9yZSBkZXRhaWxlZCBzdGF0aXN0aWNzIG9uIHJlY2VpdmVyCithbmQgdHJhbnNtaXR0ZXIgZXJyb3JzLgorCitcYmVnaW57dmVyYmF0aW19CitrdXpuZXRAYWxpc2E6fiAkIGlwIC1zIC1zIGxpbmsgbHMgZXRoMAorMzogZXRoMDogPEJST0FEQ0FTVCxNVUxUSUNBU1QsVVA+IG10dSAxNTAwIHFkaXNjIGNicSBxbGVuIDEwMAorICAgIGxpbmsvZXRoZXIgMDA6YTA6Y2M6NjY6MTg6NzggYnJkIGZmOmZmOmZmOmZmOmZmOmZmCisgICAgUlg6IGJ5dGVzICBwYWNrZXRzICBlcnJvcnMgIGRyb3BwZWQgb3ZlcnJ1biBtY2FzdCAgIAorICAgIDI0NDk5NDkzNjIgMjc4NjE4NyAgMCAgICAgICAwICAgICAgIDAgICAgICAgMCAgICAgIAorICAgIFJYIGVycm9yczogbGVuZ3RoICAgY3JjICAgICBmcmFtZSAgIGZpZm8gICAgbWlzc2VkCisgICAgICAgICAgICAgICAwICAgICAgICAwICAgICAgIDAgICAgICAgMCAgICAgICAwICAgICAgCisgICAgVFg6IGJ5dGVzICBwYWNrZXRzICBlcnJvcnMgIGRyb3BwZWQgY2FycmllciBjb2xsc25zIAorICAgIDE3ODU1ODQ5NyAgMTc4Mzk0NSAgMzMyICAgICAwICAgICAgIDMzMiAgICAgMzUxNzIgIAorICAgIFRYIGVycm9yczogYWJvcnRlZCAgZmlmbyAgICB3aW5kb3cgIGhlYXJ0YmVhdAorICAgICAgICAgICAgICAgMCAgICAgICAgMCAgICAgICAwICAgICAgIDMzMiAgICAKK2t1em5ldEBhbGlzYTp+ICQKK1xlbmR7dmVyYmF0aW19CitUaGVzZSBlcnJvciBuYW1lcyBhcmUgcHVyZSBFdGhlcm5ldGlzbXMuIE90aGVyIGRldmljZXMKK21heSBoYXZlIG5vbiB6ZXJvIHZhbHVlcyBpbiB0aGVzZSBmaWVsZHMgYnV0IHRoZXkgbWF5IGJlCitpbnRlcnByZXRlZCBkaWZmZXJlbnRseS4KKworCitcc2VjdGlvbnt7XHR0IGlwIGFkZHJlc3N9IC0tLSBwcm90b2NvbCBhZGRyZXNzIG1hbmFnZW1lbnR9CisKK1xwYXJhZ3JhcGh7QWJicmV2aWF0aW9uczp9IFx2ZXJifGFkZHJlc3N8LCBcdmVyYnxhZGRyfCwgXHZlcmJ8YXwuCisKK1xwYXJhZ3JhcGh7T2JqZWN0On0gVGhlIFx2ZXJifGFkZHJlc3N8IGlzIGEgcHJvdG9jb2wgKElQIG9yIElQdjYpIGFkZHJlc3MgYXR0YWNoZWQKK3RvIGEgbmV0d29yayBkZXZpY2UuIEVhY2ggZGV2aWNlIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgYWRkcmVzcwordG8gdXNlIHRoZSBjb3JyZXNwb25kaW5nIHByb3RvY29sLiBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIHNldmVyYWwKK2RpZmZlcmVudCBhZGRyZXNzZXMgYXR0YWNoZWQgdG8gb25lIGRldmljZS4gVGhlc2UgYWRkcmVzc2VzIGFyZSBub3QKK2Rpc2NyaW1pbmF0ZWQsIHNvIHRoYXQgdGhlIHRlcm0ge1xlbSBhbGlhc1wvfSBpcyBub3QgcXVpdGUgYXBwcm9wcmlhdGUKK2ZvciB0aGVtIGFuZCB3ZSBkbyBub3QgdXNlIGl0IGluIHRoaXMgZG9jdW1lbnQuCisKK1RoZSBcdmVyYnxpcCBhZGRyfCBjb21tYW5kIGRpc3BsYXlzIGFkZHJlc3NlcyBhbmQgdGhlaXIgcHJvcGVydGllcywKK2FkZHMgbmV3IGFkZHJlc3NlcyBhbmQgZGVsZXRlcyBvbGQgb25lcy4KKworXHBhcmFncmFwaHtDb21tYW5kczp9IFx2ZXJifGFkZHwsIFx2ZXJifGRlbGV0ZXwsIFx2ZXJifGZsdXNofCBhbmQgXHZlcmJ8c2hvd3wKKyhvciBcdmVyYnxsaXN0fCkuCisKKworXHN1YnNlY3Rpb257e1x0dCBpcCBhZGRyZXNzIGFkZH0gLS0tIGFkZCBhIG5ldyBwcm90b2NvbCBhZGRyZXNzfQorXGxhYmVse0lQLUFERFItQUREfQorCitccGFyYWdyYXBoe0FiYnJldmlhdGlvbnM6fSBcdmVyYnxhZGR8LCBcdmVyYnxhfC4KKworXHBhcmFncmFwaHtBcmd1bWVudHM6fQorCitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIFx2ZXJifGRldiBOQU1FfAorCitcbm9pbmRlbnQtLS0gdGhlIG5hbWUgb2YgdGhlIGRldmljZSB0byBhZGQgdGhlIGFkZHJlc3MgdG8uCisKK1xpdGVtIFx2ZXJifGxvY2FsIEFERFJFU1N8IChkZWZhdWx0KQorCistLS0gdGhlIGFkZHJlc3Mgb2YgdGhlIGludGVyZmFjZS4gVGhlIGZvcm1hdCBvZiB0aGUgYWRkcmVzcyBkZXBlbmRzCitvbiB0aGUgcHJvdG9jb2wuIEl0IGlzIGEgZG90dGVkIHF1YWQgZm9yIElQIGFuZCBhIHNlcXVlbmNlIG9mIGhleGFkZWNpbWFsIGhhbGZ3b3Jkcworc2VwYXJhdGVkIGJ5IGNvbG9ucyBmb3IgSVB2Ni4gVGhlIFx2ZXJifEFERFJFU1N8IG1heSBiZSBmb2xsb3dlZCBieQorYSBzbGFzaCBhbmQgYSBkZWNpbWFsIG51bWJlciB3aGljaCBlbmNvZGVzIHRoZSBuZXR3b3JrIHByZWZpeCBsZW5ndGguCisKKworXGl0ZW0gXHZlcmJ8cGVlciBBRERSRVNTfAorCistLS0gdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBlbmRwb2ludCBmb3IgcG9pbnRvcG9pbnQgaW50ZXJmYWNlcy4KK0FnYWluLCB0aGUgXHZlcmJ8QUREUkVTU3wgbWF5IGJlIGZvbGxvd2VkIGJ5IGEgc2xhc2ggYW5kIGEgZGVjaW1hbCBudW1iZXIsCitlbmNvZGluZyB0aGUgbmV0d29yayBwcmVmaXggbGVuZ3RoLiBJZiBhIHBlZXIgYWRkcmVzcyBpcyBzcGVjaWZpZWQsCit0aGUgbG9jYWwgYWRkcmVzcyB7XGVtIGNhbm5vdFwvfSBoYXZlIGEgcHJlZml4IGxlbmd0aC4gVGhlIG5ldHdvcmsgcHJlZml4IGlzIGFzc29jaWF0ZWQKK3dpdGggdGhlIHBlZXIgcmF0aGVyIHRoYW4gd2l0aCB0aGUgbG9jYWwgYWRkcmVzcy4KKworCitcaXRlbSBcdmVyYnxicm9hZGNhc3QgQUREUkVTU3wKKworLS0tIHRoZSBicm9hZGNhc3QgYWRkcmVzcyBvbiB0aGUgaW50ZXJmYWNlLgorCitJdCBpcyBwb3NzaWJsZSB0byB1c2UgdGhlIHNwZWNpYWwgc3ltYm9scyBcdmVyYnwnKyd8IGFuZCBcdmVyYnwnLSd8CitpbnN0ZWFkIG9mIHRoZSBicm9hZGNhc3QgYWRkcmVzcy4gSW4gdGhpcyBjYXNlLCB0aGUgYnJvYWRjYXN0IGFkZHJlc3MKK2lzIGRlcml2ZWQgYnkgc2V0dGluZy9yZXNldHRpbmcgdGhlIGhvc3QgYml0cyBvZiB0aGUgaW50ZXJmYWNlIHByZWZpeC4KKworXHZza2lwIDFtbQorXGJlZ2lue05CfQorVW5saWtlIFx2ZXJifGlmY29uZmlnfCwgdGhlIFx2ZXJifGlwfCB1dGlsaXR5IHtcZW0gZG9lcyBub3RcL30gc2V0IGFueSBicm9hZGNhc3QKK2FkZHJlc3MgdW5sZXNzIGV4cGxpY2l0bHkgcmVxdWVzdGVkLgorXGVuZHtOQn0KKworCitcaXRlbSBcdmVyYnxsYWJlbCBOQU1FfAorCistLS0gRWFjaCBhZGRyZXNzIG1heSBiZSB0YWdnZWQgd2l0aCBhIGxhYmVsIHN0cmluZy4KK0luIG9yZGVyIHRvIHByZXNlcnZlIGNvbXBhdGliaWxpdHkgd2l0aCBMaW51eC0yLjAgbmV0IGFsaWFzZXMsCit0aGlzIHN0cmluZyBtdXN0IGNvaW5jaWRlIHdpdGggdGhlIG5hbWUgb2YgdGhlIGRldmljZSBvciBtdXN0IGJlIHByZWZpeGVkCit3aXRoIHRoZSBkZXZpY2UgbmFtZSBmb2xsb3dlZCBieSBjb2xvbi4KKworCitcaXRlbSBcdmVyYnxzY29wZSBTQ09QRV9WQUxVRXwKKworLS0tIHRoZSBzY29wZSBvZiB0aGUgYXJlYSB3aGVyZSB0aGlzIGFkZHJlc3MgaXMgdmFsaWQuCitUaGUgYXZhaWxhYmxlIHNjb3BlcyBhcmUgbGlzdGVkIGluIGZpbGUgXHZlcmJ8L2V0Yy9pcHJvdXRlMi9ydF9zY29wZXN8LgorUHJlZGVmaW5lZCBzY29wZSB2YWx1ZXMgYXJlOgorCisgXGJlZ2lue2l0ZW1pemV9CisJXGl0ZW0gXHZlcmJ8Z2xvYmFsfCAtLS0gdGhlIGFkZHJlc3MgaXMgZ2xvYmFsbHkgdmFsaWQuCisJXGl0ZW0gXHZlcmJ8c2l0ZXwgLS0tIChJUHY2IG9ubHkpIHRoZSBhZGRyZXNzIGlzIHNpdGUgbG9jYWwsCisJaS5lLlwgaXQgaXMgdmFsaWQgaW5zaWRlIHRoaXMgc2l0ZS4KKwlcaXRlbSBcdmVyYnxsaW5rfCAtLS0gdGhlIGFkZHJlc3MgaXMgbGluayBsb2NhbCwgaS5lLlwgCisJaXQgaXMgdmFsaWQgb25seSBvbiB0aGlzIGRldmljZS4KKwlcaXRlbSBcdmVyYnxob3N0fCAtLS0gdGhlIGFkZHJlc3MgaXMgdmFsaWQgb25seSBpbnNpZGUgdGhpcyBob3N0LgorIFxlbmR7aXRlbWl6ZX0KKworQXBwZW5kaXh+XHJlZntBRERSLVNFTH0gKHAuXHBhZ2VyZWZ7QUREUi1TRUx9IG9mIHRoaXMgZG9jdW1lbnQpCitjb250YWlucyBtb3JlIGRldGFpbHMgb24gYWRkcmVzcyBzY29wZXMuCisKK1xlbmR7aXRlbWl6ZX0KKworXHBhcmFncmFwaHtFeGFtcGxlczp9CitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIFx2ZXJifGlwIGFkZHIgYWRkIDEyNy4wLjAuMS84IGRldiBsbyBicmQgKyBzY29wZSBob3N0fAorCistLS0gYWRkIHRoZSB1c3VhbCBsb29wYmFjayBhZGRyZXNzIHRvIHRoZSBsb29wYmFjayBkZXZpY2UuCisKK1xpdGVtIFx2ZXJifGlwIGFkZHIgYWRkIDEwLjAuMC4xLzI0IGJyZCArIGRldiBldGgwIGxhYmVsIGV0aDA6QWxpYXN8CisKKy0tLSBhZGQgdGhlIGFkZHJlc3MgMTAuMC4wLjEgd2l0aCBwcmVmaXggbGVuZ3RoIDI0IChpLmUuXCBuZXRtYXNrCitcdmVyYnwyNTUuMjU1LjI1NS4wfCksIHN0YW5kYXJkIGJyb2FkY2FzdCBhbmQgbGFiZWwgXHZlcmJ8ZXRoMDpBbGlhc3wKK3RvIHRoZSBpbnRlcmZhY2UgXHZlcmJ8ZXRoMHwuCitcZW5ke2l0ZW1pemV9CisKKworXHN1YnNlY3Rpb257e1x0dCBpcCBhZGRyZXNzIGRlbGV0ZX0gLS0tIGRlbGV0ZSBhIHByb3RvY29sIGFkZHJlc3N9CisKK1xwYXJhZ3JhcGh7QWJicmV2aWF0aW9uczp9IFx2ZXJifGRlbGV0ZXwsIFx2ZXJifGRlbHwsIFx2ZXJifGR8LgorCitccGFyYWdyYXBoe0FyZ3VtZW50czp9IGNvaW5jaWRlIHdpdGggdGhlIGFyZ3VtZW50cyBvZiBcdmVyYnxpcCBhZGRyIGFkZHwuCitUaGUgZGV2aWNlIG5hbWUgaXMgYSByZXF1aXJlZCBhcmd1bWVudC4gVGhlIHJlc3QgYXJlIG9wdGlvbmFsLgorSWYgbm8gYXJndW1lbnRzIGFyZSBnaXZlbiwgdGhlIGZpcnN0IGFkZHJlc3MgaXMgZGVsZXRlZC4KKworXHBhcmFncmFwaHtFeGFtcGxlczp9CitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIFx2ZXJifGlwIGFkZHIgZGVsIDEyNy4wLjAuMS84IGRldiBsb3wKKworLS0tIGRlbGV0ZXMgdGhlIGxvb3BiYWNrIGFkZHJlc3MgZnJvbSB0aGUgbG9vcGJhY2sgZGV2aWNlLgorSXQgd291bGQgYmUgYmVzdCBub3QgdG8gcmVwZWF0IHRoaXMgZXhwZXJpbWVudC4KKworXGl0ZW0gRGlzYWJsZSBJUCBvbiB0aGUgaW50ZXJmYWNlIFx2ZXJifGV0aDB8OgorXGJlZ2lue3ZlcmJhdGltfQorICB3aGlsZSBpcCAtZiBpbmV0IGFkZHIgZGVsIGRldiBldGgwOyBkbworICAgIDogbm90aGluZworICBkb25lCitcZW5ke3ZlcmJhdGltfQorQW5vdGhlciBtZXRob2QgdG8gZGlzYWJsZSBJUCBvbiBhbiBpbnRlcmZhY2UgdXNpbmcge1x0dCBpcCBhZGRyIGZsdXNofQorbWF5IGJlIGZvdW5kIGluIHNlYy5ccmVme0lQLUFERFItRkxVU0h9LCBwLlxwYWdlcmVme0lQLUFERFItRkxVU0h9LgorCitcZW5ke2l0ZW1pemV9CisKKworXHN1YnNlY3Rpb257e1x0dCBpcCBhZGRyZXNzIHNob3d9IC0tLSBkaXNwbGF5IHByb3RvY29sIGFkZHJlc3Nlc30KKworXHBhcmFncmFwaHtBYmJyZXZpYXRpb25zOn0gXHZlcmJ8c2hvd3wsIFx2ZXJifGxpc3R8LCBcdmVyYnxsc3R8LCBcdmVyYnxzaHwsIFx2ZXJifGxzfCwKK1x2ZXJifGx8LgorCitccGFyYWdyYXBoe0FyZ3VtZW50czp9CisKK1xiZWdpbntpdGVtaXplfQorXGl0ZW0gXHZlcmJ8ZGV2IE5BTUV8IChkZWZhdWx0KQorCistLS0gdGhlIG5hbWUgb2YgdGhlIGRldmljZS4KKworXGl0ZW0gXHZlcmJ8c2NvcGUgU0NPUEVfVkFMfAorCistLS0gb25seSBsaXN0IGFkZHJlc3NlcyB3aXRoIHRoaXMgc2NvcGUuCisKK1xpdGVtIFx2ZXJifHRvIFBSRUZJWHwKKworLS0tIG9ubHkgbGlzdCBhZGRyZXNzZXMgbWF0Y2hpbmcgdGhpcyBwcmVmaXguCisKK1xpdGVtIFx2ZXJifGxhYmVsIFBBVFRFUk58CisKKy0tLSBvbmx5IGxpc3QgYWRkcmVzc2VzIHdpdGggbGFiZWxzIG1hdGNoaW5nIHRoZSBcdmVyYnxQQVRURVJOfC4KK1x2ZXJifFBBVFRFUk58IGlzIGEgdXN1YWwgc2hlbGwgc3R5bGUgcGF0dGVybi4KKworCitcaXRlbSBcdmVyYnxkeW5hbWljfCBhbmQgXHZlcmJ8cGVybWFuZW50fAorCistLS0gKElQdjYgb25seSkgb25seSBsaXN0IGFkZHJlc3NlcyBpbnN0YWxsZWQgZHVlIHRvIHN0YXRlbGVzcworYWRkcmVzcyBjb25maWd1cmF0aW9uIG9yIG9ubHkgbGlzdCBwZXJtYW5lbnQgKG5vdCBkeW5hbWljKSBhZGRyZXNzZXMuCisKK1xpdGVtIFx2ZXJifHRlbnRhdGl2ZXwKKworLS0tIChJUHY2IG9ubHkpIG9ubHkgbGlzdCBhZGRyZXNzZXMgd2hpY2ggZGlkIG5vdCBwYXNzIGR1cGxpY2F0ZQorYWRkcmVzcyBkZXRlY3Rpb24uCisKK1xpdGVtIFx2ZXJifGRlcHJlY2F0ZWR8CisKKy0tLSAoSVB2NiBvbmx5KSBvbmx5IGxpc3QgZGVwcmVjYXRlZCBhZGRyZXNzZXMuCisKKworXGl0ZW0gIFx2ZXJifHByaW1hcnl8IGFuZCBcdmVyYnxzZWNvbmRhcnl8CisKKy0tLSBvbmx5IGxpc3QgcHJpbWFyeSAob3Igc2Vjb25kYXJ5KSBhZGRyZXNzZXMuCisKK1xlbmR7aXRlbWl6ZX0KKworCitccGFyYWdyYXBoe091dHB1dCBmb3JtYXQ6fQorCitcYmVnaW57dmVyYmF0aW19CitrdXpuZXRAYWxpc2E6fiAkIGlwIGFkZHIgbHMgZXRoMAorMzogZXRoMDogPEJST0FEQ0FTVCxNVUxUSUNBU1QsVVA+IG10dSAxNTAwIHFkaXNjIGNicSBxbGVuIDEwMAorICAgIGxpbmsvZXRoZXIgMDA6YTA6Y2M6NjY6MTg6NzggYnJkIGZmOmZmOmZmOmZmOmZmOmZmCisgICAgaW5ldCAxOTMuMjMzLjcuOTAvMjQgYnJkIDE5My4yMzMuNy4yNTUgc2NvcGUgZ2xvYmFsIGV0aDAKKyAgICBpbmV0NiAzZmZlOjI0MDA6MDoxOjJhMDpjY2ZmOmZlNjY6MTg3OC82NCBzY29wZSBnbG9iYWwgZHluYW1pYyAKKyAgICAgICB2YWxpZF9sZnQgZm9yZXZlciBwcmVmZXJyZWRfbGZ0IDYwNDc0NnNlYworICAgIGluZXQ2IGZlODA6OjJhMDpjY2ZmOmZlNjY6MTg3OC8xMCBzY29wZSBsaW5rIAora3V6bmV0QGFsaXNhOn4gJCAKK1xlbmR7dmVyYmF0aW19CisKK1RoZSBmaXJzdCB0d28gbGluZXMgY29pbmNpZGUgd2l0aCB0aGUgb3V0cHV0IG9mIFx2ZXJifGlwIGxpbmsgbHN8LgorSXQgaXMgbmF0dXJhbCB0byBpbnRlcnByZXQgbGluayBsYXllciBhZGRyZXNzZXMKK2FzIGFkZHJlc3NlcyBvZiB0aGUgcHJvdG9jb2wgZmFtaWx5IFx2ZXJifEFGX1BBQ0tFVHwuCisKK1RoZW4gdGhlIGxpc3Qgb2YgSVAgYW5kIElQdjYgYWRkcmVzc2VzIGZvbGxvd3MsIGFjY29tcGFuaWVkIGJ5CithZGRpdGlvbmFsIGFkZHJlc3MgYXR0cmlidXRlczogc2NvcGUgdmFsdWUgKHNlZSBTZWMuXHJlZntJUC1BRERSLUFERH0sCitwLlxwYWdlcmVme0lQLUFERFItQUREfSBhYm92ZSksIGZsYWdzIGFuZCB0aGUgYWRkcmVzcyBsYWJlbC4KKworQWRkcmVzcyBmbGFncyBhcmUgc2V0IGJ5IHRoZSBrZXJuZWwgYW5kIGNhbm5vdCBiZSBjaGFuZ2VkCithZG1pbmlzdHJhdGl2ZWx5LiBDdXJyZW50bHksIHRoZSBmb2xsb3dpbmcgZmxhZ3MgYXJlIGRlZmluZWQ6CisKK1xiZWdpbntlbnVtZXJhdGV9CitcaXRlbSBcdmVyYnxzZWNvbmRhcnl8CisKKy0tLSB0aGUgYWRkcmVzcyBpcyBub3QgdXNlZCB3aGVuIHNlbGVjdGluZyB0aGUgZGVmYXVsdCBzb3VyY2UgYWRkcmVzcworb2Ygb3V0Z29pbmcgcGFja2V0cyAoQ2YuXCBBcHBlbmRpeH5ccmVme0FERFItU0VMfSwgcC5ccGFnZXJlZntBRERSLVNFTH0uKS4KK0FuIElQIGFkZHJlc3MgYmVjb21lcyBzZWNvbmRhcnkgaWYgYW5vdGhlciBhZGRyZXNzIHdpdGggdGhlIHNhbWUKK3ByZWZpeCBiaXRzIGFscmVhZHkgZXhpc3RzLiBUaGUgZmlyc3QgYWRkcmVzcyBpcyBwcmltYXJ5LgorSXQgaXMgdGhlIGxlYWRlciBvZiB0aGUgZ3JvdXAgb2YgYWxsIHNlY29uZGFyeSBhZGRyZXNzZXMuIFdoZW4gdGhlIGxlYWRlcgoraXMgZGVsZXRlZCwgYWxsIHNlY29uZGFyaWVzIGFyZSBwdXJnZWQgdG9vLgorVGhlcmUgaXMgYSB0d2VhayBpbiBcdmVyYnwvcHJvYy9zeXMvbmV0L2lwdjQvY29uZi88ZGV2Pi9wcm9tb3RlX3NlY29uZGFyaWVzfAord2hpY2ggYWN0aXZhdGUgc2Vjb25kYXJpZXMgcHJvbW90aW9uIHdoZW4gYSBwcmltYXJ5IGlzIGRlbGV0ZWQuCitUbyBwZXJtYW5lbnRseSBlbmFibGUgdGhpcyBmZWF0dXJlIG9uIGFsbCBkZXZpY2VzIGFkZAorXHZlcmJ8bmV0LmlwdjQuY29uZi5hbGwucHJvbW90ZV9zZWNvbmRhcmllcz0xfCB0byBcdmVyYnwvZXRjL3N5c2N0bC5jb25mfC4KK1RoaXMgdHdlYWsgaXMgYXZhaWxhYmxlIGluIGxpbnV4IDIuNi4xNSBhbmQgbGF0ZXIuCisKKworXGl0ZW0gXHZlcmJ8ZHluYW1pY3wKKworLS0tIHRoZSBhZGRyZXNzIHdhcyBjcmVhdGVkIGR1ZSB0byBzdGF0ZWxlc3MgYXV0b2NvbmZpZ3VyYXRpb25+XGNpdGV7UkZDLUFERFJDT05GfS4KK0luIHRoaXMgY2FzZSB0aGUgb3V0cHV0IGFsc28gY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGltZXMsIHdoZW4KK3RoZSBhZGRyZXNzIGlzIHN0aWxsIHZhbGlkLiBBZnRlciBcdmVyYnxwcmVmZXJyZWRfbGZ0fCBleHBpcmVzIHRoZSBhZGRyZXNzIGlzCittb3ZlZCB0byB0aGUgZGVwcmVjYXRlZCBzdGF0ZS4gQWZ0ZXIgXHZlcmJ8dmFsaWRfbGZ0fCBleHBpcmVzIHRoZSBhZGRyZXNzCitpcyBmaW5hbGx5IGludmFsaWRhdGVkLgorCitcaXRlbSBcdmVyYnxkZXByZWNhdGVkfAorCistLS0gdGhlIGFkZHJlc3MgaXMgZGVwcmVjYXRlZCwgaS5lLlwgaXQgaXMgc3RpbGwgdmFsaWQsIGJ1dCBjYW5ub3QKK2JlIHVzZWQgYnkgbmV3bHkgY3JlYXRlZCBjb25uZWN0aW9ucy4KKworXGl0ZW0gXHZlcmJ8dGVudGF0aXZlfAorCistLS0gdGhlIGFkZHJlc3MgaXMgbm90IHVzZWQgYmVjYXVzZSBkdXBsaWNhdGUgYWRkcmVzcyBkZXRlY3Rpb25+XGNpdGV7UkZDLUFERFJDT05GfQoraXMgc3RpbGwgbm90IGNvbXBsZXRlIG9yIGZhaWxlZC4KKworXGVuZHtlbnVtZXJhdGV9CisKKworXHN1YnNlY3Rpb257e1x0dCBpcCBhZGRyZXNzIGZsdXNofSAtLS0gZmx1c2ggcHJvdG9jb2wgYWRkcmVzc2VzfQorXGxhYmVse0lQLUFERFItRkxVU0h9CisKK1xwYXJhZ3JhcGh7QWJicmV2aWF0aW9uczp9IFx2ZXJifGZsdXNofCwgXHZlcmJ8ZnwuCisKK1xwYXJhZ3JhcGh7RGVzY3JpcHRpb246fVRoaXMgY29tbWFuZCBmbHVzaGVzIHRoZSBwcm90b2NvbCBhZGRyZXNzZXMKK3NlbGVjdGVkIGJ5IHNvbWUgY3JpdGVyaWEuCisKK1xwYXJhZ3JhcGh7QXJndW1lbnRzOn0gVGhpcyBjb21tYW5kIGhhcyB0aGUgc2FtZSBhcmd1bWVudHMgYXMgXHZlcmJ8c2hvd3wuCitUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IGl0IGRvZXMgbm90IHJ1biB3aGVuIG5vIGFyZ3VtZW50cyBhcmUgZ2l2ZW4uCisKK1xwYXJhZ3JhcGh7V2FybmluZzp9IFRoaXMgY29tbWFuZCAoYW5kIG90aGVyIFx2ZXJifGZsdXNofCBjb21tYW5kcworZGVzY3JpYmVkIGJlbG93KSBpcyBwcmV0dHkgZGFuZ2Vyb3VzLiBJZiB5b3UgbWFrZSBhIG1pc3Rha2UsIGl0IHdpbGwKK25vdCBmb3JnaXZlIGl0LCBidXQgd2lsbCBjcnVlbGx5IHB1cmdlIGFsbCB0aGUgYWRkcmVzc2VzLgorCitccGFyYWdyYXBoe1N0YXRpc3RpY3M6fSBXaXRoIHRoZSBcdmVyYnwtc3RhdGlzdGljc3wgb3B0aW9uLCB0aGUgY29tbWFuZAorYmVjb21lcyB2ZXJib3NlLiBJdCBwcmludHMgb3V0IHRoZSBudW1iZXIgb2YgZGVsZXRlZCBhZGRyZXNzZXMgYW5kIHRoZSBudW1iZXIKK29mIHJvdW5kcyBtYWRlIHRvIGZsdXNoIHRoZSBhZGRyZXNzIGxpc3QuIElmIHRoaXMgb3B0aW9uIGlzIGdpdmVuCit0d2ljZSwgXHZlcmJ8aXAgYWRkciBmbHVzaHwgYWxzbyBkdW1wcyBhbGwgdGhlIGRlbGV0ZWQgYWRkcmVzc2VzCitpbiB0aGUgZm9ybWF0IGRlc2NyaWJlZCBpbiB0aGUgcHJldmlvdXMgc3Vic2VjdGlvbi4KKworXHBhcmFncmFwaHtFeGFtcGxlOn0gRGVsZXRlIGFsbCB0aGUgYWRkcmVzc2VzIGZyb20gdGhlIHByaXZhdGUgbmV0d29yaworMTAuMC4wLjAvODoKK1xiZWdpbnt2ZXJiYXRpbX0KK25ldGFkbUBhbWJlcjp+ICMgaXAgLXMgLXMgYSBmIHRvIDEwLzgKKzI6IGR1bW15ICAgIGluZXQgMTAuNy43LjcvMTYgYnJkIDEwLjcuMjU1LjI1NSBzY29wZSBnbG9iYWwgZHVtbXkKKzM6IGV0aDAgICAgaW5ldCAxMC4xMC43LjcvMTYgYnJkIDEwLjEwLjI1NS4yNTUgc2NvcGUgZ2xvYmFsIGV0aDAKKzQ6IGV0aDEgICAgaW5ldCAxMC44LjcuNy8xNiBicmQgMTAuOC4yNTUuMjU1IHNjb3BlIGdsb2JhbCBldGgxCisKKyoqKiBSb3VuZCAxLCBkZWxldGluZyAzIGFkZHJlc3NlcyAqKioKKyoqKiBGbHVzaCBpcyBjb21wbGV0ZSBhZnRlciAxIHJvdW5kICoqKgorbmV0YWRtQGFtYmVyOn4gIyAKK1xlbmR7dmVyYmF0aW19CitBbm90aGVyIGluc3RydWN0aXZlIGV4YW1wbGUgaXMgZGlzYWJsaW5nIElQIG9uIGFsbCB0aGUgRXRoZXJuZXRzOgorXGJlZ2lue3ZlcmJhdGltfQorbmV0YWRtQGFtYmVyOn4gIyBpcCAtNCBhZGRyIGZsdXNoIGxhYmVsICJldGgqIgorXGVuZHt2ZXJiYXRpbX0KK0FuZCB0aGUgbGFzdCBleGFtcGxlIHNob3dzIGhvdyB0byBmbHVzaCBhbGwgdGhlIElQdjYgYWRkcmVzc2VzCithY3F1aXJlZCBieSB0aGUgaG9zdCBmcm9tIHN0YXRlbGVzcyBhZGRyZXNzIGF1dG9jb25maWd1cmF0aW9uCithZnRlciB5b3UgZW5hYmxlZCBmb3J3YXJkaW5nIG9yIGRpc2FibGVkIGF1dG9jb25maWd1cmF0aW9uLgorXGJlZ2lue3ZlcmJhdGltfQorbmV0YWRtQGFtYmVyOn4gIyBpcCAtNiBhZGRyIGZsdXNoIGR5bmFtaWMKK1xlbmR7dmVyYmF0aW19CisKKworCitcc2VjdGlvbnt7XHR0IGlwIG5laWdoYm91cn0gLS0tIG5laWdoYm91ci9hcnAgdGFibGVzIG1hbmFnZW1lbnR9CisKK1xwYXJhZ3JhcGh7QWJicmV2aWF0aW9uczp9IFx2ZXJifG5laWdoYm91cnwsIFx2ZXJifG5laWdoYm9yfCwgXHZlcmJ8bmVpZ2h8LAorXHZlcmJ8bnwuCisKK1xwYXJhZ3JhcGh7T2JqZWN0On0gXHZlcmJ8bmVpZ2hib3VyfCBvYmplY3RzIGVzdGFibGlzaCBiaW5kaW5ncyBiZXR3ZWVuIHByb3RvY29sCithZGRyZXNzZXMgYW5kIGxpbmsgbGF5ZXIgYWRkcmVzc2VzIGZvciBob3N0cyBzaGFyaW5nIHRoZSBzYW1lIGxpbmsuCitOZWlnaGJvdXIgZW50cmllcyBhcmUgb3JnYW5pemVkIGludG8gdGFibGVzLiBUaGUgSVB2NCBuZWlnaGJvdXIgdGFibGUKK2lzIGtub3duIGJ5IGFub3RoZXIgbmFtZSAtLS0gdGhlIEFSUCB0YWJsZS4KKworVGhlIGNvcnJlc3BvbmRpbmcgY29tbWFuZHMgZGlzcGxheSBuZWlnaGJvdXIgYmluZGluZ3MKK2FuZCB0aGVpciBwcm9wZXJ0aWVzLCBhZGQgbmV3IG5laWdoYm91ciBlbnRyaWVzIGFuZCBkZWxldGUgb2xkIG9uZXMuCisKK1xwYXJhZ3JhcGh7Q29tbWFuZHM6fSBcdmVyYnxhZGR8LCBcdmVyYnxjaGFuZ2V8LCBcdmVyYnxyZXBsYWNlfCwKK1x2ZXJifGRlbGV0ZXwsIFx2ZXJifGZsdXNofCBhbmQgXHZlcmJ8c2hvd3wgKG9yIFx2ZXJifGxpc3R8KS4KKworXHBhcmFncmFwaHtTZWUgYWxzbzp9IEFwcGVuZGl4flxyZWZ7UFJPWFktTkVJR0h9LCBwLlxwYWdlcmVme1BST1hZLU5FSUdIfQorZGVzY3JpYmVzIGhvdyB0byBtYW5hZ2UgcHJveHkgQVJQL05ESVNDIHdpdGggdGhlIFx2ZXJifGlwfCB1dGlsaXR5LgorCisKK1xzdWJzZWN0aW9ue3tcdHQgaXAgbmVpZ2hib3VyIGFkZH0gLS0tIGFkZCBhIG5ldyBuZWlnaGJvdXIgZW50cnlcXAorCXtcdHQgaXAgbmVpZ2hib3VyIGNoYW5nZX0gLS0tIGNoYW5nZSBhbiBleGlzdGluZyBlbnRyeVxcCisJe1x0dCBpcCBuZWlnaGJvdXIgcmVwbGFjZX0gLS0tIGFkZCBhIG5ldyBlbnRyeSBvciBjaGFuZ2UgYW4gZXhpc3Rpbmcgb25lfQorCitccGFyYWdyYXBoe0FiYnJldmlhdGlvbnM6fSBcdmVyYnxhZGR8LCBcdmVyYnxhfDsgXHZlcmJ8Y2hhbmdlfCwgXHZlcmJ8Y2hnfDsKK1x2ZXJifHJlcGxhY2V8LAlcdmVyYnxyZXBsfC4KKworXHBhcmFncmFwaHtEZXNjcmlwdGlvbjp9IFRoZXNlIGNvbW1hbmRzIGNyZWF0ZSBuZXcgbmVpZ2hib3VyIHJlY29yZHMKK29yIHVwZGF0ZSBleGlzdGluZyBvbmVzLgorCitccGFyYWdyYXBoe0FyZ3VtZW50czp9CisKK1xiZWdpbntpdGVtaXplfQorXGl0ZW0gXHZlcmJ8dG8gQUREUkVTU3wgKGRlZmF1bHQpCisKKy0tLSB0aGUgcHJvdG9jb2wgYWRkcmVzcyBvZiB0aGUgbmVpZ2hib3VyLiBJdCBpcyBlaXRoZXIgYW4gSVB2NCBvciBJUHY2IGFkZHJlc3MuCisKK1xpdGVtIFx2ZXJifGRldiBOQU1FfAorCistLS0gdGhlIGludGVyZmFjZSB0byB3aGljaCB0aGlzIG5laWdoYm91ciBpcyBhdHRhY2hlZC4KKworCitcaXRlbSBcdmVyYnxsbGFkZHIgTExBRERSRVNTfAorCistLS0gdGhlIGxpbmsgbGF5ZXIgYWRkcmVzcyBvZiB0aGUgbmVpZ2hib3VyLiBcdmVyYnxMTEFERFJFU1N8IGNhbiBhbHNvIGJlCitcdmVyYnxudWxsfC4gCisKK1xpdGVtIFx2ZXJifG51ZCBOVURfU1RBVEV8CisKKy0tLSB0aGUgc3RhdGUgb2YgdGhlIG5laWdoYm91ciBlbnRyeS4gXHZlcmJ8bnVkfCBpcyBhbiBhYmJyZXZpYXRpb24gZm9yIGBgTmVpZ2hib3VyCitVbnJlYWNoYWJpbGl0eSBEZXRlY3Rpb24nJy4gVGhlIHN0YXRlIGNhbiB0YWtlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKworXGJlZ2lue2VudW1lcmF0ZX0KK1xpdGVtIFx2ZXJifHBlcm1hbmVudHwgLS0tIHRoZSBuZWlnaGJvdXIgZW50cnkgaXMgdmFsaWQgZm9yZXZlciBhbmQgY2FuIGJlIG9ubHkgYmUgcmVtb3ZlZAorYWRtaW5pc3RyYXRpdmVseS4KK1xpdGVtIFx2ZXJifG5vYXJwfCAtLS0gdGhlIG5laWdoYm91ciBlbnRyeSBpcyB2YWxpZC4gTm8gYXR0ZW1wdHMgdG8gdmFsaWRhdGUKK3RoaXMgZW50cnkgd2lsbCBiZSBtYWRlIGJ1dCBpdCBjYW4gYmUgcmVtb3ZlZCB3aGVuIGl0cyBsaWZldGltZSBleHBpcmVzLgorXGl0ZW0gXHZlcmJ8cmVhY2hhYmxlfCAtLS0gdGhlIG5laWdoYm91ciBlbnRyeSBpcyB2YWxpZCB1bnRpbCB0aGUgcmVhY2hhYmlsaXR5Cit0aW1lb3V0IGV4cGlyZXMuCitcaXRlbSBcdmVyYnxzdGFsZXwgLS0tIHRoZSBuZWlnaGJvdXIgZW50cnkgaXMgdmFsaWQgYnV0IHN1c3BpY2lvdXMuCitUaGlzIG9wdGlvbiB0byBcdmVyYnxpcCBuZWlnaHwgZG9lcyBub3QgY2hhbmdlIHRoZSBuZWlnaGJvdXIgc3RhdGUgaWYKK2l0IHdhcyB2YWxpZCBhbmQgdGhlIGFkZHJlc3MgaXMgbm90IGNoYW5nZWQgYnkgdGhpcyBjb21tYW5kLgorXGVuZHtlbnVtZXJhdGV9CisKK1xlbmR7aXRlbWl6ZX0KKworXHBhcmFncmFwaHtFeGFtcGxlczp9CitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIFx2ZXJifGlwIG5laWdoIGFkZCAxMC4wLjAuMyBsbGFkZHIgMDowOjA6MDowOjEgZGV2IGV0aDAgbnVkIHBlcm18CisKKy0tLSBhZGQgYSBwZXJtYW5lbnQgQVJQIGVudHJ5IGZvciB0aGUgbmVpZ2hib3VyIDEwLjAuMC4zIG9uIHRoZSBkZXZpY2UgXHZlcmJ8ZXRoMHwuCisKK1xpdGVtIFx2ZXJifGlwIG5laWdoIGNoZyAxMC4wLjAuMyBkZXYgZXRoMCBudWQgcmVhY2hhYmxlfAorCistLS0gY2hhbmdlIGl0cyBzdGF0ZSB0byBcdmVyYnxyZWFjaGFibGV8LgorXGVuZHtpdGVtaXplfQorCisKK1xzdWJzZWN0aW9ue3tcdHQgaXAgbmVpZ2hib3VyIGRlbGV0ZX0gLS0tIGRlbGV0ZSBhIG5laWdoYm91ciBlbnRyeX0KKworXHBhcmFncmFwaHtBYmJyZXZpYXRpb25zOn0gXHZlcmJ8ZGVsZXRlfCwgXHZlcmJ8ZGVsfCwgXHZlcmJ8ZHwuCisKK1xwYXJhZ3JhcGh7RGVzY3JpcHRpb246fSBUaGlzIGNvbW1hbmQgaW52YWxpZGF0ZXMgYSBuZWlnaGJvdXIgZW50cnkuCisKK1xwYXJhZ3JhcGh7QXJndW1lbnRzOn0gVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgd2l0aCBcdmVyYnxpcCBuZWlnaCBhZGR8LAorZXhjZXB0IHRoYXQgXHZlcmJ8bGxhZGRyfCBhbmQgXHZlcmJ8bnVkfCBhcmUgaWdub3JlZC4KKworCitccGFyYWdyYXBoe0V4YW1wbGU6fQorXGJlZ2lue2l0ZW1pemV9CitcaXRlbSBcdmVyYnxpcCBuZWlnaCBkZWwgMTAuMC4wLjMgZGV2IGV0aDB8CisKKy0tLSBpbnZhbGlkYXRlIGFuIEFSUCBlbnRyeSBmb3IgdGhlIG5laWdoYm91ciAxMC4wLjAuMyBvbiB0aGUgZGV2aWNlIFx2ZXJifGV0aDB8LgorCitcZW5ke2l0ZW1pemV9CisKK1xiZWdpbntOQn0KKyBUaGUgZGVsZXRlZCBuZWlnaGJvdXIgZW50cnkgd2lsbCBub3QgZGlzYXBwZWFyIGZyb20gdGhlIHRhYmxlcworIGltbWVkaWF0ZWx5LiBJZiBpdCBpcyBpbiB1c2UgaXQgY2Fubm90IGJlIGRlbGV0ZWQgdW50aWwgdGhlIGxhc3QKKyBjbGllbnQgcmVsZWFzZXMgaXQuIE90aGVyd2lzZSBpdCB3aWxsIGJlIGRlc3Ryb3llZCBkdXJpbmcKKyB0aGUgbmV4dCBnYXJiYWdlIGNvbGxlY3Rpb24uCitcZW5ke05CfQorCisKK1xwYXJhZ3JhcGh7V2FybmluZzp9IEF0dGVtcHRzIHRvIGRlbGV0ZSBvciBtYW51YWxseSBjaGFuZ2UKK2EgXHZlcmJ8bm9hcnB8IGVudHJ5IGNyZWF0ZWQgYnkgdGhlIGtlcm5lbCBtYXkgcmVzdWx0IGluIHVucHJlZGljdGFibGUgYmVoYXZpb3VyLgorUGFydGljdWxhcmx5LCB0aGUga2VybmVsIG1heSB0cnkgdG8gcmVzb2x2ZSB0aGlzIGFkZHJlc3MgZXZlbgorb24gYSBcdmVyYnxOT0FSUHwgaW50ZXJmYWNlIG9yIGlmIHRoZSBhZGRyZXNzIGlzIG11bHRpY2FzdCBvciBicm9hZGNhc3QuCisKKworXHN1YnNlY3Rpb257e1x0dCBpcCBuZWlnaGJvdXIgc2hvd30gLS0tIGxpc3QgbmVpZ2hib3VyIGVudHJpZXN9CisKK1xwYXJhZ3JhcGh7QWJicmV2aWF0aW9uczp9IFx2ZXJifHNob3d8LCBcdmVyYnxsaXN0fCwgXHZlcmJ8c2h8LCBcdmVyYnxsc3wuCisKK1xwYXJhZ3JhcGh7RGVzY3JpcHRpb246fVRoaXMgY29tbWFuZHMgZGlzcGxheXMgbmVpZ2hib3VyIHRhYmxlcy4KKworXHBhcmFncmFwaHtBcmd1bWVudHM6fQorCitcYmVnaW57aXRlbWl6ZX0KKworXGl0ZW0gXHZlcmJ8dG8gQUREUkVTU3wgKGRlZmF1bHQpCisKKy0tLSB0aGUgcHJlZml4IHNlbGVjdGluZyB0aGUgbmVpZ2hib3VycyB0byBsaXN0LgorCitcaXRlbSBcdmVyYnxkZXYgTkFNRXwKKworLS0tIG9ubHkgbGlzdCB0aGUgbmVpZ2hib3VycyBhdHRhY2hlZCB0byB0aGlzIGRldmljZS4KKworXGl0ZW0gXHZlcmJ8dW51c2VkfAorCistLS0gb25seSBsaXN0IG5laWdoYm91cnMgd2hpY2ggYXJlIG5vdCBjdXJyZW50bHkgaW4gdXNlLgorCitcaXRlbSBcdmVyYnxudWQgTlVEX1NUQVRFfAorCistLS0gb25seSBsaXN0IG5laWdoYm91ciBlbnRyaWVzIGluIHRoaXMgc3RhdGUuIFx2ZXJifE5VRF9TVEFURXwgdGFrZXMKK3ZhbHVlcyBsaXN0ZWQgYmVsb3cgb3IgdGhlIHNwZWNpYWwgdmFsdWUgXHZlcmJ8YWxsfCB3aGljaCBtZWFucyBhbGwgc3RhdGVzLgorVGhpcyBvcHRpb24gbWF5IG9jY3VyIG1vcmUgdGhhbiBvbmNlLiBJZiB0aGlzIG9wdGlvbiBpcyBhYnNlbnQsIFx2ZXJifGlwfAorbGlzdHMgYWxsIGVudHJpZXMgZXhjZXB0IGZvciBcdmVyYnxub25lfCBhbmQgXHZlcmJ8bm9hcnB8LgorCitcZW5ke2l0ZW1pemV9CisKKworXHBhcmFncmFwaHtPdXRwdXQgZm9ybWF0On0KKworXGJlZ2lue3ZlcmJhdGltfQora3V6bmV0QGFsaXNhOn4gJCBpcCBuZWlnaCBscworOjogZGV2IGxvIGxsYWRkciAwMDowMDowMDowMDowMDowMCBudWQgbm9hcnAKK2ZlODA6OjIwMDpjZmY6ZmU3NjozZjg1IGRldiBldGgwIGxsYWRkciAwMDowMDowYzo3NjozZjo4NSByb3V0ZXIgXAorICAgIG51ZCBzdGFsZQorMC4wLjAuMCBkZXYgbG8gbGxhZGRyIDAwOjAwOjAwOjAwOjAwOjAwIG51ZCBub2FycAorMTkzLjIzMy43LjI1NCBkZXYgZXRoMCBsbGFkZHIgMDA6MDA6MGM6NzY6M2Y6ODUgbnVkIHJlYWNoYWJsZQorMTkzLjIzMy43Ljg1IGRldiBldGgwIGxsYWRkciAwMDplMDoxZTo2MzozOTowMCBudWQgc3RhbGUKK2t1em5ldEBhbGlzYTp+ICQgCitcZW5ke3ZlcmJhdGltfQorCitUaGUgZmlyc3Qgd29yZCBvZiBlYWNoIGxpbmUgaXMgdGhlIHByb3RvY29sIGFkZHJlc3Mgb2YgdGhlIG5laWdoYm91ci4KK1RoZW4gdGhlIGRldmljZSBuYW1lIGZvbGxvd3MuIFRoZSByZXN0IG9mIHRoZSBsaW5lIGRlc2NyaWJlcyB0aGUgY29udGVudHMgb2YKK3RoZSBuZWlnaGJvdXIgZW50cnkgaWRlbnRpZmllZCBieSB0aGUgcGFpciAoZGV2aWNlLCBhZGRyZXNzKS4KKworXHZlcmJ8bGxhZGRyfCBpcyB0aGUgbGluayBsYXllciBhZGRyZXNzIG9mIHRoZSBuZWlnaGJvdXIuCisKK1x2ZXJifG51ZHwgaXMgdGhlIHN0YXRlIG9mIHRoZSBgYG5laWdoYm91ciB1bnJlYWNoYWJpbGl0eSBkZXRlY3Rpb24nJyBtYWNoaW5lCitmb3IgdGhpcyBlbnRyeS4gVGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBuZWlnaGJvdXIKK3N0YXRlIG1hY2hpbmUgY2FuIGJlIGZvdW5kIGluflxjaXRle1JGQy1ORElTQ30uIEhlcmUgaXMgdGhlIGZ1bGwgbGlzdAorb2YgdGhlIHN0YXRlcyB3aXRoIHNob3J0IGRlc2NyaXB0aW9uczoKKworXGJlZ2lue2VudW1lcmF0ZX0KK1xpdGVtXHZlcmJ8bm9uZXwgLS0tIHRoZSBzdGF0ZSBvZiB0aGUgbmVpZ2hib3VyIGlzIHZvaWQuCitcaXRlbVx2ZXJifGluY29tcGxldGV8IC0tLSB0aGUgbmVpZ2hib3VyIGlzIGluIHRoZSBwcm9jZXNzIG9mIHJlc29sdXRpb24uCitcaXRlbVx2ZXJifHJlYWNoYWJsZXwgLS0tIHRoZSBuZWlnaGJvdXIgaXMgdmFsaWQgYW5kIGFwcGFyZW50bHkgcmVhY2hhYmxlLgorXGl0ZW1cdmVyYnxzdGFsZXwgLS0tIHRoZSBuZWlnaGJvdXIgaXMgdmFsaWQsIGJ1dCBpcyBwcm9iYWJseSBhbHJlYWR5Cit1bnJlYWNoYWJsZSwgc28gdGhlIGtlcm5lbCB3aWxsIHRyeSB0byBjaGVjayBpdCBhdCB0aGUgZmlyc3QgdHJhbnNtaXNzaW9uLgorXGl0ZW1cdmVyYnxkZWxheXwgLS0tIGEgcGFja2V0IGhhcyBiZWVuIHNlbnQgdG8gdGhlIHN0YWxlIG5laWdoYm91ciBhbmQgdGhlIGtlcm5lbCBpcyB3YWl0aW5nCitmb3IgY29uZmlybWF0aW9uLgorXGl0ZW1cdmVyYnxwcm9iZXwgLS0tIHRoZSBkZWxheSB0aW1lciBleHBpcmVkIGJ1dCBubyBjb25maXJtYXRpb24gd2FzIHJlY2VpdmVkLgorVGhlIGtlcm5lbCBoYXMgc3RhcnRlZCB0byBwcm9iZSB0aGUgbmVpZ2hib3VyIHdpdGggQVJQL05ESVNDIG1lc3NhZ2VzLgorXGl0ZW1cdmVyYnxmYWlsZWR8IC0tLSByZXNvbHV0aW9uIGhhcyBmYWlsZWQuCitcaXRlbVx2ZXJifG5vYXJwfCAtLS0gdGhlIG5laWdoYm91ciBpcyB2YWxpZC4gTm8gYXR0ZW1wdHMgdG8gY2hlY2sgdGhlIGVudHJ5Cit3aWxsIGJlIG1hZGUuCitcaXRlbVx2ZXJifHBlcm1hbmVudHwgLS0tIGl0IGlzIGEgXHZlcmJ8bm9hcnB8IGVudHJ5LCBidXQgb25seSB0aGUgYWRtaW5pc3RyYXRvcgorbWF5IHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgbmVpZ2hib3VyIHRhYmxlLgorXGVuZHtlbnVtZXJhdGV9CisKK1RoZSBsaW5rIGxheWVyIGFkZHJlc3MgaXMgdmFsaWQgaW4gYWxsIHN0YXRlcyBleGNlcHQgZm9yIFx2ZXJifG5vbmV8LAorXHZlcmJ8ZmFpbGVkfCBhbmQgXHZlcmJ8aW5jb21wbGV0ZXwuCisKK0lQdjYgbmVpZ2hib3VycyBjYW4gYmUgbWFya2VkIHdpdGggdGhlIGFkZGl0aW9uYWwgZmxhZyBcdmVyYnxyb3V0ZXJ8Cit3aGljaCBtZWFucyB0aGF0IHRoZSBuZWlnaGJvdXIgaW50cm9kdWNlZCBpdHNlbGYgYXMgYW4gSVB2NiByb3V0ZXJ+XGNpdGV7UkZDLU5ESVNDfS4KKworXHBhcmFncmFwaHtTdGF0aXN0aWNzOn0gVGhlIFx2ZXJifC1zdGF0aXN0aWNzfCBvcHRpb24gZGlzcGxheXMgc29tZSB1c2FnZQorc3RhdGlzdGljcywgZi5lLlwKKworXGJlZ2lue3ZlcmJhdGltfQora3V6bmV0QGFsaXNhOn4gJCBpcCAtcyBuIGxzIDE5My4yMzMuNy4yNTQKKzE5My4yMzMuNy4yNTQgZGV2IGV0aDAgbGxhZGRyIDAwOjAwOjBjOjc2OjNmOjg1IHJlZiA1IHVzZWQgMTIvMTMvMjAgXAorICAgIG51ZCByZWFjaGFibGUKK2t1em5ldEBhbGlzYTp+ICQgCitcZW5ke3ZlcmJhdGltfQorCitIZXJlIFx2ZXJifHJlZnwgaXMgdGhlIG51bWJlciBvZiB1c2VycyBvZiB0aGlzIGVudHJ5CithbmQgXHZlcmJ8dXNlZHwgaXMgYSB0cmlwbGV0IG9mIHRpbWUgaW50ZXJ2YWxzIGluIHNlY29uZHMKK3NlcGFyYXRlZCBieSBzbGFzaGVzLiBJbiB0aGlzIGNhc2UgdGhleSBzaG93IHRoYXQ6CisKK1xiZWdpbntlbnVtZXJhdGV9CitcaXRlbSB0aGUgZW50cnkgd2FzIHVzZWQgMTIgc2Vjb25kcyBhZ28uCitcaXRlbSB0aGUgZW50cnkgd2FzIGNvbmZpcm1lZCAxMyBzZWNvbmRzIGFnby4KK1xpdGVtIHRoZSBlbnRyeSB3YXMgdXBkYXRlZCAyMCBzZWNvbmRzIGFnby4KK1xlbmR7ZW51bWVyYXRlfQorCitcc3Vic2VjdGlvbnt7XHR0IGlwIG5laWdoYm91ciBmbHVzaH0gLS0tIGZsdXNoIG5laWdoYm91ciBlbnRyaWVzfQorCitccGFyYWdyYXBoe0FiYnJldmlhdGlvbnM6fSBcdmVyYnxmbHVzaHwsIFx2ZXJifGZ8LgorCitccGFyYWdyYXBoe0Rlc2NyaXB0aW9uOn1UaGlzIGNvbW1hbmQgZmx1c2hlcyBuZWlnaGJvdXIgdGFibGVzLCBzZWxlY3RpbmcKK2VudHJpZXMgdG8gZmx1c2ggYnkgc29tZSBjcml0ZXJpYS4KKworXHBhcmFncmFwaHtBcmd1bWVudHM6fSBUaGlzIGNvbW1hbmQgaGFzIHRoZSBzYW1lIGFyZ3VtZW50cyBhcyBcdmVyYnxzaG93fC4KK1RoZSBkaWZmZXJlbmNlcyBhcmUgdGhhdCBpdCBkb2VzIG5vdCBydW4gd2hlbiBubyBhcmd1bWVudHMgYXJlIGdpdmVuLAorYW5kIHRoYXQgdGhlIGRlZmF1bHQgbmVpZ2hib3VyIHN0YXRlcyB0byBiZSBmbHVzaGVkIGRvIG5vdCBpbmNsdWRlCitcdmVyYnxwZXJtYW5lbnR8IGFuZCBcdmVyYnxub2FycHwuCisKKworXHBhcmFncmFwaHtTdGF0aXN0aWNzOn0gV2l0aCB0aGUgXHZlcmJ8LXN0YXRpc3RpY3N8IG9wdGlvbiwgdGhlIGNvbW1hbmQKK2JlY29tZXMgdmVyYm9zZS4gSXQgcHJpbnRzIG91dCB0aGUgbnVtYmVyIG9mIGRlbGV0ZWQgbmVpZ2hib3VycyBhbmQgdGhlIG51bWJlcgorb2Ygcm91bmRzIG1hZGUgdG8gZmx1c2ggdGhlIG5laWdoYm91ciB0YWJsZS4gSWYgdGhlIG9wdGlvbiBpcyBnaXZlbgordHdpY2UsIFx2ZXJifGlwIG5laWdoIGZsdXNofCBhbHNvIGR1bXBzIGFsbCB0aGUgZGVsZXRlZCBuZWlnaGJvdXJzCitpbiB0aGUgZm9ybWF0IGRlc2NyaWJlZCBpbiB0aGUgcHJldmlvdXMgc3Vic2VjdGlvbi4KKworXHBhcmFncmFwaHtFeGFtcGxlOn0KK1xiZWdpbnt2ZXJiYXRpbX0KK25ldGFkbUBhbGlzYTp+ICMgaXAgLXMgLXMgbiBmIDE5My4yMzMuNy4yNTQKKzE5My4yMzMuNy4yNTQgZGV2IGV0aDAgbGxhZGRyIDAwOjAwOjBjOjc2OjNmOjg1IHJlZiA1IHVzZWQgMTIvMTMvMjAgXAorICAgIG51ZCByZWFjaGFibGUKKworKioqIFJvdW5kIDEsIGRlbGV0aW5nIDEgZW50cmllcyAqKioKKyoqKiBGbHVzaCBpcyBjb21wbGV0ZSBhZnRlciAxIHJvdW5kICoqKgorbmV0YWRtQGFsaXNhOn4gIyAKK1xlbmR7dmVyYmF0aW19CisKKworXHNlY3Rpb257e1x0dCBpcCByb3V0ZX0gLS0tIHJvdXRpbmcgdGFibGUgbWFuYWdlbWVudH0KK1xsYWJlbHtJUC1ST1VURX0KKworXHBhcmFncmFwaHtBYmJyZXZpYXRpb25zOn0gXHZlcmJ8cm91dGV8LCBcdmVyYnxyb3wsIFx2ZXJifHJ8LgorCitccGFyYWdyYXBoe09iamVjdDp9IFx2ZXJifHJvdXRlfCBlbnRyaWVzIGluIHRoZSBrZXJuZWwgcm91dGluZyB0YWJsZXMga2VlcAoraW5mb3JtYXRpb24gYWJvdXQgcGF0aHMgdG8gb3RoZXIgbmV0d29ya2VkIG5vZGVzLgorCitFYWNoIHJvdXRlIGVudHJ5IGhhcyBhIHtcZW0ga2V5XC99IGNvbnNpc3Rpbmcgb2YgYSB7XGVtIHByZWZpeFwvfQorKGkuZS5cIGEgcGFpciBjb250YWluaW5nIGEgbmV0d29yayBhZGRyZXNzIGFuZCB0aGUgbGVuZ3RoIG9mIGl0cyBtYXNrKSBhbmQsCitvcHRpb25hbGx5LCB0aGUgVE9TIHZhbHVlLiBBbiBJUCBwYWNrZXQgbWF0Y2hlcyB0aGUgcm91dGUgaWYgdGhlIGhpZ2hlc3QKK2JpdHMgb2YgaXRzIGRlc3RpbmF0aW9uIGFkZHJlc3MgYXJlIGVxdWFsIHRvIHRoZSByb3V0ZSBwcmVmaXggYXQgbGVhc3QKK3VwIHRvIHRoZSBwcmVmaXggbGVuZ3RoIGFuZCBpZiB0aGUgVE9TIG9mIHRoZSByb3V0ZSBpcyB6ZXJvIG9yIGVxdWFsIHRvCit0aGUgVE9TIG9mIHRoZSBwYWNrZXQuCisgCitJZiBzZXZlcmFsIHJvdXRlcyBtYXRjaCB0aGUgcGFja2V0LCB0aGUgZm9sbG93aW5nIHBydW5pbmcgcnVsZXMKK2FyZSB1c2VkIHRvIHNlbGVjdCB0aGUgYmVzdCBvbmUgKHNlZX5cY2l0ZXtSRkMxODEyfSk6CitcYmVnaW57ZW51bWVyYXRlfQorXGl0ZW0gVGhlIGxvbmdlc3QgbWF0Y2hpbmcgcHJlZml4IGlzIHNlbGVjdGVkLiBBbGwgc2hvcnRlciBvbmVzCithcmUgZHJvcHBlZC4KKworXGl0ZW0gSWYgdGhlIFRPUyBvZiBzb21lIHJvdXRlIHdpdGggdGhlIGxvbmdlc3QgcHJlZml4IGlzIGVxdWFsIHRvIHRoZSBUT1MKK29mIHRoZSBwYWNrZXQsIHRoZSByb3V0ZXMgd2l0aCBkaWZmZXJlbnQgVE9TIGFyZSBkcm9wcGVkLgorCitJZiBubyBleGFjdCBUT1MgbWF0Y2ggd2FzIGZvdW5kIGFuZCByb3V0ZXMgd2l0aCBUT1M9MCBleGlzdCwKK3RoZSByZXN0IG9mIHJvdXRlcyBhcmUgcHJ1bmVkLgorCitPdGhlcndpc2UsIHRoZSByb3V0ZSBsb29rdXAgZmFpbHMuCisKK1xpdGVtIElmIHNldmVyYWwgcm91dGVzIHJlbWFpbiBhZnRlciB0aGUgcHJldmlvdXMgc3RlcHMsIHRoZW4KK3RoZSByb3V0ZXMgd2l0aCB0aGUgYmVzdCBwcmVmZXJlbmNlIHZhbHVlcyBhcmUgc2VsZWN0ZWQuCisKK1xpdGVtIElmIHdlIHN0aWxsIGhhdmUgc2V2ZXJhbCByb3V0ZXMsIHRoZW4gdGhlIHtcZW0gZmlyc3RcL30gb2YgdGhlbQoraXMgc2VsZWN0ZWQuCisKK1xiZWdpbntOQn0KKyBOb3RlIHRoZSBhbWJpZ3VpdHkgb2YgdGhlIGxhc3Qgc3RlcC4gVW5mb3J0dW5hdGVseSwgTGludXgKKyBoaXN0b3JpY2FsbHkgYWxsb3dzIHN1Y2ggYSBiaXphcnJlIHNpdHVhdGlvbi4gVGhlIHNlbnNlIG9mIHRoZQord29yZCBgYGZpcnN0JycgZGVwZW5kcyBvbiB0aGUgb3JkZXIgb2Ygcm91dGUgYWRkaXRpb25zIGFuZCBpdCBpcyBwcmFjdGljYWxseQoraW1wb3NzaWJsZSB0byBtYWludGFpbiBhIGJ1bmRsZSBvZiBzdWNoIHJvdXRlcyBpbiB0aGlzIG9yZGVyLgorXGVuZHtOQn0KKworRm9yIHNpbXBsaWNpdHkgd2Ugd2lsbCBsaW1pdCBvdXJzZWx2ZXMgdG8gdGhlIGNhc2Ugd2hlcmUgc3VjaCBhIHNpdHVhdGlvbgoraXMgaW1wb3NzaWJsZSBhbmQgcm91dGVzIGFyZSB1bmlxdWVseSBpZGVudGlmaWVkIGJ5IHRoZSB0cmlwbGV0Citce3ByZWZpeCwgdG9zLCBwcmVmZXJlbmNlXH0uIEFjdHVhbGx5LCBpdCBpcyBpbXBvc3NpYmxlIHRvIGNyZWF0ZQorbm9uLXVuaXF1ZSByb3V0ZXMgd2l0aCBcdmVyYnxpcHwgY29tbWFuZHMgZGVzY3JpYmVkIGluIHRoaXMgc2VjdGlvbi4KKworT25lIHVzZWZ1bCBleGNlcHRpb24gdG8gdGhpcyBydWxlIGlzIHRoZSBkZWZhdWx0IHJvdXRlIG9uIG5vbi1mb3J3YXJkaW5nCitob3N0cy4gSXQgaXMgYGBvZmZpY2lhbGx5JycgYWxsb3dlZCB0byBoYXZlIHNldmVyYWwgZmFsbGJhY2sgcm91dGVzCit3aGVuIHNldmVyYWwgcm91dGVycyBhcmUgcHJlc2VudCBvbiBkaXJlY3RseSBjb25uZWN0ZWQgbmV0d29ya3MuCitJbiB0aGlzIGNhc2UsIExpbnV4LTIuMiBtYWtlcyBgYGRlYWQgZ2F0ZXdheSBkZXRlY3Rpb24nJ35cY2l0ZXtSRkMxMTIyfQorY29udHJvbGxlZCBieSBuZWlnaGJvdXIgdW5yZWFjaGFiaWxpdHkgZGV0ZWN0aW9uIGFuZCBieSBhZHZpY2UKK2Zyb20gdHJhbnNwb3J0IHByb3RvY29scyB0byBzZWxlY3QgYSB3b3JraW5nIHJvdXRlciwgc28gdGhlIG9yZGVyCitvZiB0aGUgcm91dGVzIGlzIG5vdCBlc3NlbnRpYWwuIEhvd2V2ZXIsIGluIHRoaXMgY2FzZSwKK2ZpZGRsaW5nIHdpdGggZGVmYXVsdCByb3V0ZXMgbWFudWFsbHkgaXMgbm90IHJlY29tbWVuZGVkLiBVc2UgdGhlIFJvdXRlciBEaXNjb3ZlcnkKK3Byb3RvY29sIChzZWUgQXBwZW5kaXh+XHJlZntFWEFNUExFLVNFVFVQfSwgcC5ccGFnZXJlZntFWEFNUExFLVNFVFVQfSkKK2luc3RlYWQuIEFjdHVhbGx5LCBMaW51eC0yLjIgSVB2NiBkb2VzIG5vdCBnaXZlIHVzZXIgbGV2ZWwgYXBwbGljYXRpb25zCithbnkgYWNjZXNzIHRvIGRlZmF1bHQgcm91dGVzLgorXGVuZHtlbnVtZXJhdGV9CisKK0NlcnRhaW5seSwgdGhlIHN0ZXBzIGFib3ZlIGFyZSBub3QgcGVyZm9ybWVkIGV4YWN0bHkKK2luIHRoaXMgc2VxdWVuY2UuIEluc3RlYWQsIHRoZSByb3V0aW5nIHRhYmxlIGluIHRoZSBrZXJuZWwgaXMga2VwdAoraW4gc29tZSBkYXRhIHN0cnVjdHVyZSB0byBhY2hpZXZlIHRoZSBmaW5hbCByZXN1bHQKK3dpdGggbWluaW1hbCBjb3N0LiBIb3dldmVyLCBub3QgZGVwZW5kaW5nIG9uIGEgcGFydGljdWxhcgorcm91dGluZyBhbGdvcml0aG0gaW1wbGVtZW50ZWQgaW4gdGhlIGtlcm5lbCwgd2UgY2FuIHN1bW1hcml6ZQordGhlIHN0YXRlbWVudHMgYWJvdmUgYXM6IGEgcm91dGUgaXMgaWRlbnRpZmllZCBieSB0aGUgdHJpcGxldAorXHtwcmVmaXgsIHRvcywgcHJlZmVyZW5jZVx9LiBUaGlzIHtcZW0ga2V5XC99IGxldHMgdXMgbG9jYXRlCit0aGUgcm91dGUgaW4gdGhlIHJvdXRpbmcgdGFibGUuCisKK1xwYXJhZ3JhcGh7Um91dGUgYXR0cmlidXRlczp9IEVhY2ggcm91dGUga2V5IHJlZmVycyB0byBhIHJvdXRpbmcKK2luZm9ybWF0aW9uIHJlY29yZCBjb250YWluaW5nCit0aGUgZGF0YSByZXF1aXJlZCB0byBkZWxpdmVyIElQIHBhY2tldHMgKGYuZS5cIG91dHB1dCBkZXZpY2UgYW5kCituZXh0IGhvcCByb3V0ZXIpIGFuZCBzb21lIG9wdGlvbmFsIGF0dHJpYnV0ZXMgKGYuZS4gdGhlIHBhdGggTVRVIG9yCit0aGUgcHJlZmVycmVkIHNvdXJjZSBhZGRyZXNzIHdoZW4gY29tbXVuaWNhdGluZyB3aXRoIHRoaXMgZGVzdGluYXRpb24pLgorVGhlc2UgYXR0cmlidXRlcyBhcmUgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgc3Vic2VjdGlvbi4KKworXHBhcmFncmFwaHtSb3V0ZSB0eXBlczp9IFxsYWJlbHtJUC1ST1VURS1UWVBFU30KK0l0IGlzIGltcG9ydGFudCB0aGF0IHRoZSBzZXQKK29mIHJlcXVpcmVkIGFuZCBvcHRpb25hbCBhdHRyaWJ1dGVzIGRlcGVuZCBvbiB0aGUgcm91dGUge1xlbSB0eXBlXC99LgorVGhlIG1vc3QgaW1wb3J0YW50IHJvdXRlIHR5cGUKK2lzIFx2ZXJifHVuaWNhc3R8LiBJdCBkZXNjcmliZXMgcmVhbCBwYXRocyB0byBvdGhlciBob3N0cy4KK0FzIGEgcnVsZSwgY29tbW9uIHJvdXRpbmcgdGFibGVzIGNvbnRhaW4gb25seSBzdWNoIHJvdXRlcy4gSG93ZXZlciwKK3RoZXJlIGFyZSBvdGhlciB0eXBlcyBvZiByb3V0ZXMgd2l0aCBkaWZmZXJlbnQgc2VtYW50aWNzLiBUaGUKK2Z1bGwgbGlzdCBvZiB0eXBlcyB1bmRlcnN0b29kIGJ5IExpbnV4LTIuMiBpczoKK1xiZWdpbntpdGVtaXplfQorXGl0ZW0gXHZlcmJ8dW5pY2FzdHwgLS0tIHRoZSByb3V0ZSBlbnRyeSBkZXNjcmliZXMgcmVhbCBwYXRocyB0byB0aGUKK2Rlc3RpbmF0aW9ucyBjb3ZlcmVkIGJ5IHRoZSByb3V0ZSBwcmVmaXguCitcaXRlbSBcdmVyYnx1bnJlYWNoYWJsZXwgLS0tIHRoZXNlIGRlc3RpbmF0aW9ucyBhcmUgdW5yZWFjaGFibGUuIFBhY2tldHMKK2FyZSBkaXNjYXJkZWQgYW5kIHRoZSBJQ01QIG1lc3NhZ2Uge1xlbSBob3N0IHVucmVhY2hhYmxlXC99IGlzIGdlbmVyYXRlZC4KK1RoZSBsb2NhbCBzZW5kZXJzIGdldCBhbiBcdmVyYnxFSE9TVFVOUkVBQ0h8IGVycm9yLgorXGl0ZW0gXHZlcmJ8YmxhY2tob2xlfCAtLS0gdGhlc2UgZGVzdGluYXRpb25zIGFyZSB1bnJlYWNoYWJsZS4gUGFja2V0cworYXJlIGRpc2NhcmRlZCBzaWxlbnRseS4gVGhlIGxvY2FsIHNlbmRlcnMgZ2V0IGFuIFx2ZXJifEVJTlZBTHwgZXJyb3IuCitcaXRlbSBcdmVyYnxwcm9oaWJpdHwgLS0tIHRoZXNlIGRlc3RpbmF0aW9ucyBhcmUgdW5yZWFjaGFibGUuIFBhY2tldHMKK2FyZSBkaXNjYXJkZWQgYW5kIHRoZSBJQ01QIG1lc3NhZ2Uge1xlbSBjb21tdW5pY2F0aW9uIGFkbWluaXN0cmF0aXZlbHkKK3Byb2hpYml0ZWRcL30gaXMgZ2VuZXJhdGVkLiBUaGUgbG9jYWwgc2VuZGVycyBnZXQgYW4gXHZlcmJ8RUFDQ0VTfCBlcnJvci4KK1xpdGVtIFx2ZXJifGxvY2FsfCAtLS0gdGhlIGRlc3RpbmF0aW9ucyBhcmUgYXNzaWduZWQgdG8gdGhpcworaG9zdC4gVGhlIHBhY2tldHMgYXJlIGxvb3BlZCBiYWNrIGFuZCBkZWxpdmVyZWQgbG9jYWxseS4KK1xpdGVtIFx2ZXJifGJyb2FkY2FzdHwgLS0tIHRoZSBkZXN0aW5hdGlvbnMgYXJlIGJyb2FkY2FzdCBhZGRyZXNzZXMuCitUaGUgcGFja2V0cyBhcmUgc2VudCBhcyBsaW5rIGJyb2FkY2FzdHMuCitcaXRlbSBcdmVyYnx0aHJvd3wgLS0tIGEgc3BlY2lhbCBjb250cm9sIHJvdXRlIHVzZWQgdG9nZXRoZXIgd2l0aCBwb2xpY3kKK3J1bGVzIChzZWUgc2VjLlxyZWZ7SVAtUlVMRX0sIHAuXHBhZ2VyZWZ7SVAtUlVMRX0pLiBJZiBzdWNoIGEgcm91dGUgaXMgc2VsZWN0ZWQsIGxvb2t1cAoraW4gdGhpcyB0YWJsZSBpcyB0ZXJtaW5hdGVkIHByZXRlbmRpbmcgdGhhdCBubyByb3V0ZSB3YXMgZm91bmQuCitXaXRob3V0IHBvbGljeSByb3V0aW5nIGl0IGlzIGVxdWl2YWxlbnQgdG8gdGhlIGFic2VuY2Ugb2YgdGhlIHJvdXRlIGluIHRoZSByb3V0aW5nCit0YWJsZS4gVGhlIHBhY2tldHMgYXJlIGRyb3BwZWQgYW5kIHRoZSBJQ01QIG1lc3NhZ2Uge1xlbSBuZXQgdW5yZWFjaGFibGVcL30KK2lzIGdlbmVyYXRlZC4gVGhlIGxvY2FsIHNlbmRlcnMgZ2V0IGFuIFx2ZXJifEVORVRVTlJFQUNIfCBlcnJvci4KK1xpdGVtIFx2ZXJifG5hdHwgLS0tIGEgc3BlY2lhbCBOQVQgcm91dGUuIERlc3RpbmF0aW9ucyBjb3ZlcmVkIGJ5IHRoZSBwcmVmaXgKK2FyZSBjb25zaWRlcmVkIHRvIGJlIGR1bW15IChvciBleHRlcm5hbCkgYWRkcmVzc2VzIHdoaWNoIHJlcXVpcmUgdHJhbnNsYXRpb24KK3RvIHJlYWwgKG9yIGludGVybmFsKSBvbmVzIGJlZm9yZSBmb3J3YXJkaW5nLiBUaGUgYWRkcmVzc2VzIHRvIHRyYW5zbGF0ZSB0bworYXJlIHNlbGVjdGVkIHdpdGggdGhlIGF0dHJpYnV0ZSBcdmVyYnx2aWF8LiBNb3JlIGFib3V0IE5BVCBpcworaW4gQXBwZW5kaXh+XHJlZntST1VURS1OQVR9LCBwLlxwYWdlcmVme1JPVVRFLU5BVH0uCitcaXRlbSBcdmVyYnxhbnljYXN0fCAtLS0gKHtcZW0gbm90IGltcGxlbWVudGVkXC99KSB0aGUgZGVzdGluYXRpb25zIGFyZQore1xlbSBhbnljYXN0XC99IGFkZHJlc3NlcyBhc3NpZ25lZCB0byB0aGlzIGhvc3QuIFRoZXkgYXJlIG1haW5seSBlcXVpdmFsZW50Cit0byBcdmVyYnxsb2NhbHwgd2l0aCBvbmUgZGlmZmVyZW5jZTogc3VjaCBhZGRyZXNzZXMgYXJlIGludmFsaWQgd2hlbiB1c2VkCithcyB0aGUgc291cmNlIGFkZHJlc3Mgb2YgYW55IHBhY2tldC4KK1xpdGVtIFx2ZXJifG11bHRpY2FzdHwgLS0tIGEgc3BlY2lhbCB0eXBlIHVzZWQgZm9yIG11bHRpY2FzdCByb3V0aW5nLgorSXQgaXMgbm90IHByZXNlbnQgaW4gbm9ybWFsIHJvdXRpbmcgdGFibGVzLgorXGVuZHtpdGVtaXplfQorCitccGFyYWdyYXBoe1JvdXRlIHRhYmxlczp9IExpbnV4LTIuMiBjYW4gcGFjayByb3V0ZXMgaW50byBzZXZlcmFsIHJvdXRpbmcKK3RhYmxlcyBpZGVudGlmaWVkIGJ5IGEgbnVtYmVyIGluIHRoZSByYW5nZSBmcm9tIDEgdG8gMjU1IG9yIGJ5CituYW1lIGZyb20gdGhlIGZpbGUgXHZlcmJ8L2V0Yy9pcHJvdXRlMi9ydF90YWJsZXN8LiBCeSBkZWZhdWx0IGFsbCBub3JtYWwKK3JvdXRlcyBhcmUgaW5zZXJ0ZWQgaW50byB0aGUgXHZlcmJ8bWFpbnwgdGFibGUgKElEIDI1NCkgYW5kIHRoZSBrZXJuZWwgb25seSB1c2VzCit0aGlzIHRhYmxlIHdoZW4gY2FsY3VsYXRpbmcgcm91dGVzLgorCitBY3R1YWxseSwgb25lIG90aGVyIHRhYmxlIGFsd2F5cyBleGlzdHMsIHdoaWNoIGlzIGludmlzaWJsZSBidXQKK2V2ZW4gbW9yZSBpbXBvcnRhbnQuIEl0IGlzIHRoZSBcdmVyYnxsb2NhbHwgdGFibGUgKElEIDI1NSkuIFRoaXMgdGFibGUKK2NvbnNpc3RzIG9mIHJvdXRlcyBmb3IgbG9jYWwgYW5kIGJyb2FkY2FzdCBhZGRyZXNzZXMuIFRoZSBrZXJuZWwgbWFpbnRhaW5zCit0aGlzIHRhYmxlIGF1dG9tYXRpY2FsbHkgYW5kIHRoZSBhZG1pbmlzdHJhdG9yIHVzdWFsbHkgbmVlZCBub3QgbW9kaWZ5IGl0CitvciBldmVuIGxvb2sgYXQgaXQuCisKK1RoZSBtdWx0aXBsZSByb3V0aW5nIHRhYmxlcyBlbnRlciB0aGUgZ2FtZSB3aGVuIHtcZW0gcG9saWN5IHJvdXRpbmdcL30KK2lzIHVzZWQuIFNlZSBzZWMuXHJlZntJUC1SVUxFfSwgcC5ccGFnZXJlZntJUC1SVUxFfS4KK0luIHRoaXMgY2FzZSwgdGhlIHRhYmxlIGlkZW50aWZpZXIgZWZmZWN0aXZlbHkgYmVjb21lcworb25lIG1vcmUgcGFyYW1ldGVyLCB3aGljaCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHRyaXBsZXQKK1x7cHJlZml4LCB0b3MsIHByZWZlcmVuY2VcfSB0byB1bmlxdWVseSBpZGVudGlmeSB0aGUgcm91dGUuCisKKworXHN1YnNlY3Rpb257e1x0dCBpcCByb3V0ZSBhZGR9IC0tLSBhZGQgYSBuZXcgcm91dGVcXAorCXtcdHQgaXAgcm91dGUgY2hhbmdlfSAtLS0gY2hhbmdlIGEgcm91dGVcXAorCXtcdHQgaXAgcm91dGUgcmVwbGFjZX0gLS0tIGNoYW5nZSBhIHJvdXRlIG9yIGFkZCBhIG5ldyBvbmV9CitcbGFiZWx7SVAtUk9VVEUtQUREfQorCitccGFyYWdyYXBoe0FiYnJldmlhdGlvbnM6fSBcdmVyYnxhZGR8LCBcdmVyYnxhfDsgXHZlcmJ8Y2hhbmdlfCwgXHZlcmJ8Y2hnfDsKKwlcdmVyYnxyZXBsYWNlfCwgXHZlcmJ8cmVwbHwuCisKKworXHBhcmFncmFwaHtBcmd1bWVudHM6fQorXGJlZ2lue2l0ZW1pemV9CitcaXRlbSBcdmVyYnx0byBQUkVGSVh8IG9yIFx2ZXJifHRvIFRZUEUgUFJFRklYfCAoZGVmYXVsdCkKKworLS0tIHRoZSBkZXN0aW5hdGlvbiBwcmVmaXggb2YgdGhlIHJvdXRlLiBJZiBcdmVyYnxUWVBFfCBpcyBvbWl0dGVkLAorXHZlcmJ8aXB8IGFzc3VtZXMgdHlwZSBcdmVyYnx1bmljYXN0fC4gT3RoZXIgdmFsdWVzIG9mIFx2ZXJifFRZUEV8CithcmUgbGlzdGVkIGFib3ZlLiBcdmVyYnxQUkVGSVh8IGlzIGFuIElQIG9yIElQdjYgYWRkcmVzcyBvcHRpb25hbGx5IGZvbGxvd2VkCitieSBhIHNsYXNoIGFuZCB0aGUgcHJlZml4IGxlbmd0aC4gSWYgdGhlIGxlbmd0aCBvZiB0aGUgcHJlZml4IGlzIG1pc3NpbmcsCitcdmVyYnxpcHwgYXNzdW1lcyBhIGZ1bGwtbGVuZ3RoIGhvc3Qgcm91dGUuIFRoZXJlIGlzIGFsc28gYSBzcGVjaWFsCitcdmVyYnxQUkVGSVh8IC0tLSBcdmVyYnxkZWZhdWx0fCAtLS0gd2hpY2ggaXMgZXF1aXZhbGVudCB0byBJUCBcdmVyYnwwLzB8IG9yCit0byBJUHY2IFx2ZXJifDo6LzB8LgorCitcaXRlbSBcdmVyYnx0b3MgVE9TfCBvciBcdmVyYnxkc2ZpZWxkIFRPU3wKKworLS0tIHRoZSBUeXBlIE9mIFNlcnZpY2UgKFRPUykga2V5LiBUaGlzIGtleSBoYXMgbm8gYXNzb2NpYXRlZCBtYXNrIGFuZAordGhlIGxvbmdlc3QgbWF0Y2ggaXMgdW5kZXJzdG9vZCBhczogRmlyc3QsIGNvbXBhcmUgdGhlIFRPUworb2YgdGhlIHJvdXRlIGFuZCBvZiB0aGUgcGFja2V0LiBJZiB0aGV5IGFyZSBub3QgZXF1YWwsIHRoZW4gdGhlIHBhY2tldAorbWF5IHN0aWxsIG1hdGNoIGEgcm91dGUgd2l0aCBhIHplcm8gVE9TLiBcdmVyYnxUT1N8IGlzIGVpdGhlciBhbiA4IGJpdCBoZXhhZGVjaW1hbAorbnVtYmVyIG9yIGFuIGlkZW50aWZpZXIgZnJvbSB7XHR0IC9ldGMvaXByb3V0ZTIvcnRcX2RzZmllbGR9LgorCisKK1xpdGVtIFx2ZXJifG1ldHJpYyBOVU1CRVJ8IG9yIFx2ZXJifHByZWZlcmVuY2UgTlVNQkVSfAorCistLS0gdGhlIHByZWZlcmVuY2UgdmFsdWUgb2YgdGhlIHJvdXRlLiBcdmVyYnxOVU1CRVJ8IGlzIGFuIGFyYml0cmFyeSAzMmJpdCBudW1iZXIuCisKK1xpdGVtIFx2ZXJifHRhYmxlIFRBQkxFSUR8CisKKy0tLSB0aGUgdGFibGUgdG8gYWRkIHRoaXMgcm91dGUgdG8uCitcdmVyYnxUQUJMRUlEfCBtYXkgYmUgYSBudW1iZXIgb3IgYSBzdHJpbmcgZnJvbSB0aGUgZmlsZQorXHZlcmJ8L2V0Yy9pcHJvdXRlMi9ydF90YWJsZXN8LiBJZiB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkLAorXHZlcmJ8aXB8IGFzc3VtZXMgdGhlIFx2ZXJifG1haW58IHRhYmxlLCB3aXRoIHRoZSBleGNlcHRpb24gb2YKK1x2ZXJifGxvY2FsfCwgXHZlcmJ8YnJvYWRjYXN0fCBhbmQgXHZlcmJ8bmF0fCByb3V0ZXMsIHdoaWNoIGFyZQorcHV0IGludG8gdGhlIFx2ZXJifGxvY2FsfCB0YWJsZSBieSBkZWZhdWx0LgorCitcaXRlbSBcdmVyYnxkZXYgTkFNRXwKKworLS0tIHRoZSBvdXRwdXQgZGV2aWNlIG5hbWUuCisKK1xpdGVtIFx2ZXJifHZpYSBBRERSRVNTfAorCistLS0gdGhlIGFkZHJlc3Mgb2YgdGhlIG5leHRob3Agcm91dGVyLiBBY3R1YWxseSwgdGhlIHNlbnNlIG9mIHRoaXMgZmllbGQgZGVwZW5kcworb24gdGhlIHJvdXRlIHR5cGUuIEZvciBub3JtYWwgXHZlcmJ8dW5pY2FzdHwgcm91dGVzIGl0IGlzIGVpdGhlciB0aGUgdHJ1ZSBuZXh0aG9wCityb3V0ZXIgb3IsIGlmIGl0IGlzIGEgZGlyZWN0IHJvdXRlIGluc3RhbGxlZCBpbiBCU0QgY29tcGF0aWJpbGl0eSBtb2RlLAoraXQgY2FuIGJlIGEgbG9jYWwgYWRkcmVzcyBvZiB0aGUgaW50ZXJmYWNlLgorRm9yIE5BVCByb3V0ZXMgaXQgaXMgdGhlIGZpcnN0IGFkZHJlc3Mgb2YgdGhlIGJsb2NrIG9mIHRyYW5zbGF0ZWQgSVAgZGVzdGluYXRpb25zLgorCitcaXRlbSBcdmVyYnxzcmMgQUREUkVTU3wKKworLS0tIHRoZSBzb3VyY2UgYWRkcmVzcyB0byBwcmVmZXIgd2hlbiBzZW5kaW5nIHRvIHRoZSBkZXN0aW5hdGlvbnMKK2NvdmVyZWQgYnkgdGhlIHJvdXRlIHByZWZpeC4KKworXGl0ZW0gXHZlcmJ8cmVhbG0gUkVBTE1JRHwKKworLS0tIHRoZSByZWFsbSB0byB3aGljaCB0aGlzIHJvdXRlIGlzIGFzc2lnbmVkLgorXHZlcmJ8UkVBTE1JRHwgbWF5IGJlIGEgbnVtYmVyIG9yIGEgc3RyaW5nIGZyb20gdGhlIGZpbGUKK1x2ZXJifC9ldGMvaXByb3V0ZTIvcnRfcmVhbG1zfC4gU2VjLlxyZWZ7UlQtUkVBTE1TfSAocC5ccGFnZXJlZntSVC1SRUFMTVN9KQorY29udGFpbnMgbW9yZSBpbmZvcm1hdGlvbiBvbiByZWFsbXMuCisKK1xpdGVtIFx2ZXJifG10dSBNVFV8IG9yIFx2ZXJifG10dSBsb2NrIE1UVXwKKworLS0tIHRoZSBNVFUgYWxvbmcgdGhlIHBhdGggdG8gdGhlIGRlc3RpbmF0aW9uLiBJZiB0aGUgbW9kaWZpZXIgXHZlcmJ8bG9ja3wgaXMKK25vdCB1c2VkLCB0aGUgTVRVIG1heSBiZSB1cGRhdGVkIGJ5IHRoZSBrZXJuZWwgZHVlIHRvIFBhdGggTVRVIERpc2NvdmVyeS4KK0lmIHRoZSBtb2RpZmllciBcdmVyYnxsb2NrfCBpcyB1c2VkLCBubyBwYXRoIE1UVSBkaXNjb3Zlcnkgd2lsbCBiZSB0cmllZCwKK2FsbCBwYWNrZXRzIHdpbGwgYmUgc2VudCB3aXRob3V0IHRoZSBERiBiaXQgaW4gSVB2NCBjYXNlCitvciBmcmFnbWVudGVkIHRvIE1UVSBmb3IgSVB2Ni4KKworXGl0ZW0gXHZlcmJ8d2luZG93IE5VTUJFUnwKKworLS0tIHRoZSBtYXhpbWFsIHdpbmRvdyBmb3IgVENQIHRvIGFkdmVydGlzZSB0byB0aGVzZSBkZXN0aW5hdGlvbnMsCittZWFzdXJlZCBpbiBieXRlcy4gSXQgbGltaXRzIG1heGltYWwgZGF0YSBidXJzdHMgdGhhdCBvdXIgVENQCitwZWVycyBhcmUgYWxsb3dlZCB0byBzZW5kIHRvIHVzLgorCitcaXRlbSBcdmVyYnxydHQgTlVNQkVSfAorCistLS0gdGhlIGluaXRpYWwgUlRUIChgYFJvdW5kIFRyaXAgVGltZScnKSBlc3RpbWF0ZS4KKworCitcaXRlbSBcdmVyYnxydHR2YXIgTlVNQkVSfAorCistLS0gXHRocmVlb25seSB0aGUgaW5pdGlhbCBSVFQgdmFyaWFuY2UgZXN0aW1hdGUuCisKKworXGl0ZW0gXHZlcmJ8c3N0aHJlc2ggTlVNQkVSfAorCistLS0gXHRocmVlb25seSBhbiBlc3RpbWF0ZSBmb3IgdGhlIGluaXRpYWwgc2xvdyBzdGFydCB0aHJlc2hvbGQuCisKKworXGl0ZW0gXHZlcmJ8Y3duZCBOVU1CRVJ8CisKKy0tLSBcdGhyZWVvbmx5IHRoZSBjbGFtcCBmb3IgY29uZ2VzdGlvbiB3aW5kb3cuIEl0IGlzIGlnbm9yZWQgaWYgdGhlIFx2ZXJifGxvY2t8CisgICAgZmxhZyBpcyBub3QgdXNlZC4KKworCitcaXRlbSBcdmVyYnxhZHZtc3MgTlVNQkVSfAorCistLS0gXHRocmVlb25seSB0aGUgTVNTIChgYE1heGltYWwgU2VnbWVudCBTaXplJycpIHRvIGFkdmVydGlzZSB0byB0aGVzZQorICAgIGRlc3RpbmF0aW9ucyB3aGVuIGVzdGFibGlzaGluZyBUQ1AgY29ubmVjdGlvbnMuIElmIGl0IGlzIG5vdCBnaXZlbiwKKyAgICBMaW51eCB1c2VzIGEgZGVmYXVsdCB2YWx1ZSBjYWxjdWxhdGVkIGZyb20gdGhlIGZpcnN0IGhvcCBkZXZpY2UgTVRVLgorCitcYmVnaW57TkJ9CisgIElmIHRoZSBwYXRoIHRvIHRoZXNlIGRlc3RpbmF0aW9uIGlzIGFzeW1tZXRyaWMsIHRoaXMgZ3Vlc3MgbWF5IGJlIHdyb25nLgorXGVuZHtOQn0KKworXGl0ZW0gXHZlcmJ8cmVvcmRlcmluZyBOVU1CRVJ8CisKKy0tLSBcdGhyZWVvbmx5IE1heGltYWwgcmVvcmRlcmluZyBvbiB0aGUgcGF0aCB0byB0aGlzIGRlc3RpbmF0aW9uLgorICAgIElmIGl0IGlzIG5vdCBnaXZlbiwgTGludXggdXNlcyB0aGUgdmFsdWUgc2VsZWN0ZWQgd2l0aCBcdmVyYnxzeXNjdGx8CisgICAgdmFyaWFibGUgXHZlcmJ8bmV0L2lwdjQvdGNwX3Jlb3JkZXJpbmd8LgorCitcaXRlbSBcdmVyYnxob3BsaW1pdCBOVU1CRVJ8CisKKy0tLSBbMi41Ljc0KyBvbmx5XSBNYXhpbXVtIG51bWJlciBvZiBob3BzIG9uIHRoZSBwYXRoIHRvIHRoaXMgZGVzdGluYXRpb24uCisgICAgVGhlIGRlZmF1bHQgaXMgdGhlIHZhbHVlIHNlbGVjdGVkIHdpdGggdGhlIFx2ZXJifHN5c2N0bHwgdmFyaWFibGUKKyAgICBcdmVyYnxuZXQvaXB2NC9pcF9kZWZhdWx0X3R0bHwuCisKK1xpdGVtIFx2ZXJifGluaXRjd25kIE5VTUJFUnwKKy0tLSBbMi41LjcwKyBvbmx5XSBJbml0aWFsIGNvbmdlc3Rpb24gd2luZG93IHNpemUgZm9yIGNvbm5lY3Rpb25zIHRvCisgICAgdGhpcyBkZXN0aW5hdGlvbi4gQWN0dWFsIHdpbmRvdyBzaXplIGlzIHRoaXMgdmFsdWUgbXVsdGlwbGllZCBieSB0aGUKKyAgICBNU1MgKGBgTWF4aW1hbCBTZWdtZW50IFNpemUnJykgZm9yIHNhbWUgY29ubmVjdGlvbi4gVGhlIGRlZmF1bHQgaXMKKyAgICB6ZXJvLCBtZWFuaW5nIHRvIHVzZSB0aGUgdmFsdWVzIHNwZWNpZmllZCBpbn5cY2l0ZXtSRkMyNDE0fS4KKworK1xpdGVtIFx2ZXJifGluaXRyd25kIE5VTUJFUnwKKyAKKystLS0gWzIuNi4zMysgb25seV0gSW5pdGlhbCByZWNlaXZlIHdpbmRvdyBzaXplIGZvciBjb25uZWN0aW9ucyB0byAKKysgICAgdGhpcyBkZXN0aW5hdGlvbi4gVGhlIGFjdHVhbCB3aW5kb3cgc2l6ZSBpcyB0aGlzIHZhbHVlIG11bHRpcGxpZWQKKysgICAgYnkgdGhlIE1TUyAoJydNYXhpbWFsIFNlZ21lbnQgU2l6ZScnKSBvZiB0aGUgY29ubmVjdGlvbi4gVGhlIGRlZmF1bHQKKysgICAgdmFsdWUgaXMgemVybywgbWVhbmluZyB0byB1c2UgU2xvdyBTdGFydCB2YWx1ZS4KKyAKK1xpdGVtIFx2ZXJifG5leHRob3AgTkVYVEhPUHwKKworLS0tIHRoZSBuZXh0aG9wIG9mIGEgbXVsdGlwYXRoIHJvdXRlLiBcdmVyYnxORVhUSE9QfCBpcyBhIGNvbXBsZXggdmFsdWUKK3dpdGggaXRzIG93biBzeW50YXggc2ltaWxhciB0byB0aGUgdG9wIGxldmVsIGFyZ3VtZW50IGxpc3RzOgorXGJlZ2lue2l0ZW1pemV9CitcaXRlbSBcdmVyYnx2aWEgQUREUkVTU3wgaXMgdGhlIG5leHRob3Agcm91dGVyLgorXGl0ZW0gXHZlcmJ8ZGV2IE5BTUV8IGlzIHRoZSBvdXRwdXQgZGV2aWNlLgorXGl0ZW0gXHZlcmJ8d2VpZ2h0IE5VTUJFUnwgaXMgYSB3ZWlnaHQgZm9yIHRoaXMgZWxlbWVudCBvZiBhIG11bHRpcGF0aAorcm91dGUgcmVmbGVjdGluZyBpdHMgcmVsYXRpdmUgYmFuZHdpZHRoIG9yIHF1YWxpdHkuCitcZW5ke2l0ZW1pemV9CisKK1xpdGVtIFx2ZXJifHNjb3BlIFNDT1BFX1ZBTHwKKworLS0tIHRoZSBzY29wZSBvZiB0aGUgZGVzdGluYXRpb25zIGNvdmVyZWQgYnkgdGhlIHJvdXRlIHByZWZpeC4KK1x2ZXJifFNDT1BFX1ZBTHwgbWF5IGJlIGEgbnVtYmVyIG9yIGEgc3RyaW5nIGZyb20gdGhlIGZpbGUKK1x2ZXJifC9ldGMvaXByb3V0ZTIvcnRfc2NvcGVzfC4KK0lmIHRoaXMgcGFyYW1ldGVyIGlzIG9taXR0ZWQsCitcdmVyYnxpcHwgYXNzdW1lcyBzY29wZSBcdmVyYnxnbG9iYWx8IGZvciBhbGwgZ2F0ZXdheWVkIFx2ZXJifHVuaWNhc3R8Cityb3V0ZXMsIHNjb3BlIFx2ZXJifGxpbmt8IGZvciBkaXJlY3QgXHZlcmJ8dW5pY2FzdHwgYW5kIFx2ZXJifGJyb2FkY2FzdHwgcm91dGVzCithbmQgc2NvcGUgXHZlcmJ8aG9zdHwgZm9yIFx2ZXJifGxvY2FsfCByb3V0ZXMuCisKK1xpdGVtIFx2ZXJifHByb3RvY29sIFJUUFJPVE98CisKKy0tLSB0aGUgcm91dGluZyBwcm90b2NvbCBpZGVudGlmaWVyIG9mIHRoaXMgcm91dGUuCitcdmVyYnxSVFBST1RPfCBtYXkgYmUgYSBudW1iZXIgb3IgYSBzdHJpbmcgZnJvbSB0aGUgZmlsZQorXHZlcmJ8L2V0Yy9pcHJvdXRlMi9ydF9wcm90b3N8LiBJZiB0aGUgcm91dGluZyBwcm90b2NvbCBJRCBpcworbm90IGdpdmVuLCBcdmVyYnxpcHwgYXNzdW1lcyBwcm90b2NvbCBcdmVyYnxib290fCAoaS5lLlwKK2l0IGFzc3VtZXMgdGhlIHJvdXRlIHdhcyBhZGRlZCBieSBzb21lb25lIHdobyBkb2Vzbid0Cit1bmRlcnN0YW5kIHdoYXQgdGhleSBhcmUgZG9pbmcpLiBTZXZlcmFsIHByb3RvY29sIHZhbHVlcyBoYXZlIGEgZml4ZWQgaW50ZXJwcmV0YXRpb24uCitOYW1lbHk6CitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIFx2ZXJifHJlZGlyZWN0fCAtLS0gdGhlIHJvdXRlIHdhcyBpbnN0YWxsZWQgZHVlIHRvIGFuIElDTVAgcmVkaXJlY3QuCitcaXRlbSBcdmVyYnxrZXJuZWx8IC0tLSB0aGUgcm91dGUgd2FzIGluc3RhbGxlZCBieSB0aGUga2VybmVsIGR1cmluZworYXV0b2NvbmZpZ3VyYXRpb24uCitcaXRlbSBcdmVyYnxib290fCAtLS0gdGhlIHJvdXRlIHdhcyBpbnN0YWxsZWQgZHVyaW5nIHRoZSBib290dXAgc2VxdWVuY2UuCitJZiBhIHJvdXRpbmcgZGFlbW9uIHN0YXJ0cywgaXQgd2lsbCBwdXJnZSBhbGwgb2YgdGhlbS4KK1xpdGVtIFx2ZXJifHN0YXRpY3wgLS0tIHRoZSByb3V0ZSB3YXMgaW5zdGFsbGVkIGJ5IHRoZSBhZG1pbmlzdHJhdG9yCit0byBvdmVycmlkZSBkeW5hbWljIHJvdXRpbmcuIFJvdXRpbmcgZGFlbW9uIHdpbGwgcmVzcGVjdCB0aGVtCithbmQsIHByb2JhYmx5LCBldmVuIGFkdmVydGlzZSB0aGVtIHRvIGl0cyBwZWVycy4KK1xpdGVtIFx2ZXJifHJhfCAtLS0gdGhlIHJvdXRlIHdhcyBpbnN0YWxsZWQgYnkgUm91dGVyIERpc2NvdmVyeSBwcm90b2NvbC4KK1xlbmR7aXRlbWl6ZX0KK1RoZSByZXN0IG9mIHRoZSB2YWx1ZXMgYXJlIG5vdCByZXNlcnZlZCBhbmQgdGhlIGFkbWluaXN0cmF0b3IgaXMgZnJlZQordG8gYXNzaWduIChvciBub3QgdG8gYXNzaWduKSBwcm90b2NvbCB0YWdzLiBBdCBsZWFzdCwgcm91dGluZworZGFlbW9ucyBzaG91bGQgdGFrZSBjYXJlIG9mIHNldHRpbmcgc29tZSB1bmlxdWUgcHJvdG9jb2wgdmFsdWVzLAorZi5lLlwgYXMgdGhleSBhcmUgYXNzaWduZWQgaW4gXHZlcmJ8cnRuZXRsaW5rLmh8IG9yIGluIFx2ZXJifHJ0X3Byb3Rvc3wKK2RhdGFiYXNlLgorCisKK1xpdGVtIFx2ZXJifG9ubGlua3wKKworLS0tIHByZXRlbmQgdGhhdCB0aGUgbmV4dGhvcCBpcyBkaXJlY3RseSBhdHRhY2hlZCB0byB0aGlzIGxpbmssCitldmVuIGlmIGl0IGRvZXMgbm90IG1hdGNoIGFueSBpbnRlcmZhY2UgcHJlZml4LiBPbmUgYXBwbGljYXRpb24gb2YgdGhpcworb3B0aW9uIG1heSBiZSBmb3VuZCBpbn5cY2l0ZXtJUC1UVU5ORUxTfS4KKworXGl0ZW0gXHZlcmJ8cHJlZiBQUkVGfAorCistLS0gdGhlIElQdjYgcm91dGUgcHJlZmVyZW5jZS4KK1x2ZXJifFBSRUZ8IFBSRUYgaXMgYSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgcm91dGUgcHJlZmVyZW5jZSBhcyBkZWZpbmVkIGluCitSRkM0MTkxIGZvciBSb3V0ZXIgRGlzY292ZXJ5IG1lc3NhZ2VzLiBOYW1lbHk6CitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIFx2ZXJifGxvd3wgLS0tIHRoZSByb3V0ZSBoYXMgYSBsb3dlc3QgcHJpb3JpdHkuCitcaXRlbSBcdmVyYnxtZWRpdW18IC0tLSB0aGUgcm91dGUgaGFzIGEgZGVmYXVsdCBwcmlvcml0eS4KK1xpdGVtIFx2ZXJifGhpZ2h8IC0tLSB0aGUgcm91dGUgaGFzIGEgaGlnaGVzdCBwcmlvcml0eS4KK1xlbmR7aXRlbWl6ZX0KKworXGVuZHtpdGVtaXplfQorCisKK1xiZWdpbntOQn0KKyAgQWN0dWFsbHkgdGhlcmUgYXJlIG1vcmUgY29tbWFuZHM6IFx2ZXJifHByZXBlbmR8IGRvZXMgdGhlIHNhbWUKKyAgdGhpbmcgYXMgY2xhc3NpYyBcdmVyYnxyb3V0ZSBhZGR8LCBpLmUuXCBhZGRzIGEgcm91dGUsIGV2ZW4gaWYgYW5vdGhlcgorICByb3V0ZSB0byB0aGUgc2FtZSBkZXN0aW5hdGlvbiBleGlzdHMuIEl0cyBvcHBvc2l0ZSBjYXNlIGlzIFx2ZXJifGFwcGVuZHwsCisgIHdoaWNoIGFkZHMgdGhlIHJvdXRlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuIEF2b2lkIHRoZXNlCisgIGZlYXR1cmVzLgorXGVuZHtOQn0KK1xiZWdpbntOQn0KKyAgTW9yZSBzYWQgbmV3cywgSVB2NiBvbmx5IHVuZGVyc3RhbmRzIHRoZSBcdmVyYnxhcHBlbmR8IGNvbW1hbmQgY29ycmVjdGx5LgorICBBbGwgdGhlIG90aGVycyBhcmUgdHJhbnNsYXRlZCBpbnRvIFx2ZXJifGFwcGVuZHwgY29tbWFuZHMuIENlcnRhaW5seSwKKyAgdGhpcyB3aWxsIGNoYW5nZSBpbiB0aGUgZnV0dXJlLgorXGVuZHtOQn0KKworXHBhcmFncmFwaHtFeGFtcGxlczp9CitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIGFkZCBhIHBsYWluIHJvdXRlIHRvIG5ldHdvcmsgMTAuMC4wLzI0IHZpYSBnYXRld2F5IDE5My4yMzMuNy42NQorXGJlZ2lue3ZlcmJhdGltfQorICBpcCByb3V0ZSBhZGQgMTAuMC4wLzI0IHZpYSAxOTMuMjMzLjcuNjUKK1xlbmR7dmVyYmF0aW19CitcaXRlbSBjaGFuZ2UgaXQgdG8gYSBkaXJlY3Qgcm91dGUgdmlhIHRoZSBcdmVyYnxkdW1teXwgZGV2aWNlCitcYmVnaW57dmVyYmF0aW19CisgIGlwIHJvIGNoZyAxMC4wLjAvMjQgZGV2IGR1bW15CitcZW5ke3ZlcmJhdGltfQorXGl0ZW0gYWRkIGEgZGVmYXVsdCBtdWx0aXBhdGggcm91dGUgc3BsaXR0aW5nIHRoZSBsb2FkIGJldHdlZW4gXHZlcmJ8cHBwMHwKK2FuZCBcdmVyYnxwcHAxfAorXGJlZ2lue3ZlcmJhdGltfQorICBpcCByb3V0ZSBhZGQgZGVmYXVsdCBzY29wZSBnbG9iYWwgbmV4dGhvcCBkZXYgcHBwMCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0aG9wIGRldiBwcHAxCitcZW5ke3ZlcmJhdGltfQorTm90ZSB0aGUgc2NvcGUgdmFsdWUuIEl0IGlzIG5vdCBuZWNlc3NhcnkgYnV0IGl0IGluZm9ybXMgdGhlIGtlcm5lbAordGhhdCB0aGlzIHJvdXRlIGlzIGdhdGV3YXllZCByYXRoZXIgdGhhbiBkaXJlY3QuIEFjdHVhbGx5LCBpZiB5b3UKK2tub3cgdGhlIGFkZHJlc3NlcyBvZiByZW1vdGUgZW5kcG9pbnRzIGl0IHdvdWxkIGJlIGJldHRlciB0byB1c2UgdGhlCitcdmVyYnx2aWF8IHBhcmFtZXRlci4KK1xpdGVtIGFubm91bmNlIHRoYXQgdGhlIGFkZHJlc3MgMTkyLjIwMy44MC4xNDQgaXMgbm90IGEgcmVhbCBvbmUsIGJ1dAorc2hvdWxkIGJlIHRyYW5zbGF0ZWQgdG8gMTkzLjIzMy43LjgzIGJlZm9yZSBmb3J3YXJkaW5nCitcYmVnaW57dmVyYmF0aW19CisgIGlwIHJvdXRlIGFkZCBuYXQgMTkyLjIwMy44MC4xNDQgdmlhIDE5My4yMzMuNy44MworXGVuZHt2ZXJiYXRpbX0KK0JhY2t3YXJkIHRyYW5zbGF0aW9uIGlzIHNldHVwIHdpdGggcG9saWN5IHJ1bGVzIGRlc2NyaWJlZAoraW4gdGhlIGZvbGxvd2luZyBzZWN0aW9uIChzZWMuXHJlZntJUC1SVUxFfSwgcC5ccGFnZXJlZntJUC1SVUxFfSkuCitcZW5ke2l0ZW1pemV9CisKK1xzdWJzZWN0aW9ue3tcdHQgaXAgcm91dGUgZGVsZXRlfSAtLS0gZGVsZXRlIGEgcm91dGV9CisKK1xwYXJhZ3JhcGh7QWJicmV2aWF0aW9uczp9IFx2ZXJifGRlbGV0ZXwsIFx2ZXJifGRlbHwsIFx2ZXJifGR8LgorCitccGFyYWdyYXBoe0FyZ3VtZW50czp9IFx2ZXJifGlwIHJvdXRlIGRlbHwgaGFzIHRoZSBzYW1lIGFyZ3VtZW50cyBhcworXHZlcmJ8aXAgcm91dGUgYWRkfCwgYnV0IHRoZWlyIHNlbWFudGljcyBhcmUgYSBiaXQgZGlmZmVyZW50LgorCitLZXkgdmFsdWVzIChcdmVyYnx0b3wsIFx2ZXJifHRvc3wsIFx2ZXJifHByZWZlcmVuY2V8IGFuZCBcdmVyYnx0YWJsZXwpCitzZWxlY3QgdGhlIHJvdXRlIHRvIGRlbGV0ZS4gSWYgb3B0aW9uYWwgYXR0cmlidXRlcyBhcmUgcHJlc2VudCwgXHZlcmJ8aXB8Cit2ZXJpZmllcyB0aGF0IHRoZXkgY29pbmNpZGUgd2l0aCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgcm91dGUgdG8gZGVsZXRlLgorSWYgbm8gcm91dGUgd2l0aCB0aGUgZ2l2ZW4ga2V5IGFuZCBhdHRyaWJ1dGVzIHdhcyBmb3VuZCwgXHZlcmJ8aXAgcm91dGUgZGVsfAorZmFpbHMuCitcYmVnaW57TkJ9CitMaW51eC0yLjAgaGFkIHRoZSBvcHRpb24gdG8gZGVsZXRlIGEgcm91dGUgc2VsZWN0ZWQgb25seSBieSBwcmVmaXggYWRkcmVzcywKK2lnbm9yaW5nIGl0cyBsZW5ndGggKGkuZS5cIG5ldG1hc2spLiBUaGlzIG9wdGlvbiBubyBsb25nZXIgZXhpc3RzCitiZWNhdXNlIGl0IHdhcyBhbWJpZ3VvdXMuIEhvd2V2ZXIsIGxvb2sgYXQge1x0dCBpcCByb3V0ZSBmbHVzaH0KKyhzZWMuXHJlZntJUC1ST1VURS1GTFVTSH0sIHAuXHBhZ2VyZWZ7SVAtUk9VVEUtRkxVU0h9KSB3aGljaAorcHJvdmlkZXMgc2ltaWxhciBhbmQgZXZlbiByaWNoZXIgZnVuY3Rpb25hbGl0eS4KK1xlbmR7TkJ9CisKK1xwYXJhZ3JhcGh7RXhhbXBsZTp9CitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIGRlbGV0ZSB0aGUgbXVsdGlwYXRoIHJvdXRlIGNyZWF0ZWQgYnkgdGhlIGNvbW1hbmQgaW4gcHJldmlvdXMgc3Vic2VjdGlvbgorXGJlZ2lue3ZlcmJhdGltfQorICBpcCByb3V0ZSBkZWwgZGVmYXVsdCBzY29wZSBnbG9iYWwgbmV4dGhvcCBkZXYgcHBwMCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0aG9wIGRldiBwcHAxCitcZW5ke3ZlcmJhdGltfQorXGVuZHtpdGVtaXplfQorCisKKworXHN1YnNlY3Rpb257e1x0dCBpcCByb3V0ZSBzaG93fSAtLS0gbGlzdCByb3V0ZXN9CisKK1xwYXJhZ3JhcGh7QWJicmV2aWF0aW9uczp9IFx2ZXJifHNob3d8LCBcdmVyYnxsaXN0fCwgXHZlcmJ8c2h8LCBcdmVyYnxsc3wsIFx2ZXJifGx8LgorCitccGFyYWdyYXBoe0Rlc2NyaXB0aW9uOn0gdGhlIGNvbW1hbmQgZGlzcGxheXMgdGhlIGNvbnRlbnRzIG9mIHRoZSByb3V0aW5nIHRhYmxlcworb3IgdGhlIHJvdXRlKHMpIHNlbGVjdGVkIGJ5IHNvbWUgY3JpdGVyaWEuCisKKworXHBhcmFncmFwaHtBcmd1bWVudHM6fQorXGJlZ2lue2l0ZW1pemV9CitcaXRlbSBcdmVyYnx0byBTRUxFQ1RPUnwgKGRlZmF1bHQpCisKKy0tLSBvbmx5IHNlbGVjdCByb3V0ZXMgZnJvbSB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgZGVzdGluYXRpb25zLiBcdmVyYnxTRUxFQ1RPUnwKK2NvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIG1vZGlmaWVyIChcdmVyYnxyb290fCwgXHZlcmJ8bWF0Y2h8IG9yIFx2ZXJifGV4YWN0fCkKK2FuZCBhIHByZWZpeC4gXHZlcmJ8cm9vdCBQUkVGSVh8IHNlbGVjdHMgcm91dGVzIHdpdGggcHJlZml4ZXMgbm90IHNob3J0ZXIKK3RoYW4gXHZlcmJ8UFJFRklYfC4gRi5lLlwgXHZlcmJ8cm9vdCAwLzB8IHNlbGVjdHMgdGhlIGVudGlyZSByb3V0aW5nIHRhYmxlLgorXHZlcmJ8bWF0Y2ggUFJFRklYfCBzZWxlY3RzIHJvdXRlcyB3aXRoIHByZWZpeGVzIG5vdCBsb25nZXIgdGhhbgorXHZlcmJ8UFJFRklYfC4gRi5lLlwgXHZlcmJ8bWF0Y2ggMTAuMC8xNnwgc2VsZWN0cyBcdmVyYnwxMC4wLzE2fCwKK1x2ZXJifDEwLzh8IGFuZCBcdmVyYnwwLzB8LCBidXQgaXQgZG9lcyBub3Qgc2VsZWN0IFx2ZXJifDEwLjEvMTZ8IGFuZAorXHZlcmJ8MTAuMC4wLzI0fC4gQW5kIFx2ZXJifGV4YWN0IFBSRUZJWHwgKG9yIGp1c3QgXHZlcmJ8UFJFRklYfCkKK3NlbGVjdHMgcm91dGVzIHdpdGggdGhpcyBleGFjdCBwcmVmaXguIElmIG5laXRoZXIgb2YgdGhlc2Ugb3B0aW9ucworYXJlIHByZXNlbnQsIFx2ZXJifGlwfCBhc3N1bWVzIFx2ZXJifHJvb3QgMC8wfCBpLmUuXCBpdCBsaXN0cyB0aGUgZW50aXJlIHRhYmxlLgorCisKK1xpdGVtIFx2ZXJifHRvcyBUT1N8IG9yIFx2ZXJifGRzZmllbGQgVE9TfAorCisgLS0tIG9ubHkgc2VsZWN0IHJvdXRlcyB3aXRoIHRoZSBnaXZlbiBUT1MuCisKKworXGl0ZW0gXHZlcmJ8dGFibGUgVEFCTEVJRHwKKworIC0tLSBzaG93IHRoZSByb3V0ZXMgZnJvbSB0aGlzIHRhYmxlKHMpLiBUaGUgZGVmYXVsdCBzZXR0aW5nIGlzIHRvIHNob3cKK1x2ZXJifHRhYmxlfCBcdmVyYnxtYWlufC4gXHZlcmJ8VEFCTEVJRHwgbWF5IGVpdGhlciBiZSB0aGUgSUQgb2YgYSByZWFsIHRhYmxlCitvciBvbmUgb2YgdGhlIHNwZWNpYWwgdmFsdWVzOgorICBcYmVnaW57aXRlbWl6ZX0KKyAgXGl0ZW0gXHZlcmJ8YWxsfCAtLS0gbGlzdCBhbGwgb2YgdGhlIHRhYmxlcy4KKyAgXGl0ZW0gXHZlcmJ8Y2FjaGV8IC0tLSBkdW1wIHRoZSByb3V0aW5nIGNhY2hlLgorICBcZW5ke2l0ZW1pemV9CitcYmVnaW57TkJ9CisgIElQdjYgaGFzIGEgc2luZ2xlIHRhYmxlLiBIb3dldmVyLCBzcGxpdHRpbmcgaXQgaW50byBcdmVyYnxtYWlufCwgXHZlcmJ8bG9jYWx8CisgIGFuZCBcdmVyYnxjYWNoZXwgaXMgZW11bGF0ZWQgYnkgdGhlIFx2ZXJifGlwfCB1dGlsaXR5LgorXGVuZHtOQn0KKworXGl0ZW0gXHZlcmJ8Y2xvbmVkfCBvciBcdmVyYnxjYWNoZWR8CisKKy0tLSBsaXN0IGNsb25lZCByb3V0ZXMgaS5lLlwgcm91dGVzIHdoaWNoIHdlcmUgZHluYW1pY2FsbHkgZm9ya2VkIGZyb20KK290aGVyIHJvdXRlcyBiZWNhdXNlIHNvbWUgcm91dGUgYXR0cmlidXRlIChmLmUuXCBNVFUpIHdhcyB1cGRhdGVkLgorQWN0dWFsbHksIGl0IGlzIGVxdWl2YWxlbnQgdG8gXHZlcmJ8dGFibGUgY2FjaGV8LgorCitcaXRlbSBcdmVyYnxmcm9tIFNFTEVDVE9SfAorCistLS0gdGhlIHNhbWUgc3ludGF4IGFzIGZvciBcdmVyYnx0b3wsIGJ1dCBpdCBiaW5kcyB0aGUgc291cmNlIGFkZHJlc3MgcmFuZ2UKK3JhdGhlciB0aGFuIGRlc3RpbmF0aW9ucy4gTm90ZSB0aGF0IHRoZSBcdmVyYnxmcm9tfCBvcHRpb24gb25seSB3b3JrcyB3aXRoCitjbG9uZWQgcm91dGVzLgorCitcaXRlbSBcdmVyYnxwcm90b2NvbCBSVFBST1RPfAorCistLS0gb25seSBsaXN0IHJvdXRlcyBvZiB0aGlzIHByb3RvY29sLgorCisKK1xpdGVtIFx2ZXJifHNjb3BlIFNDT1BFX1ZBTHwKKworLS0tIG9ubHkgbGlzdCByb3V0ZXMgd2l0aCB0aGlzIHNjb3BlLgorCitcaXRlbSBcdmVyYnx0eXBlIFRZUEV8CisKKy0tLSBvbmx5IGxpc3Qgcm91dGVzIG9mIHRoaXMgdHlwZS4KKworXGl0ZW0gXHZlcmJ8ZGV2IE5BTUV8CisKKy0tLSBvbmx5IGxpc3Qgcm91dGVzIGdvaW5nIHZpYSB0aGlzIGRldmljZS4KKworXGl0ZW0gXHZlcmJ8dmlhIFBSRUZJWHwKKworLS0tIG9ubHkgbGlzdCByb3V0ZXMgZ29pbmcgdmlhIHRoZSBuZXh0aG9wIHJvdXRlcnMgc2VsZWN0ZWQgYnkgXHZlcmJ8UFJFRklYfC4KKworXGl0ZW0gXHZlcmJ8c3JjIFBSRUZJWHwKKworLS0tIG9ubHkgbGlzdCByb3V0ZXMgd2l0aCBwcmVmZXJyZWQgc291cmNlIGFkZHJlc3NlcyBzZWxlY3RlZAorYnkgXHZlcmJ8UFJFRklYfC4KKworXGl0ZW0gXHZlcmJ8cmVhbG0gUkVBTE1JRHwgb3IgXHZlcmJ8cmVhbG1zIEZST01SRUFMTS9UT1JFQUxNfAorCistLS0gb25seSBsaXN0IHJvdXRlcyB3aXRoIHRoZXNlIHJlYWxtcy4KKworXGVuZHtpdGVtaXplfQorCitccGFyYWdyYXBoe0V4YW1wbGVzOn0gTGV0IHVzIGNvdW50IHJvdXRlcyBvZiBwcm90b2NvbCBcdmVyYnxnYXRlZC9iZ3B8CitvbiBhIHJvdXRlcjoKK1xiZWdpbnt2ZXJiYXRpbX0KK2t1em5ldEBhbWJlcjp+ICQgaXAgcm8gbHMgcHJvdG8gZ2F0ZWQvYmdwIHwgd2MKKyAgIDE0MTMgICAgOTg5MSAgICA3OTAxMAora3V6bmV0QGFtYmVyOn4gJAorXGVuZHt2ZXJiYXRpbX0KK1RvIGNvdW50IHRoZSBzaXplIG9mIHRoZSByb3V0aW5nIGNhY2hlLCB3ZSBoYXZlIHRvIHVzZSB0aGUgXHZlcmJ8LW98IG9wdGlvbgorYmVjYXVzZSBjYWNoZWQgYXR0cmlidXRlcyBjYW4gdGFrZSBtb3JlIHRoYW4gb25lIGxpbmUgb2Ygb3V0cHV0OgorXGJlZ2lue3ZlcmJhdGltfQora3V6bmV0QGFtYmVyOn4gJCBpcCAtbyBybyBscyBjbG9uZWQgfCB3YworICAgMTU5ICAgIDI1NDMgICAgMTg3MDcKK2t1em5ldEBhbWJlcjp+ICQKK1xlbmR7dmVyYmF0aW19CisKKworXHBhcmFncmFwaHtPdXRwdXQgZm9ybWF0On0gVGhlIG91dHB1dCBvZiB0aGlzIGNvbW1hbmQgY29uc2lzdHMKK29mIHBlciByb3V0ZSByZWNvcmRzIHNlcGFyYXRlZCBieSBsaW5lIGZlZWRzLgorSG93ZXZlciwgc29tZSByZWNvcmRzIG1heSBjb25zaXN0CitvZiBtb3JlIHRoYW4gb25lIGxpbmU6IHBhcnRpY3VsYXJseSwgdGhpcyBpcyB0aGUgY2FzZSB3aGVuIHRoZSByb3V0ZQoraXMgY2xvbmVkIG9yIHlvdSByZXF1ZXN0ZWQgYWRkaXRpb25hbCBzdGF0aXN0aWNzLiBJZiB0aGUKK1x2ZXJifC1vfCBvcHRpb24gd2FzIGdpdmVuLCB0aGVuIGxpbmUgZmVlZHMgc2VwYXJhdGluZyBsaW5lcyBpbnNpZGUKK3JlY29yZHMgYXJlIHJlcGxhY2VkIHdpdGggdGhlIGJhY2tzbGFzaCBzaWduLgorCitUaGUgb3V0cHV0IGhhcyB0aGUgc2FtZSBzeW50YXggYXMgYXJndW1lbnRzIGdpdmVuIHRvIHtcdHQgaXAgcm91dGUgYWRkfSwKK3NvIHRoYXQgaXQgY2FuIGJlIHVuZGVyc3Rvb2QgZWFzaWx5LiBGLmUuXAorXGJlZ2lue3ZlcmJhdGltfQora3V6bmV0QGFtYmVyOn4gJCBpcCBybyBscyAxOTMuMjMzLjcvMjQKKzE5My4yMzMuNy4wLzI0IGRldiBldGgwICBwcm90byBnYXRlZC9jb25uICBzY29wZSBsaW5rIFwKKyAgICBzcmMgMTkzLjIzMy43LjY1IHJlYWxtcyBpbnIuYWMgCitrdXpuZXRAYW1iZXI6fiAkCitcZW5ke3ZlcmJhdGltfQorCitJZiB5b3UgbGlzdCBjbG9uZWQgZW50cmllcywgdGhlIG91dHB1dCBjb250YWlucyBvdGhlciBhdHRyaWJ1dGVzIHdoaWNoCithcmUgZXZhbHVhdGVkIGR1cmluZyByb3V0ZSBjYWxjdWxhdGlvbiBhbmQgdXBkYXRlZCBkdXJpbmcgcm91dGUKK2xpZmV0aW1lLiBBbiBleGFtcGxlIG9mIHRoZSBvdXRwdXQgaXM6CitcYmVnaW57dmVyYmF0aW19CitrdXpuZXRAYW1iZXI6fiAkIGlwIHJvIGxzIDE5My4yMzMuNy44MiB0YWIgY2FjaGUKKzE5My4yMzMuNy44MiBmcm9tIDE5My4yMzMuNy44MiBkZXYgZXRoMCAgc3JjIDE5My4yMzMuNy42NSBcCisgIHJlYWxtcyBpbnIuYWMvaW5yLmFjIAorICAgIGNhY2hlIDxzcmMtZGlyZWN0LHJlZGlyZWN0PiAgbXR1IDE1MDAgcnR0IDMwMCBpaWYgZXRoMAorMTkzLjIzMy43LjgyIGRldiBldGgwICBzcmMgMTkzLjIzMy43LjY1IHJlYWxtcyBpbnIuYWMgCisgICAgY2FjaGUgIG10dSAxNTAwIHJ0dCAzMDAKK2t1em5ldEBhbWJlcjp+ICQKK1xlbmR7dmVyYmF0aW19CitcYmVnaW57TkJ9CisgIFxsYWJlbHtOQi1zdHJhbmdlLXJvdXRlfQorICBUaGUgcm91dGUgbG9va3MgYSBiaXQgc3RyYW5nZSwgZG9lc24ndCBpdD8gRGlkIHlvdSBub3RpY2UgdGhhdAorICBpdCBpcyBhIHBhdGggZnJvbSAxOTMuMjMzLjcuODIgYmFjayB0byAxOTMuMjMzLjgyPyBXZWxsLCB5b3Ugd2lsbAorICBzZWUgaW4gdGhlIHNlY3Rpb24gb24gXHZlcmJ8aXAgcm91dGUgZ2V0fCAocC5ccGFnZXJlZntOQi1uYXR1cmUtb2Ytc3RyYW5nZW5lc3N9KQorICBob3cgaXQgYXBwZWFyZWQuCitcZW5ke05CfQorVGhlIHNlY29uZCBsaW5lLCBzdGFydGluZyB3aXRoIHRoZSB3b3JkIFx2ZXJifGNhY2hlfCwgc2hvd3MKK2FkZGl0aW9uYWwgYXR0cmlidXRlcyB3aGljaCBub3JtYWwgcm91dGVzIGRvIG5vdCBwb3NzZXNzLgorQ2FjaGVkIGZsYWdzIGFyZSBzdW1tYXJpemVkIGluIGFuZ2xlIGJyYWNrZXRzOgorXGJlZ2lue2l0ZW1pemV9CitcaXRlbSBcdmVyYnxsb2NhbHwgLS0tIHBhY2tldHMgYXJlIGRlbGl2ZXJlZCBsb2NhbGx5LgorSXQgc3RhbmRzIGZvciBsb29wYmFjayB1bmljYXN0IHJvdXRlcywgZm9yIGJyb2FkY2FzdCByb3V0ZXMKK2FuZCBmb3IgbXVsdGljYXN0IHJvdXRlcywgaWYgdGhpcyBob3N0IGlzIGEgbWVtYmVyIG9mIHRoZSBjb3JyZXNwb25kaW5nCitncm91cC4KKworXGl0ZW0gXHZlcmJ8cmVqZWN0fCAtLS0gdGhlIHBhdGggaXMgYmFkLiBBbnkgYXR0ZW1wdCB0byB1c2UgaXQgcmVzdWx0cworaW4gYW4gZXJyb3IuIFNlZSBhdHRyaWJ1dGUgXHZlcmJ8ZXJyb3J8IGJlbG93IChwLlxwYWdlcmVme0lQLVJPVVRFLUdFVC1lcnJvcn0pLgorCitcaXRlbSBcdmVyYnxtY3wgLS0tIHRoZSBkZXN0aW5hdGlvbiBpcyBtdWx0aWNhc3QuCisKK1xpdGVtIFx2ZXJifGJyZHwgLS0tIHRoZSBkZXN0aW5hdGlvbiBpcyBicm9hZGNhc3QuCisKK1xpdGVtIFx2ZXJifHNyYy1kaXJlY3R8IC0tLSB0aGUgc291cmNlIGlzIG9uIGEgZGlyZWN0bHkgY29ubmVjdGVkCitpbnRlcmZhY2UuCisKK1xpdGVtIFx2ZXJifHJlZGlyZWN0ZWR8IC0tLSB0aGUgcm91dGUgd2FzIGNyZWF0ZWQgYnkgYW4gSUNNUCBSZWRpcmVjdC4KKworXGl0ZW0gXHZlcmJ8cmVkaXJlY3R8IC0tLSBwYWNrZXRzIGdvaW5nIHZpYSB0aGlzIHJvdXRlIHdpbGwgCit0cmlnZ2VyIGFuIElDTVAgcmVkaXJlY3QuCisKK1xpdGVtIFx2ZXJifGZhc3Ryb3V0ZXwgLS0tIHRoZSByb3V0ZSBpcyBlbGlnaWJsZSB0byBiZSB1c2VkIGZvciBmYXN0cm91dGUuCisKK1xpdGVtIFx2ZXJifGVxdWFsaXplfCAtLS0gbWFrZSBwYWNrZXQgYnkgcGFja2V0IHJhbmRvbWl6YXRpb24KK2Fsb25nIHRoaXMgcGF0aC4KKworXGl0ZW0gXHZlcmJ8ZHN0LW5hdHwgLS0tIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVzIHRyYW5zbGF0aW9uLgorCitcaXRlbSBcdmVyYnxzcmMtbmF0fCAtLS0gdGhlIHNvdXJjZSBhZGRyZXNzIHJlcXVpcmVzIHRyYW5zbGF0aW9uLgorCitcaXRlbSBcdmVyYnxtYXNxfCAtLS0gdGhlIHNvdXJjZSBhZGRyZXNzIHJlcXVpcmVzIG1hc3F1ZXJhZGluZy4KK1RoaXMgZmVhdHVyZSBkaXNhcHBlYXJlZCBpbiBsaW51eC0yLjQuCisKK1xpdGVtIFx2ZXJifG5vdGlmeXwgLS0tICh7XGVtIG5vdCBpbXBsZW1lbnRlZH0pIGNoYW5nZS9kZWxldGlvbgorb2YgdGhpcyByb3V0ZSB3aWxsIHRyaWdnZXIgUlRORVRMSU5LIG5vdGlmaWNhdGlvbi4KK1xlbmR7aXRlbWl6ZX0KKworVGhlbiBzb21lIG9wdGlvbmFsIGF0dHJpYnV0ZXMgZm9sbG93OgorXGJlZ2lue2l0ZW1pemV9CitcaXRlbSBcdmVyYnxlcnJvcnwgLS0tIG9uIFx2ZXJifHJlamVjdHwgcm91dGVzIGl0IGlzIGVycm9yIGNvZGUKK3JldHVybmVkIHRvIGxvY2FsIHNlbmRlcnMgd2hlbiB0aGV5IHRyeSB0byB1c2UgdGhpcyByb3V0ZS4KK1RoZXNlIGVycm9yIGNvZGVzIGFyZSB0cmFuc2xhdGVkIGludG8gSUNNUCBlcnJvciBjb2Rlcywgc2VudCB0byByZW1vdGUKK3NlbmRlcnMsIGFjY29yZGluZyB0byB0aGUgcnVsZXMgZGVzY3JpYmVkIGFib3ZlIGluIHRoZSBzdWJzZWN0aW9uCitkZXZvdGVkIHRvIHJvdXRlIHR5cGVzIChwLlxwYWdlcmVme0lQLVJPVVRFLVRZUEVTfSkuCitcbGFiZWx7SVAtUk9VVEUtR0VULWVycm9yfQorCitcaXRlbSBcdmVyYnxleHBpcmVzfCAtLS0gdGhpcyBlbnRyeSB3aWxsIGV4cGlyZSBhZnRlciB0aGlzIHRpbWVvdXQuCisKK1xpdGVtIFx2ZXJifGlpZnwgLS0tIHRoZSBwYWNrZXRzIGZvciB0aGlzIHBhdGggYXJlIGV4cGVjdGVkIHRvIGFycml2ZQorb24gdGhpcyBpbnRlcmZhY2UuCitcZW5ke2l0ZW1pemV9CisKK1xwYXJhZ3JhcGh7U3RhdGlzdGljczp9IFdpdGggdGhlIFx2ZXJifC1zdGF0aXN0aWNzfCBvcHRpb24sIG1vcmUKK2luZm9ybWF0aW9uIGFib3V0IHRoaXMgcm91dGUgaXMgc2hvd246CitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIFx2ZXJifHVzZXJzfCAtLS0gdGhlIG51bWJlciBvZiB1c2VycyBvZiB0aGlzIGVudHJ5LgorXGl0ZW0gXHZlcmJ8YWdlfCAtLS0gc2hvd3Mgd2hlbiB0aGlzIHJvdXRlIHdhcyBsYXN0IHVzZWQuCitcaXRlbSBcdmVyYnx1c2VkfCAtLS0gdGhlIG51bWJlciBvZiBsb29rdXBzIG9mIHRoaXMgcm91dGUgc2luY2UgaXRzIGNyZWF0aW9uLgorXGVuZHtpdGVtaXplfQorCitcc3Vic2VjdGlvbnt7XHR0IGlwIHJvdXRlIHNhdmV9IC0tIHNhdmUgcm91dGluZyB0YWJsZXN9CitcbGFiZWx7SVAtUk9VVEUtU0FWRX0KKworXHBhcmFncmFwaHtEZXNjcmlwdGlvbjp9IHRoaXMgY29tbWFuZCBzYXZlcyB0aGUgY29udGVudHMgb2YgdGhlIHJvdXRpbmcKK3RhYmxlcyBvciB0aGUgcm91dGUocykgc2VsZWN0ZWQgYnkgc29tZSBjcml0ZXJpYSB0byBzdGFuZGFyZCBvdXRwdXQuCisKK1xwYXJhZ3JhcGh7QXJndW1lbnRzOn0gXHZlcmJ8aXAgcm91dGUgc2F2ZXwgaGFzIHRoZSBzYW1lIGFyZ3VtZW50cyBhcworXHZlcmJ8aXAgcm91dGUgc2hvd3wuCisKK1xwYXJhZ3JhcGh7RXhhbXBsZTp9IFRoaXMgc2F2ZXMgYWxsIHRoZSByb3V0ZXMgdG8gdGhlIHtcdHQgc2F2ZWRcX3JvdXRlc30KK2ZpbGU6CitcYmVnaW57dmVyYmF0aW19CitkYW5AY2FmZmVpbmU6fiAjIGlwIHJvdXRlIHNhdmUgPiBzYXZlZF9yb3V0ZXMKK1xlbmR7dmVyYmF0aW19CisKK1xwYXJhZ3JhcGh7T3V0cHV0IGZvcm1hdDp9IFRoZSBmb3JtYXQgb2YgdGhlIGRhdGEgc3RyZWFtIHByb3ZpZGVkIGJ5CitcdmVyYnxpcCByb3V0ZSBzYXZlfCBpcyB0aGF0IG9mIFx2ZXJifHJ0bmV0bGlua3wuICBTZWUKK1x2ZXJifHJ0bmV0bGluayg3KXwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK1xzdWJzZWN0aW9ue3tcdHQgaXAgcm91dGUgcmVzdG9yZX0gLS0gcmVzdG9yZSByb3V0aW5nIHRhYmxlc30KK1xsYWJlbHtJUC1ST1VURS1SRVNUT1JFfQorCitccGFyYWdyYXBoe0Rlc2NyaXB0aW9uOn0gdGhpcyBjb21tYW5kIHJlc3RvcmVzIHRoZSBjb250ZW50cyBvZiB0aGUgcm91dGluZwordGFibGVzIGFjY29yZGluZyB0byBhIGRhdGEgc3RyZWFtIGFzIHByb3ZpZGVkIGJ5IFx2ZXJifGlwIHJvdXRlIHNhdmV8IHZpYQorc3RhbmRhcmQgaW5wdXQuICBOb3RlIHRoYXQgYW55IHJvdXRlcyBhbHJlYWR5IGluIHRoZSB0YWJsZSBhcmUgbGVmdCB1bmNoYW5nZWQuCitBbnkgcm91dGVzIGluIHRoZSBpbnB1dCBzdHJlYW0gdGhhdCBhbHJlYWR5IGV4aXN0IGluIHRoZSB0YWJsZXMgYXJlIGlnbm9yZWQuCisKK1xwYXJhZ3JhcGh7QXJndW1lbnRzOn0gVGhpcyBjb21tYW5kIHRha2VzIG5vIGFyZ3VtZW50cy4KKworXHBhcmFncmFwaHtFeGFtcGxlOn0gVGhpcyByZXN0b3JlcyBhbGwgcm91dGVzIHRoYXQgd2VyZSBzYXZlZCB0byB0aGUKK3tcdHQgc2F2ZWRcX3JvdXRlc30gZmlsZToKKworXGJlZ2lue3ZlcmJhdGltfQorZGFuQGNhZmZlaW5lOn4gIyBpcCByb3V0ZSByZXN0b3JlIDwgc2F2ZWRfcm91dGVzCitcZW5ke3ZlcmJhdGltfQorCitcc3Vic2VjdGlvbnt7XHR0IGlwIHJvdXRlIGZsdXNofSAtLS0gZmx1c2ggcm91dGluZyB0YWJsZXN9CitcbGFiZWx7SVAtUk9VVEUtRkxVU0h9CisKK1xwYXJhZ3JhcGh7QWJicmV2aWF0aW9uczp9IFx2ZXJifGZsdXNofCwgXHZlcmJ8ZnwuCisKK1xwYXJhZ3JhcGh7RGVzY3JpcHRpb246fSB0aGlzIGNvbW1hbmQgZmx1c2hlcyByb3V0ZXMgc2VsZWN0ZWQKK2J5IHNvbWUgY3JpdGVyaWEuCisKK1xwYXJhZ3JhcGh7QXJndW1lbnRzOn0gdGhlIGFyZ3VtZW50cyBoYXZlIHRoZSBzYW1lIHN5bnRheCBhbmQgc2VtYW50aWNzCithcyB0aGUgYXJndW1lbnRzIG9mIFx2ZXJifGlwIHJvdXRlIHNob3d8LCBidXQgcm91dGluZyB0YWJsZXMgYXJlIG5vdAorbGlzdGVkIGJ1dCBwdXJnZWQuIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhlIGRlZmF1bHQgYWN0aW9uOiBcdmVyYnxzaG93fAorZHVtcHMgYWxsIHRoZSBJUCBtYWluIHJvdXRpbmcgdGFibGUgYnV0IFx2ZXJifGZsdXNofCBwcmludHMgdGhlIGhlbHBlciBwYWdlLgorVGhlIHJlYXNvbiBmb3IgdGhpcyBkaWZmZXJlbmNlIGRvZXMgbm90IHJlcXVpcmUgYW55IGV4cGxhbmF0aW9uLCBkb2VzIGl0PworCisKK1xwYXJhZ3JhcGh7U3RhdGlzdGljczp9IFdpdGggdGhlIFx2ZXJifC1zdGF0aXN0aWNzfCBvcHRpb24sIHRoZSBjb21tYW5kCitiZWNvbWVzIHZlcmJvc2UuIEl0IHByaW50cyBvdXQgdGhlIG51bWJlciBvZiBkZWxldGVkIHJvdXRlcyBhbmQgdGhlIG51bWJlcgorb2Ygcm91bmRzIG1hZGUgdG8gZmx1c2ggdGhlIHJvdXRpbmcgdGFibGUuIElmIHRoZSBvcHRpb24gaXMgZ2l2ZW4KK3R3aWNlLCBcdmVyYnxpcCByb3V0ZSBmbHVzaHwgYWxzbyBkdW1wcyBhbGwgdGhlIGRlbGV0ZWQgcm91dGVzCitpbiB0aGUgZm9ybWF0IGRlc2NyaWJlZCBpbiB0aGUgcHJldmlvdXMgc3Vic2VjdGlvbi4KKworXHBhcmFncmFwaHtFeGFtcGxlczp9IFRoZSBmaXJzdCBleGFtcGxlIGZsdXNoZXMgYWxsIHRoZQorZ2F0ZXdheWVkIHJvdXRlcyBmcm9tIHRoZSBtYWluIHRhYmxlIChmLmUuXCBhZnRlciBhIHJvdXRpbmcgZGFlbW9uIGNyYXNoKS4KK1xiZWdpbnt2ZXJiYXRpbX0KK25ldGFkbUBhbWJlcjp+ICMgaXAgLTQgcm8gZmx1c2ggc2NvcGUgZ2xvYmFsIHR5cGUgdW5pY2FzdAorXGVuZHt2ZXJiYXRpbX0KK1RoaXMgb3B0aW9uIGRlc2VydmVzIHRvIGJlIHB1dCBpbnRvIGEgc2NyaXB0bGV0IFx2ZXJifHJvdXRlZnwuCitcYmVnaW57TkJ9CitUaGlzIG9wdGlvbiB3YXMgZGVzY3JpYmVkIGluIHRoZSBcdmVyYnxyb3V0ZSg4KXwgbWFuIHBhZ2UgYm9ycm93ZWQKK2Zyb20gQlNELCBidXQgd2FzIG5ldmVyIGltcGxlbWVudGVkIGluIExpbnV4LgorXGVuZHtOQn0KKworVGhlIHNlY29uZCBleGFtcGxlIGZsdXNoZXMgYWxsIElQdjYgY2xvbmVkIHJvdXRlczoKK1xiZWdpbnt2ZXJiYXRpbX0KK25ldGFkbUBhbWJlcjp+ICMgaXAgLTYgLXMgLXMgcm8gZmx1c2ggY2FjaGUKKzNmZmU6MjQwMDo6MjIwOmFmZmY6ZmVmNDpjNWQxIHZpYSAzZmZlOjI0MDA6OjIyMDphZmZmOmZlZjQ6YzVkMSBcCisgIGRldiBldGgwICBtZXRyaWMgMCAKKyAgICBjYWNoZSAgdXNlZCAyIGFnZSAxMnNlYyBtdHUgMTUwMCBydHQgMzAwCiszZmZlOjI0MDA6OjI4MDphZGZmOmZlYjc6ODAzNCB2aWEgM2ZmZToyNDAwOjoyODA6YWRmZjpmZWI3OjgwMzQgXAorICBkZXYgZXRoMCAgbWV0cmljIDAgCisgICAgY2FjaGUgIHVzZWQgMiBhZ2UgMTVzZWMgbXR1IDE1MDAgcnR0IDMwMAorM2ZmZToyNDAwOjoyODA6YzhmZjpmZTU5OjViY2MgdmlhIDNmZmU6MjQwMDo6MjgwOmM4ZmY6ZmU1OTo1YmNjIFwKKyAgZGV2IGV0aDAgIG1ldHJpYyAwIAorICAgIGNhY2hlICB1c2VycyAxIHVzZWQgMSBhZ2UgMjNzZWMgbXR1IDE1MDAgcnR0IDMwMAorM2ZmZToyNDAwOjA6MToyYTA6Y2NmZjpmZTY2OjE4NzggdmlhIDNmZmU6MjQwMDowOjE6MmEwOmNjZmY6ZmU2NjoxODc4IFwKKyAgZGV2IGV0aDEgIG1ldHJpYyAwIAorICAgIGNhY2hlICB1c2VkIDIgYWdlIDIwc2VjIG10dSAxNTAwIHJ0dCAzMDAKKzNmZmU6MjQwMDowOjE6YTAwOjIwZmY6ZmU3MTpmYjMwIHZpYSAzZmZlOjI0MDA6MDoxOmEwMDoyMGZmOmZlNzE6ZmIzMCBcCisgIGRldiBldGgxICBtZXRyaWMgMCAKKyAgICBjYWNoZSAgdXNlZCAyIGFnZSAzM3NlYyBtdHUgMTUwMCBydHQgMzAwCitmZjAyOjoxIHZpYSBmZjAyOjoxIGRldiBldGgxICBtZXRyaWMgMCAKKyAgICBjYWNoZSAgdXNlcnMgMSB1c2VkIDEgYWdlIDQ1c2VjIG10dSAxNTAwIHJ0dCAzMDAKKworKioqIFJvdW5kIDEsIGRlbGV0aW5nIDYgZW50cmllcyAqKioKKyoqKiBGbHVzaCBpcyBjb21wbGV0ZSBhZnRlciAxIHJvdW5kICoqKgorbmV0YWRtQGFtYmVyOn4gIyBpcCAtNiAtcyAtcyBybyBmbHVzaCBjYWNoZQorTm90aGluZyB0byBmbHVzaC4KK25ldGFkbUBhbWJlcjp+ICMKK1xlbmR7dmVyYmF0aW19CisKK1RoZSB0aGlyZCBleGFtcGxlIGZsdXNoZXMgQkdQIHJvdXRpbmcgdGFibGVzIGFmdGVyIGEgXHZlcmJ8Z2F0ZWR8CitkZWF0aC4KK1xiZWdpbnt2ZXJiYXRpbX0KK25ldGFkbUBhbWJlcjp+ICMgaXAgcm8gbHMgcHJvdG8gZ2F0ZWQvYmdwIHwgd2MKKyAgIDE0MDggICAgOTg1NiAgICA3ODczMAorbmV0YWRtQGFtYmVyOn4gIyBpcCAtcyBybyBmIHByb3RvIGdhdGVkL2JncAorCisqKiogUm91bmQgMSwgZGVsZXRpbmcgMTQwOCBlbnRyaWVzICoqKgorKioqIEZsdXNoIGlzIGNvbXBsZXRlIGFmdGVyIDEgcm91bmQgKioqCituZXRhZG1AYW1iZXI6fiAjIGlwIHJvIGYgcHJvdG8gZ2F0ZWQvYmdwCitOb3RoaW5nIHRvIGZsdXNoLgorbmV0YWRtQGFtYmVyOn4gIyBpcCBybyBscyBwcm90byBnYXRlZC9iZ3AKK25ldGFkbUBhbWJlcjp+ICMKK1xlbmR7dmVyYmF0aW19CisKKworXHN1YnNlY3Rpb257e1x0dCBpcCByb3V0ZSBnZXR9IC0tLSBnZXQgYSBzaW5nbGUgcm91dGV9CitcbGFiZWx7SVAtUk9VVEUtR0VUfQorCitccGFyYWdyYXBoe0FiYnJldmlhdGlvbnM6fSBcdmVyYnxnZXR8LCBcdmVyYnxnfC4KKworXHBhcmFncmFwaHtEZXNjcmlwdGlvbjp9IHRoaXMgY29tbWFuZCBnZXRzIGEgc2luZ2xlIHJvdXRlIHRvIGEgZGVzdGluYXRpb24KK2FuZCBwcmludHMgaXRzIGNvbnRlbnRzIGV4YWN0bHkgYXMgdGhlIGtlcm5lbCBzZWVzIGl0LgorCitccGFyYWdyYXBoe0FyZ3VtZW50czp9IAorXGJlZ2lue2l0ZW1pemV9CitcaXRlbSBcdmVyYnx0byBBRERSRVNTfCAoZGVmYXVsdCkKKworLS0tIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzLgorCitcaXRlbSBcdmVyYnxmcm9tIEFERFJFU1N8CisKKy0tLSB0aGUgc291cmNlIGFkZHJlc3MuCisKK1xpdGVtIFx2ZXJifHRvcyBUT1N8IG9yIFx2ZXJifGRzZmllbGQgVE9TfAorCistLS0gdGhlIFR5cGUgT2YgU2VydmljZS4KKworXGl0ZW0gXHZlcmJ8aWlmIE5BTUV8CisKKy0tLSB0aGUgZGV2aWNlIGZyb20gd2hpY2ggdGhpcyBwYWNrZXQgaXMgZXhwZWN0ZWQgdG8gYXJyaXZlLgorCitcaXRlbSBcdmVyYnxvaWYgTkFNRXwKKworLS0tIGZvcmNlIHRoZSBvdXRwdXQgZGV2aWNlIG9uIHdoaWNoIHRoaXMgcGFja2V0IHdpbGwgYmUgcm91dGVkLgorCitcaXRlbSBcdmVyYnxjb25uZWN0ZWR8CisKKy0tLSBpZiBubyBzb3VyY2UgYWRkcmVzcyAob3B0aW9uIFx2ZXJifGZyb218KSB3YXMgZ2l2ZW4sIHJlbG9va3VwCit0aGUgcm91dGUgd2l0aCB0aGUgc291cmNlIHNldCB0byB0aGUgcHJlZmVycmVkIGFkZHJlc3MgcmVjZWl2ZWQgZnJvbSB0aGUgZmlyc3QgbG9va3VwLgorSWYgcG9saWN5IHJvdXRpbmcgaXMgdXNlZCwgaXQgbWF5IGJlIGEgZGlmZmVyZW50IHJvdXRlLgorCitcZW5ke2l0ZW1pemV9CisKK05vdGUgdGhhdCB0aGlzIG9wZXJhdGlvbiBpcyBub3QgZXF1aXZhbGVudCB0byBcdmVyYnxpcCByb3V0ZSBzaG93fC4KK1x2ZXJifHNob3d8IHNob3dzIGV4aXN0aW5nIHJvdXRlcy4gXHZlcmJ8Z2V0fCByZXNvbHZlcyB0aGVtIGFuZAorY3JlYXRlcyBuZXcgY2xvbmVzIGlmIG5lY2Vzc2FyeS4gRXNzZW50aWFsbHksIFx2ZXJifGdldHwKK2lzIGVxdWl2YWxlbnQgdG8gc2VuZGluZyBhIHBhY2tldCBhbG9uZyB0aGlzIHBhdGguCitJZiB0aGUgXHZlcmJ8aWlmfCBhcmd1bWVudCBpcyBub3QgZ2l2ZW4sIHRoZSBrZXJuZWwgY3JlYXRlcyBhIHJvdXRlCit0byBvdXRwdXQgcGFja2V0cyB0b3dhcmRzIHRoZSByZXF1ZXN0ZWQgZGVzdGluYXRpb24uCitUaGlzIGlzIGVxdWl2YWxlbnQgdG8gcGluZ2luZyB0aGUgZGVzdGluYXRpb24KK3dpdGggYSBzdWJzZXF1ZW50IHtcdHQgaXAgcm91dGUgbHMgY2FjaGV9LCBob3dldmVyLCBubyBwYWNrZXRzIGFyZQorYWN0dWFsbHkgc2VudC4gV2l0aCB0aGUgXHZlcmJ8aWlmfCBhcmd1bWVudCwgdGhlIGtlcm5lbCBwcmV0ZW5kcwordGhhdCBhIHBhY2tldCBhcnJpdmVkIGZyb20gdGhpcyBpbnRlcmZhY2UgYW5kIHNlYXJjaGVzIGZvcgorYSBwYXRoIHRvIGZvcndhcmQgdGhlIHBhY2tldC4KKworXHBhcmFncmFwaHtPdXRwdXQgZm9ybWF0On0gVGhpcyBjb21tYW5kIG91dHB1dHMgcm91dGVzIGluIHRoZSBzYW1lCitmb3JtYXQgYXMgXHZlcmJ8aXAgcm91dGUgbHN8LgorCitccGFyYWdyYXBoe0V4YW1wbGVzOn0gCitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIEZpbmQgYSByb3V0ZSB0byBvdXRwdXQgcGFja2V0cyB0byAxOTMuMjMzLjcuODI6CitcYmVnaW57dmVyYmF0aW19CitrdXpuZXRAYW1iZXI6fiAkIGlwIHJvdXRlIGdldCAxOTMuMjMzLjcuODIKKzE5My4yMzMuNy44MiBkZXYgZXRoMCAgc3JjIDE5My4yMzMuNy42NSByZWFsbXMgaW5yLmFjCisgICAgY2FjaGUgIG10dSAxNTAwIHJ0dCAzMDAKK2t1em5ldEBhbWJlcjp+ICQKK1xlbmR7dmVyYmF0aW19CisKK1xpdGVtIEZpbmQgYSByb3V0ZSB0byBmb3J3YXJkIHBhY2tldHMgYXJyaXZpbmcgb24gXHZlcmJ8ZXRoMHwKK2Zyb20gMTkzLjIzMy43LjgyIGFuZCBkZXN0aW5lZCBmb3IgMTkzLjIzMy43LjgyOgorXGJlZ2lue3ZlcmJhdGltfQora3V6bmV0QGFtYmVyOn4gJCBpcCByIGcgMTkzLjIzMy43LjgyIGZyb20gMTkzLjIzMy43LjgyIGlpZiBldGgwCisxOTMuMjMzLjcuODIgZnJvbSAxOTMuMjMzLjcuODIgZGV2IGV0aDAgIHNyYyAxOTMuMjMzLjcuNjUgXAorICByZWFsbXMgaW5yLmFjL2luci5hYyAKKyAgICBjYWNoZSA8c3JjLWRpcmVjdCxyZWRpcmVjdD4gIG10dSAxNTAwIHJ0dCAzMDAgaWlmIGV0aDAKK2t1em5ldEBhbWJlcjp+ICQKK1xlbmR7dmVyYmF0aW19CitcYmVnaW57TkJ9CisgIFxsYWJlbHtOQi1uYXR1cmUtb2Ytc3RyYW5nZW5lc3N9CisgIFRoaXMgaXMgdGhlIGNvbW1hbmQgdGhhdCBjcmVhdGVkIHRoZSBmdW5ueSByb3V0ZSBmcm9tIDE5My4yMzMuNy44MgorICBsb29wZWQgYmFjayB0byAxOTMuMjMzLjcuODIgKGNmLlwgTkIgb25+cC5ccGFnZXJlZntOQi1zdHJhbmdlLXJvdXRlfSkuCisgIE5vdGUgdGhlIFx2ZXJifHJlZGlyZWN0fCBmbGFnIG9uIGl0LgorXGVuZHtOQn0KKworXGl0ZW0gRmluZCBhIG11bHRpY2FzdCByb3V0ZSBmb3IgcGFja2V0cyBhcnJpdmluZyBvbiBcdmVyYnxldGgwfAorZnJvbSBob3N0IDE5My4yMzMuNy44MiBhbmQgZGVzdGluZWQgZm9yIG11bHRpY2FzdCBncm91cCAyMjQuMi4xMjcuMjU0CisoaXQgaXMgYXNzdW1lZCB0aGF0IGEgbXVsdGljYXN0IHJvdXRpbmcgZGFlbW9uIGlzIHJ1bm5pbmcuCitJbiB0aGlzIGNhc2UsIGl0IGlzIFx2ZXJifHBpbWR8KQorXGJlZ2lue3ZlcmJhdGltfQora3V6bmV0QGFtYmVyOn4gJCBpcCByIGcgMjI0LjIuMTI3LjI1NCBmcm9tIDE5My4yMzMuNy44MiBpaWYgZXRoMAorbXVsdGljYXN0IDIyNC4yLjEyNy4yNTQgZnJvbSAxOTMuMjMzLjcuODIgZGV2IGxvICBcCisgIHNyYyAxOTMuMjMzLjcuNjUgcmVhbG1zIGluci5hYy9jb3Ntb3MgCisgICAgY2FjaGUgPG1jPiBpaWYgZXRoMCBPaWZzOiBldGgxIHBpbXJlZwora3V6bmV0QGFtYmVyOn4gJAorXGVuZHt2ZXJiYXRpbX0KK1RoaXMgcm91dGUgZGlmZmVycyBmcm9tIHRoZSBvbmVzIHNlZW4gYmVmb3JlLiBJdCBjb250YWlucyBhIGBgbm9ybWFsJycgcGFydAorYW5kIGEgYGBtdWx0aWNhc3QnJyBwYXJ0LiBUaGUgbm9ybWFsIHBhcnQgaXMgdXNlZCB0byBkZWxpdmVyIChvciBub3QgdG8KK2RlbGl2ZXIpIHRoZSBwYWNrZXQgdG8gbG9jYWwgSVAgbGlzdGVuZXJzLiBJbiB0aGlzIGNhc2UgdGhlIHJvdXRlcgoraXMgbm90IGEgbWVtYmVyCitvZiB0aGlzIGdyb3VwLCBzbyB0aGF0IHJvdXRlIGhhcyBubyBcdmVyYnxsb2NhbHwgZmxhZyBhbmQgb25seQorZm9yd2FyZHMgcGFja2V0cy4gVGhlIG91dHB1dCBkZXZpY2UgZm9yIHN1Y2ggZW50cmllcyBpcyBhbHdheXMgbG9vcGJhY2suCitUaGUgbXVsdGljYXN0IHBhcnQgY29uc2lzdHMgb2YgYW4gYWRkaXRpb25hbCBcdmVyYnxPaWZzOnwgbGlzdCBzaG93aW5nCit0aGUgb3V0cHV0IGludGVyZmFjZXMuCitcZW5ke2l0ZW1pemV9CisKKworSXQgaXMgdGltZSBmb3IgYSBtb3JlIGNvbXBsaWNhdGVkIGV4YW1wbGUuIExldCB1cyBhZGQgYW4gaW52YWxpZAorZ2F0ZXdheWVkIHJvdXRlIGZvciBhIGRlc3RpbmF0aW9uIHdoaWNoIGlzIHJlYWxseSBkaXJlY3RseSBjb25uZWN0ZWQ6CitcYmVnaW57dmVyYmF0aW19CituZXRhZG1AYWxpc2E6fiAjIGlwIHJvdXRlIGFkZCAxOTMuMjMzLjcuOTggdmlhIDE5My4yMzMuNy4yNTQKK25ldGFkbUBhbGlzYTp+ICMgaXAgcm91dGUgZ2V0IDE5My4yMzMuNy45OAorMTkzLjIzMy43Ljk4IHZpYSAxOTMuMjMzLjcuMjU0IGRldiBldGgwICBzcmMgMTkzLjIzMy43LjkwCisgICAgY2FjaGUgIG10dSAxNTAwIHJ0dCAzMDcyCituZXRhZG1AYWxpc2E6fiAjCitcZW5ke3ZlcmJhdGltfQorYW5kIHByb2JlIGl0IHdpdGggcGluZzoKK1xiZWdpbnt2ZXJiYXRpbX0KK25ldGFkbUBhbGlzYTp+ICMgcGluZyAtbiAxOTMuMjMzLjcuOTgKK1BJTkcgMTkzLjIzMy43Ljk4ICgxOTMuMjMzLjcuOTgpIGZyb20gMTkzLjIzMy43LjkwIDogNTYgZGF0YSBieXRlcworRnJvbSAxOTMuMjMzLjcuMjU0OiBSZWRpcmVjdCBIb3N0KE5ldyBuZXh0aG9wOiAxOTMuMjMzLjcuOTgpCis2NCBieXRlcyBmcm9tIDE5My4yMzMuNy45ODogaWNtcF9zZXE9MCB0dGw9MjU1IHRpbWU9My41IG1zCitGcm9tIDE5My4yMzMuNy4yNTQ6IFJlZGlyZWN0IEhvc3QoTmV3IG5leHRob3A6IDE5My4yMzMuNy45OCkKKzY0IGJ5dGVzIGZyb20gMTkzLjIzMy43Ljk4OiBpY21wX3NlcT0xIHR0bD0yNTUgdGltZT0yLjIgbXMKKzY0IGJ5dGVzIGZyb20gMTkzLjIzMy43Ljk4OiBpY21wX3NlcT0yIHR0bD0yNTUgdGltZT0wLjQgbXMKKzY0IGJ5dGVzIGZyb20gMTkzLjIzMy43Ljk4OiBpY21wX3NlcT0zIHR0bD0yNTUgdGltZT0wLjQgbXMKKzY0IGJ5dGVzIGZyb20gMTkzLjIzMy43Ljk4OiBpY21wX3NlcT00IHR0bD0yNTUgdGltZT0wLjQgbXMKK15DCistLS0gMTkzLjIzMy43Ljk4IHBpbmcgc3RhdGlzdGljcyAtLS0KKzUgcGFja2V0cyB0cmFuc21pdHRlZCwgNSBwYWNrZXRzIHJlY2VpdmVkLCAwJSBwYWNrZXQgbG9zcworcm91bmQtdHJpcCBtaW4vYXZnL21heCA9IDAuNC8xLjMvMy41IG1zCituZXRhZG1AYWxpc2E6fiAjCitcZW5ke3ZlcmJhdGltfQorV2hhdCBoYXBwZW5lZD8gUm91dGVyIDE5My4yMzMuNy4yNTQgdW5kZXJzdG9vZCB0aGF0IHdlIGhhdmUgYSBtdWNoCitiZXR0ZXIgcGF0aCB0byB0aGUgZGVzdGluYXRpb24gYW5kIHNlbnQgdXMgYW4gSUNNUCByZWRpcmVjdCBtZXNzYWdlLgorV2UgbWF5IHJldHJ5IFx2ZXJifGlwIHJvdXRlIGdldHwgdG8gc2VlIHdoYXQgd2UgaGF2ZSBpbiB0aGUgcm91dGluZwordGFibGVzIG5vdzoKK1xiZWdpbnt2ZXJiYXRpbX0KK25ldGFkbUBhbGlzYTp+ICMgaXAgcm91dGUgZ2V0IDE5My4yMzMuNy45OAorMTkzLjIzMy43Ljk4IGRldiBldGgwICBzcmMgMTkzLjIzMy43LjkwIAorICAgIGNhY2hlIDxyZWRpcmVjdGVkPiAgbXR1IDE1MDAgcnR0IDMwNzIKK25ldGFkbUBhbGlzYTp+ICMKK1xlbmR7dmVyYmF0aW19CisKKworCitcc2VjdGlvbnt7XHR0IGlwIHJ1bGV9IC0tLSByb3V0aW5nIHBvbGljeSBkYXRhYmFzZSBtYW5hZ2VtZW50fQorXGxhYmVse0lQLVJVTEV9CisKK1xwYXJhZ3JhcGh7QWJicmV2aWF0aW9uczp9IFx2ZXJifHJ1bGV8LCBcdmVyYnxydXwuCisKK1xwYXJhZ3JhcGh7T2JqZWN0On0gXHZlcmJ8cnVsZXxzIGluIHRoZSByb3V0aW5nIHBvbGljeSBkYXRhYmFzZSBjb250cm9sCit0aGUgcm91dGUgc2VsZWN0aW9uIGFsZ29yaXRobS4KKworQ2xhc3NpYyByb3V0aW5nIGFsZ29yaXRobXMgdXNlZCBpbiB0aGUgSW50ZXJuZXQgbWFrZSByb3V0aW5nIGRlY2lzaW9ucworYmFzZWQgb25seSBvbiB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBvZiBwYWNrZXRzIChhbmQgaW4gdGhlb3J5LAorYnV0IG5vdCBpbiBwcmFjdGljZSwgb24gdGhlIFRPUyBmaWVsZCkuIFRoZSBzZW1pbmFsIHJldmlldyBvZiBjbGFzc2ljCityb3V0aW5nIGFsZ29yaXRobXMgYW5kIHRoZWlyIG1vZGlmaWNhdGlvbnMgY2FuIGJlIGZvdW5kIGluflxjaXRle1JGQzE4MTJ9LgorCitJbiBzb21lIGNpcmN1bXN0YW5jZXMgd2Ugd2FudCB0byByb3V0ZSBwYWNrZXRzIGRpZmZlcmVudGx5IGRlcGVuZGluZyBub3Qgb25seQorb24gZGVzdGluYXRpb24gYWRkcmVzc2VzLCBidXQgYWxzbyBvbiBvdGhlciBwYWNrZXQgZmllbGRzOiBzb3VyY2UgYWRkcmVzcywKK0lQIHByb3RvY29sLCB0cmFuc3BvcnQgcHJvdG9jb2wgcG9ydHMgb3IgZXZlbiBwYWNrZXQgcGF5bG9hZC4KK1RoaXMgdGFzayBpcyBjYWxsZWQgYGBwb2xpY3kgcm91dGluZycnLgorCitcYmVnaW57TkJ9CisgIGBgcG9saWN5IHJvdXRpbmcnJyAkXG5lcSQgYGByb3V0aW5nIHBvbGljeScnLgorCitcbm9pbmRlbnQJYGBwb2xpY3kgcm91dGluZycnICQ9JCBgYGN1bm5pbmcgcm91dGluZycnLgorCitcbm9pbmRlbnQJYGByb3V0aW5nIHBvbGljeScnICQ9JCBgYHJvdXRpbmcgdGFjdGljcycnIG9yIGBgcm91dGluZyBwbGFuJycuCitcZW5ke05CfQorCitUbyBzb2x2ZSB0aGlzIHRhc2ssIHRoZSBjb252ZW50aW9uYWwgZGVzdGluYXRpb24gYmFzZWQgcm91dGluZyB0YWJsZSwgb3JkZXJlZAorYWNjb3JkaW5nIHRvIHRoZSBsb25nZXN0IG1hdGNoIHJ1bGUsIGlzIHJlcGxhY2VkIHdpdGggYSBgYHJvdXRpbmcgcG9saWN5CitkYXRhYmFzZScnIChvciBSUERCKSwgd2hpY2ggc2VsZWN0cyByb3V0ZXMKK2J5IGV4ZWN1dGluZyBzb21lIHNldCBvZiBydWxlcy4gVGhlIHJ1bGVzIG1heSBoYXZlIGxvdHMgb2Yga2V5cyBvZiBkaWZmZXJlbnQKK25hdHVyZXMgYW5kIHRoZXJlZm9yZSB0aGV5IGhhdmUgbm8gbmF0dXJhbCBvcmRlcmluZywgYnV0IG9uZSBpbXBvc2VkCitieSB0aGUgYWRtaW5pc3RyYXRvci4gTGludXgtMi4yIFJQREIgaXMgYSBsaW5lYXIgbGlzdCBvZiBydWxlcworb3JkZXJlZCBieSBudW1lcmljIHByaW9yaXR5IHZhbHVlLgorUlBEQiBleHBsaWNpdGx5IGFsbG93cyBtYXRjaGluZyBhIGZldyBwYWNrZXQgZmllbGRzOgorCitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIHBhY2tldCBzb3VyY2UgYWRkcmVzcy4KK1xpdGVtIHBhY2tldCBkZXN0aW5hdGlvbiBhZGRyZXNzLgorXGl0ZW0gVE9TLgorXGl0ZW0gaW5jb21pbmcgaW50ZXJmYWNlICh3aGljaCBpcyBwYWNrZXQgbWV0YWRhdGEsIHJhdGhlciB0aGFuIGEgcGFja2V0IGZpZWxkKS4KK1xlbmR7aXRlbWl6ZX0KKworTWF0Y2hpbmcgSVAgcHJvdG9jb2xzIGFuZCB0cmFuc3BvcnQgcG9ydHMgaXMgYWxzbyBwb3NzaWJsZSwKK2luZGlyZWN0bHksIHZpYSBcdmVyYnxpcGNoYWluc3wsIGJ5IGV4cGxvaXRpbmcgdGhlaXIgYWJpbGl0eQordG8gbWFyayBzb21lIGNsYXNzZXMgb2YgcGFja2V0cyB3aXRoIFx2ZXJifGZ3bWFya3wuIFRoZXJlZm9yZSwKK1x2ZXJifGZ3bWFya3wgaXMgYWxzbyBpbmNsdWRlZCBpbiB0aGUgc2V0IG9mIGtleXMgY2hlY2tlZCBieSBydWxlcy4KKworRWFjaCBwb2xpY3kgcm91dGluZyBydWxlIGNvbnNpc3RzIG9mIGEge1xlbSBzZWxlY3RvclwvfSBhbmQgYW4ge1xlbSBhY3Rpb25cL30KK3ByZWRpY2F0ZS4gVGhlIFJQREIgaXMgc2Nhbm5lZCBpbiB0aGUgb3JkZXIgb2YgaW5jcmVhc2luZyBwcmlvcml0eS4gVGhlIHNlbGVjdG9yCitvZiBlYWNoIHJ1bGUgaXMgYXBwbGllZCB0byBce3NvdXJjZSBhZGRyZXNzLCBkZXN0aW5hdGlvbiBhZGRyZXNzLCBpbmNvbWluZworaW50ZXJmYWNlLCB0b3MsIGZ3bWFya1x9IGFuZCwgaWYgdGhlIHNlbGVjdG9yIG1hdGNoZXMgdGhlIHBhY2tldCwKK3RoZSBhY3Rpb24gaXMgcGVyZm9ybWVkLiAgVGhlIGFjdGlvbiBwcmVkaWNhdGUgbWF5IHJldHVybiB3aXRoIHN1Y2Nlc3MuCitJbiB0aGlzIGNhc2UsIGl0IHdpbGwgZWl0aGVyIGdpdmUgYSByb3V0ZSBvciBmYWlsdXJlIGluZGljYXRpb24KK2FuZCB0aGUgUlBEQiBsb29rdXAgaXMgdGVybWluYXRlZC4gT3RoZXJ3aXNlLCB0aGUgUlBEQiBwcm9ncmFtCitjb250aW51ZXMgb24gdGhlIG5leHQgcnVsZS4KKworV2hhdCBpcyB0aGUgYWN0aW9uLCBzZW1hbnRpY2FsbHk/IFRoZSBuYXR1cmFsIGFjdGlvbiBpcyB0byBzZWxlY3QgdGhlCituZXh0aG9wIGFuZCB0aGUgb3V0cHV0IGRldmljZS4gVGhpcyBpcyB3aGF0CitDaXNjbyBJT1N+XGNpdGV7SU9TfSBkb2VzLiBMZXQgdXMgY2FsbCBpdCBgYG1hdGNoIFwmIHNldCcnLgorVGhlIExpbnV4LTIuMiBhcHByb2FjaCBpcyBtb3JlIGZsZXhpYmxlLiBUaGUgYWN0aW9uIGluY2x1ZGVzCitsb29rdXBzIGluIGRlc3RpbmF0aW9uLWJhc2VkIHJvdXRpbmcgdGFibGVzIGFuZCBzZWxlY3RpbmcKK2Egcm91dGUgZnJvbSB0aGVzZSB0YWJsZXMgYWNjb3JkaW5nIHRvIHRoZSBjbGFzc2ljIGxvbmdlc3QgbWF0Y2ggYWxnb3JpdGhtLgorVGhlIGBgbWF0Y2ggXCYgc2V0JycgYXBwcm9hY2ggaXMgdGhlIHNpbXBsZXN0IGNhc2Ugb2YgdGhlIExpbnV4IG9uZS4gSXQgaXMgcmVhbGl6ZWQKK3doZW4gYSBzZWNvbmQgbGV2ZWwgcm91dGluZyB0YWJsZSBjb250YWlucyBhIHNpbmdsZSBkZWZhdWx0IHJvdXRlLgorUmVjYWxsIHRoYXQgTGludXgtMi4yIHN1cHBvcnRzIG11bHRpcGxlIHRhYmxlcworbWFuYWdlZCB3aXRoIHRoZSBcdmVyYnxpcCByb3V0ZXwgY29tbWFuZCwgZGVzY3JpYmVkIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLgorCitBdCBzdGFydHVwIHRpbWUgdGhlIGtlcm5lbCBjb25maWd1cmVzIHRoZSBkZWZhdWx0IFJQREIgY29uc2lzdGluZyBvZiB0aHJlZQorcnVsZXM6CisKK1xiZWdpbntlbnVtZXJhdGV9CitcaXRlbSBQcmlvcml0eTogMCwgU2VsZWN0b3I6IG1hdGNoIGFueXRoaW5nLCBBY3Rpb246IGxvb2t1cCByb3V0aW5nCit0YWJsZSBcdmVyYnxsb2NhbHwgKElEIDI1NSkuCitUaGUgXHZlcmJ8bG9jYWx8IHRhYmxlIGlzIGEgc3BlY2lhbCByb3V0aW5nIHRhYmxlIGNvbnRhaW5pbmcKK2hpZ2ggcHJpb3JpdHkgY29udHJvbCByb3V0ZXMgZm9yIGxvY2FsIGFuZCBicm9hZGNhc3QgYWRkcmVzc2VzLgorCitSdWxlIDAgaXMgc3BlY2lhbC4gSXQgY2Fubm90IGJlIGRlbGV0ZWQgb3Igb3ZlcnJpZGRlbi4KKworCitcaXRlbSBQcmlvcml0eTogMzI3NjYsIFNlbGVjdG9yOiBtYXRjaCBhbnl0aGluZywgQWN0aW9uOiBsb29rdXAgcm91dGluZwordGFibGUgXHZlcmJ8bWFpbnwgKElEIDI1NCkuCitUaGUgXHZlcmJ8bWFpbnwgdGFibGUgaXMgdGhlIG5vcm1hbCByb3V0aW5nIHRhYmxlIGNvbnRhaW5pbmcgYWxsIG5vbi1wb2xpY3kKK3JvdXRlcy4gVGhpcyBydWxlIG1heSBiZSBkZWxldGVkIGFuZC9vciBvdmVycmlkZGVuIHdpdGggb3RoZXIKK29uZXMgYnkgdGhlIGFkbWluaXN0cmF0b3IuCisKK1xpdGVtIFByaW9yaXR5OiAzMjc2NywgU2VsZWN0b3I6IG1hdGNoIGFueXRoaW5nLCBBY3Rpb246IGxvb2t1cCByb3V0aW5nCit0YWJsZSBcdmVyYnxkZWZhdWx0fCAoSUQgMjUzKS4KK1RoZSBcdmVyYnxkZWZhdWx0fCB0YWJsZSBpcyBlbXB0eS4gSXQgaXMgcmVzZXJ2ZWQgZm9yIHNvbWUKK3Bvc3QtcHJvY2Vzc2luZyBpZiBubyBwcmV2aW91cyBkZWZhdWx0IHJ1bGVzIHNlbGVjdGVkIHRoZSBwYWNrZXQuCitUaGlzIHJ1bGUgbWF5IGFsc28gYmUgZGVsZXRlZC4KKworXGVuZHtlbnVtZXJhdGV9CisKK0RvIG5vdCBjb25mdXNlIHJvdXRpbmcgdGFibGVzIHdpdGggcnVsZXM6IHJ1bGVzIHBvaW50IHRvIHJvdXRpbmcgdGFibGVzLAorc2V2ZXJhbCBydWxlcyBtYXkgcmVmZXIgdG8gb25lIHJvdXRpbmcgdGFibGUgYW5kIHNvbWUgcm91dGluZyB0YWJsZXMKK21heSBoYXZlIG5vIHJ1bGVzIHBvaW50aW5nIHRvIHRoZW0uIElmIHRoZSBhZG1pbmlzdHJhdG9yIGRlbGV0ZXMgYWxsIHRoZSBydWxlcworcmVmZXJyaW5nIHRvIGEgdGFibGUsIHRoZSB0YWJsZSBpcyBub3QgdXNlZCwgYnV0IGl0IHN0aWxsIGV4aXN0cworYW5kIHdpbGwgZGlzYXBwZWFyIG9ubHkgYWZ0ZXIgYWxsIHRoZSByb3V0ZXMgY29udGFpbmVkIGluIGl0IGFyZSBkZWxldGVkLgorCisKK1xwYXJhZ3JhcGh7UnVsZSBhdHRyaWJ1dGVzOn0gRWFjaCBSUERCIGVudHJ5IGhhcyBhZGRpdGlvbmFsCithdHRyaWJ1dGVzLiBGLmUuXCBlYWNoIHJ1bGUgaGFzIGEgcG9pbnRlciB0byBzb21lIHJvdXRpbmcKK3RhYmxlLiBOQVQgYW5kIG1hc3F1ZXJhZGluZyBydWxlcyBoYXZlIGFuIGF0dHJpYnV0ZSB0byBzZWxlY3QgbmV3IElQCithZGRyZXNzIHRvIHRyYW5zbGF0ZS9tYXNxdWVyYWRlLiBCZXNpZGVzIHRoYXQsIHJ1bGVzIGhhdmUgc29tZQorb3B0aW9uYWwgYXR0cmlidXRlcywgd2hpY2ggcm91dGVzIGhhdmUsIG5hbWVseSBcdmVyYnxyZWFsbXN8LgorVGhlc2UgdmFsdWVzIGRvIG5vdCBvdmVycmlkZSB0aG9zZSBjb250YWluZWQgaW4gdGhlIHJvdXRpbmcgdGFibGVzLiBUaGV5CithcmUgb25seSB1c2VkIGlmIHRoZSByb3V0ZSBkaWQgbm90IHNlbGVjdCBhbnkgYXR0cmlidXRlcy4KKworCitccGFyYWdyYXBoe1J1bGUgdHlwZXM6fSBUaGUgUlBEQiBtYXkgY29udGFpbiBydWxlcyBvZiB0aGUgZm9sbG93aW5nCit0eXBlczoKK1xiZWdpbntpdGVtaXplfQorXGl0ZW0gXHZlcmJ8dW5pY2FzdHwgLS0tIHRoZSBydWxlIHByZXNjcmliZXMgdG8gcmV0dXJuIHRoZSByb3V0ZSBmb3VuZAoraW4gdGhlIHJvdXRpbmcgdGFibGUgcmVmZXJlbmNlZCBieSB0aGUgcnVsZS4KK1xpdGVtIFx2ZXJifGJsYWNraG9sZXwgLS0tIHRoZSBydWxlIHByZXNjcmliZXMgdG8gc2lsZW50bHkgZHJvcCB0aGUgcGFja2V0LgorXGl0ZW0gXHZlcmJ8dW5yZWFjaGFibGV8IC0tLSB0aGUgcnVsZSBwcmVzY3JpYmVzIHRvIGdlbmVyYXRlIGEgYGBOZXR3b3JrCitpcyB1bnJlYWNoYWJsZScnIGVycm9yLgorXGl0ZW0gXHZlcmJ8cHJvaGliaXR8IC0tLSB0aGUgcnVsZSBwcmVzY3JpYmVzIHRvIGdlbmVyYXRlCitgYENvbW11bmljYXRpb24gaXMgYWRtaW5pc3RyYXRpdmVseSBwcm9oaWJpdGVkJycgZXJyb3IuCitcaXRlbSBcdmVyYnxuYXR8IC0tLSB0aGUgcnVsZSBwcmVzY3JpYmVzIHRvIHRyYW5zbGF0ZSB0aGUgc291cmNlIGFkZHJlc3MKK29mIHRoZSBJUCBwYWNrZXQgaW50byBzb21lIG90aGVyIHZhbHVlLiBNb3JlIGFib3V0IE5BVCBpcworaW4gQXBwZW5kaXh+XHJlZntST1VURS1OQVR9LCBwLlxwYWdlcmVme1JPVVRFLU5BVH0uCitcZW5ke2l0ZW1pemV9CisKKworXHBhcmFncmFwaHtDb21tYW5kczp9IFx2ZXJifGFkZHwsIFx2ZXJifGRlbGV0ZXwgYW5kIFx2ZXJifHNob3d8Cisob3IgXHZlcmJ8bGlzdHwpLgorCitcc3Vic2VjdGlvbnt7XHR0IGlwIHJ1bGUgYWRkfSAtLS0gaW5zZXJ0IGEgbmV3IHJ1bGVcXAorCXtcdHQgaXAgcnVsZSBkZWxldGV9IC0tLSBkZWxldGUgYSBydWxlfQorXGxhYmVse0lQLVJVTEUtQUREfQorCitccGFyYWdyYXBoe0FiYnJldmlhdGlvbnM6fSBcdmVyYnxhZGR8LCBcdmVyYnxhfDsgXHZlcmJ8ZGVsZXRlfCwgXHZlcmJ8ZGVsfCwKKwlcdmVyYnxkfC4KKworXHBhcmFncmFwaHtBcmd1bWVudHM6fQorCitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIFx2ZXJifHR5cGUgVFlQRXwgKGRlZmF1bHQpCisKKy0tLSB0aGUgdHlwZSBvZiB0aGlzIHJ1bGUuIFRoZSBsaXN0IG9mIHZhbGlkIHR5cGVzIHdhcyBnaXZlbiBpbiB0aGUgcHJldmlvdXMKK3N1YnNlY3Rpb24uCisKK1xpdGVtIFx2ZXJifGZyb20gUFJFRklYfAorCistLS0gc2VsZWN0IHRoZSBzb3VyY2UgcHJlZml4IHRvIG1hdGNoLgorCitcaXRlbSBcdmVyYnx0byBQUkVGSVh8CisKKy0tLSBzZWxlY3QgdGhlIGRlc3RpbmF0aW9uIHByZWZpeCB0byBtYXRjaC4KKworXGl0ZW0gXHZlcmJ8aWlmIE5BTUV8CisKKy0tLSBzZWxlY3QgdGhlIGluY29taW5nIGRldmljZSB0byBtYXRjaC4gSWYgdGhlIGludGVyZmFjZSBpcyBsb29wYmFjaywKK3RoZSBydWxlIG9ubHkgbWF0Y2hlcyBwYWNrZXRzIG9yaWdpbmF0aW5nIGZyb20gdGhpcyBob3N0LiBUaGlzIG1lYW5zIHRoYXQgeW91CittYXkgY3JlYXRlIHNlcGFyYXRlIHJvdXRpbmcgdGFibGVzIGZvciBmb3J3YXJkZWQgYW5kIGxvY2FsIHBhY2tldHMgYW5kLAoraGVuY2UsIGNvbXBsZXRlbHkgc2VncmVnYXRlIHRoZW0uCisKK1xpdGVtIFx2ZXJifHRvcyBUT1N8IG9yIFx2ZXJifGRzZmllbGQgVE9TfAorCistLS0gc2VsZWN0IHRoZSBUT1MgdmFsdWUgdG8gbWF0Y2guCisKK1xpdGVtIFx2ZXJifGZ3bWFyayBNQVJLfAorCistLS0gc2VsZWN0IHRoZSBcdmVyYnxmd21hcmt8IHZhbHVlIHRvIG1hdGNoLgorCitcaXRlbSBcdmVyYnxwcmlvcml0eSBQUkVGRVJFTkNFfAorCistLS0gdGhlIHByaW9yaXR5IG9mIHRoaXMgcnVsZS4gRWFjaCBydWxlIHNob3VsZCBoYXZlIGFuIGV4cGxpY2l0bHkKK3NldCB7XGVtIHVuaXF1ZVwvfSBwcmlvcml0eSB2YWx1ZS4KK1xiZWdpbntOQn0KKyAgUmVhbGx5LCBmb3IgaGlzdG9yaWNhbCByZWFzb25zIFx2ZXJifGlwIHJ1bGUgYWRkfCBkb2VzIG5vdCByZXF1aXJlIGEKKyAgcHJpb3JpdHkgdmFsdWUgYW5kIGFsbG93cyB0aGVtIHRvIGJlIG5vbi11bmlxdWUuCisgIElmIHRoZSB1c2VyIGRvZXMgbm90IHN1cHBsaWVkIGEgcHJpb3JpdHksIGl0IGlzIHNlbGVjdGVkIGJ5IHRoZSBrZXJuZWwuCisgIElmIHRoZSB1c2VyIGNyZWF0ZXMgYSBydWxlIHdpdGggYSBwcmlvcml0eSB2YWx1ZSB0aGF0CisgIGFscmVhZHkgZXhpc3RzLCB0aGUga2VybmVsIGRvZXMgbm90IHJlamVjdCB0aGUgcmVxdWVzdC4gSXQgYWRkcworICB0aGUgbmV3IHJ1bGUgYmVmb3JlIGFsbCBvbGQgcnVsZXMgb2YgdGhlIHNhbWUgcHJpb3JpdHkuCisKKyAgSXQgaXMgbWlzdGFrZSBpbiBkZXNpZ24sIG5vIG1vcmUuIEFuZCBpdCB3aWxsIGJlIGZpeGVkIG9uZSBkYXksCisgIHNvIGRvIG5vdCByZWx5IG9uIHRoaXMgZmVhdHVyZS4gVXNlIGV4cGxpY2l0IHByaW9yaXRpZXMuCitcZW5ke05CfQorCisKK1xpdGVtIFx2ZXJifHRhYmxlIFRBQkxFSUR8CisKKy0tLSB0aGUgcm91dGluZyB0YWJsZSBpZGVudGlmaWVyIHRvIGxvb2t1cCBpZiB0aGUgcnVsZSBzZWxlY3RvciBtYXRjaGVzLgorCitcaXRlbSBcdmVyYnxyZWFsbXMgRlJPTS9UT3wKKworLS0tIFJlYWxtcyB0byBzZWxlY3QgaWYgdGhlIHJ1bGUgbWF0Y2hlZCBhbmQgdGhlIHJvdXRpbmcgdGFibGUgbG9va3VwCitzdWNjZWVkZWQuIFJlYWxtIFx2ZXJifFRPfCBpcyBvbmx5IHVzZWQgaWYgdGhlIHJvdXRlIGRpZCBub3Qgc2VsZWN0CithbnkgcmVhbG0uCisKK1xpdGVtIFx2ZXJifG5hdCBBRERSRVNTfAorCistLS0gVGhlIGJhc2Ugb2YgdGhlIElQIGFkZHJlc3MgYmxvY2sgdG8gdHJhbnNsYXRlIChmb3Igc291cmNlIGFkZHJlc3NlcykuCitUaGUgXHZlcmJ8QUREUkVTU3wgbWF5IGJlIGVpdGhlciB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIG9mIE5BVCBhZGRyZXNzZXMKKyhzZWxlY3RlZCBieSBOQVQgcm91dGVzKSBvciBpbiBsaW51eC0yLjIgYSBsb2NhbCBob3N0IGFkZHJlc3MgKG9yIGV2ZW4gemVybykuCitJbiB0aGUgbGFzdCBjYXNlIHRoZSByb3V0ZXIgZG9lcyBub3QgdHJhbnNsYXRlIHRoZSBwYWNrZXRzLAorYnV0IG1hc3F1ZXJhZGVzIHRoZW0gdG8gdGhpcyBhZGRyZXNzOyB0aGlzIGZlYXR1cmUgZGlzYXBwZXJlZCBpbiAyLjQuCitNb3JlIGFib3V0IE5BVCBpcyBpbiBBcHBlbmRpeH5ccmVme1JPVVRFLU5BVH0sCitwLlxwYWdlcmVme1JPVVRFLU5BVH0uCisKK1xlbmR7aXRlbWl6ZX0KKworXHBhcmFncmFwaHtXYXJuaW5nOn0gQ2hhbmdlcyB0byB0aGUgUlBEQiBtYWRlIHdpdGggdGhlc2UgY29tbWFuZHMKK2RvIG5vdCBiZWNvbWUgYWN0aXZlIGltbWVkaWF0ZWx5LiBJdCBpcyBhc3N1bWVkIHRoYXQgYWZ0ZXIKK2Egc2NyaXB0IGZpbmlzaGVzIGEgYmF0Y2ggb2YgdXBkYXRlcywgaXQgZmx1c2hlcyB0aGUgcm91dGluZyBjYWNoZQord2l0aCBcdmVyYnxpcCByb3V0ZSBmbHVzaCBjYWNoZXwuCisKK1xwYXJhZ3JhcGh7RXhhbXBsZXM6fQorXGJlZ2lue2l0ZW1pemV9CitcaXRlbSBSb3V0ZSBwYWNrZXRzIHdpdGggc291cmNlIGFkZHJlc3NlcyBmcm9tIDE5Mi4yMDMuODAvMjQKK2FjY29yZGluZyB0byByb3V0aW5nIHRhYmxlIFx2ZXJifGluci5ydWhlcHw6CitcYmVnaW57dmVyYmF0aW19CitpcCBydSBhZGQgZnJvbSAxOTIuMjAzLjgwLjAvMjQgdGFibGUgaW5yLnJ1aGVwIHByaW8gMjIwCitcZW5ke3ZlcmJhdGltfQorCitcaXRlbSBUcmFuc2xhdGUgcGFja2V0IHNvdXJjZSBhZGRyZXNzIDE5My4yMzMuNy44MyBpbnRvIDE5Mi4yMDMuODAuMTQ0CithbmQgcm91dGUgaXQgYWNjb3JkaW5nIHRvIHRhYmxlIFwjMSAoYWN0dWFsbHksIGl0IGlzIFx2ZXJifGluci5ydWhlcHwpOgorXGJlZ2lue3ZlcmJhdGltfQoraXAgcnUgYWRkIGZyb20gMTkzLjIzMy43LjgzIG5hdCAxOTIuMjAzLjgwLjE0NCB0YWJsZSAxIHByaW8gMzIwCitcZW5ke3ZlcmJhdGltfQorCitcaXRlbSBEZWxldGUgdGhlIHVudXNlZCBkZWZhdWx0IHJ1bGU6CitcYmVnaW57dmVyYmF0aW19CitpcCBydSBkZWwgcHJpbyAzMjc2NworXGVuZHt2ZXJiYXRpbX0KKworXGVuZHtpdGVtaXplfQorCisKKworXHN1YnNlY3Rpb257e1x0dCBpcCBydWxlIHNob3d9IC0tLSBsaXN0IHJ1bGVzfQorXGxhYmVse0lQLVJVTEUtU0hPV30KKworXHBhcmFncmFwaHtBYmJyZXZpYXRpb25zOn0gXHZlcmJ8c2hvd3wsIFx2ZXJifGxpc3R8LCBcdmVyYnxzaHwsIFx2ZXJifGxzfCwgXHZlcmJ8bHwuCisKKworXHBhcmFncmFwaHtBcmd1bWVudHM6fSBHb29kIG5ld3MsIHRoaXMgaXMgb25lIGNvbW1hbmQgdGhhdCBoYXMgbm8gYXJndW1lbnRzLgorCitccGFyYWdyYXBoe091dHB1dCBmb3JtYXQ6fQorCitcYmVnaW57dmVyYmF0aW19CitrdXpuZXRAYW1iZXI6fiAkIGlwIHJ1IGxzCiswOglmcm9tIGFsbCBsb29rdXAgbG9jYWwgCisyMDA6CWZyb20gMTkyLjIwMy44MC4wLzI0IHRvIDE5My4yMzMuNy4wLzI0IGxvb2t1cCBtYWluCisyMTA6CWZyb20gMTkyLjIwMy44MC4wLzI0IHRvIDE5Mi4yMDMuODAuMC8yNCBsb29rdXAgbWFpbgorMjIwOglmcm9tIDE5Mi4yMDMuODAuMC8yNCBsb29rdXAgaW5yLnJ1aGVwIHJlYWxtcyBpbnIucnVoZXAvcmFkaW8tbXN1CiszMDA6CWZyb20gMTkzLjIzMy43LjgzIHRvIDE5My4yMzMuNy4wLzI0IGxvb2t1cCBtYWluCiszMTA6CWZyb20gMTkzLjIzMy43LjgzIHRvIDE5Mi4yMDMuODAuMC8yNCBsb29rdXAgbWFpbgorMzIwOglmcm9tIDE5My4yMzMuNy44MyBsb29rdXAgaW5yLnJ1aGVwIG1hcC10byAxOTIuMjAzLjgwLjE0NAorMzI3NjY6CWZyb20gYWxsIGxvb2t1cCBtYWluIAora3V6bmV0QGFtYmVyOn4gJAorXGVuZHt2ZXJiYXRpbX0KKworSW4gdGhlIGZpcnN0IGNvbHVtbiBpcyB0aGUgcnVsZSBwcmlvcml0eSB2YWx1ZSBmb2xsb3dlZAorYnkgYSBjb2xvbi4gVGhlbiB0aGUgc2VsZWN0b3JzIGZvbGxvdy4gRWFjaCBrZXkgaXMgcHJlZml4ZWQKK3dpdGggdGhlIHNhbWUga2V5d29yZCB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgcnVsZS4KKworVGhlIGtleXdvcmQgXHZlcmJ8bG9va3VwfCBpcyBmb2xsb3dlZCBieSBhIHJvdXRpbmcgdGFibGUgaWRlbnRpZmllciwKK2FzIGl0IGlzIHJlY29yZGVkIGluIHRoZSBmaWxlIFx2ZXJifC9ldGMvaXByb3V0ZTIvcnRfdGFibGVzfC4KKworSWYgdGhlIHJ1bGUgZG9lcyBOQVQgKGYuZS5cIHJ1bGUgXCMzMjApLCBpdCBpcyBzaG93biBieSB0aGUga2V5d29yZAorXHZlcmJ8bWFwLXRvfCBmb2xsb3dlZCBieSB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIG9mIGFkZHJlc3NlcyB0byBtYXAuCisKK1RoZSBzZW5zZSBvZiB0aGlzIGV4YW1wbGUgaXMgcHJldHR5IHNpbXBsZS4gVGhlIHByZWZpeGVzCisxOTIuMjAzLjgwLjAvMjQgYW5kIDE5My4yMzMuNy4wLzI0IGZvcm0gdGhlIGludGVybmFsIG5ldHdvcmssIGJ1dAordGhleSBhcmUgcm91dGVkIGRpZmZlcmVudGx5IHdoZW4gdGhlIHBhY2tldHMgbGVhdmUgaXQuCitCZXNpZGVzIHRoYXQsIHRoZSBob3N0IDE5My4yMzMuNy44MyBpcyB0cmFuc2xhdGVkIGludG8KK2Fub3RoZXIgcHJlZml4IHRvIGxvb2sgbGlrZSAxOTIuMjAzLjgwLjE0NCB3aGVuIHRhbGtpbmcKK3RvIHRoZSBvdXRlciB3b3JsZC4KKworXHN1YnNlY3Rpb257e1x0dCBpcCBydWxlIHNhdmV9IC0tIHNhdmUgcnVsZXMgdGFibGVzfQorXGxhYmVse0lQLVJVTEUtU0FWRX0KKworXHBhcmFncmFwaHtEZXNjcmlwdGlvbjp9IHRoaXMgY29tbWFuZCBzYXZlcyB0aGUgY29udGVudHMgb2YgdGhlIHJ1bGVzCit0YWJsZXMgb3IgdGhlIHJ1bGUocykgc2VsZWN0ZWQgYnkgc29tZSBjcml0ZXJpYSB0byBzdGFuZGFyZCBvdXRwdXQuCisKK1xwYXJhZ3JhcGh7QXJndW1lbnRzOn0gXHZlcmJ8aXAgcnVsZSBzYXZlfCBoYXMgdGhlIHNhbWUgYXJndW1lbnRzIGFzCitcdmVyYnxpcCBydWxlIHNob3d8LgorCitccGFyYWdyYXBoe0V4YW1wbGU6fSBUaGlzIHNhdmVzIGFsbCB0aGUgcnVsZXMgdG8gdGhlIHtcdHQgc2F2ZWRcX3J1bGVzfQorZmlsZToKK1xiZWdpbnt2ZXJiYXRpbX0KK2RhbkBjYWZmZWluZTp+ICMgaXAgcnVsZSBzYXZlID4gc2F2ZWRfcnVsZXMKK1xlbmR7dmVyYmF0aW19CisKK1xwYXJhZ3JhcGh7T3V0cHV0IGZvcm1hdDp9IFRoZSBmb3JtYXQgb2YgdGhlIGRhdGEgc3RyZWFtIHByb3ZpZGVkIGJ5CitcdmVyYnxpcCBydWxlIHNhdmV8IGlzIHRoYXQgb2YgXHZlcmJ8cnRuZXRsaW5rfC4gIFNlZQorXHZlcmJ8cnRuZXRsaW5rKDcpfCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworXHN1YnNlY3Rpb257e1x0dCBpcCBydWxlIHJlc3RvcmV9IC0tIHJlc3RvcmUgcnVsZXMgdGFibGVzfQorXGxhYmVse0lQLVJVTEUtUkVTVE9SRX0KKworXHBhcmFncmFwaHtEZXNjcmlwdGlvbjp9IHRoaXMgY29tbWFuZCByZXN0b3JlcyB0aGUgY29udGVudHMgb2YgdGhlIHJ1bGVzCit0YWJsZXMgYWNjb3JkaW5nIHRvIGEgZGF0YSBzdHJlYW0gYXMgcHJvdmlkZWQgYnkgXHZlcmJ8aXAgcnVsZSBzYXZlfCB2aWEKK3N0YW5kYXJkIGlucHV0LiAgTm90ZSB0aGF0IGFueSBydWxlcyBhbHJlYWR5IGluIHRoZSB0YWJsZSBhcmUgbGVmdCB1bmNoYW5nZWQsCithbmQgZHVwbGljYXRlcyBhcmUgbm90IGlnbm9yZWQuCisKK1xwYXJhZ3JhcGh7QXJndW1lbnRzOn0gVGhpcyBjb21tYW5kIHRha2VzIG5vIGFyZ3VtZW50cy4KKworXHBhcmFncmFwaHtFeGFtcGxlOn0gVGhpcyByZXN0b3JlcyBhbGwgcnVsZXMgdGhhdCB3ZXJlIHNhdmVkIHRvIHRoZQore1x0dCBzYXZlZFxfcnVsZXN9IGZpbGU6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2RhbkBjYWZmZWluZTp+ICMgaXAgcnVsZSByZXN0b3JlIDwgc2F2ZWRfcnVsZXMKK1xlbmR7dmVyYmF0aW19CisKKworCitcc2VjdGlvbnt7XHR0IGlwIG1hZGRyZXNzfSAtLS0gbXVsdGljYXN0IGFkZHJlc3NlcyBtYW5hZ2VtZW50fQorXGxhYmVse0lQLU1BRERSfQorCitccGFyYWdyYXBoe09iamVjdDp9IFx2ZXJifG1hZGRyZXNzfCBvYmplY3RzIGFyZSBtdWx0aWNhc3QgYWRkcmVzc2VzLgorCitccGFyYWdyYXBoe0NvbW1hbmRzOn0gXHZlcmJ8YWRkfCwgXHZlcmJ8ZGVsZXRlfCwgXHZlcmJ8c2hvd3wgKG9yIFx2ZXJifGxpc3R8KS4KKworXHN1YnNlY3Rpb257e1x0dCBpcCBtYWRkcmVzcyBzaG93fSAtLS0gbGlzdCBtdWx0aWNhc3QgYWRkcmVzc2VzfQorCitccGFyYWdyYXBoe0FiYnJldmlhdGlvbnM6fSBcdmVyYnxzaG93fCwgXHZlcmJ8bGlzdHwsIFx2ZXJifHNofCwgXHZlcmJ8bHN8LCBcdmVyYnxsfC4KKworXHBhcmFncmFwaHtBcmd1bWVudHM6fQorCitcYmVnaW57aXRlbWl6ZX0KKworXGl0ZW0gXHZlcmJ8ZGV2IE5BTUV8IChkZWZhdWx0KQorCistLS0gdGhlIGRldmljZSBuYW1lLgorCitcZW5ke2l0ZW1pemV9CisKK1xwYXJhZ3JhcGh7T3V0cHV0IGZvcm1hdDp9CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2t1em5ldEBhbGlzYTp+ICQgaXAgbWFkZHIgbHMgZHVtbXkKKzI6ICBkdW1teQorICAgIGxpbmsgIDMzOjMzOjAwOjAwOjAwOjAxCisgICAgbGluayAgMDE6MDA6NWU6MDA6MDA6MDEKKyAgICBpbmV0ICAyMjQuMC4wLjEgdXNlcnMgMgorICAgIGluZXQ2IGZmMDI6OjEKK2t1em5ldEBhbGlzYTp+ICQgCitcZW5ke3ZlcmJhdGltfQorCitUaGUgZmlyc3QgbGluZSBvZiB0aGUgb3V0cHV0IHNob3dzIHRoZSBpbnRlcmZhY2UgaW5kZXggYW5kIGl0cyBuYW1lLgorVGhlbiB0aGUgbXVsdGljYXN0IGFkZHJlc3MgbGlzdCBmb2xsb3dzLiBFYWNoIGxpbmUgc3RhcnRzIHdpdGggdGhlCitwcm90b2NvbCBpZGVudGlmaWVyLiBUaGUgd29yZCBcdmVyYnxsaW5rfCBkZW5vdGVzIGEgbGluayBsYXllcgorbXVsdGljYXN0IGFkZHJlc3Nlcy4KKworSWYgYSBtdWx0aWNhc3QgYWRkcmVzcyBoYXMgbW9yZSB0aGFuIG9uZSB1c2VyLCB0aGUgbnVtYmVyCitvZiB1c2VycyBpcyBzaG93biBhZnRlciB0aGUgXHZlcmJ8dXNlcnN8IGtleXdvcmQuCisKK09uZSBhZGRpdGlvbmFsIGZlYXR1cmUgbm90IHByZXNlbnQgaW4gdGhlIGV4YW1wbGUgYWJvdmUKK2lzIHRoZSBcdmVyYnxzdGF0aWN8IGZsYWcsIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBhZGRyZXNzIHdhcyBqb2luZWQKK3dpdGggXHZlcmJ8aXAgbWFkZHIgYWRkfC4gU2VlIHRoZSBmb2xsb3dpbmcgc3Vic2VjdGlvbi4KKworCisKK1xzdWJzZWN0aW9ue3tcdHQgaXAgbWFkZHJlc3MgYWRkfSAtLS0gYWRkIGEgbXVsdGljYXN0IGFkZHJlc3NcXAorCSAgICB7XHR0IGlwIG1hZGRyZXNzIGRlbGV0ZX0gLS0tIGRlbGV0ZSBhIG11bHRpY2FzdCBhZGRyZXNzfQorCitccGFyYWdyYXBoe0FiYnJldmlhdGlvbnM6fSBcdmVyYnxhZGR8LCBcdmVyYnxhfDsgXHZlcmJ8ZGVsZXRlfCwgXHZlcmJ8ZGVsfCwgXHZlcmJ8ZHwuCisKK1xwYXJhZ3JhcGh7RGVzY3JpcHRpb246fSB0aGVzZSBjb21tYW5kcyBhdHRhY2gvZGV0YWNoCithIHN0YXRpYyBsaW5rIGxheWVyIG11bHRpY2FzdCBhZGRyZXNzIHRvIGxpc3RlbiBvbiB0aGUgaW50ZXJmYWNlLgorTm90ZSB0aGF0IGl0IGlzIGltcG9zc2libGUgdG8gam9pbiBwcm90b2NvbCBtdWx0aWNhc3QgZ3JvdXBzCitzdGF0aWNhbGx5LiBUaGlzIGNvbW1hbmQgb25seSBtYW5hZ2VzIGxpbmsgbGF5ZXIgYWRkcmVzc2VzLgorCisKK1xwYXJhZ3JhcGh7QXJndW1lbnRzOn0KKworXGJlZ2lue2l0ZW1pemV9CitcaXRlbSBcdmVyYnxhZGRyZXNzIExMQUREUkVTU3wgKGRlZmF1bHQpCisKKy0tLSB0aGUgbGluayBsYXllciBtdWx0aWNhc3QgYWRkcmVzcy4KKworXGl0ZW0gXHZlcmJ8ZGV2IE5BTUV8CisKKy0tLSB0aGUgZGV2aWNlIHRvIGpvaW4vbGVhdmUgdGhpcyBtdWx0aWNhc3QgYWRkcmVzcy4KKworXGVuZHtpdGVtaXplfQorCisKK1xwYXJhZ3JhcGh7RXhhbXBsZTp9IExldCB1cyBjb250aW51ZSB3aXRoIHRoZSBleGFtcGxlIGZyb20gdGhlIHByZXZpb3VzIHN1YnNlY3Rpb24uCisKK1xiZWdpbnt2ZXJiYXRpbX0KK25ldGFkbUBhbGlzYTp+ICMgaXAgbWFkZHIgYWRkIDMzOjMzOjAwOjAwOjAwOjAxIGRldiBkdW1teQorbmV0YWRtQGFsaXNhOn4gIyBpcCAtMCBtYWRkciBscyBkdW1teQorMjogIGR1bW15CisgICAgbGluayAgMzM6MzM6MDA6MDA6MDA6MDEgdXNlcnMgMiBzdGF0aWMKKyAgICBsaW5rICAwMTowMDo1ZTowMDowMDowMQorbmV0YWRtQGFsaXNhOn4gIyBpcCBtYWRkciBkZWwgMzM6MzM6MDA6MDA6MDA6MDEgZGV2IGR1bW15CitcZW5ke3ZlcmJhdGltfQorCitcYmVnaW57TkJ9CisgTmVpdGhlciBcdmVyYnxpcHwgbm9yIHRoZSBrZXJuZWwgY2hlY2sgZm9yIG11bHRpY2FzdCBhZGRyZXNzIHZhbGlkaXR5LgorIFBhcnRpY3VsYXJseSwgdGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gdHJ5IHRvIGxvYWQgYSB1bmljYXN0IGFkZHJlc3MKKyBpbnN0ZWFkIG9mIGEgbXVsdGljYXN0IGFkZHJlc3MuIE1vc3QgZHJpdmVycyB3aWxsIGlnbm9yZSBzdWNoIGFkZHJlc3NlcywKKyBidXQgc2V2ZXJhbCAoZi5lLlwgVHVsaXApIHdpbGwgaW50ZXJuIGl0IHRvIHRoZWlyIG9uLWJvYXJkIGZpbHRlci4KKyBUaGUgZWZmZWN0cyBtYXkgYmUgc3RyYW5nZS4gTmFtZWx5LCB0aGUgYWRkcmVzc2VzIGJlY29tZSBhZGRpdGlvbmFsCisgbG9jYWwgbGluayBhZGRyZXNzZXMgYW5kLCBpZiB5b3UgbG9hZGVkIHRoZSBhZGRyZXNzIG9mIGFub3RoZXIgaG9zdAorIHRvIHRoZSByb3V0ZXIsIHdhaXQgZm9yIGR1cGxpY2F0ZWQgcGFja2V0cyBvbiB0aGUgd2lyZS4KKyBJdCBpcyBub3QgYSBidWcsIGJ1dCByYXRoZXIgYSBob2xlIGluIHRoZSBBUEkgYW5kIGludHJhLWtlcm5lbCBpbnRlcmZhY2VzLgorIFRoaXMgZmVhdHVyZSBpcyByZWFsbHkgbW9yZSB1c2VmdWwgZm9yIHRyYWZmaWMgbW9uaXRvcmluZywgYnV0IHVzaW5nIGl0Cisgd2l0aCBMaW51eC0yLjIgeW91IHtcZW0gaGF2ZSB0b1wvfSBiZSBzdXJlIHRoYXQgdGhlIGhvc3QgaXMgbm90CisgYSByb3V0ZXIgYW5kLCBlc3BlY2lhbGx5LCB0aGF0IGl0IGlzIG5vdCBhIHRyYW5zcGFyZW50IHByb3h5IG9yIG1hc3F1ZXJhZGluZworIGFnZW50LgorXGVuZHtOQn0KKworCisKK1xzZWN0aW9ue3tcdHQgaXAgbXJvdXRlfSAtLS0gbXVsdGljYXN0IHJvdXRpbmcgY2FjaGUgbWFuYWdlbWVudH0KK1xsYWJlbHtJUC1NUk9VVEV9CisKK1xwYXJhZ3JhcGh7QWJicmV2aWF0aW9uczp9IFx2ZXJifG1yb3V0ZXwsIFx2ZXJifG1yfC4KKworXHBhcmFncmFwaHtPYmplY3Q6fSBcdmVyYnxtcm91dGV8IG9iamVjdHMgYXJlIG11bHRpY2FzdCByb3V0aW5nIGNhY2hlCitlbnRyaWVzIGNyZWF0ZWQgYnkgYSB1c2VyIGxldmVsIG1yb3V0aW5nIGRhZW1vbgorKGYuZS5cIFx2ZXJifHBpbWR8IG9yIFx2ZXJifG1yb3V0ZWR8KS4KKworRHVlIHRvIHRoZSBsaW1pdGF0aW9ucyBvZiB0aGUgY3VycmVudCBpbnRlcmZhY2UgdG8gdGhlIG11bHRpY2FzdCByb3V0aW5nCitlbmdpbmUsIGl0IGlzIGltcG9zc2libGUgdG8gY2hhbmdlIFx2ZXJifG1yb3V0ZXwgb2JqZWN0cyBhZG1pbmlzdHJhdGl2ZWx5LAorc28gd2UgbWF5IG9ubHkgZGlzcGxheSB0aGVtLiBUaGlzIGxpbWl0YXRpb24gd2lsbCBiZSByZW1vdmVkCitpbiB0aGUgZnV0dXJlLgorCitccGFyYWdyYXBoe0NvbW1hbmRzOn0gXHZlcmJ8c2hvd3wgKG9yIFx2ZXJifGxpc3R8KS4KKworCitcc3Vic2VjdGlvbnt7XHR0IGlwIG1yb3V0ZSBzaG93fSAtLS0gbGlzdCBtcm91dGUgY2FjaGUgZW50cmllc30KKworXHBhcmFncmFwaHtBYmJyZXZpYXRpb25zOn0gXHZlcmJ8c2hvd3wsIFx2ZXJifGxpc3R8LCBcdmVyYnxzaHwsIFx2ZXJifGxzfCwgXHZlcmJ8bHwuCisKK1xwYXJhZ3JhcGh7QXJndW1lbnRzOn0KKworXGJlZ2lue2l0ZW1pemV9CitcaXRlbSBcdmVyYnx0byBQUkVGSVh8IChkZWZhdWx0KQorCistLS0gdGhlIHByZWZpeCBzZWxlY3RpbmcgdGhlIGRlc3RpbmF0aW9uIG11bHRpY2FzdCBhZGRyZXNzZXMgdG8gbGlzdC4KKworCitcaXRlbSBcdmVyYnxpaWYgTkFNRXwKKworLS0tIHRoZSBpbnRlcmZhY2Ugb24gd2hpY2ggbXVsdGljYXN0IHBhY2tldHMgYXJlIHJlY2VpdmVkLgorCisKK1xpdGVtIFx2ZXJifGZyb20gUFJFRklYfAorCistLS0gdGhlIHByZWZpeCBzZWxlY3RpbmcgdGhlIElQIHNvdXJjZSBhZGRyZXNzZXMgb2YgdGhlIG11bHRpY2FzdCByb3V0ZS4KKworCitcZW5ke2l0ZW1pemV9CisKK1xwYXJhZ3JhcGh7T3V0cHV0IGZvcm1hdDp9CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2t1em5ldEBhbWJlcjp+ICQgaXAgbXJvdXRlIGxzCisoMTkzLjIzMi4xMjcuNiwgMjI0LjAuMS4zOSkgICAgICBJaWY6IHVucmVzb2x2ZWQgCisoMTkzLjIzMi4yNDQuMzQsIDIyNC4wLjEuNDApICAgICBJaWY6IHVucmVzb2x2ZWQgCisoMTkzLjIzMy43LjY1LCAyMjQuNjYuNjYuNjYpICAgICBJaWY6IGV0aDAgICAgICAgT2lmczogcGltcmVnIAora3V6bmV0QGFtYmVyOn4gJCAKK1xlbmR7dmVyYmF0aW19CisKK0VhY2ggbGluZSBzaG93cyBvbmUgKFMsRykgZW50cnkgaW4gdGhlIG11bHRpY2FzdCByb3V0aW5nIGNhY2hlLAord2hlcmUgUyBpcyB0aGUgc291cmNlIGFkZHJlc3MgYW5kIEcgaXMgdGhlIG11bHRpY2FzdCBncm91cC4gXHZlcmJ8SWlmfCBpcwordGhlIGludGVyZmFjZSBvbiB3aGljaCBtdWx0aWNhc3QgcGFja2V0cyBhcmUgZXhwZWN0ZWQgdG8gYXJyaXZlLgorSWYgdGhlIHdvcmQgXHZlcmJ8dW5yZXNvbHZlZHwgaXMgdGhlcmUgaW5zdGVhZCBvZiB0aGUgaW50ZXJmYWNlIG5hbWUsCitpdCBtZWFucyB0aGF0IHRoZSByb3V0aW5nIGRhZW1vbiBzdGlsbCBoYXNuJ3QgcmVzb2x2ZWQgdGhpcyBlbnRyeS4KK1RoZSBrZXl3b3JkIFx2ZXJifG9pZnN8IGlzIGZvbGxvd2VkIGJ5IGEgbGlzdCBvZiBvdXRwdXQgaW50ZXJmYWNlcywgc2VwYXJhdGVkCitieSBzcGFjZXMuIElmIGEgbXVsdGljYXN0IHJvdXRpbmcgZW50cnkgaXMgY3JlYXRlZCB3aXRoIG5vbi10cml2aWFsCitUVEwgc2NvcGUsIGFkbWluaXN0cmF0aXZlIGRpc3RhbmNlcyBhcmUgYXBwZW5kZWQgdG8gdGhlIGRldmljZSBuYW1lcworaW4gdGhlIFx2ZXJifG9pZnN8IGxpc3QuCisKK1xwYXJhZ3JhcGh7U3RhdGlzdGljczp9IFRoZSBcdmVyYnwtc3RhdGlzdGljc3wgb3B0aW9uIGFsc28gcHJpbnRzIHRoZQorbnVtYmVyIG9mIHBhY2tldHMgYW5kIGJ5dGVzIGZvcndhcmRlZCBhbG9uZyB0aGlzIHJvdXRlIGFuZAordGhlIG51bWJlciBvZiBwYWNrZXRzIHRoYXQgYXJyaXZlZCBvbiB0aGUgd3JvbmcgaW50ZXJmYWNlLCBpZiB0aGlzIG51bWJlciBpcyBub3QgemVyby4KKworXGJlZ2lue3ZlcmJhdGltfQora3V6bmV0QGFtYmVyOn4gJCBpcCAtcyBtciBscyAyMjQuNjYvMTYKKygxOTMuMjMzLjcuNjUsIDIyNC42Ni42Ni42NikgICAgIElpZjogZXRoMCAgICAgICBPaWZzOiBwaW1yZWcgCisgIDkzODMgcGFja2V0cywgMzAwMjU2IGJ5dGVzCitrdXpuZXRAYW1iZXI6fiAkCitcZW5ke3ZlcmJhdGltfQorCisKK1xzZWN0aW9ue3tcdHQgaXAgdHVubmVsfSAtLS0gdHVubmVsIGNvbmZpZ3VyYXRpb259CitcbGFiZWx7SVAtVFVOTkVMfQorCitccGFyYWdyYXBoe0FiYnJldmlhdGlvbnM6fSBcdmVyYnx0dW5uZWx8LCBcdmVyYnx0dW5sfC4KKworXHBhcmFncmFwaHtPYmplY3Q6fSBcdmVyYnx0dW5uZWx8IG9iamVjdHMgYXJlIHR1bm5lbHMsIGVuY2Fwc3VsYXRpbmcKK3BhY2tldHMgaW4gSVB2NCBwYWNrZXRzIGFuZCB0aGVuIHNlbmRpbmcgdGhlbSBvdmVyIHRoZSBJUCBpbmZyYXN0cnVjdHVyZS4KKworXHBhcmFncmFwaHtDb21tYW5kczp9IFx2ZXJifGFkZHwsIFx2ZXJifGRlbGV0ZXwsIFx2ZXJifGNoYW5nZXwsIFx2ZXJifHNob3d8Cisob3IgXHZlcmJ8bGlzdHwpLgorCitccGFyYWdyYXBoe1NlZSBhbHNvOn0gQSBtb3JlIGluZm9ybWFsIGRpc2N1c3Npb24gb2YgdHVubmVsaW5nCitvdmVyIElQIGFuZCB0aGUgXHZlcmJ8aXAgdHVubmVsfCBjb21tYW5kIGNhbiBiZSBmb3VuZCBpbn5cY2l0ZXtJUC1UVU5ORUxTfS4KKworXHN1YnNlY3Rpb257e1x0dCBpcCB0dW5uZWwgYWRkfSAtLS0gYWRkIGEgbmV3IHR1bm5lbFxcCisJe1x0dCBpcCB0dW5uZWwgY2hhbmdlfSAtLS0gY2hhbmdlIGFuIGV4aXN0aW5nIHR1bm5lbFxcCisJe1x0dCBpcCB0dW5uZWwgZGVsZXRlfSAtLS0gZGVzdHJveSBhIHR1bm5lbH0KKworXHBhcmFncmFwaHtBYmJyZXZpYXRpb25zOn0gXHZlcmJ8YWRkfCwgXHZlcmJ8YXw7IFx2ZXJifGNoYW5nZXwsIFx2ZXJifGNoZ3w7CitcdmVyYnxkZWxldGV8LCBcdmVyYnxkZWx8LCBcdmVyYnxkfC4KKworCitccGFyYWdyYXBoe0FyZ3VtZW50czp9CisKK1xiZWdpbntpdGVtaXplfQorCitcaXRlbSBcdmVyYnxuYW1lIE5BTUV8IChkZWZhdWx0KQorCistLS0gc2VsZWN0IHRoZSB0dW5uZWwgZGV2aWNlIG5hbWUuCisKK1xpdGVtIFx2ZXJifG1vZGUgTU9ERXwKKworLS0tIHNldCB0aGUgdHVubmVsIG1vZGUuIFRocmVlIG1vZGVzIGFyZSBjdXJyZW50bHkgYXZhaWxhYmxlOgorCVx2ZXJifGlwaXB8LCBcdmVyYnxzaXR8IGFuZCBcdmVyYnxncmV8LgorCitcaXRlbSBcdmVyYnxyZW1vdGUgQUREUkVTU3wKKworLS0tIHNldCB0aGUgcmVtb3RlIGVuZHBvaW50IG9mIHRoZSB0dW5uZWwuCisKK1xpdGVtIFx2ZXJifGxvY2FsIEFERFJFU1N8CisKKy0tLSBzZXQgdGhlIGZpeGVkIGxvY2FsIGFkZHJlc3MgZm9yIHR1bm5lbGVkIHBhY2tldHMuCitJdCBtdXN0IGJlIGFuIGFkZHJlc3Mgb24gYW5vdGhlciBpbnRlcmZhY2Ugb2YgdGhpcyBob3N0LgorCitcaXRlbSBcdmVyYnx0dGwgTnwKKworLS0tIHNldCBhIGZpeGVkIFRUTCBcdmVyYnxOfCBvbiB0dW5uZWxlZCBwYWNrZXRzLgorCVx2ZXJifE58IGlzIGEgbnVtYmVyIGluIHRoZSByYW5nZSAxLS0yNTUuIDAgaXMgYSBzcGVjaWFsIHZhbHVlCisJbWVhbmluZyB0aGF0IHBhY2tldHMgaW5oZXJpdCB0aGUgVFRMIHZhbHVlLiAKKwkJVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFx2ZXJifGluaGVyaXR8LgorCitcaXRlbSBcdmVyYnx0b3MgVHwgb3IgXHZlcmJ8ZHNmaWVsZCBUfAorCistLS0gc2V0IGEgZml4ZWQgVE9TIFx2ZXJifFR8IG9uIHR1bm5lbGVkIHBhY2tldHMuCisJCVRoZSBkZWZhdWx0IHZhbHVlIGlzOiBcdmVyYnxpbmhlcml0fC4KKworCisKK1xpdGVtIFx2ZXJifGRldiBOQU1FfCAKKworLS0tIGJpbmQgdGhlIHR1bm5lbCB0byB0aGUgZGV2aWNlIFx2ZXJifE5BTUV8IHNvIHRoYXQKKwl0dW5uZWxlZCBwYWNrZXRzIHdpbGwgb25seSBiZSByb3V0ZWQgdmlhIHRoaXMgZGV2aWNlIGFuZCB3aWxsCisJbm90IGJlIGFibGUgdG8gZXNjYXBlIHRvIGFub3RoZXIgZGV2aWNlIHdoZW4gdGhlIHJvdXRlIHRvIGVuZHBvaW50IGNoYW5nZXMuCisKK1xpdGVtIFx2ZXJifG5vcG10dWRpc2N8CisKKy0tLSBkaXNhYmxlIFBhdGggTVRVIERpc2NvdmVyeSBvbiB0aGlzIHR1bm5lbC4KKwlJdCBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuIE5vdGUgdGhhdCBhIGZpeGVkIHR0bCBpcyBpbmNvbXBhdGlibGUKKwl3aXRoIHRoaXMgb3B0aW9uOiB0dW5uZWxsaW5nIHdpdGggYSBmaXhlZCB0dGwgYWx3YXlzIG1ha2VzIHBtdHUgZGlzY292ZXJ5LgorCitcaXRlbSBcdmVyYnxrZXkgS3wsIFx2ZXJifGlrZXkgS3wsIFx2ZXJifG9rZXkgS3wKKworLS0tIChvbmx5IEdSRSB0dW5uZWxzKSB1c2Uga2V5ZWQgR1JFIHdpdGgga2V5IFx2ZXJifEt8LiBcdmVyYnxLfCBpcworCWVpdGhlciBhIG51bWJlciBvciBhbiBJUCBhZGRyZXNzLWxpa2UgZG90dGVkIHF1YWQuCisgICBUaGUgXHZlcmJ8a2V5fCBwYXJhbWV0ZXIgc2V0cyB0aGUga2V5IHRvIHVzZSBpbiBib3RoIGRpcmVjdGlvbnMuCisgICBUaGUgXHZlcmJ8aWtleXwgYW5kIFx2ZXJifG9rZXl8IHBhcmFtZXRlcnMgc2V0IGRpZmZlcmVudCBrZXlzIGZvciBpbnB1dCBhbmQgb3V0cHV0LgorICAgCisKK1xpdGVtIFx2ZXJifGNzdW18LCBcdmVyYnxpY3N1bXwsIFx2ZXJifG9jc3VtfAorCistLS0gKG9ubHkgR1JFIHR1bm5lbHMpIGdlbmVyYXRlL3JlcXVpcmUgY2hlY2tzdW1zIGZvciB0dW5uZWxlZCBwYWNrZXRzLgorICAgVGhlIFx2ZXJifG9jc3VtfCBmbGFnIGNhbGN1bGF0ZXMgY2hlY2tzdW1zIGZvciBvdXRnb2luZyBwYWNrZXRzLgorICAgVGhlIFx2ZXJifGljc3VtfCBmbGFnIHJlcXVpcmVzIHRoYXQgYWxsIGlucHV0IHBhY2tldHMgaGF2ZSB0aGUgY29ycmVjdAorICAgY2hlY2tzdW0uIFRoZSBcdmVyYnxjc3VtfCBmbGFnIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGNvbWJpbmF0aW9uCisgIGBgXHZlcmJ8aWNzdW18IFx2ZXJifG9jc3VtfCcnLgorCitcaXRlbSBcdmVyYnxzZXF8LCBcdmVyYnxpc2VxfCwgXHZlcmJ8b3NlcXwKKworLS0tIChvbmx5IEdSRSB0dW5uZWxzKSBzZXJpYWxpemUgcGFja2V0cy4KKyAgIFRoZSBcdmVyYnxvc2VxfCBmbGFnIGVuYWJsZXMgc2VxdWVuY2luZyBvZiBvdXRnb2luZyBwYWNrZXRzLgorICAgVGhlIFx2ZXJifGlzZXF8IGZsYWcgcmVxdWlyZXMgdGhhdCBhbGwgaW5wdXQgcGFja2V0cyBhcmUgc2VyaWFsaXplZC4KKyAgIFRoZSBcdmVyYnxzZXF8IGZsYWcgaXMgZXF1aXZhbGVudCB0byB0aGUgY29tYmluYXRpb24gYGBcdmVyYnxpc2VxfCBcdmVyYnxvc2VxfCcnLgorCitcYmVnaW57TkJ9CisgSSB0aGluayB0aGlzIG9wdGlvbiBkb2VzIG5vdAorCXdvcmsuIEF0IGxlYXN0LCBJIGRpZCBub3QgdGVzdCBpdCwgZGlkIG5vdCBkZWJ1ZyBpdCBhbmQKKwlkbyBub3QgZXZlbiB1bmRlcnN0YW5kIGhvdyBpdCBpcyBzdXBwb3NlZCB0byB3b3JrIG9yIGZvciB3aGF0CisJcHVycG9zZSBDaXNjbyBwbGFubmVkIHRvIHVzZSBpdC4gRG8gbm90IHVzZSBpdC4KK1xlbmR7TkJ9CisKKworXGVuZHtpdGVtaXplfQorCitccGFyYWdyYXBoe0V4YW1wbGU6fSBDcmVhdGUgYSBwb2ludG9wb2ludCBJUHY2IHR1bm5lbCB3aXRoIG1heGltYWwgVFRMIG9mIDMyLgorXGJlZ2lue3ZlcmJhdGltfQorbmV0YWRtQGFtYmVyOn4gIyBpcCB0dW5sIGFkZCBDaXNjbyBtb2RlIHNpdCByZW1vdGUgMTkyLjMxLjcuMTA0IFwKKyAgICBsb2NhbCAxOTIuMjAzLjgwLjE0MiB0dGwgMzIgCitcZW5ke3ZlcmJhdGltfQorCitcc3Vic2VjdGlvbnt7XHR0IGlwIHR1bm5lbCBzaG93fSAtLS0gbGlzdCB0dW5uZWxzfQorCitccGFyYWdyYXBoe0FiYnJldmlhdGlvbnM6fSBcdmVyYnxzaG93fCwgXHZlcmJ8bGlzdHwsIFx2ZXJifHNofCwgXHZlcmJ8bHN8LCBcdmVyYnxsfC4KKworCitccGFyYWdyYXBoe0FyZ3VtZW50czp9IE5vbmUuCisKK1xwYXJhZ3JhcGh7T3V0cHV0IGZvcm1hdDp9CitcYmVnaW57dmVyYmF0aW19CitrdXpuZXRAYW1iZXI6fiAkIGlwIHR1bmwgbHMgQ2lzY28KK0Npc2NvOiBpcHY2L2lwICByZW1vdGUgMTkyLjMxLjcuMTA0ICBsb2NhbCAxOTIuMjAzLjgwLjE0MiAgdHRsIDMyIAora3V6bmV0QGFtYmVyOn4gJCAKK1xlbmR7dmVyYmF0aW19CitUaGUgbGluZSBzdGFydHMgd2l0aCB0aGUgdHVubmVsIGRldmljZSBuYW1lIGZvbGxvd2VkIGJ5IGEgY29sb24uCitUaGVuIHRoZSB0dW5uZWwgbW9kZSBmb2xsb3dzLiBUaGUgcGFyYW1ldGVycyBvZiB0aGUgdHVubmVsIGFyZSBsaXN0ZWQKK3dpdGggdGhlIHNhbWUga2V5d29yZHMgdGhhdCB3ZXJlIHVzZWQgd2hlbiBjcmVhdGluZyB0aGUgdHVubmVsLgorCitccGFyYWdyYXBoe1N0YXRpc3RpY3M6fQorCitcYmVnaW57dmVyYmF0aW19CitrdXpuZXRAYW1iZXI6fiAkIGlwIC1zIHR1bmwgbHMgQ2lzY28KK0Npc2NvOiBpcHY2L2lwICByZW1vdGUgMTkyLjMxLjcuMTA0ICBsb2NhbCAxOTIuMjAzLjgwLjE0MiAgdHRsIDMyIAorUlg6IFBhY2tldHMgICAgQnl0ZXMgICAgICAgIEVycm9ycyBDc3VtRXJycyBPdXRPZlNlcSBNY2FzdHMKKyAgICAxMjU2NiAgICAgIDE3MDc1MTYgICAgICAwICAgICAgMCAgICAgICAgMCAgICAgICAgMCAgICAgICAKK1RYOiBQYWNrZXRzICAgIEJ5dGVzICAgICAgICBFcnJvcnMgRGVhZExvb3AgTm9Sb3V0ZSAgTm9CdWZzCisgICAgMTM0NDUgICAgICAxODc5Njc3ICAgICAgMCAgICAgIDAgICAgICAgIDAgICAgICAgIDAgICAgIAora3V6bmV0QGFtYmVyOn4gJCAKK1xlbmR7dmVyYmF0aW19CitFc3NlbnRpYWxseSwgdGhlc2UgbnVtYmVycyBhcmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlcnMKK3ByaW50ZWQgd2l0aCB7XHR0IGlwIC1zIGxpbmsgc2hvd30KKyhzZWMuXHJlZntJUC1MSU5LLVNIT1d9LCBwLlxwYWdlcmVme0lQLUxJTkstU0hPV30pIGJ1dCB0aGUgdGFncyBhcmUgZGlmZmVyZW50Cit0byByZWZsZWN0IHRoYXQgdGhleSBhcmUgdHVubmVsIHNwZWNpZmljLgorXGJlZ2lue2l0ZW1pemV9CitcaXRlbSBcdmVyYnxDc3VtRXJyc3wgLS0tIHRoZSB0b3RhbCBudW1iZXIgb2YgcGFja2V0cyBkcm9wcGVkCitiZWNhdXNlIG9mIGNoZWNrc3VtIGZhaWx1cmVzIGZvciBhIEdSRSB0dW5uZWwgd2l0aCBjaGVja3N1bW1pbmcgZW5hYmxlZC4KK1xpdGVtIFx2ZXJifE91dE9mU2VxfCAtLS0gdGhlIHRvdGFsIG51bWJlciBvZiBwYWNrZXRzIGRyb3BwZWQKK2JlY2F1c2UgdGhleSBhcnJpdmVkIG91dCBvZiBzZXF1ZW5jZSBmb3IgYSBHUkUgdHVubmVsIHdpdGgKK3NlcmlhbGl6YXRpb24gZW5hYmxlZC4KK1xpdGVtIFx2ZXJifE1jYXN0c3wgLS0tIHRoZSB0b3RhbCBudW1iZXIgb2YgbXVsdGljYXN0IHBhY2tldHMKK3JlY2VpdmVkIG9uIGEgYnJvYWRjYXN0IEdSRSB0dW5uZWwuCitcaXRlbSBcdmVyYnxEZWFkTG9vcHwgLS0tIHRoZSB0b3RhbCBudW1iZXIgb2YgcGFja2V0cyB3aGljaCB3ZXJlIG5vdAordHJhbnNtaXR0ZWQgYmVjYXVzZSB0aGUgdHVubmVsIGlzIGxvb3BlZCBiYWNrIHRvIGl0c2VsZi4KK1xpdGVtIFx2ZXJifE5vUm91dGV8IC0tLSB0aGUgdG90YWwgbnVtYmVyIG9mIHBhY2tldHMgd2hpY2ggd2VyZSBub3QKK3RyYW5zbWl0dGVkIGJlY2F1c2UgdGhlcmUgaXMgbm8gSVAgcm91dGUgdG8gdGhlIHJlbW90ZSBlbmRwb2ludC4KK1xpdGVtIFx2ZXJifE5vQnVmc3wgLS0tIHRoZSB0b3RhbCBudW1iZXIgb2YgcGFja2V0cyB3aGljaCB3ZXJlIG5vdAordHJhbnNtaXR0ZWQgYmVjYXVzZSB0aGUga2VybmVsIGZhaWxlZCB0byBhbGxvY2F0ZSBhIGJ1ZmZlci4KK1xlbmR7aXRlbWl6ZX0KKworCitcc2VjdGlvbnt7XHR0IGlwIG1vbml0b3J9IGFuZCB7XHR0IHJ0bW9ufSAtLS0gc3RhdGUgbW9uaXRvcmluZ30KK1xsYWJlbHtJUC1NT05JVE9SfQorCitUaGUgXHZlcmJ8aXB8IHV0aWxpdHkgY2FuIG1vbml0b3IgdGhlIHN0YXRlIG9mIGRldmljZXMsIGFkZHJlc3NlcworYW5kIHJvdXRlcyBjb250aW51b3VzbHkuIFRoaXMgb3B0aW9uIGhhcyBhIHNsaWdodGx5IGRpZmZlcmVudCBmb3JtYXQuCitOYW1lbHksCit0aGUgXHZlcmJ8bW9uaXRvcnwgY29tbWFuZCBpcyB0aGUgZmlyc3QgaW4gdGhlIGNvbW1hbmQgbGluZSBhbmQgdGhlbgordGhlIG9iamVjdCBsaXN0IGZvbGxvd3M6CitcYmVnaW57dmVyYmF0aW19CisgIGlwIG1vbml0b3IgWyBmaWxlIEZJTEUgXSBbIGFsbCB8IE9CSkVDVC1MSVNUIF0gWyBsYWJlbCBdCitcZW5ke3ZlcmJhdGltfQorXHZlcmJ8T0JKRUNULUxJU1R8IGlzIHRoZSBsaXN0IG9mIG9iamVjdCB0eXBlcyB0aGF0IHdlIHdhbnQgdG8KK21vbml0b3IuICBJdCBtYXkgY29udGFpbiBcdmVyYnxsaW5rfCwgXHZlcmJ8YWRkcmVzc3wgYW5kIFx2ZXJifHJvdXRlfC4KK1NwZWNpZnlpbmcgXHZlcmJ8bGFiZWx8IGluZGljYXRlcyB0aGF0IG91dHB1dCBsaW5lcyBzaG91bGQgYmUgbGFiZWxsZWQKK3dpdGggdGhlIHR5cGUgb2Ygb2JqZWN0IGJlaW5nIHByaW50ZWQgLS0tIHRoaXMgaGFwcGVucyBieSBkZWZhdWx0IGlmCitcdmVyYnxhbGx8IGlzIHNwZWNpZmllZC4gIElmIG5vIFx2ZXJifGZpbGV8IGFyZ3VtZW50IGlzIGdpdmVuLAorXHZlcmJ8aXB8IG9wZW5zIFJUTkVUTElOSywgbGlzdGVucyBvbiBpdCBhbmQgZHVtcHMgc3RhdGUgY2hhbmdlcyBpbgordGhlIGZvcm1hdCBkZXNjcmliZWQgaW4gcHJldmlvdXMgc2VjdGlvbnMuCisKK0lmIGEgZmlsZSBuYW1lIGlzIGdpdmVuLCBpdCBkb2VzIG5vdCBsaXN0ZW4gb24gUlRORVRMSU5LLAorYnV0IG9wZW5zIHRoZSBmaWxlIGNvbnRhaW5pbmcgUlRORVRMSU5LIG1lc3NhZ2VzIHNhdmVkIGluIGJpbmFyeSBmb3JtYXQKK2FuZCBkdW1wcyB0aGVtLiBTdWNoIGEgaGlzdG9yeSBmaWxlIGNhbiBiZSBnZW5lcmF0ZWQgd2l0aCB0aGUKK1x2ZXJifHJ0bW9ufCB1dGlsaXR5LiBUaGlzIHV0aWxpdHkgaGFzIGEgY29tbWFuZCBsaW5lIHN5bnRheCBzaW1pbGFyIHRvCitcdmVyYnxpcCBtb25pdG9yfC4KK0lkZWFsbHksIFx2ZXJifHJ0bW9ufCBzaG91bGQgYmUgc3RhcnRlZCBiZWZvcmUKK3RoZSBmaXJzdCBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gY29tbWFuZCBpcyBpc3N1ZWQuIEYuZS5cIGlmCit5b3UgaW5zZXJ0OgorXGJlZ2lue3ZlcmJhdGltfQorICBydG1vbiBmaWxlIC92YXIvbG9nL3J0bW9uLmxvZworXGVuZHt2ZXJiYXRpbX0KK2luIGEgc3RhcnR1cCBzY3JpcHQsIHlvdSB3aWxsIGJlIGFibGUgdG8gdmlldyB0aGUgZnVsbCBoaXN0b3J5CitsYXRlci4KKworQ2VydGFpbmx5LCBpdCBpcyBwb3NzaWJsZSB0byBzdGFydCBcdmVyYnxydG1vbnwgYXQgYW55IHRpbWUuCitJdCBwcmVwZW5kcyB0aGUgaGlzdG9yeSB3aXRoIHRoZSBzdGF0ZSBzbmFwc2hvdCBkdW1wZWQgYXQgdGhlIG1vbWVudAorb2Ygc3RhcnRpbmcuCisKKworXHNlY3Rpb257Um91dGUgcmVhbG1zIGFuZCBwb2xpY3kgcHJvcGFnYXRpb24sIHtcdHQgcnRhY2N0fX0KK1xsYWJlbHtSVC1SRUFMTVN9CisKK09uIHJvdXRlcnMgdXNpbmcgT1NQRiBBU0Ugb3IsIGVzcGVjaWFsbHksIHRoZSBCR1AgcHJvdG9jb2wsIHJvdXRpbmcKK3RhYmxlcyBtYXkgYmUgaHVnZS4gSWYgd2Ugd2FudCB0byBjbGFzc2lmeSBvciB0byBhY2NvdW50IGZvciB0aGUgcGFja2V0cworcGVyIHJvdXRlLCB3ZSB3aWxsIGhhdmUgdG8ga2VlcCBsb3RzIG9mIGluZm9ybWF0aW9uLiBFdmVuIHdvcnNlLCBpZiB3ZQord2FudCB0byBkaXN0aW5ndWlzaCB0aGUgcGFja2V0cyBub3Qgb25seSBieSB0aGVpciBkZXN0aW5hdGlvbiwgYnV0CithbHNvIGJ5IHRoZWlyIHNvdXJjZSwgdGhlIHRhc2sgZ2V0cyBxdWFkcmF0aWMgY29tcGxleGl0eSBhbmQgaXRzIHNvbHV0aW9uCitpcyBwaHlzaWNhbGx5IGltcG9zc2libGUuCisKK09uZSBhcHByb2FjaCB0byBwcm9wYWdhdGluZyB0aGUgcG9saWN5IGZyb20gcm91dGluZyBwcm90b2NvbHMKK3RvIHRoZSBmb3J3YXJkaW5nIGVuZ2luZSBoYXMgYmVlbiBwcm9wb3NlZCBpbn5cY2l0ZXtJT1MtQkdQLVBQfS4KK0Vzc2VudGlhbGx5LCBDaXNjbyBQb2xpY3kgUHJvcGFnYXRpb24gdmlhIEJHUCBpcyBiYXNlZCBvbiB0aGUgZmFjdAordGhhdCBkZWRpY2F0ZWQgcm91dGVycyBhbGwgaGF2ZSB0aGUgUklCIChSb3V0aW5nIEluZm9ybWF0aW9uIEJhc2UpCitjbG9zZSB0byB0aGUgZm9yd2FyZGluZyBlbmdpbmUsIHNvIHBvbGljeSByb3V0aW5nIHJ1bGVzIGNhbgorY2hlY2sgYWxsIHRoZSByb3V0ZSBhdHRyaWJ1dGVzLCBpbmNsdWRpbmcgQVNQQVRIIGluZm9ybWF0aW9uCithbmQgY29tbXVuaXR5IHN0cmluZ3MuCisKK1RoZSBMaW51eCBhcmNoaXRlY3R1cmUsIHNwbGl0dGluZyB0aGUgUklCIChtYWludGFpbmVkIGJ5IGEgdXNlciBsZXZlbAorZGFlbW9uKSBhbmQgdGhlIGtlcm5lbCBiYXNlZCBGSUIgKEZvcndhcmRpbmcgSW5mb3JtYXRpb24gQmFzZSksCitkb2VzIG5vdCBhbGxvdyBzdWNoIGEgc2ltcGxlIGFwcHJvYWNoLgorCitJdCBpcyB0byBvdXIgZm9ydHVuZSBiZWNhdXNlIHRoZXJlIGlzIGFub3RoZXIgc29sdXRpb24KK3doaWNoIGFsbG93cyBldmVuIG1vcmUgZmxleGlibGUgcG9saWN5IGFuZCByaWNoZXIgc2VtYW50aWNzLgorCitOYW1lbHksIHJvdXRlcyBjYW4gYmUgY2x1c3RlcmVkIHRvZ2V0aGVyIGluIHVzZXIgc3BhY2UsIGJhc2VkIG9uIHRoZWlyCithdHRyaWJ1dGVzLiAgRi5lLlwgYSBCR1Agcm91dGVyIGtub3dzIHJvdXRlIEFTUEFUSCwgaXRzIGNvbW11bml0eTsKK2FuIE9TUEYgcm91dGVyIGtub3dzIHRoZSByb3V0ZSB0YWcgb3IgaXRzIGFyZWEuIFRoZSBhZG1pbmlzdHJhdG9yLCB3aGVuIGFkZGluZworcm91dGVzIG1hbnVhbGx5LCBhbHNvIGtub3dzIHRoZWlyIG5hdHVyZS4gUHJvdmlkaW5nIHRoYXQgdGhlIG51bWJlciBvZiBzdWNoCithZ2dyZWdhdGVzICh3ZSBjYWxsIHRoZW0ge1xlbSByZWFsbXNcL30pIGlzIGxvdywgdGhlIHRhc2sgb2YgZnVsbAorY2xhc3NpZmljYXRpb24gYm90aCBieSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJlY29tZXMgcXVpdGUgbWFuYWdlYWJsZS4KKworU28gZWFjaCByb3V0ZSBtYXkgYmUgYXNzaWduZWQgdG8gYSByZWFsbS4gSXQgaXMgYXNzdW1lZCB0aGF0Cit0aGlzIGlkZW50aWZpY2F0aW9uIGlzIG1hZGUgYnkgYSByb3V0aW5nIGRhZW1vbiwgYnV0IHN0YXRpYyByb3V0ZXMKK2NhbiBhbHNvIGJlIGhhbmRsZWQgbWFudWFsbHkgd2l0aCBcdmVyYnxpcCByb3V0ZXwgKHNlZSBzZWMuXHJlZntJUC1ST1VURX0sCitwLlxwYWdlcmVme0lQLVJPVVRFfSkuCitcYmVnaW57TkJ9CisgIFRoZXJlIGlzIGEgcGF0Y2ggdG8gXHZlcmJ8Z2F0ZWR8LCBhbGxvd2luZyBjbGFzc2lmaWNhdGlvbiBvZiByb3V0ZXMKKyAgdG8gcmVhbG1zIHdpdGggYWxsIHRoZSBzZXQgb2YgcG9saWN5IHJ1bGVzIGltcGxlbWVudGVkIGluIFx2ZXJifGdhdGVkfDoKKyAgYnkgcHJlZml4LCBieSBBU1BBVEgsIGJ5IG9yaWdpbiwgYnkgdGFnIGV0Yy4KK1xlbmR7TkJ9CisKK1RvIGZhY2lsaXRhdGUgdGhlIGNvbnN0cnVjdGlvbiAoZi5lLlwgaW4gY2FzZSB0aGUgcm91dGluZworZGFlbW9uIGlzIG5vdCBhd2FyZSBvZiByZWFsbXMpLCBtaXNzaW5nIHJlYWxtcyBtYXkgYmUgY29tcGxldGVkCit3aXRoIHJvdXRpbmcgcG9saWN5IHJ1bGVzLCBzZWUgc2VjLn5ccmVme0lQLVJVTEV9LCBwLlxwYWdlcmVme0lQLVJVTEV9LgorCitGb3IgZWFjaCBwYWNrZXQgdGhlIGtlcm5lbCBjYWxjdWxhdGVzIGEgdHVwbGUgb2YgcmVhbG1zOiBzb3VyY2UgcmVhbG0KK2FuZCBkZXN0aW5hdGlvbiByZWFsbSwgdXNpbmcgdGhlIGZvbGxvd2luZyBhbGdvcml0aG06CisKK1xiZWdpbntlbnVtZXJhdGV9CitcaXRlbSBJZiB0aGUgcm91dGUgaGFzIGEgcmVhbG0sIHRoZSBkZXN0aW5hdGlvbiByZWFsbSBvZiB0aGUgcGFja2V0IGlzIHNldCB0byBpdC4KK1xpdGVtIElmIHRoZSBydWxlIGhhcyBhIHNvdXJjZSByZWFsbSwgdGhlIHNvdXJjZSByZWFsbSBvZiB0aGUgcGFja2V0IGlzIHNldCB0byBpdC4KK0lmIHRoZSBkZXN0aW5hdGlvbiByZWFsbSB3YXMgbm90IGluaGVyaXRlZCBmcm9tIHRoZSByb3V0ZSBhbmQgdGhlIHJ1bGUgaGFzIGEgZGVzdGluYXRpb24gcmVhbG0sCitpdCBpcyBhbHNvIHNldC4KK1xpdGVtIElmIGF0IGxlYXN0IG9uZSBvZiB0aGUgcmVhbG1zIGlzIHN0aWxsIHVua25vd24sIHRoZSBrZXJuZWwgZmluZHMKK3RoZSByZXZlcnNlZCByb3V0ZSB0byB0aGUgc291cmNlIG9mIHRoZSBwYWNrZXQuCitcaXRlbSBJZiB0aGUgc291cmNlIHJlYWxtIGlzIHN0aWxsIHVua25vd24sIGdldCBpdCBmcm9tIHRoZSByZXZlcnNlZCByb3V0ZS4KK1xpdGVtIElmIG9uZSBvZiB0aGUgcmVhbG1zIGlzIHN0aWxsIHVua25vd24sIHN3YXAgdGhlIHJlYWxtcyBvZiByZXZlcnNlZAorcm91dGVzIGFuZCBhcHBseSBzdGVwIDIgYWdhaW4uCitcZW5ke2VudW1lcmF0ZX0KKworQWZ0ZXIgdGhpcyBwcm9jZWR1cmUgaXMgY29tcGxldGVkIHdlIGtub3cgd2hhdCByZWFsbSB0aGUgcGFja2V0CithcnJpdmVkIGZyb20gYW5kIHRoZSByZWFsbSB3aGVyZSBpdCBpcyBnb2luZyB0byBwcm9wYWdhdGUgdG8uCitJZiBzb21lIG9mIHRoZSByZWFsbXMgYXJlIHVua25vd24sIHRoZXkgYXJlIGluaXRpYWxpemVkIHRvIHplcm8KKyhvciByZWFsbSBcdmVyYnx1bmtub3dufCkuCisKK1RoZSBtYWluIGFwcGxpY2F0aW9uIG9mIHJlYWxtcyBpcyB0aGUgVEMgXHZlcmJ8cm91dGV8IGNsYXNzaWZpZXJ+XGNpdGV7VEMtQ1JFRn0sCit3aGVyZSB0aGV5IGFyZSB1c2VkIHRvIGhlbHAgYXNzaWduIHBhY2tldHMgdG8gdHJhZmZpYyBjbGFzc2VzLAordG8gYWNjb3VudCwgcG9saWNlIGFuZCBzY2hlZHVsZSB0aGVtIGFjY29yZGluZyB0byB0aGlzCitjbGFzc2lmaWNhdGlvbi4KKworQSBtdWNoIHNpbXBsZXIgYnV0IHN0aWxsIHZlcnkgdXNlZnVsIGFwcGxpY2F0aW9uIGlzIGluY29taW5nIHBhY2tldAorYWNjb3VudGluZyBieSByZWFsbXMuIFRoZSBrZXJuZWwgZ2F0aGVycyBhIHBhY2tldCBzdGF0aXN0aWNzIHN1bW1hcnkKK3doaWNoIGNhbiBiZSB2aWV3ZWQgd2l0aCB0aGUgXHZlcmJ8cnRhY2N0fCB1dGlsaXR5LgorXGJlZ2lue3ZlcmJhdGltfQora3V6bmV0QGFtYmVyOn4gJCBydGFjY3QgcnVzc2lhCitSZWFsbSAgICAgIEJ5dGVzVG8gICAgUGt0c1RvICAgICBCeXRlc0Zyb20gIFBrdHNGcm9tICAgCitydXNzaWEgICAgIDIwNTc2Nzc4ICAgMTY5MTc2ICAgICA0NzA4MDE2OCAgIDE1MzgwNSAgICAgCitrdXpuZXRAYW1iZXI6fiAkCitcZW5ke3ZlcmJhdGltfQorVGhpcyBzaG93cyB0aGF0IHRoaXMgcm91dGVyIHJlY2VpdmVkIDE1MzgwNSBwYWNrZXRzIGZyb20KK3RoZSByZWFsbSBcdmVyYnxydXNzaWF8IGFuZCBmb3J3YXJkZWQgMTY5MTc2IHBhY2tldHMgdG8gXHZlcmJ8cnVzc2lhfC4KK1RoZSByZWFsbSBcdmVyYnxydXNzaWF8IGNvbnNpc3RzIG9mIHJvdXRlcyB3aXRoIEFTUEFUSHMgbm90IGxlYXZpbmcKK1J1c3NpYS4KKworTm90ZSB0aGF0IGxvY2FsbHkgb3JpZ2luYXRpbmcgcGFja2V0cyBhcmUgbm90IGFjY291bnRlZCBoZXJlLAorXHZlcmJ8cnRhY2N0fCBzaG93cyBpbmNvbWluZyBwYWNrZXRzIG9ubHkuIFVzaW5nIHRoZSBcdmVyYnxyb3V0ZXwKK2NsYXNzaWZpZXIgKHNlZX5cY2l0ZXtUQy1DUkVGfSkgeW91IGNhbiBnZXQgZXZlbiBtb3JlIGRldGFpbGVkCithY2NvdW50aW5nIGluZm9ybWF0aW9uIGFib3V0IG91dGdvaW5nIHBhY2tldHMsIG9wdGlvbmFsbHkKK3N1bW1hcml6aW5nIHRyYWZmaWMgbm90IG9ubHkgYnkgc291cmNlIG9yIGRlc3RpbmF0aW9uLCBidXQKK2J5IGFueSBwYWlyIG9mIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcmVhbG1zLgorCisKK1xiZWdpbnt0aGViaWJsaW9ncmFwaHl9ezk5fQorXGFkZGNvbnRlbnRzbGluZXt0b2N9e3NlY3Rpb259e1JlZmVyZW5jZXN9CitcYmliaXRlbXtSRkMtTkRJU0N9IFQufk5hcnRlbiwgRS5+Tm9yZG1hcmssIFcuflNpbXBzb24uCitgYE5laWdoYm9yIERpc2NvdmVyeSBmb3IgSVAgVmVyc2lvbiA2IChJUHY2KScnLCBSRkMtMjQ2MS4KKworXGJpYml0ZW17UkZDLUFERFJDT05GfSBTLn5UaG9tc29uLCBULn5OYXJ0ZW4uCitgYElQdjYgU3RhdGVsZXNzIEFkZHJlc3MgQXV0b2NvbmZpZ3VyYXRpb24nJywgUkZDLTI0NjIuCisKK1xiaWJpdGVte1JGQzE4MTJ9IEYufkJha2VyLgorYGBSZXF1aXJlbWVudHMgZm9yIElQIFZlcnNpb24gNCBSb3V0ZXJzJycsIFJGQy0xODEyLgorCitcYmliaXRlbXtSRkMxMTIyfSBSLn5ULn5CcmFkZW4uCitgYFJlcXVpcmVtZW50cyBmb3IgSW50ZXJuZXQgaG9zdHMgLS0tIGNvbW11bmljYXRpb24gbGF5ZXJzJycsIFJGQy0xMTIyLgorCitcYmliaXRlbXtJT1N9IGBgQ2lzY28gSU9TIFJlbGVhc2UgMTIuMCBOZXR3b3JrIFByb3RvY29scworQ29tbWFuZCBSZWZlcmVuY2UsIFBhcnQgMScnIGFuZAorYGBDaXNjbyBJT1MgUmVsZWFzZSAxMi4wIFF1YWxpdHkgb2YgU2VydmljZSBTb2x1dGlvbnMKK0NvbmZpZ3VyYXRpb24gR3VpZGU6IENvbmZpZ3VyaW5nIFBvbGljeS1CYXNlZCBSb3V0aW5nJycsXFwKK2h0dHA6Ly93d3cuY2lzY28uY29tL3VuaXZlcmNkL2NjL3RkL2RvYy9wcm9kdWN0L3NvZnR3YXJlL2lvczEyMC4KKworXGJpYml0ZW17SVAtVFVOTkVMU30gQS5+Ti5+S3V6bmV0c292LgorYGBUdW5uZWxzIG92ZXIgSVAgaW4gTGludXgtMi4yJycsIFxcCitJbjoge1x0dCBmdHA6Ly9mdHAuaW5yLmFjLnJ1L2lwLXJvdXRpbmcvaXByb3V0ZTItY3VycmVudC50YXIuZ3p9LgorCitcYmliaXRlbXtUQy1DUkVGfSBBLn5OLn5LdXpuZXRzb3YuIGBgVEMgQ29tbWFuZCBSZWZlcmVuY2UnJyxcXAorSW46IHtcdHQgZnRwOi8vZnRwLmluci5hYy5ydS9pcC1yb3V0aW5nL2lwcm91dGUyLWN1cnJlbnQudGFyLmd6fS4KKworXGJpYml0ZW17SU9TLUJHUC1QUH0gYGBDaXNjbyBJT1MgUmVsZWFzZSAxMi4wIFF1YWxpdHkgb2YgU2VydmljZSBTb2x1dGlvbnMKK0NvbmZpZ3VyYXRpb24gR3VpZGU6IENvbmZpZ3VyaW5nIFFvUyBQb2xpY3kgUHJvcGFnYXRpb24gdmlhCitCb3JkZXIgR2F0ZXdheSBQcm90b2NvbCcnLFxcCitodHRwOi8vd3d3LmNpc2NvLmNvbS91bml2ZXJjZC9jYy90ZC9kb2MvcHJvZHVjdC9zb2Z0d2FyZS9pb3MxMjAuCisKK1xiaWJpdGVte1JGQy1ESENQfSBSLn5Ecm9tcy4KK2BgRHluYW1pYyBIb3N0IENvbmZpZ3VyYXRpb24gUHJvdG9jb2wuJycsIFJGQy0yMTMxCisKK1xiaWJpdGVte1JGQzI0MTR9ICBNLn5BbGxtYW4sIFMufkZsb3lkLCBDLn5QYXJ0cmlkZ2UuCitgYEluY3JlYXNpbmcgVENQJ3MgSW5pdGlhbCBXaW5kb3cnJywgUkZDLTI0MTQuCisKK1xlbmR7dGhlYmlibGlvZ3JhcGh5fQorCisKKworCitcYXBwZW5kaXgKK1xhZGRjb250ZW50c2xpbmV7dG9jfXtzZWN0aW9ufXtBcHBlbmRpeH0KKworXHNlY3Rpb257U291cmNlIGFkZHJlc3Mgc2VsZWN0aW9ufQorXGxhYmVse0FERFItU0VMfQorCitXaGVuIGEgaG9zdCBjcmVhdGVzIGFuIElQIHBhY2tldCwgaXQgbXVzdCBzZWxlY3Qgc29tZSBzb3VyY2UKK2FkZHJlc3MuIENvcnJlY3Qgc291cmNlIGFkZHJlc3Mgc2VsZWN0aW9uIGlzIGEgY3JpdGljYWwgcHJvY2VkdXJlLAorYmVjYXVzZSBpdCBnaXZlcyB0aGUgcmVjZWl2ZXIgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkZWxpdmVyIGEKK3JlcGx5LiBJZiB0aGUgc291cmNlIGlzIHNlbGVjdGVkIGluY29ycmVjdGx5LCBpbiB0aGUgYmVzdCBjYXNlLAordGhlIGJhY2t3YXJkIHBhdGggbWF5IGFwcGVhciBkaWZmZXJlbnQgdG8gdGhlIGZvcndhcmQgb25lIHdoaWNoCitpcyBoYXJtZnVsIGZvciBwZXJmb3JtYW5jZS4gSW4gdGhlIHdvcnN0IGNhc2UsIHdoZW4gdGhlIGFkZHJlc3NlcworYXJlIGFkbWluaXN0cmF0aXZlbHkgc2NvcGVkLCB0aGUgcmVwbHkgbWF5IGJlIGxvc3QgZW50aXJlbHkuCisKK0xpbnV4LTIuMiBzZWxlY3RzIHNvdXJjZSBhZGRyZXNzZXMgdXNpbmcgdGhlIGZvbGxvd2luZyBhbGdvcml0aG06CisKK1xiZWdpbntpdGVtaXplfQorXGl0ZW0KK1RoZSBhcHBsaWNhdGlvbiBtYXkgc2VsZWN0IGEgc291cmNlIGFkZHJlc3MgZXhwbGljaXRseSB3aXRoIFx2ZXJifGJpbmQoMil8CitzeXNjYWxsIG9yIHN1cHBseWluZyBpdCB0byBcdmVyYnxzZW5kbXNnKDIpfCB2aWEgdGhlIGFuY2lsbGFyeSBkYXRhIG9iamVjdAorXHZlcmJ8SVBfUEtUSU5GT3wuIEluIHRoaXMgY2FzZSB0aGUga2VybmVsIG9ubHkgY2hlY2tzIHRoZSB2YWxpZGl0eQorb2YgdGhlIGFkZHJlc3MgYW5kIG5ldmVyIHRyaWVzIHRvIGBgaW1wcm92ZScnIGFuIGluY29ycmVjdCB1c2VyIGNob2ljZSwKK2dlbmVyYXRpbmcgYW4gZXJyb3IgaW5zdGVhZC4KK1xiZWdpbntOQn0KKyBOZXZlciBzYXkgYGBOZXZlcicnLiBUaGUgc3lzY3RsIG9wdGlvbiBcdmVyYnxpcF9keW5hZGRyfCBicmVha3MKKyB0aGlzIGF4aW9tLiBJdCBoYXMgYmVlbiBtYWRlIGRlbGliZXJhdGVseSB3aXRoIHRoZSBwdXJwb3NlCisgb2YgYXV0b21hdGljYWxseSByZXNlbGVjdGluZyB0aGUgYWRkcmVzcyBvbiBob3N0cyB3aXRoIGR5bmFtaWMgZGlhbC1vdXQgaW50ZXJmYWNlcy4KKyBIb3dldmVyLCB0aGlzIGhhY2sge1xlbSBtdXN0IG5vdFwvfSBiZSB1c2VkIG9uIG11bHRpaG9tZWQgaG9zdHMKKyBhbmQgZXNwZWNpYWxseSBvbiByb3V0ZXJzOiBpdCB3b3VsZCBicmVhayB0aGVtLgorXGVuZHtOQn0KKworCitcaXRlbSBPdGhlcndpc2UsIElQIHJvdXRpbmcgdGFibGVzIGNhbiBjb250YWluIGFuIGV4cGxpY2l0IHNvdXJjZQorYWRkcmVzcyBoaW50IGZvciB0aGlzIGRlc3RpbmF0aW9uLiBUaGUgaGludCBpcyBzZXQgd2l0aCB0aGUgXHZlcmJ8c3JjfCBwYXJhbWV0ZXIKK3RvIHRoZSBcdmVyYnxpcCByb3V0ZXwgY29tbWFuZCwgc2VjLlxyZWZ7SVAtUk9VVEV9LCBwLlxwYWdlcmVme0lQLVJPVVRFfS4KKworCitcaXRlbSBPdGhlcndpc2UsIHRoZSBrZXJuZWwgc2VhcmNoZXMgdGhyb3VnaCB0aGUgbGlzdCBvZiBhZGRyZXNzZXMKK2F0dGFjaGVkIHRvIHRoZSBpbnRlcmZhY2UgdGhyb3VnaCB3aGljaCB0aGUgcGFja2V0cyB3aWxsIGJlIHJvdXRlZC4KK1RoZSBzZWFyY2ggc3RyYXRlZ2llcyBhcmUgZGlmZmVyZW50IGZvciBJUCBhbmQgSVB2Ni4gTmFtZWx5OgorCitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIElQdjYgc2VhcmNoZXMgZm9yIHRoZSBmaXJzdCB2YWxpZCwgbm90IGRlcHJlY2F0ZWQgYWRkcmVzcword2l0aCB0aGUgc2FtZSBzY29wZSBhcyB0aGUgZGVzdGluYXRpb24uCisKK1xpdGVtIElQIHNlYXJjaGVzIGZvciB0aGUgZmlyc3QgdmFsaWQgYWRkcmVzcyB3aXRoIGEgc2NvcGUgd2lkZXIKK3RoYW4gdGhlIHNjb3BlIG9mIHRoZSBkZXN0aW5hdGlvbiBidXQgaXQgcHJlZmVycyBhZGRyZXNzZXMKK3doaWNoIGZhbGwgdG8gdGhlIHNhbWUgc3VibmV0IGFzIHRoZSBuZXh0aG9wIG9mIHRoZSByb3V0ZQordG8gdGhlIGRlc3RpbmF0aW9uLiBVbmxpa2UgSVB2NiwgdGhlIHNjb3BlcyBvZiBJUHY0IGRlc3RpbmF0aW9ucworYXJlIG5vdCBlbmNvZGVkIGluIHRoZWlyIGFkZHJlc3NlcyBidXQgYXJlIHN1cHBsaWVkCitpbiByb3V0aW5nIHRhYmxlcyBpbnN0ZWFkICh0aGUgXHZlcmJ8c2NvcGV8IHBhcmFtZXRlciB0byB0aGUgXHZlcmJ8aXAgcm91dGV8IGNvbW1hbmQsCitzZWMuXHJlZntJUC1ST1VURX0sIHAuXHBhZ2VyZWZ7SVAtUk9VVEV9KS4KKworXGVuZHtpdGVtaXplfQorCisKK1xpdGVtIE90aGVyd2lzZSwgaWYgdGhlIHNjb3BlIG9mIHRoZSBkZXN0aW5hdGlvbiBpcyBcdmVyYnxsaW5rfCBvciBcdmVyYnxob3N0fCwKK3RoZSBhbGdvcml0aG0gZmFpbHMgYW5kIHJldHVybnMgYSB6ZXJvIHNvdXJjZSBhZGRyZXNzLgorCitcaXRlbSBPdGhlcndpc2UsIGFsbCBpbnRlcmZhY2VzIGFyZSBzY2FubmVkIHRvIHNlYXJjaCBmb3IgYW4gYWRkcmVzcword2l0aCBhbiBhcHByb3ByaWF0ZSBzY29wZS4gVGhlIGxvb3BiYWNrIGRldmljZSBcdmVyYnxsb3wgaXMgYWx3YXlzIHRoZSBmaXJzdAoraW4gdGhlIHNlYXJjaCBsaXN0LCBzbyB0aGF0IGlmIGFuIGFkZHJlc3Mgd2l0aCBnbG9iYWwgc2NvcGUgKG5vdCAxMjcuMC4wLjEhKQoraXMgY29uZmlndXJlZCBvbiBsb29wYmFjaywgaXQgaXMgYWx3YXlzIHByZWZlcnJlZC4KKworXGVuZHtpdGVtaXplfQorCisKK1xzZWN0aW9ue1Byb3h5IEFSUC9ORElTQ30KK1xsYWJlbHtQUk9YWS1ORUlHSH0KKworUm91dGVycyBtYXkgYW5zd2VyIEFSUC9ORElTQyBzb2xpY2l0YXRpb25zIG9uIGJlaGFsZiBvZiBvdGhlciBob3N0cy4KK0luIExpbnV4LTIuMiBwcm94eSBBUlAgb24gYW4gaW50ZXJmYWNlIG1heSBiZSBlbmFibGVkCitieSBzZXR0aW5nIHRoZSBrZXJuZWwgXHZlcmJ8c3lzY3RsfCB2YXJpYWJsZSAKK1x2ZXJifC9wcm9jL3N5cy9uZXQvaXB2NC9jb25mLzxkZXY+L3Byb3h5X2FycHwgdG8gMS4gQWZ0ZXIgdGhpcywgdGhlIHJvdXRlcgorc3RhcnRzIHRvIGFuc3dlciBBUlAgcmVxdWVzdHMgb24gdGhlIGludGVyZmFjZSBcdmVyYnw8ZGV2PnwsIHByb3ZpZGVkCit0aGUgcm91dGUgdG8gdGhlIHJlcXVlc3RlZCBkZXN0aW5hdGlvbiBkb2VzIHtcZW0gbm90XC99IGdvIGJhY2sgdmlhIHRoZSBzYW1lCitkZXZpY2UuCisKK1RoZSB2YXJpYWJsZSBcdmVyYnwvcHJvYy9zeXMvbmV0L2lwdjQvY29uZi9hbGwvcHJveHlfYXJwfCBlbmFibGVzIHByb3h5CitBUlAgb24gYWxsIHRoZSBJUCBkZXZpY2VzLgorCitIb3dldmVyLCB0aGlzIGFwcHJvYWNoIGZhaWxzIGluIHRoZSBjYXNlIG9mIElQdjYgYmVjYXVzZSB0aGUgcm91dGVyCittdXN0IGpvaW4gdGhlIHNvbGljaXRlZCBub2RlIG11bHRpY2FzdCBhZGRyZXNzIHRvIGxpc3RlbiBmb3IgdGhlIGNvcnJlc3BvbmRpbmcKK05ESVNDIHF1ZXJpZXMuIEl0IG1lYW5zIHRoYXQgcHJveHkgTkRJU0MgaXMgcG9zc2libGUgb25seSBvbiBhIHBlciBkZXN0aW5hdGlvbgorYmFzaXMuCisKK0xvZ2ljYWxseSwgcHJveHkgQVJQL05ESVNDIGlzIG5vdCBhIGtlcm5lbCB0YXNrLiBJdCBjYW4gZWFzaWx5IGJlIGltcGxlbWVudGVkCitpbiB1c2VyIHNwYWNlLiBIb3dldmVyLCBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkgd2FzIHByZXNlbnQgaW4gQlNEIGtlcm5lbHMKK2FuZCBpbiBMaW51eC0yLjAsIHNvIHdlIGhhdmUgdG8gcHJlc2VydmUgaXQgYXQgbGVhc3QgdG8gdGhlIGV4dGVudCB0aGF0CitpcyBzdGFuZGFyZGl6ZWQgaW4gQlNELgorXGJlZ2lue05CfQorICBMaW51eC0yLjAgQVJQIGhhZCBhIGZlYXR1cmUgY2FsbGVkIHtcZW0gc3VibmV0XC99IHByb3h5IEFSUC4KKyAgSXQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgc3lzY3RsIGZsYWcgaW4gTGludXgtMi4yLgorXGVuZHtOQn0KKworCitUaGUgXHZlcmJ8aXB8IHV0aWxpdHkgcHJvdmlkZXMgYSB3YXkgdG8gbWFuYWdlIHByb3h5IEFSUC9ORElTQword2l0aCB0aGUgXHZlcmJ8aXAgbmVpZ2h8IGNvbW1hbmQsIG5hbWVseToKK1xiZWdpbnt2ZXJiYXRpbX0KKyAgaXAgbmVpZ2ggYWRkIHByb3h5IEFERFJFU1MgWyBkZXYgTkFNRSBdCitcZW5ke3ZlcmJhdGltfQorYWRkcyBhIG5ldyBwcm94eSBBUlAvTkRJU0MgcmVjb3JkIGFuZAorXGJlZ2lue3ZlcmJhdGltfQorICBpcCBuZWlnaCBkZWwgcHJveHkgQUREUkVTUyBbIGRldiBOQU1FIF0KK1xlbmR7dmVyYmF0aW19CitkZWxldGVzIGl0LgorCitJZiB0aGUgbmFtZSBvZiB0aGUgZGV2aWNlIGlzIG5vdCBnaXZlbiwgdGhlIHJvdXRlciB3aWxsIGFuc3dlciBzb2xpY2l0YXRpb25zCitmb3IgYWRkcmVzcyBcdmVyYnxBRERSRVNTfCBvbiBhbGwgZGV2aWNlcywgb3RoZXJ3aXNlIGl0IHdpbGwgb25seSBzZXJ2ZQordGhlIGRldmljZSBcdmVyYnxOQU1FfC4gRXZlbiBpZiB0aGUgcHJveHkgZW50cnkgaXMgY3JlYXRlZCB3aXRoCitcdmVyYnxpcCBuZWlnaHwsIHRoZSByb3V0ZXIge1xlbSB3aWxsIG5vdFwvfSBhbnN3ZXIgYSBxdWVyeSBpZiB0aGUgcm91dGUKK3RvIHRoZSBkZXN0aW5hdGlvbiBnb2VzIGJhY2sgdmlhIHRoZSBpbnRlcmZhY2UgZnJvbSB3aGljaCB0aGUgc29saWNpdGF0aW9uCit3YXMgcmVjZWl2ZWQuCisKK0l0IGlzIGltcG9ydGFudCB0byBlbXBoYXNpemUgdGhhdCBwcm94eSBlbnRyaWVzIGhhdmUge1xlbSBub1wvfQorcGFyYW1ldGVycyBvdGhlciB0aGFuIHRoZXNlIChJUC9JUHY2IGFkZHJlc3MgYW5kIG9wdGlvbmFsIGRldmljZSkuCitQYXJ0aWN1bGFybHksIHRoZSBlbnRyeSBkb2VzIG5vdCBzdG9yZSBhbnkgbGluayBsYXllciBhZGRyZXNzLgorSXQgYWx3YXlzIGFkdmVydGlzZXMgdGhlIHN0YXRpb24gYWRkcmVzcyBvZiB0aGUgaW50ZXJmYWNlCitvbiB3aGljaCBpdCBzZW5kcyBhZHZlcnRpc2VtZW50cyAoaS5lLiBpdCdzIG93biBzdGF0aW9uIGFkZHJlc3MpLgorCitcc2VjdGlvbntSb3V0ZSBOQVQgc3RhdHVzfQorXGxhYmVse1JPVVRFLU5BVH0KKworTkFUIChvciBgYE5ldHdvcmsgQWRkcmVzcyBUcmFuc2xhdGlvbicnKSByZW1hcHMgc29tZSBwYXJ0cworb2YgdGhlIElQIGFkZHJlc3Mgc3BhY2UgaW50byBvdGhlciBvbmVzLiBMaW51eC0yLjIgcm91dGUgTkFUIGlzIHN1cHBvc2VkCit0byBiZSB1c2VkIHRvIGZhY2lsaXRhdGUgcG9saWN5IHJvdXRpbmcgYnkgcmV3cml0aW5nIGFkZHJlc3NlcwordG8gb3RoZXIgcm91dGluZyBkb21haW5zIG9yIHRvIGhlbHAgd2hpbGUgcmVudW1iZXJpbmcgc2l0ZXMKK3RvIGFub3RoZXIgcHJlZml4LgorCitccGFyYWdyYXBoe1doYXQgaXQgaXMgbm90On0KK0l0IGlzIG5lY2Vzc2FyeSB0byBlbXBoYXNpemUgdGhhdCB7XGVtIGl0IGlzIG5vdCBzdXBwb3NlZFwvfQordG8gYmUgdXNlZCB0byBjb21wcmVzcyBhZGRyZXNzIHNwYWNlIG9yIHRvIHNwbGl0IGxvYWQuCitUaGlzIGlzIG5vdCBtaXNzaW5nIGZ1bmN0aW9uYWxpdHkgYnV0IGEgZGVzaWduIHByaW5jaXBsZS4KK1JvdXRlIE5BVCBpcyB7XGVtIHN0YXRlbGVzc1wvfS4gSXQgZG9lcyBub3QgaG9sZCBhbnkgc3RhdGUKK2Fib3V0IHRyYW5zbGF0ZWQgc2Vzc2lvbnMuIFRoaXMgbWVhbnMgdGhhdCBpdCBoYW5kbGVzIGFueSBudW1iZXIKK29mIHNlc3Npb25zIGZsYXdsZXNzbHkuIEJ1dCBpdCBhbHNvIG1lYW5zIHRoYXQgaXQgaXMge1xlbSBzdGF0aWNcL30uCitJdCBjYW5ub3QgZGV0ZWN0IHRoZSBtb21lbnQgd2hlbiB0aGUgbGFzdCBUQ1AgY2xpZW50IHN0b3BzCit1c2luZyBhbiBhZGRyZXNzLiBGb3IgdGhlIHNhbWUgcmVhc29uLCBpdCB3aWxsIG5vdCBoZWxwIHRvIHNwbGl0Citsb2FkIGJldHdlZW4gc2V2ZXJhbCBzZXJ2ZXJzLgorXGJlZ2lue05CfQorSXQgaXMgYSBwcmV0dHkgY29tbW9ubHkgaGVsZCBiZWxpZWYgdGhhdCBpdCBpcyB1c2VmdWwgdG8gc3BsaXQgbG9hZCBiZXR3ZWVuCitzZXZlcmFsIHNlcnZlcnMgd2l0aCBOQVQuIFRoaXMgaXMgYSBtaXN0YWtlLiBBbGwgeW91IGdldCBmcm9tIHRoaXMKK2lzIHRoZSByZXF1aXJlbWVudCB0aGF0IHRoZSByb3V0ZXIga2VlcCB0aGUgc3RhdGUgb2YgYWxsIHRoZSBUQ1AgY29ubmVjdGlvbnMKK2dvaW5nIHZpYSBpdC4gV2VsbCwgaWYgdGhlIHJvdXRlciBpcyBzbyBwb3dlcmZ1bCwgcnVuIGFwYWNoZSBvbiBpdC4gOCkKK1xlbmR7TkJ9CisKK1RoZSBzZWNvbmQgZmVhdHVyZTogaXQgZG9lcyBub3QgdG91Y2ggcGFja2V0IHBheWxvYWQsCitkb2VzIG5vdCB0cnkgdG8gYGBpbXByb3ZlJycgYnJva2VuIHByb3RvY29scyBieSBsb29raW5nCit0aHJvdWdoIGl0cyBkYXRhIGFuZCBtYW5nbGluZyBpdC4gSXQgbWFuZ2xlcyBJUCBhZGRyZXNzZXMsCitvbmx5IElQIGFkZHJlc3NlcyBhbmQgbm90aGluZyBidXQgSVAgYWRkcmVzc2VzLgorVGhpcyBhbHNvLCBpcyBub3QgbWlzc2luZyBhbnkgZnVuY3Rpb25hbGl0eS4KKworVG8gcmVzdW1lOiBpZiB5b3UgbmVlZCB0byBjb21wcmVzcyBhZGRyZXNzIHNwYWNlIG9yIGtlZXAKK2FjdGl2ZSBGVFAgY2xpZW50cyBoYXBweSwgeW91ciBjaG9pY2UgaXMgbm90IHJvdXRlIE5BVCBidXQgbWFzcXVlcmFkaW5nLAorcG9ydCBmb3J3YXJkaW5nLCBOQVBUIGV0Yy4gCitcYmVnaW57TkJ9CitCeSB0aGUgd2F5LCB5b3UgbWF5IGFsc28gd2FudCB0byBsb29rIGF0CitodHRwOi8vd3d3LnN1c2UuY29tL1x+bWhhL0h5cGVyTmV3cy9nZXQvbGludXgtaXAtbmF0Lmh0bWwKK1xlbmR7TkJ9CisKKworXHBhcmFncmFwaHtIb3cgaXQgd29ya3MufQorU29tZSBwYXJ0IG9mIHRoZSBhZGRyZXNzIHNwYWNlIGlzIHJlc2VydmVkIGZvciBkdW1teSBhZGRyZXNzZXMKK3doaWNoIHdpbGwgbG9vayBmb3IgYWxsIHRoZSB3b3JsZCBsaWtlIHNvbWUgaG9zdCBhZGRyZXNzZXMKK2luc2lkZSB5b3VyIG5ldHdvcmsuIE5vIG90aGVyIGhvc3RzIG1heSB1c2UgdGhlc2UgYWRkcmVzc2VzLAoraG93ZXZlciBvdGhlciByb3V0ZXJzIG1heSBhbHNvIGJlIGNvbmZpZ3VyZWQgdG8gdHJhbnNsYXRlIHRoZW0uCitcYmVnaW57TkJ9CitBIGdyZWF0IGFkdmFudGFnZSBvZiByb3V0ZSBOQVQgaXMgdGhhdCBpdCBtYXkgYmUgdXNlZCBub3QKK29ubHkgaW4gc3R1YiBuZXR3b3JrcyBidXQgaW4gZW52aXJvbm1lbnRzIHdpdGggYXJiaXRyYXJpbHkgY29tcGxpY2F0ZWQKK3N0cnVjdHVyZS4gSXQgZG9lcyBub3QgZmlyZXdhbGwsIGl0IHtcZW0gZm9yd2FyZHMufQorXGVuZHtOQn0KK1RoZXNlIGFkZHJlc3NlcyBhcmUgc2VsZWN0ZWQgYnkgdGhlIFx2ZXJifGlwIHJvdXRlfCBjb21tYW5kCisoc2VjLlxyZWZ7SVAtUk9VVEUtQUREfSwgcC5ccGFnZXJlZntJUC1ST1VURS1BRER9KS4gRi5lLlwKK1xiZWdpbnt2ZXJiYXRpbX0KKyAgaXAgcm91dGUgYWRkIG5hdCAxOTIuMjAzLjgwLjE0NCB2aWEgMTkzLjIzMy43LjgzCitcZW5ke3ZlcmJhdGltfQorc3RhdGVzIHRoYXQgdGhlIHNpbmdsZSBhZGRyZXNzIDE5Mi4yMDMuODAuMTQ0IGlzIGEgZHVtbXkgTkFUIGFkZHJlc3MuCitGb3IgYWxsIHRoZSB3b3JsZCBpdCBsb29rcyBsaWtlIGEgaG9zdCBhZGRyZXNzIGluc2lkZSBvdXIgbmV0d29yay4KK0ZvciBuZWlnaGJvdXJpbmcgaG9zdHMgYW5kIHJvdXRlcnMgaXQgbG9va3MgbGlrZSB0aGUgbG9jYWwgYWRkcmVzcworb2YgdGhlIHRyYW5zbGF0aW5nIHJvdXRlci4gVGhlIHJvdXRlciBhbnN3ZXJzIEFSUCBmb3IgaXQsIGFkdmVydGlzZXMKK3RoaXMgYWRkcmVzcyBhcyByb3V0ZWQgdmlhIGl0LCB7XGVtIGV0IGFsXC99LiBXaGVuIHRoZSByb3V0ZXIKK3JlY2VpdmVzIGEgcGFja2V0IGRlc3RpbmVkIGZvciAxOTIuMjAzLjgwLjE0NCwgaXQgcmVwbGFjZXMgCit0aGlzIGFkZHJlc3Mgd2l0aCAxOTMuMjMzLjcuODMgd2hpY2ggaXMgdGhlIGFkZHJlc3Mgb2Ygc29tZSByZWFsCitob3N0IGFuZCBmb3J3YXJkcyB0aGUgcGFja2V0LiBJZiB5b3UgbmVlZCB0byByZW1hcAorYmxvY2tzIG9mIGFkZHJlc3NlcywgeW91IG1heSB1c2UgYSBjb21tYW5kIGxpa2U6CitcYmVnaW57dmVyYmF0aW19CisgIGlwIHJvdXRlIGFkZCBuYXQgMTkyLjIwMy44MC4xOTIvMjYgdmlhIDE5My4yMzMuNy42NAorXGVuZHt2ZXJiYXRpbX0KK1RoaXMgY29tbWFuZCB3aWxsIG1hcCBhIGJsb2NrIG9mIDYzIGFkZHJlc3NlcyAxOTIuMjAzLjgwLjE5Mi0yNTUgdG8KKzE5My4yMzMuNy42NC0xMjcuCisKK1doZW4gYW4gaW50ZXJuYWwgaG9zdCAoMTkzLjIzMy43LjgzIGluIHRoZSBleGFtcGxlIGFib3ZlKQorc2VuZHMgc29tZXRoaW5nIHRvIHRoZSBvdXRlciB3b3JsZCBhbmQgdGhlc2UgcGFja2V0cyBhcmUgZm9yd2FyZGVkCitieSBvdXIgcm91dGVyLCBpdCBzaG91bGQgdHJhbnNsYXRlIHRoZSBzb3VyY2UgYWRkcmVzcyAxOTMuMjMzLjcuODMKK2ludG8gMTkyLjIwMy44MC4xNDQuIFRoaXMgdGFzayBpcyBzb2x2ZWQgYnkgc2V0dGluZyBhIHNwZWNpYWwKK3BvbGljeSBydWxlIChzZWMuXHJlZntJUC1SVUxFLUFERH0sIHAuXHBhZ2VyZWZ7SVAtUlVMRS1BRER9KToKK1xiZWdpbnt2ZXJiYXRpbX0KKyAgaXAgcnVsZSBhZGQgcHJpbyAzMjAgZnJvbSAxOTMuMjMzLjcuODMgbmF0IDE5Mi4yMDMuODAuMTQ0CitcZW5ke3ZlcmJhdGltfQorVGhpcyBydWxlIHNheXMgdGhhdCB0aGUgc291cmNlIGFkZHJlc3MgMTkzLjIzMy43LjgzCitzaG91bGQgYmUgdHJhbnNsYXRlZCBpbnRvIDE5Mi4yMDMuODAuMTQ0IGJlZm9yZSBmb3J3YXJkaW5nLgorSXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlIGFkZHJlc3MgYWZ0ZXIgdGhlIFx2ZXJifG5hdHwga2V5d29yZAoraXMgc29tZSBOQVQgYWRkcmVzcywgZGVjbGFyZWQgYnkge1x0dCBpcCByb3V0ZSBhZGQgbmF0fS4KK0lmIGl0IGlzIGp1c3QgYSByYW5kb20gYWRkcmVzcyB0aGUgcm91dGVyIHdpbGwgbm90IG1hcCB0byBpdC4KK1xiZWdpbntOQn0KK1RoZSBleGNlcHRpb24gaXMgd2hlbiB0aGUgYWRkcmVzcyBpcyBhIGxvY2FsIGFkZHJlc3Mgb2YgdGhpcworcm91dGVyIChvciAwLjAuMC4wKSBhbmQgbWFzcXVlcmFkaW5nIGlzIGNvbmZpZ3VyZWQgaW4gdGhlIGxpbnV4LTIuMgora2VybmVsLiBJbiB0aGlzIGNhc2UgdGhlIHJvdXRlciB3aWxsIG1hc3F1ZXJhZGUgdGhlIHBhY2tldHMgYXMgdGhpcyBhZGRyZXNzLgorSWYgMC4wLjAuMCBpcyBzZWxlY3RlZCwgdGhlIHJlc3VsdCBpcyBlcXVpdmFsZW50IHRvIG9uZQorb2J0YWluZWQgd2l0aCBmaXJld2FsbGluZyBydWxlcy4gT3RoZXJ3aXNlLCB5b3UgaGF2ZSB0aGUgd2F5Cit0byBvcmRlciBMaW51eCB0byBtYXNxdWVyYWRlIHRvIHRoaXMgZml4ZWQgYWRkcmVzcy4KK05BVCBtZWNoYW5pc20gdXNlZCBpbiBsaW51eC0yLjQgaXMgbW9yZSBmbGV4aWJsZSB0aGFuCittYXNxdWVyYWRpbmcsIHNvIHRoYXQgdGhpcyBmZWF0dXJlIGhhcyBsb3N0IG1lYW5pbmcgYW5kIGRpc2FibGVkLgorXGVuZHtOQn0KKworSWYgdGhlIG5ldHdvcmsgaGFzIG5vbi10cml2aWFsIGludGVybmFsIHN0cnVjdHVyZSwgaXQgaXMKK3VzZWZ1bCBhbmQgZXZlbiBuZWNlc3NhcnkgdG8gYWRkIHJ1bGVzIGRpc2FibGluZyB0cmFuc2xhdGlvbgord2hlbiBhIHBhY2tldCBkb2VzIG5vdCBsZWF2ZSB0aGlzIG5ldHdvcmsuIExldCB1cyByZXR1cm4gdG8gdGhlCitleGFtcGxlIGZyb20gc2VjLlxyZWZ7SVAtUlVMRS1TSE9XfSAocC5ccGFnZXJlZntJUC1SVUxFLVNIT1d9KS4KK1xiZWdpbnt2ZXJiYXRpbX0KKzMwMDoJZnJvbSAxOTMuMjMzLjcuODMgdG8gMTkzLjIzMy43LjAvMjQgbG9va3VwIG1haW4KKzMxMDoJZnJvbSAxOTMuMjMzLjcuODMgdG8gMTkyLjIwMy44MC4wLzI0IGxvb2t1cCBtYWluCiszMjA6CWZyb20gMTkzLjIzMy43LjgzIGxvb2t1cCBpbnIucnVoZXAgbWFwLXRvIDE5Mi4yMDMuODAuMTQ0CitcZW5ke3ZlcmJhdGltfQorVGhpcyBibG9jayBvZiBydWxlcyBjYXVzZXMgbm9ybWFsIGZvcndhcmRpbmcgd2hlbgorcGFja2V0cyBmcm9tIDE5My4yMzMuNy44MyBkbyBub3QgbGVhdmUgbmV0d29ya3MgMTkzLjIzMy43LzI0CithbmQgMTkyLjIwMy44MC8yNC4gQWxzbywgaWYgdGhlIFx2ZXJifGluci5ydWhlcHwgdGFibGUgZG9lcyBub3QKK2NvbnRhaW4gYSByb3V0ZSB0byB0aGUgZGVzdGluYXRpb24gKHdoaWNoIG1lYW5zIHRoYXQgdGhlIHJvdXRpbmcKK2RvbWFpbiBvd25pbmcgYWRkcmVzc2VzIGZyb20gMTkyLjIwMy44MC8yNCBpcyBkZWFkKSwgbm8gdHJhbnNsYXRpb24KK3dpbGwgb2NjdXIuIE90aGVyd2lzZSwgdGhlIHBhY2tldHMgYXJlIHRyYW5zbGF0ZWQuCisKK1xwYXJhZ3JhcGh7SG93IHRvIG9ubHkgdHJhbnNsYXRlIHNlbGVjdGVkIHBvcnRzOn0KK0lmIHlvdSBvbmx5IHdhbnQgdG8gdHJhbnNsYXRlIHNlbGVjdGVkIHBvcnRzIChmLmUuXCBodHRwKQorYW5kIGxlYXZlIHRoZSByZXN0IGludGFjdCwgeW91IG1heSB1c2UgXHZlcmJ8aXBjaGFpbnN8Cit0byBcdmVyYnxmd21hcmt8IGEgY2xhc3Mgb2YgcGFja2V0cy4KK1N1cHBvc2UgeW91IGRpZCBhbmQgYWxsIHRoZSBwYWNrZXRzIGZyb20gMTkzLjIzMy43LjgzCitkZXN0aW5lZCBmb3IgcG9ydCA4MCBhcmUgbWFya2VkIHdpdGggbWFya2VyIDB4MTIzNCBpbiBpbnB1dCBmd2NoYWluLgorSW4gdGhpcyBjYXNlIHlvdSBtYXkgcmVwbGFjZSBydWxlIFwjMzIwIHdpdGg6CitcYmVnaW57dmVyYmF0aW19CiszMjA6CWZyb20gMTkzLjIzMy43LjgzIGZ3bWFyayAxMjM0IGxvb2t1cCBtYWluIG1hcC10byAxOTIuMjAzLjgwLjE0NAorXGVuZHt2ZXJiYXRpbX0KK2FuZCB0cmFuc2xhdGlvbiB3aWxsIG9ubHkgYmUgZW5hYmxlZCBmb3Igb3V0Z29pbmcgaHR0cCByZXF1ZXN0cy4KKworXHNlY3Rpb257RXhhbXBsZTogbWluaW1hbCBob3N0IHNldHVwfQorXGxhYmVse0VYQU1QTEUtU0VUVVB9CisKK1RoZSBmb2xsb3dpbmcgc2NyaXB0IGdpdmVzIGFuIGV4YW1wbGUgb2YgYSBmYXVsdCBzYWZlCitzZXR1cCBvZiBJUCAoYW5kIElQdjYsIGlmIGl0IGlzIGNvbXBpbGVkIGludG8gdGhlIGtlcm5lbCkKK2luIHRoZSBjb21tb24gY2FzZSBvZiBhIG5vZGUgYXR0YWNoZWQgdG8gYSBzaW5nbGUgYnJvYWRjYXN0CituZXR3b3JrLiBBIG1vcmUgYWR2YW5jZWQgc2NyaXB0LCB3aGljaCBtYXkgYmUgdXNlZCBib3RoIG9uIG11bHRpaG9tZWQKK2hvc3RzIGFuZCBvbiByb3V0ZXJzLCBpcyBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZworc2VjdGlvbi4KKworVGhlIHV0aWxpdGllcyB1c2VkIGluIHRoZSBzY3JpcHQgbWF5IGJlIGZvdW5kIGluIHRoZQorZGlyZWN0b3J5IGZ0cDovL2Z0cC5pbnIuYWMucnUvaXAtcm91dGluZy86CitcYmVnaW57ZW51bWVyYXRlfQorXGl0ZW0gXHZlcmJ8aXB8IC0tLSBwYWNrYWdlIFx2ZXJifGlwcm91dGUyfC4KK1xpdGVtIFx2ZXJifGFycGluZ3wgLS0tIHBhY2thZ2UgXHZlcmJ8aXB1dGlsc3wuCitcaXRlbSBcdmVyYnxyZGlzY3wgLS0tIHBhY2thZ2UgXHZlcmJ8aXB1dGlsc3wuCitcZW5ke2VudW1lcmF0ZX0KK1xiZWdpbntOQn0KK0l0IGFsc28gcmVmZXJzIHRvIGEgREhDUCBjbGllbnQsIFx2ZXJifGRoY3BjZHwuIEkgc2hvdWxkIHJlZnJhaW4gZnJvbQorcmVjb21tZW5kaW5nIGEgZ29vZCBESENQIGNsaWVudCB0byB1c2UuIEFsbCB0aGF0IEkgY2FuCitzYXkgaXMgdGhhdCBJU0MgXHZlcmJ8ZGhjcC0yLjBiMXBsNnwgcGF0Y2hlZCB3aXRoIHRoZSBwYXRjaCB0aGF0CitjYW4gYmUgZm91bmQgaW4gdGhlIFx2ZXJifGRoY3AuYm9vdHAucmFycHwgc3ViZGlyZWN0b3J5IG9mCit0aGUgc2FtZSBmdHAgc2l0ZSB7XGVtIGRvZXNcL30gd29yaywKK2F0IGxlYXN0IG9uIEV0aGVybmV0IGFuZCBUb2tlbiBSaW5nLgorXGVuZHtOQn0KKworXGJlZ2lue3ZlcmJhdGltfQorIyEgL2Jpbi9iYXNoCitcZW5ke3ZlcmJhdGltfQorXGJlZ2lue2ZsdXNobGVmdH0KK1wjIHtcYmYgVXNhZ2U6IFx2ZXJifGlmb25lIEFERFJFU1NbL1BSRUZJWC1MRU5HVEhdIFtERVZJQ0VdfH1cXAorXCMge1xiZiBQYXJhbWV0ZXJzOn1cXAorXCMgXCQxIC0tLSBTdGF0aWMgSVAgYWRkcmVzcywgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBwcmVmaXggbGVuZ3RoLlxcCitcIyBcJDIgLS0tIERldmljZSBuYW1lLiBJZiBpdCBpcyBtaXNzaW5nLCBcdmVyYnxldGgwfCBpcyBhc3NzdW1lZC5cXAorXCMgRi5lLiBcdmVyYnxpZm9uZSAxOTMuMjMzLjcuOTB8CitcZW5ke2ZsdXNobGVmdH0KK1xiZWdpbnt2ZXJiYXRpbX0KK2Rldj0kMgorOiAke2Rldjo9ZXRoMH0KK2lwYWRkcj0KK1xlbmR7dmVyYmF0aW19CitcIyBQYXJzZSBJUCBhZGRyZXNzLCBzcGxpdHRpbmcgcHJlZml4IGxlbmd0aC4KK1xiZWdpbnt2ZXJiYXRpbX0KK2lmIFsgIiQxIiAhPSAiIiBdOyB0aGVuCisgIGlwYWRkcj0kezElLyp9CisgIGlmIFsgIiQxIiAhPSAiJGlwYWRkciIgXTsgdGhlbgorICAgIHBmeGxlbj0kezEjKi99CisgIGZpCisgIDogJHtwZnhsZW46PTI0fQorZmkKK3BmeD0iJHtpcGFkZHJ9LyR7cGZ4bGVufSIKK1xlbmR7dmVyYmF0aW19CisKK1xiZWdpbntmbHVzaGxlZnR9CitcIyB7XGJmIFN0ZXAgMH0gLS0tIGVuYWJsZSBsb29wYmFjay5cXAorXCNcXAorXCMgVGhpcyBzdGVwIGlzIG5lY2Vzc2FyeSBvbiBhbnkgbmV0d29ya2VkIGJveCBiZWZvcmUgYXR0ZW1wdFxcCitcIyB0byBjb25maWd1cmUgYW55IG90aGVyIGRldmljZS5cXAorXGVuZHtmbHVzaGxlZnR9CitcYmVnaW57dmVyYmF0aW19CitpcCBsaW5rIHNldCB1cCBkZXYgbG8KK2lwIGFkZHIgYWRkIDEyNy4wLjAuMS84IGRldiBsbyBicmQgKyBzY29wZSBob3N0CitcZW5ke3ZlcmJhdGltfQorXGJlZ2lue2ZsdXNobGVmdH0KK1wjIElQdjYgYXV0b2NvbmZpZ3VyZSB0aGVtc2VsZiBvbiBsb29wYmFjay5cXAorXCNcXAorXCMgSWYgdXNlciBnYXZlIGxvb3BiYWNrIGFzIGRldmljZSwgd2UgYWRkIHRoZSBhZGRyZXNzIGFzIGFsaWFzIGFuZCBleGl0LgorXGVuZHtmbHVzaGxlZnR9CitcYmVnaW57dmVyYmF0aW19CitpZiBbICIkZGV2IiA9ICJsbyIgXTsgdGhlbgorICBpZiBbICIkaXBhZGRyIiAhPSAiIiAtYSAgIiRpcGFkZHIiICE9ICIxMjcuMC4wLjEiIF07IHRoZW4KKyAgICBpcCBhZGRyZXNzIGFkZCAkaXBhZGRyIGRldiAkZGV2CisgICAgZXhpdCAkPworICBmaQorICBleGl0IDAKK2ZpCitcZW5ke3ZlcmJhdGltfQorCitcbm9pbmRlbnRcIyB7XGJmIFN0ZXAgMX0gLS0tIGVuYWJsZSBkZXZpY2UgXHZlcmJ8JGRldnwKKworXGJlZ2lue3ZlcmJhdGltfQoraWYgISBpcCBsaW5rIHNldCB1cCBkZXYgJGRldiA7IHRoZW4KKyAgZWNobyAiQ2Fubm90IGVuYWJsZSBpbnRlcmZhY2UgJGRldi4gQWJvcnRpbmcuIiAxPiYyCisgIGV4aXQgMQorZmkKK1xlbmR7dmVyYmF0aW19CitcYmVnaW57Zmx1c2hsZWZ0fQorXCMgVGhlIGludGVyZmFjZSBpcyBcdmVyYnxVUHwuIElQdjYgc3RhcnRlZCBzdGF0ZWxlc3MgYXV0b2NvbmZpZ3VyYXRpb24gaXRzZWxmLFxcCitcIyBhbmQgaXRzIGNvbmZpZ3VyYXRpb24gZmluaXNoZXMgaGVyZS4gSG93ZXZlcixcXAorXCMgSVAgc3RpbGwgbmVlZHMgc29tZSBzdGF0aWMgcHJlY29uZmlndXJlZCBhZGRyZXNzLgorXGVuZHtmbHVzaGxlZnR9CitcYmVnaW57dmVyYmF0aW19CitpZiBbICIkaXBhZGRyIiA9ICIiIF07IHRoZW4KKyAgZWNobyAiTm8gYWRkcmVzcyBmb3IgJGRldiBpcyBjb25maWd1cmVkLCB0cnlpbmcgREhDUC4uLiIgMT4mMgorICBkaGNwY2QKKyAgZXhpdCAkPworZmkKK1xlbmR7dmVyYmF0aW19CisKK1xiZWdpbntmbHVzaGxlZnR9CitcIyB7XGJmIFN0ZXAgMn0gLS0tIElQIER1cGxpY2F0ZSBBZGRyZXNzIERldGVjdGlvbn5cY2l0ZXtSRkMtREhDUH0uXFwKK1wjIFNlbmQgdHdvIHByb2JlcyBhbmQgd2FpdCBmb3IgcmVzdWx0IGZvciAzIHNlY29uZHMuXFwKK1wjIElmIHRoZSBpbnRlcmZhY2Ugb3BlbnMgc2xvd2VyIGYuZS5cIGR1ZSB0byBsb25nIG1lZGlhIGRldGVjdGlvbixcXAorXCMgeW91IHdhbnQgdG8gaW5jcmVhc2UgdGhlIHRpbWVvdXQuXFwKK1xlbmR7Zmx1c2hsZWZ0fQorXGJlZ2lue3ZlcmJhdGltfQoraWYgISBhcnBpbmcgLXEgLWMgMiAtdyAzIC1EIC1JICRkZXYgJGlwYWRkciA7IHRoZW4KKyAgZWNobyAiQWRkcmVzcyAkaXBhZGRyIGlzIGJ1c3ksIHRyeWluZyBESENQLi4uIiAxPiYyCisgIGRoY3BjZAorICBleGl0ICQ/CitmaQorXGVuZHt2ZXJiYXRpbX0KK1xiZWdpbntmbHVzaGxlZnR9CitcIyBPSywgdGhlIGFkZHJlc3MgaXMgdW5pcXVlLCB3ZSBtYXkgYWRkIGl0IG9uIHRoZSBpbnRlcmZhY2UuXFwKK1wjXFwKK1wjIHtcYmYgU3RlcCAzfSAtLS0gQ29uZmlndXJlIHRoZSBhZGRyZXNzIG9uIHRoZSBpbnRlcmZhY2UuCitcZW5ke2ZsdXNobGVmdH0KKworXGJlZ2lue3ZlcmJhdGltfQoraWYgISBpcCBhZGRyZXNzIGFkZCAkcGZ4IGJyZCArIGRldiAkZGV2OyB0aGVuCisgIGVjaG8gIkZhaWxlZCB0byBhZGQgJHBmeCBvbiAkZGV2LCB0cnlpbmcgREhDUC4uLiIgMT4mMgorICBkaGNwY2QKKyAgZXhpdCAkPworZmkKK1xlbmR7dmVyYmF0aW19CisKK1xub2luZGVudFwjIHtcYmYgU3RlcCA0fSAtLS0gQW5ub3VuY2Ugb3VyIHByZXNlbmNlIG9uIHRoZSBsaW5rLgorXGJlZ2lue3ZlcmJhdGltfQorYXJwaW5nIC1BIC1jIDEgLUkgJGRldiAkaXBhZGRyCitub2FycD0kPworKCBzbGVlcCAyOworICBhcnBpbmcgLVUgLWMgMSAtSSAkZGV2ICRpcGFkZHIgKSA+JiAvZGV2L251bGwgPC9kZXYvbnVsbCAmCitcZW5ke3ZlcmJhdGltfQorCitcYmVnaW57Zmx1c2hsZWZ0fQorXCMge1xiZiBTdGVwIDV9IChvcHRpb25hbCkgLS0tIEFkZCBzb21lIGNvbnRyb2wgcm91dGVzLlxcCitcI1xcCitcIyAxLiBQcm9oaWJpdCBsaW5rIGxvY2FsIG11bHRpY2FzdCBhZGRyZXNzZXMuXFwKK1wjIDIuIFByb2hpYml0IGxpbmsgbG9jYWwgKGFsaWFzLCBsaW1pdGVkKSBicm9hZGNhc3QuXFwKK1wjIDMuIEFkZCBkZWZhdWx0IG11bHRpY2FzdCByb3V0ZS4KK1xlbmR7Zmx1c2hsZWZ0fQorXGJlZ2lue3ZlcmJhdGltfQoraXAgcm91dGUgYWRkIHVucmVhY2hhYmxlIDIyNC4wLjAuMC8yNCAKK2lwIHJvdXRlIGFkZCB1bnJlYWNoYWJsZSAyNTUuMjU1LjI1NS4yNTUKK2lmIFsgYGlwIGxpbmsgbHMgJGRldiB8IGdyZXAgLWMgTVVMVElDQVNUYCAtZ2UgMSBdOyB0aGVuCisgIGlwIHJvdXRlIGFkZCAyMjQuMC4wLjAvNCBkZXYgJGRldiBzY29wZSBnbG9iYWwKK2ZpCitcZW5ke3ZlcmJhdGltfQorCitcYmVnaW57Zmx1c2hsZWZ0fQorXCMge1xiZiBTdGVwIDZ9IC0tLSBBZGQgZmFsbGJhY2sgZGVmYXVsdCByb3V0ZSB3aXRoIGh1Z2UgbWV0cmljLlxcCitcIyBJZiBhIHByb3h5IEFSUCBzZXJ2ZXIgaXMgcHJlc2VudCBvbiB0aGUgaW50ZXJmYWNlLCB3ZSB3aWxsIGJlXFwKK1wjIGFibGUgdG8gdGFsayB0byBhbGwgdGhlIEludGVybmV0IHdpdGhvdXQgZnVydGhlciBjb25maWd1cmF0aW9uLlxcCitcIyBJdCBpcyBub3Qgc28gY2hlYXAgdGhvdWdoIGFuZCB3ZSBzdGlsbCBob3BlIHRoYXQgdGhpcyByb3V0ZVxcCitcIyB3aWxsIGJlIG92ZXJyaWRkZW4gYnkgbW9yZSBjb3JyZWN0IG9uZSBieSByZGlzYy5cXAorXCMgRG8gbm90IG1ha2UgdGhpcyBzdGVwIGlmIHRoZSBkZXZpY2UgaXMgbm90IEFSUGFibGUsXFwKK1wjIGJlY2F1c2UgZGVhZCBuZXh0aG9wIGRldGVjdGlvbiBkb2VzIG5vdCB3b3JrIG9uIHRoZW0uCitcZW5ke2ZsdXNobGVmdH0KK1xiZWdpbnt2ZXJiYXRpbX0KK2lmIFsgIiRub2FycCIgPSAiMCIgXTsgdGhlbgorICBpcCBybyBhZGQgZGVmYXVsdCBkZXYgJGRldiBtZXRyaWMgMzAwMDAgc2NvcGUgZ2xvYmFsCitmaQorXGVuZHt2ZXJiYXRpbX0KKworXGJlZ2lue2ZsdXNobGVmdH0KK1wjIHtcYmYgU3RlcCA3fSAtLS0gUmVzdGFydCByb3V0ZXIgZGlzY292ZXJ5IGFuZCBleGl0LgorXGVuZHtmbHVzaGxlZnR9CitcYmVnaW57dmVyYmF0aW19CitraWxsYWxsIC1IVVAgcmRpc2MgfHwgcmRpc2MgLWZzCitleGl0IDAKK1xlbmR7dmVyYmF0aW19CisKKworXHNlY3Rpb257RXhhbXBsZToge1xwcm90ZWN0XHR0IGlmY2ZnfSAtLS0gaW50ZXJmYWNlIGFkZHJlc3MgbWFuYWdlbWVudH0KK1xsYWJlbHtFWEFNUExFLUlGQ0ZHfQorCitUaGlzIGlzIGEgc2ltcGxpc3RpYyBzY3JpcHQgcmVwbGFjaW5nIG9uZSBvcHRpb24gb2YgXHZlcmJ8aWZjb25maWd8LAorbmFtZWx5LCBJUCBhZGRyZXNzIG1hbmFnZW1lbnQuIEl0IG5vdCBvbmx5IGFkZHMKK2FkZHJlc3NlcywgYnV0IGFsc28gY2FycmllcyBvdXQgRHVwbGljYXRlIEFkZHJlc3MgRGV0ZWN0aW9uflxjaXRle1JGQy1ESENQfSwKK3NlbmRzIHVuc29saWNpdGVkIEFSUCB0byB1cGRhdGUgdGhlIGNhY2hlcyBvZiBvdGhlciBob3N0cyBzaGFyaW5nCit0aGUgaW50ZXJmYWNlLCBhZGRzIHNvbWUgY29udHJvbCByb3V0ZXMgYW5kIHJlc3RhcnRzIFJvdXRlciBEaXNjb3ZlcnkKK3doZW4gaXQgaXMgbmVjZXNzYXJ5LgorCitJIHN0cm9uZ2x5IHJlY29tbWVuZCB1c2luZyBpdCB7XGVtIGluc3RlYWRcL30gb2YgXHZlcmJ8aWZjb25maWd8IGJvdGgKK29uIGhvc3RzIGFuZCBvbiByb3V0ZXJzLgorCitcYmVnaW57dmVyYmF0aW19CisjISAvYmluL2Jhc2gKK1xlbmR7dmVyYmF0aW19CitcYmVnaW57Zmx1c2hsZWZ0fQorXCMge1xiZiBVc2FnZTogXHZlcmI/aWZjZmcgREVWSUNFWzpBTElBU10gW2FkZHxkZWxdIEFERFJFU1NbL0xFTkdUSF0gW1BFRVJdP31cXAorXCMge1xiZiBQYXJhbWV0ZXJzOn1cXAorXCMgLS0tRGV2aWNlIG5hbWUuIEl0IG1heSBoYXZlIGFsaWFzIHN1ZmZpeCwgc2VwYXJhdGVkIGJ5IGNvbG9uLlxcCitcIyAtLS1Db21tYW5kOiBhZGQsIGRlbGV0ZSBvciBzdG9wLlxcCitcIyAtLS1JUCBhZGRyZXNzLCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IHByZWZpeCBsZW5ndGguXFwKK1wjIC0tLU9wdGlvbmFsIHBlZXIgYWRkcmVzcyBmb3IgcG9pbnRvcG9pbnQgaW50ZXJmYWNlcy5cXAorXCMgRi5lLiBcdmVyYnxpZmNmZyBldGgwIDE5My4yMzMuNy45MC8yNHwKKworXG5vaW5kZW50XCMgVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzLCB3aGV0aGVyIGl0IGlzIHJvdXRlciBvciBob3N0LlxcCitcIyBJdCByZXR1cm5zIDAsIGlmIHRoZSBob3N0IGlzIGFwcGFyZW50bHkgbm90IHJvdXRlci4KK1xlbmR7Zmx1c2hsZWZ0fQorXGJlZ2lue3ZlcmJhdGltfQorQ2hlY2tGb3J3YXJkaW5nICgpIHsKKyAgbG9jYWwgc2Jhc2UgZndkCisgIHNiYXNlPS9wcm9jL3N5cy9uZXQvaXB2NC9jb25mCisgIGZ3ZD0wCisgIGlmIFsgLWQgJHNiYXNlIF07IHRoZW4KKyAgICBmb3IgZGlyIGluICRzYmFzZS8qL2ZvcndhcmRpbmc7IGRvCisgICAgICBmd2Q9JFskZndkICsgYGNhdCAkZGlyYF0KKyAgICBkb25lCisgIGVsc2UKKyAgICBmd2Q9MgorICBmaQorICByZXR1cm4gJGZ3ZAorfQorXGVuZHt2ZXJiYXRpbX0KK1xiZWdpbntmbHVzaGxlZnR9CitcIyBUaGlzIGZ1bmN0aW9uIHJlc3RhcnRzIFJvdXRlciBEaXNjb3ZlcnkuXFwKK1xlbmR7Zmx1c2hsZWZ0fQorXGJlZ2lue3ZlcmJhdGltfQorUmVzdGFydFJESVNDICgpIHsKKyAga2lsbGFsbCAtSFVQIHJkaXNjIHx8IHJkaXNjIC1mcworfQorXGVuZHt2ZXJiYXRpbX0KK1xiZWdpbntmbHVzaGxlZnR9CitcIyBDYWxjdWxhdGUgQUJDICJuYXR1cmFsIiBtYXNrIGxlbmd0aFxcCitcIyBBcmc6IFwkMSA9IGRvdHF1YWQgYWRkcmVzcworXGVuZHtmbHVzaGxlZnR9CitcYmVnaW57dmVyYmF0aW19CitBQkNNYXNrTGVuICgpIHsKKyAgbG9jYWwgY2xhc3M7CisgIGNsYXNzPSR7MSUlLip9CisgIGlmIFsgJGNsYXNzIC1lcSAwIC1vICRjbGFzcyAtZ2UgMjI0IF07IHRoZW4gcmV0dXJuIDAKKyAgZWxpZiBbICRjbGFzcyAtZ2UgMTkyIF07IHRoZW4gcmV0dXJuIDI0CisgIGVsaWYgWyAkY2xhc3MgLWdlIDEyOCBdOyB0aGVuIHJldHVybiAxNgorICBlbHNlICByZXR1cm4gOCA7IGZpCit9CitcZW5ke3ZlcmJhdGltfQorCisKK1xiZWdpbntmbHVzaGxlZnR9CitcIyB7XGJmIE1BSU4oKX1cXAorXCNcXAorXCMgU3RyaXAgYWxpYXMgc3VmZml4IHNlcGFyYXRlZCBieSBjb2xvbi4KK1xlbmR7Zmx1c2hsZWZ0fQorXGJlZ2lue3ZlcmJhdGltfQorbGFiZWw9ImxhYmVsICQxIgorbGRldj0kMQorZGV2PSR7MSU6Kn0KK2lmIFsgIiRkZXYiID0gIiIgLW8gIiQxIiA9ICJoZWxwIiBdOyB0aGVuCisgIGVjaG8gIlVzYWdlOiBpZmNmZyBERVYgW1thZGR8ZGVsIFtBRERSWy9MRU5dXSBbUEVFUl0gfCBzdG9wXSIgMT4mMgorICBlY2hvICIgICAgICAgYWRkIC0gYWRkIG5ldyBhZGRyZXNzIiAxPiYyCisgIGVjaG8gIiAgICAgICBkZWwgLSBkZWxldGUgYWRkcmVzcyIgMT4mMgorICBlY2hvICIgICAgICAgc3RvcCAtIGNvbXBsZXRlbHkgZGlzYWJsZSBJUCIgMT4mMgorICBleGl0IDEKK2ZpCitzaGlmdAorCitDaGVja0ZvcndhcmRpbmcKK2Z3ZD0kPworXGVuZHt2ZXJiYXRpbX0KK1xiZWdpbntmbHVzaGxlZnR9CitcIyBQYXJzZSBjb21tYW5kLiBJZiBpdCBpcyBgYHN0b3AnJywgZmx1c2ggYW5kIGV4aXQuCitcZW5ke2ZsdXNobGVmdH0KK1xiZWdpbnt2ZXJiYXRpbX0KK2RlbGV0aW5nPTAKK2Nhc2UgIiQxIiBpbgorYWRkKSBzaGlmdCA7Oworc3RvcCkKKyAgaWYgWyAiJGxkZXYiICE9ICIkZGV2IiBdOyB0aGVuCisgICAgZWNobyAiQ2Fubm90IHN0b3AgYWxpYXMgJGxkZXYiIDE+JjIKKyAgICBleGl0IDE7CisgIGZpCisgIGlwIC00IGFkZHIgZmx1c2ggZGV2ICRkZXYgJGxhYmVsIHx8IGV4aXQgMQorICBpZiBbICRmd2QgLWVxIDAgXTsgdGhlbiBSZXN0YXJ0UkRJU0M7IGZpCisgIGV4aXQgMCA7OworZGVsKikKKyAgZGVsZXRpbmc9MTsgc2hpZnQgOzsKKyopCitlc2FjCitcZW5ke3ZlcmJhdGltfQorXGJlZ2lue2ZsdXNobGVmdH0KK1wjIFBhcnNlIHByZWZpeCwgc3BsaXQgcHJlZml4IGxlbmd0aCwgc2VwYXJhdGVkIGJ5IHNsYXNoLgorXGVuZHtmbHVzaGxlZnR9CitcYmVnaW57dmVyYmF0aW19CitpcGFkZHI9CitwZnhsZW49CitpZiBbICIkMSIgIT0gIiIgXTsgdGhlbgorICBpcGFkZHI9JHsxJS8qfQorICBpZiBbICIkMSIgIT0gIiRpcGFkZHIiIF07IHRoZW4KKyAgICBwZnhsZW49JHsxIyovfQorICBmaQorICBpZiBbICIkaXBhZGRyIiA9ICIiIF07IHRoZW4KKyAgICBlY2hvICIkMSBpcyBiYWQgSVAgYWRkcmVzcy4iIDE+JjIKKyAgICBleGl0IDEKKyAgZmkKK2ZpCitzaGlmdAorXGVuZHt2ZXJiYXRpbX0KK1xiZWdpbntmbHVzaGxlZnR9CitcIyBJZiBwZWVyIGFkZHJlc3MgaXMgcHJlc2VudCwgcHJlZml4IGxlbmd0aCBpcyAzMi5cXAorXCMgT3RoZXJ3aXNlLCBpZiBwcmVmaXggbGVuZ3RoIHdhcyBub3QgZ2l2ZW4sIGd1ZXNzIGl0LgorXGVuZHtmbHVzaGxlZnR9CitcYmVnaW57dmVyYmF0aW19CitwZWVyPSQxCitpZiBbICIkcGVlciIgIT0gIiIgXTsgdGhlbgorICBpZiBbICIkcGZ4bGVuIiAhPSAiIiAtYSAiJHBmeGxlbiIgIT0gIjMyIiBdOyB0aGVuCisgICAgZWNobyAiUGVlciBhZGRyZXNzIHdpdGggbm9uLXRyaXZpYWwgbmV0bWFzay4iIDE+JjIKKyAgICBleGl0IDEKKyAgZmkKKyAgcGZ4PSIkaXBhZGRyIHBlZXIgJHBlZXIiCitlbHNlCisgIGlmIFsgIiRwZnhsZW4iID0gIiIgXTsgdGhlbgorICAgIEFCQ01hc2tMZW4gJGlwYWRkcgorICAgIHBmeGxlbj0kPworICBmaQorICBwZng9IiRpcGFkZHIvJHBmeGxlbiIKK2ZpCitpZiBbICIkbGRldiIgPSAiJGRldiIgLWEgIiRpcGFkZHIiICE9ICIiIF07IHRoZW4KKyAgbGFiZWw9CitmaQorXGVuZHt2ZXJiYXRpbX0KK1xiZWdpbntmbHVzaGxlZnR9CitcIyBJZiBkZWxldGlvbiB3YXMgcmVxdWVzdGVkLCBkZWxldGUgdGhlIGFkZHJlc3MgYW5kIHJlc3RhcnQgUkRJU0MKK1xlbmR7Zmx1c2hsZWZ0fQorXGJlZ2lue3ZlcmJhdGltfQoraWYgWyAkZGVsZXRpbmcgLW5lIDAgXTsgdGhlbgorICBpcCBhZGRyIGRlbCAkcGZ4IGRldiAkZGV2ICRsYWJlbCB8fCBleGl0IDEKKyAgaWYgWyAkZndkIC1lcSAwIF07IHRoZW4gUmVzdGFydFJESVNDOyBmaQorICBleGl0IDAKK2ZpCitcZW5ke3ZlcmJhdGltfQorXGJlZ2lue2ZsdXNobGVmdH0KK1wjIFN0YXJ0IGludGVyZmFjZSBpbml0aWFsaXphdGlvbi5cXAorXCNcXAorXCMge1xiZiBTdGVwIDB9IC0tLSBlbmFibGUgZGV2aWNlIFx2ZXJifCRkZXZ8CitcZW5ke2ZsdXNobGVmdH0KK1xiZWdpbnt2ZXJiYXRpbX0KK2lmICEgaXAgbGluayBzZXQgdXAgZGV2ICRkZXYgOyB0aGVuCisgIGVjaG8gIkVycm9yOiBjYW5ub3QgZW5hYmxlIGludGVyZmFjZSAkZGV2LiIgMT4mMgorICBleGl0IDEKK2ZpCitpZiBbICIkaXBhZGRyIiA9ICIiIF07IHRoZW4gZXhpdCAwOyBmaQorXGVuZHt2ZXJiYXRpbX0KK1xiZWdpbntmbHVzaGxlZnR9CitcIyB7XGJmIFN0ZXAgMX0gLS0tIElQIER1cGxpY2F0ZSBBZGRyZXNzIERldGVjdGlvbn5cY2l0ZXtSRkMtREhDUH0uXFwKK1wjIFNlbmQgdHdvIHByb2JlcyBhbmQgd2FpdCBmb3IgcmVzdWx0IGZvciAzIHNlY29uZHMuXFwKK1wjIElmIHRoZSBpbnRlcmZhY2Ugb3BlbnMgc2xvd2VyIGYuZS5cIGR1ZSB0byBsb25nIG1lZGlhIGRldGVjdGlvbixcXAorXCMgeW91IHdhbnQgdG8gaW5jcmVhc2UgdGhlIHRpbWVvdXQuXFwKK1xlbmR7Zmx1c2hsZWZ0fQorXGJlZ2lue3ZlcmJhdGltfQoraWYgISBhcnBpbmcgLXEgLWMgMiAtdyAzIC1EIC1JICRkZXYgJGlwYWRkciA7IHRoZW4KKyAgZWNobyAiRXJyb3I6IHNvbWUgaG9zdCBhbHJlYWR5IHVzZXMgYWRkcmVzcyAkaXBhZGRyIG9uICRkZXYuIiAxPiYyCisgIGV4aXQgMQorZmkKK1xlbmR7dmVyYmF0aW19CitcYmVnaW57Zmx1c2hsZWZ0fQorXCMgT0ssIHRoZSBhZGRyZXNzIGlzIHVuaXF1ZS4gV2UgbWF5IGFkZCBpdCB0byB0aGUgaW50ZXJmYWNlLlxcCitcI1xcCitcIyB7XGJmIFN0ZXAgMn0gLS0tIENvbmZpZ3VyZSB0aGUgYWRkcmVzcyBvbiB0aGUgaW50ZXJmYWNlLgorXGVuZHtmbHVzaGxlZnR9CitcYmVnaW57dmVyYmF0aW19CitpZiAhIGlwIGFkZHJlc3MgYWRkICRwZnggYnJkICsgZGV2ICRkZXYgJGxhYmVsOyB0aGVuCisgIGVjaG8gIkVycm9yOiBmYWlsZWQgdG8gYWRkICRwZnggb24gJGRldi4iIDE+JjIKKyAgZXhpdCAxCitmaQorXGVuZHt2ZXJiYXRpbX0KK1xub2luZGVudFwjIHtcYmYgU3RlcCAzfSAtLS0gQW5ub3VuY2Ugb3VyIHByZXNlbmNlIG9uIHRoZSBsaW5rCitcYmVnaW57dmVyYmF0aW19CithcnBpbmcgLXEgLUEgLWMgMSAtSSAkZGV2ICRpcGFkZHIKK25vYXJwPSQ/CisoIHNsZWVwIDIgOworICBhcnBpbmcgLXEgLVUgLWMgMSAtSSAkZGV2ICRpcGFkZHIgKSA+JiAvZGV2L251bGwgPC9kZXYvbnVsbCAmCitcZW5ke3ZlcmJhdGltfQorXGJlZ2lue2ZsdXNobGVmdH0KK1wjIHtcYmYgU3RlcCA0fSAob3B0aW9uYWwpIC0tLSBBZGQgc29tZSBjb250cm9sIHJvdXRlcy5cXAorXCNcXAorXCMgMS4gUHJvaGliaXQgbGluayBsb2NhbCBtdWx0aWNhc3QgYWRkcmVzc2VzLlxcCitcIyAyLiBQcm9oaWJpdCBsaW5rIGxvY2FsIChhbGlhcywgbGltaXRlZCkgYnJvYWRjYXN0LlxcCitcIyAzLiBBZGQgZGVmYXVsdCBtdWx0aWNhc3Qgcm91dGUuCitcZW5ke2ZsdXNobGVmdH0KK1xiZWdpbnt2ZXJiYXRpbX0KK2lwIHJvdXRlIGFkZCB1bnJlYWNoYWJsZSAyMjQuMC4wLjAvMjQgPiYgL2Rldi9udWxsIAoraXAgcm91dGUgYWRkIHVucmVhY2hhYmxlIDI1NS4yNTUuMjU1LjI1NSA+JiAvZGV2L251bGwKK2lmIFsgYGlwIGxpbmsgbHMgJGRldiB8IGdyZXAgLWMgTVVMVElDQVNUYCAtZ2UgMSBdOyB0aGVuCisgIGlwIHJvdXRlIGFkZCAyMjQuMC4wLjAvNCBkZXYgJGRldiBzY29wZSBnbG9iYWwgPiYgL2Rldi9udWxsCitmaQorXGVuZHt2ZXJiYXRpbX0KK1xiZWdpbntmbHVzaGxlZnR9CitcIyB7XGJmIFN0ZXAgNX0gLS0tIEFkZCBmYWxsYmFjayBkZWZhdWx0IHJvdXRlIHdpdGggaHVnZSBtZXRyaWMuXFwKK1wjIElmIGEgcHJveHkgQVJQIHNlcnZlciBpcyBwcmVzZW50IG9uIHRoZSBpbnRlcmZhY2UsIHdlIHdpbGwgYmVcXAorXCMgYWJsZSB0byB0YWxrIHRvIGFsbCB0aGUgSW50ZXJuZXQgd2l0aG91dCBmdXJ0aGVyIGNvbmZpZ3VyYXRpb24uXFwKK1wjIERvIG5vdCBtYWtlIHRoaXMgc3RlcCBvbiByb3V0ZXIgb3IgaWYgdGhlIGRldmljZSBpcyBub3QgQVJQYWJsZS5cXAorXCMgYmVjYXVzZSBkZWFkIG5leHRob3AgZGV0ZWN0aW9uIGRvZXMgbm90IHdvcmsgb24gdGhlbS4KK1xlbmR7Zmx1c2hsZWZ0fQorXGJlZ2lue3ZlcmJhdGltfQoraWYgWyAkZndkIC1lcSAwIF07IHRoZW4KKyAgaWYgWyAkbm9hcnAgLWVxIDAgXTsgdGhlbgorICAgIGlwIHJvIGFwcGVuZCBkZWZhdWx0IGRldiAkZGV2IG1ldHJpYyAzMDAwMCBzY29wZSBnbG9iYWwKKyAgZWxpZiBbICIkcGVlciIgIT0gIiIgXTsgdGhlbgorICAgIGlmIHBpbmcgLXEgLWMgMiAtdyA0ICRwZWVyIDsgdGhlbgorICAgICAgaXAgcm8gYXBwZW5kIGRlZmF1bHQgdmlhICRwZWVyIGRldiAkZGV2IG1ldHJpYyAzMDAwMQorICAgIGZpCisgIGZpCisgIFJlc3RhcnRSRElTQworZmkKKworZXhpdCAwCitcZW5ke3ZlcmJhdGltfQorXGJlZ2lue2ZsdXNobGVmdH0KK1wjIEVuZCBvZiB7XGJmIE1BSU4oKX0KK1xlbmR7Zmx1c2hsZWZ0fQorCisKK1xlbmR7ZG9jdW1lbnR9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9kb2MvaXAtdHVubmVscy50ZXggYi9pcHJvdXRlMi9kb2MvaXAtdHVubmVscy50ZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE4YzkzMAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2RvYy9pcC10dW5uZWxzLnRleApAQCAtMCwwICsxLDQ2OSBAQAorXGRvY3VtZW50c3R5bGVbMTJwdCx0d29zaWRlXXthcnRpY2xlfQorXGRlZlxUSVRMRXtUdW5uZWxzIG92ZXIgSVB9CitcaW5wdXQgcHJlYW1ibGUKK1xiZWdpbntjZW50ZXJ9CitcTGFyZ2VcYmYgVHVubmVscyBvdmVyIElQIGluIExpbnV4LTIuMgorXGVuZHtjZW50ZXJ9CisKKworXGJlZ2lue2NlbnRlcn0KK3sgXGxhcmdlIEFsZXhleX5OLn5LdXpuZXRzb3YgfSBcXAorXGVtIEluc3RpdHV0ZSBmb3IgTnVjbGVhciBSZXNlYXJjaCwgTW9zY293IFxcCitcdmVyYnxrdXpuZXRAbXMyLmluci5hYy5ydXwgXFwKK1xybSBNYXJjaCAxNywgMTk5OQorXGVuZHtjZW50ZXJ9CisKK1x2c3BhY2V7NW1tfQorCitcdGFibGVvZmNvbnRlbnRzCisKKworXHNlY3Rpb257SW5zdGVhZCBvZiBpbnRyb2R1Y3Rpb246IG1pY3JvLUZBUS59CisKK1xiZWdpbntpdGVtaXplfQorCitcaXRlbQorUTogSW4gbGludXgtMi4wLjM2IEkgdXNlZDoKK1xiZWdpbnt2ZXJiYXRpbX0gCisgICAgaWZjb25maWcgdHVubDEgMTAuMC4wLjEgcG9pbnRvcG9pbnQgMTkzLjIzMy43LjY1CitcZW5ke3ZlcmJhdGltfSAKK3RvIGNyZWF0ZSB0dW5uZWwuIEl0IGRvZXMgbm90IHdvcmsgaW4gMi4yLjAhCisKK0E6IFlvdSBhcmUgcmlnaHQsIGl0IGRvZXMgbm90IHdvcmsuIFRoZSBjb21tYW5kIHdyaXR0ZW4gYWJvdmUgaXMgc3BsaXQgdG8gdHdvIGNvbW1hbmRzLgorXGJlZ2lue3ZlcmJhdGltfQorICAgIGlwIHR1bm5lbCBhZGQgTVktVFVOTkVMIG1vZGUgaXBpcCByZW1vdGUgMTkzLjIzMy43LjY1CitcZW5ke3ZlcmJhdGltfSAKK3dpbGwgY3JlYXRlIHR1bm5lbCBkZXZpY2Ugd2l0aCBuYW1lIFx2ZXJifE1ZLVRVTk5FTHwuIE5vdyB5b3UgbWF5IGNvbmZpZ3VyZQoraXQgd2l0aDoKK1xiZWdpbnt2ZXJiYXRpbX0gCisgICAgaWZjb25maWcgTVktVFVOTkVMIDEwLjAuMC4xCitcZW5ke3ZlcmJhdGltfSAKK0NlcnRhaW5seSwgaWYgeW91IHByZWZlciBuYW1lIFx2ZXJifHR1bmwxfCB0byBcdmVyYnxNWS1UVU5ORUx8LAoreW91IHN0aWxsIG1heSB1c2UgaXQuCisKK1xpdGVtCitROiBJbiBsaW51eC0yLjAuMzYgSSB1c2VkOgorXGJlZ2lue3ZlcmJhdGltfSAKKyAgICBpZmNvbmZpZyB0dW5sMCAxMC4wLjAuMQorICAgIHJvdXRlIGFkZCAtbmV0IDEwLjAuMC4wIGd3IDE5My4yMzMuNy42NSBkZXYgdHVubDAKK1xlbmR7dmVyYmF0aW19IAordG8gdHVubmVsIG5ldCAxMC4wLjAuMCB2aWEgcm91dGVyIDE5My4yMzMuNy42NS4gSXQgZG9lcyBub3QKK3dvcmsgaW4gMi4yLjAhIE1vcmVvdmVyLCBcdmVyYnxyb3V0ZXwgcHJpbnRzIGEgZnVubnkgZXJyb3Igc29ydCBvZgorYGBuZXR3b3JrIHVucmVhY2hhYmxlJycgYW5kIGFmdGVyIHRoaXMgSSBmb3VuZCBhIHN0cmFuZ2UgZGlyZWN0IHJvdXRlCit0byAxMC4wLjAuMCB2aWEgXHZlcmJ8dHVubDB8IGluIHJvdXRpbmcgdGFibGUuCisKK0E6IFllcywgaW4gMi4yIHRoZSBydWxlIHRoYXQge1xlbSBub3JtYWx9IGdhdGV3YXkgbXVzdCByZXNpZGUgb24gZGlyZWN0bHkKK2Nvbm5lY3RlZCBuZXR3b3JrIGhhcyBub3QgYW55IGV4Y2VwdGlvbnMuIFlvdSBtYXkgdGVsbCBrZXJuZWwsIHRoYXQKK3RoaXMgcGFydGljdWxhciByb3V0ZSBpcyB7XGVtIGFibm9ybWFsfToKK1xiZWdpbnt2ZXJiYXRpbX0gCisgIGlmY29uZmlnIHR1bmwwIDEwLjAuMC4xIG5ldG1hc2sgMjU1LjI1NS4yNTUuMjU1CisgIGlwIHJvdXRlIGFkZCAxMC4wLjAuMC84IHZpYSAxOTMuMjMzLjcuNjUgZGV2IHR1bmwwIG9ubGluaworXGVuZHt2ZXJiYXRpbX0KK05vdGUga2V5d29yZCBcdmVyYnxvbmxpbmt8LCBpdCBpcyB0aGUgbWFnaWMga2V5IHRoYXQgb3JkZXJzIGtlcm5lbAorbm90IHRvIGNoZWNrIGZvciBjb25zaXN0ZW5jeSBvZiBnYXRld2F5IGFkZHJlc3MuCitQcm9iYWJseSwgYWZ0ZXIgdGhpcyBleHBsYW5hdGlvbiB5b3UgaGF2ZSBhbHJlYWR5IGd1ZXNzZWQgYW5vdGhlciBtZXRob2QKK3RvIGNoZWF0IGtlcm5lbDoKK1xiZWdpbnt2ZXJiYXRpbX0gCisgIGlmY29uZmlnIHR1bmwwIDEwLjAuMC4xIG5ldG1hc2sgMjU1LjI1NS4yNTUuMjU1CisgIHJvdXRlIGFkZCAtaG9zdCAxOTMuMjMzLjcuNjUgZGV2IHR1bmwwCisgIHJvdXRlIGFkZCAtbmV0IDEwLjAuMC4wIG5ldG1hc2sgMjU1LjAuMC4wIGd3IDE5My4yMzMuNy42NQorICByb3V0ZSBkZWwgLWhvc3QgMTkzLjIzMy43LjY1IGRldiB0dW5sMAorXGVuZHt2ZXJiYXRpbX0KK1dlbGwsIGlmIHlvdSBsaWtlIHN1Y2ggdHJpY2tzLCBub2JvZHkgbWF5IHByb2hpYml0IHlvdSB0byB1c2UgdGhlbS4KK09ubHkgZG8gbm90IGZvcmdldAordGhhdCBiZXR3ZWVuIFx2ZXJifHJvdXRlIGFkZHwgYW5kIFx2ZXJifHJvdXRlIGRlbHwgaG9zdCAxOTMuMjMzLjcuNjUgaXMKK3VucmVhY2hhYmxlLgorCitcaXRlbQorUTogSW4gMi4wLjM2IEkgdXNlZCB0byBsb2FkIFx2ZXJifHR1bm5lbHwgZGV2aWNlIG1vZHVsZSBhbmQgXHZlcmJ8aXBpcHwgbW9kdWxlLgorSSBjYW5ub3QgZmluZCBhbnkgXHZlcmJ8dHVubmVsfCBpbiAyLjIhCisKK0E6IExpbnV4LTIuMiBoYXMgc2luZ2xlIG1vZHVsZSBcdmVyYnxpcGlwfCBmb3IgYm90aCBkaXJlY3Rpb25zIG9mIHR1bm5lbGluZworYW5kIGZvciBhbGwgSVBJUCB0dW5uZWwgZGV2aWNlcy4KKworXGl0ZW0KK1E6IFx2ZXJifHRyYWNlcm91dGV8IGRvZXMgbm90IHdvcmsgb3ZlciB0dW5uZWwhIFdlbGwsIHN0b3AuLi4gSXQgd29ya3MsCisgICAgIG9ubHkgc2tpcHMgc29tZSBudW1iZXIgb2YgaG9wcy4KKworQTogWWVzLiBCeSBkZWZhdWx0IHR1bm5lbCBkcml2ZXIgY29waWVzIFx2ZXJifHR0bHwgdmFsdWUgZnJvbQoraW5uZXIgcGFja2V0IHRvIG91dGVyIG9uZS4gSXQgbWVhbnMgdGhhdCBwYXRoIHRyYXZlcnNlZCBieSB0dW5uZWxlZAorcGFja2V0cyB0byBhbm90aGVyIGVuZHBvaW50IGlzIG5vdCBoaWRkZW4uIElmIHlvdSBkaXNsaWtlIHRoaXMsIG9yIGlmIHlvdQorYXJlIGdvaW5nIHRvIHVzZSBzb21lIHJvdXRpbmcgcHJvdG9jb2wgZXhwZWN0aW5nIHRoYXQgcGFja2V0cword2l0aCB0dGwgMSB3aWxsIHJlYWNoIHBlZXJpbmcgaG9zdCAoZi5lLlwgUklQLCBPU1BGIG9yIEVCR1ApCithbmQgeW91IGFyZSBub3QgYWZyYWlkIG9mCit0dW5uZWwgbG9vcHMsIHlvdSBtYXkgYXBwZW5kIG9wdGlvbiBcdmVyYnx0dGwgNjR8LCB3aGVuIGNyZWF0aW5nIHR1bm5lbAord2l0aCBcdmVyYnxpcCB0dW5uZWwgYWRkfC4KKworXGl0ZW0KK1E6IC4uLiBXZWxsLCBsaXN0IG9mIHRoaW5ncywgd2hpY2ggMi4wIHdhcyBhYmxlIHRvIGRvIGZpbmlzaGVzLgorCitcZW5ke2l0ZW1pemV9CisKK1xwYXJhZ3JhcGh7U3VtbWFyeSBvZiBkaWZmZXJlbmNlcyBiZXR3ZWVuIDIuMiBhbmQgMi4wLn0KKworXGJlZ2lue2l0ZW1pemV9CisKK1xpdGVtIHtcYmYgSW4gMi4wfSB5b3UgY291bGQgY29tcGlsZSB0dW5uZWwgZGV2aWNlIGludG8ga2VybmVsCisJYW5kIGdvdCBzZXQgb2YgNCBkZXZpY2VzIFx2ZXJifHR1bmwwfCAuLi4gXHZlcmJ8dHVubDN8IG9yLAorCWFsdGVybmF0aXZlbHksIGNvbXBpbGUgaXQgYXMgbW9kdWxlIGFuZCBsb2FkIG5ldyBtb2R1bGUKKwlmb3IgZWFjaCBuZXcgdHVubmVsLiBBbHNvLCBtb2R1bGUgXHZlcmJ8aXBpcHwgd2FzIG5lY2Vzc2FyeQorCXRvIHJlY2VpdmUgdHVubmVsZWQgcGFja2V0cy4KKworICAgICAge1xiZiAyLjJ9IGhhcyB7XGVtIG9uZVwvfSBtb2R1bGUgXHZlcmJ8aXBpcHwuIExvYWRpbmcgaXQgeW91IGdldCBiYXNlCisJdHVubmVsIGRldmljZSBcdmVyYnx0dW5sMHwgYW5kIGFub3RoZXIgdHVubmVscyBtYXkgYmUgY3JlYXRlZCB3aXRoIGNvbW1hbmQKKwlcdmVyYnxpcCB0dW5uZWwgYWRkfC4gVGhlc2UgbmV3IGRldmljZXMgbWF5IGhhdmUgYXJiaXRyYXJ5IG5hbWVzLgorCisKK1xpdGVtIHtcYmYgSW4gMi4wfSB5b3Ugc2V0IHJlbW90ZSB0dW5uZWwgZW5kcG9pbnQgYWRkcmVzcyB3aXRoCisJdGhlIGNvbW1hbmQgXHZlcmJ8aWZjb25maWd8IC4uLiBcdmVyYnxwb2ludG9wb2ludCBBfC4KKworCXtcYmYgSW4gMi4yfSB0aGlzIGNvbW1hbmQgaGFzIHRoZSBzYW1lIHNlbWFudGljcyBvbiBhbGwKKwl0aGUgaW50ZXJmYWNlcywgbmFtZWx5IGl0IHNldHMgbm90IHR1bm5lbCBlbmRwb2ludCwKKwlidXQgYWRkcmVzcyBvZiBwZWVyaW5nIGhvc3QsIHdoaWNoIGlzIGRpcmVjdGx5IHJlYWNoYWJsZQorCXZpYSB0aGlzIHR1bm5lbCwKKwlyYXRoZXIgdGhhbiB2aWEgSW50ZXJuZXQuIEFjdHVhbCB0dW5uZWwgZW5kcG9pbnQgYWRkcmVzcyBcdmVyYnxBfAorCXNob3VsZCBiZSBzZXQgd2l0aCBcdmVyYnxpcCB0dW5uZWwgYWRkIC4uLiByZW1vdGUgQXwuCisKK1xpdGVtIHtcYmYgSW4gMi4wfSB5b3UgY3JlYXRlIHR1bm5lbCByb3V0ZXMgd2l0aCB0aGUgY29tbWFuZDoKK1xiZWdpbnt2ZXJiYXRpbX0KKyAgICByb3V0ZSBhZGQgLW5ldCAxMC4wLjAuMCBndyBBIGRldiB0dW5sMAorXGVuZHt2ZXJiYXRpbX0KKworCXtcYmYgMi4yfSBpbnRlcnByZXRzIHRoaXMgY29tbWFuZCBlcXVhbGx5IGZvciBhbGwgZGV2aWNlCisJa2luZHMgYW5kIGdhdGV3YXkgaXMgcmVxdWlyZWQgdG8gYmUgZGlyZWN0bHkgcmVhY2hhYmxlIHZpYSB0aGlzIHR1bm5lbCwKKwlyYXRoZXIgdGhhbiB2aWEgSW50ZXJuZXQuIFlvdSBzdGlsbCBtYXkgdXNlIFx2ZXJifGlwIHJvdXRlIGFkZCAuLi4gb25saW5rfAorCXRvIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3VyLgorCitcZW5ke2l0ZW1pemV9CisKKworXHNlY3Rpb257VHVubmVsIHNldHVwOiBiYXNpY3N9CisKK1N0YW5kYXJkIExpbnV4LTIuMiBrZXJuZWwgc3VwcG9ydHMgdGhyZWUgZmxhdm9yIG9mIHR1bm5lbHMsCitsaXN0ZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZToKK1x2c3BhY2V7Mm1tfQorCitcYmVnaW57dGFidWxhcn17bGxsfQorXHZydWxlIGRlcHRoIDAuOGV4IHdpZHRoIDBwdFxyZWxheAorTW9kZSAmIERlc2NyaXB0aW9uICAmIEJhc2UgZGV2aWNlIFxcCitpcGlwICYgSVAgb3ZlciBJUCAmIHR1bmwwIFxcCitzaXQgJiBJUHY2IG92ZXIgSVAgJiBzaXQwIFxcCitncmUgJiBBTlkgb3ZlciBHUkUgb3ZlciBJUCAmIGdyZTAKK1xlbmR7dGFidWxhcn0KKworXHZzcGFjZXsybW19CisKK1xub2luZGVudCBBbGwgdGhlIGtpbmRzIG9mIHR1bm5lbHMgYXJlIGNyZWF0ZWQgd2l0aCBvbmUgY29tbWFuZDoKK1xiZWdpbnt2ZXJiYXRpbX0KKyAgaXAgdHVubmVsIGFkZCA8TkFNRT4gbW9kZSA8TU9ERT4gWyBsb2NhbCA8Uz4gXSBbIHJlbW90ZSA8RD4gXQorXGVuZHt2ZXJiYXRpbX0KKworVGhpcyBjb21tYW5kIGNyZWF0ZXMgbmV3IHR1bm5lbCBkZXZpY2Ugd2l0aCBuYW1lIFx2ZXJifDxOQU1FPnwuCitUaGUgXHZlcmJ8PE5BTUU+fCBpcyBhbiBhcmJpdHJhcnkgc3RyaW5nLiBQYXJ0aWN1bGFybHksCitpdCBtYXkgYmUgZXZlbiBcdmVyYnxldGgwfC4gVGhlIHJlc3Qgb2YgcGFyYW1ldGVycyBzZXQKK2RpZmZlcmVudCB0dW5uZWwgY2hhcmFjdGVyaXN0aWNzLgorCitcYmVnaW57aXRlbWl6ZX0KKworXGl0ZW0KK1x2ZXJifG1vZGUgPE1PREU+fCBzZXRzIHR1bm5lbCBtb2RlLiBUaHJlZSBtb2RlcyBhcmUgYXZhaWxhYmxlIG5vdworCVx2ZXJifGlwaXB8LCBcdmVyYnxzaXR8IGFuZCBcdmVyYnxncmV8LgorCitcaXRlbQorXHZlcmJ8cmVtb3RlIDxEPnwgc2V0cyByZW1vdGUgZW5kcG9pbnQgb2YgdGhlIHR1bm5lbCB0byBJUAorCWFkZHJlc3MgXHZlcmJ8PEQ+fC4KK1xpdGVtCitcdmVyYnxsb2NhbCA8Uz58IHNldHMgZml4ZWQgbG9jYWwgYWRkcmVzcyBmb3IgdHVubmVsZWQKKwlwYWNrZXRzLiBJdCBtdXN0IGJlIGFuIGFkZHJlc3Mgb24gYW5vdGhlciBpbnRlcmZhY2Ugb2YgdGhpcyBob3N0LgorCitcZW5ke2l0ZW1pemV9CisKK1xsZXRcdGhlZm9vdG5vdGVcb2xkdGhlZm9vdG5vdGUKKworQm90aCBcdmVyYnxyZW1vdGV8IGFuZCBcdmVyYnxsb2NhbHwgbWF5IGJlIG9taXR0ZWQuIEluIHRoaXMgY2FzZSB3ZQorc2F5IHRoYXQgdGhleSBhcmUgemVybyBvciB3aWxkY2FyZC4gVHdvIHR1bm5lbHMgb2Ygb25lIG1vZGUgY2Fubm90CitoYXZlIHRoZSBzYW1lIFx2ZXJifHJlbW90ZXwgYW5kIFx2ZXJifGxvY2FsfC4gUGFydGljdWxhcmx5IGl0IG1lYW5zCit0aGF0IGJhc2UgZGV2aWNlIG9yIGZhbGxiYWNrIHR1bm5lbCBjYW5ub3QgYmUgcmVwbGljYXRlZC5cZm9vdG5vdGV7CitUaGlzIHJlc3RyaWN0aW9uIGlzIHJlbGF4ZWQgZm9yIGtleWVkIEdSRSB0dW5uZWxzLn0KKworVHVubmVscyBhcmUgZGl2aWRlZCB0byB0d28gY2xhc3Nlczoge1xiZiBwb2ludG9wb2ludH0gdHVubmVscywgd2hpY2gKK2hhdmUgc29tZSBub3Qgd2lsZGNhcmQgXHZlcmJ8cmVtb3RlfCBhZGRyZXNzIGFuZCBkZWxpdmVyIGFsbCB0aGUgcGFja2V0cwordG8gdGhpcyBkZXN0aW5hdGlvbiwgYW5kIHtcYmYgTkJNQX0gKGkuZS4gTm9uLUJyb2FkY2FzdCBNdWx0aS1BY2Nlc3MpIHR1bm5lbHMsCit3aGljaCBoYXZlIG5vIFx2ZXJifHJlbW90ZXwuIFBhcnRpY3VsYXJseSwgYmFzZSBkZXZpY2VzIChmLmUuXCBcdmVyYnx0dW5sMHwpCithcmUgTkJNQSwgYmVjYXVzZSB0aGV5IGhhdmUgbmVpdGhlciBcdmVyYnxyZW1vdGV8IG5vcgorXHZlcmJ8bG9jYWx8IGFkZHJlc3Nlcy4KKworCitBZnRlciB0dW5uZWwgZGV2aWNlIGlzIGNyZWF0ZWQgeW91IHNob3VsZCBjb25maWd1cmUgaXQgYXMgeW91IGRpZAoraXQgd2l0aCBhbm90aGVyIGRldmljZXMuIENlcnRhaW5seSwgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdHVubmVscyBoYXMKK3NvbWUgZmVhdHVyZXMgcmVsYXRlZCB0byB0aGUgZmFjdCB0aGF0IHRoZXkgd29yayBvdmVyIGV4aXN0aW5nIEludGVybmV0Cityb3V0aW5nIGluZnJhc3RydWN0dXJlIGFuZCBzaW11bHRhbmVvdXNseSBjcmVhdGUgbmV3IHZpcnR1YWwgbGlua3MsCit3aGljaCBjaGFuZ2VzIHRoaXMgaW5mcmFzdHJ1Y3R1cmUuIFRoZSBkYW5nZXIgdGhhdCBub3QgZW5vdWdoIGNhcmVmdWwKK3R1bm5lbCBzZXR1cCB3aWxsIHJlc3VsdCBpbiBmb3JtYXRpb24gb2YgdHVubmVsIGxvb3BzLAorY29sbGFwc2Ugb2Ygcm91dGluZyBvciBmbG9vZGluZyBuZXR3b3JrIHdpdGggZXhwb25lbnRpYWxseQorZ3Jvd2luZyBudW1iZXIgb2YgdHVubmVsZWQgZnJhZ21lbnRzIGlzIHZlcnkgcmVhbC4KKworCitQcm90b2NvbCBzZXR1cCBvbiBwb2ludG9wb2ludCB0dW5uZWxzIGRvZXMgbm90IGRpZmZlciBvZiBjb25maWd1cmF0aW9uCitvZiBhbm90aGVyIGRldmljZXMuIFlvdSBzaG91bGQgc2V0IGEgcHJvdG9jb2wgYWRkcmVzcyB3aXRoIFx2ZXJifGlmY29uZmlnfAorYW5kIGFkZCByb3V0ZXMgd2l0aCBcdmVyYnxyb3V0ZXwgdXRpbGl0eS4KKworTkJNQSB0dW5uZWxzIGFyZSBkaWZmZXJlbnQuIFRvIHJvdXRlIHNvbWV0aGluZyB2aWEgTkJNQSB0dW5uZWwKK3lvdSBoYXZlIHRvIGV4cGxhaW4gdG8gZHJpdmVyLCB3aGVyZSBpdCBzaG91bGQgZGVsaXZlciBwYWNrZXRzIHRvLgorVGhlIG9ubHkgd2F5IHRvIG1ha2UgaXQgaXMgdG8gY3JlYXRlIHNwZWNpYWwgcm91dGVzIHdpdGggZ2F0ZXdheQorYWRkcmVzcyBwb2ludGluZyB0byBkZXNpcmVkIGVuZHBvaW50LiBGLmUuXCAKK1xiZWdpbnt2ZXJiYXRpbX0KKyAgICBpcCByb3V0ZSBhZGQgMTAuMC4wLjAvMjQgdmlhIDxBPiBkZXYgdHVubDAgb25saW5rCitcZW5ke3ZlcmJhdGltfQorSXQgaXMgaW1wb3J0YW50IHRvIHVzZSBvcHRpb24gXHZlcmJ8b25saW5rfCwgb3RoZXJ3aXNlCitrZXJuZWwgd2lsbCByZWZ1c2UgcmVxdWVzdCB0byBjcmVhdGUgcm91dGUgdmlhIGdhdGV3YXkgbm90IGRpcmVjdGx5CityZWFjaGFibGUgb3ZlciBkZXZpY2UgXHZlcmJ8dHVubDB8LiBXaXRoIElQdjYgdGhlIHNpdHVhdGlvbiBpcyBtdWNoIHNpbXBsZXI6Cit3aGVuIHlvdSBzdGFydCBkZXZpY2UgXHZlcmJ8c2l0MHwsIGl0IGF1dG9tYXRpY2FsbHkgY29uZmlndXJlcyBpdHNlbGYKK3dpdGggYWxsIElQdjQgYWRkcmVzc2VzIG1hcHBlZCB0byBJUHY2IHNwYWNlLCBzbyB0aGF0IGFsbCBJUHY0CitJbnRlcm5ldCBpcyB7XGVtIHJlYWxseSByZWFjaGFibGV9IHZpYSBcdmVyYnxzaXQwfCEgRXhjZWxsZW50LCB0aGUgY29tbWFuZAorXGJlZ2lue3ZlcmJhdGltfQorICAgIGlwIHJvdXRlIGFkZCAzRkZFOjovMTYgdmlhIDo6MTkzLjIzMy43LjY1IGRldiBzaXQwCitcZW5ke3ZlcmJhdGltfQord2lsbCByb3V0ZSBcdmVyYnwzRkZFOjovMTZ8IHZpYSBcdmVyYnxzaXQwfCwgc2VuZGluZyBhbGwgdGhlIHBhY2tldHMKK2Rlc3RpbmVkIHRvIHRoaXMgcHJlZml4IHRvIDE5My4yMzMuNy42NS4KKworXHNlY3Rpb257VHVubmVsIHNldHVwOiBvcHRpb25zfQorCitDb21tYW5kIFx2ZXJifGlwIHR1bm5lbCBhZGR8IGhhcyBzZXZlcmFsIGFkZGl0aW9uYWwgb3B0aW9ucy4KK1xiZWdpbntpdGVtaXplfQorCitcaXRlbSBcdmVyYnx0dGwgTnwgLS0tIHNldCBmaXhlZCBUVEwgXHZlcmJ8Tnwgb24gdHVubmVsZWQgcGFja2V0cy4KKwlcdmVyYnxOfCBpcyBudW1iZXIgaW4gdGhlIHJhbmdlIDEtLTI1NS4gMCBpcyBzcGVjaWFsIHZhbHVlLAorCW1lYW5pbmcgdGhhdCBwYWNrZXRzIGluaGVyaXQgVFRMIHZhbHVlLiAKKwkJRGVmYXVsdCB2YWx1ZSBpczogXHZlcmJ8aW5oZXJpdHwuCisKK1xpdGVtIFx2ZXJifHRvcyBUfCAtLS0gc2V0IGZpeGVkIHRvcyBcdmVyYnxUfCBvbiB0dW5uZWxlZCBwYWNrZXRzLgorCQlEZWZhdWx0IHZhbHVlIGlzOiBcdmVyYnxpbmhlcml0fC4KKworXGl0ZW0gXHZlcmJ8ZGV2IERFVnwgLS0tIGJpbmQgdHVubmVsIHRvIGRldmljZSBcdmVyYnxERVZ8LCBzbyB0aGF0CisJdHVubmVsZWQgcGFja2V0cyB3aWxsIGJlIHJvdXRlZCBvbmx5IHZpYSB0aGlzIGRldmljZSBhbmQgd2lsbAorCW5vdCBiZSBhYmxlIHRvIGVzY2FwZSB0byBhbm90aGVyIGRldmljZSwgd2hlbiByb3V0ZSB0byBlbmRwb2ludCBjaGFuZ2VzLgorCitcaXRlbSBcdmVyYnxub3BtdHVkaXNjfCAtLS0gZGlzYWJsZSBQYXRoIE1UVSBEaXNjb3Zlcnkgb24gdGhpcyB0dW5uZWwuCisJSXQgaXMgZW5hYmxlZCBieSBkZWZhdWx0LiBOb3RlIHRoYXQgZml4ZWQgdHRsIGlzIGluY29tcGF0aWJsZQorCXdpdGggdGhpcyBvcHRpb246IHR1bm5lbHMgd2l0aCBmaXhlZCB0dGwgYWx3YXlzIG1ha2UgcG10dSBkaXNjb3ZlcnkuCisKK1xlbmR7aXRlbWl6ZX0KKworXHZlcmJ8aXBpcHwgYW5kIFx2ZXJifHNpdHwgdHVubmVscyBoYXZlIG5vIG1vcmUgb3B0aW9ucy4gXHZlcmJ8Z3JlfAordHVubmVscyBhcmUgbW9yZSBjb21wbGljYXRlZDoKKworXGJlZ2lue2l0ZW1pemV9CisKK1xpdGVtIFx2ZXJifGtleSBLfCAtLS0gdXNlIGtleWVkIEdSRSB3aXRoIGtleSBcdmVyYnxLfC4gXHZlcmJ8S3wgaXMKKwllaXRoZXIgbnVtYmVyIG9yIElQIGFkZHJlc3MtbGlrZSBkb3R0ZWQgcXVhZC4KKworXGl0ZW0gXHZlcmJ8Y3N1bXwgLS0tIGNoZWNrc3VtIHR1bm5lbGVkIHBhY2tldHMuCisKK1xpdGVtIFx2ZXJifHNlcXwgLS0tIHNlcmlhbGl6ZSBwYWNrZXRzLgorXGJlZ2lue05CfQorCUkgdGhpbmsgdGhpcyBvcHRpb24gZG9lcyBub3QKKwl3b3JrLiBBdCBsZWFzdCwgSSBkaWQgbm90IHRlc3QgaXQsIGRpZCBub3QgZGVidWcgaXQgYW5kCisJZXZlbiBkbyBub3QgdW5kZXJzdGFuZCwJaG93IGl0IGlzIHN1cHBvc2VkIHRvIHdvcmsgYW5kIGZvciB3aGF0CisJcHVycG9zZSBDaXNjbyBwbGFubmVkIHRvIHVzZSBpdC4KK1xlbmR7TkJ9CisKK1xlbmR7aXRlbWl6ZX0KKworCitBY3R1YWxseSwgdGhlc2UgR1JFIG9wdGlvbnMgY2FuIGJlIHNldCBzZXBhcmF0ZWx5IGZvciBpbnB1dCBhbmQKK291dHB1dCBkaXJlY3Rpb25zIGJ5IHByZWZpeGluZyBjb3JyZXNwb25kaW5nIGtleXdvcmRzIHdpdGggbGV0dGVyCitcdmVyYnxpfCBvciBcdmVyYnxvfC4gRi5lLlwgXHZlcmJ8aWNzdW18IG9yZGVycyB0byBhY2NlcHQgb25seQorcGFja2V0cyB3aXRoIGNvcnJlY3QgY2hlY2tzdW0gYW5kIFx2ZXJifG9jc3VtfCBtZWFucywgdGhhdAorb3VyIGhvc3Qgd2lsbCBjYWxjdWxhdGUgYW5kIHNlbmQgY2hlY2tzdW0uCisKK0NvbW1hbmQgXHZlcmJ8aXAgdHVubmVsIGFkZHwgaXMgbm90IHRoZSBvbmx5IG9wZXJhdGlvbiwKK3doaWNoIGNhbiBiZSBtYWRlIHdpdGggdHVubmVscy4gQ2VydGFpbmx5LCB5b3UgbWF5IGdldCBzaG9ydCBoZWxwIHBhZ2UKK3dpdGg6CitcYmVnaW57dmVyYmF0aW19CisgICAgaXAgdHVubmVsIGhlbHAKK1xlbmR7dmVyYmF0aW19CisKK0Jlc2lkZXMgdGhhdCwgeW91IG1heSB2aWV3IGxpc3Qgb2YgaW5zdGFsbGVkIHR1bm5lbHMgd2l0aCB0aGUgaGVscCBvZiBjb21tYW5kOgorXGJlZ2lue3ZlcmJhdGltfQorICAgIGlwIHR1bm5lbCBscworXGVuZHt2ZXJiYXRpbX0KK0Fsc28geW91IG1heSBsb29rIGF0IHN0YXRpc3RpY3M6CitcYmVnaW57dmVyYmF0aW19CisgICAgaXAgLXMgdHVubmVsIGxzIENpc2NvCitcZW5ke3ZlcmJhdGltfQord2hlcmUgXHZlcmJ8Q2lzY298IGlzIG5hbWUgb2YgdHVubmVsIGRldmljZS4gQ29tbWFuZAorXGJlZ2lue3ZlcmJhdGltfQorICAgIGlwIHR1bm5lbCBkZWwgQ2lzY28KK1xlbmR7dmVyYmF0aW19CitkZXN0cm95cyB0dW5uZWwgXHZlcmJ8Q2lzY298LiBBbmQsIGZpbmFsbHksCitcYmVnaW57dmVyYmF0aW19CisgICAgaXAgdHVubmVsIGNoYW5nZSBDaXNjbyBtb2RlIHNpdCBsb2NhbCBNRSByZW1vdGUgSEUgdHRsIDMyCitcZW5ke3ZlcmJhdGltfQorY2hhbmdlcyBpdHMgcGFyYW1ldGVycy4KKworXHNlY3Rpb257RGlmZmVyZW5jZXMgMi4yIGFuZCAyLjAgdHVubmVscyByZXZpc2l0ZWQufQorCitOb3cgd2UgY2FuIGRpc2N1c3MgbW9yZSBzdWJ0bGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0dW5uZWxpbmcgaW4gMi4wCithbmQgMi4yLgorCitcYmVnaW57aXRlbWl6ZX0KKworXGl0ZW0gSW4gMi4wIGFsbCB0dW5uZWxlZCBwYWNrZXRzIHdlcmUgcmVjZWl2ZWQgcHJvbWlzY3VvdXNseQorYXMgc29vbiBhcyB5b3UgbG9hZGVkIG1vZHVsZSBcdmVyYnxpcGlwfC4gMi4yIHRyaWVzIHRvIHNlbGVjdCB0aGUgYmVzdAordHVubmVsIGRldmljZSBhbmQgcGFja2V0IGxvb2tzIGFzIHJlY2VpdmVkIG9uIHRoaXMuIEYuZS5cIGlmIGhvc3QKK3JlY2VpdmVkIFx2ZXJifGlwaXB8IHBhY2tldCBmcm9tIGhvc3QgXHZlcmJ8RHwgZGVzdGluZWQgdG8gb3VyCitsb2NhbCBhZGRyZXNzIFx2ZXJifFN8LCBrZXJuZWwgc2VhcmNoZXMgZm9yIG1hdGNoaW5nIHR1bm5lbHMKK2luIG9yZGVyOgorCitcYmVnaW57dGFidWxhcn17bGx9CisxICYgXHZlcmJ8cmVtb3RlfCBpcyBcdmVyYnxEfCBhbmQgXHZlcmJ8bG9jYWx8IGlzIFx2ZXJifFN8IFxcCisyICYgXHZlcmJ8cmVtb3RlfCBpcyBcdmVyYnxEfCBhbmQgXHZlcmJ8bG9jYWx8IGlzIHdpbGRjYXJkIFxcCiszICYgXHZlcmJ8cmVtb3RlfCBpcyB3aWxkY2FyZCBhbmQgXHZlcmJ8bG9jYWx8IGlzIFx2ZXJifFN8IFxcCis0ICYgXHZlcmJ8dHVubDB8CitcZW5ke3RhYnVsYXJ9CisKK0lmIHR1bm5lbCBleGlzdHMsIGJ1dCBpdCBpcyBub3QgaW4gXHZlcmJ8VVB8IHN0YXRlLCB0aGUgdHVubmVsIGlzIGlnbm9yZWQuCitOb3RlLCB0aGF0IGlmIFx2ZXJifHR1bmwwfCBpcyBcdmVyYnxVUHwgaXQgcmVjZWl2ZXMgYWxsIHRoZSBJUElQIHBhY2tldHMsCitub3QgYWNrbm93bGVkZ2VkIGJ5IG1vcmUgc3BlY2lmaWMgdHVubmVscy4KK0JlIGNhcmVmdWwsIGl0IG1lYW5zIHRoYXQgd2l0aG91dCBjYXJlZnVsbHkgaW5zdGFsbGVkIGZpcmV3YWxsIHJ1bGVzCithbnlvbmUgb24gdGhlIEludGVybmV0IG1heSBpbmplY3QgdG8geW91ciBuZXR3b3JrIGFueSBwYWNrZXRzIHdpdGgKK3NvdXJjZSBhZGRyZXNzZXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBsb2NhbCBvbmVzLiBJdCBpcyBub3Qgc28gYmFkIGlkZWEKK3RvIGRlc2lnbiB0dW5uZWxzIGluIHRoZSB3YXkgZW5mb3JjaW5nIG1heGltYWwgcm91dGUgc3ltbWV0cnkKK2FuZCB0byBlbmFibGUgcmV2ZXJzZWQgcGF0aCBmaWx0ZXIgKFx2ZXJifHJwX2ZpbHRlcnwgc3lzY3RsIG9wdGlvbikgb24KK3R1bm5lbCBkZXZpY2VzLgorCitcaXRlbSBJbiAyLjIgeW91IGNhbiBtb25pdG9yIGFuZCBkZWJ1ZyB0dW5uZWxzIHdpdGggXHZlcmJ8dGNwZHVtcHwuCitGLmUuXCBcdmVyYnx0Y3BkdW1wfCBcdmVyYnwtaSBDaXNjb3wgXHZlcmJ8LW52dnwgd2lsbCBkdW1wIHBhY2tldHMsCit3aGljaCBrZXJuZWwgb3V0cHV0LCB2aWEgdHVubmVsIFx2ZXJifENpc2NvfCBhbmQgdGhlIHBhY2tldHMgcmVjZWl2ZWQgb24gaXQKK2Zyb20ga2VybmVsIHZpZXdwb2ludC4KKworXGVuZHtpdGVtaXplfQorCisKK1xzZWN0aW9ue0xpbnV4IGFuZCBDaXNjbyBJT1MgdHVubmVscy59CisKK0Ftb25nIGFub3RoZXIgdHVubmVscyBDaXNjbyBJT1Mgc3VwcG9ydHMgSVBJUCBhbmQgR1JFLgorRXNzZW50aWFsbHksIENpc2NvIHNldHVwIGlzIHN1YnNldCBvZiBvcHRpb25zLCBhdmFpbGFibGUgZm9yIExpbnV4LgorTGV0IHVzIGNvbnNpZGVyIHRoZSBzaW1wbGVzdCBleGFtcGxlOgorCitcYmVnaW57dmVyYmF0aW19CitpbnRlcmZhY2UgVHVubmVsMAorIHR1bm5lbCBtb2RlIGdyZSBpcAorIHR1bm5lbCBzb3VyY2UgMTAuMTAuMTQuMQorIHR1bm5lbCBkZXN0aW5hdGlvbiAxMC4xMC4xMy4yCitcZW5ke3ZlcmJhdGltfQorCisKK1RoaXMgY29tbWFuZCBzZXQgdHJhbnNsYXRlcyB0bzoKKworXGJlZ2lue3ZlcmJhdGltfQorICAgIGlwIHR1bm5lbCBhZGQgVHVubmVsMCBcCisgICAgICAgIG1vZGUgZ3JlIFwKKyAgICAgICAgbG9jYWwgMTAuMTAuMTQuMSBcCisgICAgICAgIHJlbW90ZSAxMC4xMC4xMy4yCitcZW5ke3ZlcmJhdGltfQorCitBbnkgcXVlc3Rpb25zPyBObyBxdWVzdGlvbnMuCisKK1xzZWN0aW9ue0ludGVyYWN0aW9uIElQSVAgdHVubmVscyBhbmQgRFZNUlAufQorCitEVk1SUCBleHBsb2l0cyBJUElQIHR1bm5lbHMgdG8gcm91dGUgbXVsdGljYXN0cyB2aWEgSW50ZXJuZXQuCitcdmVyYnxtcm91dGVkfCBjcmVhdGVzCitJUElQIHR1bm5lbHMgbGlzdGVkIGluIGl0cyBjb25maWd1cmF0aW9uIGZpbGUgYXV0b21hdGljYWxseS4KK0Zyb20ga2VybmVsIGFuZCB1c2VyIHZpZXdwb2ludHMgdGhlcmUgYXJlIG5vIGRpZmZlcmVuY2VzIGJldHdlZW4KK3R1bm5lbHMsIGNyZWF0ZWQgaW4gdGhpcyB3YXksIGFuZCB0dW5uZWxzIGNyZWF0ZWQgYnkgXHZlcmJ8aXAgdHVubmVsfC4KK0kuZS5cIGlmIFx2ZXJifG1yb3V0ZWR8IGNyZWF0ZWQgc29tZSB0dW5uZWwsIGl0IG1heSBiZSB1c2VkIHRvCityb3V0ZSB1bmljYXN0IHBhY2tldHMsIHByb3ZpZGVkIGFwcHJvcHJpYXRlIHJvdXRlcyBhcmUgYWRkZWQuCitBbmQgdmljZSB2ZXJzYSwgaWYgYWRtaW5pc3RyYXRvciBoYXMgYWxyZWFkeSBjcmVhdGVkIGEgdHVubmVsLAoraXQgd2lsbCBiZSByZXVzZWQgYnkgXHZlcmJ8bXJvdXRlZHwsIGlmIGl0IHJlcXVlc3RzIERWTVJQCit0dW5uZWwgd2l0aCB0aGUgc2FtZSBsb2NhbCBhbmQgcmVtb3RlIGFkZHJlc3Nlcy4KKworRG8gbm90IHdvbmRlciwgaWYgeW91ciBtYW51YWxseSBjb25maWd1cmVkIHR1bm5lbCBpcworZGVzdHJveWVkLCB3aGVuIG1yb3V0ZWQgZXhpdHMuCisKKworXHNlY3Rpb257QnJvYWRjYXN0IEdSRSBgYHR1bm5lbHMnJy59CisKK0l0IGlzIHBvc3NpYmxlIHRvIHNldCBcdmVyYnxyZW1vdGV8IGZvciBHUkUgdHVubmVsIHRvIGEgbXVsdGljYXN0CithZGRyZXNzLiBTdWNoIHR1bm5lbCBiZWNvbWVzIHtcYmYgYnJvYWRjYXN0fSB0dW5uZWwgKHRob3VnaCB3b3JkCit0dW5uZWwgaXMgbm90IHF1aXRlIGFwcHJvcHJpYXRlIGluIHRoaXMgY2FzZSwgaXQgaXMgcmF0aGVyIHZpcnR1YWwgbmV0d29yaykuCitcYmVnaW57dmVyYmF0aW19CisgIGlwIHR1bm5lbCBhZGQgVW5pdmVyc2UgbG9jYWwgMTkzLjIzMy43LjY1IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGUgMjI0LjY2LjY2LjY2IHR0bCAxNgorICBpcCBhZGRyIGFkZCAxMC4wLjAuMS8xNiBkZXYgVW5pdmVyc2UKKyAgaXAgbGluayBzZXQgVW5pdmVyc2UgdXAKK1xlbmR7dmVyYmF0aW19CitUaGlzIHR1bm5lbCBpcyB0cnVlIGJyb2FkY2FzdCBuZXR3b3JrIGFuZCBicm9hZGNhc3QgcGFja2V0cyBhcmUKK3NlbnQgdG8gbXVsdGljYXN0IGdyb3VwIDIyNC42Ni42Ni42Ni4gQnkgZGVmYXVsdCBzdWNoIHR1bm5lbCBzdGFydHMKK3RvIHJlc29sdmUgYm90aCBJUCBhbmQgSVB2NiBhZGRyZXNzZXMgdmlhIEFSUC9ORElTQywgc28gdGhhdAoraWYgbXVsdGljYXN0IHJvdXRpbmcgaXMgc3VwcG9ydGVkIGluIHN1cnJvdW5kaW5nIG5ldHdvcmssIGFsbCBHUkUgbm9kZXMKK3dpbGwgZmluZCBvbmUgYW5vdGhlciBhdXRvbWF0aWNhbGx5IGFuZCB3aWxsIGZvcm0gdmlydHVhbCBFdGhlcm5ldC1saWtlCiticm9hZGNhc3QgbmV0d29yay4gSWYgbXVsdGljYXN0IHJvdXRpbmcgZG9lcyBub3Qgd29yaywgaXQgaXMgdW5wbGVhc2FudAorYnV0IG5vdCBmYXRhbCBmbGF3LiBUaGUgdHVubmVsIGJlY29tZXMgTkJNQSByYXRoZXIgdGhhbiBicm9hZGNhc3QgbmV0d29yay4KK1lvdSBtYXkgZGlzYWJsZSBkeW5hbWljIEFSUGluZyBieToKK1xiZWdpbnt2ZXJiYXRpbX0KKyAgZWNobyAwID4gL3Byb2Mvc3lzL25ldC9pcHY0L25laWdoL1VuaXZlcnNlL21jYXN0X3NvbGljaXQKK1xlbmR7dmVyYmF0aW19CithbmQgdG8gYWRkIHJlcXVpcmVkIGluZm9ybWF0aW9uIHRvIEFSUCB0YWJsZXMgbWFudWFsbHk6CitcYmVnaW57dmVyYmF0aW19CisgIGlwIG5laWdoIGFkZCAxMC4wLjAuMiBsbGFkZHIgMTI4LjYuMTkwLjIgZGV2IFVuaXZlcnNlIG51ZCBwZXJtYW5lbnQKK1xlbmR7dmVyYmF0aW19CitJbiB0aGlzIGNhc2UgcGFja2V0cyBzZW50IHRvIDEwLjAuMC4yIHdpbGwgYmUgZW5jYXBzdWxhdGVkIGluIEdSRQorYW5kIHNlbnQgdG8gMTI4LjYuMTkwLjIuIEl0IGlzIHBvc3NpYmxlIHRvIGZhY2lsaXRhdGUgYWRkcmVzcyByZXNvbHV0aW9uCit1c2luZyBtZXRob2RzIHR5cGljYWwgZm9yIGFub3RoZXIgTkJNQSBuZXR3b3JrcyBmLmUuXCB0byBzdGFydCB1c2VyCitsZXZlbCBcdmVyYnxhcnBkfCBkYWVtb24sIHdoaWNoIHdpbGwgbWFpbnRhaW4gZGF0YWJhc2Ugb2YgaG9zdHMgYXR0YWNoZWQKK3RvIEdSRSB2aXJ0dWFsIG5ldHdvcmsgb3IgYXNrIGZvciBpbmZvcm1hdGlvbgorZGVkaWNhdGVkIEFSUCBvciBOSFJQIHNlcnZlci4KKworCitBY3R1YWxseSwgc3VjaCBzZXR1cCBpcyB0aGUgbW9zdCBuYXR1cmFsIGZvciB0dW5uZWxpbmcsCitpdCBpcyByZWFsbHkgZmxleGlibGUsIHNjYWxhYmxlIGFuZCBlYXNpbHkgbWFuYWdhYmxlLCBzbyB0aGF0CitpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBiZSB1c2VkIHdpdGggR1JFIHR1bm5lbHMgaW5zdGVhZCBvZiB1Z2x5CitoYWNrIHdpdGggTkJNQSBtb2RlIGFuZCBcdmVyYnxvbmxpbmt8IG1vZGlmaWVyLiBVbmZvcnR1bmF0ZWx5LAorYnkgaGlzdG9yaWNhbCByZWFzb25zIGJyb2FkY2FzdCBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgSVBJUCB0dW5uZWxzLAorYnV0IHRoaXMgcHJvYmFibHkgd2lsbCBjaGFuZ2UgaW4gZnV0dXJlLgorCisKKworXHNlY3Rpb257VHJhZmZpYyBjb250cm9sIGlzc3Vlcy59CisKK1R1bm5lbHMgYXJlIGRldmljZXMsIGhlbmNlIGFsbCB0aGUgcG93ZXIgb2YgTGludXggdHJhZmZpYyBjb250cm9sCithcHBsaWVzIHRvIHRoZW0uIFRoZSBzaW1wbGVzdCAoYW5kIHRoZSBtb3N0IHVzZWZ1bCBpbiBwcmFjdGljZSkKK2V4YW1wbGUgaXMgbGltaXRpbmcgdHVubmVsIGJhbmR3aWR0aC4gVGhlIGZvbGxvd2luZyBjb21tYW5kOgorXGJlZ2lue3ZlcmJhdGltfQorICAgIHRjIHFkaXNjIGFkZCBkZXYgdHVubDAgcm9vdCB0YmYgXAorICAgICAgICByYXRlIDEyOEtiaXQgYnVyc3QgNEsgbGltaXQgMTBLCitcZW5ke3ZlcmJhdGltfQord2lsbCBsaW1pdCB0dW5uZWxlZCB0cmFmZmljIHRvIDEyOEtiaXQgd2l0aCBtYXhpbWFsIGJ1cnN0IHNpemUgb2YgNEsKK2FuZCBxdWV1aW5nIG5vdCBtb3JlIHRoYW4gMTBLLgorCitIb3dldmVyLCB5b3Ugc2hvdWxkIHJlbWVtYmVyLCB0aGF0IHR1bm5lbHMgYXJlIHtcZW0gdmlydHVhbH0gZGV2aWNlcworaW1wbGVtZW50ZWQgaW4gc29mdHdhcmUgYW5kIHRydWUgcXVldWUgbWFuYWdlbWVudCBpcyBpbXBvc3NpYmxlIGZvciB0aGVtCitqdXN0IGJlY2F1c2UgdGhleSBoYXZlIG5vIHF1ZXVlcy4gSW5zdGVhZCwgaXQgaXMgYmV0dGVyIHRvIGNyZWF0ZSBjbGFzc2VzCitvbiByZWFsIHBoeXNpY2FsIGludGVyZmFjZXMgYW5kIHRvIG1hcCB0dW5uZWxlZCBwYWNrZXRzIHRvIHRoZW0uCitJbiBnZW5lcmFsIGNhc2Ugb2YgZHluYW1pYyByb3V0aW5nIHlvdSBzaG91bGQgY3JlYXRlIHN1Y2ggY2xhc3Nlcworb24gYWxsIG91dGdvaW5nIGludGVyZmFjZXMsIG9yLCBhbHRlcm5hdGl2ZWx5LAordG8gdXNlIG9wdGlvbiBcdmVyYnxkZXYgREVWfCB0byBiaW5kIHR1bm5lbCB0byBhIGZpeGVkIHBoeXNpY2FsIGRldmljZS4KK0luIHRoZSBsYXN0IGNhc2UgcGFja2V0cyB3aWxsIGJlIHJvdXRlZCBvbmx5IHZpYSBzcGVjaWZpZWQgZGV2aWNlCithbmQgeW91IG5lZWQgdG8gc2V0dXAgY29ycmVzcG9uZGluZyBjbGFzc2VzIG9ubHkgb24gaXQuCitUaG91Z2ggeW91IGhhdmUgdG8gcGF5IGZvciB0aGlzIGNvbnZlbmllbmNlLAoraWYgcm91dGluZyB3aWxsIGNoYW5nZSwgeW91ciB0dW5uZWwgd2lsbCBmYWlsLgorCitTdXBwb3NlIHRoYXQgQ0JRIGNsYXNzIFx2ZXJifDE6QUJDfCBoYXMgYmVlbiBjcmVhdGVkIG9uIGRldmljZSBcdmVyYnxldGgwfCAKK3NwZWNpYWxseSBmb3IgdHVubmVsIFx2ZXJifENpc2NvfCB3aXRoIGVuZHBvaW50cyBcdmVyYnxTfCBhbmQgXHZlcmJ8RHwuCitOb3cgeW91IGNhbiBzZWxlY3QgSVBJUCBwYWNrZXRzIHdpdGggYWRkcmVzc2VzIFx2ZXJifFN8IGFuZCBcdmVyYnxEfAord2l0aCBzb21lIGNsYXNzaWZpZXIgYW5kIG1hcCB0aGVtIHRvIGNsYXNzIFx2ZXJifDE6QUJDfC4gRi5lLlwgCitpdCBpcyBlYXN5IHRvIG1ha2Ugd2l0aCBcdmVyYnxyc3ZwfCBjbGFzc2lmaWVyOgorXGJlZ2lue3ZlcmJhdGltfQorICAgIHRjIGZpbHRlciBhZGQgZGV2IGV0aDAgcHJlZiAxMDAgcHJvdG8gaXAgcnN2cCBcCisgICAgICAgIHNlc3Npb24gRCBpcHByb3RvIGlwaXAgZmlsdGVyIFMgXAorICAgICAgICBjbGFzc2lkIDE6QUJDCitcZW5ke3ZlcmJhdGltfQorCitJZiB5b3Ugd2FudCB0byBtYWtlIG1vcmUgZGV0YWlsZWQgY2xhc3NpZmljYXRpb24gb2Ygc3ViLWZsb3dzCit0cmFuc21pdHRlZCB2aWEgdHVubmVsLCB5b3UgY2FuIGJ1aWxkIENCUSBzdWJ0cmVlLAorcm9vdGVkIGF0IFx2ZXJifDE6QUJDfCBhbmQgYXR0YWNoIHRvIHN1YnJvb3Qgc2V0IG9mIHJ1bGVzIHBhcnNpbmcKK0lQSVAgcGFja2V0cyBtb3JlIGRlZXBseS4KKworXGVuZHtkb2N1bWVudH0KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2RvYy9uc3RhdC5zZ21sIGIvaXByb3V0ZTIvZG9jL25zdGF0LnNnbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhjYWNjNgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2RvYy9uc3RhdC5zZ21sCkBAIC0wLDAgKzEsMTEwIEBACis8IWRvY3R5cGUgbGludXhkb2Mgc3lzdGVtPgorCis8YXJ0aWNsZT4KKworPHRpdGxlPk5TVEFULCBJRlNUQVQgYW5kIFJUQUNDVCBVdGlsaXRpZXMKKzxhdXRob3I+QWxleGV5IEt1em5ldHNvdiwgPHR0L2t1em5ldEBtczIuaW5yLmFjLnJ1LworPGRhdGU+c29tZV9uZWdhdGl2ZV9udW1iZXIsIDIwIFNlcCAyMDAxCis8YWJzdHJhY3Q+Cis8dHQvbnN0YXQvLCA8dHQvaWZzdGF0LyBhbmQgPHR0L3J0YWNjdC8gYXJlIHNpbXBsZSB0b29scyBoZWxwaW5nCit0byBtb25pdG9yIGtlcm5lbCBzbm1wIGNvdW50ZXJzIGFuZCBuZXR3b3JrIGludGVyZmFjZSBzdGF0aXN0aWNzLgorPC9hYnN0cmFjdD4KKworPHA+IFRoZXNlIHV0aWxpdGllcyBhcmUgdmVyeSBzaW1pbGFyLCBzbyB0aGF0IEkgZGVzY3JpYmUKK3RoZW0gc2ltdWx0YW5lb3VzbHksIHVzaW5nIG5hbWUgPHR0L1hzdGF0LyBpbiB0aGUgcGxhY2VzIHdoaWNoIGFwcGx5Cit0byBhbGwgb2YgdGhlbS4KKworPHA+VGhlIGZvcm1hdCBvZiB0aGUgY29tbWFuZCBpczoKKworPHRzY3JlZW4+PHZlcmI+CisgICAgICAgWHN0YXQgWyBPUFRJT05TIF0gWyBQQVRURVJOIFsgUEFUVEVSTiAuLi4gXSBdCis8L3ZlcmI+PC90c2NyZWVuPgorCis8cD4KKzx0dC9QQVRURVJOLyBpcyBzaGVsbCBzdHlsZSBwYXR0ZXJuLCBzZWxlY3RpbmcgaWRlbnRpZmllcgorb2YgU05NUCB2YXJpYWJsZXMgb3IgaW50ZXJmYWNlcyB0byBzaG93LiBWYXJpYWJsZSBpcyBkaXNwbGF5ZWQKK2lmIG9uZSBvZiBwYXR0ZXJucyBtYXRjaGVzIGl0cyBuYW1lLiBJZiBubyBwYXR0ZXJucyBhcmUgZ2l2ZW4sCis8dHQvWHN0YXQvIGFzc3VtZXMgdGhhdCB1c2VyIHdhbnRzIHRvIHNlZSBhbGwgdGhlIHZhcmlhYmxlcy4gIAorCis8cD4gPHR0L09QVElPTlMvIGlzIGxpc3Qgb2Ygc2luZ2xlIGxldHRlciBvcHRpb25zLCB1c2luZyBjb21tb24gdW5peAorY29udmVudGlvbnMuCisKKzxpdGVtaXplPgorPGl0ZW0+PHR0Ly1oLyAgLSBzaG93IGhlbHAgcGFnZQorPGl0ZW0+PHR0Ly0/LyAgLSB0aGUgc2FtZSwgb2YgY291cnNlCis8aXRlbT48dHQvLXYvLCA8dHQvLVYvICAtIHByaW50IHZlcnNpb24gb2YgPHR0L1hzdGF0LyBhbmQgZXhpdAorPGl0ZW0+PHR0Ly16LyAtIGR1bXAgemVybyBjb3VudGVycyB0b28uIEJ5IGRlZmF1bHQgdGhleSBhcmUgbm90IHNob3duLgorPGl0ZW0+PHR0Ly1hLyAtIGR1bXAgYWJzb2x1dGUgdmFsdWVzIG9mIGNvdW50ZXJzLiBCeSBkZWZhdWx0IDx0dC9Yc3RhdC8KKyAgICAgICAgICAgICAgICBjYWxjdWxhdGVzIGluY3JlbWVudHMgc2luY2UgdGhlIHByZXZpb3VzIHVzZS4KKzxpdGVtPjx0dC8tcy8gLSBkbyBub3QgdXBkYXRlIGhpc3RvcnksIHNvIHRoYXQgdGhlIG5leHQgdGltZSB5b3Ugd2lsbAorICAgICAgICAgICAgICAgIHNlZSBjb3VudGVycyBpbmNsdWRpbmcgdmFsdWVzIGFjY3VtdWxhdGVkIHRvIHRoZSBtb21lbnQKKyAgICAgICAgICAgICAgICBvZiB0aGlzIG1lYXN1cmVtZW50IHRvby4KKzxpdGVtPjx0dC8tbi8gLSBkbyBub3QgZGlzcGxheSBhbnl0aGluZywgb25seSB1cGRhdGUgaGlzdG9yeS4KKzxpdGVtPjx0dC8tci8gLSByZXNldCBoaXN0b3J5LgorPGl0ZW0+PHR0Ly1kIElOVEVSVkFMLyAtIDx0dC9Yc3RhdC8gaXMgcnVuIGluIGRhZW1vbiBtb2RlIGNvbGxlY3RpbmcKKyAgICAgICAgICAgICAgICBzdGF0aXN0aWNzLiA8dHQvSU5URVJWQUwvIGlzIGludGVydmFsIGJldHdlZW4gbWVhc3VyZW1lbnRzCisgICAgICAgICAgICAgICAgaW4gc2Vjb25kcy4KKzxpdGVtPjx0dC8tdCBJTlRFUlZBTC8gLSB0aW1lIGludGVydmFsIHRvIGF2ZXJhZ2UgcmF0ZXMuIERlZmF1bHQgdmFsdWUKKyAgICAgICAgICAgICAgICBpcyA2MCBzZWNvbmRzLiAKKzxpdGVtPjx0dC8tZS8gLSBkaXNwbGF5IGV4dGVuZGVkIGluZm9ybWF0aW9uIGFib3V0IGVycm9ycyAoPHR0L2lmc3RhdC8gb25seSkuCis8L2l0ZW1pemU+CisKKzxwPgorSGlzdG9yeSBpcyBqdXN0IGR1bXAgc2F2ZWQgaW4gZmlsZSA8dHQ+L3RtcC8uWHN0YXQudVVJRDwvdHQ+CitvciBpbiBmaWxlIGdpdmVuIGJ5IGVudmlyb25tZW50IHZhcmlhYmxlcyA8dHQvTlNUQVRfSElTVE9SWS8sCis8dHQvSUZTVEFUX0hJU1RPUlkvIGFuZCA8dHQvUlRBQ0NUX0hJU1RPUlkvLgorRWFjaCB0aW1lIHdoZW4geW91IHVzZSA8dHQvWHN0YXQvIHZhbHVlcyB0aGVyZSBhcmUgdXBkYXRlZC4KK0lmIHlvdSB1c2UgcGF0dGVybnMsIG9ubHkgdGhlIHZhbHVlcyB3aGljaCB5b3UgX3JlYWxseV8gc2VlCithcmUgdXBkYXRlZC4gSWYgeW91IHdhbnQgdG8gc2tpcCBhbiB1bmludGVyc3RpbmcgcGVyaW9kLAordXNlIG9wdGlvbiA8dHQvLW4vLCBvciBqdXN0IG91dHB1dCB0byA8dHQ+L2Rldi9udWxsPC90dD4uCisKKzxwPgorPHR0L1hzdGF0LyB1bmRlcnN0YW5kcyB3aGVuIGhpc3RvcnkgaXMgaW52YWxpZGF0ZWQgYnkgc3lzdGVtIHJlYm9vdAorb3Igc291cmNlIG9mIGluZm9ybWF0aW9uIHN3aXRjaGVkIGJldHdlZW4gZGlmZmVyZW50IGluc3RhbmNlcworb2YgZGFlbW9uaWMgPHR0L1hzdGF0LyBhbmQga2VybmVsIFNOTVAgdGFibGVzIGFuZCBkb2VzIG5vdAordXNlIGludmFsaWQgaGlzdG9yeS4KKworPHA+IEJld2FyZSwgPHR0L1hzdGF0LyB3aWxsIG5vdCBwcm9kdWNlIHNhbmUgb3V0cHV0LAord2hlbiBtYW55IHByb2Nlc3NlcyB1c2UgaXQgc2ltdWx0YW5lb3VzbHkuIElmIHNldmVyYWwgcHJvY2Vzc2VzCit1bmRlciBzaW5nbGUgdXNlciBuZWVkIHRoaXMgdXRpbGl0eSB0aGV5IHNob3VsZCB1c2UgZW52aXJvbm1lbnQKK3ZhcmlhYmxlcyB0byBwdXQgdGhlaXIgaGlzdG9yeSBpbiBzYWZlIHBsYWNlcworb3IgdG8gdXNlIGl0IHdpdGggb3B0aW9ucyA8dHQvLWEgLXMvLgorCis8cD4KK1dlbGwsIHRoYXQncyBhbGwuIFRoZSB1dGlsaXR5IGlzIHZlcnkgc2ltcGxlLCBidXQgbmV2ZXJ0aGVsZXNzCit2ZXJ5IGhhbmR5LgorCis8cD4gPGJmL091dHB1dCBvZiBYU1RBVC8KKzxwPiBUaGUgZmlyc3QgbGluZSBvZiBvdXRwdXQgaXMgPHR0LyMvIGZvbGxvd2VkIGJ5IGlkZW50aWZpZXIKK29mIHNvdXJjZSBvZiBpbmZvcm1hdGlvbiwgaXQgbWF5IGJlIHdvcmQgPHR0L2tlcm5lbC8sIHdoZW4gPHR0L1hzdGF0LworZ2V0cyBpbmZvcm1hdGlvbiBmcm9tIGtlcm5lbCBvciBzb21lIGRvdHRlZCBkZWNpbWFsIG51bWJlciBmb2xsb3dlZAorYnkgcGFyYW1ldGVycywgd2hlbiBpdCBvYnRhaW5zIGluZm9ybWF0aW9uIGZyb20gcnVubmluZyA8dHQvWHN0YXQvIGRhZW1vbi4KKworPHA+SW4gdGhlIGNhc2Ugb2YgPHR0L25zdGF0LyB0aGUgcmVzdCBvZiBvdXRwdXQgY29uc2lzdHMgb2YgdGhyZWUgY29sdW1uczoKK1NOTVAgTUlCIGlkZW50aWZpZXIsCitpdHMgdmFsdWUgKG9yIGluY3JlbWVudCBzaW5jZSBwcmV2aW91cyBtZWFzdXJlbWVudCkgYW5kIGF2ZXJhZ2UKK3JhdGUgb2YgaW5jcmVhc2Ugb2YgdGhlIGNvdW50ZXIgcGVyIHNlY29uZC4gPHR0L2lmc3RhdC8gb3V0cHV0cworaW50ZXJmYWNlIG5hbWUgZm9sbG93ZWQgYnkgcGFpcnMgb2YgY291bnRlciBhbmQgcmF0ZSBvZiBpdHMgY2hhbmdlLgorCis8cD4gPGJmL0RhZW1vbmljIFhzdGF0LworPHA+IDx0dC9Yc3RhdC8gbWF5IGJlIHN0YXJ0ZWQgYXMgZGFlbW9uIGJ5IGFueSB1c2VyLiBUaGlzIG1ha2VzIHNlbnNlCit0byBhdm9pZCB3cmFwcGVkIGNvdW50ZXJzIGFuZCB0byBvYnRhaW4gcmVhc29uYWJsZSBsb25nIGNvdW50ZXJzCitmb3IgbGFyZ2UgdGltZS4gQWxzbyA8dHQvWHN0YXQvIGRhZW1vbiBjYWxjdWxhdGVzIGF2ZXJhZ2UgcmF0ZXMuCitGb3IgdGhlIGZpcnN0IGdvYWwgc2FtcGxpbmcgaW50ZXJ2YWwgKG9wdGlvbiA8dHQvLWQvKSBtYXkgYmUgbGFyZ2UgZW5vdWdoLAorZi5lLiBmb3IgZ2lnYWJpdCByYXRlcyBieXRlIGNvdW50ZXJzIG92ZXJmbG93IG5vdCBtb3JlIGZyZXF1ZW50bHkgdGhhbgorZWFjaCA0MCBzZWNvbmRzIGFuZCB5b3UgbWF5IHNlbGVjdCBpbnRlcnZhbCBvZiAyMCBzZWNvbmRzLgorRnJvbSB0aGUgb3RoZXIgaGFuZCwgd2hlbiA8dHQvWHN0YXQvIGlzIHVzZWQgZm9yIGVzdGltYXRpbmcgcmF0ZXMKK2ludGVydmFsIHNob3VsZCBiZSBsZXNzIHRoYW4gYXZlcmFnaW5nIHBlcmlvZCAob3B0aW9uIDx0dC8tdC8pLCBvdGhlcndpc2UKK2VzdGltYXRpb24gbG9zZXMgaW4gcXVhbGl0eS4KKworQ2xpZW50IDx0dC9Yc3RhdC8sIGJlZm9yZSB0cnlpbmcgdG8gZ2V0IGluZm9ybWF0aW9uIGZyb20gdGhlIGtlcm5lbCwKK2NvbnRhY3RzIGRhZW1vbiBzdGFydGVkIGJ5IHRoaXMgdXNlciwgdGhlbiBpdCB0cmllcyBzeXN0ZW0gd2lkZQorZGFlbW9uLCB3aGljaCBpcyBzdXBwb3NlZCB0byBiZSBzdGFydGVkIGJ5IHN1cGVydXNlci4gQW5kIG9ubHkgaWYKK25vbmUgb2YgdGhlbSByZXBsaWVkIGl0IGdldHMgaW5mb3JtYXRpb24gZnJvbSBrZXJuZWwuCisKKzxwPiA8YmYvRW52aXJvbm1lbnQvCis8cD4gPHR0L05TVEFUX0hJU1RPUlkvIC0gbmFtZSBvZiBoaXN0b3J5IGZpbGUgZm9yIDx0dC9uc3RhdC8uCis8cD4gPHR0L0lGU1RBVF9ISVNUT1JZLyAtIG5hbWUgb2YgaGlzdG9yeSBmaWxlIGZvciA8dHQvaWZzdGF0Ly4KKzxwPiA8dHQvUlRBQ0NUX0hJU1RPUlkvIC0gbmFtZSBvZiBoaXN0b3J5IGZpbGUgZm9yIDx0dC9ydGFjY3QvLgorCis8L2FydGljbGU+CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9kb2MvcHJlYW1ibGUudGV4IGIvaXByb3V0ZTIvZG9jL3ByZWFtYmxlLnRleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGNhNTA4Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvZG9jL3ByZWFtYmxlLnRleApAQCAtMCwwICsxLDI2IEBACitcdGV4dHdpZHRoICAgNi4waW4KK1x0ZXh0aGVpZ2h0ICA4LjVpbgorCitcaW5wdXQgU05BUFNIT1QKKworXHBhZ2VzdHlsZXtteWhlYWRpbmdzfQorXG1hcmtib3Roe1xwcm90ZWN0XFRJVExFfXt9CitcbWFya3JpZ2h0e3tccHJvdGVjdFxzYyBpcHJvdXRlMi1zc1xEcmFmdH19CisKKyUgVG8gcHJpbnQgaXQgaW4gY29tcGFjdCBmb3JtOiBib3RoIHNpZGVzIG9uIG9uZSBzaGVldCAocHNudXAgLTIpCitcZXZlbnNpZGVtYXJnaW49XG9kZHNpZGVtYXJnaW4KKworXG5ld2Vudmlyb25tZW50e05CfXtcYmdyb3VwIFx2c2tpcCAxbW1cbGVmdHNraXAgMWNtIFxmb290bm90ZXNpemUgXG5vaW5kZW50IE5CLgorfXtccGFyXGVncm91cCBcdnNraXAgMW1tfQorCitcZGVmXHRocmVlb25seXtbMi4zLjE1KyBvbmx5XSB9CisKK1xiZWdpbntkb2N1bWVudH0KKworXG1ha2VhdGxldHRlcgorXHJlbmV3Y29tbWFuZHtcQG9kZGhlYWR9e3tccHJvdGVjdFxzYyBpcHJvdXRlMi1zc1xEcmFmdH0gXGhmaWxsIFxwcm90ZWN0XGFyYWJpY3twYWdlfX0KK1xtYWtlYXRvdGhlcgorXGxldFxvbGR0aGVmb290bm90ZVx0aGVmb290bm90ZQorXGRlZlx0aGVmb290bm90ZXt9CitcZm9vdG5vdGV0ZXh0e0NvcHlyaWdodCBcY29weXJpZ2h0fjE5OTkgQS5OLkt1em5ldHNvdn0KKwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvZG9jL3J0c3RhdC5zZ21sIGIvaXByb3V0ZTIvZG9jL3J0c3RhdC5zZ21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MzkxYzMKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9kb2MvcnRzdGF0LnNnbWwKQEAgLTAsMCArMSw1MiBAQAorPCFkb2N0eXBlIGxpbnV4ZG9jIHN5c3RlbT4KKworPGFydGljbGU+CisKKzx0aXRsZT5SVEFDQ1QgVXRpbGl0eQorPGF1dGhvcj5Sb2JlcnQgT2xzc29uCis8ZGF0ZT5zb21lX25lZ2F0aXZlX251bWJlciwgMjAgRGVjIDIwMDEKKworPHA+CitIZXJlIGlzIHNvbWUgY29kZSBmb3IgbW9uaXRvcmluZyB0aGUgcm91dGUgY2FjaGUuIEZvciBzeXN0ZW1zIGhhbmRsaW5nIGhpZ2gKK25ldHdvcmsgbG9hZCwgc2VydmVycywgcm91dGVycywgZmlyZXdhbGxzIGV0YyB0aGUgcm91dGUgY2FjaGUgYW5kIGl0cyBnYXJiYWdlCitjb2xsZWN0aW9uIGlzIGNydWNpYWwuIExpbnV4IGhhcyBhIHNvbGlkIGltcGxlbWVudGF0aW9uLgorCis8cD4KK1RoZSBrZXJuZWwgcGF0Y2ggKG5vdCByZXF1aXJlZCBzaW5jZSBsaW51eC0yLjQuNykgYWRkcyBzdGF0aXN0aWNzIGNvdW50ZXJzCitmcm9tIHJvdXRlIGNhY2hlIHByb2Nlc3MgaW50byAKKy9wcm9jL25ldC9ydF9jYWNoZV9zdGF0LiBBIGNvbXBhbmlvbiB1c2VyIG1vZGUgcHJvZ3JhbSBwcmVzZW50cyB0aGUgc3RhdGlzdGljcworaW4gYSB2bXN0YXQgb3IgaW9zdGF0IG1hbm5lci4gVGhlIHJhdGlvIGJldHdlZW4gY2FjaGUgaGl0cyBhbmQgbWlzc2VzIGdpdmVzIAordGhlIGZsb3cgbGVuZ3RoLgorCis8cD4KK0hvcGVmdWxseSBpdCBjYW4gaGVscCB1bmRlcnN0YW5kaW5nIHBlcmZvcm1hbmNlIGFuZCBEb1MgYW5kIG90aGVyIHJlbGF0ZWQKK2lzc3Vlcy4KKworPHA+IEFuIFVSTCB3aGVyZSBuZXdlciB2ZXJzaW9ucyBvZiB0aGlzIHV0aWxpdHkgY2FuIGJlIChwcm9iYWJseSkgZm91bmQKK2lzIGZ0cDovL3JvYnVyLnNsdS5zZS9wdWIvTGludXgvbmV0LWRldmVsb3BtZW50L3J0X2NhY2hlX3N0YXQvCisKKworPHA+PGJmL0Rlc2NyaXB0aW9uLworCis8cD5UaGUgZm9ybWF0IG9mIHRoZSBjb21tYW5kIGlzOgorCis8dHNjcmVlbj48dmVyYj4KKyAgICAgICBydHN0YXQgWyBPUFRJT05TIF0KKzwvdmVyYj48L3RzY3JlZW4+CisKKzxwPiA8dHQvT1BUSU9OUy8gYXJlOgorCis8aXRlbWl6ZT4KKworPGl0ZW0+PHR0Ly1oLywgPHR0Ly1oZWxwLyAtIHNob3cgaGVscCBwYWdlIGFuZCB2ZXJzaW9uIG9mIHRoZSB1dGlsaXR5LgorCis8aXRlbT48dHQvLWkgSU5URVJWQUwvIC0gaW50ZXJ2YWwgYmV0d2VlbiBzbmFwc2hvdHMsIGRlZmF1bHQgdmFsdWUgaXMKKzIgc2Vjb25kcy4KKworPGl0ZW0+PHR0Ly1zIE5VTUJFUi8gLSB3aGV0aGVyIHRvIHByaW50IGhlYWRlciBsaW5lLiAwIGluaGliaXRzIGhlYWRlciBsaW5lLAorMSBwcmVzY3JpYmVzIHRvIHByaW50IGl0IG9uY2UgYW5kIDIgKHRoaXMgaXMgZGVmYXVsdCBzZXR0aW5nKSBmb3JjZXMgaGVhZGVyCitsaW5lIGVhY2ggMjAgbGluZXMuIAorCis8L2l0ZW1pemU+CisKKzwvYXJ0aWNsZT4KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2RvYy9zcy5zZ21sIGIvaXByb3V0ZTIvZG9jL3NzLnNnbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAyNGI1NwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2RvYy9zcy5zZ21sCkBAIC0wLDAgKzEsNTI1IEBACis8IWRvY3R5cGUgbGludXhkb2Mgc3lzdGVtPgorCis8YXJ0aWNsZT4KKworPHRpdGxlPlNTIFV0aWxpdHk6IFF1aWNrIEludHJvCis8YXV0aG9yPkFsZXhleSBLdXpuZXRzb3YsIDx0dC9rdXpuZXRAbXMyLmluci5hYy5ydS8KKzxkYXRlPnNvbWVfbmVnYXRpdmVfbnVtYmVyLCAyMCBTZXAgMjAwMQorPGFic3RyYWN0PgorPHR0L3NzLyBpcyBvbmUgYW5vdGhlciB1dGlsaXR5IHRvIGludmVzdGlnYXRlIHNvY2tldHMuCitGdW5jdGlvbmFsbHkgaXQgaXMgTk9UIGJldHRlciB0aGFuIDx0dC9uZXRzdGF0LyBjb21iaW5lZAord2l0aCBzb21lIHBlcmwvYXdrIHNjcmlwdHMgYW5kIHRob3VnaCBpdCBpcyBzdXJlbHkgZmFzdGVyCitpdCBpcyBub3QgZW5vdWdoIHRvIG1ha2UgaXQgbXVjaCBiZXR0ZXIuIDotKQorU28sIHN0b3AgcmVhZGluZyB0aGlzIG5vdyBhbmQgZG8gbm90IHdhc3RlIHlvdXIgdGltZS4KK1dlbGwsIGNlcnRhaW5seSwgaXQgcHJvcG9zZXMgc29tZSBmdW5jdGlvbmFsaXR5LCB3aGljaCBjdXJyZW50CituZXRzdGF0IGlzIHN0aWxsIG5vdCBhYmxlIHRvIGRvLCBidXQgc3VyZWx5IHdpbGwgc29vbi4KKzwvYWJzdHJhY3Q+CisKKzxzZWN0PldoeT8KKworPHA+IDx0dD4vcHJvYzwvdHQ+IGludGVyZmFjZSBpcyBpbmFkZXF1YXRlLCB1bmZvcnR1bmF0ZWx5LgorV2hlbiBhbW91bnQgb2Ygc29ja2V0cyBpcyBlbm91Z2ggbGFyZ2UsIDx0dC9uZXRzdGF0LyBvciBldmVuCitwbGFpbiA8dHQ+Y2F0IC9wcm9jL25ldC90Y3AvPC90dD4gY2F1c2Ugbm90aGluZyBidXQgcGFpbnMgYW5kIGN1cnNlcy4KK0luIGxpbnV4LTIuNCB0aGUgZGVzZWFzZSBiZWNhbWUgd29yc2U6IGV2ZW4gaWYgYW1vdW50CitvZiBzb2NrZXRzIGlzIHNtYWxsIHJlYWRpbmcgPHR0Pi9wcm9jL25ldC90Y3AvPC90dD4gaXMgc2xvdyBlbm91Z2guCisKK1RoaXMgdXRpbGl0eSBwcmVzZW50cyBhIG5ldyBhcHByb2FjaCwgd2hpY2ggaXMgc3VwcG9zZWQgdG8gc2NhbGUKK3dlbGwuIEkgYW0gbm90IGdvaW5nIHRvIGRlc2NyaWJlIHRlY2huaWNhbCBkZXRhaWxzIGhlcmUgYW5kCit3aWxsIGNvbmNlbnRyYXRlIG9uIGRlc2NyaXB0aW9uIG9mIHRoZSBjb21tYW5kLgorVGhlIG9ubHkgaW1wb3J0YW50IHRoaW5nIHRvIHNheSBpcyB0aGF0IGl0IGlzIG5vdCBzbyBiYWQgaWRlYQordG8gbG9hZCBtb2R1bGUgPHR0L3RjcF9kaWFnLywgd2hpY2ggY2FuIGJlIGZvdW5kIGluIGRpcmVjdG9yeQorPHR0L01vZHVsZXMvIG9mIDx0dC9pcHJvdXRlMi8uIElmIHlvdSBkbyBub3QgbWFrZSB0aGlzIDx0dC9zcy8KK3dpbGwgd29yaywgYnV0IGl0IGZhbGxzIGJhY2sgdG8gPHR0Pi9wcm9jPC90dD4gYW5kIGJlY29tZXMgc2xvdworbGlrZSA8dHQvbmV0c3RhdC8sIHdlbGwsIGEgYml0IGZhc3RlciB5ZXQgKHNlZSBzZWN0aW9uICJTb21lIG51bWJlcnMiKS4gCisKKzxzZWN0Pk9sZCBuZXdzCisKKzxwPgorSW4gdGhlIHNpbXBsZXN0IGZvcm0gPHR0L3NzLyBpcyBlcXVpdmFsZW50IHRvIG5ldHN0YXQKK3dpdGggc29tZSBzbWFsbCBkZXZpYXRpb25zLgorCis8aXRlbWl6ZT4KKzxpdGVtPjx0dC9zcyAtdCAtYS8gZHVtcHMgYWxsIFRDUCBzb2NrZXRzCis8aXRlbT48dHQvc3MgLXUgLWEvIGR1bXBzIGFsbCBVRFAgc29ja2V0cworPGl0ZW0+PHR0L3NzIC13IC1hLyBkdW1wcyBhbGwgUkFXIHNvY2tldHMKKzxpdGVtPjx0dC9zcyAteCAtYS8gZHVtcHMgYWxsIFVOSVggc29ja2V0cworPC9pdGVtaXplPgorCis8cD4KK09wdGlvbiA8dHQvLW8vIHNob3dzIFRDUCB0aW1lcnMgc3RhdGUuCitPcHRpb24gPHR0Ly1lLyBzaG93cyBzb21lIGV4dGVuZGVkIGluZm9ybWF0aW9uLgorRXRjLiBldGMuIGV0Yy4gU2VlbXMsIGFsbCB0aGUgb3B0aW9ucyBvZiBuZXRzdGF0IHJlbGF0ZWQgdG8gc29ja2V0cworYXJlIHN1cHBvcnRlZC4gVGhvdWdoIG5vdCBBWC4yNSBhbmQgb3RoZXIgYml6YXJyZXMuIDotKQorSWYgc29tZW9uZSB3YW50cywgaGUgY2FuIG1ha2Ugc3VwcG9ydCBmb3IgZGVjbmV0IGFuZCBpcHguCitTb21lIHJ1ZGltZW50YXJ5IHN1cHBvcnQgZm9yIHRoZW0gaXMgYWxyZWFkeSBwcmVzZW50IGluIGlwcm91dGUyIGxpYnV0aWxzLAorYW5kIEkgd2lsbCBiZSBnbGFkIHRvIHNlZSB0aGVzZSBuZXcgbWVtYmVycy4KKworPHA+CitIb3dldmVyLCBzdGFuZGFyZCBmdW5jdGlvbmFsaXR5IGlzIGEgYml0IGRpZmZlcmVudDoKKworPHA+CitUaGUgZmlyc3Q6IHdpdGhvdXQgb3B0aW9uIDx0dC8tYS8gc29ja2V0cyBpbiBzdGF0ZXMKKzx0dC9USU1FLVdBSVQvIGFuZCA8dHQvU1lOLVJFQ1YvIGFyZSBza2lwcGVkIHRvby4KK0l0IGlzIG1vcmUgcmVhc29uYWJsZSBkZWZhdWx0LCBJIHRoaW5rLgorCis8cD4KK1RoZSBzZWNvbmQ6IGZvcm1hdCBvZiBVTklYIHNvY2tldHMgaXMgZGlmZmVyZW50LiBJdCBjb2luY2lkZXMKK3dpdGggdGNwL3VkcC4gVGhvdWdoIHN0YW5kYXJkIGtlcm5lbCBzdGlsbCBkb2VzIG5vdCBhbGxvdyB0bworc2VlIHdyaXRlL3JlYWQgcXVldWVzIGFuZCBwZWVyIGFkZHJlc3Mgb2YgY29ubmVjdGVkIFVOSVggc29ja2V0cywKK3RoZSBwYXRjaCBkb2luZyB0aGlzIGV4aXN0cy4KKworPHA+CitUaGUgdGhpcmQ6IGRlZmF1bHQgaXMgdG8gZHVtcCBvbmx5IFRDUCBzb2NrZXRzLCByYXRoZXIgdGhhbiBhbGwgb2YgdGhlIHR5cGVzLgorCis8cD4KK1RoZSBuZXh0OiBieSBkZWZhdWx0IGl0IGRvZXMgbm90IHJlc29sdmUgbnVtZXJpYyBob3N0IGFkZHJlc3NlcyAobGlrZSA8dHQvaXAvKSEKK1Jlc29sdmluZyBpcyBlbmFibGVkIHdpdGggb3B0aW9uIDx0dC8tci8uIFNlcnZpY2UgbmFtZXMsIHVzdWFsbHkgc3RvcmVkCitpbiBsb2NhbCBmaWxlcywgYXJlIHJlc29sdmVkIGJ5IGRlZmF1bHQuIEFsc28sIGlmIHNlcnZpY2UgZGF0YWJhc2UKK2RvZXMgbm90IGNvbnRhaW4gcmVmZXJlbmNlcyB0byBhIHBvcnQsIDx0dC9zcy8gcXVlcmllcyBzeXN0ZW0KKzx0dC9ycGNiaW5kLy4gUlBDIHNlcnZpY2VzIGFyZSBwcmVmaXhlZCB3aXRoIDx0dC9ycGMuLworUmVzb2x1dGlvbiBvZiBzZXJ2aWNlcyBtYXkgYmUgc3VwcHJlc3NlZCB3aXRoIG9wdGlvbiA8dHQvLW4vLgorCis8cD4KK0l0IGRvZXMgbm90IGFjY2VwdCAibG9uZyIgb3B0aW9ucyAoSSBkaXNsaWtlIHRoZW0sIHNvcnJ5KS4KK1NvLCBhZGRyZXNzIGZhbWlseSBpcyBnaXZlbiB3aXRoIGZhbWlseSBpZGVudGlmaWVyIGZvbGxvd2luZworb3B0aW9uIDx0dC8tZi8gdG8gYmUgYWxnaW5lZCB0byBpcHJvdXRlMiBjb252ZW50aW9ucy4KK01vc3RseSwgaXQgaXMgdG8gYWxsb3cgb3B0aW9uIHBhcnNlciB0byBwYXJzZQorYWRkcmVzc2VzIGNvcnJlY3RseSwgYnV0IGFzIHNpZGUgZWZmZWN0IGl0IHJlYWxseSBsaW1pdHMgZHVtcGluZwordG8gc29ja2V0cyBzdXBwb3J0aW5nIG9ubHkgZ2l2ZW4gZmFtaWx5LiBPcHRpb24gPHR0Ly1BLyBmb2xsb3dlZAorYnkgbGlzdCBvZiBzb2NrZXQgdGFibGVzIHRvIGR1bXAgaXMgYWxzbyBzdXBwb3J0ZWQuCitMb2dpY2FsbHksIGlkIG9mIHNvY2tldCB0YWJsZSBpcyBkaWZmZXJlbnQgb2YgX2FkZHJlc3NfIGZhbWlseSwgd2hpY2ggaXMKK2Fub3RoZXIgcG9pbnQgb2YgaW5jb21wYXRpYmlsaXR5LiBTbywgaWQgaXMgb25lIG9mCis8dHQvYWxsLywgPHR0L3RjcC8sIDx0dC91ZHAvLAorPHR0L3Jhdy8sIDx0dC9pbmV0LywgPHR0L3VuaXgvLCA8dHQvcGFja2V0LywgPHR0L25ldGxpbmsvLiBTZWU/CitXZWxsLCA8dHQvaW5ldC8gaXMganVzdCBhYmJyZXZpYXRpb24gZm9yIDx0dC90Y3B8dWRwfHJhdy8KK2FuZCBpdCBpcyBub3QgZGlmZmljdWx0IHRvIGd1ZXNzIHRoYXQgPHR0L3BhY2tldC8gYWxsb3dzCit0byBsb29rIGF0IHBhY2tldCBzb2NrZXRzLiBBY3R1YWxseSwgdGhlcmUgYXJlIGFsc28gc29tZSBvdGhlciBhYmJyZXZpYXRpb25zLAorZi5lLiA8dHQvdW5peF9kZ3JhbS8gc2VsZWN0cyBvbmx5IGRhdGFncmFtIFVOSVggc29ja2V0cy4KKworPHA+CitUaGUgbmV4dDogd2VsbCwgSSBzdGlsbCBkbyBub3Qga25vdy4gOi0pCisKKworCisKKzxzZWN0PlRpbWUgdG8gdGFsayBhYm91dCBuZXcgZnVuY3Rpb25hbGl0eS4KKworPHA+SXQgaXMgYnVpbHRpbiBmaWx0ZXJpbmcgb2Ygc29ja2V0IGxpc3RzLiAKKworPHNlY3QxPiBGaWx0ZXJpbmcgYnkgc3RhdGUuCisKKzxwPgorPHR0L3NzLyBhbGxvd3MgdG8gZmlsdGVyIHNvY2tldCBzdGF0ZXMsIHVzaW5nIGtleXdvcmRzCis8dHQvc3RhdGUvIGFuZCA8dHQvZXhjbHVkZS8sIGZvbGxvd2VkIGJ5IHNvbWUgc3RhdGUKK2lkZW50aWZpZXIuCisKKzxwPgorU3RhdGUgaWRlbnRpZmllciBhcmUgc3RhbmRhcmQgVENQIHN0YXRlIG5hbWVzIChub3QgbGlzdGVkLAordGhleSBhcmUgdXNlbGVzcyBmb3IgeW91IGlmIHlvdSBhbHJlYWR5IGRvIG5vdCBrbm93IHRoZW0pCitvciBhYmJyZXZpYXRpb25zOgorCis8aXRlbWl6ZT4KKzxpdGVtPjx0dC9hbGwvICAgICAgICAtIGZvciBhbGwgdGhlIHN0YXRlcworPGl0ZW0+PHR0L2J1Y2tldC8gICAgIC0gZm9yIFRDUCBtaW5pc29ja2V0cyAoPHR0L1RJTUUtV0FJVHxTWU4tUkVDVi8pCis8aXRlbT48dHQvYmlnLwkgICAgICAtIGFsbCBleGNlcHQgZm9yIG1pbmlzb2NrZXRzCis8aXRlbT48dHQvY29ubmVjdGVkLyAgLSBub3QgY2xvc2VkIGFuZCBub3QgbGlzdGVuaW5nCis8aXRlbT48dHQvc3luY2hyb25pemVkLyAtIGNvbm5lY3RlZCBhbmQgbm90IDx0dC9TWU4tU0VOVC8KKzwvaXRlbWl6ZT4KKworPHA+CisgICBGLmUuIHRvIGR1bXAgYWxsIHRjcCBzb2NrZXRzIGV4Y2VwdCA8dHQvU1lOLVJFQ1YvOgorCis8dHNjcmVlbj48dmVyYj4KKyAgIHNzIGV4Y2x1ZGUgU1lOLVJFQ1YKKzwvdmVyYj48L3RzY3JlZW4+CisKKzxwPgorICAgSWYgbmVpdGhlciA8dHQvc3RhdGUvIG5vciA8dHQvZXhjbHVkZS8gZGlyZWN0aXZlcworICAgYXJlIHByZXNlbnQsCisgICBzdGF0ZSBmaWx0ZXIgZGVmYXVsdHMgdG8gPHR0L2FsbC8gd2l0aCBvcHRpb24gPHR0Ly1hLworICAgb3IgdG8gPHR0L2FsbC8sCisgICBleGNsdWRpbmcgbGlzdGVuaW5nLCBzeW4tcmVjdiwgdGltZS13YWl0IGFuZCBjbG9zZWQgc29ja2V0cy4KKworPHNlY3QxPiBGaWx0ZXJpbmcgYnkgYWRkcmVzc2VzIGFuZCBwb3J0cy4KKworPHA+CitPcHRpb24gbGlzdCBtYXkgY29udGFpbiBhZGRyZXNzL3BvcnQgZmlsdGVyLgorSXQgaXMgYm9vbGVhbiBleHByZXNzaW9uIHdoaWNoIGNvbnNpc3RzIG9mIGJvb2xlYW4gb3BlcmF0aW9uCis8dHQvb3IvLCA8dHQvYW5kLywgPHR0L25vdC8gYW5kIHByZWRpY2F0ZXMuIAorQWN0dWFsbHksIGFsbCB0aGUgZmxhdm9ycyBvZiBuYW1lcyBmb3IgYm9vbGVhbiBvcGVyYXRpb25zIGFyZSBlYXRlbjoKKzx0dC8mYW1wLywgPHR0LyZhbXAmYW1wLywgPHR0L3wvLCA8dHQvfHwvLCA8dHQvIS8sIGJ1dCBkbyBub3QgZm9yZ2V0CithYm91dCBzcGVjaWFsIHNlbnNlIGdpdmVuIHRvIHRoZXNlIHN5bWJvbHMgYnkgdW5peCBzaGVsbHMgYW5kIGVzY2FwZQordGhlbSBjb3JyZWN0bHksIHdoZW4gdXNlZCBmcm9tIGNvbW1hbmQgbGluZS4KKworPHA+CitQcmVkaWNhdGVzIG1heSBiZSBvZiB0aGUgZm9sb3dpbmcga2luZHM6CisKKzxpdGVtaXplPgorPGl0ZW0+QS4gQWRkcmVzcy9wb3J0IG1hdGNoLCB3aGVyZSBhZGRyZXNzIGlzIGNoZWNrZWQgYWdhaW5zdCBtYXNrCisgICAgICBhbmQgcG9ydCBpcyBlaXRoZXIgd2lsZGNhcmQgb3IgZXhhY3QuIEl0IGlzIG9uZSBvZjoKKyAKKzx0c2NyZWVuPjx2ZXJiPgorCWRzdCBwcmVmaXg6cG9ydAorCXNyYyBwcmVmaXg6cG9ydAorCXNyYyB1bml4OlNUUklORworCXNyYyBsaW5rOnByb3RvY29sOmlmaW5kZXgKKwlzcmMgbmw6Y2hhbm5lbDpwaWQKKzwvdmVyYj48L3RzY3JlZW4+CisKKyAgICAgIEJvdGggcHJlZml4IGFuZCBwb3J0IG1heSBiZSBhYnNlbnQgb3IgcmVwbGFjZWQgd2l0aCA8dHQvKi8sCisgICAgICB3aGljaCBtZWFucyB3aWxkY2FyZC4gVU5JWCBzb2NrZXQgdXNlIG1vcmUgcG93ZXJmdWwgc2NoZW1lCisgICAgICBtYXRjaGluZyB0byBzb2NrZXQgbmFtZXMgYnkgc2hlbGwgd2lsZGNhcmRzLiBBbHNvLCBwcmVmaXhlcworICAgICAgdW5peDogYW5kIGxpbms6IG1heSBiZSBvbWl0dGVkLCBpZiBhZGRyZXNzIGZhbWlseSBpcyBldmlkZW50CisgICAgICBmcm9tIGNvbnRleHQgKHdpdGggb3B0aW9uIDx0dC8teC8gb3Igd2l0aCA8dHQvLWYgdW5peC8KKyAgICAgIG9yIHdpdGggPHR0L3VuaXgvIGtleXdvcmQpIAorCis8cD4KKyAgICAgIEYuZS4KKworPHRzY3JlZW4+PHZlcmI+CisJZHN0IDEwLjAuMC4xCisJZHN0IDEwLjAuMC4xOgorCWRzdCAxMC4wLjAuMS8zMjoKKwlkc3QgMTAuMC4wLjE6KgorPC92ZXJiPjwvdHNjcmVlbj4KKyAgIGFyZSBlcXVpdmFsZW50IGFuZCBtZWFuIHNvY2tldCBjb25uZWN0ZWQgdG8KKwkgICAgICAgICAgICAgICAgIGFueSBwb3J0IG9uIGhvc3QgMTAuMC4wLjEKKworPHRzY3JlZW4+PHZlcmI+CisJZHN0IDEwLjAuMC4wLzI0OjIyCis8L3ZlcmI+PC90c2NyZWVuPgorICAgc29ja2V0cyBjb25uZWN0ZWQgdG8gcG9ydCAyMiBvbiBuZXR3b3JrCisgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLjAuMC4wLi4uMjU1LgorCis8cD4KKyAgICAgIE5vdGUgdGhhdCBwb3J0IHNlcGFyYXRlZCBvZiBhZGRyZXNzIHdpdGggY29sb24sIHdoaWNoIGNyZWF0ZXMKKyAgICAgIHRyb3VibGVzIHdpdGggSVB2NiBhZGRyZXNzZXMuIEdlbmVyYWxseSwgd2UgaW50ZXJwcmV0IHRoZSBsYXN0CisgICAgICBjb2xvbiBhcyBzcGxpdHRpbmcgcG9ydC4gVG8gYWxsb3cgdG8gZ2l2ZSBJUHY2IGFkZHJlc3NlcywKKyAgICAgIHRyaWNrIGxpa2UgdXNlZCBpbiBJUHY2IEhUVFAgVVJMcyBtYXkgYmUgdXNlZDoKKworPHRzY3JlZW4+PHZlcmI+CisgICAgICBkc3QgWzo6MV0KKzwvdmVyYj48L3RzY3JlZW4+CisgICAgICAgYXJlIHNvY2tldHMgY29ubmVjdGVkIHRvIDo6MSBvbiBhbnkgcG9ydAorCis8cD4KKyAgICAgIEFub3RoZXIgd2F5IGlzIDx0dC9kc3QgOjoxLzEyOC8uIC8gaGVscHMgdG8gdW5kZXJzdGFuZCB0aGF0CisgICAgICBjb2xvbiBpcyBwYXJ0IG9mIElQdjYgYWRkcmVzcy4KKworPHA+CisgICAgICBOb3cgd2UgY2FuIGFkZCBhbm90aGVyIGFsaWFzIGZvciA8dHQvZHN0IDEwLjAuMC4xLzoKKyAgICAgIDx0dC9kc3QgWzEwLjAuMC4xXS8uIDotKQorCis8cD4gICBBZGRyZXNzIG1heSBiZSBhIEROUyBuYW1lLiBJbiB0aGlzIGNhc2UgYWxsIHRoZSBhZGRyZXNzZXMgYXJlIGxvb2tlZAorICAgICAgdXAgKGluIGFsbCB0aGUgYWRkcmVzcyBmYW1pbGllcywgaWYgaXQgaXMgbm90IGxpbWl0ZWQgYnkgb3B0aW9uIDx0dC8tZi8KKyAgICAgIG9yIHNwZWNpYWwgYWRkcmVzcyBwcmVmaXggPHR0L2luZXQ6LywgPHR0L2luZXQ2LykgYW5kIHJlc3VsdGluZworICAgICAgZXhwcmVzc2lvbiBpcyA8dHQvb3IvIG92ZXIgYWxsIG9mIHRoZW0uICAKKworPGl0ZW0+ICAgQi4gUG9ydCBleHByZXNzaW9uczoKKzx0c2NyZWVuPjx2ZXJiPgorICAgICAgZHBvcnQgJmd0PSA6MTAyNAorICAgICAgZHBvcnQgIT0gOjIyCisgICAgICBzcG9ydCAmbHQgOjMyMDAwCis8L3ZlcmI+PC90c2NyZWVuPgorICAgICAgZXRjLgorCisgICAgICBBbGwgdGhlIHJlbGF0aW9uczogPHR0LyZsdC8sIDx0dC8mZ3QvLCA8dHQvPS8sIDx0dC8+PS8sIDx0dC89LywgPHR0Lz09LywKKyAgICAgIDx0dC8hPS8sIDx0dC9lcS8sIDx0dC9nZS8sIDx0dC9sdC8sIDx0dC9uZS8uLi4KKyAgICAgIFVzZSB2YXJpYW50IHdoaWNoIHlvdSBsaWtlIG1vcmUsIGJ1dCBub3QgZm9yZ2V0IHRvIGVzY2FwZSBzcGVjaWFsCisgICAgICBjaGFyYWN0ZXJzIHdoZW4gdHlwaW5nIHRoZW0gaW4gY29tbWFuZCBsaW5lLiA6LSkgCisKKyAgICAgIE5vdGUgdGhhdCBwb3J0IG51bWJlciBzeW50YWN0aWNhbGx5IGNvaW5jaWRlcyB0byB0aGUgY2FzZSBBIQorICAgICAgWW91IG1heSBldmVuIGFkZCBhbiBJUCBhZGRyZXNzLCBidXQgaXQgd2lsbCBub3QgcGFydGljaXBhdGUKKyAgICAgIGluY29tcGFyaXNvbiwgZXhjZXB0IGZvciA8dHQvPT0vIGFuZCA8dHQvIT0vLCB3aGljaCBhcmUgZXF1aXZhbGVudAorICAgICAgdG8gY29ycmVzcG9uZGluZyBwcmVkaWNhdGVzIG9mIHR5cGUgQS4gRi5lLgorPHA+Cis8dHQvZHN0IDEwLjAuMC4xOjIyLworICAgIGlzIGVxdWl2YWxlbnQgdG8gIDx0dC9kcG9ydCBlcSAxMC4wLjAuMToyMi8KKyAgICAgIGFuZAorICAgICAgPHR0L25vdCBkc3QgMTAuMC4wLjE6MjIvICAgICBpcyBlcXVpdmFsZW50IHRvCisgPHR0L2Rwb3J0IG5lcSAxMC4wLjAuMToyMi8KKworPGl0ZW0+Qy4gS2V5d29yZCA8dHQvYXV0b2JvdW5kLy4gSXQgbWF0Y2hlcyB0byBzb2NrZXRzIGJvdW5kIGF1dG9tYXRpY2FsbHkKKyAgICAgIG9uIGxvY2FsIHN5c3RlbS4KKworPC9pdGVtaXplPgorCisKKzxzZWN0PiBFeGFtcGxlcworCis8cD4KKzxpdGVtaXplPgorPGl0ZW0+MS4gTGlzdCBhbGwgdGhlIHRjcCBzb2NrZXRzIGluIHN0YXRlIDx0dC9GSU4tV0FJVC0xLyBmb3Igb3VyIGFwYWNoZQorICAgdG8gbmV0d29yayAxOTMuMjMzLjcvMjQgYW5kIGxvb2sgYXQgdGhlaXIgdGltZXJzOgorCis8dHNjcmVlbj48dmVyYj4KKyAgIHNzIC1vIHN0YXRlIGZpbi13YWl0LTEgXCggc3BvcnQgPSA6aHR0cCBvciBzcG9ydCA9IDpodHRwcyBcKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCAxOTMuMjMzLjcvMjQKKzwvdmVyYj48L3RzY3JlZW4+CisKKyAgIE9vcHMsIGZvcmdvdCB0byBzYXkgdGhhdCBtaXNzaW5nIGxvZ2ljYWwgb3BlcmF0aW9uIGlzCisgICBlcXVpdmFsZW50IHRvIDx0dC9hbmQvLgorCis8aXRlbT4gMi4gV2VsbCwgbm93IGxvb2sgYXQgdGhlIHJlc3QuLi4KKworPHRzY3JlZW4+PHZlcmI+CisgICBzcyAtbyBleGNsIGZpbi13YWl0LTEKKyAgIHNzIHN0YXRlIGZpbi13YWl0LTEgXCggc3BvcnQgbmVxIDpodHRwIGFuZCBzcG9ydCBuZXEgOmh0dHBzIFwpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgb3Igbm90IGRzdCAxOTMuMjMzLjcvMjQKKzwvdmVyYj48L3RzY3JlZW4+CisKKyAgIE5vdGUgdGhhdCB3ZSBoYXZlIHRvIGRvIF90d29fIGNhbGxzIG9mIHNzIHRvIGRvIHRoaXMuCisgICBTdGF0ZSBtYXRjaCBpcyBhbHdheXMgYW5kZWQgdG8gYWRkcmVzcy9wb3J0IG1hdGNoLgorICAgVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyBwdXJlbHkgdGVjaG5pY2FsOiBzcyBkb2VzIGZhc3Qgc2tpcCBvZgorICAgbm90IG1hdGNoaW5nIHN0YXRlcyBiZWZvcmUgcGFyc2luZyBhZGRyZXNzZXMgYW5kIEkgY29uc2lkZXIgdGhlCisgICBhYmlsaXR5IHRvIHNraXAgZmFzdGx5IGdvYnMgb2YgdGltZS13YWl0IGFuZCBzeW4tcmVjdiBzb2NrZXRzCisgICBhcyBtb3JlIGltcG9ydGFudCB0aGFuIGxvZ2ljYWwgZ2VuZXJhbGl0eS4KKworPGl0ZW0+IDMuIFNvLCBsZXQncyBsb29rIGF0IGFsbCBvdXIgc29ja2V0cyB1c2luZyBhdXRvYm91bmQgcG9ydHM6CisKKzx0c2NyZWVuPjx2ZXJiPgorICAgc3MgLWEgLUEgYWxsIGF1dG9ib3VuZAorPC92ZXJiPjwvdHNjcmVlbj4KKworCis8aXRlbT4gNC4gQW5kIGV2ZW50dWFsbHkgZmluZCBhbGwgdGhlIGxvY2FsIHByb2Nlc3NlcyBjb25uZWN0ZWQKKyAgIHRvIGxvY2FsIFggc2VydmVyczoKKworPHRzY3JlZW4+PHZlcmI+CisgICBzcyAteHAgZHN0ICIvdG1wLy5YMTEtdW5peC8qIgorPC92ZXJiPjwvdHNjcmVlbj4KKworICAgUGFyZG9uLCB0aGlzIGRvZXMgbm90IHdvcmsgd2l0aCBjdXJyZW50IGtlcm5lbCwgcGF0Y2hpbmcgaXMgcmVxdWlyZWQuCisgICBCdXQgd2Ugc3RpbGwgY2FuIGxvb2sgYXQgc2VydmVyIHNpZGU6CisgICAKKzx0c2NyZWVuPjx2ZXJiPgorICAgc3MgLXggc3JjICIvdG1wLy5YMTEtdW5peC8qIgorPC92ZXJiPjwvdHNjcmVlbj4KKworPC9pdGVtaXplPgorCisKKzxzZWN0PiBSZXR1cm5pbmcgdG8gZ3JvdW5kOiByZWFsIG1hbnVhbCAgCisKKzxwPgorPHNlY3QxPiBDb21tYW5kIGFyZ3VtZW50cworCis8cD4gR2VuZXJhbCBmb3JtYXQgb2YgYXJndW1lbnRzIHRvIDx0dC9zcy8gaXM6CisKKzx0c2NyZWVuPjx2ZXJiPgorICAgICAgIHNzIFsgT1BUSU9OUyBdIFsgU1RBVEUtRklMVEVSIF0gWyBBRERSRVNTLUZJTFRFUiBdCis8L3ZlcmI+PC90c2NyZWVuPgorCis8c2VjdDI+PHR0L09QVElPTlMvCis8cD4gPHR0L09QVElPTlMvIGlzIGxpc3Qgb2Ygc2luZ2xlIGxldHRlciBvcHRpb25zLCB1c2luZyBjb21tb24gdW5peAorY29udmVudGlvbnMuCisKKzxpdGVtaXplPgorPGl0ZW0+PHR0Ly1oLyAgLSBzaG93IGhlbHAgcGFnZQorPGl0ZW0+PHR0Ly0/LyAgLSB0aGUgc2FtZSwgb2YgY291cnNlCis8aXRlbT48dHQvLXYvLCA8dHQvLVYvICAtIHByaW50IHZlcnNpb24gb2YgPHR0L3NzLyBhbmQgZXhpdAorPGl0ZW0+PHR0Ly1zLyAgLSBwcmludCBzdW1tYXJ5IHN0YXRpc3RpY3MuIFRoaXMgb3B0aW9uIGRvZXMgbm90IHBhcnNlCitzb2NrZXQgbGlzdHMgb2J0YWluaW5nIHN1bW1hcnkgZnJvbSB2YXJpb3VzIHNvdXJjZXMuIEl0IGlzIHVzZWZ1bAord2hlbiBhbW91bnQgb2Ygc29ja2V0cyBpcyBzbyBodWdlIHRoYXQgcGFyc2luZyA8dHQ+L3Byb2MvbmV0L3RjcDwvdHQ+CitpcyBwYWluZnVsLgorPGl0ZW0+PHR0Ly1EIEZJTEUvICAtIGRvIG5vdCBkaXNwbGF5IGFueXRoaW5nLCBqdXN0IGR1bXAgcmF3IGluZm9ybWF0aW9uCithYm91dCBUQ1Agc29ja2V0cyB0byA8dHQvRklMRS8gYWZ0ZXIgYXBwbHlpbmcgZmlsdGVycy4gSWYgPHR0L0ZJTEUvIGlzIDx0dC8tLworPHR0L3N0ZG91dC8gaXMgdXNlZC4gCis8aXRlbT48dHQvLUYgRklMRS8gIC0gcmVhZCBjb250aW51YXRpb24gb2YgZmlsdGVyIGZyb20gPHR0L0ZJTEUvLgorRWFjaCBsaW5lIG9mIDx0dC9GSUxFLyBpcyBpbnRlcnByZXRlZCBsaWtlIHNpbmdsZSBjb21tYW5kIGxpbmUgb3B0aW9uLgorSWYgPHR0L0ZJTEUvIGlzIDx0dC8tLyA8dHQvc3RkaW4vIGlzIHVzZWQuIAorPGl0ZW0+PHR0Ly1yLyAgLSB0cnkgdG8gcmVzb2x2ZSBudW1lcmljIGFkZHJlc3MvcG9ydHMKKzxpdGVtPjx0dC8tbi8gIC0gZG8gbm90IHRyeSB0byByZXNvbHZlIHBvcnRzCis8aXRlbT48dHQvLW8vICAtIHNob3cgc29tZSBvcHRpb25hbCBpbmZvcm1hdGlvbiwgZi5lLiBUQ1AgdGltZXJzCis8aXRlbT48dHQvLWkvICAtIHNob3cgc29tZSBpbmZvbXJhdGlvbiBzcGVjaWZpYyB0byBUQ1AgKFJUTywgY29uZ2VzdGlvbgord2luZG93LCBzbG93IHN0YXJ0IHRocmVzaG91bGQgZXRjLikKKzxpdGVtPjx0dC8tZS8gIC0gc2hvdyBldmVuIG1vcmUgb3B0aW9uYWwgaW5mb3JtYXRpb24KKzxpdGVtPjx0dC8tbS8gIC0gc2hvdyBleHRlbmRlZCBpbmZvcm1hdGlvbiBvbiBtZW1vcnkgdXNlZCBieSB0aGUgc29ja2V0LgorSXQgaXMgYXZhaWxhYmxlIG9ubHkgd2l0aCA8dHQvdGNwX2RpYWcvIGVuYWJsZWQuCis8aXRlbT48dHQvLXAvICAtIHNob3cgbGlzdCBvZiBwcm9jZXNzZXMgb3duaW5nIHRoZSBzb2NrZXQKKzxpdGVtPjx0dC8tZiBGQU1JTFkvIC0gZGVmYXVsdCBhZGRyZXNzIGZhbWlseSB1c2VkIGZvciBwYXJzaW5nIGFkZHJlc3Nlcy4KKyAgICAgICAgICAgICAgICAgQWxzbyB0aGlzIG9wdGlvbiBsaW1pdHMgbGlzdGluZyB0byBzb2NrZXRzIHN1cHBvcnRpbmcKKyAgICAgICAgICAgICAgICAgZ2l2ZW4gYWRkcmVzcyBmYW1pbHkuIEN1cnJlbnRseSB0aGUgZm9sbG93aW5nIGZhbWlsaWVzCisgICAgICAgICAgICAgICAgIGFyZSBzdXBwb3J0ZWQ6IDx0dC91bml4LywgPHR0L2luZXQvLCA8dHQvaW5ldDYvLCA8dHQvbGluay8sCisgICAgICAgICAgICAgICAgIDx0dC9uZXRsaW5rLy4KKzxpdGVtPjx0dC8tNC8gLSBhbGlhcyBmb3IgPHR0Ly1mIGluZXQvCis8aXRlbT48dHQvLTYvIC0gYWxpYXMgZm9yIDx0dC8tZiBpbmV0Ni8KKzxpdGVtPjx0dC8tMC8gLSBhbGlhcyBmb3IgPHR0Ly1mIGxpbmsvCis8aXRlbT48dHQvLUEgTElTVC1PRi1UQUJMRVMvIC0gbGlzdCBvZiBzb2NrZXQgdGFibGVzIHRvIGR1bXAsIHNlcGFyYXRlZAorICAgICAgICAgICAgICAgICBieSBjb21tYXMuIFRoZSBmb2xsb3dpbmcgaWRlbnRpZmllcnMgYXJlIHVuZGVyc3Rvb2Q6CisgICAgICAgICAgICAgICAgIDx0dC9hbGwvLCA8dHQvaW5ldC8sIDx0dC90Y3AvLCA8dHQvdWRwLywgPHR0L3Jhdy8sCisgICAgICAgICAgICAgICAgIDx0dC91bml4LywgPHR0L3BhY2tldC8sIDx0dC9uZXRsaW5rLywgPHR0L3VuaXhfZGdyYW0vLAorICAgICAgICAgICAgICAgICA8dHQvdW5peF9zdHJlYW0vLCA8dHQvcGFja2V0X3Jhdy8sIDx0dC9wYWNrZXRfZGdyYW0vLgorPGl0ZW0+PHR0Ly14LyAtIGFsaWFzIGZvciA8dHQvLUEgdW5peC8KKzxpdGVtPjx0dC8tdC8gLSBhbGlhcyBmb3IgPHR0Ly1BIHRjcC8KKzxpdGVtPjx0dC8tdS8gLSBhbGlhcyBmb3IgPHR0Ly1BIHVkcC8KKzxpdGVtPjx0dC8tdy8gLSBhbGlhcyBmb3IgPHR0Ly1BIHJhdy8KKzxpdGVtPjx0dC8tYS8gLSBzaG93IHNvY2tldHMgb2YgYWxsIHRoZSBzdGF0ZXMuIEJ5IGRlZmF1bHQgc29ja2V0cworICAgICAgICAgICAgICAgIGluIHN0YXRlcyA8dHQvTElTVEVOLywgPHR0L1RJTUUtV0FJVC8sIDx0dC9TWU5fUkVDVi8KKyAgICAgICAgICAgICAgICBhbmQgPHR0L0NMT1NFLyBhcmUgc2tpcHBlZC4KKzxpdGVtPjx0dC8tbC8gLSBzaG93IG9ubHkgc29ja2V0cyBpbiBzdGF0ZSA8dHQvTElTVEVOLyAKKzwvaXRlbWl6ZT4KKworPHNlY3QyPjx0dC9TVEFURS1GSUxURVIvCisKKzxwPjx0dC9TVEFURS1GSUxURVIvIGFsbG93cyB0byBjb25zdHJ1Y3QgYXJiaXRyYXJ5IHNldCBvZgorc3RhdGVzIHRvIG1hdGNoLiBJdHMgc3ludGF4IGlzIHNlcXVlbmNlIG9mIGtleXdvcmRzIDx0dC9zdGF0ZS8KK2FuZCA8dHQvZXhjbHVkZS8gZm9sbG93ZWQgYnkgaWRlbnRpZmllciBvZiBzdGF0ZS4KK0F2YWlsYWJsZSBpZGVudGlmaWVycyBhcmU6CisKKzxwPgorPGl0ZW1pemU+Cis8aXRlbT4gQWxsIHN0YW5kYXJkIFRDUCBzdGF0ZXM6IDx0dC9lc3RhYmxpc2hlZC8sIDx0dC9zeW4tc2VudC8sCis8dHQvc3luLXJlY3YvLCA8dHQvZmluLXdhaXQtMS8sIDx0dC9maW4td2FpdC0yLywgPHR0L3RpbWUtd2FpdC8sCis8dHQvY2xvc2VkLywgPHR0L2Nsb3NlLXdhaXQvLCA8dHQvbGFzdC1hY2svLCA8dHQvbGlzdGVuLyBhbmQgPHR0L2Nsb3NpbmcvLgorCis8aXRlbT48dHQvYWxsLyAtIGZvciBhbGwgdGhlIHN0YXRlcyAKKzxpdGVtPjx0dC9jb25uZWN0ZWQvIC0gYWxsIHRoZSBzdGF0ZXMgZXhjZXB0IGZvciA8dHQvbGlzdGVuLyBhbmQgPHR0L2Nsb3NlZC8gCis8aXRlbT48dHQvc3luY2hyb25pemVkLyAtIGFsbCB0aGUgPHR0L2Nvbm5lY3RlZC8gc3RhdGVzIGV4Y2VwdCBmb3IgCis8dHQvc3luLXNlbnQvCis8aXRlbT48dHQvYnVja2V0LyAtIHN0YXRlcywgd2hpY2ggYXJlIG1haW50YWluZWQgYXMgbWluaXNvY2tldHMsIGkuZS4KKzx0dC90aW1lLXdhaXQvIGFuZCA8dHQvc3luLXJlY3YvLgorPGl0ZW0+PHR0L2JpZy8gLSBvcHBvc2l0ZSB0byA8dHQvYnVja2V0LworPC9pdGVtaXplPgorCis8c2VjdDI+PHR0L0FERFJFU1NfRklMVEVSLworCis8cD48dHQvQUREUkVTU19GSUxURVIvIGlzIGJvb2xlYW4gZXhwcmVzc2lvbiB3aXRoIG9wZXJhdGlvbnMgPHR0L2FuZC8sIDx0dC9vci8KK2FuZCA8dHQvbm90Lywgd2hpY2ggY2FuIGJlIGFiYnJldmlhdGVkIGluIEMgc3R5bGUgZi5lLiBhcyA8dHQvJmFtcC8sCis8dHQvJmFtcCZhbXAvLgorCis8cD4KK1ByZWRpY2F0ZXMgY2hlY2sgc29ja2V0IGFkZHJlc3NlcywgYm90aCBsb2NhbCBhbmQgcmVtb3RlLgorVGhlcmUgYXJlIHRoZSBmb2xsb3dpbmcga2luZHMgb2YgcHJlZGljYXRlczoKKworPGl0ZW1pemU+Cis8aXRlbT4gPHR0L2RzdCBBRERSRVNTX1BBVFRFUk4vIC0gbWF0Y2hlcyByZW1vdGUgYWRkcmVzcyBhbmQgcG9ydAorPGl0ZW0+IDx0dC9zcmMgQUREUkVTU19QQVRURVJOLyAtIG1hdGNoZXMgbG9jYWwgYWRkcmVzcyBhbmQgcG9ydAorPGl0ZW0+IDx0dC9kcG9ydCBSRUxPUCBQT1JULyAgICAtIGNvbXBhcmVzIHJlbW90ZSBwb3J0IHRvIGEgbnVtYmVyCis8aXRlbT4gPHR0L3Nwb3J0IFJFTE9QIFBPUlQvICAgIC0gY29tcGFyZXMgbG9jYWwgcG9ydCB0byBhIG51bWJlcgorPGl0ZW0+IDx0dC9hdXRvYm91bmQvICAgICAgICAgICAtIGNoZWNrcyB0aGF0IHNvY2tldCBpcyBib3VuZCB0byBhbiBlcGhlbWVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0Cis8L2l0ZW1pemU+CisKKzxwPjx0dC9SRUxPUC8gaXMgc29tZSBvZiA8dHQvJmx0PS8sIDx0dC8mZ3Q9LywgPHR0Lz09LyBldGMuCitUbyBtYWtlIHRoaXMgbW9yZSBjb252aW5pZW50IGZvciB1c2UgaW4gdW5peCBzaGVsbCwgYWxwaGFiZXRpYworRk9SVFJBTi1saWtlIG5vdGF0aW9ucyA8dHQvbGUvLCA8dHQvZ3QvIGV0Yy4gYXJlIGFjY2VwdGVkIGFzIHdlbGwuCisKKzxwPlRoZSBmb3JtYXQgYW5kIHNlbWFudGljcyBvZiA8dHQvQUREUkVTU19QQVRURVJOLyBkZXBlbmRzIG9uIGFkZHJlc3MKK2ZhbWlseS4KKworPGl0ZW1pemU+Cis8aXRlbT48dHQvaW5ldC8gLSA8dHQvQUREUkVTU19QQVRURVJOLyBjb25zaXN0cyBvZiBJUCBwcmVmaXgsIG9wdGlvbmFsbHkKK2ZvbGxvd2VkIGJ5IGNvbG9uIGFuZCBwb3J0LiBJZiBwcmVmaXggb3IgcG9ydCBwYXJ0IGlzIGFic2VudCBvciByZXBsYWNlZAord2l0aCA8dHQvKi8sIHRoaXMgbWVhbnMgd2lsZGNhcmQgbWF0Y2guCis8aXRlbT48dHQvaW5ldDYvIC0gVGhlIHNhbWUgYXMgPHR0L2luZXQvLCBvbmx5IHByZWZpeCByZWZlcnMgdG8gYW4gSVB2NgorYWRkcmVzcy4gVW5saWtlIDx0dC9pbmV0LyBjb2xvbiBiZWNvbWVzIGFtYmlndW91cywgc28gdGhhdCA8dHQvc3MvIGFsbG93cwordG8gdXNlIHNjaGVtZSwgbGlrZSB1c2VkIGluIFVSTHMsIHdoZXJlIGFkZHJlc3MgaXMgc3VwcG91bmRlZCB3aXRoCis8dHQvWy8gLi4uIDx0dC9dLy4KKzxpdGVtPjx0dC91bml4LyAtIDx0dC9BRERSRVNTX1BBVFRFUk4vIGlzIHNoZWxsLXN0eWxlIHdpbGRjYXJkLgorPGl0ZW0+PHR0L3BhY2tldC8gLSBmb3JtYXQgbG9va3MgbGlrZSA8dHQvaW5ldC8sIG9ubHkgaW50ZXJmYWNlIGluZGV4CitzdGF5cyBpbnN0ZWFkIG9mIHBvcnQgYW5kIGxpbmsgbGF5ZXIgcHJvdG9jb2wgaWQgaW5zdGVhZCBvZiBhZGRyZXNzLgorPGl0ZW0+PHR0L25ldGxpbmsvIC0gZm9ybWF0IGxvb2tzIGxpa2UgPHR0L2luZXQvLCBvbmx5IHNvY2tldCBwaWQKK3N0YXlzIGluc3RlYWQgb2YgcG9ydCBhbmQgbmV0bGluayBjaGFubmVsIGluc3RlYWQgb2YgYWRkcmVzcy4KKzwvaXRlbWl6ZT4KKworPHA+PHR0L1BPUlQvIGlzIHN5bnRhY3RpY2FsbHkgPHR0L0FERFJFU1NfUEFUVEVSTi8gd2l0aCB3aWxkY2FyZAorYWRkcmVzcyBwYXJ0LiBDZXJ0YWlubHksIGl0IGlzIHVuZGVmaW5lZCBmb3IgVU5JWCBzb2NrZXRzLiAKKworPHNlY3QxPiBFbnZpcm9ubWVudCB2YXJpYWJsZXMKKworPHA+Cis8dHQvc3MvIGFsbG93cyB0byBjaGFuZ2Ugc291cmNlIG9mIGluZm9ybWF0aW9uIHVzaW5nIHZhcmlvdXMKK2Vudmlyb25tZW50IHZhcmlhYmxlczoKKworPHA+Cis8aXRlbWl6ZT4KKzxpdGVtPiA8dHQvUFJPQ19TTEFCSU5GTy8gIHRvIG92ZXJyaWRlIDx0dD4vcHJvYy9zbGFiaW5mbzwvdHQ+Cis8aXRlbT4gPHR0L1BST0NfTkVUX1RDUC8gIHRvIG92ZXJyaWRlIDx0dD4vcHJvYy9uZXQvdGNwPC90dD4KKzxpdGVtPiA8dHQvUFJPQ19ORVRfVURQLyAgdG8gb3ZlcnJpZGUgPHR0Pi9wcm9jL25ldC91ZHA8L3R0PgorPGl0ZW0+IGV0Yy4KKzwvaXRlbWl6ZT4gCisKKzxwPgorVmFyaWFibGUgPHR0L1BST0NfUk9PVC8gYWxsb3dzIHRvIGNoYW5nZSByb290IG9mIGFsbCB0aGUgPHR0Pi9wcm9jLzwvdHQ+CitoaWVyYXJjaHkuCisKKzxwPgorVmFyaWFibGUgPHR0L1RDUERJQUdfRklMRS8gcHJlc2NyaWJlcyB0byBvcGVuIGEgZmlsZSBpbnN0ZWFkIG9mCityZXF1ZXN0aW5nIGtlcm5lbCB0byBkdW1wIGluZm9ybWF0aW9uIGFib3V0IFRDUCBzb2NrZXRzLgorCisKKzxwPiBUaGlzIG9wdGlvbiBpcyB1c2VkIG1haW5seSB0byBpbnZlc3RpZ2F0ZSBidWcgcmVwb3J0cywKK3doZW4gZHVtcHMgb2YgZmlsZXMgdXN1YWxseSBmb3VuZCBpbiA8dHQ+L3Byb2MvPC90dD4gYXJlIHJlY2V2aWVkCitieSBlLW1haWwuCisKKzxzZWN0MT4gT3V0cHV0IGZvcm1hdAorCis8cD5TaXggY29sdW1ucy4gVGhlIGZpcnN0IGlzIDx0dC9OZXRpZC8sIGl0IGRlbm90ZXMgc29ja2V0IHR5cGUgYW5kCit0cmFuc3BvcnQgcHJvdG9jb2wsIHdoZW4gaXQgaXMgYW1iaWd1b3VzOiA8dHQvdGNwLywgPHR0L3VkcC8sIDx0dC9yYXcvLAorPHR0L3Vfc3RyLyBpcyBhYmJyZXZpYXRpb24gZm9yIDx0dC91bml4X3N0cmVhbS8sIDx0dC91X2Rnci8gZm9yIFVOSVgKK2RhdGFncmFtIHNvY2tldHMsIDx0dC9ubC8gZm9yIG5ldGxpbmssIDx0dC9wX3Jhdy8gYW5kIDx0dC9wX2Rnci8gZm9yCityYXcgYW5kIGRhdGFncmFtIHBhY2tldCBzb2NrZXRzLiBUaGlzIGNvbHVtbiBpcyBvcHRpb25hbCwgaXQgd2lsbAorYmUgaGlkZGVuLCBpZiBmaWx0ZXIgc2VsZWN0cyBhbiB1bmlxdWUgbmV0aWQuCisKKzxwPgorVGhlIHNlY29uZCBjb2x1bW4gaXMgPHR0L1N0YXRlLy4gU29ja2V0IHN0YXRlIGlzIGRpc3BsYXllZCBoZXJlLgorVGhlIG5hbWVzIGFyZSBzdGFuZGFyZCBUQ1AgbmFtZXMsIGV4Y2VwdCBmb3IgPHR0L1VOQ09OTi8sIHdoaWNoCitjYW5ub3QgaGFwcGVuIGZvciBUQ1AsIGJ1dCBub3JtYWwgZm9yIG5vdCBjb25uZWN0ZWQgc29ja2V0cworb2YgYW5vdGhlciB0eXBlcy4gQWdhaW4sIHRoaXMgY29sdW1uIGNhbiBiZSBoaWRkZW4uCisKKzxwPgorVGhlbiB0d28gY29sdW1ucyAoPHR0L1JlY3YtUS8gYW5kIDx0dC9TZW5kLVEvKSBzaG93aW5nIGFtb3VudCBvZiBkYXRhCitxdWV1ZWQgZm9yIHJlY2VpdmUgYW5kIHRyYW5zbWl0LgorCis8cD4KK0FuZCB0aGUgbGFzdCB0d28gY29sdW1ucyBkaXNwbGF5IGxvY2FsIGFkZHJlc3MgYW5kIHBvcnQgb2YgdGhlIHNvY2tldAorYW5kIGl0cyBwZWVyIGFkZHJlc3MsIGlmIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkLgorCis8cD4KK0lmIG9wdGlvbnMgPHR0Ly1vLywgPHR0Ly1lLyBvciA8dHQvLXAvIHdlcmUgZ2l2ZW4sIG9wdGlvbnMgYXJlCitkaXNwbGF5ZWQgbm90IGluIGZpeGVkIHBvc2l0aW9ucyBidXQgc2VwYXJhdGVkIGJ5IHNwYWNlcyBwYWlyczoKKzx0dC9vcHRpb246dmFsdWUvLiBJZiB2YWx1ZSBpcyBub3QgYSBzaW5nbGUgbnVtYmVyLCBpdCBpcyBwcmVzZW50ZWQKK2FzIGxpc3Qgb2YgdmFsdWVzLCBlbmNsb3NlZCB0byA8dHQvKC8gLi4uIDx0dC8pLyBhbmQgc2VwYXJhdGVkIHdpdGgKK2NvbW1hcy4gRi5lLgorCis8dHNjcmVlbj48dmVyYj4KKyAgIHRpbWVyOihrZWVwYWxpdmUsMTExbWluLDApCis8L3ZlcmI+PC90c2NyZWVuPgoraXMgdHlwaWNhbCBmb3JtYXQgZm9yIFRDUCB0aW1lciAob3B0aW9uIDx0dC8tby8pLgorCis8dHNjcmVlbj48dmVyYj4KKyAgIHVzZXJzOigoWCwxMTMsMykpCis8L3ZlcmI+PC90c2NyZWVuPgoraXMgdHlwaWNhbCBmb3IgbGlzdCBvZiB1c2VycyAob3B0aW9uIDx0dC8tcC8pLgorCisKKzxzZWN0PlNvbWUgbnVtYmVycworCis8cD4KK1dlbGwsIGxldCB1cyB1c2UgPHR0L3BpZGVudGQvIGFuZCBhIHRvb2wgPHR0L2liZW5jaC8gdG8gbWVhc3VyZQoraXRzIHBlcmZvcm1hbmNlLiBJdCBpcyAzMCByZXF1ZXN0cyBwZXIgc2Vjb25kIGhlcmUuIE5vdGhpbmcgdG8gdGVzdCwKK2l0IGlzIHRvbyBzbG93LiBPSywgbGV0IHVzIHBhdGNoIHBpZGVudGQgd2l0aCBwYXRjaCBmcm9tIGRpcmVjdG9yeQorUGF0Y2hlcy4gQWZ0ZXIgdGhpcyBpdCBoYW5kbGVzIGFib3V0IDQzMDAgcmVxdWVzdHMgcGVyIHNlY29uZAorYW5kIGJlY29tZXMgaGFuZHkgdG9vbCB0byBwb2xsdXRlIHNvY2tldCB0YWJsZXMgd2l0aCBsb3RzIG9mIHRpbWV3YWl0CitidWNrZXRzLgorCis8cD4KK1NvLCBlYWNoIHRlc3Qgc3RhcnRzIGZyb20gcG9sbHV0aW9uIHRhYmxlcyB3aXRoIDMwMDAwIHNvY2tldHMKK2FuZCB0aGVuIGRvaW5nIGZ1bGwgZHVtcCBvZiB0aGUgdGFibGUgcGlwZWQgdG8gd2MgYW5kIG1lYXN1cmluZwordGltaW5ncyB3aXRoIHRpbWU6CisKKzxwPlJlc3VsdHM6CisKKzxpdGVtaXplPgorPGl0ZW0+IDx0dC9uZXRzdGF0IC1hdC8gLSAxNS42IHNlY29uZHMKKzxpdGVtPiA8dHQvc3MgLWF0ci8sIGJ1dCB3aXRob3V0IDx0dC90Y3BfZGlhZy8gICAgIC0gNS40IHNlY29uZHMKKzxpdGVtPiA8dHQvc3MgLWF0ci8gd2l0aCA8dHQvdGNwX2RpYWcvICAgICAtIDAuNDcgc2Vjb25kcworPC9pdGVtaXplPgorCitObyBjb21tZW50cy4gVGhvdWdoIG9uZSBjb21tZW50IGlzIG5lY2Vzc2FyeSwgbW9zdCBvZiB0aW1lCit3aXRob3V0IDx0dC90Y3BfZGlhZy8gaXMgd2FzdGVkIGluc2lkZSBrZXJuZWwgd2l0aCBjb21wbGV0ZWx5CitibG9ja2VkIG5ldHdvcmtpbmcuIE1vcmUgdGhhbiAxMCBzZWNvbmRzLCB5ZXMuIDx0dC90Y3BfZGlhZy8KK2RvZXMgdGhlIHNhbWUgd29yayBmb3IgMTAwIG1pbGxpc2Vjb25kcyBvZiBzeXN0ZW0gdGltZS4KKworPC9hcnRpY2xlPgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvZXRjL2lwcm91dGUyL2JwZl9waW5uaW5nIGIvaXByb3V0ZTIvZXRjL2lwcm91dGUyL2JwZl9waW5uaW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMzljNzAKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9ldGMvaXByb3V0ZTIvYnBmX3Bpbm5pbmcKQEAgLTAsMCArMSw2IEBACisjCisjIHN1YnBhdGggbWFwcGluZ3MgZnJvbSBtb3VudCBwb2ludCBmb3IgcGlubmluZworIworIzMJdHJhY2luZworIzQJZm9vL2JhcgorIzUJdGMvY2xzMQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvZXRjL2lwcm91dGUyL2VtYXRjaF9tYXAgYi9pcHJvdXRlMi9ldGMvaXByb3V0ZTIvZW1hdGNoX21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODIzOTgzCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvZXRjL2lwcm91dGUyL2VtYXRjaF9tYXAKQEAgLTAsMCArMSw3IEBACisjIGxvb2t1cCB0YWJsZSBmb3IgZW1hdGNoIGtpbmRzCisxCWNtcAorMgluYnl0ZQorMwl1MzIKKzQJbWV0YQorNwljYW5pZAorOAlpcHNldApkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvZXRjL2lwcm91dGUyL2dyb3VwIGIvaXByb3V0ZTIvZXRjL2lwcm91dGUyL2dyb3VwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMDAwYjIKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9ldGMvaXByb3V0ZTIvZ3JvdXAKQEAgLTAsMCArMSwyIEBACisjIGRldmljZSBncm91cCBuYW1lcworMAlkZWZhdWx0CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9ldGMvaXByb3V0ZTIvbmxfcHJvdG9zIGIvaXByb3V0ZTIvZXRjL2lwcm91dGUyL25sX3Byb3RvcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzQxOGYzCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvZXRjL2lwcm91dGUyL25sX3Byb3RvcwpAQCAtMCwwICsxLDIzIEBACisjIE5ldGxpbmsgcHJvdG9jb2wgbmFtZXMgbWFwcGluZworCiswICAgcnRubAorMSAgIHVudXNlZAorMiAgIHVzZXJzb2NrCiszICAgZncKKzQgICB0Y3BkaWFnCis1ICAgbmZsb2cKKzYgICB4ZnJtCis3ICAgc2VsaW51eAorOCAgIGlzY3NpCis5ICAgYXVkaXQKKzEwICBmaWJsb29rdXAKKzExICBjb25uZWN0b3IKKzEyICBuZnQgCisxMyAgaXA2ZncKKzE0ICBkZWMtcnQKKzE1ICB1ZXZlbnQKKzE2ICBnZW5sCisxOCAgc2NzaS10cmFucworMTkgIGVjcnlwdGZzCisyMCAgcmRtYQorMjEgIGNyeXB0byAKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2V0Yy9pcHJvdXRlMi9ydF9kc2ZpZWxkIGIvaXByb3V0ZTIvZXRjL2lwcm91dGUyL3J0X2RzZmllbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQyNmQ2MAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2V0Yy9pcHJvdXRlMi9ydF9kc2ZpZWxkCkBAIC0wLDAgKzEsMjYgQEAKKyMgRGlmZmVyZW50aWF0ZWQgZmllbGQgdmFsdWVzCisjIFRoZXNlIGluY2x1ZGUgdGhlIERTQ1AgYW5kIHVudXNlZCBiaXRzCisweDAJZGVmYXVsdAorIyBOZXdlciBSRkMyNTk3IHZhbHVlcworMHgyOAlBRjExCisweDMwCUFGMTIKKzB4MzgJQUYxMworMHg0OAlBRjIxCisweDUwCUFGMjIKKzB4NTgJQUYyMworMHg2OAlBRjMxCisweDcwCUFGMzIKKzB4NzgJQUYzMworMHg4OAlBRjQxCisweDkwCUFGNDIKKzB4OTgJQUY0MworIyBPbGRlciB2YWx1ZXMgUkZDMjQ3NAorMHgyMAlDUzEKKzB4NDAJQ1MyCisweDYwCUNTMworMHg4MAlDUzQKKzB4QTAJQ1M1CisweEMwCUNTNgorMHhFMAlDUzcKKyMgUkZDIDI1OTgKKzB4QjgJRUYKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2V0Yy9pcHJvdXRlMi9ydF9wcm90b3MgYi9pcHJvdXRlMi9ldGMvaXByb3V0ZTIvcnRfcHJvdG9zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyY2Y5YzQKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9ldGMvaXByb3V0ZTIvcnRfcHJvdG9zCkBAIC0wLDAgKzEsMzEgQEAKKyMKKyMgUmVzZXJ2ZWQgcHJvdG9jb2xzLgorIworMAl1bnNwZWMKKzEJcmVkaXJlY3QKKzIJa2VybmVsCiszCWJvb3QKKzQJc3RhdGljCis4CWdhdGVkCis5CXJhCisxMAltcnQKKzExCXplYnJhCisxMgliaXJkCisxMwlkbnJvdXRlZAorMTQJeG9ycAorMTUJbnRrCisxNiAgICAgIGRoY3AKKzQyCWJhYmVsCisKKyMKKyMJVXNlZCBieSBtZSBmb3IgZ2F0ZWQKKyMKKzI1NAlnYXRlZC9hZ2dyCisyNTMJZ2F0ZWQvYmdwCisyNTIJZ2F0ZWQvb3NwZgorMjUxCWdhdGVkL29zcGZhc2UKKzI1MAlnYXRlZC9yaXAKKzI0OQlnYXRlZC9zdGF0aWMKKzI0OAlnYXRlZC9jb25uCisyNDcJZ2F0ZWQvaW5ldAorMjQ2CWdhdGVkL2RlZmF1bHQKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2V0Yy9pcHJvdXRlMi9ydF9yZWFsbXMgYi9pcHJvdXRlMi9ldGMvaXByb3V0ZTIvcnRfcmVhbG1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZGQ3NmQKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9ldGMvaXByb3V0ZTIvcnRfcmVhbG1zCkBAIC0wLDAgKzEsMTMgQEAKKyMKKyMgcmVzZXJ2ZWQgdmFsdWVzCisjCiswCWNvc21vcworIworIyBsb2NhbAorIworIzEJaW5yLmFjCisjMglpbnIucnVoZXAKKyMzCWZyZWVuZXQKKyM0CXJhZGlvLW1zdQorIzUJcnVzc2lhCisjNglpbnRlcm5ldApkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvZXRjL2lwcm91dGUyL3J0X3Njb3BlcyBiL2lwcm91dGUyL2V0Yy9pcHJvdXRlMi9ydF9zY29wZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUxNGJjMQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2V0Yy9pcHJvdXRlMi9ydF9zY29wZXMKQEAgLTAsMCArMSwxMSBAQAorIworIyByZXNlcnZlZCB2YWx1ZXMKKyMKKzAJZ2xvYmFsCisyNTUJbm93aGVyZQorMjU0CWhvc3QKKzI1MwlsaW5rCisjCisjIHBzZXVkby1yZXNlcnZlZAorIworMjAwCXNpdGUKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2V0Yy9pcHJvdXRlMi9ydF90YWJsZXMgYi9pcHJvdXRlMi9ldGMvaXByb3V0ZTIvcnRfdGFibGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MWFiZmQKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9ldGMvaXByb3V0ZTIvcnRfdGFibGVzCkBAIC0wLDAgKzEsMTEgQEAKKyMKKyMgcmVzZXJ2ZWQgdmFsdWVzCisjCisyNTUJbG9jYWwKKzI1NAltYWluCisyNTMJZGVmYXVsdAorMAl1bnNwZWMKKyMKKyMgbG9jYWwKKyMKKyMxCWluci5ydWhlcApkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvZXRjL2lwcm91dGUyL3J0X3RhYmxlcy5kL1JFQURNRSBiL2lwcm91dGUyL2V0Yy9pcHJvdXRlMi9ydF90YWJsZXMuZC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkzODZmOAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2V0Yy9pcHJvdXRlMi9ydF90YWJsZXMuZC9SRUFETUUKQEAgLTAsMCArMSwzIEBACitFYWNoIGZpbGUgaW4gdGhpcyBkaXJlY3RvcnkgaXMgYW4gcnRfdGFibGVzIGNvbmZpZ3VyYXRpb24gZmlsZS4gaXByb3V0ZTIKK2NvbW1hbmRzIHNjYW4gdGhpcyBkaXJlY3RvcnkgcHJvY2Vzc2luZyBhbGwgZmlsZXMgdGhhdCBlbmQgaW4gJy5jb25mJy4KKwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvZXhhbXBsZXMvUkVBRE1FLmNicSBiL2lwcm91dGUyL2V4YW1wbGVzL1JFQURNRS5jYnEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhjMTA4OQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2V4YW1wbGVzL1JFQURNRS5jYnEKQEAgLTAsMCArMSwxMjIgQEAKKyMgQ0hBTkdFUworIyAtLS0tLS0tCisjIHYwLjNhMi0gZml4ZWQgYnVnIGluICJpZiIgb3BlcmF0b3IuIFRoYW5rcyBrYWRAZGd0dS5kb25ldHNrLnVhLgorIyB2MC4zYS0gIGFkZGVkIFRJTUUgcGFyYW1ldGVyLiBFeGFtcGxlOgorIyAgICAgICAgIFRJTUU9MDA6MDAtMTk6MDA7NjRLYml0LzZLYml0CisjICAgICAgICAgU28sIGJldHdlZW4gMDA6MDAgYW5kIDE5OjAwIFJBVEUgd2lsbCBiZSA2NEtiaXQuCisjICAgICAgICAgSnVzdCBzdGFydCAiY2JxLmluaXQgdGltZWNoZWNrIiBwZXJpb2RpY2FsbHkgZnJvbSBjcm9uIChldmVyeSAxMAorIyAgICAgICAgIG1pbnV0ZXMgZm9yIGV4YW1wbGUpLgorIyAgICAgICAgICEhISBBbnl3YXkgeW91IE1VU1Qgc3RhcnQgImNicS5pbml0IHN0YXJ0IiBmb3IgQ0JRIGluaXRpYWxpemUuCisjIHYwLjIgLSAgU29tZSBjb3NtZXRpcXVlIGNoYW5nZXMuIE5vdyBpdCBtb3JlIGNvbXBhdGlibGUgd2l0aAorIyAgICAgICAgIG9sZCBiYXNoIHZlcnNpb24uIFRoYW5rcyB0byBTdGFuaXNsYXYgVi4gVm9yb255aQorIyAgICAgICAgIDxzdGFzQGNudGkudWFuZXQua2hhcmtvdi51YT4uCisjIHYwLjEgLSAgRmlyc3QgcHVibGljIHJlbGVhc2UKKyMgCisjIFJFQURNRQorIyAtLS0tLS0KKyMgCisjIEZpcnN0IG9mIGFsbCAtIHRoaXMgaXMganVzdCBhIFNJTVBMRSBFWEFNUExFIG9mIENCUSBwb3dlci4KKyMgRG9uJ3QgYXNrIG1lICJ3aHkiIGFuZCAiaG93IiA6KQorIyAKKyMgVGhpcyBpcyBhbiBleGFtcGxlIG9mIHVzaW5nIENCUSAoQ2xhc3MgQmFzZWQgUXVldWVpbmcpIGFuZCBwb2xpY3ktYmFzZWQKKyMgZmlsdGVyIGZvciBidWlsZGluZyBzbWFydCBldGhlcm5ldCBzaGFwZXJzLiBBbGwgQ0JRIHBhcmFtZXRlcnMgYXJlCisjIGNvcnJlY3Qgb25seSBmb3IgRVRIRVJORVQgKGV0aDAsMSwyLi4pIGxpbnV4IGludGVyZmFjZXMuIEl0IHdvcmtzIGZvcgorIyBBUkNORVQgdG9vIChqdXN0IHNldCBiYW5kd2lkdGggcGFyYW1ldGVyIHRvIDJNYml0KS4gSXQgd2FzIHRlc3RlZAorIyBvbiAyLjEuMTI1LTIuMS4xMjkgbGludXgga2VybmVscyAoS1NJIGxpbnV4LCBOb3N0cm9tbyB2ZXJzaW9uKSBhbmQgCisjIGlwLXJvdXRlIHV0aWxpdHkgYnkgQS5LdXpuZXRzb3YgKGlwcm91dGUyLXNzOTgxMTAxIHZlcnNpb24pLiAKKyMgWW91IGNhbiBkb3dubG9hZCBpcC1yb3V0ZSBmcm9tIGZ0cDovL2Z0cC5pbnIuYWMucnUvaXAtcm91dGluZyBvcgorIyBnZXQgaXByb3V0ZTIqLnJwbSAoY29tcGlsZWQgd2l0aCBnbGliYykgZnJvbSBmdHAua3NpLWxpbnV4LmNvbS4KKyMgCisjIAorIyBIT1cgSVQgV09SS1MKKyMgCisjIEVhY2ggc2hhcGVyIG11c3QgYmUgZGVzY3JpYmVkIGJ5IGNvbmZpZyBmaWxlIGluICRDQlFfUEFUSAorIyAoL2V0Yy9zeXNjb25maWcvY2JxLykgZGlyZWN0b3J5IC0gb25lIGNvbmZpZyBmaWxlIGZvciBlYWNoIENCUSBzaGFwZXIuCisjIAorIyBTb21lIHdvcmRzIGFib3V0IGNvbmZpZyBmaWxlIG5hbWU6CisjIEVhY2ggc2hhcGVyIGhhcyBpdHMgcGVyc29uYWwgSUQgLSB0d28gYnl0ZSBIRVggbnVtYmVyLiBSZWFsbHkgSUQgaXMgCisjIENCUSBjbGFzcy4KKyMgU28sIGZpbGVuYW1lIGxvb2tzIGxpa2U6CisjIAorIyBjYnEtMTI4MC5NeV9maXJzdF9zaGFwZXIKKyMgXl5eIF5eXiAgXl5eXl5eXl5eXl5eXgorIyAgfCAgfCAgICAgICAgICAgIHxfX19fX18gU2hhcGVyIG5hbWUgLSBhbnkgd29yZAorIyAgfCAgfF9fX19fX19fX19fX19fX19fX18gSUQgKDAwMDAtRkZGRiksIGxldCBJRCBsb29rcyBsaWtlIHNoYXBlcidzIHJhdGUKKyMgIHxfX19fX19fX19fX19fX19fX19fX19fIEZpbGVuYW1lIG11c3QgYmVnaW4gZnJvbSAiY2JxLSIgCisjIAorIyAKKyMgQ29uZmlnIGZpbGUgZGVzY3JpYmVzIHNoYXBlciBwYXJhbWV0ZXJzIGFuZCBzb3VyY2VbZGVzdGluYXRpb25dIAorIyBhZGRyZXNzW3BvcnRdLgorIyBGb3IgZXhhbXBsZSBsZXQncyBwcmVwYXJlIC9ldGMvc3lzY29uZmlnL2NicS9jYnEtMTI4MC5NeV9maXJzdF9zaGFwZXI6CisjIAorIyAtLS0tLS0tLS0tODwtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgREVWSUNFPWV0aDAsMTBNYml0LDFNYml0CisjIFJBVEU9MTI4S2JpdAorIyBXRUlHSFQ9MTBLYml0CisjIFBSSU89NQorIyBSVUxFPTE5Mi4xNjguMS4wLzI0CisjIC0tLS0tLS0tLS04PC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAKKyMgVGhpcyBpcyBtaW5pbWFsIGNvbmZpZ3VyYXRpb24sIHdoZXJlOgorIyBERVZJQ0U6ICBldGgwICAgLSBkZXZpY2Ugd2hlcmUgd2UgZG8gY29udHJvbCBvdXIgdHJhZmZpYworIyAgICAgICAgICAxME1iaXQgLSBSRUFMIGV0aGVybmV0IGNhcmQgYmFuZHdpZHRoCisjICAgICAgICAgIDFNYml0ICAtICJ3ZWlnaHQiIG9mIDoxIGNsYXNzIChwYXJlbnQgZm9yIGFsbCBzaGFwZXJzIGZvciBldGgwKSwKKyMgICAgICAgICAgICAgICAgICAgYXMgYSBydWxlIG9mIHRodW1iIHdlaWdodD1iYXRkd2lkdGgvMTAuCisjICAgICAgICAgIDEwME1iaXQgYWRhcHRlcidzIGV4YW1wbGU6IERFVklDRT1ldGgwLDEwME1iaXQsMTBNYml0CisjICAgICAgICAgICoqKiBJZiB5b3Ugd2FudCB0byBidWlsZCBtb3JlIHRoYW4gb25lIHNoYXBlciBwZXIgZGV2aWNlIGl0J3MKKyMgICAgICAgICAgICAgIGVub3VnaCB0byBkZXNjcmliZSBiYW5kd2lkdGggYW5kIHdlaWdodCBvbmNlICAtIGNicS5pbml0CisjICAgICAgICAgICAgICBpcyBzbWFydCA6KSBZb3UgY2FuIHB1dCBvbmx5ICdERVZJQ0U9ZXRoMCcgaW50byBjYnEtKiAKKyMgICAgICAgICAgICAgIGNvbmZpZyBmaWxlIGZvciBldGgwLgorIyAKKyMgUkFURTogICAgU2hhcGVyJ3Mgc3BlZWQgLSBLYml0LE1iaXQgb3IgYnBzIChieXRlcyBwZXIgc2Vjb25kKQorIyAKKyMgV0VJR0hUOiAgIndlaWdodCIgb2Ygc2hhcGVyIChDQlEgY2xhc3MpLiBMaWtlIGZvciBERVZJQ0UgLSBhcHByb3guIFJBVEUvMTAKKyMgCisjIFBSSU86ICAgIHNoYXBlcidzIHByaW9yaXR5IGZyb20gMSB0byA4IHdoZXJlIDEgaXMgdGhlIGhpZ2hlc3Qgb25lLgorIyAgICAgICAgICBJIGRvIGFsd2F5cyB1c2UgIjUiIGZvciBhbGwgbXkgc2hhcGVycy4KKyMgCisjIFJVTEU6ICAgIFtzb3VyY2UgYWRkcl1bOnNvdXJjZSBwb3J0XSxbZGVzdCBhZGRyXVs6ZGVzdCBwb3J0XQorIyAgICAgICAgICBTb21lIGV4YW1wbGVzOgorIyBSVUxFPTEwLjEuMS4wLzI0OjgwICAgICAgICAgLSBhbGwgdHJhZmZpYyBmb3IgbmV0d29yayAxMC4xLjEuMCB0byBwb3J0IDgwCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc2hhcGVkLgorIyBSVUxFPTEwLjIuMi41ICAgICAgICAgICAgICAgLSBzaGFwZXIgd29ya3Mgb25seSBmb3IgSVAgYWRkcmVzcyAxMC4yLjIuNSAgIAorIyBSVUxFPToyNSwxMC4yLjIuMTI4LzI1OjUwMDAgLSBhbGwgdHJhZmZpYyBmcm9tIGFueSBhZGRyZXNzIGFuZCBwb3J0IDI1IHRvCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgMTAuMi4yLjEyOCAtIDEwLjIuMi4yNTUgYW5kIHBvcnQgNTAwMAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHNoYXBlZC4KKyMgUlVMRT0xMC41LjUuNTo4MCwgICAgICAgICAgIC0gc2hhcGVyIGFjdGl2ZSBvbmx5IGZvciB0cmFmZmljIGZyb20gcG9ydCA4MCBvZgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIDEwLjUuNS41CisjIE11bHRpcGxlIFJVTEUgZmllbGRzIHBlciBvbmUgY29uZmlnIGZpbGUgYXJlIGFsbG93ZWQuIEZvciBleGFtcGxlOgorIyBSVUxFPTEwLjEuMS4yOjgwCisjIFJVTEU9MTAuMS4xLjI6MjUKKyMgUlVMRT0xMC4xLjEuMjoxMTAKKyMgCisjICoqKiBBVFRFTlRJT04hISEKKyMgQWxsIHNoYXBlcnMgZG8gd29yayBvbmx5IGZvciBvdXRnb2luZyB0cmFmZmljIQorIyBTbywgaWYgeW91IHdhbnQgdG8gYnVpbGQgYmlkaXJlY3Rpb25hbCBzaGFwZXIgeW91IG11c3Qgc2V0IGl0IHVwIGZvcgorIyBib3RoIGV0aGVybmV0IGNhcmQuIEZvciBleGFtcGxlIGxldCdzIGJ1aWxkIHNoYXBlciBmb3Igb3VyIGxpbnV4IGJveCBsaWtlOgorIyAKKyMgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0gICAgICAgICAgICAgMTkyLjE2OC4xLjEKKyMgQkFDS0JPTkUgLS0tLS1ldGgwLXwgIGxpbnV4ICB8LWV0aDEtLS0tLS0qW291ciBjbGllbnRdCisjICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tCisjIAorIyBMZXQgYWxsIHRyYWZmaWMgZnJvbSBiYWNrYm9uZSB0byBjbGllbnQgd2lsbCBiZSBzaGFwZWQgYXQgMjhLYml0IGFuZAorIyB0cmFmZmljIGZyb20gY2xpZW50IHRvIGJhY2tib25lIC0gYXQgMTI4S2JpdC4gV2UgbmVlZCB0d28gY29uZmlnIGZpbGVzOgorIyAKKyMgLS0tODwtLS0tLS9ldGMvc3lzY29uZmlnL2NicS9jYnEtMjguY2xpZW50LW91dC0tLS0KKyMgREVWSUNFPWV0aDEsMTBNYml0LDFNYml0CisjIFJBVEU9MjhLYml0CisjIFdFSUdIVD0yS2JpdAorIyBQUklPPTUKKyMgUlVMRT0xOTIuMTY4LjEuMQorIyAtLS04PC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAKKyMgLS0tODwtLS0tLS9ldGMvc3lzY29uZmlnL2NicS9jYnEtMTI4LmNsaWVudC1pbi0tLS0KKyMgREVWSUNFPWV0aDAsMTBNYml0LDFNYml0CisjIFJBVEU9MTI4S2JpdAorIyBXRUlHSFQ9MTBLYml0CisjIFBSSU89NQorIyBSVUxFPTE5Mi4xNjguMS4xLAorIyAtLS04PC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgICAgICAgICAgICAgICAgXnBheSBhdHRlbnRpb24gdG8gIiwiIC0gdGhpcyBpcyBzb3VyY2UgYWRkcmVzcyEKKyMgCisjIEVuam95LgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvZXhhbXBsZXMvU1lOLURvUy5yYXRlLmxpbWl0IGIvaXByb3V0ZTIvZXhhbXBsZXMvU1lOLURvUy5yYXRlLmxpbWl0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NjZiNjcKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9leGFtcGxlcy9TWU4tRG9TLnJhdGUubGltaXQKQEAgLTAsMCArMSw0OSBAQAorIyEgL2Jpbi9zaCAteAorIworIyBzYW1wbGUgc2NyaXB0IG9uIHVzaW5nIHRoZSBpbmdyZXNzIGNhcGFiaWxpdGllcworIyB0aGlzIHNjcmlwdCBzaG93cyBob3cgb25lIGNhbiByYXRlIGxpbWl0IGluY29taW5nIFNZTnMKKyMgVXNlZnVsIGZvciBUQ1AtU1lOIGF0dGFjayBwcm90ZWN0aW9uLiBZb3UgY2FuIHVzZQorIyBJUGNoYWlucyB0byBoYXZlIG1vcmUgcG93ZXJmdWwgYWRkaXRpb25zIHRvIHRoZSBTWU4gKGVnIAorIyBpbiBhZGRpdGlvbiB0aGUgc3VibmV0KQorIworI3BhdGggdG8gdmFyaW91cyB1dGlsaXRpZXM7CisjY2hhbmdlIHRvIHJlZmxlY3QgeW91cnMuCisjCitJUFJPVVRFPS9yb290L0RTLTYtYmV0YS9pcHJvdXRlMi05OTA1MzAtZHNpbmcKK1RDPSRJUFJPVVRFL3RjL3RjCitJUD0kSVBST1VURS9pcC9pcAorSVBDSEFJTlM9L3Jvb3QvRFMtNi1iZXRhL2lwY2hhaW5zLTEuMy45L2lwY2hhaW5zCitJTkRFVj1ldGgyCisjCisjIHRhZyBhbGwgaW5jb21pbmcgU1lOIHBhY2tldHMgdGhyb3VnaCAkSU5ERVYgYXMgbWFyayB2YWx1ZSAxCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCiskSVBDSEFJTlMgLUEgaW5wdXQgLWkgJElOREVWIC15IC1tIDEKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAKKyMKKyMgaW5zdGFsbCB0aGUgaW5ncmVzcyBxZGlzYyBvbiB0aGUgaW5ncmVzcyBpbnRlcmZhY2UKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAKKyRUQyBxZGlzYyBhZGQgZGV2ICRJTkRFViBoYW5kbGUgZmZmZjogaW5ncmVzcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIAorCisjCisjIAorIyBTWU4gcGFja2V0cyBhcmUgNDAgYnl0ZXMgKDMyMCBiaXRzKSBzbyB0aHJlZSBTWU5zIGVxdWFscworIyA5NjAgYml0cyAoYXBwcm94aW1hdGVseSAxa2JpdCk7IHNvIHdlIHJhdGUgbGltaXQgYmVsb3cKKyMgdGhlIGluY29taW5nIFNZTnMgdG8gMy9zZWMgKG5vdCB2ZXJ5IHN1ZWZ1bCByZWFsbHk7IGJ1dAorI3NlcnZlcyB0byBzaG93IHRoZSBwb2ludCAtIEpIUworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIAorJFRDIGZpbHRlciBhZGQgZGV2ICRJTkRFViBwYXJlbnQgZmZmZjogcHJvdG9jb2wgaXAgcHJpbyA1MCBoYW5kbGUgMSBmdyBcCitwb2xpY2UgcmF0ZSAxa2JpdCBidXJzdCA0MCBtdHUgOWsgZHJvcCBmbG93aWQgOjEKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAKKworCisjCitlY2hvICItLS0tIHFkaXNjIHBhcmFtZXRlcnMgSW5ncmVzcyAgLS0tLS0tLS0tLSIKKyRUQyBxZGlzYyBscyBkZXYgJElOREVWCitlY2hvICItLS0tIENsYXNzIHBhcmFtZXRlcnMgSW5ncmVzcyAgLS0tLS0tLS0tLSIKKyRUQyBjbGFzcyBscyBkZXYgJElOREVWCitlY2hvICItLS0tIGZpbHRlciBwYXJhbWV0ZXJzIEluZ3Jlc3MgLS0tLS0tLS0tLSIKKyRUQyBmaWx0ZXIgbHMgZGV2ICRJTkRFViBwYXJlbnQgZmZmZjoKKworI2RlbGV0aW5nIHRoZSBpbmdyZXNzIHFkaXNjCisjJFRDIHFkaXNjIGRlbCAkSU5ERVYgaW5ncmVzcwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvZXhhbXBsZXMvYnBmL1JFQURNRSBiL2lwcm91dGUyL2V4YW1wbGVzL2JwZi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI0NzI1NwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2V4YW1wbGVzL2JwZi9SRUFETUUKQEAgLTAsMCArMSwxMyBAQAorZUJQRiB0b3kgY29kZSBleGFtcGxlcyAocnVubmluZyBpbiBrZXJuZWwpIHRvIGZhbWlsaWFyaXplIHlvdXJzZWxmCit3aXRoIHN5bnRheCBhbmQgZmVhdHVyZXM6CisKKyAtIGJwZl9wcm9nLmMJCS0+IENsYXNzaWZpZXIgZXhhbXBsZXMgd2l0aCB1c2luZyBtYXBzCisgLSBicGZfc2hhcmVkLmMJCS0+IEluZ3Jlc3MvZWdyZXNzIG1hcCBzaGFyaW5nIGV4YW1wbGUKKyAtIGJwZl90YWlsY2FsbC5jCS0+IFVzaW5nIHRhaWwgY2FsbCBjaGFpbnMKKyAtIGJwZl9jeWNsaWMuYwkJLT4gU2ltcGxlIGN5Y2xlIGFzIHRhaWwgY2FsbHMKKyAtIGJwZl9ncmFmdC5jCQktPiBEZW1vIG9uIGFsdGVyaW5nIHJ1bnRpbWUgYmVoYXZpb3VyCisKK1VzZXIgc3BhY2UgY29kZSBleGFtcGxlOgorCisgLSBicGZfYWdlbnQuYwkJLT4gQ291bnRlcnBhcnQgdG8gYnBmX3Byb2cuYyBmb3IgdXNlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2UgdG8gdHJhbnNmZXIvcmVhZCBvdXQgbWFwIGRhdGEKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2V4YW1wbGVzL2JwZi9icGZfYWdlbnQuYyBiL2lwcm91dGUyL2V4YW1wbGVzL2JwZi9icGZfYWdlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWI5Y2UzCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvZXhhbXBsZXMvYnBmL2JwZl9hZ2VudC5jCkBAIC0wLDAgKzEsMjU4IEBACisvKgorICogZUJQRiB1c2VyIHNwYWNlIGFnZW50IHBhcnQKKyAqCisgKiBTaW1wbGUsIF9zZWxmLWNvbnRhaW5lZF8gdXNlciBzcGFjZSBhZ2VudCBmb3IgdGhlIGVCUEYga2VybmVsCisgKiBlYnBmX3Byb2cuYyBwcm9ncmFtLCB3aGljaCBnZXRzIGFsbCBtYXAgZmRzIHBhc3NlZCBmcm9tIHRjIHZpYSB1bml4CisgKiBkb21haW4gc29ja2V0IGluIG9uZSB0cmFuc2FjdGlvbiBhbmQgY2FuIHRodXMga2VlcCByZWZlcmVuY2luZworICogdGhlbSBmcm9tIHVzZXIgc3BhY2UgaW4gb3JkZXIgdG8gcmVhZCBvdXQgKG9yIHBvc3NpYmx5IG1vZGlmeSkKKyAqIG1hcCBkYXRhLiBIZXJlLCBqdXN0IGFzIGEgbWluaW1hbCBleGFtcGxlIHRvIGRpc3BsYXkgY291bnRlcnMuCisgKgorICogVGhlIGFnZW50IG9ubHkgdXNlcyB0aGUgYnBmKDIpIHN5c2NhbGwgQVBJIHRvIHJlYWQgb3IgcG9zc2libHkKKyAqIHdyaXRlIHRvIGVCUEYgbWFwcywgaXQgZG9lc24ndCBuZWVkIHRvIGJlIGF3YXJlIG9mIHRoZSBsb3ctbGV2ZWwKKyAqIGJ5dGVjb2RlIHBhcnRzIGFuZC9vciBFTEYgcGFyc2luZyBiaXRzLgorICoKKyAqICEgRm9yIG1vcmUgZGV0YWlscywgc2VlIGhlYWRlciBjb21tZW50IGluIGJwZl9wcm9nLmMgIQorICoKKyAqIGdjYyBicGZfYWdlbnQuYyAtbyBicGZfYWdlbnQgLVdhbGwgLU8yCisgKgorICogRm9yIGV4YW1wbGUsIGEgbW9yZSBjb21wbGV4IHVzZXIgc3BhY2UgYWdlbnQgY291bGQgcnVuIG9uIGVhY2gKKyAqIGhvc3QsIHJlYWRpbmcgYW5kIHdyaXRpbmcgaW50byBlQlBGIG1hcHMgdXNlZCBieSB0YyBjbGFzc2lmaWVyCisgKiBhbmQgYWN0aW9ucy4gSXQgd291bGQgdGh1cyBhbGxvdyBmb3IgaW1wbGVtZW50aW5nIGEgZGlzdHJpYnV0ZWQKKyAqIHRjIGFyY2hpdGVjdHVyZSwgZm9yIGV4YW1wbGUsIHdoaWNoIHdvdWxkIHB1c2ggZG93biBjZW50cmFsCisgKiBwb2xpY2llcyBpbnRvIGVCUEYgbWFwcywgYW5kIHRodXMgYWx0ZXJpbmcgcnVuLXRpbWUgYmVoYXZpb3VyLgorICoKKyAqICAgLS0gSGFwcHkgZUJQRiBoYWNraW5nISA7KQorICovCisKKyNkZWZpbmUgX0dOVV9TT1VSQ0UKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPHN5cy91bi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisvKiBKdXN0IHNvbWUgbWlzYyBtYWNyb3MgYXMgbWluKCksIG9mZnNldG9mKCksIGV0Yy4gKi8KKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3V0aWxzLmgiCisvKiBDb21tb24gY29kZSBmcm9tIGZkIHBhc3NpbmcuICovCisjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9icGZfc2NtLmgiCisvKiBDb21tb24sIHNoYXJlZCBkZWZpbml0aW9ucyB3aXRoIGVicGZfcHJvZy5jICovCisjaW5jbHVkZSAiYnBmX3NoYXJlZC5oIgorLyogTWluaSBzeXNjYWxsIHdyYXBwZXIgKi8KKyNpbmNsdWRlICJicGZfc3lzLmgiCisKK3N0YXRpYyB2b2lkIGJwZl9kdW1wX2Ryb3BzKGludCBmZCkKK3sKKwlpbnQgY3B1LCBtYXg7CisKKwltYXggPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKworCXByaW50ZigiIGAtIG51bWJlciBvZiBkcm9wczoiKTsKKwlmb3IgKGNwdSA9IDA7IGNwdSA8IG1heDsgY3B1KyspIHsKKwkJbG9uZyBkcm9wczsKKworCQlhc3NlcnQoYnBmX2xvb2t1cF9lbGVtKGZkLCAmY3B1LCAmZHJvcHMpID09IDApOworCQlwcmludGYoIlx0Y3B1JWQ6ICU1bGQiLCBjcHUsIGRyb3BzKTsKKwl9CisJcHJpbnRmKCJcbiIpOworfQorCitzdGF0aWMgdm9pZCBicGZfZHVtcF9xdWV1ZShpbnQgZmQpCit7CisJLyogSnVzdCBmb3IgdGhlIHNhbWUgb2YgdGhlIGV4YW1wbGUuICovCisJaW50IG1heF9xdWV1ZSA9IDQsIGk7CisKKwlwcmludGYoIiAgfCBuaWMgcXVldWVzOiIpOworCWZvciAoaSA9IDA7IGkgPCBtYXhfcXVldWU7IGkrKykgeworCQlzdHJ1Y3QgY291bnRfcXVldWUgY3E7CisJCWludCByZXQ7CisKKwkJbWVtc2V0KCZjcSwgMCwgc2l6ZW9mKGNxKSk7CisJCXJldCA9IGJwZl9sb29rdXBfZWxlbShmZCwgJmksICZjcSk7CisJCWFzc2VydChyZXQgPT0gMCB8fCAocmV0IDwgMCAmJiBlcnJubyA9PSBFTk9FTlQpKTsKKworCQlwcmludGYoIlx0cSVkOltwa3RzOiAlbGQsIG1pczogJWxkXSIsCisJCSAgICAgICBpLCBjcS50b3RhbCwgY3EubWlzbWF0Y2gpOworCX0KKwlwcmludGYoIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGJwZl9kdW1wX3Byb3RvKGludCBmZCkKK3sKKwl1aW50OF90IHByb3Rvc1tdID0geyBJUFBST1RPX1RDUCwgSVBQUk9UT19VRFAsIElQUFJPVE9fSUNNUCB9OworCWNoYXIgKm5hbWVzW10gPSB7ICJ0Y3AiLCAidWRwIiwgImljbXAiIH07CisJaW50IGk7CisKKwlwcmludGYoIiAgYCBwcm90b3M6Iik7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocHJvdG9zKTsgaSsrKSB7CisJCXN0cnVjdCBjb3VudF90dXBsZSBjdDsKKwkJaW50IHJldDsKKworCQltZW1zZXQoJmN0LCAwLCBzaXplb2YoY3QpKTsKKwkJcmV0ID0gYnBmX2xvb2t1cF9lbGVtKGZkLCAmcHJvdG9zW2ldLCAmY3QpOworCQlhc3NlcnQocmV0ID09IDAgfHwgKHJldCA8IDAgJiYgZXJybm8gPT0gRU5PRU5UKSk7CisKKwkJcHJpbnRmKCJcdCVzOltwa3RzOiAlbGQsIGJ5dGVzOiAlbGRdIiwKKwkJICAgICAgIG5hbWVzW2ldLCBjdC5wYWNrZXRzLCBjdC5ieXRlcyk7CisJfQorCXByaW50ZigiXG4iKTsKK30KKworc3RhdGljIHZvaWQgYnBmX2R1bXBfbWFwX2RhdGEoaW50ICp0ZmQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzA7IGkrKykgeworCQljb25zdCBpbnQgcGVyaW9kID0gNTsKKworCQlwcmludGYoImRhdGEsIHBlcmlvZDogJWRzZWNcbiIsIHBlcmlvZCk7CisKKwkJYnBmX2R1bXBfZHJvcHModGZkW0JQRl9NQVBfSURfRFJPUFNdKTsKKwkJYnBmX2R1bXBfcXVldWUodGZkW0JQRl9NQVBfSURfUVVFVUVdKTsKKwkJYnBmX2R1bXBfcHJvdG8odGZkW0JQRl9NQVBfSURfUFJPVE9dKTsKKworCQlzbGVlcChwZXJpb2QpOworCX0KK30KKworc3RhdGljIHZvaWQgYnBmX2luZm9fbG9vcChpbnQgKmZkcywgc3RydWN0IGJwZl9tYXBfYXV4ICphdXgpCit7CisJaW50IGksIHRmZFtCUEZfTUFQX0lEX01BWF07CisKKwlwcmludGYoInZlcjogJWRcbm9iajogJXNcbmRldjogJWx1XG5pbm86ICVsdVxubWFwczogJXVcbiIsCisJICAgICAgIGF1eC0+dWRzX3ZlciwgYXV4LT5vYmpfbmFtZSwgYXV4LT5vYmpfc3Quc3RfZGV2LAorCSAgICAgICBhdXgtPm9ial9zdC5zdF9pbm8sIGF1eC0+bnVtX2VudCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYXV4LT5udW1fZW50OyBpKyspIHsKKwkJcHJpbnRmKCJtYXAlZDpcbiIsIGkpOworCQlwcmludGYoIiBgLSBmZDogJXVcbiIsIGZkc1tpXSk7CisJCXByaW50ZigiICB8IHNlcmlhbDogJXVcbiIsIGF1eC0+ZW50W2ldLmlkKTsKKwkJcHJpbnRmKCIgIHwgdHlwZTogJXVcbiIsIGF1eC0+ZW50W2ldLnR5cGUpOworCQlwcmludGYoIiAgfCBtYXggZWxlbTogJXVcbiIsIGF1eC0+ZW50W2ldLm1heF9lbGVtKTsKKwkJcHJpbnRmKCIgIHwgc2l6ZSBrZXk6ICV1XG4iLCBhdXgtPmVudFtpXS5zaXplX2tleSk7CisJCXByaW50ZigiICBgIHNpemUgdmFsOiAldVxuIiwgYXV4LT5lbnRbaV0uc2l6ZV92YWx1ZSk7CisKKwkJdGZkW2F1eC0+ZW50W2ldLmlkXSA9IGZkc1tpXTsKKwl9CisKKwlicGZfZHVtcF9tYXBfZGF0YSh0ZmQpOworfQorCitzdGF0aWMgdm9pZCBicGZfbWFwX2dldF9mcm9tX2VudihpbnQgKnRmZCkKK3sKKwljaGFyIGtleVs2NF0sICp2YWw7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQlBGX01BUF9JRF9NQVg7IGkrKykgeworCQltZW1zZXQoa2V5LCAwLCBzaXplb2Yoa2V5KSk7CisJCXNucHJpbnRmKGtleSwgc2l6ZW9mKGtleSksICJCUEZfTUFQJWQiLCBpKTsKKworCQl2YWwgPSBnZXRlbnYoa2V5KTsKKwkJYXNzZXJ0KHZhbCAhPSBOVUxMKTsKKworCQl0ZmRbaV0gPSBhdG9pKHZhbCk7CisJfQorfQorCitzdGF0aWMgaW50IGJwZl9tYXBfc2V0X3JlY3YoaW50IGZkLCBpbnQgKmZkcywgIHN0cnVjdCBicGZfbWFwX2F1eCAqYXV4LAorCQkJICAgIHVuc2lnbmVkIGludCBlbnRyaWVzKQoreworCXN0cnVjdCBicGZfbWFwX3NldF9tc2cgbXNnOworCWludCAqY21zZ19idWYsIG1pbl9mZCwgaTsKKwljaGFyICphbXNnX2J1ZiwgKm1tc2dfYnVmOworCisJY21zZ19idWYgPSBicGZfbWFwX3NldF9pbml0KCZtc2csIE5VTEwsIDApOworCWFtc2dfYnVmID0gKGNoYXIgKiltc2cuYXV4LmVudDsKKwltbXNnX2J1ZiA9IChjaGFyICopJm1zZy5hdXg7CisKKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSArPSBtaW5fZmQpIHsKKwkJc3RydWN0IGNtc2doZHIgKmNtc2c7CisJCWludCByZXQ7CisKKwkJbWluX2ZkID0gbWluKEJQRl9TQ01fTUFYX0ZEUyAqIDFVLCBlbnRyaWVzIC0gaSk7CisKKwkJYnBmX21hcF9zZXRfaW5pdF9zaW5nbGUoJm1zZywgbWluX2ZkKTsKKworCQlyZXQgPSByZWN2bXNnKGZkLCAmbXNnLmhkciwgMCk7CisJCWlmIChyZXQgPD0gMCkKKwkJCXJldHVybiByZXQgPyA6IC0xOworCisJCWNtc2cgPSBDTVNHX0ZJUlNUSERSKCZtc2cuaGRyKTsKKwkJaWYgKCFjbXNnIHx8IGNtc2ctPmNtc2dfdHlwZSAhPSBTQ01fUklHSFRTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChtc2cuaGRyLm1zZ19mbGFncyAmIE1TR19DVFJVTkMpCisJCQlyZXR1cm4gLUVJTzsKKworCQltaW5fZmQgPSAoY21zZy0+Y21zZ19sZW4gLSBzaXplb2YoKmNtc2cpKSAvIHNpemVvZihmZCk7CisJCWlmIChtaW5fZmQgPiBlbnRyaWVzIHx8IG1pbl9mZCA8PSAwKQorCQkJcmV0dXJuIC0xOworCisJCW1lbWNweSgmZmRzW2ldLCBjbXNnX2J1Ziwgc2l6ZW9mKGZkc1swXSkgKiBtaW5fZmQpOworCQltZW1jcHkoJmF1eC0+ZW50W2ldLCBhbXNnX2J1Ziwgc2l6ZW9mKGF1eC0+ZW50WzBdKSAqIG1pbl9mZCk7CisJCW1lbWNweShhdXgsIG1tc2dfYnVmLCBvZmZzZXRvZihzdHJ1Y3QgYnBmX21hcF9hdXgsIGVudCkpOworCisJCWlmIChpICsgbWluX2ZkID09IGF1eC0+bnVtX2VudCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGZkc1tCUEZfU0NNX01BWF9GRFNdOworCXN0cnVjdCBicGZfbWFwX2F1eCBhdXg7CisJc3RydWN0IHNvY2thZGRyX3VuIGFkZHI7CisJaW50IGZkLCByZXQsIGk7CisKKwkvKiBXaGVuIGFyZ3VtZW50cyBhcmUgYmVpbmcgcGFzc2VkLCB3ZSB0YWtlIGl0IGFzIGEgcGF0aAorCSAqIHRvIGEgVW5peCBkb21haW4gc29ja2V0LCBvdGhlcndpc2Ugd2UgZ3JhYiB0aGUgZmRzCisJICogZnJvbSB0aGUgZW52aXJvbm1lbnQgdG8gZGVtb25zdHJhdGUgYm90aCBwb3NzaWJpbGl0aWVzLgorCSAqLworCWlmIChhcmdjID09IDEpIHsKKwkJaW50IHRmZFtCUEZfTUFQX0lEX01BWF07CisKKwkJYnBmX21hcF9nZXRfZnJvbV9lbnYodGZkKTsKKwkJYnBmX2R1bXBfbWFwX2RhdGEodGZkKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlmZCA9IHNvY2tldChBRl9VTklYLCBTT0NLX0RHUkFNLCAwKTsKKwlpZiAoZmQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9wZW4gc29ja2V0OiAlc1xuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCWV4aXQoMSk7CisJfQorCisJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworCWFkZHIuc3VuX2ZhbWlseSA9IEFGX1VOSVg7CisJc3RybmNweShhZGRyLnN1bl9wYXRoLCBhcmd2W2FyZ2MgLSAxXSwgc2l6ZW9mKGFkZHIuc3VuX3BhdGgpKTsKKworCXJldCA9IGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKwlpZiAocmV0IDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBiaW5kIHRvIHNvY2tldDogJXNcbiIsCisJCQlzdHJlcnJvcihlcnJubykpOworCQlleGl0KDEpOworCX0KKworCW1lbXNldChmZHMsIDAsIHNpemVvZihmZHMpKTsKKwltZW1zZXQoJmF1eCwgMCwgc2l6ZW9mKGF1eCkpOworCisJcmV0ID0gYnBmX21hcF9zZXRfcmVjdihmZCwgZmRzLCAmYXV4LCBCUEZfU0NNX01BWF9GRFMpOworCWlmIChyZXQgPj0gMCkKKwkJYnBmX2luZm9fbG9vcChmZHMsICZhdXgpOworCisJZm9yIChpID0gMDsgaSA8IGF1eC5udW1fZW50OyBpKyspCisJCWNsb3NlKGZkc1tpXSk7CisKKwljbG9zZShmZCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9leGFtcGxlcy9icGYvYnBmX2N5Y2xpYy5jIGIvaXByb3V0ZTIvZXhhbXBsZXMvYnBmL2JwZl9jeWNsaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjZjYmVjCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvZXhhbXBsZXMvYnBmL2JwZl9jeWNsaWMuYwpAQCAtMCwwICsxLDMwIEBACisjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9icGZfYXBpLmgiCisKKy8qIEN5Y2xpYyBkZXBlbmRlbmN5IGV4YW1wbGUgdG8gdGVzdCB0aGUga2VybmVsJ3MgcnVudGltZSB1cHBlcgorICogYm91bmQgb24gbG9vcHMuIEFsc28gZGVtb25zdHJhdGVzIG9uIGhvdyB0byB1c2UgZGlyZWN0LWFjdGlvbnMsCisgKiBsb2FkZWQgYXM6IHRjIGZpbHRlciBhZGQgWy4uLl0gYnBmIGRhIG9iaiBbLi4uXQorICovCisjZGVmaW5lIEpNUF9NQVBfSUQJMHhhYmNjYmEKKworQlBGX1BST0dfQVJSQVkoam1wX3RjLCBKTVBfTUFQX0lELCBQSU5fT0JKRUNUX05TLCAxKTsKKworX19zZWN0aW9uX3RhaWwoSk1QX01BUF9JRCwgMCkKK2ludCBjbHNfbG9vcChzdHJ1Y3QgX19za19idWZmICpza2IpCit7CisJY2hhciBmbXRbXSA9ICJjYjogJXVcbiI7CisKKwl0cmFjZV9wcmludGsoZm10LCBzaXplb2YoZm10KSwgc2tiLT5jYlswXSsrKTsKKwl0YWlsX2NhbGwoc2tiLCAmam1wX3RjLCAwKTsKKworCXNrYi0+dGNfY2xhc3NpZCA9IFRDX0hfTUFLRSgxLCA0Mik7CisJcmV0dXJuIFRDX0FDVF9PSzsKK30KKworX19zZWN0aW9uX2Nsc19lbnRyeQoraW50IGNsc19lbnRyeShzdHJ1Y3QgX19za19idWZmICpza2IpCit7CisJdGFpbF9jYWxsKHNrYiwgJmptcF90YywgMCk7CisJcmV0dXJuIFRDX0FDVF9TSE9UOworfQorCitCUEZfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9leGFtcGxlcy9icGYvYnBmX2dyYWZ0LmMgYi9pcHJvdXRlMi9leGFtcGxlcy9icGYvYnBmX2dyYWZ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ4ZmQwMgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2V4YW1wbGVzL2JwZi9icGZfZ3JhZnQuYwpAQCAtMCwwICsxLDY3IEBACisjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9icGZfYXBpLmgiCisKKy8qIFRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IGNsYXNzaWZpZXIgcnVuLXRpbWUgYmVoYXZpb3VyCisgKiBjYW4gYmUgYWx0ZXJlZCB3aXRoIHRhaWwgY2FsbHMuIFdlIHN0YXJ0IG91dCB3aXRoIGFuIGVtcHR5CisgKiBqbXBfdGMgYXJyYXksIHRoZW4gYWRkIHNlY3Rpb24gYWFhIHRvIHRoZSBhcnJheSBzbG90IDAsIGFuZAorICogbGF0ZXIgb24gYXRvbWljYWxseSByZXBsYWNlIGl0IHdpdGggc2VjdGlvbiBiYmIuIE5vdGUgdGhhdAorICogYXMgc2hvd24gaW4gb3RoZXIgZXhhbXBsZXMsIHRoZSB0YyBsb2FkZXIgY2FuIHByZXBvcHVsYXRlCisgKiB0YWlsIGNhbGxlZCBzZWN0aW9ucywgaGVyZSB3ZSBzdGFydCBvdXQgd2l0aCBhbiBlbXB0eSBvbmUKKyAqIG9uIHB1cnBvc2UgdG8gc2hvdyBpdCBjYW4gYWxzbyBiZSBkb25lIHRoaXMgd2F5LgorICoKKyAqIHRjIGZpbHRlciBhZGQgZGV2IGZvbyBwYXJlbnQgZmZmZjogYnBmIG9iaiBncmFmdC5vCisgKiB0YyBleGVjIGJwZiBkYmcKKyAqICAgWy4uLl0KKyAqICAgU29ja2V0IFRocmVhZC0yMDIyOSBbMDAxXSAuLnMuIDEzODk5My4wMDM5MjM6IDogZmFsbHRocm91Z2gKKyAqICAgPGlkbGU+LTAgICAgICAgICAgICBbMDAxXSAuLnMuIDEzODk5My4yMDIyNjU6IDogZmFsbHRocm91Z2gKKyAqICAgU29ja2V0IFRocmVhZC0yMDIyOSBbMDAxXSAuLnMuIDEzODk5NC4wMDQxNDk6IDogZmFsbHRocm91Z2gKKyAqICAgWy4uLl0KKyAqCisgKiB0YyBleGVjIGJwZiBncmFmdCBtOmdsb2JhbHMvam1wX3RjIGtleSAwIG9iaiBncmFmdC5vIHNlYyBhYWEKKyAqIHRjIGV4ZWMgYnBmIGRiZworICogICBbLi4uXQorICogICBTb2NrZXQgVGhyZWFkLTE5ODE4IFswMDJdIC4ucy4gMTM5MDEyLjA1MzU4NzogOiBhYWEKKyAqICAgPGlkbGU+LTAgICAgICAgICAgICBbMDAyXSAuLnMuIDEzOTAxMi4xNzIzNTk6IDogYWFhCisgKiAgIFNvY2tldCBUaHJlYWQtMTk4MTggWzAwMV0gLi5zLiAxMzkwMTIuMTczNTU2OiA6IGFhYQorICogICBbLi4uXQorICoKKyAqIHRjIGV4ZWMgYnBmIGdyYWZ0IG06Z2xvYmFscy9qbXBfdGMga2V5IDAgb2JqIGdyYWZ0Lm8gc2VjIGJiYgorICogdGMgZXhlYyBicGYgZGJnCisgKiAgIFsuLi5dCisgKiAgIFNvY2tldCBUaHJlYWQtMTk4MTggWzAwMl0gLi5zLiAxMzkwMjIuMTAyOTY3OiA6IGJiYgorICogICA8aWRsZT4tMCAgICAgICAgICAgIFswMDJdIC4ucy4gMTM5MDIyLjE1NTY0MDogOiBiYmIKKyAqICAgU29ja2V0IFRocmVhZC0xOTgxOCBbMDAxXSAuLnMuIDEzOTAyMi4xNTY3MzA6IDogYmJiCisgKiAgIFsuLi5dCisgKi8KKworQlBGX1BST0dfQVJSQVkoam1wX3RjLCAwLCBQSU5fR0xPQkFMX05TLCAxKTsKKworX19zZWN0aW9uKCJhYWEiKQoraW50IGNsc19hYWEoc3RydWN0IF9fc2tfYnVmZiAqc2tiKQoreworCWNoYXIgZm10W10gPSAiYWFhXG4iOworCisJdHJhY2VfcHJpbnRrKGZtdCwgc2l6ZW9mKGZtdCkpOworCXJldHVybiBUQ19IX01BS0UoMSwgNDIpOworfQorCitfX3NlY3Rpb24oImJiYiIpCitpbnQgY2xzX2JiYihzdHJ1Y3QgX19za19idWZmICpza2IpCit7CisJY2hhciBmbXRbXSA9ICJiYmJcbiI7CisKKwl0cmFjZV9wcmludGsoZm10LCBzaXplb2YoZm10KSk7CisJcmV0dXJuIFRDX0hfTUFLRSgxLCA0Myk7Cit9CisKK19fc2VjdGlvbl9jbHNfZW50cnkKK2ludCBjbHNfZW50cnkoc3RydWN0IF9fc2tfYnVmZiAqc2tiKQoreworCWNoYXIgZm10W10gPSAiZmFsbHRocm91Z2hcbiI7CisKKwl0YWlsX2NhbGwoc2tiLCAmam1wX3RjLCAwKTsKKwl0cmFjZV9wcmludGsoZm10LCBzaXplb2YoZm10KSk7CisKKwlyZXR1cm4gQlBGX0hfREVGQVVMVDsKK30KKworQlBGX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvZXhhbXBsZXMvYnBmL2JwZl9wcm9nLmMgYi9pcHJvdXRlMi9leGFtcGxlcy9icGYvYnBmX3Byb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzI4MDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvZXhhbXBsZXMvYnBmL2JwZl9wcm9nLmMKQEAgLTAsMCArMSw0OTkgQEAKKy8qCisgKiBlQlBGIGtlcm5lbCBzcGFjZSBwcm9ncmFtIHBhcnQKKyAqCisgKiBUb3kgZUJQRiBwcm9ncmFtIGZvciBkZW1vbnN0cmF0aW9uIHB1cnBvc2VzLCBzb21lIHBhcnRzIGRlcml2ZWQgZnJvbQorICoga2VybmVsIHRyZWUncyBzYW1wbGVzL2JwZi9zb2NrZXgyX2tlcm4uYyBleGFtcGxlLgorICoKKyAqIE1vcmUgYmFja2dyb3VuZCBvbiBlQlBGLCBrZXJuZWwgdHJlZTogRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2ZpbHRlci50eHQKKyAqCisgKiBOb3RlLCB0aGlzIGZpbGUgaXMgcmF0aGVyIGxhcmdlLCBhbmQgbW9zdCBjbGFzc2lmaWVyIGFuZCBhY3Rpb25zIGFyZQorICogbGlrZWx5IHNtYWxsZXIgdG8gYWNjb21wbGlzaCBvbmUgc3BlY2lmaWMgdXNlLWNhc2UgYW5kIGFyZSB0YWlsb3JlZAorICogZm9yIGhpZ2ggcGVyZm9ybWFuY2UuIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB5b3UgbWlnaHQgYWxzbyBoYXZlIHRoZQorICogY2xhc3NpZmllciBhbmQgYWN0aW9uIGFscmVhZHkgbWVyZ2VkIGluc2lkZSB0aGUgY2xhc3NpZmllci4KKyAqCisgKiBJbiBvcmRlciB0byBzaG93IHZhcmlvdXMgZmVhdHVyZXMgaXQgc2VydmVzIGFzIGEgYmlnZ2VyIHByb2dyYW1taW5nCisgKiBleGFtcGxlLCB3aGljaCB5b3Ugc2hvdWxkIGZlZWwgZnJlZSB0byByaXAgYXBhcnQgYW5kIGV4cGVyaW1lbnQgd2l0aC4KKyAqCisgKiBDb21waWxhdGlvbiwgY29uZmlndXJhdGlvbiBleGFtcGxlOgorICoKKyAqICBOb3RlOiBhcyBsb25nIGFzIHRoZSBCUEYgYmFja2VuZCBpbiBMTFZNIGlzIHN0aWxsIGV4cGVyaW1lbnRhbCwKKyAqICB5b3UgbmVlZCB0byBidWlsZCBMTFZNIHdpdGggTExWTSB3aXRoIC0tZW5hYmxlLWV4cGVyaW1lbnRhbC10YXJnZXRzPUJQRgorICogIEFsc28sIG1ha2Ugc3VyZSB5b3VyIDQuMSsga2VybmVsIGlzIGNvbXBpbGVkIHdpdGggQ09ORklHX0JQRl9TWVNDQUxMPXksCisgKiAgYW5kIHlvdSBoYXZlIGxpYmVsZi5oIGFuZCBnZWxmLmggaGVhZGVycyBhbmQgY2FuIGxpbmsgdGMgYWdhaW5zdCAtbGVsZi4KKyAqCisgKiAgSW4gY2FzZSB5b3UgbmVlZCB0byBzeW5jIGtlcm5lbCBoZWFkZXJzLCBnbyB0byB5b3VyIGtlcm5lbCBzb3VyY2UgdHJlZToKKyAqICAjIG1ha2UgaGVhZGVyc19pbnN0YWxsIElOU1RBTExfSERSX1BBVEg9L3Vzci8KKyAqCisgKiAgJCBleHBvcnQgUEFUSD0vaG9tZS88Li4uPi9sbHZtL0RlYnVnK0Fzc2VydHMvYmluLzokUEFUSAorICogICQgY2xhbmcgLU8yIC1lbWl0LWxsdm0gLWMgYnBmX3Byb2cuYyAtbyAtIHwgbGxjIC1tYXJjaD1icGYgLWZpbGV0eXBlPW9iaiAtbyBicGYubworICogICQgb2JqZHVtcCAtaCBicGYubworICogIFsuLi5dCisgKiAgMyBjbGFzc2lmaWVyICAgIDAwMDAwN2Y4ICAwMDAwMDAwMDAwMDAwMDAwICAwMDAwMDAwMDAwMDAwMDAwICAwMDAwMDA0MCAgMioqMworICogICAgICAgICAgICAgICAgICBDT05URU5UUywgQUxMT0MsIExPQUQsIFJFTE9DLCBSRUFET05MWSwgQ09ERQorICogIDQgYWN0aW9uLW1hcmsgICAwMDAwMDA4OCAgMDAwMDAwMDAwMDAwMDAwMCAgMDAwMDAwMDAwMDAwMDAwMCAgMDAwMDA4MzggIDIqKjMKKyAqICAgICAgICAgICAgICAgICAgQ09OVEVOVFMsIEFMTE9DLCBMT0FELCBSRUxPQywgUkVBRE9OTFksIENPREUKKyAqICA1IGFjdGlvbi1yYW5kICAgMDAwMDAwOTggIDAwMDAwMDAwMDAwMDAwMDAgIDAwMDAwMDAwMDAwMDAwMDAgIDAwMDAwOGMwICAyKiozCisgKiAgICAgICAgICAgICAgICAgIENPTlRFTlRTLCBBTExPQywgTE9BRCwgUkVMT0MsIFJFQURPTkxZLCBDT0RFCisgKiAgNiBtYXBzICAgICAgICAgIDAwMDAwMDMwICAwMDAwMDAwMDAwMDAwMDAwICAwMDAwMDAwMDAwMDAwMDAwICAwMDAwMDk1OCAgMioqMgorICogICAgICAgICAgICAgICAgICBDT05URU5UUywgQUxMT0MsIExPQUQsIERBVEEKKyAqICA3IGxpY2Vuc2UgICAgICAgMDAwMDAwMDQgIDAwMDAwMDAwMDAwMDAwMDAgIDAwMDAwMDAwMDAwMDAwMDAgIDAwMDAwOTg4ICAyKiowCisgKiAgICAgICAgICAgICAgICAgIENPTlRFTlRTLCBBTExPQywgTE9BRCwgREFUQQorICogIFsuLi5dCisgKiAgIyBlY2hvIDEgPiAvcHJvYy9zeXMvbmV0L2NvcmUvYnBmX2ppdF9lbmFibGUKKyAqICAkIGdjYyBicGZfYWdlbnQuYyAtbyBicGZfYWdlbnQgLVdhbGwgLU8yCisgKiAgIyAuL2JwZl9hZ2VudCAvdG1wL2JwZi11ZHMgICAgICAoZS5nLiBvbiBhIGRpZmZlcmVudCB0ZXJtaW5hbCkKKyAqICAjIHRjIGZpbHRlciBhZGQgZGV2IGVtMSBwYXJlbnQgMTogYnBmIG9iaiBicGYubyBleHAgL3RtcC9icGYtdWRzIGZsb3dpZCAxOjEgXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbiBicGYgb2JqIGJwZi5vIHNlYyBhY3Rpb24tbWFyayAgICAgICAgICAgIFwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24gYnBmIG9iaiBicGYubyBzZWMgYWN0aW9uLXJhbmQgb2sKKyAqICAjIHRjIGZpbHRlciBzaG93IGRldiBlbTEKKyAqICBmaWx0ZXIgcGFyZW50IDE6IHByb3RvY29sIGFsbCBwcmVmIDQ5MTUyIGJwZgorICogIGZpbHRlciBwYXJlbnQgMTogcHJvdG9jb2wgYWxsIHByZWYgNDkxNTIgYnBmIGhhbmRsZSAweDEgZmxvd2lkIDE6MSBicGYubzpbY2xhc3NpZmllcl0KKyAqICAgIGFjdGlvbiBvcmRlciAxOiBicGYgYnBmLm86W2FjdGlvbi1tYXJrXSBkZWZhdWx0LWFjdGlvbiBwaXBlCisgKiAgICBpbmRleCA1MiByZWYgMSBiaW5kIDEKKyAqCisgKiAgICBhY3Rpb24gb3JkZXIgMjogYnBmIGJwZi5vOlthY3Rpb24tcmFuZF0gZGVmYXVsdC1hY3Rpb24gcGlwZQorICogICAgaW5kZXggNTMgcmVmIDEgYmluZCAxCisgKgorICogICAgYWN0aW9uIG9yZGVyIDM6IGdhY3QgYWN0aW9uIHBhc3MKKyAqICAgIHJhbmRvbSB0eXBlIG5vbmUgcGFzcyB2YWwgMAorICogICAgaW5kZXggMzggcmVmIDEgYmluZCAxCisgKgorICogVGhlIHNhbWUgcHJvZ3JhbSBjYW4gYWxzbyBiZSBpbnN0YWxsZWQgb24gaW5ncmVzcyBzaWRlIChhcyBvcHBvc2VkIHRvIGFib3ZlCisgKiBlZ3Jlc3MgY29uZmlndXJhdGlvbiksIGUuZy46CisgKgorICogIyB0YyBxZGlzYyBhZGQgZGV2IGVtMSBoYW5kbGUgZmZmZjogaW5ncmVzcworICogIyB0YyBmaWx0ZXIgYWRkIGRldiBlbTEgcGFyZW50IGZmZmY6IGJwZiBvYmogLi4uCisgKgorICogTm90ZXMgb24gQlBGIGFnZW50OgorICoKKyAqIEluIHRoZSBhYm92ZSBleGFtcGxlLCB0aGUgYnBmX2FnZW50IGNyZWF0ZXMgdGhlIHVuaXggZG9tYWluIHNvY2tldAorICogbmF0aXZlbHkuICJ0YyBleGVjIiBjYW4gYWxzbyBzcGF3biBhIHNoZWxsIGFuZCBob2xkIHRoZSBzb2NrdGVzIHRoZXJlOgorICoKKyAqICAjIHRjIGV4ZWMgYnBmIGltcCAvdG1wL2JwZi11ZHMKKyAqICAjIHRjIGZpbHRlciBhZGQgZGV2IGVtMSBwYXJlbnQgMTogYnBmIG9iaiBicGYubyBleHAgL3RtcC9icGYtdWRzIGZsb3dpZCAxOjEgXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbiBicGYgb2JqIGJwZi5vIHNlYyBhY3Rpb24tbWFyayAgICAgICAgICAgIFwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24gYnBmIG9iaiBicGYubyBzZWMgYWN0aW9uLXJhbmQgb2sKKyAqICBzaC00LjIjIChzaGVsbCBzcGF3bmVkIGZyb20gdGMgZXhlYykKKyAqICBzaC00LjIjIGJwZl9hZ2VudAorICogIFsuLi5dCisgKgorICogVGhpcyB3aWxsIHJlYWQgb3V0IGZkcyBvdmVyIGVudmlyb25tZW50IGFuZCBwcm9kdWNlIHRoZSBzYW1lIGRhdGEgZHVtcAorICogYXMgYmVsb3cuIFRoaXMgaGFzIHRoZSBhZHZhbnRhZ2UgdGhhdCB0aGUgc3Bhd25lZCBzaGVsbCBvd25zIHRoZSBmZHMKKyAqIGFuZCB0aHVzIGlmIHRoZSBhZ2VudCBpcyByZXN0YXJ0ZWQsIGl0IGNhbiByZWF0dGFjaCB0byB0aGUgc2FtZSBmZHMsIGFsc28KKyAqIHZhcmlvdXMgcHJvZ3JhbXMgY2FuIGVhc2lseSByZWFkL21vZGlmeSB0aGUgZGF0YSBzaW11bHRhbmVvdXNseSBmcm9tIHVzZXIKKyAqIHNwYWNlIHNpZGUuCisgKgorICogSWYgdGhlIHNoZWxsIGlzIHVubmVjZXNzYXJ5LCB0aGUgYWdlbnQgY2FuIGFsc28ganVzdCBiZSBzcGF3bmVkIGRpcmVjdGx5CisgKiB2aWEgdGMgZXhlYzoKKyAqCisgKiAgIyB0YyBleGVjIGJwZiBpbXAgL3RtcC9icGYtdWRzIHJ1biBicGZfYWdlbnQKKyAqICAjIHRjIGZpbHRlciBhZGQgZGV2IGVtMSBwYXJlbnQgMTogYnBmIG9iaiBicGYubyBleHAgL3RtcC9icGYtdWRzIGZsb3dpZCAxOjEgXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbiBicGYgb2JqIGJwZi5vIHNlYyBhY3Rpb24tbWFyayAgICAgICAgICAgIFwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24gYnBmIG9iaiBicGYubyBzZWMgYWN0aW9uLXJhbmQgb2sKKyAqCisgKiBCUEYgYWdlbnQgZXhhbXBsZSBvdXRwdXQ6CisgKgorICogdmVyOiAxCisgKiBvYmo6IGJwZi5vCisgKiBkZXY6IDY0NzcwCisgKiBpbm86IDYwNDUxMzMKKyAqIG1hcHM6IDMKKyAqIG1hcDA6CisgKiAgYC0gZmQ6IDQKKyAqICAgfCBzZXJpYWw6IDEKKyAqICAgfCB0eXBlOiAxCisgKiAgIHwgbWF4IGVsZW06IDI1NgorICogICB8IHNpemUga2V5OiAxCisgKiAgIGAgc2l6ZSB2YWw6IDE2CisgKiBtYXAxOgorICogIGAtIGZkOiA1CisgKiAgIHwgc2VyaWFsOiAyCisgKiAgIHwgdHlwZTogMQorICogICB8IG1heCBlbGVtOiAxMDI0CisgKiAgIHwgc2l6ZSBrZXk6IDQKKyAqICAgYCBzaXplIHZhbDogMTYKKyAqIG1hcDI6CisgKiAgYC0gZmQ6IDYKKyAqICAgfCBzZXJpYWw6IDMKKyAqICAgfCB0eXBlOiAyCisgKiAgIHwgbWF4IGVsZW06IDY0CisgKiAgIHwgc2l6ZSBrZXk6IDQKKyAqICAgYCBzaXplIHZhbDogOAorICogZGF0YSwgcGVyaW9kOiA1c2VjCisgKiAgYC0gbnVtYmVyIG9mIGRyb3BzOgljcHUwOiAgICAgMAljcHUxOiAgICAgMAljcHUyOiAgICAgMAljcHUzOiAgICAgMAorICogICB8IG5pYyBxdWV1ZXM6CXEwOltwa3RzOiAwLCBtaXM6IDBdCXExOltwa3RzOiAwLCBtaXM6IDBdCXEyOltwa3RzOiAwLCBtaXM6IDBdCXEzOltwa3RzOiAwLCBtaXM6IDBdCisgKiAgIGAgcHJvdG9zOgl0Y3A6W3BrdHM6IDAsIGJ5dGVzOiAwXQl1ZHA6W3BrdHM6IDAsIGJ5dGVzOiAwXQlpY21wOltwa3RzOiAwLCBieXRlczogMF0KKyAqIGRhdGEsIHBlcmlvZDogNXNlYworICogIGAtIG51bWJlciBvZiBkcm9wczoJY3B1MDogICAgIDUJY3B1MTogICAgIDAJY3B1MjogICAgIDAJY3B1MzogICAgIDEKKyAqICAgfCBuaWMgcXVldWVzOglxMDpbcGt0czogMCwgbWlzOiAwXQlxMTpbcGt0czogMCwgbWlzOiAwXQlxMjpbcGt0czogMjQsIG1pczogMTRdCXEzOltwa3RzOiAwLCBtaXM6IDBdCisgKiAgIGAgcHJvdG9zOgl0Y3A6W3BrdHM6IDEzLCBieXRlczogMTk4OV0JdWRwOltwa3RzOiAxMCwgYnl0ZXM6IDcxMF0JaWNtcDpbcGt0czogMCwgYnl0ZXM6IDBdCisgKiBkYXRhLCBwZXJpb2Q6IDVzZWMKKyAqICBgLSBudW1iZXIgb2YgZHJvcHM6CWNwdTA6ICAgICA1CWNwdTE6ICAgICAwCWNwdTI6ICAgICAzCWNwdTM6ICAgICAzCisgKiAgIHwgbmljIHF1ZXVlczoJcTA6W3BrdHM6IDAsIG1pczogMF0JcTE6W3BrdHM6IDAsIG1pczogMF0JcTI6W3BrdHM6IDM5LCBtaXM6IDIxXQlxMzpbcGt0czogMCwgbWlzOiAwXQorICogICBgIHByb3RvczoJdGNwOltwa3RzOiAyMCwgYnl0ZXM6IDM1NDldCXVkcDpbcGt0czogMTgsIGJ5dGVzOiAxMjc4XQlpY21wOltwa3RzOiAwLCBieXRlczogMF0KKyAqIFsuLi5dCisgKgorICogVGhpcyBub3cgbWVhbnMsIHRoZSBiZWxvdyBjbGFzc2lmaWVyIGFuZCBhY3Rpb24gcGlwZWxpbmUgaGFzIGJlZW4gbG9hZGVkCisgKiBhcyBlQlBGIGJ5dGVjb2RlIGludG8gdGhlIGtlcm5lbCwgdGhlIGtlcm5lbCBoYXMgdmVyaWZpZWQgdGhhdCB0aGUKKyAqIGV4ZWN1dGlvbiBvZiB0aGUgYnl0ZWNvZGUgaXMgInNhZmUiLCBhbmQgaXQgaGFzIEpJVGVkIHRoZSBwcm9ncmFtcworICogYWZ0ZXJ3YXJkcywgc28gdGhhdCB1cG9uIGludm9jYXRpb24gdGhleSdyZSBydW5uaW5nIG9uIG5hdGl2ZSBzcGVlZC4gdGMKKyAqIGhhcyB0cmFuc2ZlcnJlZCBhbGwgbWFwIGZpbGUgZGVzY3JpcHRvcnMgdG8gdGhlIGJwZl9hZ2VudCB2aWEgSVBDIGFuZAorICogZXZlbiBhZnRlciB0YyBleGl0cywgdGhlIGFnZW50IGNhbiByZWFkIG91dCBvciBtb2RpZnkgYWxsIG1hcCBkYXRhLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgZXhwb3J0IHRvIHRoZSB1ZHMgaXMgZG9uZSBvbmx5IG9uY2UgaW4gdGhlIGNsYXNzaWZpZXIgYW5kCisgKiBub3QgaW4gdGhlIGFjdGlvbi4gSXQncyBlbm91Z2ggdG8gZXhwb3J0IHRoZSAoaGVyZSkgc2hhcmVkIGRlc2NyaXB0b3JzCisgKiBvbmNlLgorICoKKyAqIElmIHlvdSBuZWVkIHRvIGRpc2Fzc2VtYmxlIHRoZSBnZW5lcmF0ZWQgSklUIGltYWdlIChlY2hvIHdpdGggMiksIHRoZQorICoga2VybmVsIHRyZWUgaGFzIHVuZGVyIHRvb2xzL25ldC8gYSBzbWFsbCBoZWxwZXIsIHlvdSBjYW4gaW52b2tlIGUuZy4KKyAqIGBicGZfaml0X2Rpc2FzbSAtb2AuCisgKgorICogUGxlYXNlIGZpbmQgaW4gdGhlIGNvZGUgYmVsb3cgZnVydGhlciBjb21tZW50cy4KKyAqCisgKiAgIC0tIEhhcHB5IGVCUEYgaGFja2luZyEgOykKKyAqLworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfdHVubmVsLmg+CisjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvYnBmLmg+CisKKy8qIENvbW1vbiwgc2hhcmVkIGRlZmluaXRpb25zIHdpdGggZWJwZl9hZ2VudC5jLiAqLworI2luY2x1ZGUgImJwZl9zaGFyZWQuaCIKKy8qIEJQRiBoZWxwZXIgZnVuY3Rpb25zIGZvciBvdXIgZXhhbXBsZS4gKi8KKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2JwZl9hcGkuaCIKKworLyogQ291bGQgYmUgZGVmaW5lZCBoZXJlIGFzIHdlbGwsIG9yIGluY2x1ZGVkIGZyb20gdGhlIGhlYWRlci4gKi8KKyNkZWZpbmUgVENfQUNUX1VOU1BFQwkJKC0xKQorI2RlZmluZSBUQ19BQ1RfT0sJCTAKKyNkZWZpbmUgVENfQUNUX1JFQ0xBU1NJRlkJMQorI2RlZmluZSBUQ19BQ1RfU0hPVAkJMgorI2RlZmluZSBUQ19BQ1RfUElQRQkJMworI2RlZmluZSBUQ19BQ1RfU1RPTEVOCQk0CisjZGVmaW5lIFRDX0FDVF9RVUVVRUQJCTUKKyNkZWZpbmUgVENfQUNUX1JFUEVBVAkJNgorCisvKiBPdGhlciwgbWlzYyBzdHVmZi4gKi8KKyNkZWZpbmUgSVBfTUYJCQkweDIwMDAKKyNkZWZpbmUgSVBfT0ZGU0VUCQkweDFGRkYKKworLyogZUJQRiBtYXAgZGVmaW5pdGlvbnMsIGFsbCBwbGFjZWQgaW4gc2VjdGlvbiAibWFwcyIuICovCitzdHJ1Y3QgYnBmX2VsZl9tYXAgX19zZWN0aW9uKCJtYXBzIikgbWFwX3Byb3RvID0geworCS50eXBlCQk9CUJQRl9NQVBfVFlQRV9IQVNILAorCS5pZAkJPQlCUEZfTUFQX0lEX1BST1RPLAorCS5zaXplX2tleQk9CXNpemVvZih1aW50OF90KSwKKwkuc2l6ZV92YWx1ZQk9CXNpemVvZihzdHJ1Y3QgY291bnRfdHVwbGUpLAorCS5tYXhfZWxlbQk9CTI1NiwKK307CisKK3N0cnVjdCBicGZfZWxmX21hcCBfX3NlY3Rpb24oIm1hcHMiKSBtYXBfcXVldWUgPSB7CisJLnR5cGUJCT0JQlBGX01BUF9UWVBFX0hBU0gsCisJLmlkCQk9CUJQRl9NQVBfSURfUVVFVUUsCisJLnNpemVfa2V5CT0Jc2l6ZW9mKHVpbnQzMl90KSwKKwkuc2l6ZV92YWx1ZQk9CXNpemVvZihzdHJ1Y3QgY291bnRfcXVldWUpLAorCS5tYXhfZWxlbQk9CTEwMjQsCit9OworCitzdHJ1Y3QgYnBmX2VsZl9tYXAgX19zZWN0aW9uKCJtYXBzIikgbWFwX2Ryb3BzID0geworCS50eXBlCQk9CUJQRl9NQVBfVFlQRV9BUlJBWSwKKwkuaWQJCT0JQlBGX01BUF9JRF9EUk9QUywKKwkuc2l6ZV9rZXkJPQlzaXplb2YodWludDMyX3QpLAorCS5zaXplX3ZhbHVlCT0Jc2l6ZW9mKGxvbmcpLAorCS5tYXhfZWxlbQk9CTY0LAorfTsKKworLyogSGVscGVyIGZ1bmN0aW9ucyBhbmQgZGVmaW5pdGlvbnMgZm9yIHRoZSBmbG93IGRpc3NlY3RvciB1c2VkIGJ5IHRoZQorICogZXhhbXBsZSBjbGFzc2lmaWVyLiBUaGlzIHJlc2VtYmxlcyB0aGUga2VybmVsJ3MgZmxvdyBkaXNzZWN0b3IgdG8KKyAqIHNvbWUgZXh0ZW5kIGFuZCBpcyBqdXN0IHVzZWQgYXMgYW4gZXhhbXBsZSB0byBzaG93IHdoYXQncyBwb3NzaWJsZQorICogd2l0aCBlQlBGLgorICovCitzdHJ1Y3Qgc29ja2FkZHI7CisKK3N0cnVjdCB2bGFuX2hkciB7CisJX19iZTE2IGhfdmxhbl9UQ0k7CisJX19iZTE2IGhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG87Cit9OworCitzdHJ1Y3QgZmxvd19rZXlzIHsKKwlfX3UzMiBzcmM7CisJX191MzIgZHN0OworCXVuaW9uIHsKKwkJX191MzIgcG9ydHM7CisJCV9fdTE2IHBvcnQxNlsyXTsKKwl9OworCV9fczMyIHRoX29mZjsKKwlfX3U4IGlwX3Byb3RvOworfTsKKworc3RhdGljIGlubGluZSBpbnQgZmxvd19wb3J0c19vZmZzZXQoX191OCBpcF9wcm90bykKK3sKKwlzd2l0Y2ggKGlwX3Byb3RvKSB7CisJY2FzZSBJUFBST1RPX1RDUDoKKwljYXNlIElQUFJPVE9fVURQOgorCWNhc2UgSVBQUk9UT19EQ0NQOgorCWNhc2UgSVBQUk9UT19FU1A6CisJY2FzZSBJUFBST1RPX1NDVFA6CisJY2FzZSBJUFBST1RPX1VEUExJVEU6CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJY2FzZSBJUFBST1RPX0FIOgorCQlyZXR1cm4gNDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBmbG93X2lzX2ZyYWcoc3RydWN0IF9fc2tfYnVmZiAqc2tiLCBpbnQgbmhfb2ZmKQoreworCXJldHVybiAhIShsb2FkX2hhbGYoc2tiLCBuaF9vZmYgKyBvZmZzZXRvZihzdHJ1Y3QgaXBoZHIsIGZyYWdfb2ZmKSkgJgorCQkgIChJUF9NRiB8IElQX09GRlNFVCkpOworfQorCitzdGF0aWMgaW5saW5lIGludCBmbG93X3BhcnNlX2lwdjQoc3RydWN0IF9fc2tfYnVmZiAqc2tiLCBpbnQgbmhfb2ZmLAorCQkJCSAgX191OCAqaXBfcHJvdG8sIHN0cnVjdCBmbG93X2tleXMgKmZsb3cpCit7CisJX191OCBpcF92ZXJfbGVuOworCisJaWYgKHVubGlrZWx5KGZsb3dfaXNfZnJhZyhza2IsIG5oX29mZikpKQorCQkqaXBfcHJvdG8gPSAwOworCWVsc2UKKwkJKmlwX3Byb3RvID0gbG9hZF9ieXRlKHNrYiwgbmhfb2ZmICsgb2Zmc2V0b2Yoc3RydWN0IGlwaGRyLAorCQkJCQkJCSAgICAgcHJvdG9jb2wpKTsKKwlpZiAoKmlwX3Byb3RvICE9IElQUFJPVE9fR1JFKSB7CisJCWZsb3ctPnNyYyA9IGxvYWRfd29yZChza2IsIG5oX29mZiArIG9mZnNldG9mKHN0cnVjdCBpcGhkciwgc2FkZHIpKTsKKwkJZmxvdy0+ZHN0ID0gbG9hZF93b3JkKHNrYiwgbmhfb2ZmICsgb2Zmc2V0b2Yoc3RydWN0IGlwaGRyLCBkYWRkcikpOworCX0KKworCWlwX3Zlcl9sZW4gPSBsb2FkX2J5dGUoc2tiLCBuaF9vZmYgKyAwIC8qIG9mZnNldG9mKHN0cnVjdCBpcGhkciwgaWhsKSAqLyk7CisJaWYgKGxpa2VseShpcF92ZXJfbGVuID09IDB4NDUpKQorCQluaF9vZmYgKz0gMjA7CisJZWxzZQorCQluaF9vZmYgKz0gKGlwX3Zlcl9sZW4gJiAweEYpIDw8IDI7CisKKwlyZXR1cm4gbmhfb2ZmOworfQorCitzdGF0aWMgaW5saW5lIF9fdTMyIGZsb3dfYWRkcl9oYXNoX2lwdjYoc3RydWN0IF9fc2tfYnVmZiAqc2tiLCBpbnQgb2ZmKQoreworCV9fdTMyIHcwID0gbG9hZF93b3JkKHNrYiwgb2ZmKTsKKwlfX3UzMiB3MSA9IGxvYWRfd29yZChza2IsIG9mZiArIHNpemVvZih3MCkpOworCV9fdTMyIHcyID0gbG9hZF93b3JkKHNrYiwgb2ZmICsgc2l6ZW9mKHcwKSAqIDIpOworCV9fdTMyIHczID0gbG9hZF93b3JkKHNrYiwgb2ZmICsgc2l6ZW9mKHcwKSAqIDMpOworCisJcmV0dXJuIHcwIF4gdzEgXiB3MiBeIHczOworfQorCitzdGF0aWMgaW5saW5lIGludCBmbG93X3BhcnNlX2lwdjYoc3RydWN0IF9fc2tfYnVmZiAqc2tiLCBpbnQgbmhfb2ZmLAorCQkJCSAgX191OCAqaXBfcHJvdG8sIHN0cnVjdCBmbG93X2tleXMgKmZsb3cpCit7CisJKmlwX3Byb3RvID0gbG9hZF9ieXRlKHNrYiwgbmhfb2ZmICsgb2Zmc2V0b2Yoc3RydWN0IGlwdjZoZHIsIG5leHRoZHIpKTsKKworCWZsb3ctPnNyYyA9IGZsb3dfYWRkcl9oYXNoX2lwdjYoc2tiLCBuaF9vZmYgKyBvZmZzZXRvZihzdHJ1Y3QgaXB2Nmhkciwgc2FkZHIpKTsKKwlmbG93LT5kc3QgPSBmbG93X2FkZHJfaGFzaF9pcHY2KHNrYiwgbmhfb2ZmICsgb2Zmc2V0b2Yoc3RydWN0IGlwdjZoZHIsIGRhZGRyKSk7CisKKwlyZXR1cm4gbmhfb2ZmICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGZsb3dfZGlzc2VjdG9yKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYiwKKwkJCQkgIHN0cnVjdCBmbG93X2tleXMgKmZsb3cpCit7CisJaW50IHBvZmYsIG5oX29mZiA9IEJQRl9MTF9PRkYgKyBFVEhfSExFTjsKKwlfX2JlMTYgcHJvdG8gPSBza2ItPnByb3RvY29sOworCV9fdTggaXBfcHJvdG87CisKKwkvKiBUT0RPOiBjaGVjayBmb3Igc2tiLT52bGFuX3RjaSwgc2tiLT52bGFuX3Byb3RvIGZpcnN0ICovCisJaWYgKHByb3RvID09IGh0b25zKEVUSF9QXzgwMjFBRCkpIHsKKwkJcHJvdG8gPSBsb2FkX2hhbGYoc2tiLCBuaF9vZmYgKworCQkJCSAgb2Zmc2V0b2Yoc3RydWN0IHZsYW5faGRyLCBoX3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvKSk7CisJCW5oX29mZiArPSBzaXplb2Yoc3RydWN0IHZsYW5faGRyKTsKKwl9CisJaWYgKHByb3RvID09IGh0b25zKEVUSF9QXzgwMjFRKSkgeworCQlwcm90byA9IGxvYWRfaGFsZihza2IsIG5oX29mZiArCisJCQkJICBvZmZzZXRvZihzdHJ1Y3Qgdmxhbl9oZHIsIGhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG8pKTsKKwkJbmhfb2ZmICs9IHNpemVvZihzdHJ1Y3Qgdmxhbl9oZHIpOworCX0KKworCWlmIChsaWtlbHkocHJvdG8gPT0gaHRvbnMoRVRIX1BfSVApKSkKKwkJbmhfb2ZmID0gZmxvd19wYXJzZV9pcHY0KHNrYiwgbmhfb2ZmLCAmaXBfcHJvdG8sIGZsb3cpOworCWVsc2UgaWYgKHByb3RvID09IGh0b25zKEVUSF9QX0lQVjYpKQorCQluaF9vZmYgPSBmbG93X3BhcnNlX2lwdjYoc2tiLCBuaF9vZmYsICZpcF9wcm90bywgZmxvdyk7CisJZWxzZQorCQlyZXR1cm4gZmFsc2U7CisKKwlzd2l0Y2ggKGlwX3Byb3RvKSB7CisJY2FzZSBJUFBST1RPX0dSRTogeworCQlzdHJ1Y3QgZ3JlX2hkciB7CisJCQlfX2JlMTYgZmxhZ3M7CisJCQlfX2JlMTYgcHJvdG87CisJCX07CisKKwkJX191MTYgZ3JlX2ZsYWdzID0gbG9hZF9oYWxmKHNrYiwgbmhfb2ZmICsKKwkJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBncmVfaGRyLCBmbGFncykpOworCQlfX3UxNiBncmVfcHJvdG8gPSBsb2FkX2hhbGYoc2tiLCBuaF9vZmYgKworCQkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IGdyZV9oZHIsIHByb3RvKSk7CisKKwkJaWYgKGdyZV9mbGFncyAmIChHUkVfVkVSU0lPTiB8IEdSRV9ST1VUSU5HKSkKKwkJCWJyZWFrOworCisJCW5oX29mZiArPSA0OworCQlpZiAoZ3JlX2ZsYWdzICYgR1JFX0NTVU0pCisJCQluaF9vZmYgKz0gNDsKKwkJaWYgKGdyZV9mbGFncyAmIEdSRV9LRVkpCisJCQluaF9vZmYgKz0gNDsKKwkJaWYgKGdyZV9mbGFncyAmIEdSRV9TRVEpCisJCQluaF9vZmYgKz0gNDsKKworCQlpZiAoZ3JlX3Byb3RvID09IEVUSF9QXzgwMjFRKSB7CisJCQlncmVfcHJvdG8gPSBsb2FkX2hhbGYoc2tiLCBuaF9vZmYgKworCQkJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3Qgdmxhbl9oZHIsCisJCQkJCQkgICAgICAgaF92bGFuX2VuY2Fwc3VsYXRlZF9wcm90bykpOworCQkJbmhfb2ZmICs9IHNpemVvZihzdHJ1Y3Qgdmxhbl9oZHIpOworCQl9CisJCWlmIChncmVfcHJvdG8gPT0gRVRIX1BfSVApCisJCQluaF9vZmYgPSBmbG93X3BhcnNlX2lwdjQoc2tiLCBuaF9vZmYsICZpcF9wcm90bywgZmxvdyk7CisJCWVsc2UgaWYgKGdyZV9wcm90byA9PSBFVEhfUF9JUFY2KQorCQkJbmhfb2ZmID0gZmxvd19wYXJzZV9pcHY2KHNrYiwgbmhfb2ZmLCAmaXBfcHJvdG8sIGZsb3cpOworCQllbHNlCisJCQlyZXR1cm4gZmFsc2U7CisJCWJyZWFrOworCX0KKwljYXNlIElQUFJPVE9fSVBJUDoKKwkJbmhfb2ZmID0gZmxvd19wYXJzZV9pcHY0KHNrYiwgbmhfb2ZmLCAmaXBfcHJvdG8sIGZsb3cpOworCQlicmVhazsKKwljYXNlIElQUFJPVE9fSVBWNjoKKwkJbmhfb2ZmID0gZmxvd19wYXJzZV9pcHY2KHNrYiwgbmhfb2ZmLCAmaXBfcHJvdG8sIGZsb3cpOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCW5oX29mZiArPSBmbG93X3BvcnRzX29mZnNldChpcF9wcm90byk7CisKKwlmbG93LT5wb3J0cyA9IGxvYWRfd29yZChza2IsIG5oX29mZik7CisJZmxvdy0+dGhfb2ZmID0gbmhfb2ZmOworCWZsb3ctPmlwX3Byb3RvID0gaXBfcHJvdG87CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsc191cGRhdGVfcHJvdG9fbWFwKGNvbnN0IHN0cnVjdCBfX3NrX2J1ZmYgKnNrYiwKKwkJCQkJY29uc3Qgc3RydWN0IGZsb3dfa2V5cyAqZmxvdykKK3sKKwl1aW50OF90IHByb3RvID0gZmxvdy0+aXBfcHJvdG87CisJc3RydWN0IGNvdW50X3R1cGxlICpjdCwgX2N0OworCisJY3QgPSBtYXBfbG9va3VwX2VsZW0oJm1hcF9wcm90bywgJnByb3RvKTsKKwlpZiAobGlrZWx5KGN0KSkgeworCQlsb2NrX3hhZGQoJmN0LT5wYWNrZXRzLCAxKTsKKwkJbG9ja194YWRkKCZjdC0+Ynl0ZXMsIHNrYi0+bGVuKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE5vIGhpdCB5ZXQsIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGVudHJ5LiAqLworCV9jdC5wYWNrZXRzID0gMTsKKwlfY3QuYnl0ZXMgPSBza2ItPmxlbjsKKworCW1hcF91cGRhdGVfZWxlbSgmbWFwX3Byb3RvLCAmcHJvdG8sICZfY3QsIEJQRl9BTlkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xzX3VwZGF0ZV9xdWV1ZV9tYXAoY29uc3Qgc3RydWN0IF9fc2tfYnVmZiAqc2tiKQoreworCXVpbnQzMl90IHF1ZXVlID0gc2tiLT5xdWV1ZV9tYXBwaW5nOworCXN0cnVjdCBjb3VudF9xdWV1ZSAqY3EsIF9jcTsKKwlib29sIG1pc21hdGNoOworCisJbWlzbWF0Y2ggPSBza2ItPnF1ZXVlX21hcHBpbmcgIT0gZ2V0X3NtcF9wcm9jZXNzb3JfaWQoKTsKKworCWNxID0gbWFwX2xvb2t1cF9lbGVtKCZtYXBfcXVldWUsICZxdWV1ZSk7CisJaWYgKGxpa2VseShjcSkpIHsKKwkJbG9ja194YWRkKCZjcS0+dG90YWwsIDEpOworCQlpZiAobWlzbWF0Y2gpCisJCQlsb2NrX3hhZGQoJmNxLT5taXNtYXRjaCwgMSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBObyBoaXQgeWV0LCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBlbnRyeS4gKi8KKwlfY3EudG90YWwgPSAxOworCV9jcS5taXNtYXRjaCA9IG1pc21hdGNoID8gMSA6IDA7CisKKwltYXBfdXBkYXRlX2VsZW0oJm1hcF9xdWV1ZSwgJnF1ZXVlLCAmX2NxLCBCUEZfQU5ZKTsKK30KKworLyogZUJQRiBwcm9ncmFtIGRlZmluaXRpb25zLCBwbGFjZWQgaW4gdmFyaW91cyBzZWN0aW9ucywgd2hpY2ggY2FuCisgKiBoYXZlIGN1c3RvbSBzZWN0aW9uIG5hbWVzLiBJZiBjdXN0b20gbmFtZXMgYXJlIGluIHVzZSwgaXQncworICogcmVxdWlyZWQgdG8gcG9pbnQgdGMgdG8gdGhlIGNvcnJlY3Qgc2VjdGlvbiwgZS5nLgorICoKKyAqICAgICB0YyBmaWx0ZXIgYWRkIFsuLi5dIGJwZiBvYmogY2xzLm8gc2VjIGNscy10b3MgWy4uLl0KKyAqCisgKiBpbiBjYXNlIHRoZSBwcm9ncmFtIHJlc2lkZXMgaW4gX19zZWN0aW9uKCJjbHMtdG9zIikuCisgKgorICogRGVmYXVsdCBzZWN0aW9uIGZvciBjbHNfYnBmIGlzOiAiY2xhc3NpZmllciIsIGZvciBhY3RfYnBmIGlzOgorICogImFjdGlvbiIuIE5hdHVyYWxseSwgaWYgZm9yIGV4YW1wbGUgbXVsdGlwbGUgYWN0aW9ucyBhcmUgcHJlc2VudAorICogaW4gdGhlIHNhbWUgZmlsZSwgdGhleSBuZWVkIHRvIGhhdmUgZGlzdGluY3Qgc2VjdGlvbiBuYW1lcy4KKyAqCisgKiBJdCBpcyBob3dldmVyIG5vdCByZXF1aXJlZCB0byBoYXZlIG11bHRpcGxlIHByb2dyYW1zIHNoYXJpbmcKKyAqIGEgZmlsZS4KKyAqLworX19zZWN0aW9uKCJjbGFzc2lmaWVyIikKK2ludCBjbHNfbWFpbihzdHJ1Y3QgX19za19idWZmICpza2IpCit7CisJc3RydWN0IGZsb3dfa2V5cyBmbG93OworCisJaWYgKCFmbG93X2Rpc3NlY3Rvcihza2IsICZmbG93KSkKKwkJcmV0dXJuIDA7IC8qIE5vIG1hdGNoIGluIGNsc19icGYuICovCisKKwljbHNfdXBkYXRlX3Byb3RvX21hcChza2IsICZmbG93KTsKKwljbHNfdXBkYXRlX3F1ZXVlX21hcChza2IpOworCisJcmV0dXJuIGZsb3cuaXBfcHJvdG87Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhY3RfdXBkYXRlX2Ryb3BfbWFwKHZvaWQpCit7CisJdWludDMyX3QgKmNvdW50LCBjcHUgPSBnZXRfc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJY291bnQgPSBtYXBfbG9va3VwX2VsZW0oJm1hcF9kcm9wcywgJmNwdSk7CisJaWYgKGNvdW50KQorCQkvKiBPbmx5IHRoaXMgY3B1IGlzIGFjY2Vzc2luZyB0aGlzIGVsZW1lbnQuICovCisJCSgqY291bnQpKys7Cit9CisKK19fc2VjdGlvbigiYWN0aW9uLW1hcmsiKQoraW50IGFjdF9tYXJrX21haW4oc3RydWN0IF9fc2tfYnVmZiAqc2tiKQoreworCS8qIFlvdSBjb3VsZCBhbHNvIG1hbmdsZSBza2IgZGF0YSBoZXJlIHdpdGggdGhlIGhlbHBlciBmdW5jdGlvbgorCSAqIEJQRl9GVU5DX3NrYl9zdG9yZV9ieXRlcywgZXRjLiBPciwgYWx0ZXJuYXRpdmVseSB5b3UgY291bGQKKwkgKiBkbyB0aGF0IGFscmVhZHkgaW4gdGhlIGNsYXNzaWZpZXIgaXRzZWxmIGFzIGEgbWVyZ2VkIGNvbWJpbmF0aW9uCisJICogb2YgY2xhc3NpZmllciduJ2FjdGlvbiBtb2RlbC4KKwkgKi8KKworCWlmIChza2ItPm1hcmsgPT0gMHhjYWZlKSB7CisJCWFjdF91cGRhdGVfZHJvcF9tYXAoKTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCS8qIERlZmF1bHQgY29uZmlndXJlZCB0YyBvcGNvZGUuICovCisJcmV0dXJuIFRDX0FDVF9VTlNQRUM7Cit9CisKK19fc2VjdGlvbigiYWN0aW9uLXJhbmQiKQoraW50IGFjdF9yYW5kX21haW4oc3RydWN0IF9fc2tfYnVmZiAqc2tiKQoreworCS8qIFNvcnJ5LCB3ZSdyZSBuZWFyIGV2ZW50IGhvcml6b24gLi4uICovCisJaWYgKChnZXRfcHJhbmRvbV91MzIoKSAmIDMpID09IDApIHsKKwkJYWN0X3VwZGF0ZV9kcm9wX21hcCgpOworCQlyZXR1cm4gVENfQUNUX1NIT1Q7CisJfQorCisJcmV0dXJuIFRDX0FDVF9VTlNQRUM7Cit9CisKKy8qIExhc3QgYnV0IG5vdCBsZWFzdCwgdGhlIGZpbGUgY29udGFpbnMgYSBsaWNlbnNlLiBTb21lIGZ1dHVyZSBoZWxwZXIKKyAqIGZ1bmN0aW9ucyBtYXkgb25seSBiZSBhdmFpbGFibGUgd2l0aCBhIEdQTCBsaWNlbnNlLgorICovCitCUEZfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9leGFtcGxlcy9icGYvYnBmX3NoYXJlZC5jIGIvaXByb3V0ZTIvZXhhbXBsZXMvYnBmL2JwZl9zaGFyZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2NjMGFkCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvZXhhbXBsZXMvYnBmL2JwZl9zaGFyZWQuYwpAQCAtMCwwICsxLDQ4IEBACisjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9icGZfYXBpLmgiCisKKy8qIE1pbmltYWwsIHN0YW5kLWFsb25lIHRveSBtYXAgcGlubmluZyBleGFtcGxlOgorICoKKyAqIGNsYW5nIC10YXJnZXQgYnBmIC1PMiBbLi4uXSAtbyBicGZfc2hhcmVkLm8gLWMgYnBmX3NoYXJlZC5jCisgKiB0YyBmaWx0ZXIgYWRkIGRldiBmb28gcGFyZW50IDE6IGJwZiBvYmogYnBmX3NoYXJlZC5vIHNlYyBlZ3Jlc3MKKyAqIHRjIGZpbHRlciBhZGQgZGV2IGZvbyBwYXJlbnQgZmZmZjogYnBmIG9iaiBicGZfc2hhcmVkLm8gc2VjIGluZ3Jlc3MKKyAqCisgKiBCb3RoIGNsYXNzaWZpZXIgd2lsbCBzaGFyZSB0aGUgdmVyeSBzYW1lIG1hcCBpbnN0YW5jZSBpbiB0aGlzIGV4YW1wbGUsCisgKiBzbyBtYXAgY29udGVudCBjYW4gYmUgYWNjZXNzZWQgZnJvbSBpbmdyZXNzICphbmQqIGVncmVzcyBzaWRlIQorICoKKyAqIFRoaXMgZXhhbXBsZSBoYXMgYSBwaW5uaW5nIG9mIFBJTl9PQkpFQ1RfTlMsIHNvIGl0J3MgcHJpdmF0ZSBhbmQKKyAqIHRodXMgc2hhcmVkIGFtb25nIHZhcmlvdXMgcHJvZ3JhbSBzZWN0aW9ucyB3aXRoaW4gdGhlIG9iamVjdC4KKyAqCisgKiBBIHNldHRpbmcgb2YgUElOX0dMT0JBTF9OUyB3b3VsZCBwbGFjZSBpdCBpbnRvIGEgZ2xvYmFsIG5hbWVzcGFjZSwKKyAqIHNvIHRoYXQgaXQgY2FuIGJlIHNoYXJlZCBhbW9uZyBkaWZmZXJlbnQgb2JqZWN0IGZpbGVzLiBBIHNldHRpbmcKKyAqIG9mIFBJTl9OT05FICg9IDApIG1lYW5zIG5vIHNoYXJpbmcsIHNvIGVhY2ggdGMgaW52b2NhdGlvbiBhIG5ldyBtYXAKKyAqIGluc3RhbmNlIGlzIGJlaW5nIGNyZWF0ZWQuCisgKi8KKworQlBGX0FSUkFZNChtYXBfc2gsIDAsIFBJTl9PQkpFQ1RfTlMsIDEpOyAvKiBvciBQSU5fR0xPQkFMX05TLCBvciBQSU5fTk9ORSAqLworCitfX3NlY3Rpb24oImVncmVzcyIpCitpbnQgZW1haW4oc3RydWN0IF9fc2tfYnVmZiAqc2tiKQoreworCWludCBrZXkgPSAwLCAqdmFsOworCisJdmFsID0gbWFwX2xvb2t1cF9lbGVtKCZtYXBfc2gsICZrZXkpOworCWlmICh2YWwpCisJCWxvY2tfeGFkZCh2YWwsIDEpOworCisJcmV0dXJuIEJQRl9IX0RFRkFVTFQ7Cit9CisKK19fc2VjdGlvbigiaW5ncmVzcyIpCitpbnQgaW1haW4oc3RydWN0IF9fc2tfYnVmZiAqc2tiKQoreworCWNoYXIgZm10W10gPSAibWFwIHZhbDogJWRcbiI7CisJaW50IGtleSA9IDAsICp2YWw7CisKKwl2YWwgPSBtYXBfbG9va3VwX2VsZW0oJm1hcF9zaCwgJmtleSk7CisJaWYgKHZhbCkKKwkJdHJhY2VfcHJpbnRrKGZtdCwgc2l6ZW9mKGZtdCksICp2YWwpOworCisJcmV0dXJuIEJQRl9IX0RFRkFVTFQ7Cit9CisKK0JQRl9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2V4YW1wbGVzL2JwZi9icGZfc2hhcmVkLmggYi9pcHJvdXRlMi9leGFtcGxlcy9icGYvYnBmX3NoYXJlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNDAzOGQKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9leGFtcGxlcy9icGYvYnBmX3NoYXJlZC5oCkBAIC0wLDAgKzEsMjIgQEAKKyNpZm5kZWYgX19CUEZfU0hBUkVEX18KKyNkZWZpbmUgX19CUEZfU0hBUkVEX18KKworZW51bSB7CisJQlBGX01BUF9JRF9QUk9UTywKKwlCUEZfTUFQX0lEX1FVRVVFLAorCUJQRl9NQVBfSURfRFJPUFMsCisJX19CUEZfTUFQX0lEX01BWCwKKyNkZWZpbmUgQlBGX01BUF9JRF9NQVgJX19CUEZfTUFQX0lEX01BWAorfTsKKworc3RydWN0IGNvdW50X3R1cGxlIHsKKwlsb25nIHBhY2tldHM7IC8qIHR5cGUgbG9uZyBmb3IgbG9ja194YWRkKCkgKi8KKwlsb25nIGJ5dGVzOworfTsKKworc3RydWN0IGNvdW50X3F1ZXVlIHsKKwlsb25nIHRvdGFsOworCWxvbmcgbWlzbWF0Y2g7Cit9OworCisjZW5kaWYgLyogX19CUEZfU0hBUkVEX18gKi8KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2V4YW1wbGVzL2JwZi9icGZfc3lzLmggYi9pcHJvdXRlMi9leGFtcGxlcy9icGYvYnBmX3N5cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNGYwOWUKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9leGFtcGxlcy9icGYvYnBmX3N5cy5oCkBAIC0wLDAgKzEsMjMgQEAKKyNpZm5kZWYgX19CUEZfU1lTX18KKyNkZWZpbmUgX19CUEZfU1lTX18KKworI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8bGludXgvYnBmLmg+CisKK3N0YXRpYyBpbmxpbmUgX191NjQgYnBmX3B0cl90b191NjQoY29uc3Qgdm9pZCAqcHRyKQoreworCXJldHVybiAoX191NjQpICh1bnNpZ25lZCBsb25nKSBwdHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGJwZl9sb29rdXBfZWxlbShpbnQgZmQsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUpCit7CisJdW5pb24gYnBmX2F0dHIgYXR0ciA9IHsKKwkJLm1hcF9mZAkJPSBmZCwKKwkJLmtleQkJPSBicGZfcHRyX3RvX3U2NChrZXkpLAorCQkudmFsdWUJCT0gYnBmX3B0cl90b191NjQodmFsdWUpLAorCX07CisKKwlyZXR1cm4gc3lzY2FsbChfX05SX2JwZiwgQlBGX01BUF9MT09LVVBfRUxFTSwgJmF0dHIsIHNpemVvZihhdHRyKSk7Cit9CisKKyNlbmRpZiAvKiBfX0JQRl9TWVNfXyAqLwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvZXhhbXBsZXMvYnBmL2JwZl90YWlsY2FsbC5jIGIvaXByb3V0ZTIvZXhhbXBsZXMvYnBmL2JwZl90YWlsY2FsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MDc5MGQKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9leGFtcGxlcy9icGYvYnBmX3RhaWxjYWxsLmMKQEAgLTAsMCArMSw5OSBAQAorI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvYnBmX2FwaS5oIgorCisjZGVmaW5lIEVOVFJZX0lOSVQJMworI2RlZmluZSBFTlRSWV8wCQkwCisjZGVmaW5lIEVOVFJZXzEJCTEKKyNkZWZpbmUgTUFYX0pNUF9TSVpFCTIKKworI2RlZmluZSBGT08JCTQyCisjZGVmaW5lIEJBUgkJNDMKKworLyogVGhpcyBleGFtcGxlIGRvZXNuJ3QgcmVhbGx5IGRvIGFueXRoaW5nIHVzZWZ1bCwgYnV0IGl0J3MgcHVycG9zZSBpcyB0bworICogZGVtb25zdHJhdGUgZUJQRiB0YWlsIGNhbGxzIG9uIGEgdmVyeSBzaW1wbGUgZXhhbXBsZS4KKyAqCisgKiBjbHNfZW50cnkoKSBpcyBvdXIgY2xhc3NpZmllciBlbnRyeSBwb2ludCwgZnJvbSB0aGVyZSB3ZSBqdW1wIGJhc2VkIG9uCisgKiBza2ItPmhhc2ggaW50byBjbHNfY2FzZTEoKSBvciBjbHNfY2FzZTIoKS4gVGhleSBhcmUgYm90aCBwYXJ0IG9mIHRoZQorICogcHJvZ3JhbSBhcnJheSBqbXBfdGMuIEluZGljYXRlZCB2aWEgX19zZWN0aW9uX3RhaWwoKSwgdGhlIHRjIGxvYWRlcgorICogcG9wdWxhdGVzIHRoZSBwcm9ncmFtIGFycmF5cyB3aXRoIHRoZSBsb2FkZWQgZmlsZSBkZXNjcmlwdG9ycyBhbHJlYWR5LgorICoKKyAqIFRvIGRlbW9uc3RyYXRlIG5lc3RlZCBqdW1wcywgY2xzX2Nhc2UyKCkganVtcHMgd2l0aGluIHRoZSBzYW1lIGptcF90YworICogYXJyYXkgdG8gY2xzX2Nhc2UxKCkuIEFuZCB3aGVuZXZlciB3ZSBhcnJpdmUgYXQgY2xzX2Nhc2UxKCksIHdlIGp1bXAKKyAqIGludG8gY2xzX2V4aXQoKSwgcGFydCBvZiB0aGUganVtcCBhcnJheSBqbXBfZXguCisgKgorICogQWxzbywgdG8gc2hvdyBpdCdzIHBvc3NpYmxlLCBhbGwgcHJvZ3JhbXMgc2hhcmUgbWFwX3NoIGFuZCBkdW1wIHRoZSB2YWx1ZQorICogdGhhdCB0aGUgZW50cnkgcG9pbnQgaW5jcmVtZW50ZWQuIFRoZSBzZWN0aW9ucyB0aGF0IGFyZSBsb2FkZWQgaW50byBhCisgKiBwcm9ncmFtIGFycmF5IGNhbiBiZSBhdG9taWNhbGx5IHJlcGxhY2VkIGR1cmluZyBydW4tdGltZSwgZS5nLiB0byBjaGFuZ2UKKyAqIGNsYXNzaWZpZXIgYmVoYXZpb3VyLgorICovCisKK0JQRl9QUk9HX0FSUkFZKGptcF90YywgRk9PLCBQSU5fT0JKRUNUX05TLCBNQVhfSk1QX1NJWkUpOworQlBGX1BST0dfQVJSQVkoam1wX2V4LCBCQVIsIFBJTl9PQkpFQ1RfTlMsIDEpOworCitCUEZfQVJSQVk0KG1hcF9zaCwgMCwgUElOX09CSkVDVF9OUywgMSk7CisKK19fc2VjdGlvbl90YWlsKEZPTywgRU5UUllfMCkKK2ludCBjbHNfY2FzZTEoc3RydWN0IF9fc2tfYnVmZiAqc2tiKQoreworCWNoYXIgZm10W10gPSAiY2FzZTE6IG1hcC12YWw6ICVkIGZyb206JXVcbiI7CisJaW50IGtleSA9IDAsICp2YWw7CisKKwl2YWwgPSBtYXBfbG9va3VwX2VsZW0oJm1hcF9zaCwgJmtleSk7CisJaWYgKHZhbCkKKwkJdHJhY2VfcHJpbnRrKGZtdCwgc2l6ZW9mKGZtdCksICp2YWwsIHNrYi0+Y2JbMF0pOworCisJc2tiLT5jYlswXSA9IEVOVFJZXzA7CisJdGFpbF9jYWxsKHNrYiwgJmptcF9leCwgRU5UUllfMCk7CisKKwlyZXR1cm4gQlBGX0hfREVGQVVMVDsKK30KKworX19zZWN0aW9uX3RhaWwoRk9PLCBFTlRSWV8xKQoraW50IGNsc19jYXNlMihzdHJ1Y3QgX19za19idWZmICpza2IpCit7CisJY2hhciBmbXRbXSA9ICJjYXNlMjogbWFwLXZhbDogJWQgZnJvbToldVxuIjsKKwlpbnQga2V5ID0gMCwgKnZhbDsKKworCXZhbCA9IG1hcF9sb29rdXBfZWxlbSgmbWFwX3NoLCAma2V5KTsKKwlpZiAodmFsKQorCQl0cmFjZV9wcmludGsoZm10LCBzaXplb2YoZm10KSwgKnZhbCwgc2tiLT5jYlswXSk7CisKKwlza2ItPmNiWzBdID0gRU5UUllfMTsKKwl0YWlsX2NhbGwoc2tiLCAmam1wX3RjLCBFTlRSWV8wKTsKKworCXJldHVybiBCUEZfSF9ERUZBVUxUOworfQorCitfX3NlY3Rpb25fdGFpbChCQVIsIEVOVFJZXzApCitpbnQgY2xzX2V4aXQoc3RydWN0IF9fc2tfYnVmZiAqc2tiKQoreworCWNoYXIgZm10W10gPSAiZXhpdDogbWFwLXZhbDogJWQgZnJvbToldVxuIjsKKwlpbnQga2V5ID0gMCwgKnZhbDsKKworCXZhbCA9IG1hcF9sb29rdXBfZWxlbSgmbWFwX3NoLCAma2V5KTsKKwlpZiAodmFsKQorCQl0cmFjZV9wcmludGsoZm10LCBzaXplb2YoZm10KSwgKnZhbCwgc2tiLT5jYlswXSk7CisKKwkvKiBUZXJtaW5hdGlvbiBwb2ludC4gKi8KKwlyZXR1cm4gQlBGX0hfREVGQVVMVDsKK30KKworX19zZWN0aW9uX2Nsc19lbnRyeQoraW50IGNsc19lbnRyeShzdHJ1Y3QgX19za19idWZmICpza2IpCit7CisJY2hhciBmbXRbXSA9ICJmYWxsdGhyb3VnaFxuIjsKKwlpbnQga2V5ID0gMCwgKnZhbDsKKworCS8qIEZvciB0cmFuc2ZlcnJpbmcgc3RhdGUsIHdlIGNhbiB1c2Ugc2tiLT5jYlswXSAuLi4gc2tiLT5jYls0XS4gKi8KKwl2YWwgPSBtYXBfbG9va3VwX2VsZW0oJm1hcF9zaCwgJmtleSk7CisJaWYgKHZhbCkgeworCQlsb2NrX3hhZGQodmFsLCAxKTsKKworCQlza2ItPmNiWzBdID0gRU5UUllfSU5JVDsKKwkJdGFpbF9jYWxsKHNrYiwgJmptcF90Yywgc2tiLT5oYXNoICYgKE1BWF9KTVBfU0laRSAtIDEpKTsKKwl9CisKKwl0cmFjZV9wcmludGsoZm10LCBzaXplb2YoZm10KSk7CisJcmV0dXJuIEJQRl9IX0RFRkFVTFQ7Cit9CisKK0JQRl9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2V4YW1wbGVzL2NicS5pbml0LXYwLjcuMyBiL2lwcm91dGUyL2V4YW1wbGVzL2NicS5pbml0LXYwLjcuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmMwZDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvZXhhbXBsZXMvY2JxLmluaXQtdjAuNy4zCkBAIC0wLDAgKzEsOTgzIEBACisjIS9iaW4vYmFzaAorIworIyAgICBjYnEuaW5pdCB2MC43LjMKKyMgICAgQ29weXJpZ2h0IChDKSAxOTk5ICBQYXZlbCBHb2x1YmV2IDxwZ0Brc2ktbGludXguY29tPgorIyAgICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCAgTHVib21pciBCdWxlaiA8cGFsbGFzQGthZGFuLmN6PgorIworIyAgICBjaGtjb25maWc6ICAgMjM0NSAxMSA4OQorIyAgICBkZXNjcmlwdGlvbjogc2V0cyB1cCBDQlEtYmFzZWQgdHJhZmZpYyBjb250cm9sCisjCisjICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisjCisjICAgIFRvIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24sIGNoZWNrIG9uIEZyZXNobWVhdCBmb3IgYWN0dWFsIGxvY2F0aW9uOgorIworIwkJaHR0cDovL2ZyZXNobWVhdC5uZXQvcHJvamVjdHMvY2JxLmluaXQKKyMKKyMKKyMgVkVSU0lPTiBISVNUT1JZCisjIC0tLS0tLS0tLS0tLS0tLQorIyB2MC43LjMtIERlZXBhayBTaW5naGFsIDxzaW5naGFsIGF0IHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyMJICAtIGZpeCB0aW1lY2hlY2sgdG8gbm90IGlnbm9yZSByZWd1bGFyIFRJTUUgcnVsZXMgYWZ0ZXIKKyMJICAgIGVuY291bnRlcmluZyBhIFRJTUUgcnVsZSB0aGF0IHNwYW5zIG92ZXIgbWlkbmlnaHQKKyMJLSBOYXRoYW4gU2hhZmVyIDxuaWNvZGVtdXMgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0PgorIwkgIC0gYWxsb3cgc3ltbGlua3MgdG8gY2xhc3MgZmlsZXMKKyMJLSBTZXRoIEouIEJsYW5rIDxhbnRpZnJlZXplIGF0IHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyMJICAtIHJlcGxhY2UgaGFyZGNvZGVkIGlwL3RjIGxvY2F0aW9uIHdpdGggdmFyaWFibGVzCisjCS0gTWFyayBEYXZpcyA8bWFyay5kYXZpcyBhdCBnbXguZGU+CisjCSAgLSBhbGxvdyBzZXR0aW5nIG9mIFBSSU9fe01BUkssUlVMRSxSRUFMTX0gaW4gY2xhc3MgZmlsZQorIwktIEZlcm5hbmRvIFNhbmNoIDx0b3B0bmMgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0PgorIwkgIC0gYWxsb3cgdW5kZXJzY29yZXMgaW4gaW50ZXJmYWNlIG5hbWVzCisjIHYwLjcuMi0gUGF1bG8gU2VkcmV6CisjCSAgLSBmaXggdGltZTJhYnMgdG8gYWxsb3cgaG91cnMgd2l0aCBsZWFkaW5nIHplcm8gaW4gVElNRSBydWxlcworIwktIFN2ZXRsaW4gU2ltZW9ub3YgPHp2ZXJvIGF0IHlhaG9vLmNvbT4KKyMJICAtIGZpeCBjYnFfZGV2aWNlX2xpc3QgdG8gYWxsb3cgVkxBTiBpbnRlcmZhY2VzCisjCS0gTWFyayBEYXZpcyA8bWFyay5kYXZpcyBhdCBnbXguZGU+CisjCSAgLSBpZ25vcmUgKn4gYmFja3VwIGZpbGVzIHdoZW4gbG9va2luZyBmb3IgY2xhc3NlcworIwktIE1pa2UgQm95ZXIgPGJveWVyIGF0IGFkbWluaXN0cmF0aXZlLmNvbT4KKyMJICAtIGZpeCB0byBhbGxvdyBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvICJyZXN0YXJ0IiBjb21tYW5kCisjIHYwLjcuMS0gTHVib21pciBCdWxlaiA8cGFsbGFzIGF0IGthZGFuLmN6PgorIwkgIC0gZGVmYXVsdCB2YWx1ZSBmb3IgUEVSVFVSQgorIwkgIC0gZml4ZWQgc21hbGwgYnVnIGluIFJVTEUgcGFyc2VyIHRvIGNvcnJlY3RseSBwYXJzZSBydWxlcyB3aXRoCisjCSAgICBpZGVudGljYWwgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBmaWVsZHMKKyMJICAtIGZhc3RlciBpbml0aWFsIHNjYW5uaW5nIG9mIERFVklDRSBmaWVsZHMKKyMgdjAuNwktIEx1Ym9taXIgQnVsZWogPHBhbGxhcyBhdCBrYWRhbi5jej4KKyMJICAtIGxvdHMgb2YgdmFyaW91cyBjbGVhbnVwcyBhbmQgcmVvcmdhbml6YXRpb25zOyB0aGUgcGFyc2luZyBpcyBub3cKKyMJICAgIHNvbWUgNDAlIGZhc3RlciwgYnV0IHRoZSBjbGFzcyBJRCBtdXN0IGJlIGluIHJhbmdlIDB4MDAwMi0weGZmZmYKKyMJICAgIChhZ2FpbikuIEJlY2F1c2Ugb2YgdGhlIG51bWJlciBvZiBpbnRlcm5hbCBjaGFuZ2VzIGFuZCB0aGUgYWJvdmUKKyMJICAgIGNsYXNzIElEIHJlc3RyaWN0aW9uLCBJIGJ1bXBlZCB0aGUgdmVyc2lvbiB0byAwLjcgdG8gaW5kaWNhdGUKKyMJICAgIHNvbWV0aGluZyBtaWdodCBoYXZlIGdvdCBicm9rZW4gOikKKyMJICAtIGNoYW5nZWQgUFJJT197VTMyLEZXLFJPVVRFfSB0byBQUklPX3tSVUxFLE1BUkssUkVBTE19CisjCSAgICBmb3IgY29uc2lzdGVuY3kgd2l0aCBmaWx0ZXIga2V5d29yZHMKKyMJICAtIGV4cG9zZWQgImNvbXBpbGUiIGNvbW1hbmQKKyMJLSBDYXRhbGluIFBldHJlc2N1IDx0YXogYXQgZG50aXMucm8+CisjCSAgLSBzdXBwb3J0IGZvciBwb3J0IG1hc2tzIGluIFJVTEUgKHUzMikgZmlsdGVyCisjCS0gSm9yZGFuIFZydGFub3NraSA8b2JlbGlrcyBhdCBtdC5uZXQubWs+CisjCSAgLSBzdXBwb3J0IGZvciB3ZWVrIGRheXMgaW4gVElNRSBydWxlcworIyB2MC42LjQtIEx1Ym9taXIgQnVsZWogPHBhbGxhcyBhdCBrYWRhbi5jej4KKyMJICAtIGFkZGVkIFBSSU9fKiB2YXJpYWJsZXMgdG8gYWxsb3cgZWFzeSBjb250cm9sIG9mIGZpbHRlciBwcmlvcml0aWVzCisjCSAgLSBhZGRlZCBjYWNoaW5nIHRvIHNwZWVkIHVwIENCUSBzdGFydCwgdGhlIGNhY2hlIGlzIGludmFsaWRhdGVkCisjCSAgICB3aGVuZXZlciBhbnkgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgY2hhbmdlcworIwkgIC0gdXBkYXRlZCB0aGUgcmVhZG1lIHNlY3Rpb24gKyBzb21lIGNvc21ldGljIGZpeGVzCisjIHYwLjYuMy0gTHVib21pciBCdWxlaiA8cGFsbGFzIGF0IGthZGFuLmN6PgorIwkgIC0gcmVtb3ZlZCBzZXR1cCBvZiAodW5uZWNlc3NhcnkpIGNsYXNzIDE6MSAtIGFsbCBjbGFzc2VzCisjCSAgICBub3cgdXNlIHFkaXNjJ3MgZGVmYXVsdCBjbGFzcyAxOjAgYXMgdGhlaXIgcGFyZW50CisjCSAgLSBtaW5vciBmaXggaW4gdGhlIHRpbWVjaGVjayBicmFuY2ggLSBjbGFzc2VzCisjCSAgICB3aXRob3V0IGxlYWYgcWRpc2Mgd2VyZSBub3QgdXBkYXRlZAorIwkgIC0gbWlub3IgZml4IHRvIGF2b2lkIHRpbWVjaGVjayBmYWlsdXJlIHdoZW4gcnVuCisjCSAgICBhdCB0aW1lIHdpdGggbWludXRlcyBlcXVhbCB0byAwOCBvciAwOQorIwkgIC0gcmVzcGVjdCBDQlFfUEFUSCBzZXR0aW5nIGluIGVudmlyb25tZW50CisjCSAgLSBtYWRlIFBSSU89NSBkZWZhdWx0LCByZW5kZXJpbmcgaXQgb3B0aW9uYWwgaW4gY29uZmlncworIwkgIC0gYWRkZWQgc3VwcG9ydCBmb3Igcm91dGUgZmlsdGVyLCBzZWUgbm90ZXMgYWJvdXQgUkVBTE0ga2V5d29yZAorIwkgIC0gYWRkZWQgc3VwcG9ydCBmb3IgZncgZmlsdGVyLCBzZWUgbm90ZXMgYWJvdXQgTUFSSyBrZXl3b3JkCisjCSAgLSBhZGRlZCBmaWx0ZXIgZGlzcGxheSB0byAibGlzdCIgYW5kICJzdGF0cyIgY29tbWFuZHMKKyMJICAtIHJlYWRtZSBzZWN0aW9uIHVwZGF0ZSArIHZhcmlvdXMgY29zbWV0aWMgZml4ZXMKKyMgdjAuNi4yLSBDYXRhbGluIFBldHJlc2N1IDx0YXogYXQgZG50aXMucm8+CisjCSAgLSBhZGRlZCB0dW5uZWxzIGludGVyZmFjZSBoYW5kbGluZworIyB2MC42LjEtIFBhdmVsIEdvbHViZXYgPHBnIGF0IGtzaS1saW51eC5jb20+CisjCSAgLSBhZGRlZCBzY2hfcHJpbyBtb2R1bGUgbG9hZGluZworIwkgICAgKHRoYW5rcyBqb2hhbiBhdCBpZ2xvLnZpcnR1YWwub3IuaWQgZm9yIHJlbWluZGluZykKKyMJICAtIHJlc29sdmVkIGVycm9ycyByZXN1bHRpbmcgZnJvbSBzdHJpY3RlciBzeW50YXggY2hlY2tpbmcgaW4gYmFzaDIKKyMJLSBMdWJvbWlyIEJ1bGVqIDxwYWxsYXMgYXQga2FkYW4uY3o+CisjCSAgLSB2YXJpb3VzIGNvc21ldGljIGZpeGVzCisjIHYwLjYJLSBMdWJvbWlyIEJ1bGVqIDxwYWxsYXMgYXQga2FkYW4uY3o+CisjCSAgLSBhdHRlbXB0IHRvIGxpbWl0IG51bWJlciBvZiBzcGF3bmVkIHByb2Nlc3NlcyBieSB1dGlsaXppbmcKKyMJICAgIG1vcmUgb2Ygc2VkIHBvd2VyICh1c2Ugc2VkIGluc3RlYWQgb2YgZ3JlcCtjdXQpCisjCSAgLSBzaW1wbGlmaWVkIFRJTUUgcGFyc2VyLCB1c2luZyBiYXNoIGJ1aWx0aW5zCisjCSAgLSBhZGRlZCBpbml0aWFsIHN1cHBvcnQgZm9yIFNGUSBhcyBsZWFmIHFkaXNjCisjCSAgLSByZXdvcmtlZCB0aGUgZG9jdW1lbnRhdGlvbiBwYXJ0IGEgbGl0dGxlCisjCSAgLSBpbmNvcnBvcmF0ZWQgcGVuZGluZyBwYXRjaGVzIGFuZCBpZGVhcyBzdWJtaXR0ZWQgYnkKKyMJICAgIGZvbGxvd2luZyBwZW9wbGUgZm9yIHZlcnNpb25zIDAuMyBpbnRvIHZlcnNpb24gMC42CisjCS0gTWlndWVsIEZyZWl0YXMgPG1pZ3VlbCBhdCBjZXR1Yy5wdWMtcmlvLmJyPgorIwkgIC0gaW4gY2FzZSBvZiBvdmVybGFwcGluZyBUSU1FIHBhcmFtZXRlcnMsIHRoZSBsYXN0IG1hdGNoIGlzIHRha2VuCisjCS0gSnVhbmpvIENpYXJsYW50ZSA8ampvIGF0IG1lbmRvemEuZ292LmFyPgorIwkgIC0gY2hrY29uZmlnIHRhZ3MsIGxpc3QgKyBzdGF0cyBzdGFydHVwIHBhcmFtZXRlcnMKKyMJICAtIG9wdGlvbmFsIHRjICYgaXAgY29tbWFuZCBsb2dnaW5nIChpbnRvIC92YXIvcnVuL2NicS0qKQorIwktIFJhZmFsIE1hc3prb3dza2kgPHJ6bSBhdCBpY20uZWR1LnBsPgorIwkgIC0gUEVBSyBwYXJhbWV0ZXIgZm9yIHNldHRpbmcgVEJGJ3MgYnVyc3QgcGVhayByYXRlCisjCSAgLSBmaXggZm9yIG1hbnkgY29uZmlnIGZpbGVzICh1c2UgZmluZCBpbnN0ZWFkIG9mIGxzKQorIyB2MC41LjEtIEx1Ym9taXIgQnVsZWogPHBhbGxhcyBhdCBrYWRhbi5jej4KKyMJICAtIGZpeGVkIGxpdHRsZSBidXQgc2VyaW91cyBidWcgaW4gUlVMRSBwYXJzZXIKKyMgdjAuNQktIEx1Ym9taXIgQnVsZWogPHBhbGxhcyBhdCBrYWRhbi5jej4KKyMJICAtIGFkZGVkIG9wdGlvbnMgUEFSRU5ULCBMRUFGLCBJU09MQVRFRCBhbmQgQk9VTkRFRC4gVGhpcyBhbGxvd3MKKyMJICAgICh3aXRoIHNvbWUgYXR0ZW50aW9uIHRvIGNvbmZpZyBmaWxlIG9yZGVyaW5nKSBmb3IgY3JlYXRpbmcKKyMJICAgIGhpZXJhcmNoaWNhbCBzdHJ1Y3R1cmVzIG9mIHNoYXBlcnMgd2l0aCBjbGFzc2VzIGFibGUgKG9yIHVuYWJsZSkKKyMJICAgIHRvIGJvcnJvdyBiYW5kd2lkdGggZnJvbSB0aGVpciBwYXJlbnRzLgorIwkgIC0gY2xhc3MgSUQgY2hlY2sgYWxsb3dzIGhleGFkZWNpbWFsIG51bWJlcnMKKyMJICAtIHJld3JpdHRlbiAmIHNpbXBsaWZpZWQgUlVMRSBwYXJzZXIKKyMJICAtIGNvc21ldGljIGNoYW5nZXMgdG8gaW1wcm92ZSByZWFkYWJpbGl0eQorIwkgIC0gcmVvcmdhbml6YXRpb24gdG8gYXZvaWQgZHVwbGljYXRlIGNvZGUgKHRpbWVjaGVjayBldGMuKQorIwkgIC0gdGltZWNoZWNrIGRvZXNuJ3QgY2hlY2sgY2xhc3NlcyB3aXRob3V0IFRJTUUgZmllbGRzIGFueW1vcmUKKyMgdjAuNCAgLSBMdWJvbWlyIEJ1bGVqIDxwYWxsYXMgYXQga2FkYW4uY3o+CisjCSAgLSBzbWFsbCBidWdmaXggaW4gUlVMRSBwYXJzaW5nIGNvZGUKKyMJICAtIHNpbXBsaWZpZWQgY29uZmlndXJhdGlvbiBwYXJzaW5nIGNvZGUKKyMJICAtIHNldmVyYWwgc21hbGwgY29zbWV0aWMgY2hhbmdlcworIwkgIC0gVElNRSBwYXJhbWV0ZXIgY2FuIGJlIG5vdyBzcGVjaWZpZWQgbW9yZSB0aGFuIG9uY2UgYWxsb3dpbmcgeW91IHRvCisjCSAgICBkaWZmZXJlbnRpYXRlIFJBVEUgdGhyb3VnaG91dCB0aGUgd2hvbGUgZGF5LiBUaW1lIG92ZXJsYXBwaW5nIGlzCisjCSAgICBub3QgY2hlY2tlZCwgZmlyc3QgbWF0Y2ggaXMgdGFrZW4uIE1pZG5pZ2h0IHdyYXAgKGVnLiAyMDowMC02OjAwKQorIwkgICAgaXMgYWxsb3dlZCBhbmQgdGFrZW4gY2FyZSBvZi4KKyMgdjAuM2E0LSBmaXhlZCBzbWFsbCBidWcgaW4gSUYgb3BlcmF0b3IuIFRoYW5rcyB0bworIwkgIFJhZmFsIE1hc3prb3dza2kgPHJ6bSBhdCBpY20uZWR1LnBsPgorIyB2MC4zYTMtIGZpeGVkIGdyZXAgYnVnIHdoZW4gdXNpbmcgbW9yZSB0aGFuIDEwIGV0aCBkZXZpY2VzLiBUaGFua3MgdG8gRGF2aWQKKyMJICBUcmNrYSA8dHJja2EgYXQgcG9kYS5jej4uCisjIHYwLjNhMi0gZml4ZWQgYnVnIGluICJpZiIgb3BlcmF0b3IuIFRoYW5rcyBrYWQgYXQgZGd0dS5kb25ldHNrLnVhLgorIyB2MC4zYSAtIGFkZGVkIFRJTUUgcGFyYW1ldGVyLiBFeGFtcGxlOiBUSU1FPTAwOjAwLTE5OjAwOzY0S2JpdC82S2JpdAorIwkgIFNvLCBiZXR3ZWVuIDAwOjAwIGFuZCAxOTowMCB0aGUgUkFURSB3aWxsIGJlIDY0S2JpdC4KKyMJICBKdXN0IHN0YXJ0ICJjYnEuaW5pdCB0aW1lY2hlY2siIHBlcmlvZGljYWxseSBmcm9tIGNyb24KKyMJICAoZXZlcnkgMTAgbWludXRlcyBmb3IgZXhhbXBsZSkuIERPTidUIEZPUkdFVCB0aG91Z2gsIHRvIHJ1bgorIwkgICJjYnEuaW5pdCBzdGFydCIgZm9yIENCUSB0byBpbml0aWFsaXplLgorIyB2MC4yICAtIFNvbWUgY29zbWV0aWMgY2hhbmdlcy4gTm93IGl0IGlzIG1vcmUgY29tcGF0aWJsZSB3aXRoIG9sZCBiYXNoCisjCSAgdmVyc2lvbi4gVGhhbmtzIHRvIFN0YW5pc2xhdiBWLiBWb3JvbnlpIDxzdGFzIGF0IGNudGkudWFuZXQua2hhcmtvdi51YT4uCisjIHYwLjEgIC0gRmlyc3QgcHVibGljIHJlbGVhc2UKKyMKKyMKKyMgUkVBRE1FCisjIC0tLS0tLQorIworIyBGaXJzdCBvZiBhbGwgLSB0aGlzIGlzIGp1c3QgYSBTSU1QTEUgRVhBTVBMRSBvZiBDQlEgcG93ZXIuCisjIERvbid0IGFzayBtZSAid2h5IiBhbmQgImhvdyIgOikKKyMKKyMgVGhpcyBzY3JpcHQgaXMgbWVhbnQgdG8gc2ltcGxpZnkgc2V0dXAgYW5kIG1hbmFnZW1lbnQgb2YgcmVsYXRpdmVseSBzaW1wbGUKKyMgQ0JRLWJhc2VkIHRyYWZmaWMgY29udHJvbCBvbiBMaW51eC4gQWNjZXNzIHRvIGFkdmFuY2VkIG5ldHdvcmtpbmcgZmVhdHVyZXMKKyMgb2YgTGludXgga2VybmVsIGlzIHByb3ZpZGVkIGJ5ICJpcCIgYW5kICJ0YyIgdXRpbGl0aWVzIGZyb20gQS4gS3V6bmV0c292J3MKKyMgaXByb3V0ZTIgcGFja2FnZSwgYXZhaWxhYmxlIGF0IGZ0cDovL2Z0cC5pbnIuYWMucnUvaXAtcm91dGluZy4gQmVjYXVzZSB0aGUKKyMgdXRpbGl0aWVzIHNlcnZlIHByaW1hcmlseSB0byB0cmFuc2xhdGUgdXNlciB3aXNoZXMgdG8gUlRORVRMSU5LIGNvbW1hbmRzLAorIyB0aGVpciBpbnRlcmZhY2UgaXMgcmF0aGVyIHNwYXJ0YW4sIGludG9sZXJhbnQgYW5kIHJlcXVpcmVzIHF1aXRlIGEgbG90IG9mCisjIHR5cGluZy4gQW5kIHR5cGluZyBpcyB3aGF0IHRoaXMgc2NyaXB0IGF0dGVtcHRzIHRvIHJlZHVjZSA6KQorIworIyBUaGUgYWR2YW5jZWQgbmV0d29ya2luZyBzdHVmZiBpbiBMaW51eCBpcyBwcmV0dHkgZmxleGlibGUgYW5kIHRoaXMgc2NyaXB0CisjIGFpbXMgdG8gYnJpbmcgc29tZSBvZiBpdHMgZmVhdHVyZXMgdG8gdGhlIG5vdC1zby1oYXJkLWNvcmUgTGludXggdXNlcnMuIE9mCisjIGNvdXJzZSwgdGhlcmUgaXMgYSB0cmFkZW9mZiBiZXR3ZWVuIHNpbXBsaWNpdHkgYW5kIGZsZXhpYmlsaXR5IGFuZCB5b3UgbWF5CisjIHJlYWxpemUgdGhhdCB0aGUgZmxleGliaWxpdHkgc3VmZmVyZWQgdG9vIG11Y2ggZm9yIHlvdXIgbmVlZHMgLS0gdGltZSB0bworIyBmYWNlICJpcCIgYW5kICJ0YyIgaW50ZXJmYWNlLgorIworIyBUbyBzcGVlZCB1cCB0aGUgInN0YXJ0IiBjb21tYW5kLCBzaW1wbGUgY2FjaGluZyB3YXMgaW50cm9kdWNlZCBpbiB2ZXJzaW9uCisjIDAuNi40LiBUaGUgY2FjaGluZyB3b3JrcyBzbyB0aGF0IHRoZSBzZXF1ZW5jZSBvZiAidGMiIGNvbW1hbmRzIGZvciBnaXZlbgorIyBjb25maWd1cmF0aW9uIGlzIHN0b3JlZCBpbiBhIGZpbGUgKC92YXIvY2FjaGUvY2JxLmluaXQgYnkgZGVmYXVsdCkgd2hpY2gKKyMgaXMgdXNlZCBuZXh0IHRpbWUgdGhlICJzdGFydCIgY29tbWFuZCBpcyBydW4gdG8gYXZvaWQgcmVwZWF0ZWQgcGFyc2luZyBvZgorIyBjb25maWd1cmF0aW9uIGZpbGVzLiBUaGlzIGNhY2hlIGlzIGludmFsaWRhdGVkIHdoZW5ldmVyIGFueSBvZiB0aGUgQ0JRCisjIGNvbmZpZ3VyYXRpb24gZmlsZXMgY2hhbmdlcy4gSWYgeW91IHdhbnQgdG8gcnVuICJjYnEuaW5pdCBzdGFydCIgd2l0aG91dAorIyBjYWNoaW5nLCBydW4gaXQgYXMgImNicS5pbml0IHN0YXJ0IG5vY2FjaGUiLiBJZiB5b3Ugd2FudCB0byBmb3JjZSBjYWNoZQorIyBpbnZhbGlkYXRpb24sIHJ1biBpdCBhcyAiY2JxLmluaXQgc3RhcnQgaW52YWxpZGF0ZSIuIENhY2hpbmcgaXMgZGlzYWJsZWQKKyMgaWYgeW91IGhhdmUgbG9nZ2luZyBlbmFibGVkIChpZS4gQ0JRX0RFQlVHIGlzIG5vdCBlbXB0eSkuCisjCisjIElmIHlvdSBvbmx5IHdhbnQgY3FiLmluaXQgdG8gdHJhbnNsYXRlIHlvdXIgY29uZmlndXJhdGlvbiB0byAidGMiIGNvbW1hbmRzLAorIyB1c2UgImNvbXBpbGUiIGNvbW1hbmQgd2hpY2ggd2lsbCBvdXRwdXQgInRjIiBjb21tYW5kcyByZXF1aXJlZCB0byBidWlsZAorIyB5b3VyIGNvbmZpZ3VyYXRpb24uIEJlYXIgaW4gbWluZCB0aGF0ICJjb21waWxlIiBkb2VzIG5vdCBjaGVjayBpZiB0aGUgInRjIgorIyBjb21tYW5kcyB3ZXJlIHN1Y2Nlc3NmdWwgLSB0aGlzIGlzIGRvbmUgKGluIGNlcnRhaW4gcGxhY2VzKSBvbmx5IHdoZW4gdGhlCisjICJzdGFydCBub2NhY2hlIiBjb21tYW5kIGlzIHVzZWQsIHdoaWNoIGlzIGFsc28gdXNlZnVsIHdoZW4gY3JlYXRpbmcgdGhlCisjIGNvbmZpZ3VyYXRpb24gdG8gY2hlY2sgd2hldGhlciBpdCBpcyBjb21wbGV0ZWx5IHZhbGlkLgorIworIyBBbGwgQ0JRIHBhcmFtZXRlcnMgYXJlIHZhbGlkIGZvciBFdGhlcm5ldCBpbnRlcmZhY2VzIG9ubHksIFRoZSBzY3JpcHQgd2FzCisjIHRlc3RlZCBvbiB2YXJpb3VzIExpbnV4IGtlcm5lbCB2ZXJzaW9ucyBmcm9tIHNlcmllcyAyLjEgdG8gMi40IGFuZCBzZXZlcmFsCisjIGRpc3RyaWJ1dGlvbnMgd2l0aCBLU0kgTGludXggKE5vc3Ryb21vIHZlcnNpb24pIGFzIHRoZSBwcmVtaWVyIG9uZS4KKyMKKyMKKyMgSE9XIERPRVMgSVQgV09SSz8KKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMKKyMgRXZlcnkgdHJhZmZpYyBjbGFzcyBtdXN0IGJlIGRlc2NyaWJlZCBieSBhIGZpbGUgaW4gdGhlICRDQlFfUEFUSCBkaXJlY3RvcnkKKyMgKC9ldGMvc3lzY29uZmlnL2NicSBieSBkZWZhdWx0KSAtIG9uZSBmaWxlIHBlciBjbGFzcy4KKyMKKyMgVGhlIGNvbmZpZyBmaWxlIG5hbWVzIG11c3Qgb2JleSBtYW5kYXRvcnkgZm9ybWF0OiBjYnEtPGNsc2lkPi48bmFtZT4gd2hlcmUKKyMgPGNsc2lkPiBpcyB0d28tYnl0ZSBoZXhhZGVjaW1hbCBudW1iZXIgaW4gcmFuZ2UgPDAwMDItRkZGRj4gKHdoaWNoIGluIGZhY3QKKyMgaXMgYSBDQlEgY2xhc3MgSUQpIGFuZCA8bmFtZT4gaXMgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIC0tIGFueXRoaW5nIHRvIGhlbHAKKyMgeW91IGRpc3Rpbmd1aXNoIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzLiBGb3Igc21hbGwgYW1vdW50IG9mIGNsYXNzZXMgaXQgaXMKKyMgb2Z0ZW4gcG9zc2libGUgKGFuZCBjb252ZW5pZW50KSB0byBsZXQgPGNsc2lkPiByZXNlbWJsZSBiYW5kd2lkdGggb2YgdGhlCisjIGNsYXNzLgorIworIyBFeGFtcGxlIG9mIHZhbGlkIGNvbmZpZyBuYW1lOgorIwljYnEtMTI4MC5NeV9maXJzdF9zaGFwZXIKKyMKKyMKKyMgVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBtYXkgY29udGFpbiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisjCisjIyMgRGV2aWNlIHBhcmFtZXRlcnMKKyMKKyMgREVWSUNFPTxpZm5hbWU+LDxiYW5kd2lkdGg+Wyw8d2VpZ2h0Pl0JbWFuZGF0b3J5CisjIERFVklDRT1ldGgwLDEwTWJpdCwxTWJpdAorIworIwk8aWZuYW1lPiBpcyB0aGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlIHlvdSB3YW50IHRvIGNvbnRyb2wKKyMJCXRyYWZmaWMgb24sIGUuZy4gZXRoMAorIwk8YmFuZHdpZHRoPiBpcyB0aGUgcGh5c2ljYWwgYmFuZHdpZHRoIG9mIHRoZSBkZXZpY2UsIGUuZy4gZm9yCisjCQlldGhlcm5ldCAxME1iaXQgb3IgMTAwTWJpdCwgZm9yIGFyY25ldCAyTWJpdAorIwk8d2VpZ2h0PiBpcyB0dW5pbmcgcGFyYW1ldGVyIHRoYXQgc2hvdWxkIGJlIHByb3BvcnRpb25hbCB0bworIwkJPGJhbmR3aWR0aD4uIEFzIGEgcnVsZSBvZiB0aHVtYjogPHdlaWdodD4gPSA8YmFuZHdpZHRoPiAvIDEwCisjCisjIFdoZW4geW91IGhhdmUgbW9yZSBjbGFzc2VzIG9uIG9uZSBpbnRlcmZhY2UsIGl0IGlzIGVub3VnaCB0byBzcGVjaWZ5CisjIDxiYW5kd2lkdGg+IFthbmQgPHdlaWdodD5dIG9ubHkgb25jZSwgdGhlcmVmb3JlIGluIG90aGVyIGZpbGVzIHlvdSBvbmx5CisjIG5lZWQgdG8gc2V0IERFVklDRT08aWZuYW1lPi4KKyMKKyMjIyBDbGFzcyBwYXJhbWV0ZXJzCisjCisjIFJBVEU9PHNwZWVkPgkJCQkJbWFuZGF0b3J5CisjIFJBVEU9NU1iaXQKKyMKKyMJQmFuZHdpZHRoIGFsbG9jYXRlZCB0byB0aGUgY2xhc3MuIFRyYWZmaWMgZ29pbmcgdGhyb3VnaCB0aGUgY2xhc3MgaXMKKyMJc2hhcGVkIHRvIGNvbmZvcm0gdG8gc3BlY2lmaWVkIHJhdGUuIFlvdSBjYW4gdXNlIEtiaXQsIE1iaXQgb3IgYnBzLAorIwlLYnBzIGFuZCBNYnBzIGFzIHN1ZmZpY2VzLiBJZiB5b3UgZG9uJ3Qgc3BlY2lmeSBhbnkgdW5pdCwgYml0cy9zZWMKKyMJYXJlIHVzZWQuIEFsc28gbm90ZSB0aGF0ICJicHMiIG1lYW5zICJieXRlcyBwZXIgc2Vjb25kIiwgbm90IGJpdHMuCisjCisjIFdFSUdIVD08c3BlZWQ+IAkJCQltYW5kYXRvcnkKKyMgV0VJR0hUPTUwMEtiaXQKKyMKKyMJVHVuaW5nIHBhcmFtZXRlciB0aGF0IHNob3VsZCBiZSBwcm9wb3J0aW9uYWwgdG8gUkFURS4gQXMgYSBydWxlCisjCW9mIHRodW1iLCB1c2UgV0VJR0hUIH49IFJBVEUgLyAxMC4KKyMKKyMgUFJJTz08MS04PgkJCQkJb3B0aW9uYWwsIGRlZmF1bHQgNQorIyBQUklPPTUKKyMKKyMJUHJpb3JpdHkgb2YgY2xhc3MgdHJhZmZpYy4gVGhlIGhpZ2hlciB0aGUgbnVtYmVyLCB0aGUgbGVzc2VyCisjCXRoZSBwcmlvcml0eS4gUHJpb3JpdHkgb2YgNSBpcyBqdXN0IGZpbmUuCisjCisjIFBBUkVOVD08Y2xzaWQ+CQkJCW9wdGlvbmFsLCBkZWZhdWx0IG5vdCBzZXQKKyMgUEFSRU5UPTEyODAKKyMKKyMJU3BlY2lmaWVzIElEIG9mIHRoZSBwYXJlbnQgY2xhc3MgdG8gd2hpY2ggeW91IHdhbnQgdGhpcyBjbGFzcyBiZQorIwlhdHRhY2hlZC4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlIExFQUY9bm9uZSBmb3IgdGhlIHBhcmVudCBjbGFzcyBhcworIwltZW50aW9uZWQgYmVsb3cuIEJ5IHVzaW5nIHRoaXMgcGFyYW1ldGVyIGFuZCBjYXJlZnVsbHkgb3JkZXJpbmcgdGhlCisjCWNvbmZpZ3VyYXRpb24gZmlsZXMsIGl0IGlzIHBvc3NpYmxlIHRvIGNyZWF0ZSBzaW1wbGUgaGllcmFyY2hpY2FsCisjCXN0cnVjdHVyZXMgb2YgQ0JRIGNsYXNzZXMuIFRoZSBvcmRlcmluZyBpcyBpbXBvcnRhbnQgc28gdGhhdCBwYXJlbnQKKyMJY2xhc3NlcyBhcmUgY29uc3RydWN0ZWQgcHJpb3IgdG8gdGhlaXIgY2hpbGRyZW4uCisjCisjIExFQUY9bm9uZXx0YmZ8c2ZxCQkJCW9wdGlvbmFsLCBkZWZhdWx0ICJ0YmYiCisjCisjCVRlbGxzIHRoZSBzY3JpcHQgdG8gYXR0YWNoIHNwZWNpZmllZCBsZWFmIHF1ZXVlaW5nIGRpc2NpcGxpbmUgdG8gQ0JRCisjCWNsYXNzLiBCeSBkZWZhdWx0LCBUQkYgaXMgdXNlZC4gTm90ZSB0aGF0IGF0dGFjaGluZyBUQkYgdG8gQ0JRIGNsYXNzCisjCXNoYXBlcyB0aGUgdHJhZmZpYyB0byBjb25mb3JtIHRvIFRCRiBwYXJhbWV0ZXJzIGFuZCBwcmV2ZW50cyB0aGUgY2xhc3MKKyMJZnJvbSBib3Jyb3dpbmcgYmFuZHdpZHRoIGZyb20gaXRzIHBhcmVudCBldmVuIGlmIHlvdSBoYXZlIEJPVU5ERUQgc2V0CisjCXRvICJubyIuIFRvIGFsbG93IHRoZSBjbGFzcyB0byBib3Jyb3cgYmFuZHdpdGggKHByb3ZpZGVkIGl0IGlzIG5vdAorIwlib3VuZGVkKSwgeW91IG11c3Qgc2V0IExFQUYgdG8gIm5vbmUiIG9yICJzZnEiLgorIworIwlJZiB5b3Ugd2FudCB0byBlbnN1cmUgKGFwcHJveGltYXRlbHkpIGZhaXIgc2hhcmluZyBvZiBiYW5kd2lkdGggYW1vbmcKKyMJc2V2ZXJhbCBob3N0cyBpbiB0aGUgc2FtZSBjbGFzcywgeW91IG1pZ2h0IHdhbnQgdG8gc3BlY2lmeSBMRUFGPXNmcSB0bworIwlhdHRhY2ggU0ZRIGFzIGxlYWYgcXVldWVpbmcgZGlzY2lwbGluZSB0byB0aGF0IGNsYXNzLgorIworIyBCT1VOREVEPXllc3xubwkJCQlvcHRpb25hbCwgZGVmYXVsdCAieWVzIgorIworIwlJZiBzZXQgdG8gInllcyIsIHRoZSBjbGFzcyBpcyBub3QgYWxsb3dlZCB0byBib3Jyb3cgYmFuZHdpZHRoIGZyb20KKyMJaXRzIHBhcmVudCBjbGFzcyBpbiBvdmVybGltaXQgc2l0dWF0aW9uLiBJZiBzZXQgdG8gIm5vIiwgdGhlIGNsYXNzCisjCXdpbGwgYmUgYWxsb3dlZCB0byBib3Jyb3cgYmFuZHdpZHRoIGZyb20gaXRzIHBhcmVudC4KKyMKKyMgTm90ZToJRG9uJ3QgZm9yZ2V0IHRvIHNldCBMRUFGIHRvICJub25lIiBvciAic2ZxIiwgb3RoZXJ3aXNlIHRoZSBjbGFzcyB3aWxsCisjCWhhdmUgVEJGIGF0dGFjaGVkIHRvIGl0c2VsZiBhbmQgd2lsbCBub3QgYmUgYWJsZSB0byBib3Jyb3cgdW51c2VkCisjCWJhbmR3aXRoIGZyb20gaXRzIHBhcmVudC4KKyMKKyMgSVNPTEFURUQ9eWVzfG5vCQkJCW9wdGlvbmFsLCBkZWZhdWx0ICJubyIKKyMKKyMJSWYgc2V0IHRvICJ5ZXMiLCB0aGUgY2xhc3Mgd2lsbCBub3QgbGVuZCB1bnVzZWQgYmFuZHdpZHRoIHRvCisjCWl0cyBjaGlsZHJlbi4KKyMKKyMjIyBUQkYgcWRpc2MgcGFyYW1ldGVycworIworIyBCVUZGRVI9PGJ5dGVzPlsvPGJ5dGVzPl0JCQlvcHRpb25hbCwgZGVmYXVsdCAiMTBLYi84IgorIworIwlUaGlzIHBhcmFtZXRlciBjb250cm9scyB0aGUgZGVwdGggb2YgdGhlIHRva2VuIGJ1Y2tldC4gSW4gb3RoZXIKKyMJd29yZHMgaXQgcmVwcmVzZW50cyB0aGUgbWF4aW1hbCBidXJzdCBzaXplIHRoZSBjbGFzcyBjYW4gc2VuZC4KKyMJVGhlIG9wdGlvbmFsIHBhcnQgb2YgcGFyYW1ldGVyIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBsZW5ndGgKKyMJb2YgaW50ZXJ2YWxzIGluIHBhY2tldCBzaXplcywgZm9yIHdoaWNoIHRoZSB0cmFuc21pc3Npb24gdGltZXMKKyMJYXJlIGtlcHQuCisjCisjIExJTUlUPTxieXRlcz4JCQkJCW9wdGlvbmFsLCBkZWZhdWx0ICIxNUtiIgorIworIwlUaGlzIHBhcmFtZXRlciBkZXRlcm1pbmVzIHRoZSBtYXhpbWFsIGxlbmd0aCBvZiBiYWNrbG9nLiBJZgorIwl0aGUgcXVldWUgY29udGFpbnMgbW9yZSBkYXRhIHRoYW4gc3BlY2lmaWVkIGJ5IExJTUlULCB0aGUKKyMJbmV3bHkgYXJyaXZpbmcgcGFja2V0cyBhcmUgZHJvcHBlZC4gVGhlIGxlbmd0aCBvZiBiYWNrbG9nCisjCWRldGVybWluZXMgcXVldWUgbGF0ZW5jeSBpbiBjYXNlIG9mIGNvbmdlc3Rpb24uCisjCisjIFBFQUs9PHNwZWVkPgkJCQkJb3B0aW9uYWwsIGRlZmF1bHQgbm90IHNldAorIworIwlNYXhpbWFsIHBlYWsgcmF0ZSBmb3Igc2hvcnQtdGVybSBidXJzdCB0cmFmZmljLiBUaGlzIGFsbG93cyB5b3UKKyMJdG8gY29udHJvbCB0aGUgYWJzb2x1dGUgcGVhayByYXRlIHRoZSBjbGFzcyBjYW4gc2VuZCBhdCwgYmVjYXVzZQorIwlzaW5nbGUgVEJGIHRoYXQgYWxsb3dzIDI1NktiaXQvcyB3b3VsZCBvZiBjb3Vyc2UgYWxsb3cgcmF0ZSBvZgorIwk1MTJLYml0IGZvciBoYWxmIGEgc2Vjb25kIG9yIDFNYml0IGZvciBhIHF1YXJ0ZXIgb2Ygc2Vjb25kLgorIworIyBNVFU9PGJ5dGVzPiAgCQkJCQlvcHRpb25hbCwgZGVmYXVsdCAiMTUwMCIKKyMKKyMJTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgc2VudCBhdCBvbmNlIG92ZXIgdGhlCisjCXBoeXNpY2FsIG1lZGl1bS4gVGhpcyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQgd2hlbiB5b3Ugc3BlY2lmeQorIwlQRUFLIHBhcmFtZXRlci4gSXQgZGVmYXVsdHMgdG8gTVRVIG9mIGV0aGVybmV0IC0gZm9yIG90aGVyCisjCW1lZGlhIHR5cGVzIHlvdSBtaWdodCB3YW50IHRvIGNoYW5nZSBpdC4KKyMKKyMgTm90ZTogU2V0dGluZyBUQkYgYXMgbGVhZiBxZGlzYyB3aWxsIGVmZmVjdGl2ZWx5IHByZXZlbnQgdGhlIGNsYXNzIGZyb20KKyMJYm9ycm93aW5nIGJhbmR3aWR0aCBmcm9tIHRoZSBhbmNlc3RvciBjbGFzcywgYmVjYXVzZSBldmVuIGlmIHRoZQorIwljbGFzcyBhbGxvd3MgbW9yZSB0cmFmZmljIHRvIHBhc3MgdGhyb3VnaCwgaXQgaXMgdGhlbiBzaGFwZWQgdG8KKyMJY29uZm9ybSB0byBUQkYuCisjCisjIyMgU0ZRIHFkaXNjIHBhcmFtZXRlcnMKKyMKKyMgVGhlIFNGUSBxdWV1ZWluZyBkaXNjaXBsaW5lIGlzIGEgY2hlYXAgd2F5IGZvciBzaGFyaW5nIGNsYXNzIGJhbmR3aWR0aAorIyBhbW9uZyBzZXZlcmFsIGhvc3RzLiBBcyBpdCBpcyBzdG9jaGFzdGljLCB0aGUgZmFpcm5lc3MgaXMgYXBwcm94aW1hdGUgYnV0CisjIGl0IHdpbGwgZG8gdGhlIGpvYiBpbiBtb3N0IGNhc2VzLiBJZiB5b3Ugd2FudCByZWFsIGZhaXJuZXNzLCB5b3Ugc2hvdWxkCisjIHByb2JhYmx5IHVzZSBXUlIgKHdlaWdodGVkIHJvdW5kIHJvYmluKSBvciBXRlEgcXVldWVpbmcgZGlzY2lwbGluZXMuIE5vdGUKKyMgdGhhdCBTRlEgZG9lcyBub3QgZG8gYW55IHRyYWZmaWMgc2hhcGluZyAtIHRoZSBzaGFwaW5nIGlzIGRvbmUgYnkgdGhlIENCUQorIyBjbGFzcyB0aGUgU0ZRIGlzIGF0dGFjaGVkIHRvLgorIworIyBRVUFOVFVNPTxieXRlcz4JCQkJb3B0aW9uYWwsIGRlZmF1bHQgbm90IHNldAorIworIwlUaGlzIHBhcmFtZXRlciBzaG91bGQgbm90IGJlIHNldCBsb3dlciB0aGFuIGxpbmsgTVRVLCBmb3IgZXRoZXJuZXQKKyMJaXQgaXMgMTUwMGIsIG9yICh3aXRoIE1BQyBoZWFkZXIpIDE1MTRiIHdoaWNoIGlzIHRoZSB2YWx1ZSB1c2VkCisjCWluIEFsZXhleSBLdXpuZXRzb3YncyBleGFtcGxlcy4KKyMKKyMgUEVSVFVSQj08c2Vjb25kcz4JCQkJb3B0aW9uYWwsIGRlZmF1bHQgIjEwIgorIworIwlQZXJpb2Qgb2YgaGFzaCBmdW5jdGlvbiBwZXJ0dXJiYXRpb24uIElmIHVuc2V0LCBoYXNoIHJlY29uZmlndXJhdGlvbgorIwl3aWxsIG5ldmVyIHRha2UgcGxhY2Ugd2hpY2ggaXMgd2hhdCB5b3UgcHJvYmFibHkgZG9uJ3Qgd2FudC4gVGhlCisjCWRlZmF1bHQgdmFsdWUgb2YgMTAgc2Vjb25kcyBpcyBwcm9iYWJseSBhIGdvb2Qgb25lLgorIworIyMjIEZpbHRlciBwYXJhbWV0ZXJzCisjCisjIFJVTEU9W1tzYWRkclsvcHJlZml4XV1bOnBvcnRbL21hc2tdXSxdW2RhZGRyWy9wcmVmaXhdXVs6cG9ydFsvbWFza11dCisjCisjCVRoZXNlIHBhcmFtZXRlcnMgbWFrZSB1cCAidTMyIiBmaWx0ZXIgcnVsZXMgdGhhdCBzZWxlY3QgdHJhZmZpYyBmb3IKKyMJZWFjaCBvZiB0aGUgY2xhc3Nlcy4gWW91IGNhbiB1c2UgbXVsdGlwbGUgUlVMRSBmaWVsZHMgcGVyIGNvbmZpZy4KKyMKKyMJVGhlIG9wdGlvbmFsIHBvcnQgbWFzayBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGFkdmFuY2VkIHVzZXJzIHdobworIwl1bmRlcnN0YW5kIGhvdyB0aGUgdTMyIGZpbHRlciB3b3Jrcy4KKyMKKyMgU29tZSBleGFtcGxlczoKKyMKKyMJUlVMRT0xMC4xLjEuMC8yNDo4MAorIwkJc2VsZWN0cyB0cmFmZmljIGdvaW5nIHRvIHBvcnQgODAgaW4gbmV0d29yayAxMC4xLjEuMAorIworIwlSVUxFPTEwLjIuMi41CisjCQlzZWxlY3RzIHRyYWZmaWMgZ29pbmcgdG8gYW55IHBvcnQgb24gc2luZ2xlIGhvc3QgMTAuMi4yLjUKKyMKKyMJUlVMRT0xMC4yLjIuNToyMC8weGZmZmUKKyMJCXNlbGVjdHMgdHJhZmZpYyBnb2luZyB0byBwb3J0cyAyMCBhbmQgMjEgb24gaG9zdCAxMC4yLjIuNQorIworIwlSVUxFPToyNSwxMC4yLjIuMTI4LzI2OjUwMDAKKyMJCXNlbGVjdHMgdHJhZmZpYyBnb2luZyBmcm9tIGFueXdoZXJlIG9uIHBvcnQgNTAgdG8KKyMJCXBvcnQgNTAwMCBpbiBuZXR3b3JrIDEwLjIuMi4xMjgKKyMKKyMJUlVMRT0xMC41LjUuNTo4MCwKKyMJCXNlbGVjdHMgdHJhZmZpYyBnb2luZyBmcm9tIHBvcnQgODAgb2Ygc2luZ2xlIGhvc3QgMTAuNS41LjUKKyMKKyMKKyMKKyMgUkVBTE09W3NyZWFsbSxdW2RyZWFsbV0KKyMKKyMJVGhlc2UgcGFyYW1ldGVycyBtYWtlIHVwICJyb3V0ZSIgZmlsdGVyIHJ1bGVzIHRoYXQgY2xhc3NpZnkgdHJhZmZpYworIwlhY2NvcmRpbmcgdG8gcGFja2V0IHNvdXJjZS9kZXN0aW5hdGlvbiByZWFsbXMuIEZvciBpbmZvcm1hdGlvbiBhYm91dAorIwlyZWFsbXMsIHNlZSBBbGV4ZXkgS3V6bmV0c292J3MgSVAgQ29tbWFuZCBSZWZlcmVuY2UuIFRoaXMgc2NyaXB0CisjCWRvZXMgbm90IGRlZmluZSBhbnkgcmVhbG1zLCBpdCBqdXN0cyBidWlsZHMgInRjIGZpbHRlciIgY29tbWFuZHMKKyMJZm9yIHlvdSBpZiB5b3UgbmVlZCB0byBjbGFzc2lmeSB0cmFmZmljIHRoaXMgd2F5LgorIworIwlSZWFsbSBpcyBlaXRoZXIgYSBkZWNpbWFsIG51bWJlciBvciBhIHN0cmluZyByZWZlcmVuY2luZyBlbnRyeSBpbgorIwkvZXRjL2lwcm91dGUyL3J0X3JlYWxtcyAodXN1YWxseSkuCisjCisjIFNvbWUgZXhhbXBsZXM6CisjCisjCVJFQUxNPXJ1c3NpYSxpbnRlcm5ldAorIwkJc2VsZWN0cyB0cmFmZmljIGdvaW5nIGZyb20gcmVhbG0gInJ1c3NpYSIgdG8gcmVhbG0gImludGVybmV0IgorIworIwlSRUFMTT1mcmVlbmV0LAorIwkJc2VsZWN0cyB0cmFmZmljIGdvaW5nIGZyb20gcmVhbG0gImZyZWVuZXQiCisjCisjCVJFQUxNPTEwCisjCQlzZWxlY3RzIHRyYWZmaWMgZ29pbmcgdG8gcmVhbG0gMTAKKyMKKyMKKyMKKyMgTUFSSz08bWFyaz4KKyMKKyMJVGhlc2UgcGFyYW1ldGVycyBtYWtlIHVwICJmdyIgZmlsdGVyIHJ1bGVzIHRoYXQgc2VsZWN0IHRyYWZmaWMgZm9yCisjCWVhY2ggb2YgdGhlIGNsYXNzZXMgYWNjb3JpbmcgdG8gZmlyZXdhbGwgIm1hcmsiLiBNYXJrIGlzIGEgZGVjaW1hbAorIwludW1iZXIgcGFja2V0cyBhcmUgdGFnZ2VkIHdpdGggaWYgZmlyZXdhbGwgcnVsZXMgc2F5IHNvLiBZb3UgY2FuCisjCXVzZSBtdWx0aXBsZSBNQVJLIGZpZWxkcyBwZXIgY29uZmlnLgorIworIworIyBOb3RlOiBSdWxlcyBmb3IgZGlmZmVyZW50IGZpbHRlciB0eXBlcyBjYW4gYmUgY29tYmluZWQuIEF0dGVudGlvbiBtdXN0IGJlCisjCXBhaWQgdG8gdGhlIHByaW9yaXR5IG9mIGZpbHRlciBydWxlcywgd2hpY2ggY2FuIGJlIHNldCBiZWxvdyB1c2luZworIwlQUklPX3tSVUxFLE1BUkssUkVBTE19IHZhcmlhYmxlcy4KKyMKKyMjIyBUaW1lIHJhbmdpbmcgcGFyYW1ldGVycworIworIyBUSU1FPVs8ZG93Piw8ZG93PiwgLi4uLDxkb3c+L108ZnJvbT4tPHRpbGw+OzxyYXRlPi88d2VpZ2h0PlsvPHBlYWs+XQorIyBUSU1FPTAsMSwyLDUvMTg6MDAtMDY6MDA7MjU2S2JpdC8yNUtiaXQKKyMgVElNRT02MDEyMy8xODowMC0wNjowMDsyNTZLYml0LzI1S2JpdAorIyBUSU1FPTE4OjAwLTA2OjAwOzI1NktiaXQvMjVLYml0CisjCisjCVRoaXMgcGFyYW1ldGVyIGFsbG93cyB5b3UgdG8gZGlmZmVyZW50aWF0ZSB0aGUgY2xhc3MgYmFuZHdpZHRoCisjCXRocm91Z2hvdXQgdGhlIGRheS4gWW91IGNhbiBzcGVjaWZ5IG11bHRpcGxlIFRJTUUgcGFyYW1ldGVycywgaWYKKyMJdGhlIHRpbWVzIG92ZXJsYXAsIGxhc3QgbWF0Y2ggaXMgdGFrZW4uIFRoZSBmaWVsZHMgPHJhdGU+LCA8d2VpZ2h0PgorIwlhbmQgPHBlYWs+IGNvcnJlc3BvbmQgdG8gcGFyYW1ldGVycyBSQVRFLCBXRUlHSFQgYW5kIFBFQUsgKHdoaWNoCisjCWlzIG9wdGlvbmFsIGFuZCBhcHBsaWVzIHRvIFRCRiBsZWFmIHFkaXNjIG9ubHkpLgorIworIwlZb3UgY2FuIGFsc28gc3BlY2lmeSBkYXlzIG9mIHdlZWsgd2hlbiB0aGUgVElNRSBydWxlIGFwcGxpZXMuIDxkb3c+CisjCWlzIG51bWVyaWMsIDAgY29ycmVzcG9uZHMgdG8gc3VuZGF5LCAxIGNvcnJlc3BvbmRzIHRvIG1vbmRheSwgZXRjLgorIworIyMjCisjCisjIFNhbXBsZSBjb25maWd1cmF0aW9uIGZpbGU6IGNicS0xMjgwLk15X2ZpcnN0X3NoYXBlcgorIworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBERVZJQ0U9ZXRoMCwxME1iaXQsMU1iaXQKKyMgUkFURT0xMjhLYml0CisjIFdFSUdIVD0xMEtiaXQKKyMgUFJJTz01CisjIFJVTEU9MTkyLjEyOC4xLjAvMjQKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMKKyMgVGhlIGNvbmZpZ3VyYXRpb24gc2F5cyB0aGF0IHdlIHdpbGwgY29udHJvbCB0cmFmZmljIG9uIDEwTWJpdCBldGhlcm5ldAorIyBkZXZpY2UgZXRoMCBhbmQgdGhlIHRyYWZmaWMgZ29pbmcgdG8gbmV0d29yayAxOTIuMTY4LjEuMCB3aWxsIGJlCisjIHByb2Nlc3NlZCB3aXRoIHByaW9yaXR5IDUgYW5kIHNoYXBlZCB0byByYXRlIG9mIDEyOEtiaXQuCisjCisjIE5vdGUgdGhhdCB5b3UgY2FuIGNvbnRyb2wgb3V0Z29pbmcgdHJhZmZpYyBvbmx5LiBJZiB5b3Ugd2FudCB0byBjb250cm9sCisjIHRyYWZmaWMgaW4gYm90aCBkaXJlY3Rpb25zLCB5b3UgbXVzdCBzZXQgdXAgQ0JRIGZvciBib3RoIGludGVyZmFjZXMuCisjCisjIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKyMKKyMgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0rICAgICAgMTkyLjE2OC4xLjEKKyMgQkFDS0JPTkUgLS0tLS1ldGgwLXwgIGxpbnV4ICB8LWV0aDEtLS0tLS0qLVtjbGllbnRdCisjICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tKworIworIyBJbWFnaW5lIHlvdSB3YW50IHRvIHNoYXBlIHRyYWZmaWMgZnJvbSBiYWNrYm9uZSB0byB0aGUgY2xpZW50IHRvIDI4S2JpdAorIyBhbmQgdHJhZmZpYyBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uIHRvIDEyOEtiaXQuIFlvdSBuZWVkIHRvIHNldHVwIENCUQorIyBvbiBib3RoIGV0aDAgYW5kIGV0aDEgaW50ZXJmYWNlcywgdGh1cyB5b3UgbmVlZCB0d28gY29uZmlnIGZpbGVzOgorIworIyBjYnEtMDI4LmJhY2tib25lLWNsaWVudAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBERVZJQ0U9ZXRoMSwxME1iaXQsMU1iaXQKKyMgUkFURT0yOEtiaXQKKyMgV0VJR0hUPTJLYml0CisjIFBSSU89NQorIyBSVUxFPTE5Mi4xNjguMS4xCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjCisjIGNicS0xMjguY2xpZW50LWJhY2tib25lCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERFVklDRT1ldGgwLDEwTWJpdCwxTWJpdAorIyBSQVRFPTEyOEtiaXQKKyMgV0VJR0hUPTEwS2JpdAorIyBQUklPPTUKKyMgUlVMRT0xOTIuMTY4LjEuMSwKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMKKyMgUGF5IGF0dGVudGlvbiB0byBjb21tYSAiLCIgaW4gdGhlIFJVTEUgZmllbGQgLSBpdCBkZW5vdGVzIHNvdXJjZSBhZGRyZXNzIQorIworIyBFbmpveS4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2V4cG9ydCBMQ19BTEw9QworCisjIyMgQ29tbWFuZCBsb2NhdGlvbnMKK1RDPS9zYmluL3RjCitJUD0vc2Jpbi9pcAorTVA9L3NiaW4vbW9kcHJvYmUKKworIyMjIERlZmF1bHQgZmlsdGVyIHByaW9yaXRpZXMgKG11c3QgYmUgZGlmZmVyZW50KQorUFJJT19SVUxFX0RFRkFVTFQ9JHtQUklPX1JVTEU6LTEwMH0KK1BSSU9fTUFSS19ERUZBVUxUPSR7UFJJT19NQVJLOi0yMDB9CitQUklPX1JFQUxNX0RFRkFVTFQ9JHtQUklPX1JFQUxNOi0zMDB9CisKKyMjIyBEZWZhdWx0IENCUV9QQVRIICYgQ0JRX0NBQ0hFIHNldHRpbmdzCitDQlFfUEFUSD0ke0NCUV9QQVRIOi0vZXRjL3N5c2NvbmZpZy9jYnF9CitDQlFfQ0FDSEU9JHtDQlFfQ0FDSEU6LS92YXIvY2FjaGUvY2JxLmluaXR9CisKKyMjIyBVbmNvbW1lbnQgdG8gZW5hYmxlIGxvZ2ZpbGUgZm9yIGRlYnVnZ2luZworI0NCUV9ERUJVRz0iL3Zhci9ydW4vY2JxLSQxIgorCisjIyMgTW9kdWxlcyB0byBwcm9iZSBmb3IuIFVuY29tbWVudCB0aGUgbGFzdCBDQlFfUFJPQkUKKyMjIyBsaW5lIGlmIHlvdSBoYXZlIFFvUyBzdXBwb3J0IGNvbXBpbGVkIGludG8ga2VybmVsCitDQlFfUFJPQkU9InNjaF9jYnEgc2NoX3RiZiBzY2hfc2ZxIHNjaF9wcmlvIgorQ0JRX1BST0JFPSIkQ0JRX1BST0JFIGNsc19mdyBjbHNfdTMyIGNsc19yb3V0ZSIKKyNDQlFfUFJPQkU9IiIKKworIyMjIEtleXdvcmRzIHJlcXVpcmVkIGZvciBxZGlzYyAmIGNsYXNzIGNvbmZpZ3VyYXRpb24KK0NCUV9XT1JEUz0iREVWSUNFfFJBVEV8V0VJR0hUfFBSSU98UEFSRU5UfExFQUZ8Qk9VTkRFRHxJU09MQVRFRCIKK0NCUV9XT1JEUz0iJENCUV9XT1JEU3xQUklPX01BUkt8UFJJT19SVUxFfFBSSU9fUkVBTE18QlVGRkVSIgorQ0JRX1dPUkRTPSIkQ0JRX1dPUkRTfExJTUlUfFBFQUt8TVRVfFFVQU5UVU18UEVSVFVSQiIKKworIyMjIFNvdXJjZSBBVlBLVCBpZiBpdCBleGlzdHMKK1sgLXIgL2V0Yy9zeXNjb25maWcvY2JxL2F2cGt0IF0gJiYgLiAvZXRjL3N5c2NvbmZpZy9jYnEvYXZwa3QKK0FWUEtUPSR7QVZQS1Q6LTMwMDB9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFNVUFBPUlQgRlVOQ1RJT05TICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIyMgR2V0IGxpc3Qgb2YgbmV0d29yayBkZXZpY2VzCitjYnFfZGV2aWNlX2xpc3QgKCkgeworCWlwIGxpbmsgc2hvd3wgc2VkIC1uICIvXlswLTldLyBcCisJCXsgcy9eWzAtOV1cKzogXChbYS16MC05Ll9dXCtcKVs6QF0uKi9cMS87IHA7IH0iCit9ICMgY2JxX2RldmljZV9saXN0CisKKworIyMjIFJlbW92ZSByb290IGNsYXNzIGZyb20gZGV2aWNlICQxCitjYnFfZGV2aWNlX29mZiAoKSB7CisJdGMgcWRpc2MgZGVsIGRldiAkMSByb290IDI+IC9kZXYvbnVsbAorfSAjIGNicV9kZXZpY2Vfb2ZmCisKKworIyMjIFJlbW92ZSBDQlEgZnJvbSBhbGwgZGV2aWNlcworY2JxX29mZiAoKSB7CisJZm9yIGRldiBpbiBgY2JxX2RldmljZV9saXN0YDsgZG8KKwkJY2JxX2RldmljZV9vZmYgJGRldgorCWRvbmUKK30gIyBjYnFfb2ZmCisKKworIyMjIFByZWZpeGVkIG1lc3NhZ2UKK2NicV9tZXNzYWdlICgpIHsKKwllY2hvIC1lICIqKkNCUTogJEAiCit9ICMgY2JxX21lc3NhZ2UKKworIyMjIEZhaWx1cmUgbWVzc2FnZQorY2JxX2ZhaWx1cmUgKCkgeworCWNicV9tZXNzYWdlICIkQCIKKwlleGl0IDEKK30gIyBjYnFfZmFpbHVyZQorCisjIyMgRmFpbHVyZSB3LyBjYnEtb2ZmCitjYnFfZmFpbF9vZmYgKCkgeworCWNicV9tZXNzYWdlICIkQCIKKwljYnFfb2ZmCisJZXhpdCAxCit9ICMgY2JxX2ZhaWxfb2ZmCisKKworIyMjIENvbnZlcnQgdGltZSB0byBhYnNvbHV0ZSB2YWx1ZQorY2JxX3RpbWUyYWJzICgpIHsKKwlsb2NhbCBtaW49JHsxIyMqOn07IG1pbj0ke21pbiMjMH0KKwlsb2NhbCBocnM9JHsxJSU6Kn07IGhycz0ke2hycyMjMH0KKwllY2hvICRbaHJzKjYwICsgbWluXQorfSAjIGNicV90aW1lMmFicworCisKKyMjIyBEaXNwbGF5IENCUSBzZXR1cAorY2JxX3Nob3cgKCkgeworCWZvciBkZXYgaW4gYGNicV9kZXZpY2VfbGlzdGA7IGRvCisJCVsgYHRjIHFkaXNjIHNob3cgZGV2ICRkZXZ8IHdjIC1sYCAtZXEgMCBdICYmIGNvbnRpbnVlCisJCWVjaG8gLWUgIiMjIyAkZGV2OiBxdWV1ZWluZyBkaXNjaXBsaW5lc1xuIgorCQl0YyAkMSBxZGlzYyBzaG93IGRldiAkZGV2OyBlY2hvCisKKwkJWyBgdGMgY2xhc3Mgc2hvdyBkZXYgJGRldnwgd2MgLWxgIC1lcSAwIF0gJiYgY29udGludWUKKwkJZWNobyAtZSAiIyMjICRkZXY6IHRyYWZmaWMgY2xhc3Nlc1xuIgorCQl0YyAkMSBjbGFzcyBzaG93IGRldiAkZGV2OyBlY2hvCisKKwkJWyBgdGMgZmlsdGVyIHNob3cgZGV2ICRkZXZ8IHdjIC1sYCAtZXEgMCBdICYmIGNvbnRpbnVlCisJCWVjaG8gLWUgIiMjIyAkZGV2OiBmaWx0ZXJpbmcgcnVsZXNcbiIKKwkJdGMgJDEgZmlsdGVyIHNob3cgZGV2ICRkZXY7IGVjaG8KKwlkb25lCit9ICMgY2JxX3Nob3cKKworCisjIyMgQ2hlY2sgY29uZmlndXJhdGlvbiBhbmQgbG9hZCBERVZJQ0VTLCBERVZGSUVMRFMgYW5kIENMQVNTTElTVCBmcm9tICQxCitjYnFfaW5pdCAoKSB7CisJIyMjIEdldCBhIGxpc3Qgb2YgY29uZmlndXJlZCBjbGFzc2VzCisJQ0xBU1NMSVNUPWBmaW5kICQxIC1tYXhkZXB0aCAxIFwoIC10eXBlIGYgLW9yIC10eXBlIGwgXCkgLW5hbWUgJ2NicS0qJyBcCisJCS1ub3QgLW5hbWUgJyp+JyAtcHJpbnRmICIlZlxuInwgc29ydGAKKwlbIC16ICIkQ0xBU1NMSVNUIiBdICYmCisJCWNicV9mYWlsdXJlICJubyBjb25maWd1cmF0aW9uIGZpbGVzIGZvdW5kIGluICQxISIKKworCSMjIyBHYXRoZXIgYWxsIERFVklDRSBmaWVsZHMgZnJvbSAkMS9jYnEtKgorCURFVkZJRUxEUz1gZmluZCAkMSAtbWF4ZGVwdGggMSBcKCAtdHlwZSBmIC1vciAtdHlwZSBsIFwpIC1uYW1lICdjYnEtKicgXAorCQkgIC1ub3QgLW5hbWUgJyp+JyB8IHhhcmdzIHNlZCAtbiAncy8jLiovLzsgXAorCQkgIHMvW1s6c3BhY2U6XV0vL2c7IC9eREVWSUNFPVteLF0qLFteLF0qXCgsW14sXSpcKVw/LyBcCisJCSAgeyBzLy4qPS8vOyBwOyB9J3wgc29ydCAtdWAKKwlbIC16ICIkREVWRklFTERTIiBdICYmCisJCWNicV9mYWlsdXJlICJubyBERVZJQ0UgZmllbGQgZm91bmQgaW4gJDEvY2JxLSohIgorCisJIyMjIENoZWNrIGZvciBkaWZmZXJlbnQgREVWSUNFIGZpZWxkcyBmb3IgdGhlIHNhbWUgZGV2aWNlCisJREVWSUNFUz1gZWNobyAiJERFVkZJRUxEUyJ8IHNlZCAncy8sLiovLyd8IHNvcnQgLXVgCisJWyBgZWNobyAiJERFVklDRVMifCB3YyAtbGAgLW5lIGBlY2hvICIkREVWRklFTERTInwgd2MgLWxgIF0gJiYKKwkJY2JxX2ZhaWx1cmUgImRpZmZlcmVudCBERVZJQ0UgZmllbGRzIGZvciBzaW5nbGUgZGV2aWNlIVxuJERFVkZJRUxEUyIKK30gIyBjYnFfaW5pdAorCisKKyMjIyBMb2FkIGNsYXNzIGNvbmZpZ3VyYXRpb24gZnJvbSAkMS8kMgorY2JxX2xvYWRfY2xhc3MgKCkgeworCUNMQVNTPWBlY2hvICQyfCBzZWQgJ3MvXmNicS0wKi8vOyBzL15cKFswLTlhLWZBLUZdXCtcKS4qL1wxLydgCisJQ0ZJTEU9YHNlZCAtbiAncy8jLiovLzsgcy9bWzpzcGFjZTpdXS8vZzsgL15bWzphbG51bTpdX11cKz1bWzphbG51bTpdLiw6Oy8qQC1fXVwrJC8gcCcgJDEvJDJgCisKKwkjIyMgQ2hlY2sgY2xhc3MgbnVtYmVyCisJSURWQUw9YC91c3IvYmluL3ByaW50ZiAiJWQiIDB4JENMQVNTIDI+IC9kZXYvbnVsbGAKKwlbICQ/IC1uZSAwIC1vICRJRFZBTCAtbHQgMiAtbyAkSURWQUwgLWd0IDY1NTM1IF0gJiYKKwkJY2JxX2ZhaWxfb2ZmICJjbGFzcyBJRCBvZiAkMiBtdXN0IGJlIGluIHJhbmdlIDwwMDAyLUZGRkY+ISIKKworCSMjIyBTZXQgZGVmYXVsdHMgJiBsb2FkIGNsYXNzCisJUkFURT0iIjsgV0VJR0hUPSIiOyBQQVJFTlQ9IiI7IFBSSU89NQorCUxFQUY9dGJmOyBCT1VOREVEPXllczsgSVNPTEFURUQ9bm8KKwlCVUZGRVI9MTBLYi84OyBMSU1JVD0xNUtiOyBNVFU9MTUwMAorCVBFQUs9IiI7IFBFUlRVUkI9MTA7IFFVQU5UVU09IiIKKworCVBSSU9fUlVMRT0kUFJJT19SVUxFX0RFRkFVTFQKKwlQUklPX01BUks9JFBSSU9fTUFSS19ERUZBVUxUCisJUFJJT19SRUFMTT0kUFJJT19SRUFMTV9ERUZBVUxUCisKKwlldmFsIGBlY2hvICIkQ0ZJTEUifCBncmVwIC1FICJeKCRDQlFfV09SRFMpPSJgCisKKwkjIyMgUmVxdWlyZSBSQVRFL1dFSUdIVAorCVsgLXogIiRSQVRFIiAtbyAteiAiJFdFSUdIVCIgXSAmJgorCQljYnFfZmFpbF9vZmYgIm1pc3NpbmcgUkFURSBvciBXRUlHSFQgaW4gJDIhIgorCisJIyMjIENsYXNzIGRldmljZQorCURFVklDRT0ke0RFVklDRSUlLCp9CisJWyAteiAiJERFVklDRSIgXSAmJiBjYnFfZmFpbF9vZmYgIm1pc3NpbmcgREVWSUNFIGZpZWxkIGluICQyISIKKworCUJBTkRXSURUSD1gZWNobyAiJERFVkZJRUxEUyJ8IHNlZCAtbiAiL14kREVWSUNFLC8gXAorCQkgIHsgcy9bXixdKixcKFteLF0qXCkuKi9cMS87IHA7IHE7IH0iYAorCisJIyMjIENvbnZlcnQgdG8gInRjIiBvcHRpb25zCisJUEVBSz0ke1BFQUs6K3BlYWtyYXRlICRQRUFLfQorCVBFUlRVUkI9JHtQRVJUVVJCOitwZXJ0dXJiICRQRVJUVVJCfQorCVFVQU5UVU09JHtRVUFOVFVNOitxdWFudHVtICRRVUFOVFVNfQorCisJWyAiJEJPVU5ERUQiID0gIm5vIiBdICYmIEJPVU5ERUQ9IiIgfHwgQk9VTkRFRD0iYm91bmRlZCIKKwlbICIkSVNPTEFURUQiID0gInllcyIgXSAmJiBJU09MQVRFRD0iaXNvbGF0ZWQiIHx8IElTT0xBVEVEPSIiCit9ICMgY2JxX2xvYWRfY2xhc3MKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIElOSVQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjIyBDaGVjayBmb3IgcHJlc2VuY2Ugb2YgaXAtcm91dGUyIGluIHVzdWFsIHBsYWNlCitbIC14ICRUQyAtYSAteCAkSVAgXSB8fAorCWNicV9mYWlsdXJlICJpcC1yb3V0ZTIgdXRpbGl0aWVzIG5vdCBpbnN0YWxsZWQgb3IgZXhlY3V0YWJsZSEiCisKKworIyMjIGlwL3RjIHdyYXBwZXJzCitpZiBbICIkMSIgPSAiY29tcGlsZSIgXTsgdGhlbgorCSMjIyBubyBtb2R1bGUgcHJvYmluZworCUNCUV9QUk9CRT0iIgorCisJaXAgKCkgeworCQkkSVAgIiRAIgorCX0gIyBpcAorCisJIyMjIGVjaG8tb25seSB2ZXJzaW9uIG9mICJ0YyIgY29tbWFuZAorCXRjICgpIHsKKwkJZWNobyAiJFRDICRAIgorCX0gIyB0YworCitlbGlmIFsgLW4gIiRDQlFfREVCVUciIF07IHRoZW4KKwllY2hvIC1lICIjIGBkYXRlYCIgPiAkQ0JRX0RFQlVHCisKKwkjIyMgTG9nZ2luZyB2ZXJzaW9uIG9mICJpcCIgY29tbWFuZAorCWlwICgpIHsKKwkJZWNobyAtZSAiXG4jIGlwICRAIiA+PiAkQ0JRX0RFQlVHCisJCSRJUCAiJEAiIDI+JjEgfCB0ZWUgLWEgJENCUV9ERUJVRworCX0gIyBpcAorCisJIyMjIExvZ2dpbmcgdmVyc2lvbiBvZiAidGMiIGNvbW1hbmQKKwl0YyAoKSB7CisJCWVjaG8gLWUgIlxuIyB0YyAkQCIgPj4gJENCUV9ERUJVRworCQkkVEMgIiRAIiAyPiYxIHwgdGVlIC1hICRDQlFfREVCVUcKKwl9ICMgdGMKK2Vsc2UKKwkjIyMgRGVmYXVsdCB3cmFwcGVycworCQorCWlwICgpIHsKKwkJJElQICIkQCIKKwl9ICMgaXAKKwkKKwl0YyAoKSB7CisJCSRUQyAiJEAiCisJfSAjIHRjCitmaSAjIGlwL3RjIHdyYXBwZXJzCisKKworY2FzZSAiJDEiIGluCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUQVJUL0NPTVBJTEUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworc3RhcnR8Y29tcGlsZSkKKworIyMjIFByb2JlIFFvUyBtb2R1bGVzIChzdGFydCBvbmx5KQorZm9yIG1vZHVsZSBpbiAkQ0JRX1BST0JFOyBkbworCSRNUCAkbW9kdWxlIHx8IGNicV9mYWlsdXJlICJmYWlsZWQgdG8gbG9hZCBtb2R1bGUgJG1vZHVsZSIKK2RvbmUKKworIyMjIElmIHdlIGFyZSBpbiBjb21waWxlL25vY2FjaGUvbG9nZ2luZyBtb2RlLCBkb24ndCBib3RoZXIgd2l0aCBjYWNoZQoraWYgWyAiJDEiICE9ICJjb21waWxlIiAtYSAiJDIiICE9ICJub2NhY2hlIiAtYSAteiAiJENCUV9ERUJVRyIgXTsgdGhlbgorCVZBTElEPTEKKworCSMjIyB2YWxpZGF0ZSB0aGUgY2FjaGUKKwlbICIkMiIgPSAiaW52YWxpZGF0ZSIgLW8gISAtZiAkQ0JRX0NBQ0hFIF0gJiYgVkFMSUQ9MAorCWlmIFsgJFZBTElEIC1lcSAxIF07IHRoZW4KKwkJWyBgZmluZCAkQ0JRX1BBVEggLW1heGRlcHRoIDEgLW5ld2VyICRDQlFfQ0FDSEV8IFwKKwkJICB3YyAtbGAgLWd0IDAgXSAmJiBWQUxJRD0wCisJZmkKKworCSMjIyBjb21waWxlIHRoZSBjb25maWcgaWYgdGhlIGNhY2hlIGlzIGludmFsaWQKKwlpZiBbICRWQUxJRCAtbmUgMSBdOyB0aGVuCisJCSQwIGNvbXBpbGUgPiAkQ0JRX0NBQ0hFIHx8CisJCQljYnFfZmFpbF9vZmYgImZhaWxlZCB0byBjb21waWxlIENCUSBjb25maWd1cmF0aW9uISIKKwlmaQorCisJIyMjIHJ1biB0aGUgY2FjaGVkIGNvbW1hbmRzCisJZXhlYyAvYmluL3NoICRDQlFfQ0FDSEUgMj4gL2Rldi9udWxsCitmaQorCisjIyMgTG9hZCBERVZJQ0VTLCBERVZGSUVMRFMgYW5kIENMQVNTTElTVAorY2JxX2luaXQgJENCUV9QQVRICisKKworIyMjIFNldHVwIHJvb3QgcWRpc2Mgb24gYWxsIGNvbmZpZ3VyZWQgZGV2aWNlcworZm9yIGRldiBpbiAkREVWSUNFUzsgZG8KKwkjIyMgUmV0cmlldmUgZGV2aWNlIGJhbmR3aWR0aCBhbmQsIG9wdGlvbmFsbHksIHdlaWdodAorCURFVlRFTVA9YGVjaG8gIiRERVZGSUVMRFMifCBzZWQgLW4gIi9eJGRldiwvIHsgcy8kZGV2LC8vOyBwOyBxOyB9ImAKKwlERVZCV0RUPSR7REVWVEVNUCUlLCp9OwlERVZXR0hUPSR7REVWVEVNUCMjKix9CisJWyAiJERFVkJXRFQiID0gIiRERVZXR0hUIiBdICYmIERFVldHSFQ9IiIKKworCSMjIyBEZXZpY2UgYmFuZHdpZHRoIGlzIHJlcXVpcmVkCisJaWYgWyAteiAiJERFVkJXRFQiIF07IHRoZW4KKwkJY2JxX21lc3NhZ2UgImNvdWxkIG5vdCBkZXRlcm1pbmUgYmFuZHdpZHRoIGZvciBkZXZpY2UgJGRldiEiCisJCWNicV9mYWlsdXJlICJwbGVhc2Ugc2V0IHVwIHRoZSBERVZJQ0UgZmllbGRzIHByb3Blcmx5ISIKKwlmaQorCisJIyMjIENoZWNrIGlmIHRoZSBkZXZpY2UgaXMgdGhlcmUKKwlpcCBsaW5rIHNob3cgJGRldiAmPiAvZGV2L251bGwgfHwKKwkJY2JxX2ZhaWxfb2ZmICJkZXZpY2UgJGRldiBub3QgZm91bmQhIgorCisJIyMjIFJlbW92ZSBvbGQgcm9vdCBxZGlzYyBmcm9tIGRldmljZQorCWNicV9kZXZpY2Vfb2ZmICRkZXYKKworCisJIyMjIFNldHVwIHJvb3QgcWRpc2MgKyBjbGFzcyBmb3IgZGV2aWNlCisJdGMgcWRpc2MgYWRkIGRldiAkZGV2IHJvb3QgaGFuZGxlIDEgY2JxIFwKKwliYW5kd2lkdGggJERFVkJXRFQgYXZwa3QgJEFWUEtUIGNlbGwgOAorCisJIyMjIFNldCB3ZWlnaHQgb2YgdGhlIHJvb3QgY2xhc3MgaWYgc2V0CisJWyAtbiAiJERFVldHSFQiIF0gJiYKKwkJdGMgY2xhc3MgY2hhbmdlIGRldiAkZGV2IHJvb3QgY2JxIHdlaWdodCAkREVWV0dIVCBhbGxvdCAxNTE0CisKKwlbICIkMSIgPSAiY29tcGlsZSIgXSAmJiBlY2hvCitkb25lICMgZGV2CisKKworIyMjIFNldHVwIHRyYWZmaWMgY2xhc3NlcworZm9yIGNsYXNzZmlsZSBpbiAkQ0xBU1NMSVNUOyBkbworCWNicV9sb2FkX2NsYXNzICRDQlFfUEFUSCAkY2xhc3NmaWxlCisKKwkjIyMgQ3JlYXRlIHRoZSBjbGFzcworCXRjIGNsYXNzIGFkZCBkZXYgJERFVklDRSBwYXJlbnQgMTokUEFSRU5UIGNsYXNzaWQgMTokQ0xBU1MgY2JxIFwKKwliYW5kd2lkdGggJEJBTkRXSURUSCByYXRlICRSQVRFIHdlaWdodCAkV0VJR0hUIHByaW8gJFBSSU8gXAorCWFsbG90IDE1MTQgY2VsbCA4IG1heGJ1cnN0IDIwIGF2cGt0ICRBVlBLVCAkQk9VTkRFRCAkSVNPTEFURUQgfHwKKwkJY2JxX2ZhaWxfb2ZmICJmYWlsZWQgdG8gYWRkIGNsYXNzICRDTEFTUyB3aXRoIHBhcmVudCAkUEFSRU5UIG9uICRERVZJQ0UhIgorCisJIyMjIENyZWF0ZSBsZWFmIHFkaXNjIGlmIHNldAorCWlmIFsgIiRMRUFGIiA9ICJ0YmYiIF07IHRoZW4KKwkJdGMgcWRpc2MgYWRkIGRldiAkREVWSUNFIHBhcmVudCAxOiRDTEFTUyBoYW5kbGUgJENMQVNTIHRiZiBcCisJCXJhdGUgJFJBVEUgYnVmZmVyICRCVUZGRVIgbGltaXQgJExJTUlUIG10dSAkTVRVICRQRUFLCisJZWxpZiBbICIkTEVBRiIgPSAic2ZxIiBdOyB0aGVuCisJCXRjIHFkaXNjIGFkZCBkZXYgJERFVklDRSBwYXJlbnQgMTokQ0xBU1MgaGFuZGxlICRDTEFTUyBzZnEgXAorCQkkUEVSVFVSQiAkUVVBTlRVTQorCWZpCisKKworCSMjIyBDcmVhdGUgZncgZmlsdGVyIGZvciBNQVJLIGZpZWxkcworCWZvciBtYXJrIGluIGBlY2hvICIkQ0ZJTEUifCBzZWQgLW4gJy9eTUFSSy8geyBzLy4qPS8vOyBwOyB9J2A7IGRvCisJCSMjIyBBdHRhY2ggZncgZmlsdGVyIHRvIHJvb3QgY2xhc3MKKwkJdGMgZmlsdGVyIGFkZCBkZXYgJERFVklDRSBwYXJlbnQgMTowIHByb3RvY29sIGlwIFwKKwkJcHJpbyAkUFJJT19NQVJLIGhhbmRsZSAkbWFyayBmdyBjbGFzc2lkIDE6JENMQVNTCisJZG9uZSAjIyMgbWFyaworCisJIyMjIENyZWF0ZSByb3V0ZSBmaWx0ZXIgZm9yIFJFQUxNIGZpZWxkcworCWZvciByZWFsbSBpbiBgZWNobyAiJENGSUxFInwgc2VkIC1uICcvXlJFQUxNLyB7IHMvLio9Ly87IHA7IH0nYDsgZG8KKwkJIyMjIFNwbGl0IHJlYWxtIGludG8gc291cmNlICYgZGVzdGluYXRpb24gcmVhbG1zCisJCVNSRUFMTT0ke3JlYWxtJSUsKn07IERSRUFMTT0ke3JlYWxtIyMqLH0KKwkJWyAiJFNSRUFMTSIgPSAiJERSRUFMTSIgXSAmJiBTUkVBTE09IiIKKworCQkjIyMgQ29udmVydCBhc3Rlcmlza3MgdG8gZW1wdHkgc3RyaW5ncworCQlTUkVBTE09JHtTUkVBTE0jXCp9OyBEUkVBTE09JHtEUkVBTE0jXCp9CisKKwkJIyMjIEF0dGFjaCByb3V0ZSBmaWx0ZXIgdG8gdGhlIHJvb3QgY2xhc3MKKwkJdGMgZmlsdGVyIGFkZCBkZXYgJERFVklDRSBwYXJlbnQgMTowIHByb3RvY29sIGlwIFwKKwkJcHJpbyAkUFJJT19SRUFMTSByb3V0ZSAke1NSRUFMTTorZnJvbSAkU1JFQUxNfSBcCisJCSR7RFJFQUxNOit0byAkRFJFQUxNfSBjbGFzc2lkIDE6JENMQVNTCisJZG9uZSAjIyMgcmVhbG0KKworCSMjIyBDcmVhdGUgdTMyIGZpbHRlciBmb3IgUlVMRSBmaWVsZHMKKwlmb3IgcnVsZSBpbiBgZWNobyAiJENGSUxFInwgc2VkIC1uICcvXlJVTEUvIHsgcy8uKj0vLzsgcDsgfSdgOyBkbworCQkjIyMgU3BsaXQgcnVsZSBpbnRvIHNvdXJjZSAmIGRlc3RpbmF0aW9uCisJCVNSQz0ke3J1bGUlJSwqfTsgRFNUPSR7cnVsZSMjKix9CisJCVsgIiRTUkMiID0gIiRydWxlIiBdICYmIFNSQz0iIgorCisKKwkJIyMjIFNwbGl0IGRlc3RpbmF0aW9uIGludG8gYWRkcmVzcywgcG9ydCAmIG1hc2sgZmllbGRzCisJCURBRERSPSR7RFNUJSU6Kn07IERURU1QPSR7RFNUIyMqOn0KKwkJWyAiJERBRERSIiA9ICIkRFNUIiBdICYmIERURU1QPSIiCisKKwkJRFBPUlQ9JHtEVEVNUCUlLyp9OyBETUFTSz0ke0RURU1QIyMqL30KKwkJWyAiJERQT1JUIiA9ICIkRFRFTVAiIF0gJiYgRE1BU0s9IjB4ZmZmZiIKKworCisJCSMjIyBTcGxpdCB1cCBzb3VyY2UgKGlmIHNwZWNpZmllZCkKKwkJU0FERFI9IiI7IFNQT1JUPSIiCisJCWlmIFsgLW4gIiRTUkMiIF07IHRoZW4KKwkJCVNBRERSPSR7U1JDJSU6Kn07IFNURU1QPSR7U1JDIyMqOn0KKwkJCVsgIiRTQUREUiIgPSAiJFNSQyIgXSAmJiBTVEVNUD0iIgorCisJCQlTUE9SVD0ke1NURU1QJSUvKn07IFNNQVNLPSR7U1RFTVAjIyovfQorCQkJWyAiJFNQT1JUIiA9ICIkU1RFTVAiIF0gJiYgU01BU0s9IjB4ZmZmZiIKKwkJZmkKKworCisJCSMjIyBDb252ZXJ0IGFzdGVyaXNrcyB0byBlbXB0eSBzdHJpbmdzCisJCVNBRERSPSR7U0FERFIjXCp9OyBEQUREUj0ke0RBRERSI1wqfQorCisJCSMjIyBDb21wb3NlIHUzMiBmaWx0ZXIgcnVsZXMKKwkJdTMyX3M9IiR7U1BPUlQ6K21hdGNoIGlwIHNwb3J0ICRTUE9SVCAkU01BU0t9IgorCQl1MzJfcz0iJHtTQUREUjorbWF0Y2ggaXAgc3JjICRTQUREUn0gJHUzMl9zIgorCQl1MzJfZD0iJHtEUE9SVDorbWF0Y2ggaXAgZHBvcnQgJERQT1JUICRETUFTS30iCisJCXUzMl9kPSIke0RBRERSOittYXRjaCBpcCBkc3QgJERBRERSfSAkdTMyX2QiCisKKwkJIyMjIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIGlmIHlvdSB3YW50IHRvIHNlZSBwYXJzZWQgcnVsZXMKKwkJI2VjaG8gIiRydWxlOiAkdTMyX3MgJHUzMl9kIgorCisJCSMjIyBBdHRhY2ggdTMyIGZpbHRlciB0byB0aGUgYXBwcm9wcmlhdGUgY2xhc3MKKwkJdGMgZmlsdGVyIGFkZCBkZXYgJERFVklDRSBwYXJlbnQgMTowIHByb3RvY29sIGlwIFwKKwkJcHJpbyAkUFJJT19SVUxFIHUzMiAkdTMyX3MgJHUzMl9kIGNsYXNzaWQgMTokQ0xBU1MKKwlkb25lICMjIyBydWxlCisKKwlbICIkMSIgPSAiY29tcGlsZSIgXSAmJiBlY2hvCitkb25lICMjIyBjbGFzc2ZpbGUKKzs7CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBUSU1FIENIRUNLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCit0aW1lY2hlY2spCisKKyMjIyBHZXQgdGltZSArIHdlZWtkYXkKK1RJTUVfVE1QPWBkYXRlICsldy8lazolTWAKK1RJTUVfRE9XPSR7VElNRV9UTVAlJS8qfQorVElNRV9OT1c9JHtUSU1FX1RNUCMjKi99CisKKyMjIyBMb2FkIERFVklDRVMsIERFVkZJRUxEUyBhbmQgQ0xBU1NMSVNUCitjYnFfaW5pdCAkQ0JRX1BBVEgKKworIyMjIFJ1biB0aHJvdWdoIGFsbCBjbGFzc2VzCitmb3IgY2xhc3NmaWxlIGluICRDTEFTU0xJU1Q7IGRvCisJIyMjIEdhdGhlciBhbGwgVElNRSBydWxlcyBmcm9tIGNsYXNzIGNvbmZpZworCVRJTUVTRVQ9YHNlZCAtbiAncy8jLiovLzsgcy9bWzpzcGFjZTpdXS8vZzsgL15USU1FLyB7IHMvLio9Ly87IHA7IH0nIFwKKwkJJENCUV9QQVRILyRjbGFzc2ZpbGVgCisJWyAteiAiJFRJTUVTRVQiIF0gJiYgY29udGludWUKKworCU1BVENIPTA7IENIQU5HRT0wCisJZm9yIHRpbWVydWxlIGluICRUSU1FU0VUOyBkbworCQlUSU1FX0FCUz1gY2JxX3RpbWUyYWJzICRUSU1FX05PV2AKKwkJCisJCSMjIyBTcGxpdCBUSU1FIHJ1bGUgdG8gcGllY2VzCisJCVRJTUVTUEVDPSR7dGltZXJ1bGUlJTsqfTsgUEFSQU1TPSR7dGltZXJ1bGUjIyo7fQorCQlXRUVLREFZUz0ke1RJTUVTUEVDJSUvKn07IElOVEVSVkFMPSR7VElNRVNQRUMjIyovfQorCQlCRUdfVElNRT0ke0lOVEVSVkFMJSUtKn07IEVORF9USU1FPSR7SU5URVJWQUwjIyotfQorCisJCSMjIyBDaGVjayB0aGUgZGF5LW9mLXdlZWsgKGlmIHByZXNlbnQpCisJCVsgIiRXRUVLREFZUyIgIT0gIiRJTlRFUlZBTCIgLWEgXAorCQkgIC1uICIke1dFRUtEQVlTIyMqJFRJTUVfRE9XKn0iIF0gJiYgY29udGludWUKKworCQkjIyMgQ29tcHV0ZSBpbnRlcnZhbCBib3VuZGFyaWVzCisJCUJFR19BQlM9YGNicV90aW1lMmFicyAkQkVHX1RJTUVgCisJCUVORF9BQlM9YGNicV90aW1lMmFicyAkRU5EX1RJTUVgCisKKwkJIyMjIE1pZG5pZ2h0IHdyYXAgZml4dXAKKwkJaWYgWyAkQkVHX0FCUyAtZ3QgJEVORF9BQlMgXTsgdGhlbgorCQkJWyAkVElNRV9BQlMgLWxlICRFTkRfQUJTIF0gJiYKKwkJCQlUSU1FX0FCUz0kW1RJTUVfQUJTICsgMjQqNjBdCisKKwkJCUVORF9BQlM9JFtFTkRfQUJTICsgMjQqNjBdCisJCWZpCisKKwkJIyMjIElmIHRoZSB0aW1lIG1hdGNoZXMsIHJlbWVtYmVyIHBhcmFtcyBhbmQgc2V0IE1BVENIIGZsYWcKKwkJaWYgWyAkVElNRV9BQlMgLWdlICRCRUdfQUJTIC1hICRUSU1FX0FCUyAtbHQgJEVORF9BQlMgXTsgdGhlbgorCQkJVE1QX1JBVEU9JHtQQVJBTVMlJS8qfTsgUEFSQU1TPSR7UEFSQU1TIyovfQorCQkJVE1QX1dHSFQ9JHtQQVJBTVMlJS8qfTsgVE1QX1BFQUs9JHtQQVJBTVMjIyovfQorCisJCQlbICIkVE1QX1BFQUsiID0gIiRUTVBfV0dIVCIgXSAmJiBUTVBfUEVBSz0iIgorCQkJVE1QX1BFQUs9JHtUTVBfUEVBSzorcGVha3JhdGUgJFRNUF9QRUFLfQorCisJCQlNQVRDSD0xCisJCWZpCisJZG9uZSAjIyMgdGltZXJ1bGUKKworCisJY2JxX2xvYWRfY2xhc3MgJENCUV9QQVRIICRjbGFzc2ZpbGUKKworCSMjIyBHZXQgY3VycmVudCBSQVRFIG9mIENCUSBjbGFzcworCVJBVEVfTk9XPWB0YyBjbGFzcyBzaG93IGRldiAkREVWSUNFfCBzZWQgLW4gXAorCQkgIi9jYnEgMTokQ0xBU1MgLyB7IHMvLipyYXRlIC8vOyBzLyAuKi8vOyBwOyBxOyB9ImAKKwlbIC16ICIkUkFURV9OT1ciIF0gJiYgY29udGludWUKKworCSMjIyBUaW1lIGludGVydmFsIG1hdGNoZWQKKwlpZiBbICRNQVRDSCAtbmUgMCBdOyB0aGVuCisKKwkJIyMjIENoZWNrIGlmIHRoZXJlIGlzIGFueSBjaGFuZ2UgaW4gY2xhc3MgUkFURQorCQlpZiBbICIkUkFURV9OT1ciICE9ICIkVE1QX1JBVEUiIF07IHRoZW4KKwkJCU5FV19SQVRFPSIkVE1QX1JBVEUiCisJCQlORVdfV0dIVD0iJFRNUF9XR0hUIgorCQkJTkVXX1BFQUs9IiRUTVBfUEVBSyIKKwkJCUNIQU5HRT0xCisJCWZpCisKKwkjIyMgTWF0Y2ggbm90IGZvdW5kLCByZXNldCB0byBkZWZhdWx0IFJBVEUgaWYgbmVjZXNzYXJ5CisJZWxpZiBbICIkUkFURV9OT1ciICE9ICIkUkFURSIgXTsgdGhlbgorCQlORVdfV0dIVD0iJFdFSUdIVCIKKwkJTkVXX1JBVEU9IiRSQVRFIgorCQlORVdfUEVBSz0iJFBFQUsiCisJCUNIQU5HRT0xCisJZmkKKworCSMjIyBJZiB0aGVyZSBhcmUgbm8gY2hhbmdlcywgZ28gZm9yIG5leHQgY2xhc3MKKwlbICRDSEFOR0UgLWVxIDAgXSAmJiBjb250aW51ZQorCisJIyMjIFJlcGxhY2UgQ0JRIGNsYXNzCisJdGMgY2xhc3MgcmVwbGFjZSBkZXYgJERFVklDRSBjbGFzc2lkIDE6JENMQVNTIGNicSBcCisJYmFuZHdpZHRoICRCQU5EV0lEVEggcmF0ZSAkTkVXX1JBVEUgd2VpZ2h0ICRORVdfV0dIVCBwcmlvICRQUklPIFwKKwlhbGxvdCAxNTE0IGNlbGwgOCBtYXhidXJzdCAyMCBhdnBrdCAkQVZQS1QgJEJPVU5ERUQgJElTT0xBVEVECisKKwkjIyMgUmVwbGFjZSBsZWFmIHFkaXNjIChpZiBhbnkpCisJaWYgWyAiJExFQUYiID0gInRiZiIgXTsgdGhlbgorCQl0YyBxZGlzYyByZXBsYWNlIGRldiAkREVWSUNFIGhhbmRsZSAkQ0xBU1MgdGJmIFwKKwkJcmF0ZSAkTkVXX1JBVEUgYnVmZmVyICRCVUZGRVIgbGltaXQgJExJTUlUIG10dSAkTVRVICRORVdfUEVBSworCWZpCisKKwljYnFfbWVzc2FnZSAiJFRJTUVfTk9XOiBjbGFzcyAkQ0xBU1Mgb24gJERFVklDRSBjaGFuZ2VkIHJhdGUgKCRSQVRFX05PVyAtPiAkTkVXX1JBVEUpIgorZG9uZSAjIyMgY2xhc3MgZmlsZQorOzsKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBUSEUgUkVTVCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK3N0b3ApCisJY2JxX29mZgorCTs7CisKK2xpc3QpCisJY2JxX3Nob3cKKwk7OworCitzdGF0cykKKwljYnFfc2hvdyAtcworCTs7CisKK3Jlc3RhcnQpCisJc2hpZnQKKwkkMCBzdG9wCisJJDAgc3RhcnQgIiRAIgorCTs7CisKKyopCisJZWNobyAiVXNhZ2U6IGBiYXNlbmFtZSAkMGAge3N0YXJ0fGNvbXBpbGV8c3RvcHxyZXN0YXJ0fHRpbWVjaGVja3xsaXN0fHN0YXRzfSIKK2VzYWMKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2V4YW1wbGVzL2NicWluaXQuZXRoMSBiL2lwcm91dGUyL2V4YW1wbGVzL2NicWluaXQuZXRoMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjZlYzFjCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvZXhhbXBsZXMvY2JxaW5pdC5ldGgxCkBAIC0wLDAgKzEsNzYgQEAKKyMhIC9iaW4vc2gKKworVEM9L2hvbWUvcm9vdC90YworSVA9L2hvbWUvcm9vdC9pcAorREVWSUNFPWV0aDEKK0JBTkRXSURUSD0iYmFuZHdpZHRoIDEwTWJpdCIKKworIyBBdHRhY2ggQ0JRIG9uICRERVZJQ0UuIEl0IHdpbGwgaGF2ZSBoYW5kbGUgMTouCisjICAgJEJBTkRXSURUSCBpcyByZWFsICRERVZJQ0UgYmFuZHdpZHRoICgxME1iaXQpLgorIyAgIGF2cGt0IGlzIGF2ZXJhZ2UgcGFja2V0IHNpemUuCisjICAgbXB1IGlzIG1pbmltYWwgcGFja2V0IHNpemUuCisKKyRUQyBxZGlzYyBhZGQgZGV2ICRERVZJQ0UgIHJvb3QgIGhhbmRsZSAxOiAgY2JxIFwKKyRCQU5EV0lEVEggYXZwa3QgMTAwMCBtcHUgNjQKKworIyBDcmVhdGUgcm9vdCBjbGFzcyB3aXRoIGNsYXNzaWQgMToxLiBUaGlzIHN0ZXAgaXMgbm90IG5lY2Vzc2FyeS4KKyMgICBiYW5kd2lkdGggaXMgdGhlIHNhbWUgYXMgb24gQ0JRIGl0c2VsZi4KKyMgICByYXRlID09IGFsbCB0aGUgYmFuZHdpZHRoCisjICAgYWxsb3QgaXMgTVRVICsgTUFDIGhlYWRlcgorIyAgIG1heGJ1cnN0IG1lYXN1cmUgYWxsb3dlZCBjbGFzcyBidXJzdGluZXNzIChwbGVhc2UscmVhZCBTLkZsb3lkIGFuZCBWSiBwYXBlcnMpCisjICAgZXN0IDFzZWMgOHNlYyBtZWFucywgdGhhdCBrZXJuZWwgd2lsbCBldmFsdWF0ZSBhdmVyYWdlIHJhdGUKKyMgICAgICAgICAgICAgICAgIG9uIHRoaXMgY2xhc3Mgd2l0aCBwZXJpb2QgMXNlYyBhbmQgdGltZSBjb25zdGFudCA4c2VjLgorIyAgICAgICAgICAgICAgICAgVGhpcyByYXRlIGlzIHZpZXdlZCB3aXRoICJ0YyAtcyBjbGFzcyBscyBkZXYgJERFVklDRSIKKworJFRDIGNsYXNzIGFkZCBkZXYgJERFVklDRSBwYXJlbnQgMTowIGNsYXNzaWQgOjEgZXN0IDFzZWMgOHNlYyBjYnEgXAorJEJBTkRXSURUSCByYXRlIDEwTWJpdCBhbGxvdCAxNTE0IG1heGJ1cnN0IDUwIGF2cGt0IDEwMDAKKworIyBCdWxrLgorIyAgICBOZXcgcGFyYW1ldGVycyBhcmU6IAorIyAgICB3ZWlnaHQsIHdoaWNoIGlzIHNldCB0byBiZSBwcm9wb3J0aW9uYWwgdG8KKyMgICAgICAgICAgICAicmF0ZSIuIEl0IGlzIG5vdCBuZWNlc3NhcnksIHdlaWdodD0xIHdpbGwgd29yayBhcyB3ZWxsLgorIyAgICBkZWZtYXAgYW5kIHNwbGl0IHNheSB0aGF0IGJlc3QgZWZmb3J0IHR0cmFmZmljLCBub3QgY2xhc3NmaWVkCisjICAgICAgICAgICAgYnkgYW5vdGhlciBtZWFucyB3aWxsIGZhbGwgdG8gdGhpcyBjbGFzcy4KKworJFRDIGNsYXNzIGFkZCBkZXYgJERFVklDRSBwYXJlbnQgMToxIGNsYXNzaWQgOjIgZXN0IDFzZWMgOHNlYyBjYnEgXAorJEJBTkRXSURUSCByYXRlIDRNYml0IGFsbG90IDE1MTQgd2VpZ2h0IDUwMEtiaXQgXAorcHJpbyA2IG1heGJ1cnN0IDUwIGF2cGt0IDEwMDAgc3BsaXQgMTowIGRlZm1hcCBmZjNkCisKKyMgT1BUSU9OQUwuCisjIEF0dGFjaCAic2ZxIiBxZGlzYyB0byB0aGlzIGNsYXNzLCBxdWFudHVtIGlzIE1UVSwgcGVydHVyYgorIyBnaXZlcyBwZXJpb2Qgb2YgaGFzaCBmdW5jdGlvbiBwZXJ0dXJiYXRpb24gaW4gc2Vjb25kcy4KKyMKKyRUQyBxZGlzYyBhZGQgZGV2ICRERVZJQ0UgcGFyZW50IDE6MiBzZnEgcXVhbnR1bSAxNTE0YiBwZXJ0dXJiIDE1CisKKyMgSW50ZXJhY3RpdmUtYnVyc3QgY2xhc3MKKworJFRDIGNsYXNzIGFkZCBkZXYgJERFVklDRSBwYXJlbnQgMToxIGNsYXNzaWQgOjMgZXN0IDJzZWMgMTZzZWMgY2JxIFwKKyRCQU5EV0lEVEggcmF0ZSAxTWJpdCBhbGxvdCAxNTE0IHdlaWdodCAxMDBLYml0IFwKK3ByaW8gMiBtYXhidXJzdCAxMDAgYXZwa3QgMTAwMCBzcGxpdCAxOjAgZGVmbWFwIGMwCisKKyRUQyBxZGlzYyBhZGQgZGV2ICRERVZJQ0UgcGFyZW50IDE6MyBzZnEgcXVhbnR1bSAxNTE0YiBwZXJ0dXJiIDE1CisKKyMgQmFja2dyb3VuZC4KKworJFRDIGNsYXNzIGFkZCBkZXYgJERFVklDRSBwYXJlbnQgMToxIGNsYXNzaWQgOjQgZXN0IDFzZWMgOHNlYyBjYnEgXAorICAkQkFORFdJRFRIIHJhdGUgMTAwS2JpdCBhbGxvdCAxNTE0IHdlaWdodCAxME1iaXQgXAorICBwcmlvIDcgbWF4YnVyc3QgMTAgYXZwa3QgMTAwMCBzcGxpdCAxOjAgZGVmbWFwIDIKKworJFRDIHFkaXNjIGFkZCBkZXYgJERFVklDRSBwYXJlbnQgMTo0IHNmcSBxdWFudHVtIDE1MTRiIHBlcnR1cmIgMTUKKworIyBSZWFsdGltZSBjbGFzcyBmb3IgUlNWUAorCiskVEMgY2xhc3MgYWRkIGRldiAkREVWSUNFIHBhcmVudCAxOjEgY2xhc3NpZCAxOjdGRkUgY2JxIFwKK3JhdGUgNU1iaXQgJEJBTkRXSURUSCBhbGxvdCAxNTE0YiBhdnBrdCAxMDAwIFwKK21heGJ1cnN0IDIwCisKKyMgUmVjbGFzc2lmaWVkIHJlYWx0aW1lIHRyYWZmaWMKKyMKKyMgTmV3IGVsZW1lbnQ6IHNwbGl0IGlzIG5vdCAxOjAsIGJ1dCAxOjdGRkUuIEl0IG1lYW5zLAorIyAgICAgdGhhdCBvbmx5IHJlYWwtdGltZSBwYWNrZXRzLCB3aGljaCB2aW9sYXRlZCBwb2xpY2luZyBmaWx0ZXJzCisjICAgICBvciBleGNlZWRlZCByZXNoYXBpbmcgYnVmZmVycyB3aWxsIGZhbGwgdG8gaXQuCisKKyRUQyBjbGFzcyBhZGQgZGV2ICRERVZJQ0UgcGFyZW50IDE6N0ZGRSBjbGFzc2lkIDE6N0ZGRiAgZXN0IDRzZWMgMzJzZWMgY2JxIFwKK3JhdGUgMU1iaXQgJEJBTkRXSURUSCBhbGxvdCAxNTE0YiBhdnBrdCAxMDAwIHdlaWdodCAxMEtiaXQgXAorcHJpbyA2IG1heGJ1cnN0IDEwIHNwbGl0IDE6N0ZGRSBkZWZtYXAgZmZmZgorCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9leGFtcGxlcy9kaGNwLWNsaWVudC1zY3JpcHQgYi9pcHJvdXRlMi9leGFtcGxlcy9kaGNwLWNsaWVudC1zY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5YmMxMAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2V4YW1wbGVzL2RoY3AtY2xpZW50LXNjcmlwdApAQCAtMCwwICsxLDQ0NiBAQAorIyEvYmluL2Jhc2gKKyMKKyMgZGhjbGllbnQtc2NyaXB0IGZvciBMaW51eC4KKyMKKyMJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyMJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyMKKyMgUHJvYmFibHksIEkgZGlkIG5vdCB1bmRlcnN0YW5kLCB3aGF0IHRoaXMgZnVubnkgZmVhdHVyZSBhcyAiYWxpYXMiCisjIG1lYW5zIGV4YWN0bHkuIEZvciBub3cgSSBzdXBwb3NlLCB0aGF0IGl0IGlzIGEgc3RhdGljIGFkZHJlc3MsIHdoaWNoCisjIHdlIHNob3VsZCBpbnN0YWxsIGFuZCBwcmVzZXJ2ZS4KKyMKKworZXhlYyA+PiAvdmFyL2xvZy9ESFMubG9nIDI+JjEKKworZWNobyBkaGMtc2NyaXB0ICQqIHJlYXNvbj0kcmVhc29uCitzZXQgfCBncmVwICJeXChvbGRfXHxuZXdfXHxjaGVja19cKSIKKworTE9HICgpIHsKKyAgICBlY2hvIExPRyAkKiA7Cit9CisKKyMgY29udmVydCA4Yml0IG1hc2sgdG8gbGVuZ3RoCisjIGFyZzogJDEgPSBtYXNrCisjCitNYXNrOFRvTGVuKCkgeworCWxvY2FsIGw9MDsKKworCXdoaWxlIFsgJGwgLWxlIDcgXTsgZG8KKwkJaWYgWyAkWyAoIDEgPDwgJGwgKSArICQxIF0gLWVxIDI1NiBdOyB0aGVuCisJCQlyZXR1cm4JJFsgOCAtICRsIF0KKwkJZmkKKwkJbD0kWyAkbCArIDEgXQorCWRvbmUKKwlyZXR1cm4gMDsKK30KKworIyBjb252ZXJ0IGluZXQgZG90dGVkIHF1YWQgbWFzayB0byBsZW5ndGgKKyMgYXJnOiAkMSA9IGRvdHF1YWQgbWFzaworIworTWFza1RvTGVuKCkgeworIGxvY2FsIG1hc2tsZW49MAorIGxvY2FsIG1hc2s4PSQxCisKKyBjYXNlICQxIGluCisgMC4wLjAuMCkKKwlyZXR1cm4gMDsKKwk7OworIDI1NS4qLjAuMCkKKwltYXNrbGVuPTgKKwltYXNrOD0ke21hc2s4IzI1NS59CisJbWFzazg9JHttYXNrOCUuMC4wfQorCTs7CisgMjU1LjI1NS4qLjApCisJbWFza2xlbj0xNgorCW1hc2s4PSR7bWFzazgjMjU1LjI1NS59CisJbWFzazg9JHttYXNrOCUuMH0KKwk7OworIDI1NS4yNTUuMjU1LiopCisJbWFza2xlbj0yNAorCW1hc2s4PSR7bWFzazgjMjU1LjI1NS4yNTUufQorCTs7CisgKikKKwlyZXR1cm4gMjU1CisJOzsKKyBlc2FjCisgTWFzazhUb0xlbiAkbWFzazgKKyByZXR1cm4gJFsgJD8gKyAkbWFza2xlbiBdCit9CisKKyMgY2FsY3VsYXRlIEFCQyAibmF0dXJhbCIgbWFzaworIyBhcmc6ICQxID0gZG90cXVhZCBhZGRyZXNzCisjCitBQkNNYXNrICgpIHsKKyBsb2NhbCBjbGFzczsKKworIGNsYXNzPSR7MSUlLip9CisKKyBpZiBbICIkMSIgPSAiMjU1LjI1NS4yNTUuMjU1IiBdOyB0aGVuCisgICAgZWNobyAkMQorIGVsaWYgWyAiJDEiID0gIjAuMC4wLjAiIF07IHRoZW4KKyAgICBlY2hvICQxCisgZWxpZiBbICRjbGFzcyAtZ2UgMjI0IF07IHRoZW4KKyAgICBlY2hvIDI0MC4wLjAuMAorIGVsaWYgWyAkY2xhc3MgLWdlIDE5MiBdOyB0aGVuCisgICAgZWNobyAyNTUuMjU1LjI1NS4wCisgZWxpZiBbICRjbGFzcyAtZ2UgMTI4IF07IHRoZW4KKyAgICBlY2hvIDI1NS4yNTUuMC4wCisgZWxzZQorICAgIGVjaG8gMjU1LjAuMC4wCisgZmkKK30KKworIyBjYWxjdWxhdGUgQUJDICJuYXR1cmFsIiBtYXNrIGxlbmd0aAorIyBhcmc6ICQxID0gZG90cXVhZCBhZGRyZXNzCisjCitBQkNNYXNrTGVuICgpIHsKKyBsb2NhbCBjbGFzczsKKworIGNsYXNzPSR7MSUlLip9CisKKyBpZiBbICIkMSIgPSAiMjU1LjI1NS4yNTUuMjU1IiBdOyB0aGVuCisgICAgcmV0dXJuIDMyCisgZWxpZiBbICIkMSIgPSAiMC4wLjAuMCIgXTsgdGhlbgorICAgIHJldHVybiAwCisgZWxpZiBbICRjbGFzcyAtZ2UgMjI0IF07IHRoZW4KKyAgICByZXR1cm4gNDsKKyBlbGlmIFsgJGNsYXNzIC1nZSAxOTIgXTsgdGhlbgorICAgIHJldHVybiAyNDsKKyBlbGlmIFsgJGNsYXNzIC1nZSAxMjggXTsgdGhlbgorICAgIHJldHVybiAxNjsKKyBlbHNlCisgICAgcmV0dXJuIDg7CisgZmkKK30KKworIyBEZWxldGUgSVAgYWRkcmVzcworIyBhcmdzOiAkMSA9IGludGVyZmFjZQorIyAgICAgICAkMiA9IGFkZHJlc3MKKyMgICAgICAgJDMgPSBtYXNrCisjICAgICAgICQ0ID0gYnJvYWRjYXN0CisjICAgICAgICQ1ID0gbGFiZWwKKyMKK0RlbElORVRBZGRyICgpIHsKKyAgbG9jYWwgbWFza2xlbj0zMgorICBsb2NhbCBhZGRyaWQ9JDEKKworICBMT0cgRGVsSU5FVEFkZHIgJCoKKworICBpZiBbICIkNSIgXTsgdGhlbgorICAgIGFkZHJpZD0kYWRkcmlkOiQ1CisgIGZpCisgIExPRyBpZmNvbmZpZyAkYWRkcmlkIGRvd24KKyAgaWZjb25maWcgJGFkZHJpZCBkb3duCit9CisKKyMgQWRkIElQIGFkZHJlc3MKKyMgYXJnczogJDEgPSBpbnRlcmZhY2UKKyMgICAgICAgJDIgPSBhZGRyZXNzCisjICAgICAgICQzID0gbWFzaworIyAgICAgICAkNCA9IGJyb2FkY2FzdAorIyAgICAgICAkNSA9IGxhYmVsCisjCitBZGRJTkVUQWRkciAoKSB7CisgIGxvY2FsIG1hc2tfYXJnCisgIGxvY2FsIGJyZF9hcmcKKyAgbG9jYWwgYWRkcmlkPSQxCisKKyAgTE9HIEFkZElORVRBZGRyICQqCisKKyAgaWYgWyAiJDUiIF07IHRoZW4KKyAgICBhZGRyaWQ9JGFkZHJpZDokNQorICBmaQorICBpZiBbICIkMyIgXTsgdGhlbgorICAgIG1hc2tfYXJnPSJuZXRtYXNrICQzIgorICBmaQorICBpZiBbICIkNCIgXTsgdGhlbgorICAgIGJyZF9hcmc9ImJyb2FkY2FzdCAkNCIKKyAgZmkKKworICBMT0cgaWZjb25maWcgJGFkZHJpZCAkMiAkbWFza19hcmcgJGJyZF9hcmcgdXAKKyAgaWZjb25maWcgJGFkZHJpZCAkMiAkbWFza19hcmcgJGJyZF9hcmcgdXAKK30KKworIyBBZGQgZGVmYXVsdCByb3V0ZXMKKyMgYXJnczogJDEgPSByb3V0ZXJzIGxpc3QKKyMKK0FkZERlZmF1bHRSb3V0ZXMoKSB7CisgICAgbG9jYWwgcm91dGVyCisKKyAgICBpZiBbICIkMSIgXTsgdGhlbgorICAgICAgTE9HIEFkZERlZmF1bHRSb3V0ZXMgJCoKKyAgICAgIGZvciByb3V0ZXIgaW4gJDE7IGRvCisgICAgICAgIExPRyByb3V0ZSBhZGQgZGVmYXVsdCBndyAkcm91dGVyCisgICAgICAgIHJvdXRlIGFkZCBkZWZhdWx0IGd3ICRyb3V0ZXIKKyAgICAgIGRvbmUgOworICAgIGZpCit9CisKKyMgRGVsZXRlIGRlZmF1bHQgcm91dGVzCisjIGFyZ3M6ICQxID0gcm91dGVycyBsaXN0CisjCitEZWxEZWZhdWx0Um91dGVzKCkgeworICAgIGxvY2FsIHJvdXRlcgorCisgICAgaWYgWyAiJDEiIF07IHRoZW4KKyAgICAgIExPRyBEZWxEZWZhdWx0Um91dGVzICQqCisKKyAgICAgIGZvciByb3V0ZXIgaW4gJDE7IGRvCisgICAgICAgIExPRyByb3V0ZSBkZWwgZGVmYXVsdCBndyAkcm91dGVyCisgICAgICAgIHJvdXRlIGRlbCBkZWZhdWx0IGd3ICRyb3V0ZXIKKyAgICAgIGRvbmUKKyAgICBmaQorfQorCisjIHBpbmcgYSBob3N0CisjIGFyZ3M6ICQxID0gZG90cXVhZCBhZGRyZXNzIG9mIHRoZSBob3N0CisjCitQaW5nTm9kZSgpIHsKKyAgICBMT0cgUGluZ05vZGUgJCoKKyAgICBpZiBwaW5nIC1xIC1jIDEgLXcgMiAkMSA7IHRoZW4KKwlyZXR1cm4gMDsKKyAgICBmaQorICAgIHJldHVybiAxOworfQorCisjIENoZWNrIChhbmQgYWRkIHJvdXRlLCBpZiBhbGl2ZSkgZGVmYXVsdCByb3V0ZXJzCisjIGFyZ3M6ICQxID0gcm91dGVycyBsaXN0CisjIHJldHVybnM6IDAgaWYgYXQgbGVhc3Qgb25lIHJvdXRlciBpcyBhbGl2ZS4KKyMKK0NoZWNrUm91dGVyTGlzdCgpIHsKKyAgICBsb2NhbCByb3V0ZXIKKyAgICBsb2NhbCBzdWNjZWVkPTEKKworICAgIExPRyBDaGVja1JvdXRlckxpc3QgJCoKKworICAgIGZvciByb3V0ZXIgaW4gJDE7IGRvCisgICAgICBpZiBQaW5nTm9kZSAkcm91dGVyIDsgdGhlbgorCXN1Y2NlZWQ9MAorICAgICAgICByb3V0ZSBhZGQgZGVmYXVsdCBndyAkcm91dGVyCisgICAgICBmaQorICAgIGRvbmUKKyAgICByZXR1cm4gJHN1Y2NlZWQKK30KKworIyBEZWxldGUvY3JlYXRlIHN0YXRpYyByb3V0ZXMuCisjIGFyZ3M6ICQxID0gb3BlcmF0aW9uIChkZWwvYWRkKQorIyAgICAgICAkMiA9IHJvdXRlcyBsaXN0IGluIGZvcm1hdCAiZHN0MSBuZXh0aG9wMSBkc3QyIC4uLiIKKyMKKyMgQkVXQVJFOiB0aGlzIGZlYXR1cmUgb2YgREhDUCBpcyBvYnNvbGV0ZSwgYmVjYXVzZSBkb2VzIG5vdAorIyAgICAgICAgIHN1cHBvcnQgc3VibmV0dGluZy4KKyMKK1gtU3RhdGljUm91dGVMaXN0KCkgeworICAgIGxvY2FsIG9wPSQxCisgICAgbG9jYWwgbHN0PSIkMiIKKyAgICBsb2NhbCBtYXNrbGVuCisKKyAgICBMT0cgWC1TdGF0aWNSb3V0ZUxpc3QgJCoKKworICAgIGlmIFsgIiRsc3QiIF07IHRoZW4KKyAgICAgIHNldCAkbHN0CisgICAgICB3aGlsZSBbICQjIC1ndCAxIF07IGRvCisJcm91dGUgJG9wIC1uZXQgJDEgbmV0bWFzayBgQUJDTWFzayAiJDEiYCBndyAkMgorCXNoaWZ0OyBzaGlmdDsKKyAgICAgIGRvbmUKKyAgIGZpCit9CisKKyMgQ3JlYXRlIHN0YXRpYyByb3V0ZXMuCisjIGFyZzogJDEgPSByb3V0ZXMgbGlzdCBpbiBmb3JtYXQgImRzdDEgbmV4dGhvcDEgZHN0MiAuLi4iCisjCitBZGRTdGF0aWNSb3V0ZUxpc3QoKSB7CisgICAgTE9HIEFkZFN0YXRpY1JvdXRlTGlzdCAkKgorICAgIFgtU3RhdGljUm91dGVMaXN0IGFkZCAiJDEiCit9CisKKyMgRGVsZXRlIHN0YXRpYyByb3V0ZXMuCisjIGFyZzogJDEgPSByb3V0ZXMgbGlzdCBpbiBmb3JtYXQgImRzdDEgbmV4dGhvcDEgZHN0MiAuLi4iCisjCitEZWxTdGF0aWNSb3V0ZUxpc3QoKSB7CisgICAgTE9HIERlbFN0YXRpY1JvdXRlTGlzdCAkKgorICAgIFgtU3RhdGljUm91dGVMaXN0IGRlbCAiJDEiCit9CisKKyMgQnJvYWRjYXN0IHVuc29saWNpdGVkIEFSUCB0byB1cGRhdGUgbmVpZ2hib3VycycgY2FjaGVzLgorIyBhcmdzOiAkMSA9IGludGVyZmFjZQorIyAgICAgICAkMiA9IGFkZHJlc3MKKyMKK1Vuc29saWNpdGVkQVJQKCkgeworICAgIGlmIFsgLWYgL3NiaW4vYXJwaW5nIF07IHRoZW4KKwkvc2Jpbi9hcnBpbmcgLUEgLWMgMSAtSSAiJDEiICIkMiIgJgorCShzbGVlcCAyIDsgL3NiaW4vYXJwaW5nIC1VIC1jIDEgLUkgIiQxIiAiJDIiICkgJgorICAgIGZpCit9CisKKyMgRHVwbGljYXRlIGFkZHJlc3MgZGV0ZWN0aW9uLgorIyBhcmdzOiAkMSA9IGludGVyZmFjZQorIyAgICAgICAkMiA9IHRlc3QgYWRkcmVzcworIyByZXR1cm5zOiAwLCBpZiBEQUQgc3VjY2VlZGVkLgorREFEKCkgeworICBpZiBbIC1mIC9zYmluL2FycGluZyBdOyB0aGVuCisJL3NiaW4vYXJwaW5nIC1jIDIgLXcgMyAtRCAtSSAiJDEiICIkMiIKKwlyZXR1cm4gJD8KKyAgZmkKKyAgcmV0dXJuIDAKK30KKworCisjIFNldHVwIHJlc29sdmVyLgorIyBhcmdzOiBOTworIyAgICAgICBkb21haW4gYW5kIG5hbWVzZXJ2ZXIgbGlzdCBhcmUgcGFzc2VkIGluIGdsb2JhbCB2YXJpYWJsZXMuCisjCisjIE5PVEU6IHdlIHRyeSB0byBiZSBjYXJlZnVsIGFuZCBub3QgdG8gYnJlYWsgdXNlciBzdXBwbGllZCByZXNvbHYuY29uZi4KKyMgICAgICAgVGhlIHNjcmlwdCBtYW5nbGVzIGl0LCBvbmx5IGlmIGl0IGhhcyBkaGNwIG1hZ2ljIHNpZ25hdHVyZS4KKyMKK1VwZGF0ZUROUygpIHsKKyAgICBsb2NhbCBuYW1lc2VydmVyCisgICAgbG9jYWwgaWRzdHJpbmc9IiMjIyMgR2VuZXJhdGVkIGJ5IERIQ1BDRCIKKworICAgIExPRyBVcGRhdGVETlMgJCoKKworICAgIGlmIFsgIiRuZXdfZG9tYWluX25hbWUiID0gIiIgLWEgIiRuZXdfZG9tYWluX25hbWVfc2VydmVycyIgPSAiIiBdOyB0aGVuCisJcmV0dXJuIDA7CisgICAgZmkKKworICAgIGVjaG8gJGlkc3RyaW5nID4gL2V0Yy9yZXNvbHYuY29uZi5kaGNwCisgICAgaWYgWyAiJG5ld19kb21haW5fbmFtZSIgXTsgdGhlbgorCWVjaG8gc2VhcmNoICRuZXdfZG9tYWluX25hbWUgPj4gL2V0Yy9yZXNvbHYuY29uZi5kaGNwCisgICAgZmkKKyAgICBlY2hvIG9wdGlvbnMgbmRvdHM6MSA+PiAvZXRjL3Jlc29sdi5jb25mLmRoY3AKKworICAgIGlmIFsgIiRuZXdfZG9tYWluX25hbWVfc2VydmVycyIgXTsgdGhlbgorCWZvciBuYW1lc2VydmVyIGluICRuZXdfZG9tYWluX25hbWVfc2VydmVyczsgZG8KKwkgICAgZWNobyBuYW1lc2VydmVyICRuYW1lc2VydmVyID4+IC9ldGMvcmVzb2x2LmNvbmYuZGhjcAorCWRvbmUKKyAgICBlbHNlCisJZWNobyBuYW1lc2VydmVyIDEyNy4wLjAuMSA+PiAvZXRjL3Jlc29sdi5jb25mLmRoY3AKKyAgICBmaQorCisgICAgaWYgWyAtZiAvZXRjL3Jlc29sdi5jb25mIF07IHRoZW4KKwlpZiBbICJgaGVhZCAtMSAvZXRjL3Jlc29sdi5jb25mYCIgIT0gIiRpZHN0cmluZyIgXTsgdGhlbgorCSAgICByZXR1cm4gMAorCWZpCisJaWYgWyAiJG9sZF9kb21haW5fbmFtZSIgPSAiJG5ld19kb21haW5fbmFtZSIgLWEKKwkgICAgICIkbmV3X2RvbWFpbl9uYW1lX3NlcnZlcnMiID0gIiRvbGRfZG9tYWluX25hbWVfc2VydmVycyIgXTsgdGhlbgorCSAgICAgcmV0dXJuIDAKKwlmaQorICAgIGZpCisgICAgbXYgL2V0Yy9yZXNvbHYuY29uZi5kaGNwIC9ldGMvcmVzb2x2LmNvbmYKK30KKworY2FzZSAkcmVhc29uIGluCitOQkkpCisgIGV4aXQgMQorICA7OworCitNRURJVU0pCisgIGV4aXQgMAorICA7OworCitQUkVJTklUKQorICBpZmNvbmZpZyAkaW50ZXJmYWNlOmRoY3AgZG93bgorICBpZmNvbmZpZyAkaW50ZXJmYWNlOmRoY3AxIGRvd24KKyAgaWYgWyAtZCAvcHJvYy9zeXMvbmV0L2lwdjQvY29uZi8kaW50ZXJmYWNlIF07IHRoZW4KKyAgICBpZmNvbmZpZyAkaW50ZXJmYWNlOmRoY3AgMTAuMTAuMTAuMTAgbmV0bWFzayAyNTUuMjU1LjI1NS4yNTUKKyAgICBpZmNvbmZpZyAkaW50ZXJmYWNlOmRoY3AgZG93bgorICAgIGlmIFsgLWQgL3Byb2Mvc3lzL25ldC9pcHY0L2NvbmYvJGludGVyZmFjZSBdOyB0aGVuCisJTE9HIFRoZSBpbnRlcmZhY2UgJGludGVyZmFjZSBhbHJlYWR5IGNvbmZpZ3VyZWQuCisgICAgZmkKKyAgZmkKKyAgaWZjb25maWcgJGludGVyZmFjZTpkaGNwIHVwCisgIGV4aXQgMAorICA7OworCitBUlBTRU5EKQorICBleGl0IDAKKyAgOzsKKworQVJQQ0hFQ0spCisgIGlmIERBRCAiJGludGVyZmFjZSIgIiRjaGVja19pcF9hZGRyZXNzIiA7IHRoZW4KKyAgICBleGl0IDAKKyAgZmkKKyAgZXhpdCAxCisgIDs7CisKK0JPVU5EfFJFTkVXfFJFQklORHxSRUJPT1QpCisgIGlmIFsgIiRvbGRfaXBfYWRkcmVzcyIgLWEgIiRhbGlhc19pcF9hZGRyZXNzIiAtYSBcCisJIiRhbGlhc19pcF9hZGRyZXNzIiAhPSAiJG9sZF9pcF9hZGRyZXNzIiBdOyB0aGVuCisgICAgRGVsSU5FVEFkZHIgIiRpbnRlcmZhY2UiICIkYWxpYXNfaXBfYWRkcmVzcyIgIiRhbGlhc19zdWJuZXRfbWFzayIgIiRhbGlhc19icm9hZGNhc3RfYWRkcmVzcyIgZGhjcDEKKyAgZmkKKyAgaWYgWyAiJG9sZF9pcF9hZGRyZXNzIiAtYSAiJG9sZF9pcF9hZGRyZXNzIiAhPSAiJG5ld19pcF9hZGRyZXNzIiBdOyB0aGVuCisgICAgRGVsSU5FVEFkZHIgIiRpbnRlcmZhY2UiICIkb2xkX2lwX2FkZHJlc3MiICIkb2xkX3N1Ym5ldF9tYXNrIiAiJG9sZF9icm9hZGNhc3RfYWRkcmVzcyIgZGhjcAorICAgIERlbERlZmF1bHRSb3V0ZXMgIiRvbGRfcm91dGVycyIKKyAgICBEZWxTdGF0aWNSb3V0ZUxpc3QgIiRvbGRfc3RhdGljX3JvdXRlcyIKKyAgZmkKKyAgaWYgWyAiJG9sZF9pcF9hZGRyZXNzIiA9ICIiIC1vICIkb2xkX2lwX2FkZHJlc3MiICE9ICIkbmV3X2lwX2FkZHJlc3MiIC1vIFwKKyAgICAgICAiJHJlYXNvbiIgPSAiQk9VTkQiIC1vICIkcmVhc29uIiA9ICJSRUJPT1QiIF07IHRoZW4KKyAgICBBZGRJTkVUQWRkciAiJGludGVyZmFjZSIgIiRuZXdfaXBfYWRkcmVzcyIgIiRuZXdfc3VibmV0X21hc2siICIkbmV3X2Jyb2FkY2FzdF9hZGRyZXNzIiBkaGNwCisgICAgQWRkU3RhdGljUm91dGVMaXN0ICIkbmV3X3N0YXRpY19yb3V0ZXMiCisgICAgQWRkRGVmYXVsdFJvdXRlcyAiJG5ld19yb3V0ZXJzIgorICAgIFVuc29saWNpdGVkQVJQICIkaW50ZXJmYWNlIiAiJG5ld19pcF9hZGRyZXNzIgorICBmaQorICBpZiBbICIkbmV3X2lwX2FkZHJlc3MiICE9ICIkYWxpYXNfaXBfYWRkcmVzcyIgLWEgIiRhbGlhc19pcF9hZGRyZXNzIiBdOyB0aGVuCisgICAgQWRkSU5FVEFkZHIgIiRpbnRlcmZhY2UiICIkYWxpYXNfaXBfYWRkcmVzcyIgIiRhbGlhc19zdWJuZXRfbWFzayIgIiRhbGlhc19icm9hZGNhc3RfYWRkcmVzcyIgZGhjcDEKKyAgZmkKKyAgVXBkYXRlRE5TCisgIGV4aXQgMAorICA7OworCitFWFBJUkV8RkFJTCkKKyAgaWYgWyAiJGFsaWFzX2lwX2FkZHJlc3MiIF07IHRoZW4KKyAgICBEZWxJTkVUQWRkciAiJGludGVyZmFjZSIgIiRhbGlhc19pcF9hZGRyZXNzIiAiJGFsaWFzX3N1Ym5ldF9tYXNrIiAiJGFsaWFzX2Jyb2FkY2FzdF9hZGRyZXNzIiBkaGNwMQorICBmaQorICBpZiBbICIkb2xkX2lwX2FkZHJlc3MiIF07IHRoZW4KKyAgICBEZWxJTkVUQWRkciAiJGludGVyZmFjZSIgIiRvbGRfaXBfYWRkcmVzcyIgIiRvbGRfc3VibmV0X21hc2siICIkb2xkX2Jyb2FkY2FzdF9hZGRyZXNzIiBkaGNwCisgICAgRGVsRGVmYXVsdFJvdXRlcyAiJG9sZF9yb3V0ZXJzIgorICAgIERlbFN0YXRpY1JvdXRlTGlzdCAiJG9sZF9zdGF0aWNfcm91dGVzIgorICBmaQorICBpZiBbICIkYWxpYXNfaXBfYWRkcmVzcyIgXTsgdGhlbgorICAgIEFkZElORVRBZGRyICIkaW50ZXJmYWNlIiAiJGFsaWFzX2lwX2FkZHJlc3MiICIkYWxpYXNfc3VibmV0X21hc2siICIkYWxpYXNfYnJvYWRjYXN0X2FkZHJlc3MiIGRoY3AxCisgIGZpCisgIGV4aXQgMAorICA7OworCitUSU1FT1VUKQorICBpZiBbICIkYWxpYXNfaXBfYWRkcmVzcyIgXTsgdGhlbgorICAgIERlbElORVRBZGRyICIkaW50ZXJmYWNlIiAiJGFsaWFzX2lwX2FkZHJlc3MiICIkYWxpYXNfc3VibmV0X21hc2siICIkYWxpYXNfYnJvYWRjYXN0X2FkZHJlc3MiIGRoY3AxCisgIGZpCisjIFNlZW1zLCA8bnVsbCBhZGRyZXNzPiBtZWFucywgdGhhdCBubyBtb3JlIG9sZCBsZWFzZXMgZm91bmQuCisjIE9yIGRvZXMgaXQgbWVhbiBidWcgaW4gZGhjcGNkPyA4KSBGYWlsIGZvciBub3cuCisgIGlmIFsgIiRuZXdfaXBfYWRkcmVzcyIgPSAiPG51bGwgYWRkcmVzcz4iIF07IHRoZW4KKyAgICBpZiBbICIkb2xkX2lwX2FkZHJlc3MiIF07IHRoZW4KKwlEZWxJTkVUQWRkciAiJGludGVyZmFjZSIgIiRvbGRfaXBfYWRkcmVzcyIgIiRvbGRfc3VibmV0X21hc2siICIkb2xkX2Jyb2FkY2FzdF9hZGRyZXNzIiBkaGNwCisgICAgZmkKKyAgICBpZiBbICIkYWxpYXNfaXBfYWRkcmVzcyIgXTsgdGhlbgorICAgICAgICBBZGRJTkVUQWRkciAiJGludGVyZmFjZSIgIiRhbGlhc19pcF9hZGRyZXNzIiAiJGFsaWFzX3N1Ym5ldF9tYXNrIiAiJGFsaWFzX2Jyb2FkY2FzdF9hZGRyZXNzIiBkaGNwMQorICAgIGZpCisgICAgZXhpdCAxCisgIGZpCisgIGlmIERBRCAiJGludGVyZmFjZSIgIiRuZXdfaXBfYWRkcmVzcyIgOyB0aGVuCisgICAgQWRkSU5FVEFkZHIgIiRpbnRlcmZhY2UiICIkbmV3X2lwX2FkZHJlc3MiICIkbmV3X3N1Ym5ldF9tYXNrIiAiJG5ld19icm9hZGNhc3RfYWRkcmVzcyIgZGhjcAorICAgIFVuc29saWNpdGVkQVJQICIkaW50ZXJmYWNlIiAiJG5ld19pcF9hZGRyZXNzIgorICAgIGlmIFsgIiRhbGlhc19pcF9hZGRyZXNzIiAtYSAiJGFsaWFzX2lwX2FkZHJlc3MiICE9ICIkbmV3X2lwX2FkZHJlc3MiIF07IHRoZW4KKyAgICAgIEFkZElORVRBZGRyICIkaW50ZXJmYWNlIiAiJGFsaWFzX2lwX2FkZHJlc3MiICIkYWxpYXNfc3VibmV0X21hc2siICIkYWxpYXNfYnJvYWRjYXN0X2FkZHJlc3MiIGRoY3AxCisgICAgICBVbnNvbGljaXRlZEFSUCAiJGludGVyZmFjZSIgIiRhbGlhc19pcF9hZGRyZXNzIgorICAgIGZpCisgICAgaWYgQ2hlY2tSb3V0ZXJMaXN0ICIkbmV3X3JvdXRlcnMiIDsgdGhlbgorCUFkZFN0YXRpY1JvdXRlTGlzdCAiJG5ld19zdGF0aWNfcm91dGVzIgorCVVwZGF0ZUROUworCWV4aXQgMAorICAgIGZpCisgIGZpCisgIERlbElORVRBZGRyICIkaW50ZXJmYWNlIiAiJG5ld19pcF9hZGRyZXNzIiAiJG5ld19zdWJuZXRfbWFzayIgIiRuZXdfYnJvYWRjYXN0X2FkZHJlc3MiIGRoY3AKKyAgRGVsRGVmYXVsdFJvdXRlcyAiJG9sZF9yb3V0ZXJzIgorICBEZWxTdGF0aWNSb3V0ZUxpc3QgIiRvbGRfc3RhdGljX3JvdXRlcyIKKyAgaWYgWyAiJGFsaWFzX2lwX2FkZHJlc3MiIF07IHRoZW4KKyAgICBBZGRJTkVUQWRkciAiJGludGVyZmFjZSIgIiRhbGlhc19pcF9hZGRyZXNzIiAiJGFsaWFzX3N1Ym5ldF9tYXNrIiAiJGFsaWFzX2Jyb2FkY2FzdF9hZGRyZXNzIiBkaGNwMQorICBmaQorICBleGl0IDEKKyAgOzsKK2VzYWMKKworZXhpdCAwCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9leGFtcGxlcy9kaWZmc2Vydi9FZGdlMSBiL2lwcm91dGUyL2V4YW1wbGVzL2RpZmZzZXJ2L0VkZ2UxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZGZmZGQKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9leGFtcGxlcy9kaWZmc2Vydi9FZGdlMQpAQCAtMCwwICsxLDY4IEBACisjISAvYmluL3NoIC14CisjCisjIHNhbXBsZSBzY3JpcHQgb24gdXNpbmcgdGhlIGluZ3Jlc3MgY2FwYWJpbGl0aWVzCisjIFRoaXMgc2NyaXB0IGp1c3QgdGFncyBvbiB0aGUgaW5ncmVzcyBpbnRlcmZhYyB1c2luZyBJcGNoYWlucworIyB0aGUgcmVzdWx0IGlzIHVzZWQgZm9yIGZhc3QgY2xhc3NpZmljYXRpb24gYW5kIHJlLW1hcmtpbmcKKyMgb24gdGhlIGVncmVzcyBpbnRlcmZhY2UKKyMKKyNwYXRoIHRvIHZhcmlvdXMgdXRpbGl0aWVzOworI2NoYW5nZSB0byByZWZsZWN0IHlvdXJzLgorIworSVBST1VURT0vcm9vdC9EUy02LWJldGEvaXByb3V0ZTItOTkwNTMwLWRzaW5nCitUQz0kSVBST1VURS90Yy90YworSVA9JElQUk9VVEUvaXAvaXAKK0lQQ0hBSU5TPS9yb290L0RTLTYtYmV0YS9pcGNoYWlucy0xLjMuOS9pcGNoYWlucworSU5ERVY9ZXRoMgorRUdERVY9ImRldiBldGgxIgorIworIyB0YWcgYWxsIGluY29taW5nIHBhY2tldHMgZnJvbSBob3N0IDEwLjIuMC4yNCB0byB2YWx1ZSAxCisjIHRhZyBhbGwgaW5jb21pbmcgcGFja2V0cyBmcm9tIGhvc3QgMTAuMi4wLjMgdG8gdmFsdWUgMgorIyB0YWcgdGhlIHJlc3Qgb2YgaW5jb21pbmcgcGFja2V0cyBmcm9tIHN1Ym5ldCAxMC4yLjAuMC8yNCB0byB2YWx1ZSAzCisjVGhlc2UgdmFsdWVzIGFyZSB1c2VkIGluIHRoZSBlZ3Jlc3MKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAKKyRJUENIQUlOUyAtQSBpbnB1dCAtcyAxMC4yLjAuNC8yNCAtbSAzCiskSVBDSEFJTlMgLUEgaW5wdXQgLWkgJElOREVWIC1zIDEwLjIuMC4yNCAtbSAxCiskSVBDSEFJTlMgLUEgaW5wdXQgLWkgJElOREVWIC1zIDEwLjIuMC4zIC1tIDIKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVncmVzcyBzaWRlICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKKyMgYXR0YWNoIGEgZHNtYXJrZXIKKyMKKyRUQyBxZGlzYyBhZGQgJEVHREVWIGhhbmRsZSAxOjAgcm9vdCBkc21hcmsgaW5kaWNlcyA2NCBzZXRfdGNfaW5kZXgKKyMKKyMgdmFsdWVzIG9mIHRoZSBEU0NQIHRvIGNoYW5nZSBkZXBlbmRpbmcgb24gdGhlIGNsYXNzCisjCisjYmVjb21lcyBFRgorJFRDIGNsYXNzIGNoYW5nZSAkRUdERVYgY2xhc3NpZCAxOjEgZHNtYXJrIG1hc2sgMHgzIFwKKyAgICAgICB2YWx1ZSAweGI4CisjYmVjb21lcyBBRjExCiskVEMgY2xhc3MgY2hhbmdlICRFR0RFViBjbGFzc2lkIDE6MiBkc21hcmsgbWFzayAweDMgXAorICAgICAgIHZhbHVlIDB4MjgKKyNiZWNvbWVzIEFGMjEKKyRUQyBjbGFzcyBjaGFuZ2UgJEVHREVWIGNsYXNzaWQgMTozIGRzbWFyayBtYXNrIDB4MyBcCisgICAgICAgdmFsdWUgMHg0OAorIworIworIyBUaGUgY2xhc3MgbWFwcGluZworIworJFRDIGZpbHRlciBhZGQgJEVHREVWIHBhcmVudCAxOjAgcHJvdG9jb2wgaXAgcHJpbyA0IGhhbmRsZSAxIGZ3IGNsYXNzaWQgMToxCiskVEMgZmlsdGVyIGFkZCAkRUdERVYgcGFyZW50IDE6MCBwcm90b2NvbCBpcCBwcmlvIDQgaGFuZGxlIDIgZncgY2xhc3NpZCAxOjIKKyRUQyBmaWx0ZXIgYWRkICRFR0RFViBwYXJlbnQgMTowIHByb3RvY29sIGlwIHByaW8gNCBoYW5kbGUgMyBmdyBjbGFzc2lkIDE6MworIworCisjCitlY2hvICItLS0tIHFkaXNjIHBhcmFtZXRlcnMgSW5ncmVzcyAgLS0tLS0tLS0tLSIKKyRUQyBxZGlzYyBscyBkZXYgJElOREVWCitlY2hvICItLS0tIENsYXNzIHBhcmFtZXRlcnMgSW5ncmVzcyAgLS0tLS0tLS0tLSIKKyRUQyBjbGFzcyBscyBkZXYgJElOREVWCitlY2hvICItLS0tIGZpbHRlciBwYXJhbWV0ZXJzIEluZ3Jlc3MgLS0tLS0tLS0tLSIKKyRUQyBmaWx0ZXIgbHMgZGV2ICRJTkRFViBwYXJlbnQgMTowCisKK2VjaG8gIi0tLS0gcWRpc2MgcGFyYW1ldGVycyBFZ3Jlc3MgIC0tLS0tLS0tLS0iCiskVEMgcWRpc2MgbHMgJEVHREVWCitlY2hvICItLS0tIENsYXNzIHBhcmFtZXRlcnMgRWdyZXNzICAtLS0tLS0tLS0tIgorJFRDIGNsYXNzIGxzICRFR0RFVgorZWNobyAiLS0tLSBmaWx0ZXIgcGFyYW1ldGVycyBFZ3Jlc3MgLS0tLS0tLS0tLSIKKyRUQyBmaWx0ZXIgbHMgJEVHREVWIHBhcmVudCAxOjAKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2V4YW1wbGVzL2RpZmZzZXJ2L0VkZ2UyIGIvaXByb3V0ZTIvZXhhbXBsZXMvZGlmZnNlcnYvRWRnZTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY3OGRhMgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2V4YW1wbGVzL2RpZmZzZXJ2L0VkZ2UyCkBAIC0wLDAgKzEsODcgQEAKKyMhIC9iaW4vc2ggLXgKKyMKKyMgc2FtcGxlIHNjcmlwdCBvbiB1c2luZyB0aGUgaW5ncmVzcyBjYXBhYmlsaXRpZXMKKyMgVGhpcyBzY3JpcHQgdGFncyB0aGUgZndtYXJrIG9uIHRoZSBpbmdyZXNzIGludGVyZmFjZSB1c2luZyBJUGNoYWlucworIyB0aGUgcmVzdWx0IGlzIHVzZWQgZmlyc3QgZm9yIHBvbGljaW5nIG9uIHRoZSBJbmdyZXNzIGludGVyZmFjZSB0aGVuCisjIGZvciBmYXN0IGNsYXNzaWZpY2F0aW9uIGFuZCByZS1tYXJraW5nCisjIG9uIHRoZSBlZ3Jlc3MgaW50ZXJmYWNlCisjCisjcGF0aCB0byB2YXJpb3VzIHV0aWxpdGllczsKKyNjaGFuZ2UgdG8gcmVmbGVjdCB5b3Vycy4KKyMKK0lQUk9VVEU9L3Jvb3QvRFMtNi1iZXRhL2lwcm91dGUyLTk5MDUzMC1kc2luZworVEM9JElQUk9VVEUvdGMvdGMKK0lQPSRJUFJPVVRFL2lwL2lwCitJUENIQUlOUz0vcm9vdC9EUy02LWJldGEvaXBjaGFpbnMtMS4zLjkvaXBjaGFpbnMKK0lOREVWPWV0aDIKK0VHREVWPSJkZXYgZXRoMSIKKyMKKyMgdGFnIGFsbCBpbmNvbWluZyBwYWNrZXRzIGZyb20gaG9zdCAxMC4yLjAuMjQgdG8gdmFsdWUgMQorIyB0YWcgYWxsIGluY29taW5nIHBhY2tldHMgZnJvbSBob3N0IDEwLjIuMC4zIHRvIHZhbHVlIDIKKyMgdGFnIHRoZSByZXN0IG9mIGluY29taW5nIHBhY2tldHMgZnJvbSBzdWJuZXQgMTAuMi4wLjAvMjQgdG8gdmFsdWUgMworI1RoZXNlIHZhbHVlcyBhcmUgdXNlZCBpbiB0aGUgZWdyZXNzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCiskSVBDSEFJTlMgLUEgaW5wdXQgLXMgMTAuMi4wLjAvMjQgLW0gMworJElQQ0hBSU5TIC1BIGlucHV0IC1pICRJTkRFViAtcyAxMC4yLjAuMjQgLW0gMQorJElQQ0hBSU5TIC1BIGlucHV0IC1pICRJTkRFViAtcyAxMC4yLjAuMyAtbSAyCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCisjCisjIGluc3RhbGwgdGhlIGluZ3Jlc3MgcWRpc2Mgb24gdGhlIGluZ3Jlc3MgaW50ZXJmYWNlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCiskVEMgcWRpc2MgYWRkIGRldiAkSU5ERVYgaGFuZGxlIGZmZmY6IGluZ3Jlc3MKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAKKworIworIyBhdHRhY2ggYSBmdyBjbGFzc2lmaWVyIHRvIHRoZSBpbmdyZXNzIHdoaWNoIHBvbGljZXMgYW55dGhpbmcgbWFya2VkCisjIGJ5IGlwY2hhaW5zIHRvIHRhZyB2YWx1ZSAzIChUaGUgcmVzdCBvZiB0aGUgc3VibmV0IHBhY2tldHMgLS0gbm90CisjIHRhZyAxIG9yIDIpIHRvIG5vdCBnbyBiZXlvbmQgMS41TWJwcworIyBBbGxvdyB1cCB0byBhdCBsZWFzdCA2MCBwYWNrZXRzIHRvIGJ1cnN0IChhc3N1bWluZyBtYXhpbXVtIHBhY2tldCAKKyMgc2l6ZSBvZiAjIDEuNSBLQikgaW4gdGhlIGxvbmcgcnVuIGFuZCB1cHRvIGFib3V0IDYgcGFja2V0cyBpbiB0aGUKKyMgc2hvdCBydW4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIAorJFRDIGZpbHRlciBhZGQgZGV2ICRJTkRFViBwYXJlbnQgZmZmZjogcHJvdG9jb2wgaXAgcHJpbyA1MCBoYW5kbGUgMyBmdyBcCitwb2xpY2UgcmF0ZSAxNTAwa2JpdCBidXJzdCA5MGsgbXR1IDlrIGRyb3AgZmxvd2lkIDoxCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFZ3Jlc3Mgc2lkZSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCisjIGF0dGFjaCBhIGRzbWFya2VyCisjCiskVEMgcWRpc2MgYWRkICRFR0RFViBoYW5kbGUgMTowIHJvb3QgZHNtYXJrIGluZGljZXMgNjQKKyMKKyMgdmFsdWVzIG9mIHRoZSBEU0NQIHRvIGNoYW5nZSBkZXBlbmRpbmcgb24gdGhlIGNsYXNzCisjCiskVEMgY2xhc3MgY2hhbmdlICRFR0RFViBjbGFzc2lkIDE6MSBkc21hcmsgbWFzayAweDMgXAorICAgICAgIHZhbHVlIDB4YjgKKyRUQyBjbGFzcyBjaGFuZ2UgJEVHREVWIGNsYXNzaWQgMToyIGRzbWFyayBtYXNrIDB4MyBcCisgICAgICAgdmFsdWUgMHgyOAorJFRDIGNsYXNzIGNoYW5nZSAkRUdERVYgY2xhc3NpZCAxOjMgZHNtYXJrIG1hc2sgMHgzIFwKKyAgICAgICB2YWx1ZSAweDQ4CisjCisjCisjIFRoZSBjbGFzcyBtYXBwaW5nCisjCiskVEMgZmlsdGVyIGFkZCAkRUdERVYgcGFyZW50IDE6MCBwcm90b2NvbCBpcCBwcmlvIDQgaGFuZGxlIDEgZncgY2xhc3NpZCAxOjEKKyRUQyBmaWx0ZXIgYWRkICRFR0RFViBwYXJlbnQgMTowIHByb3RvY29sIGlwIHByaW8gNCBoYW5kbGUgMiBmdyBjbGFzc2lkIDE6MgorJFRDIGZpbHRlciBhZGQgJEVHREVWIHBhcmVudCAxOjAgcHJvdG9jb2wgaXAgcHJpbyA0IGhhbmRsZSAzIGZ3IGNsYXNzaWQgMTozCisjCisKKyMKK2VjaG8gIi0tLS0gcWRpc2MgcGFyYW1ldGVycyBJbmdyZXNzICAtLS0tLS0tLS0tIgorJFRDIHFkaXNjIGxzIGRldiAkSU5ERVYKK2VjaG8gIi0tLS0gQ2xhc3MgcGFyYW1ldGVycyBJbmdyZXNzICAtLS0tLS0tLS0tIgorJFRDIGNsYXNzIGxzIGRldiAkSU5ERVYKK2VjaG8gIi0tLS0gZmlsdGVyIHBhcmFtZXRlcnMgSW5ncmVzcyAtLS0tLS0tLS0tIgorJFRDIGZpbHRlciBscyBkZXYgJElOREVWIHBhcmVudCBmZmZmOgorCitlY2hvICItLS0tIHFkaXNjIHBhcmFtZXRlcnMgRWdyZXNzICAtLS0tLS0tLS0tIgorJFRDIHFkaXNjIGxzICRFR0RFVgorZWNobyAiLS0tLSBDbGFzcyBwYXJhbWV0ZXJzIEVncmVzcyAgLS0tLS0tLS0tLSIKKyRUQyBjbGFzcyBscyAkRUdERVYKK2VjaG8gIi0tLS0gZmlsdGVyIHBhcmFtZXRlcnMgRWdyZXNzIC0tLS0tLS0tLS0iCiskVEMgZmlsdGVyIGxzICRFR0RFViBwYXJlbnQgMTowCisjCisjZGVsZXRpbmcgdGhlIGluZ3Jlc3MgcWRpc2MKKyMkVEMgcWRpc2MgZGVsICRERVYgaW5ncmVzcwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvZXhhbXBsZXMvZGlmZnNlcnYvRWRnZTMxLWNhLXUzMiBiL2lwcm91dGUyL2V4YW1wbGVzL2RpZmZzZXJ2L0VkZ2UzMS1jYS11MzIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVlNmMwYgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2V4YW1wbGVzL2RpZmZzZXJ2L0VkZ2UzMS1jYS11MzIKQEAgLTAsMCArMSwxNzAgQEAKKyMhIC9iaW4vc2ggLXgKKyMKKyMgc2FtcGxlIHNjcmlwdCBvbiB1c2luZyB0aGUgaW5ncmVzcyBjYXBhYmlsaXRpZXMgdXNpbmcgdTMyIGNsYXNzaWZpZXIKKyMgVGhpcyBzY3JpcHQgdGFncyB0Y2luZGV4IGJhc2VkIG9uIG1ldGVyaW5nIG9uIHRoZSBpbmdyZXNzIAorIyBpbnRlcmZhY2UgdGhlIHJlc3VsdCBpcyB1c2VkIGZvciBmYXN0IGNsYXNzaWZpY2F0aW9uIGFuZCByZS1tYXJraW5nCisjIG9uIHRoZSBlZ3Jlc3MgaW50ZXJmYWNlCisjIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIGNvbG9yIGF3YXJlIG1vZGUgbWFya2VyIHdpdGggUElSIGNvbmZpZ3VyZWQKKyMgYmFzZWQgb24gZHJhZnQtd2FoamFrLW1jbS0wMC50eHQgKHNlY3Rpb24gMy4xKQorIworIyBUaGUgY29sb3JzIGFyZSBkZWZpbmVkIHVzaW5nIHRoZSBEaWZmc2VydiBGaWVsZHMKKyNwYXRoIHRvIHZhcmlvdXMgdXRpbGl0aWVzOworI2NoYW5nZSB0byByZWZsZWN0IHlvdXJzLgorIworSVBST1VURT0vdXNyL3NyYy9pcHJvdXRlMi1jdXJyZW50CitUQz0kSVBST1VURS90Yy90YworSVA9JElQUk9VVEUvaXAvaXAKK0lOREVWPWV0aDAKK0VHREVWPSJkZXYgZXRoMSIKK0NJUjE9MTUwMGtiaXQKK0NJUjI9MTAwMGtiaXQKKworI1RoZSBDQlMgaXMgYWJvdXQgNjAgTVRVIHNpemVkIHBhY2tldHMKK0NCUzE9OTBrCitDQlMyPTkwaworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCisjCisjIGluc3RhbGwgdGhlIGluZ3Jlc3MgcWRpc2Mgb24gdGhlIGluZ3Jlc3MgaW50ZXJmYWNlCiskVEMgcWRpc2MgYWRkIGRldiAkSU5ERVYgaGFuZGxlIGZmZmY6IGluZ3Jlc3MKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAKKyMKKyMgQ3JlYXRlIHUzMiBmaWx0ZXJzIAorJFRDIGZpbHRlciBhZGQgZGV2ICRJTkRFViBwYXJlbnQgZmZmZjogcHJvdG9jb2wgaXAgcHJpbyA0IGhhbmRsZSAxOiB1MzIgXAorZGl2aXNvciAxCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCisKKyMgVGhlIG1ldGVyczogTm90ZSB0aGF0IHdlIGhhdmUgc2hhcmVkIG1ldGVycyBpbiB0aGlzIGNhc2UgYXMgaWRlbnRpZmllZAorIyBieSB0aGUgaW5kZXggcGFyYW1ldGVyCittZXRlcjE9IiBwb2xpY2UgaW5kZXggMSByYXRlICRDSVIxIGJ1cnN0ICRDQlMxICIKK21ldGVyMj0iIHBvbGljZSBpbmRleCAyIHJhdGUgJENJUjIgYnVyc3QgJENCUzEgIgorbWV0ZXIzPSIgcG9saWNlIGluZGV4IDMgcmF0ZSAkQ0lSMiBidXJzdCAkQ0JTMiAiCittZXRlcjQ9IiBwb2xpY2UgaW5kZXggNCByYXRlICRDSVIxIGJ1cnN0ICRDQlMyICIKK21ldGVyNT0iIHBvbGljZSBpbmRleCA1IHJhdGUgJENJUjEgYnVyc3QgJENCUzIgIgorCisjIEFsbCBwYWNrZXRzIGFyZSBtYXJrZWQgd2l0aCBhIHRjaW5kZXggdmFsdWUgd2hpY2ggaXMgdXNlZCBvbiB0aGUgZWdyZXNzCisjIHRjaW5kZXggMSBtYXBzIHRvIEFGNDEsIDItPkFGNDIsIDMtPkFGNDMsIDQtPkJFCisKKyMgKioqKioqKioqKioqKioqKioqKioqKiogQUY0MSAqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisjQUY0MSAoRFNDUCAweDIyKSBpcyBwYXNzZWQgb24gd2l0aCBhIHRjaW5kZXggdmFsdWUgMQorI2lmIGl0IGRvZXNudCBleGNlZWQgaXRzIENJUi9DQlMgCisjcG9saWNlciAxICBpcyB1c2VkLgorIworJFRDIGZpbHRlciBhZGQgZGV2ICRJTkRFViBwYXJlbnQgZmZmZjogcHJvdG9jb2wgaXAgcHJpbyA0IHUzMiBcCittYXRjaCBpcCB0b3MgMHg4OCAweGZjIFwKKyRtZXRlcjEgXAorY29udGludWUgZmxvd2lkIDoxCisjCisjIGlmIGl0IGV4Y2VlZHMgdGhlIGFib3ZlIGJ1dCBub3QgdGhlIGV4dHJhIHJhdGUvYnVyc3QgYmVsb3csIGl0IGdldHMgYSAKKyMgdGNpbmRleCB2YWx1ZSAgb2YgMgorIyBwb2xpY2VyIDIgaXMgdXNlZAorIworJFRDIGZpbHRlciBhZGQgZGV2ICRJTkRFViBwYXJlbnQgZmZmZjogcHJvdG9jb2wgaXAgcHJpbyA1IHUzMiBcCittYXRjaCBpcCB0b3MgMHg4OCAweGZjIFwKKyRtZXRlcjIgXAorY29udGludWUgZmxvd2lkIDoyCisjCisjIGlmIGl0IGV4Y2VlZHMgdGhlIGFib3ZlIGJ1dCBub3QgdGhlIHJ1bGUgYmVsb3csIGl0IGdldHMgYSB0Y2luZGV4IHZhbHVlCisjIG9mIDMgKHBvbGljZXIgMykKKyMKKyRUQyBmaWx0ZXIgYWRkIGRldiAkSU5ERVYgcGFyZW50IGZmZmY6IHByb3RvY29sIGlwIHByaW8gNiB1MzIgXAorbWF0Y2ggaXAgdG9zIDB4ODggMHhmYyBcCiskbWV0ZXIzIFwKK2Ryb3AgZmxvd2lkIDozCisjCisKKyMgKioqKioqKioqKioqKioqKioqKioqKiogQUY0MiAqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisjQUY0MiAoRFNDUCAweDI0KSBmcm9tIGlzIHBhc3NlZCBvbiB3aXRoIGEgdGNpbmRleCB2YWx1ZSAyCisjaWYgaXQgZG9lc250IGV4Y2VlZCBpdHMgQ0lSL0NCUyAKKyNwb2xpY2VyIDIgaXMgdXNlZC4gTm90ZSB0aGF0IHRoaXMgaXMgc2hhcmVkIHdpdGggdGhlIEFGNDEKKyMKKyMKKyRUQyBmaWx0ZXIgYWRkIGRldiAkSU5ERVYgcGFyZW50IGZmZmY6IHByb3RvY29sIGlwIHByaW8gNSB1MzIgXAorbWF0Y2ggaXAgdG9zIDB4OTAgMHhmYyBcCiskbWV0ZXIyIFwKK2NvbnRpbnVlIGZsb3dpZCA6MgorIworIyBpZiBpdCBleGNlZWRzIHRoZSBhYm92ZSBidXQgbm90IHRoZSBydWxlIGJlbG93LCBpdCBnZXRzIGEgdGNpbmRleCB2YWx1ZQorIyBvZiAzIChwb2xpY2VyIDMpCisjCiskVEMgZmlsdGVyIGFkZCBkZXYgJElOREVWIHBhcmVudCBmZmZmOiBwcm90b2NvbCBpcCBwcmlvIDYgdTMyIFwKK21hdGNoIGlwIHRvcyAweDkwIDB4ZmMgXAorJG1ldGVyMyBcCitkcm9wIGZsb3dpZCA6MworIworIyAqKioqKioqKioqKioqKioqKioqKioqKiBBRjQzICoqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyMKKyNBRjQzIChEU0NQIDB4MjYpIGZyb20gaXMgcGFzc2VkIG9uIHdpdGggYSB0Y2luZGV4IHZhbHVlIDMKKyNpZiBpdCBkb2VzbnQgZXhjZWVkIGl0cyBDSVIvQ0JTCisjcG9saWNlciAzIGlzIHVzZWQuIE5vdGUgdGhhdCB0aGlzIGlzIHNoYXJlZCB3aXRoIHRoZSBBRjQxIGFuZCBBRjQyCisjCiskVEMgZmlsdGVyIGFkZCBkZXYgJElOREVWIHBhcmVudCBmZmZmOiBwcm90b2NvbCBpcCBwcmlvIDYgdTMyIFwKK21hdGNoIGlwIHRvcyAweDk4IDB4ZmMgXAorJG1ldGVyMyBcCitkcm9wIGZsb3dpZCA6MworIworIyAqKioqKioqKioqKioqKioqKioqKioqKiBCRSAqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisjCisjIEFueXRoaW5nIGVsc2UgKG5vdCBmcm9tIHRoZSBBRjQqKSBnZXRzIGRpc2NhcmRlZCBpZiBpdCAKKyMgZXhjZWVkcyAxTWJwcyBhbmQgYnkgZGVmYXVsdCBnb2VzIHRvIEJFIGlmIGl0IGRvZXNudAorIyBOb3RlIHRoYXQgdGhlIEJFIGNsYXNzIGlzIGFsc28gdXNlZCBieSB0aGUgQUY0KiBpbiB0aGUgd29yc3QKKyMgY2FzZQorIworJFRDIGZpbHRlciBhZGQgZGV2ICRJTkRFViBwYXJlbnQgZmZmZjogcHJvdG9jb2wgaXAgcHJpbyA3IHUzMiBcCittYXRjaCBpcCBzcmMgMC8wXAorJG1ldGVyNCBcCitkcm9wIGZsb3dpZCA6NAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRWdyZXNzIHNpZGUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgYXR0YWNoIGEgZHNtYXJrZXIKKyMKKyRUQyBxZGlzYyBhZGQgJEVHREVWIGhhbmRsZSAxOjAgcm9vdCBkc21hcmsgaW5kaWNlcyA2NAorIworIyB2YWx1ZXMgb2YgdGhlIERTQ1AgdG8gY2hhbmdlIGRlcGVuZGluZyBvbiB0aGUgY2xhc3MKKyNub3RlIHRoYXQgdGhlIEVDTiBiaXRzIGFyZSBtYXNrZWQgb3V0CisjCisjQUY0MSAoMHg4OCBpcyAweDIyIHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHR3byBiaXRzKQorIworJFRDIGNsYXNzIGNoYW5nZSAkRUdERVYgY2xhc3NpZCAxOjEgZHNtYXJrIG1hc2sgMHgzIFwKKyAgICAgICB2YWx1ZSAweDg4CisjQUY0MgorJFRDIGNsYXNzIGNoYW5nZSAkRUdERVYgY2xhc3NpZCAxOjIgZHNtYXJrIG1hc2sgMHgzIFwKKyAgICAgICB2YWx1ZSAweDkwCisjQUY0MworJFRDIGNsYXNzIGNoYW5nZSAkRUdERVYgY2xhc3NpZCAxOjMgZHNtYXJrIG1hc2sgMHgzIFwKKyAgICAgICB2YWx1ZSAweDk4CisjQkUKKyRUQyBjbGFzcyBjaGFuZ2UgJEVHREVWIGNsYXNzaWQgMTozIGRzbWFyayBtYXNrIDB4MyBcCisgICAgICAgdmFsdWUgMHgwCisjCisjCisjIFRoZSBjbGFzcyBtYXBwaW5nCisjCiskVEMgZmlsdGVyIGFkZCAkRUdERVYgcGFyZW50IDE6MCBwcm90b2NvbCBpcCBwcmlvIDEgXAorICAgICAgICAgIGhhbmRsZSAxIHRjaW5kZXggY2xhc3NpZCAxOjEKKyRUQyBmaWx0ZXIgYWRkICRFR0RFViBwYXJlbnQgMTowIHByb3RvY29sIGlwIHByaW8gMSBcCisgICAgICAgICAgaGFuZGxlIDIgdGNpbmRleCAgY2xhc3NpZCAxOjIKKyRUQyBmaWx0ZXIgYWRkICRFR0RFViBwYXJlbnQgMTowIHByb3RvY29sIGlwIHByaW8gMSBcCisgICAgICAgICAgaGFuZGxlIDMgdGNpbmRleCAgY2xhc3NpZCAxOjMKKyRUQyBmaWx0ZXIgYWRkICRFR0RFViBwYXJlbnQgMTowIHByb3RvY29sIGlwIHByaW8gMSBcCisgICAgICAgICAgaGFuZGxlIDQgdGNpbmRleCAgY2xhc3NpZCAxOjQKKyMKKworIworZWNobyAiLS0tLSBxZGlzYyBwYXJhbWV0ZXJzIEluZ3Jlc3MgIC0tLS0tLS0tLS0iCiskVEMgcWRpc2MgbHMgZGV2ICRJTkRFVgorZWNobyAiLS0tLSBDbGFzcyBwYXJhbWV0ZXJzIEluZ3Jlc3MgIC0tLS0tLS0tLS0iCiskVEMgY2xhc3MgbHMgZGV2ICRJTkRFVgorZWNobyAiLS0tLSBmaWx0ZXIgcGFyYW1ldGVycyBJbmdyZXNzIC0tLS0tLS0tLS0iCiskVEMgZmlsdGVyIGxzIGRldiAkSU5ERVYgcGFyZW50IGZmZmY6CisKK2VjaG8gIi0tLS0gcWRpc2MgcGFyYW1ldGVycyBFZ3Jlc3MgIC0tLS0tLS0tLS0iCiskVEMgcWRpc2MgbHMgJEVHREVWCitlY2hvICItLS0tIENsYXNzIHBhcmFtZXRlcnMgRWdyZXNzICAtLS0tLS0tLS0tIgorJFRDIGNsYXNzIGxzICRFR0RFVgorZWNobyAiLS0tLSBmaWx0ZXIgcGFyYW1ldGVycyBFZ3Jlc3MgLS0tLS0tLS0tLSIKKyRUQyBmaWx0ZXIgbHMgJEVHREVWIHBhcmVudCAxOjAKKyMKKyNkZWxldGluZyB0aGUgaW5ncmVzcyBxZGlzYworIyRUQyBxZGlzYyBkZWwgJElOREVWIGluZ3Jlc3MKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2V4YW1wbGVzL2RpZmZzZXJ2L0VkZ2UzMS1jYi1jaGFpbnMgYi9pcHJvdXRlMi9leGFtcGxlcy9kaWZmc2Vydi9FZGdlMzEtY2ItY2hhaW5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZmFhZTkKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9leGFtcGxlcy9kaWZmc2Vydi9FZGdlMzEtY2ItY2hhaW5zCkBAIC0wLDAgKzEsMTMyIEBACisjISAvYmluL3NoIC14CisjCisjIHNhbXBsZSBzY3JpcHQgb24gdXNpbmcgdGhlIGluZ3Jlc3MgY2FwYWJpbGl0aWVzCisjIFRoaXMgc2NyaXB0IGZ3bWFyayB0YWdzKElQY2hhaW5zKSBiYXNlZCBvbiBtZXRlcmluZyBvbiB0aGUgaW5ncmVzcyAKKyMgaW50ZXJmYWNlIHRoZSByZXN1bHQgaXMgdXNlZCBmb3IgZmFzdCBjbGFzc2lmaWNhdGlvbiBhbmQgcmUtbWFya2luZworIyBvbiB0aGUgZWdyZXNzIGludGVyZmFjZQorIyBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBjb2xvciBibGluZCBtb2RlIG1hcmtlciB3aXRoIG5vIFBJUiBjb25maWd1cmVkCisjIGJhc2VkIG9uIGRyYWZ0LXdhaGphay1tY20tMDAudHh0IChzZWN0aW9uIDMuMSkKKyMKKyNwYXRoIHRvIHZhcmlvdXMgdXRpbGl0aWVzOworI2NoYW5nZSB0byByZWZsZWN0IHlvdXJzLgorIworSVBST1VURT0vcm9vdC9EUy02LWJldGEvaXByb3V0ZTItOTkwNTMwLWRzaW5nCitUQz0kSVBST1VURS90Yy90YworSVA9JElQUk9VVEUvaXAvaXAKK0lQQ0hBSU5TPS9yb290L0RTLTYtYmV0YS9pcGNoYWlucy0xLjMuOS9pcGNoYWlucworSU5ERVY9ZXRoMgorRUdERVY9ImRldiBldGgxIgorQ0lSMT0xNTAwa2JpdAorQ0lSMj0xMDAwa2JpdAorCisjVGhlIENCUyBpcyBhYm91dCA2MCBNVFUgc2l6ZWQgcGFja2V0cworQ0JTMT05MGsKK0NCUzI9OTBrCisKK21ldGVyMT0icG9saWNlIHJhdGUgJENJUjEgYnVyc3QgJENCUzEgIgorbWV0ZXIyPSJwb2xpY2UgcmF0ZSAkQ0lSMSBidXJzdCAkQ0JTMiAiCittZXRlcjM9InBvbGljZSByYXRlICRDSVIyIGJ1cnN0ICRDQlMxICIKK21ldGVyND0icG9saWNlIHJhdGUgJENJUjIgYnVyc3QgJENCUzIgIgorbWV0ZXI1PSJwb2xpY2UgcmF0ZSAkQ0lSMiBidXJzdCAkQ0JTMiAiCisjCisjIHRhZyB0aGUgcmVzdCBvZiBpbmNvbWluZyBwYWNrZXRzIGZyb20gc3VibmV0IDEwLjIuMC4wLzI0IHRvIGZ3IHZhbHVlIDEKKyMgdGFnIGFsbCBpbmNvbWluZyBwYWNrZXRzIGZyb20gYW55IG90aGVyIHN1Ym5ldCB0byBmdyB0YWcgMgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIAorJElQQ0hBSU5TIC1BIGlucHV0IC1pICRJTkRFViAtcyAwLzAgLW0gMgorJElQQ0hBSU5TIC1BIGlucHV0IC1pICRJTkRFViAtcyAxMC4yLjAuMC8yNCAtbSAxCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCisjIGluc3RhbGwgdGhlIGluZ3Jlc3MgcWRpc2Mgb24gdGhlIGluZ3Jlc3MgaW50ZXJmYWNlCiskVEMgcWRpc2MgYWRkIGRldiAkSU5ERVYgaGFuZGxlIGZmZmY6IGluZ3Jlc3MKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAKKworIyBBbGwgcGFja2V0cyBhcmUgbWFya2VkIHdpdGggYSB0Y2luZGV4IHZhbHVlIHdoaWNoIGlzIHVzZWQgb24gdGhlIGVncmVzcworIyB0Y2luZGV4IDEgbWFwcyB0byBBRjQxLCAyLT5BRjQyLCAzLT5BRjQzLCA0LT5CRQorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIAorIyAKKyMgYW55dGhpbmcgd2l0aCBmdyB0YWcgb2YgMSBpcyBwYXNzZWQgb24gd2l0aCBhIHRjaW5kZXggdmFsdWUgMQorI2lmIGl0IGRvZXNudCBleGNlZWQgaXRzIGFsbG9jYXRlZCByYXRlIChDSVIvQ0JTKQorIyAKKyRUQyBmaWx0ZXIgYWRkIGRldiAkSU5ERVYgcGFyZW50IGZmZmY6IHByb3RvY29sIGlwIHByaW8gNCBoYW5kbGUgMSBmdyBcCiskbWV0ZXIxIFwKK2NvbnRpbnVlIGZsb3dpZCA0OjEKKyMKKyMgaWYgaXQgZXhjZWVkcyB0aGUgYWJvdmUgYnV0IG5vdCB0aGUgZXh0cmEgcmF0ZS9idXJzdCBiZWxvdywgaXQgZ2V0cyBhIAorI3RjaW5kZXggdmFsdWUgIG9mIDIKKyMKKyRUQyBmaWx0ZXIgYWRkIGRldiAkSU5ERVYgcGFyZW50IGZmZmY6IHByb3RvY29sIGlwIHByaW8gNSBoYW5kbGUgMSBmdyBcCiskbWV0ZXIyIFwKK2NvbnRpbnVlIGZsb3dpZCA0OjIKKyMKKyMgaWYgaXQgZXhjZWVkcyB0aGUgYWJvdmUgYnV0IG5vdCB0aGUgcnVsZSBiZWxvdywgaXQgZ2V0cyBhIHRjaW5kZXggdmFsdWUKKyMgb2YgMworIworJFRDIGZpbHRlciBhZGQgZGV2ICRJTkRFViBwYXJlbnQgZmZmZjogcHJvdG9jb2wgaXAgcHJpbyA2IGhhbmRsZSAxIGZ3IFwKKyRtZXRlcjMgXAorZHJvcCBmbG93aWQgNDozCisjCisjIEFueXRoaW5nIGVsc2UgKG5vdCBmcm9tIHRoZSBzdWJuZXQgMTAuMi4wLjI0LzI0KSBnZXRzIGRpc2NhcmRlZCBpZiBpdCAKKyMgZXhjZWVkcyAxTWJwcyBhbmQgYnkgZGVmYXVsdCBnb2VzIHRvIEJFIGlmIGl0IGRvZXNudAorIworJFRDIGZpbHRlciBhZGQgZGV2ICRJTkRFViBwYXJlbnQgZmZmZjogcHJvdG9jb2wgaXAgcHJpbyA2IGhhbmRsZSAyIGZ3IFwKKyRtZXRlcjUgXAorZHJvcCBmbG93aWQgNDo0CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVncmVzcyBzaWRlICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKKyMgYXR0YWNoIGEgZHNtYXJrZXIKKyMKKyRUQyBxZGlzYyBhZGQgJEVHREVWIGhhbmRsZSAxOjAgcm9vdCBkc21hcmsgaW5kaWNlcyA2NAorIworIyB2YWx1ZXMgb2YgdGhlIERTQ1AgdG8gY2hhbmdlIGRlcGVuZGluZyBvbiB0aGUgY2xhc3MKKyNub3RlIHRoYXQgdGhlIEVDTiBiaXRzIGFyZSBtYXNrZWQgb3V0CisjCisjQUY0MSAoMHg4OCBpcyAweDIyIHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHR3byBiaXRzKQorIworJFRDIGNsYXNzIGNoYW5nZSAkRUdERVYgY2xhc3NpZCAxOjEgZHNtYXJrIG1hc2sgMHgzIFwKKyAgICAgICB2YWx1ZSAweDg4CisjQUY0MgorJFRDIGNsYXNzIGNoYW5nZSAkRUdERVYgY2xhc3NpZCAxOjIgZHNtYXJrIG1hc2sgMHgzIFwKKyAgICAgICB2YWx1ZSAweDkwCisjQUY0MworJFRDIGNsYXNzIGNoYW5nZSAkRUdERVYgY2xhc3NpZCAxOjMgZHNtYXJrIG1hc2sgMHgzIFwKKyAgICAgICB2YWx1ZSAweDk4CisjQkUKKyRUQyBjbGFzcyBjaGFuZ2UgJEVHREVWIGNsYXNzaWQgMTo0IGRzbWFyayBtYXNrIDB4MyBcCisgICAgICAgdmFsdWUgMHgwCisjCisjCisjIFRoZSBjbGFzcyBtYXBwaW5nICh1c2luZyB0Y2luZGV4OyBjb3VsZCBlYXNpbHkgaGF2ZQorIyByZXBsYWNlZCBpdCB3aXRoIHRoZSBmdyBjbGFzc2lmaWVyIGluc3RlYWQpCisjCiskVEMgZmlsdGVyIGFkZCAkRUdERVYgcGFyZW50IDE6MCBwcm90b2NvbCBpcCBwcmlvIDEgXAorICAgICAgICAgIGhhbmRsZSAxIHRjaW5kZXggY2xhc3NpZCAxOjEKKyRUQyBmaWx0ZXIgYWRkICRFR0RFViBwYXJlbnQgMTowIHByb3RvY29sIGlwIHByaW8gMSBcCisgICAgICAgICAgaGFuZGxlIDIgdGNpbmRleCAgY2xhc3NpZCAxOjIKKyRUQyBmaWx0ZXIgYWRkICRFR0RFViBwYXJlbnQgMTowIHByb3RvY29sIGlwIHByaW8gMSBcCisgICAgICAgICAgaGFuZGxlIDMgdGNpbmRleCAgY2xhc3NpZCAxOjMKKyRUQyBmaWx0ZXIgYWRkICRFR0RFViBwYXJlbnQgMTowIHByb3RvY29sIGlwIHByaW8gMSBcCisgICAgICAgICAgaGFuZGxlIDQgdGNpbmRleCAgY2xhc3NpZCAxOjQKKyMKKworIworZWNobyAiLS0tLSBxZGlzYyBwYXJhbWV0ZXJzIEluZ3Jlc3MgIC0tLS0tLS0tLS0iCiskVEMgcWRpc2MgbHMgZGV2ICRJTkRFVgorZWNobyAiLS0tLSBDbGFzcyBwYXJhbWV0ZXJzIEluZ3Jlc3MgIC0tLS0tLS0tLS0iCiskVEMgY2xhc3MgbHMgZGV2ICRJTkRFVgorZWNobyAiLS0tLSBmaWx0ZXIgcGFyYW1ldGVycyBJbmdyZXNzIC0tLS0tLS0tLS0iCiskVEMgZmlsdGVyIGxzIGRldiAkSU5ERVYgcGFyZW50IGZmZmY6CisKK2VjaG8gIi0tLS0gcWRpc2MgcGFyYW1ldGVycyBFZ3Jlc3MgIC0tLS0tLS0tLS0iCiskVEMgcWRpc2MgbHMgJEVHREVWCitlY2hvICItLS0tIENsYXNzIHBhcmFtZXRlcnMgRWdyZXNzICAtLS0tLS0tLS0tIgorJFRDIGNsYXNzIGxzICRFR0RFVgorZWNobyAiLS0tLSBmaWx0ZXIgcGFyYW1ldGVycyBFZ3Jlc3MgLS0tLS0tLS0tLSIKKyRUQyBmaWx0ZXIgbHMgJEVHREVWIHBhcmVudCAxOjAKKyMKKyNkZWxldGluZyB0aGUgaW5ncmVzcyBxZGlzYworIyRUQyBxZGlzYyBkZWwgJElOREVWIGluZ3Jlc3MKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2V4YW1wbGVzL2RpZmZzZXJ2L0VkZ2UzMi1jYS11MzIgYi9pcHJvdXRlMi9leGFtcGxlcy9kaWZmc2Vydi9FZGdlMzItY2EtdTMyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZjIxZTQKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9leGFtcGxlcy9kaWZmc2Vydi9FZGdlMzItY2EtdTMyCkBAIC0wLDAgKzEsMTk4IEBACisjISAvYmluL3NoIC14CisjCisjIHNhbXBsZSBzY3JpcHQgb24gdXNpbmcgdGhlIGluZ3Jlc3MgY2FwYWJpbGl0aWVzIHVzaW5nIHUzMiBjbGFzc2lmaWVyCisjIFRoaXMgc2NyaXB0IHRhZ3MgdGNpbmRleCBiYXNlZCBvbiBtZXRlcmluZyBvbiB0aGUgaW5ncmVzcyAKKyMgaW50ZXJmYWNlIHRoZSByZXN1bHQgaXMgdXNlZCBmb3IgZmFzdCBjbGFzc2lmaWNhdGlvbiBhbmQgcmUtbWFya2luZworIyBvbiB0aGUgZWdyZXNzIGludGVyZmFjZQorIyBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBjb2xvciBhd2FyZSBtb2RlIG1hcmtlciB3aXRoIFBJUiBjb25maWd1cmVkCisjIGJhc2VkIG9uIGRyYWZ0LXdhaGphay1tY20tMDAudHh0IChzZWN0aW9uIDMuMikKKyMKKyMgVGhlIGNvbG9ycyBhcmUgZGVmaW5lZCB1c2luZyB0aGUgRGlmZnNlcnYgRmllbGRzCisjcGF0aCB0byB2YXJpb3VzIHV0aWxpdGllczsKKyNjaGFuZ2UgdG8gcmVmbGVjdCB5b3Vycy4KKyMKK0lQUk9VVEU9L3Jvb3QvRFMtNi1iZXRhL2lwcm91dGUyLTk5MDUzMC1kc2luZworVEM9JElQUk9VVEUvdGMvdGMKK0lQPSRJUFJPVVRFL2lwL2lwCitJUENIQUlOUz0vcm9vdC9EUy02LWJldGEvaXBjaGFpbnMtMS4zLjkvaXBjaGFpbnMKK0lOREVWPWV0aDIKK0VHREVWPSJkZXYgZXRoMSIKK0NJUjE9MTAwMGtiaXQKK0NJUjI9NTAwa2JpdAorIyB0aGUgUElSIGlzIHdoYXQgaXMgaW4gZXhjZXNzIG9mIHRoZSBDSVIKK1BJUjE9MTAwMGtiaXQKK1BJUjI9NTAwa2JpdAorCisjVGhlIENCUyBpcyBhYm91dCA2MCBNVFUgc2l6ZWQgcGFja2V0cworQ0JTMT05MGsKK0NCUzI9OTBrCisjdGhlIEVCUyBpcyBhYm91dCAyMCBtYXggc2l6ZWQgcGFja2V0cworRUJTMT0zMGsKK0VCUzI9MzBrCisKKyMgVGhlIG1ldGVyczogTm90ZSB0aGF0IHdlIGhhdmUgc2hhcmVkIG1ldGVycyBpbiB0aGlzIGNhc2UgYXMgaWRlbnRpZmllZAorIyBieSB0aGUgaW5kZXggcGFyYW1ldGVyCittZXRlcjE9IiBwb2xpY2UgaW5kZXggMSByYXRlICRDSVIxIGJ1cnN0ICRDQlMxICIKK21ldGVyMWE9IiBwb2xpY2UgaW5kZXggMiByYXRlICRQSVIxIGJ1cnN0ICRFQlMxICIKK21ldGVyMj0iIHBvbGljZSBpbmRleCAzIHJhdGUgJENJUjIgYnVyc3QgJENCUzEgIgorbWV0ZXIyYT0iIHBvbGljZSBpbmRleCA0IHJhdGUgJFBJUjIgYnVyc3QgJEVCUzEgIgorbWV0ZXIzPSIgcG9saWNlIGluZGV4IDUgcmF0ZSAkQ0lSMiBidXJzdCAkQ0JTMiAiCittZXRlcjNhPSIgcG9saWNlIGluZGV4IDYgcmF0ZSAkUElSMiBidXJzdCAkRUJTMiAiCittZXRlcjQ9IiBwb2xpY2UgaW5kZXggNyByYXRlICRDSVIxIGJ1cnN0ICRDQlMyICIKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIAorIworIyBpbnN0YWxsIHRoZSBpbmdyZXNzIHFkaXNjIG9uIHRoZSBpbmdyZXNzIGludGVyZmFjZQorJFRDIHFkaXNjIGFkZCBkZXYgJElOREVWIGhhbmRsZSBmZmZmOiBpbmdyZXNzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCisjCisjIEFsbCBwYWNrZXRzIGFyZSBtYXJrZWQgd2l0aCBhIHRjaW5kZXggdmFsdWUgd2hpY2ggaXMgdXNlZCBvbiB0aGUgZWdyZXNzCisjIHRjaW5kZXggMSBtYXBzIHRvIEFGNDEsIDItPkFGNDIsIDMtPkFGNDMsIDQtPkJFCisjCisjICoqKioqKioqKioqKioqKioqKioqKioqIEFGNDEgKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorI0FGNDEgKERTQ1AgMHgyMikgZnJvbSBpcyBwYXNzZWQgb24gd2l0aCBhIHRjaW5kZXggdmFsdWUgMQorI2lmIGl0IGRvZXNudCBleGNlZWQgaXRzIENJUi9DQlMgKyBQSVIvRUJTCisjcG9saWNlciAxICBpcyB1c2VkLgorIworJFRDIGZpbHRlciBhZGQgZGV2ICRJTkRFViBwYXJlbnQgZmZmZjogcHJvdG9jb2wgaXAgcHJpbyAxIHUzMiBcCittYXRjaCBpcCB0b3MgMHg4OCAweGZjIFwKKyRtZXRlcjEgXAorY29udGludWUgZmxvd2lkIDoxCiskVEMgZmlsdGVyIGFkZCBkZXYgJElOREVWIHBhcmVudCBmZmZmOiBwcm90b2NvbCBpcCBwcmlvIDIgdTMyIFwKK21hdGNoIGlwIHRvcyAweDg4IDB4ZmMgXAorJG1ldGVyMWEgXAorY29udGludWUgZmxvd2lkIDoxCisjCisjIGlmIGl0IGV4Y2VlZHMgdGhlIGFib3ZlIGJ1dCBub3QgdGhlIGV4dHJhIHJhdGUvYnVyc3QgYmVsb3csIGl0IGdldHMgYSAKKyMgdGNpbmRleCB2YWx1ZSAgb2YgMgorIyBwb2xpY2VyIDIgaXMgdXNlZAorIworJFRDIGZpbHRlciBhZGQgZGV2ICRJTkRFViBwYXJlbnQgZmZmZjogcHJvdG9jb2wgaXAgcHJpbyAzIHUzMiBcCittYXRjaCBpcCB0b3MgMHg4OCAweGZjIFwKKyRtZXRlcjIgXAorY29udGludWUgZmxvd2lkIDoyCiskVEMgZmlsdGVyIGFkZCBkZXYgJElOREVWIHBhcmVudCBmZmZmOiBwcm90b2NvbCBpcCBwcmlvIDQgdTMyIFwKK21hdGNoIGlwIHRvcyAweDg4IDB4ZmMgXAorJG1ldGVyMmEgXAorY29udGludWUgZmxvd2lkIDoyCisjCisjIGlmIGl0IGV4Y2VlZHMgdGhlIGFib3ZlIGJ1dCBub3QgdGhlIHJ1bGUgYmVsb3csIGl0IGdldHMgYSB0Y2luZGV4IHZhbHVlCisjIG9mIDMgKHBvbGljZXIgMykKKyMKKyRUQyBmaWx0ZXIgYWRkIGRldiAkSU5ERVYgcGFyZW50IGZmZmY6IHByb3RvY29sIGlwIHByaW8gNSB1MzIgXAorbWF0Y2ggaXAgdG9zIDB4ODggMHhmYyBcCiskbWV0ZXIzIFwKK2NvbnRpbnVlIGZsb3dpZCA6MworJFRDIGZpbHRlciBhZGQgZGV2ICRJTkRFViBwYXJlbnQgZmZmZjogcHJvdG9jb2wgaXAgcHJpbyA2IHUzMiBcCittYXRjaCBpcCB0b3MgMHg4OCAweGZjIFwKKyRtZXRlcjNhIFwKK2Ryb3AgZmxvd2lkIDozCisjCisjICoqKioqKioqKioqKioqKioqKioqKioqIEFGNDIgKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorI0FGNDIgKERTQ1AgMHgyNCkgZnJvbSBpcyBwYXNzZWQgb24gd2l0aCBhIHRjaW5kZXggdmFsdWUgMgorI2lmIGl0IGRvZXNudCBleGNlZWQgaXRzIENJUi9DQlMgKyBQSVIvRUJTCisjcG9saWNlciAyIGlzIHVzZWQuIE5vdGUgdGhhdCB0aGlzIGlzIHNoYXJlZCB3aXRoIHRoZSBBRjQxCisjCisjCiskVEMgZmlsdGVyIGFkZCBkZXYgJElOREVWIHBhcmVudCBmZmZmOiBwcm90b2NvbCBpcCBwcmlvIDggdTMyIFwKK21hdGNoIGlwIHRvcyAweDkwIDB4ZmMgXAorJG1ldGVyMiBcCitjb250aW51ZSBmbG93aWQgOjIKKyRUQyBmaWx0ZXIgYWRkIGRldiAkSU5ERVYgcGFyZW50IGZmZmY6IHByb3RvY29sIGlwIHByaW8gOSB1MzIgXAorbWF0Y2ggaXAgdG9zIDB4OTAgMHhmYyBcCiskbWV0ZXIyYSBcCitjb250aW51ZSBmbG93aWQgOjIKKyMKKyMgaWYgaXQgZXhjZWVkcyB0aGUgYWJvdmUgYnV0IG5vdCB0aGUgcnVsZSBiZWxvdywgaXQgZ2V0cyBhIHRjaW5kZXggdmFsdWUKKyMgb2YgMyAocG9saWNlciAzKQorIworJFRDIGZpbHRlciBhZGQgZGV2ICRJTkRFViBwYXJlbnQgZmZmZjogcHJvdG9jb2wgaXAgcHJpbyAxMCB1MzIgXAorbWF0Y2ggaXAgdG9zIDB4OTAgMHhmYyBcCiskbWV0ZXIzIFwKK2NvbnRpbnVlIGZsb3dpZCA6MworJFRDIGZpbHRlciBhZGQgZGV2ICRJTkRFViBwYXJlbnQgZmZmZjogcHJvdG9jb2wgaXAgcHJpbyAxMSB1MzIgXAorbWF0Y2ggaXAgdG9zIDB4OTAgMHhmYyBcCiskbWV0ZXIzYSBcCitkcm9wIGZsb3dpZCA6MworCisjCisjICoqKioqKioqKioqKioqKioqKioqKioqIEFGNDMgKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorIworI0FGNDMgKERTQ1AgMHgyNikgZnJvbSBpcyBwYXNzZWQgb24gd2l0aCBhIHRjaW5kZXggdmFsdWUgMworI2lmIGl0IGRvZXNudCBleGNlZWQgaXRzIENJUi9DQlMgKyBQSVIvRUJTCisjcG9saWNlciAzIGlzIHVzZWQuIE5vdGUgdGhhdCB0aGlzIGlzIHNoYXJlZCB3aXRoIHRoZSBBRjQxIGFuZCBBRjQyCisjCiskVEMgZmlsdGVyIGFkZCBkZXYgJElOREVWIHBhcmVudCBmZmZmOiBwcm90b2NvbCBpcCBwcmlvIDEzIHUzMiBcCittYXRjaCBpcCB0b3MgMHg5OCAweGZjIFwKKyRtZXRlcjMgXAorY29udGludWUgZmxvd2lkIDozCiskVEMgZmlsdGVyIGFkZCBkZXYgJElOREVWIHBhcmVudCBmZmZmOiBwcm90b2NvbCBpcCBwcmlvIDE0IHUzMiBcCittYXRjaCBpcCB0b3MgMHg5OCAweGZjIFwKKyRtZXRlcjNhIFwKK2Ryb3AgZmxvd2lkIDozCisjCisjIyAqKioqKioqKioqKioqKioqKioqKioqKiBCRSAqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisjIworIyMgQW55dGhpbmcgZWxzZSAobm90IGZyb20gdGhlIEFGNCopIGdldHMgZGlzY2FyZGVkIGlmIGl0IAorIyMgZXhjZWVkcyAxTWJwcyBhbmQgYnkgZGVmYXVsdCBnb2VzIHRvIEJFIGlmIGl0IGRvZXNudAorIyMgTm90ZSB0aGF0IHRoZSBCRSBjbGFzcyBpcyBhbHNvIHVzZWQgYnkgdGhlIEFGNCogaW4gdGhlIHdvcnN0CisjIyBjYXNlCisjIworJFRDIGZpbHRlciBhZGQgZGV2ICRJTkRFViBwYXJlbnQgZmZmZjogcHJvdG9jb2wgaXAgcHJpbyAxNiB1MzIgXAorbWF0Y2ggaXAgc3JjIDAvMFwKKyRtZXRlcjQgXAorZHJvcCBmbG93aWQgOjQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVncmVzcyBzaWRlICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGF0dGFjaCBhIGRzbWFya2VyCisjCiskVEMgcWRpc2MgYWRkICRFR0RFViBoYW5kbGUgMTowIHJvb3QgZHNtYXJrIGluZGljZXMgNjQKKyMKKyMgdmFsdWVzIG9mIHRoZSBEU0NQIHRvIGNoYW5nZSBkZXBlbmRpbmcgb24gdGhlIGNsYXNzCisjbm90ZSB0aGF0IHRoZSBFQ04gYml0cyBhcmUgbWFza2VkIG91dAorIworI0FGNDEgKDB4ODggaXMgMHgyMiBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0d28gYml0cykKKyMKKyRUQyBjbGFzcyBjaGFuZ2UgJEVHREVWIGNsYXNzaWQgMToxIGRzbWFyayBtYXNrIDB4MyBcCisgICAgICAgdmFsdWUgMHg4OAorI0FGNDIKKyRUQyBjbGFzcyBjaGFuZ2UgJEVHREVWIGNsYXNzaWQgMToyIGRzbWFyayBtYXNrIDB4MyBcCisgICAgICAgdmFsdWUgMHg5MAorI0FGNDMKKyRUQyBjbGFzcyBjaGFuZ2UgJEVHREVWIGNsYXNzaWQgMTozIGRzbWFyayBtYXNrIDB4MyBcCisgICAgICAgdmFsdWUgMHg5OAorI0JFCiskVEMgY2xhc3MgY2hhbmdlICRFR0RFViBjbGFzc2lkIDE6MyBkc21hcmsgbWFzayAweDMgXAorICAgICAgIHZhbHVlIDB4MAorIworIworIyBUaGUgY2xhc3MgbWFwcGluZworIworJFRDIGZpbHRlciBhZGQgJEVHREVWIHBhcmVudCAxOjAgcHJvdG9jb2wgaXAgcHJpbyAxIFwKKyAgICAgICAgICBoYW5kbGUgMSB0Y2luZGV4IGNsYXNzaWQgMToxCiskVEMgZmlsdGVyIGFkZCAkRUdERVYgcGFyZW50IDE6MCBwcm90b2NvbCBpcCBwcmlvIDEgXAorICAgICAgICAgIGhhbmRsZSAyIHRjaW5kZXggIGNsYXNzaWQgMToyCiskVEMgZmlsdGVyIGFkZCAkRUdERVYgcGFyZW50IDE6MCBwcm90b2NvbCBpcCBwcmlvIDEgXAorICAgICAgICAgIGhhbmRsZSAzIHRjaW5kZXggIGNsYXNzaWQgMTozCiskVEMgZmlsdGVyIGFkZCAkRUdERVYgcGFyZW50IDE6MCBwcm90b2NvbCBpcCBwcmlvIDEgXAorICAgICAgICAgIGhhbmRsZSA0IHRjaW5kZXggIGNsYXNzaWQgMTo0CisjCisKKyMKK2VjaG8gIi0tLS0gcWRpc2MgcGFyYW1ldGVycyBJbmdyZXNzICAtLS0tLS0tLS0tIgorJFRDIHFkaXNjIGxzIGRldiAkSU5ERVYKK2VjaG8gIi0tLS0gQ2xhc3MgcGFyYW1ldGVycyBJbmdyZXNzICAtLS0tLS0tLS0tIgorJFRDIGNsYXNzIGxzIGRldiAkSU5ERVYKK2VjaG8gIi0tLS0gZmlsdGVyIHBhcmFtZXRlcnMgSW5ncmVzcyAtLS0tLS0tLS0tIgorJFRDIGZpbHRlciBscyBkZXYgJElOREVWIHBhcmVudCBmZmZmOgorCitlY2hvICItLS0tIHFkaXNjIHBhcmFtZXRlcnMgRWdyZXNzICAtLS0tLS0tLS0tIgorJFRDIHFkaXNjIGxzICRFR0RFVgorZWNobyAiLS0tLSBDbGFzcyBwYXJhbWV0ZXJzIEVncmVzcyAgLS0tLS0tLS0tLSIKKyRUQyBjbGFzcyBscyAkRUdERVYKK2VjaG8gIi0tLS0gZmlsdGVyIHBhcmFtZXRlcnMgRWdyZXNzIC0tLS0tLS0tLS0iCiskVEMgZmlsdGVyIGxzICRFR0RFViBwYXJlbnQgMTowCisjCisjZGVsZXRpbmcgdGhlIGluZ3Jlc3MgcWRpc2MKKyMkVEMgcWRpc2MgZGVsICRJTkRFViBpbmdyZXNzCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9leGFtcGxlcy9kaWZmc2Vydi9FZGdlMzItY2ItY2hhaW5zIGIvaXByb3V0ZTIvZXhhbXBsZXMvZGlmZnNlcnYvRWRnZTMyLWNiLWNoYWlucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDRmYWQxCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvZXhhbXBsZXMvZGlmZnNlcnYvRWRnZTMyLWNiLWNoYWlucwpAQCAtMCwwICsxLDE0NCBAQAorIyEgL2Jpbi9zaCAteAorIworIyBzYW1wbGUgc2NyaXB0IG9uIHVzaW5nIHRoZSBpbmdyZXNzIGNhcGFiaWxpdGllcworIyBUaGlzIHNjcmlwdCBmd21hcmsgdGFncyhJUGNoYWlucykgYmFzZWQgb24gbWV0ZXJpbmcgb24gdGhlIGluZ3Jlc3MgCisjIGludGVyZmFjZSB0aGUgcmVzdWx0IGlzIHVzZWQgZm9yIGZhc3QgY2xhc3NpZmljYXRpb24gYW5kIHJlLW1hcmtpbmcKKyMgb24gdGhlIGVncmVzcyBpbnRlcmZhY2UKKyMgVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgY29sb3IgYmxpbmQgbW9kZSBtYXJrZXIgd2l0aCBubyBQSVIgY29uZmlndXJlZAorIyBiYXNlZCBvbiBkcmFmdC13YWhqYWstbWNtLTAwLnR4dCAoc2VjdGlvbiAzLjEpCisjCisjcGF0aCB0byB2YXJpb3VzIHV0aWxpdGllczsKKyNjaGFuZ2UgdG8gcmVmbGVjdCB5b3Vycy4KKyMKK0lQUk9VVEU9L3Jvb3QvRFMtNi1iZXRhL2lwcm91dGUyLTk5MDUzMC1kc2luZworVEM9JElQUk9VVEUvdGMvdGMKK0lQPSRJUFJPVVRFL2lwL2lwCitJUENIQUlOUz0vcm9vdC9EUy02LWJldGEvaXBjaGFpbnMtMS4zLjkvaXBjaGFpbnMKK0lOREVWPWV0aDIKK0VHREVWPSJkZXYgZXRoMSIKK0NJUjE9MTUwMGtiaXQKK0NJUjI9NTAwa2JpdAorCisjVGhlIENCUyBpcyBhYm91dCA2MCBNVFUgc2l6ZWQgcGFja2V0cworQ0JTMT05MGsKK0NCUzI9OTBrCisKK21ldGVyMT0icG9saWNlIHJhdGUgJENJUjEgYnVyc3QgJENCUzEgIgorbWV0ZXIxYT0icG9saWNlIHJhdGUgJENJUjIgYnVyc3QgJENCUzEgIgorbWV0ZXIyPSJwb2xpY2UgcmF0ZSAkQ0lSMSBidXJzdCAkQ0JTMiAiCittZXRlcjJhPSJwb2xpY2UgcmF0ZSAkQ0lSMiBidXJzdCAkQ0JTMiAiCittZXRlcjM9InBvbGljZSByYXRlICRDSVIyIGJ1cnN0ICRDQlMxICIKK21ldGVyM2E9InBvbGljZSByYXRlICRDSVIyIGJ1cnN0ICRDQlMxICIKK21ldGVyND0icG9saWNlIHJhdGUgJENJUjIgYnVyc3QgJENCUzIgIgorbWV0ZXI1PSJwb2xpY2UgcmF0ZSAkQ0lSMSBidXJzdCAkQ0JTMiAiCisjCisjIHRhZyB0aGUgcmVzdCBvZiBpbmNvbWluZyBwYWNrZXRzIGZyb20gc3VibmV0IDEwLjIuMC4wLzI0IHRvIGZ3IHZhbHVlIDEKKyMgdGFnIGFsbCBpbmNvbWluZyBwYWNrZXRzIGZyb20gYW55IG90aGVyIHN1Ym5ldCB0byBmdyB0YWcgMgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIAorJElQQ0hBSU5TIC1BIGlucHV0IC1pICRJTkRFViAtcyAwLzAgLW0gMgorJElQQ0hBSU5TIC1BIGlucHV0IC1pICRJTkRFViAtcyAxMC4yLjAuMC8yNCAtbSAxCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCisjIGluc3RhbGwgdGhlIGluZ3Jlc3MgcWRpc2Mgb24gdGhlIGluZ3Jlc3MgaW50ZXJmYWNlCiskVEMgcWRpc2MgYWRkIGRldiAkSU5ERVYgaGFuZGxlIGZmZmY6IGluZ3Jlc3MKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAKKworIyBBbGwgcGFja2V0cyBhcmUgbWFya2VkIHdpdGggYSB0Y2luZGV4IHZhbHVlIHdoaWNoIGlzIHVzZWQgb24gdGhlIGVncmVzcworIyB0Y2luZGV4IDEgbWFwcyB0byBBRjQxLCAyLT5BRjQyLCAzLT5BRjQzLCA0LT5CRQorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIAorIyAKKyMgYW55dGhpbmcgd2l0aCBmdyB0YWcgb2YgMSBpcyBwYXNzZWQgb24gd2l0aCBhIHRjaW5kZXggdmFsdWUgMQorI2lmIGl0IGRvZXNudCBleGNlZWQgaXRzIGFsbG9jYXRlZCByYXRlIChDSVIvQ0JTKQorIyAKKyRUQyBmaWx0ZXIgYWRkIGRldiAkSU5ERVYgcGFyZW50IGZmZmY6IHByb3RvY29sIGlwIHByaW8gMSBoYW5kbGUgMSBmdyBcCiskbWV0ZXIxIFwKK2NvbnRpbnVlIGZsb3dpZCA0OjEKKyRUQyBmaWx0ZXIgYWRkIGRldiAkSU5ERVYgcGFyZW50IGZmZmY6IHByb3RvY29sIGlwIHByaW8gMiBoYW5kbGUgMSBmdyBcCiskbWV0ZXIxYSBcCitjb250aW51ZSBmbG93aWQgNDoxCisjCisjIGlmIGl0IGV4Y2VlZHMgdGhlIGFib3ZlIGJ1dCBub3QgdGhlIGV4dHJhIHJhdGUvYnVyc3QgYmVsb3csIGl0IGdldHMgYSAKKyN0Y2luZGV4IHZhbHVlICBvZiAyCisjCiskVEMgZmlsdGVyIGFkZCBkZXYgJElOREVWIHBhcmVudCBmZmZmOiBwcm90b2NvbCBpcCBwcmlvIDMgaGFuZGxlIDEgZncgXAorJG1ldGVyMiBcCitjb250aW51ZSBmbG93aWQgNDoyCiskVEMgZmlsdGVyIGFkZCBkZXYgJElOREVWIHBhcmVudCBmZmZmOiBwcm90b2NvbCBpcCBwcmlvIDQgaGFuZGxlIDEgZncgXAorJG1ldGVyMmEgXAorY29udGludWUgZmxvd2lkIDQ6MgorIworIyBpZiBpdCBleGNlZWRzIHRoZSBhYm92ZSBidXQgbm90IHRoZSBydWxlIGJlbG93LCBpdCBnZXRzIGEgdGNpbmRleCB2YWx1ZQorIyBvZiAzCisjCiskVEMgZmlsdGVyIGFkZCBkZXYgJElOREVWIHBhcmVudCBmZmZmOiBwcm90b2NvbCBpcCBwcmlvIDUgaGFuZGxlIDEgZncgXAorJG1ldGVyMyBcCitjb250aW51ZSBmbG93aWQgNDozCiskVEMgZmlsdGVyIGFkZCBkZXYgJElOREVWIHBhcmVudCBmZmZmOiBwcm90b2NvbCBpcCBwcmlvIDYgaGFuZGxlIDEgZncgXAorJG1ldGVyM2EgXAorZHJvcCBmbG93aWQgNDozCisjCisjIEFueXRoaW5nIGVsc2UgKG5vdCBmcm9tIHRoZSBzdWJuZXQgMTAuMi4wLjI0LzI0KSBnZXRzIGRpc2NhcmRlZCBpZiBpdCAKKyMgZXhjZWVkcyAxTWJwcyBhbmQgYnkgZGVmYXVsdCBnb2VzIHRvIEJFIGlmIGl0IGRvZXNudAorIworJFRDIGZpbHRlciBhZGQgZGV2ICRJTkRFViBwYXJlbnQgZmZmZjogcHJvdG9jb2wgaXAgcHJpbyA3IGhhbmRsZSAyIGZ3IFwKKyRtZXRlcjUgXAorZHJvcCBmbG93aWQgNDo0CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVncmVzcyBzaWRlICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKKyMgYXR0YWNoIGEgZHNtYXJrZXIKKyMKKyRUQyBxZGlzYyBhZGQgJEVHREVWIGhhbmRsZSAxOjAgcm9vdCBkc21hcmsgaW5kaWNlcyA2NAorIworIyB2YWx1ZXMgb2YgdGhlIERTQ1AgdG8gY2hhbmdlIGRlcGVuZGluZyBvbiB0aGUgY2xhc3MKKyNub3RlIHRoYXQgdGhlIEVDTiBiaXRzIGFyZSBtYXNrZWQgb3V0CisjCisjQUY0MSAoMHg4OCBpcyAweDIyIHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHR3byBiaXRzKQorIworJFRDIGNsYXNzIGNoYW5nZSAkRUdERVYgY2xhc3NpZCAxOjEgZHNtYXJrIG1hc2sgMHgzIFwKKyAgICAgICB2YWx1ZSAweDg4CisjQUY0MgorJFRDIGNsYXNzIGNoYW5nZSAkRUdERVYgY2xhc3NpZCAxOjIgZHNtYXJrIG1hc2sgMHgzIFwKKyAgICAgICB2YWx1ZSAweDkwCisjQUY0MworJFRDIGNsYXNzIGNoYW5nZSAkRUdERVYgY2xhc3NpZCAxOjMgZHNtYXJrIG1hc2sgMHgzIFwKKyAgICAgICB2YWx1ZSAweDk4CisjQkUKKyRUQyBjbGFzcyBjaGFuZ2UgJEVHREVWIGNsYXNzaWQgMTo0IGRzbWFyayBtYXNrIDB4MyBcCisgICAgICAgdmFsdWUgMHgwCisjCisjCisjIFRoZSBjbGFzcyBtYXBwaW5nICh1c2luZyB0Y2luZGV4OyBjb3VsZCBlYXNpbHkgaGF2ZQorIyByZXBsYWNlZCBpdCB3aXRoIHRoZSBmdyBjbGFzc2lmaWVyIGluc3RlYWQpCisjCiskVEMgZmlsdGVyIGFkZCAkRUdERVYgcGFyZW50IDE6MCBwcm90b2NvbCBpcCBwcmlvIDEgXAorICAgICAgICAgIGhhbmRsZSAxIHRjaW5kZXggY2xhc3NpZCAxOjEKKyRUQyBmaWx0ZXIgYWRkICRFR0RFViBwYXJlbnQgMTowIHByb3RvY29sIGlwIHByaW8gMSBcCisgICAgICAgICAgaGFuZGxlIDIgdGNpbmRleCAgY2xhc3NpZCAxOjIKKyRUQyBmaWx0ZXIgYWRkICRFR0RFViBwYXJlbnQgMTowIHByb3RvY29sIGlwIHByaW8gMSBcCisgICAgICAgICAgaGFuZGxlIDMgdGNpbmRleCAgY2xhc3NpZCAxOjMKKyRUQyBmaWx0ZXIgYWRkICRFR0RFViBwYXJlbnQgMTowIHByb3RvY29sIGlwIHByaW8gMSBcCisgICAgICAgICAgaGFuZGxlIDQgdGNpbmRleCAgY2xhc3NpZCAxOjQKKyMKKworIworZWNobyAiLS0tLSBxZGlzYyBwYXJhbWV0ZXJzIEluZ3Jlc3MgIC0tLS0tLS0tLS0iCiskVEMgcWRpc2MgbHMgZGV2ICRJTkRFVgorZWNobyAiLS0tLSBDbGFzcyBwYXJhbWV0ZXJzIEluZ3Jlc3MgIC0tLS0tLS0tLS0iCiskVEMgY2xhc3MgbHMgZGV2ICRJTkRFVgorZWNobyAiLS0tLSBmaWx0ZXIgcGFyYW1ldGVycyBJbmdyZXNzIC0tLS0tLS0tLS0iCiskVEMgZmlsdGVyIGxzIGRldiAkSU5ERVYgcGFyZW50IGZmZmY6CisKK2VjaG8gIi0tLS0gcWRpc2MgcGFyYW1ldGVycyBFZ3Jlc3MgIC0tLS0tLS0tLS0iCiskVEMgcWRpc2MgbHMgJEVHREVWCitlY2hvICItLS0tIENsYXNzIHBhcmFtZXRlcnMgRWdyZXNzICAtLS0tLS0tLS0tIgorJFRDIGNsYXNzIGxzICRFR0RFVgorZWNobyAiLS0tLSBmaWx0ZXIgcGFyYW1ldGVycyBFZ3Jlc3MgLS0tLS0tLS0tLSIKKyRUQyBmaWx0ZXIgbHMgJEVHREVWIHBhcmVudCAxOjAKKyMKKyNkZWxldGluZyB0aGUgaW5ncmVzcyBxZGlzYworIyRUQyBxZGlzYyBkZWwgJElOREVWIGluZ3Jlc3MKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2V4YW1wbGVzL2RpZmZzZXJ2L0VkZ2UzMi1jYi11MzIgYi9pcHJvdXRlMi9leGFtcGxlcy9kaWZmc2Vydi9FZGdlMzItY2ItdTMyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMmViYjQKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9leGFtcGxlcy9kaWZmc2Vydi9FZGdlMzItY2ItdTMyCkBAIC0wLDAgKzEsMTQ1IEBACisjISAvYmluL3NoIAorIworIyBzYW1wbGUgc2NyaXB0IG9uIHVzaW5nIHRoZSBpbmdyZXNzIGNhcGFiaWxpdGllcyB1c2luZyB1MzIgY2xhc3NpZmllcgorIyBUaGlzIHNjcmlwdCB0YWdzIHRjaW5kZXggYmFzZWQgb24gbWV0ZXJpbmcgb24gdGhlIGluZ3Jlc3MgCisjIGludGVyZmFjZSB0aGUgcmVzdWx0IGlzIHVzZWQgZm9yIGZhc3QgY2xhc3NpZmljYXRpb24gYW5kIHJlLW1hcmtpbmcKKyMgb24gdGhlIGVncmVzcyBpbnRlcmZhY2UKKyMgVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgY29sb3IgYmxpbmQgbW9kZSBtYXJrZXIgd2l0aCBQSVIgY29uZmlndXJlZAorIyBiYXNlZCBvbiBkcmFmdC13YWhqYWstbWNtLTAwLnR4dCAoc2VjdGlvbiAzLjIpCisjCisjcGF0aCB0byB2YXJpb3VzIHV0aWxpdGllczsKKyNjaGFuZ2UgdG8gcmVmbGVjdCB5b3Vycy4KKyMKK0lQUk9VVEU9L3Jvb3QvRFMtNi1iZXRhL2lwcm91dGUyLTk5MDUzMC1kc2luZworVEM9JElQUk9VVEUvdGMvdGMKK0lQPSRJUFJPVVRFL2lwL2lwCitJTkRFVj1ldGgyCitFR0RFVj0iZGV2IGV0aDEiCitDSVIxPTEwMDBrYml0CitDSVIyPTEwMDBrYml0CisjIFRoZSBQSVIgaXMgdGhlIGV4Y2VzcyAoaW4gYWRkaXRpb24gdG8gdGhlIENJUiBpLmUgaWYgYWx3YXlzCisjIGdvaW5nIHRvIHRoZSBQSVIgLS0+IGF2ZXJhZ2UgcmF0ZSBpcyBDSVIrUElSKQorUElSMT0xMDAwa2JpdAorUElSMj01MDBrYml0CisKKyNUaGUgQ0JTIGlzIGFib3V0IDYwIE1UVSBzaXplZCBwYWNrZXRzCitDQlMxPTkwaworQ0JTMj05MGsKKyN0aGUgRUJTIGlzIGFib3V0IDEwIG1heCBzaXplZCBwYWNrZXRzCitFQlMxPTE1aworRUJTMj0xNWsKKyMgVGhlIG1ldGVycworbWV0ZXIxPSIgcG9saWNlIHJhdGUgJENJUjEgYnVyc3QgJENCUzEgIgorbWV0ZXIxYT0iIHBvbGljZSByYXRlICRQSVIxIGJ1cnN0ICRFQlMxICIKK21ldGVyMj0iIHBvbGljZSByYXRlICRDSVIyIGJ1cnN0ICRDQlMxICIKK21ldGVyMmE9InBvbGljZSByYXRlICRQSVIyIGJ1cnN0ICRDQlMxICIKK21ldGVyMz0iIHBvbGljZSByYXRlICRDSVIyIGJ1cnN0ICRDQlMyICIKK21ldGVyM2E9IiBwb2xpY2UgcmF0ZSAkUElSMiBidXJzdCAkRUJTMiAiCittZXRlcjQ9IiBwb2xpY2UgcmF0ZSAkQ0lSMSBidXJzdCAkQ0JTMiAiCittZXRlcjU9IiBwb2xpY2UgcmF0ZSAkQ0lSMSBidXJzdCAkQ0JTMiAiCisKKworIyBpbnN0YWxsIHRoZSBpbmdyZXNzIHFkaXNjIG9uIHRoZSBpbmdyZXNzIGludGVyZmFjZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIAorJFRDIHFkaXNjIGFkZCBkZXYgJElOREVWIGhhbmRsZSBmZmZmOiBpbmdyZXNzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCisKKyMgQWxsIHBhY2tldHMgYXJlIG1hcmtlZCB3aXRoIGEgdGNpbmRleCB2YWx1ZSB3aGljaCBpcyB1c2VkIG9uIHRoZSBlZ3Jlc3MKKyMgTk9URTogdGNpbmRleCAxIG1hcHMgdG8gQUY0MSwgMi0+QUY0MiwgMy0+QUY0MywgNC0+QkUKKyMgCisjYW55dGhpbmcgZnJvbSBzdWJuZXQgMTAuMi4wLjIvMjQgaXMgcGFzc2VkIG9uIHdpdGggYSB0Y2luZGV4IHZhbHVlIDEKKyNpZiBpdCBkb2VzbnQgZXhjZWVkIGl0cyBDSVIvQ0JTICsgUElSL0VCUworIyAKKyRUQyBmaWx0ZXIgYWRkIGRldiAkSU5ERVYgcGFyZW50IGZmZmY6IHByb3RvY29sIGlwIHByaW8gMSB1MzIgXAorbWF0Y2ggaXAgc3JjIDEwLjIuMC4wLzI0ICRtZXRlcjEgXAorY29udGludWUgZmxvd2lkIDoxCiskVEMgZmlsdGVyIGFkZCBkZXYgJElOREVWIHBhcmVudCBmZmZmOiBwcm90b2NvbCBpcCBwcmlvIDIgdTMyIFwKK21hdGNoIGlwIHNyYyAxMC4yLjAuMC8yNCAkbWV0ZXIxYSBcCitjb250aW51ZSBmbG93aWQgOjEKKworIworIyBpZiBpdCBleGNlZWRzIHRoZSBhYm92ZSBidXQgbm90IHRoZSBleHRyYSByYXRlL2J1cnN0IGJlbG93LCBpdCBnZXRzIGEgCisjdGNpbmRleCB2YWx1ZSAgb2YgMgorIworJFRDIGZpbHRlciBhZGQgZGV2ICRJTkRFViBwYXJlbnQgZmZmZjogcHJvdG9jb2wgaXAgcHJpbyAzIHUzMiBcCittYXRjaCBpcCBzcmMgMTAuMi4wLjAvMjQgJG1ldGVyMiBcCitjb250aW51ZSBmbG93aWQgOjIKKyRUQyBmaWx0ZXIgYWRkIGRldiAkSU5ERVYgcGFyZW50IGZmZmY6IHByb3RvY29sIGlwIHByaW8gNCB1MzIgXAorbWF0Y2ggaXAgc3JjIDEwLjIuMC4wLzI0ICRtZXRlcjJhIFwKK2NvbnRpbnVlIGZsb3dpZCA6MgorIworIyBpZiBpdCBleGNlZWRzIHRoZSBhYm92ZSBidXQgbm90IHRoZSBydWxlIGJlbG93LCBpdCBnZXRzIGEgdGNpbmRleCB2YWx1ZQorIyBvZiAzCisjCiskVEMgZmlsdGVyIGFkZCBkZXYgJElOREVWIHBhcmVudCBmZmZmOiBwcm90b2NvbCBpcCBwcmlvIDUgdTMyIFwKK21hdGNoIGlwIHNyYyAxMC4yLjAuMC8yNCAkbWV0ZXIzIFwKK2NvbnRpbnVlIGZsb3dpZCA6MworJFRDIGZpbHRlciBhZGQgZGV2ICRJTkRFViBwYXJlbnQgZmZmZjogcHJvdG9jb2wgaXAgcHJpbyA2IHUzMiBcCittYXRjaCBpcCBzcmMgMTAuMi4wLjAvMjQgJG1ldGVyM2EgXAorZHJvcCBmbG93aWQgOjMKKyMKKyMKKyMgQW55dGhpbmcgZWxzZSAobm90IGZyb20gdGhlIHN1Ym5ldCAxMC4yLjAuMjQvMjQpIGdldHMgZGlzY2FyZGVkIGlmIGl0IAorIyBleGNlZWRzIDFNYnBzIGFuZCBieSBkZWZhdWx0IGdvZXMgdG8gQkUgaWYgaXQgZG9lc250CisjCiskVEMgZmlsdGVyIGFkZCBkZXYgJElOREVWIHBhcmVudCBmZmZmOiBwcm90b2NvbCBpcCBwcmlvIDcgdTMyIFwKK21hdGNoIGlwIHNyYyAwLzAgJG1ldGVyNSBcCitkcm9wIGZsb3dpZCA6NAorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFZ3Jlc3Mgc2lkZSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCisjIGF0dGFjaCBhIGRzbWFya2VyCisjCiskVEMgcWRpc2MgYWRkICRFR0RFViBoYW5kbGUgMTowIHJvb3QgZHNtYXJrIGluZGljZXMgNjQKKyMKKyMgdmFsdWVzIG9mIHRoZSBEU0NQIHRvIGNoYW5nZSBkZXBlbmRpbmcgb24gdGhlIGNsYXNzCisjbm90ZSB0aGF0IHRoZSBFQ04gYml0cyBhcmUgbWFza2VkIG91dAorIworI0FGNDEgKDB4ODggaXMgMHgyMiBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0d28gYml0cykKKyMKKyRUQyBjbGFzcyBjaGFuZ2UgJEVHREVWIGNsYXNzaWQgMToxIGRzbWFyayBtYXNrIDB4MyBcCisgICAgICAgdmFsdWUgMHg4OAorI0FGNDIKKyRUQyBjbGFzcyBjaGFuZ2UgJEVHREVWIGNsYXNzaWQgMToyIGRzbWFyayBtYXNrIDB4MyBcCisgICAgICAgdmFsdWUgMHg5MAorI0FGNDMKKyRUQyBjbGFzcyBjaGFuZ2UgJEVHREVWIGNsYXNzaWQgMTozIGRzbWFyayBtYXNrIDB4MyBcCisgICAgICAgdmFsdWUgMHg5OAorI0JFCiskVEMgY2xhc3MgY2hhbmdlICRFR0RFViBjbGFzc2lkIDE6MyBkc21hcmsgbWFzayAweDMgXAorICAgICAgIHZhbHVlIDB4MAorIworIworIyBUaGUgY2xhc3MgbWFwcGluZworIworJFRDIGZpbHRlciBhZGQgJEVHREVWIHBhcmVudCAxOjAgcHJvdG9jb2wgaXAgcHJpbyAxIFwKKyAgICAgICAgICBoYW5kbGUgMSB0Y2luZGV4IGNsYXNzaWQgMToxCiskVEMgZmlsdGVyIGFkZCAkRUdERVYgcGFyZW50IDE6MCBwcm90b2NvbCBpcCBwcmlvIDEgXAorICAgICAgICAgIGhhbmRsZSAyIHRjaW5kZXggIGNsYXNzaWQgMToyCiskVEMgZmlsdGVyIGFkZCAkRUdERVYgcGFyZW50IDE6MCBwcm90b2NvbCBpcCBwcmlvIDEgXAorICAgICAgICAgIGhhbmRsZSAzIHRjaW5kZXggIGNsYXNzaWQgMTozCiskVEMgZmlsdGVyIGFkZCAkRUdERVYgcGFyZW50IDE6MCBwcm90b2NvbCBpcCBwcmlvIDEgXAorICAgICAgICAgIGhhbmRsZSA0IHRjaW5kZXggIGNsYXNzaWQgMTo0CisjCisKKyMKK2VjaG8gIi0tLS0gcWRpc2MgcGFyYW1ldGVycyBJbmdyZXNzICAtLS0tLS0tLS0tIgorJFRDIHFkaXNjIGxzIGRldiAkSU5ERVYKK2VjaG8gIi0tLS0gQ2xhc3MgcGFyYW1ldGVycyBJbmdyZXNzICAtLS0tLS0tLS0tIgorJFRDIGNsYXNzIGxzIGRldiAkSU5ERVYKK2VjaG8gIi0tLS0gZmlsdGVyIHBhcmFtZXRlcnMgSW5ncmVzcyAtLS0tLS0tLS0tIgorJFRDIGZpbHRlciBscyBkZXYgJElOREVWIHBhcmVudCBmZmZmOgorCitlY2hvICItLS0tIHFkaXNjIHBhcmFtZXRlcnMgRWdyZXNzICAtLS0tLS0tLS0tIgorJFRDIHFkaXNjIGxzICRFR0RFVgorZWNobyAiLS0tLSBDbGFzcyBwYXJhbWV0ZXJzIEVncmVzcyAgLS0tLS0tLS0tLSIKKyRUQyBjbGFzcyBscyAkRUdERVYKK2VjaG8gIi0tLS0gZmlsdGVyIHBhcmFtZXRlcnMgRWdyZXNzIC0tLS0tLS0tLS0iCiskVEMgZmlsdGVyIGxzICRFR0RFViBwYXJlbnQgMTowCisjCisjZGVsZXRpbmcgdGhlIGluZ3Jlc3MgcWRpc2MKKyMkVEMgcWRpc2MgZGVsICRJTkRFViBpbmdyZXNzCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9leGFtcGxlcy9kaWZmc2Vydi9SRUFETUUgYi9pcHJvdXRlMi9leGFtcGxlcy9kaWZmc2Vydi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM5MWQ2MwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2V4YW1wbGVzL2RpZmZzZXJ2L1JFQURNRQpAQCAtMCwwICsxLDk4IEBACisKK05vdGUgYWxsIHRoZXNlIGFyZSBtZXJlIGV4YW1wbGVzIHdoaWNoIGNhbiBiZSBjdXN0b21pemVkIHRvIHlvdXIgbmVlZHMKKworQUZDQlEKKy0tLS0tCitBRiBQSEIgYnVpbHQgdXNpbmcgQ0JRLCBEU01BUkssR1JFRCAoZGVmYXVsdCBpbiBHUklPIG1vZGUpICxSRUQgZm9yIEJFIAorYW5kIHRoZSB0Y2luZGV4IGNsYXNzaWZpZXIgd2l0aCBzb21lIGFsZ29yaXRobWljIG1hcHBpbmcKKworRUZDQlEKKy0tLS0tCitFRiBQSEIgYnVpbHQgdXNpbmcgQ0JRIChmb3IgcmF0ZSBjb250cm9sIGFuZCBwcmlvcml0aXphdGlvbiksIAorRFNNQVJLKCB0byByZW1hcmsgRFNDUHMpLCB0Y2luZGV4ICBjbGFzc2lmaWVyIGFuZCAgUkVEIGZvciB0aGUgQkUKK3RyYWZmaWMuCisKK0VGUFJJTworLS0tLS0tCitFRiBQSEIgdXNpbmcgdGhlIFBSSU8gc2NoZWR1bGVyLCBUb2tlbiBCdWNrZXQgdG8gcmF0ZSBjb250cm9sIEVGLAordGNpbmRleCBjbGFzc2lmaWVyLCBEU01BUksgdG8gcmVtYXJrLCBhbmQgUkVEIGZvciB0aGUgQkUgdHJhZmZpYworCitFREdFIHNjcmlwdHMKKz09PT09PT09PT09PT09CisKK0NCLTMoMXwyKS0odTMyL2NoYWlucykKKz09PT09PT09PT09PT09PT09PT09PT0KKworCitUaGUgbWFqb3IgZGlmZmVyZW5jZXMgYXJlIHRoYXQgdGhlIGNsYXNzaWZpZXIgaXMgdTMyIG9uIC11MzIgZXh0ZW5zaW9uCithbmQgSVBjaGFpbnMgb24gdGhlIGNoYWlucyBleHRlbnNpb24uIENCIHN0YW5kcyBmb3IgY29sb3IgQmxpbmQKK2FuZCAzMSBpcyBmb3IgdGhlIG1vZGUgd2hlcmUgb25seSBhIENJUiBhbmQgQ0JTIGFyZSBkZWZpbmVkIHdoZXJlYXMKKzMyIHN0YW5kcyBmb3IgYSBtb2RlIHdoZXJlIGEgQ0lSL0NCUyArIFBJUi9FQlMgYXJlIGRlZmluZWQuCisKK0NvbG9yIEJsaW5kIChDQikKKz09PT09PT09PT0tLS0tLT0KK1dlIGxvb2sgYXQgb25lIHNwZWNpYWwgc3VibmV0IHRoYXQgd2UgYXJlIGludGVyZXN0ZWQgaW4gZm9yIHNpbXBsaWN0eQorcmVhc29ucyB0byBkZW1vbnN0cmF0ZSB0aGUgY2FwYWJpbGl0eS4gV2Ugc2VuZCB0aGUgcGFja2V0cyBmcm9tIHRoYXQKK3N1Ym5ldCB0byBBRjQqLCBCRSBvciBlbmQgdXAgZHJvcHBpbmcgZGVwZW5kaW5nIG9uIHRoZSBtZXRlcmluZyByZXN1bHRzLiAKKworCitUaGUgYWxnb3JpdGhtIG92ZXJ2aWV3IGlzIGFzIGZvbGxvd3M6CisKKypjbGFzc2lmeToKKworKipjYXNlOiBzdWJuZXQgWAorLS0tLS0tLS0tLS0tLS0tLQorICBpZiAhZXhjZWVkIG1ldGVyMSB0YWcgYXMgQUY0MQorCWVsc2UKKwkgICAgaWYgIWV4Y2VlZCBtZXRlcjIgIHRhZyBhcyBBRjQyCisJICAgICAgICBlbHNlCisJCSAgaWYgIWV4Y2VlZCBtZXRlciAzIHRhZyBhcyBBRjQzCisJCSAgICAgIGVsc2UgCisJCQkgZHJvcCAKKworZGVmYXVsdCBjYXNlOiBBbnkgb3RoZXIgc3VibmV0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGlmICFleGNlZWQgbWV0ZXIgNSB0YWcgYXMgQUY0MworICAgICAgZWxzZQorCSBkcm9wIAorCisKK09uZSBFZ3Jlc3Mgc2lkZSBjaGFuZ2UgdGhlIERTQ1BzIG9mIHRoZSBwYWNrZXRzIHRvIHJlZmxlY3QgQUY0KiBhbmQgQkUKK2Jhc2VkIG9uIHRoZSB0YWdzIGZyb20gdGhlIGluZ3Jlc3MuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ29sb3IgQXdhcmUKKz09PT09PT09PT09CisKK0RlZmluZSBzb21lIG1ldGVycyB3aXRoICsgcG9saWNpbmcgYW5kIGdpdmUgdGhlbSBJRHMgZWcKKworbWV0ZXIxPXBvbGljZSBpbmRleCAxIHJhdGUgJENJUjEgYnVyc3QgJENCUzEgIAorbWV0ZXIyPXBvbGljZSBpbmRleCAyIHJhdGUgJENJUjIgYnVyc3QgJENCUzIgICBldGMgCisKK0dlbmVyYWwgb3ZlcnZpZXc6CitjbGFzc2lmeSBiYXNlZCBvbiB0aGUgRFNDUHMgYW5kIHVzZSB0aGUgcG9saWNlciBpZHMgdG8gZGVjaWRlIHRhZ2dpbmcKKworCisqY2xhc3NpZnkgb24gaW5ncmVzczoKKworc3dpdGNoIChkc2NwKSB7CisgICAgY2FzZSBBRjQxOiAvKiB0b3MmMHhmYyA9PSAweDg4ICovCisJaWYgKCFleGNlZWQgbWV0ZXIxKSBicmVhazsKKyAgICBjYXNlIEFGNDI6IC8qIHRvcyYweGZjID09IDB4OTAgKi8KKwlpZiAoIWV4Y2VlZCBtZXRlcjIpIHsKKwkgICAgdGFnIGFzIEFGNDI7CisJICAgIGJyZWFrOworCX0KKyAgICBjYXNlIEFGNDM6IC8qIHRvcyYweGZjID09IDB4OTggKi8KKwlpZiAoIWV4Y2VlZCBtZXRlcjMpIHsKKwkgICAgdGFnIGFzIEFGNDM7CisJICAgIGJyZWFrOworCX0gZWxzZQorCSAgZHJvcDsKKyAgICBkZWZhdWx0OgorCWlmICghZXhjZWVkIG1ldGVyNCkgdGFnIGFzIEJFOworCWVsc2UgZHJvcDsKK30KKworT24gdGhlIEVncmVzcyBzaWRlIG1hcmsgdGhlIHByb3BlciBBRiB0YWdzCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9leGFtcGxlcy9kaWZmc2Vydi9hZmNicSBiL2lwcm91dGUyL2V4YW1wbGVzL2RpZmZzZXJ2L2FmY2JxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZDZkOTMKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9leGFtcGxlcy9kaWZmc2Vydi9hZmNicQpAQCAtMCwwICsxLDEwNSBAQAorIyEvdXNyL2Jpbi9wZXJsCisjCisjCisjIEFGIHVzaW5nIENCUSBmb3IgYSBzaW5nbGUgaW50ZXJmYWNlIGV0aDAgCisjIDQgQUYgY2xhc3NlcyB1c2luZyBHUkVEIGFuZCBvbmUgQkUgdXNpbmcgUkVECisjIFRoaW5ncyB5b3UgbWlnaHQgd2FudCB0byBjaGFuZ2U6CisjCS0gdGhlIGRldmljZSBiYW5kd2lkdGggKHNldCBhdCAxME1iaXRzKQorIwktIHRoZSBiYW5kd2lkdGggYWxsb2NhdGVkIGZvciBlYWNoIEFGIGNsYXNzIGFuZCB0aGUgQkUgY2xhc3MJCisjCS0gdGhlIGRyb3AgcHJvYmFiaWxpdHkgYXNzb2NpYXRlZCB3aXRoIGVhY2ggQUYgdmlydHVhbCBxdWV1ZQorIworIyBBRiBEU0NQIHZhbHVlcyB1c2VkIChiYXNlZCBvbiBBRiBkcmFmdCAwNCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQUYgRFNDUCB2YWx1ZXMKKyMgQUYxIDEuIDB4MGEgMi4gMHgwYyAzLiAweDBlCisjIEFGMiAxLiAweDEyIDIuIDB4MTQgMy4gMHgxNgorIyBBRjMgMS4gMHgxYSAyLiAweDFjIDMuIDB4MWUKKyMgQUY0IDEuIDB4MjIgMi4gMHgyNCAzLiAweDI2CisKKyMKKyMgCisjIEEgc2ltcGxlIERTQ1AtY2xhc3MgcmVsYXRpb25zaGlwIGZvcm11bGEgdXNlZCB0byBnZW5lcmF0ZQorIyB2YWx1ZXMgaW4gdGhlIGZvciBsb29wIG9mIHRoaXMgc2NyaXB0OyAkZHJvcCBzdGFuZHMgZm9yIHRoZQorIyBEUAorIwkkZHNjcCA9ICgkY2xhc3MqOCskZHJvcCoyKQorIworIyAgaWYgeW91IHVzZSBHUklPIGJ1ZmZlciBzaGFyaW5nLCB0aGVuIEdSRUQgcHJpb3JpdHkgaXMgc2V0IGFzIGZvbGxvd3M6CisjICAkZ3ByaW89JGRyb3ArMTsgCisjCisKKyRUQyA9ICIvdXNyL3NyYy9pcHJvdXRlMi1jdXJyZW50L3RjL3RjIjsKKyRERVYgPSAiZGV2IGxvIjsKKyRERVYgPSAiZGV2IGV0aDEiOworJERFViA9ICJkZXYgZXRoMCI7CisjIHRoZSBCRS1jbGFzcyBudW1iZXIKKyRiZWNsYXNzID0gIjUiOyAgCisKKyNHUklPIGJ1ZmZlciBzaGFyaW5nIG9uIG9yIG9mZj8KKyRHUklPID0gIiI7CiskR1JJTyA9ICJncmlvIjsKKyMgVGhlIGJhbmR3aWR0aCBvZiB5b3VyIGRldmljZQorJGxpbmVyYXRlPSIxME1iaXQiOworIyBUaGUgQkUgYW5kIEFGIHJhdGVzCislcmF0ZV90YWJsZT0oKTsKKyRiZXJhdGU9IjE1MDBLYml0IjsKKyRyYXRlX3RhYmxleyJBRjFyYXRlIn09IjE1MDBLYml0IjsKKyRyYXRlX3RhYmxleyJBRjJyYXRlIn09IjE1MDBLYml0IjsKKyRyYXRlX3RhYmxleyJBRjNyYXRlIn09IjE1MDBLYml0IjsKKyRyYXRlX3RhYmxleyJBRjRyYXRlIn09IjE1MDBLYml0IjsKKyMKKyMKKyMKK3ByaW50ICJcbiMgLS0tIEdlbmVyYWwgc2V0dXAgIC0tLVxuIjsKK3ByaW50ICIkVEMgcWRpc2MgYWRkICRERVYgaGFuZGxlIDE6MCByb290IGRzbWFyayBpbmRpY2VzIDY0IHNldF90Y19pbmRleFxuIjsKK3ByaW50ICIkVEMgZmlsdGVyIGFkZCAkREVWIHBhcmVudCAxOjAgcHJvdG9jb2wgaXAgcHJpbyAxIHRjaW5kZXggbWFzayAweGZjICIgLgorICAgInNoaWZ0IDIgcGFzc19vblxuIjsKKyAgICMic2hpZnQgMlxuIjsKK3ByaW50ICIkVEMgcWRpc2MgYWRkICRERVYgcGFyZW50IDE6MCBoYW5kbGUgMjowIGNicSBiYW5kd2lkdGggJGxpbmVyYXRlICIuCisgICJjZWxsIDggYXZwa3QgMTAwMCBtcHUgNjRcbiI7CitwcmludCAiJFRDIGZpbHRlciBhZGQgJERFViBwYXJlbnQgMjowIHByb3RvY29sIGlwIHByaW8gMSB0Y2luZGV4ICIuCisgICJtYXNrIDB4ZjAgc2hpZnQgNCBwYXNzX29uXG4iOworZm9yICRjbGFzcyAoMS4uNCkgeworICAgIHByaW50ICJcbiMgLS0tIEFGIENsYXNzICRjbGFzcyBzcGVjaWZpYyBzZXR1cC0tLVxuIjsKKyAgICAkQUZyYXRlPXNwcmludGYoIkFGJWRyYXRlIiwkY2xhc3MpOworICAgIHByaW50ICIkVEMgY2xhc3MgYWRkICRERVYgcGFyZW50IDI6MCBjbGFzc2lkIDI6JGNsYXNzIGNicSAiLgorICAgICAgImJhbmR3aWR0aCAkbGluZXJhdGUgcmF0ZSAkcmF0ZV90YWJsZXskQUZyYXRlfSBhdnBrdCAxMDAwIHByaW8gIi4KKyAgICAgICg2LSRjbGFzcykuIiBib3VuZGVkIGFsbG90IDE1MTQgd2VpZ2h0IDEgbWF4YnVyc3QgMjFcbiI7CisgICAgcHJpbnQgIiRUQyBmaWx0ZXIgYWRkICRERVYgcGFyZW50IDI6MCBwcm90b2NvbCBpcCBwcmlvIDEgaGFuZGxlICRjbGFzcyAiLgorICAgICAgInRjaW5kZXggY2xhc3NpZCAyOiRjbGFzc1xuIjsKKyAgICBwcmludCAiJFRDIHFkaXNjIGFkZCAkREVWIHBhcmVudCAyOiRjbGFzcyBncmVkIHNldHVwIERQcyAzIGRlZmF1bHQgMiAiLgorICAgICAgIiRHUklPXG4iOworIyAKKyMgcGVyIERQIHNldHVwCisjCisgICAgZm9yICRkcm9wICgxLi4zKSB7CisgICAgcHJpbnQgIlxuIyAtLS0gQUYgQ2xhc3MgJGNsYXNzIERQICRkcm9wLS0tXG4iOworCSRkc2NwID0gJGNsYXNzKjgrJGRyb3AqMjsKKwkkdGNpbmRleCA9IHNwcmludGYoIjEleCV4IiwkY2xhc3MsJGRyb3ApOworCXByaW50ICIkVEMgZmlsdGVyIGFkZCAkREVWIHBhcmVudCAxOjAgcHJvdG9jb2wgaXAgcHJpbyAxICIuCisJICAiaGFuZGxlICRkc2NwIHRjaW5kZXggY2xhc3NpZCAxOiR0Y2luZGV4XG4iOworCSRwcm9iID0gJGRyb3AqMC4wMjsKKyAgICAgICAgaWYgKCRHUklPKSB7CisJJGdwcmlvID0gJGRyb3ArMTsKKwlwcmludCAiJFRDIHFkaXNjIGNoYW5nZSAkREVWIHBhcmVudCAyOiRjbGFzcyBncmVkIGxpbWl0IDYwS0IgbWluIDE1S0IgIi4KKwkgICJtYXggNDVLQiBidXJzdCAyMCBhdnBrdCAxMDAwIGJhbmR3aWR0aCAkbGluZXJhdGUgRFAgJGRyb3AgIi4KKwkgICJwcm9iYWJpbGl0eSAkcHJvYiAiLgorICAgICAgICAgICJwcmlvICRncHJpb1xuIjsKKyAgICAgICAgfSBlbHNlIHsKKwlwcmludCAiJFRDIHFkaXNjIGNoYW5nZSAkREVWIHBhcmVudCAyOiRjbGFzcyBncmVkIGxpbWl0IDYwS0IgbWluIDE1S0IgIi4KKwkgICJtYXggNDVLQiBidXJzdCAyMCBhdnBrdCAxMDAwIGJhbmR3aWR0aCAkbGluZXJhdGUgRFAgJGRyb3AgIi4KKwkgICJwcm9iYWJpbGl0eSAkcHJvYiBcbiI7CisJfQorICAgIH0KK30KKyMKKyMKK3ByaW50ICJcbiMtLS0tLS1CRSBRdWV1ZSBzZXR1cC0tLS0tLVxuIjsKK3ByaW50ICIkVEMgZmlsdGVyIGFkZCAkREVWIHBhcmVudCAxOjAgcHJvdG9jb2wgaXAgcHJpbyAyICIuCisgICAgICAgICAgImhhbmRsZSAwIHRjaW5kZXggbWFzayAwIGNsYXNzaWQgMToxXG4iOworcHJpbnQgIiRUQyBjbGFzcyBhZGQgJERFViBwYXJlbnQgMjowIGNsYXNzaWQgMjokYmVjbGFzcyBjYnEgIi4KKyAgICAgICJiYW5kd2lkdGggJGxpbmVyYXRlIHJhdGUgJGJlcmF0ZSBhdnBrdCAxMDAwIHByaW8gNiAiIC4KKyAgICAgICJib3VuZGVkIGFsbG90IDE1MTQgd2VpZ2h0IDEgbWF4YnVyc3QgMjEgXG4iOworcHJpbnQgIiRUQyBmaWx0ZXIgYWRkICRERVYgcGFyZW50IDI6MCBwcm90b2NvbCBpcCBwcmlvIDEgaGFuZGxlIDAgdGNpbmRleCAiLgorICAiY2xhc3NpZCAyOjVcbiI7CitwcmludCAiJFRDIHFkaXNjIGFkZCAkREVWIHBhcmVudCAyOjUgcmVkIGxpbWl0IDYwS0IgbWluIDE1S0IgbWF4IDQ1S0IgIi4KKyAgImJ1cnN0IDIwIGF2cGt0IDEwMDAgYmFuZHdpZHRoICRsaW5lcmF0ZSBwcm9iYWJpbGl0eSAwLjRcbiI7CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9leGFtcGxlcy9kaWZmc2Vydi9lZi1wcmlvIGIvaXByb3V0ZTIvZXhhbXBsZXMvZGlmZnNlcnYvZWYtcHJpbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODYxMWJkCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvZXhhbXBsZXMvZGlmZnNlcnYvZWYtcHJpbwpAQCAtMCwwICsxLDI1IEBACisjIS91c3IvYmluL3BlcmwKKyRUQyA9ICIvcm9vdC9EUy02LWJldGEvaXByb3V0ZTItOTkwNTMwLWRzaW5nL3RjL3RjIjsKKyRERVYgPSAiZGV2IGV0aDEiOworJGVmcmF0ZT0iMS41TWJpdCI7CiskTVRVPSIxLjVrQiI7CitwcmludCAiJFRDIHFkaXNjIGFkZCAkREVWIGhhbmRsZSAxOjAgcm9vdCBkc21hcmsgaW5kaWNlcyA2NCBzZXRfdGNfaW5kZXhcbiI7CitwcmludCAiJFRDIGZpbHRlciBhZGQgJERFViBwYXJlbnQgMTowIHByb3RvY29sIGlwIHByaW8gMSB0Y2luZGV4ICIuCisgICJtYXNrIDB4ZmMgc2hpZnQgMlxuIjsKK3ByaW50ICIkVEMgcWRpc2MgYWRkICRERVYgcGFyZW50IDE6MCBoYW5kbGUgMjowIHByaW9cbiI7CisjCisjIEVGIGNsYXNzOiBNYXhpbXVtIGFib3V0IG9uZSBNVFUgc2l6ZWQgcGFja2V0IGFsbG93ZWQgb24gdGhlIHF1ZXVlCisjCitwcmludCAiJFRDIHFkaXNjIGFkZCAkREVWIHBhcmVudCAyOjEgdGJmIHJhdGUgJGVmcmF0ZSBidXJzdCAkTVRVIGxpbWl0IDEuNmtCXG4iOworcHJpbnQgIiRUQyBmaWx0ZXIgYWRkICRERVYgcGFyZW50IDI6MCBwcm90b2NvbCBpcCBwcmlvIDEgIi4KKwkgICJoYW5kbGUgMHgyZSB0Y2luZGV4IGNsYXNzaWQgMjoxIHBhc3Nfb25cbiI7CisjCisjIEJFIGNsYXNzCisjCitwcmludCAiI0JFIGNsYXNzKDI6MikgXG4iOworcHJpbnQgIiRUQyBxZGlzYyBhZGQgJERFViBwYXJlbnQgMjoyIHJlZCBsaW1pdCA2MEtCICIuCisJICAibWluIDE1S0IgbWF4IDQ1S0IgYnVyc3QgMjAgYXZwa3QgMTAwMCBiYW5kd2lkdGggMTBNYml0ICIuCisJICAicHJvYmFiaWxpdHkgMC40XG4iOworIworcHJpbnQgIiRUQyBmaWx0ZXIgYWRkICRERVYgcGFyZW50IDI6MCBwcm90b2NvbCBpcCBwcmlvIDIgIi4KKwkgICJoYW5kbGUgMCB0Y2luZGV4IG1hc2sgMCBjbGFzc2lkIDI6MiBwYXNzX29uXG4iOwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvZXhhbXBsZXMvZGlmZnNlcnYvZWZjYnEgYi9pcHJvdXRlMi9leGFtcGxlcy9kaWZmc2Vydi9lZmNicQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2M0MzdiCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvZXhhbXBsZXMvZGlmZnNlcnYvZWZjYnEKQEAgLTAsMCArMSwzMSBAQAorIyEvdXNyL2Jpbi9wZXJsCisjCiskVEMgPSAiL3Jvb3QvRFMtNi1iZXRhL2lwcm91dGUyLTk5MDUzMC1kc2luZy90Yy90YyI7CiskREVWID0gImRldiBldGgxIjsKK3ByaW50ICIkVEMgcWRpc2MgYWRkICRERVYgaGFuZGxlIDE6MCByb290IGRzbWFyayBpbmRpY2VzIDY0IHNldF90Y19pbmRleFxuIjsKK3ByaW50ICIkVEMgZmlsdGVyIGFkZCAkREVWIHBhcmVudCAxOjAgcHJvdG9jb2wgaXAgcHJpbyAxIHRjaW5kZXggIi4KKyAgIm1hc2sgMHhmYyBzaGlmdCAyXG4iOworcHJpbnQgIiRUQyBxZGlzYyBhZGQgJERFViBwYXJlbnQgMTowIGhhbmRsZSAyOjAgY2JxIGJhbmR3aWR0aCAiLgorCSIxME1iaXQgY2VsbCA4IGF2cGt0IDEwMDAgbXB1IDY0XG4iOworIworIyBFRiBjbGFzcworIworcHJpbnQgIiRUQyBjbGFzcyBhZGQgJERFViBwYXJlbnQgMjowIGNsYXNzaWQgMjoxIGNicSBiYW5kd2lkdGggIi4gCisJIjEwTWJpdCByYXRlIDE1MDBLYml0IGF2cGt0IDEwMDAgcHJpbyAxIGJvdW5kZWQgaXNvbGF0ZWQgIi4KKwkiYWxsb3QgMTUxNCB3ZWlnaHQgMSBtYXhidXJzdCAxMCBcbiI7CisjIHBhY2tldCBmaWZvIGZvciBFRj8KK3ByaW50ICIkVEMgcWRpc2MgYWRkICRERVYgcGFyZW50IDI6MSBwZmlmbyBsaW1pdCA1XG4iOworcHJpbnQgIiRUQyBmaWx0ZXIgYWRkICRERVYgcGFyZW50IDI6MCBwcm90b2NvbCBpcCBwcmlvIDEgIi4KKwkgICJoYW5kbGUgMHgyZSB0Y2luZGV4IGNsYXNzaWQgMjoxIHBhc3Nfb25cbiI7CisjCisjIEJFIGNsYXNzCisjCitwcmludCAiI0JFIGNsYXNzKDI6MikgXG4iOworcHJpbnQgIiRUQyBjbGFzcyBhZGQgJERFViBwYXJlbnQgMjowIGNsYXNzaWQgMjoyIGNicSBiYW5kd2lkdGggIi4gCisJIjEwTWJpdCByYXRlIDVNYml0IGF2cGt0IDEwMDAgcHJpbyA3IGFsbG90IDE1MTQgd2VpZ2h0IDEgIi4KKwkibWF4YnVyc3QgMjEgYm9ycm93IHNwbGl0IDI6MCBkZWZtYXAgMHhmZmZmIFxuIjsKK3ByaW50ICIkVEMgcWRpc2MgYWRkICRERVYgcGFyZW50IDI6MiByZWQgbGltaXQgNjBLQiAiLgorCSAgIm1pbiAxNUtCIG1heCA0NUtCIGJ1cnN0IDIwIGF2cGt0IDEwMDAgYmFuZHdpZHRoIDEwTWJpdCAiLgorCSAgInByb2JhYmlsaXR5IDAuNFxuIjsKK3ByaW50ICIkVEMgZmlsdGVyIGFkZCAkREVWIHBhcmVudCAyOjAgcHJvdG9jb2wgaXAgcHJpbyAyICIuCisJICAiaGFuZGxlIDAgdGNpbmRleCBtYXNrIDAgY2xhc3NpZCAyOjIgcGFzc19vblxuIjsKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2V4YW1wbGVzL2RpZmZzZXJ2L3JlZ3Jlc3Npb24tdGVzdGluZyBiL2lwcm91dGUyL2V4YW1wbGVzL2RpZmZzZXJ2L3JlZ3Jlc3Npb24tdGVzdGluZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWM3MDVjCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvZXhhbXBsZXMvZGlmZnNlcnYvcmVncmVzc2lvbi10ZXN0aW5nCkBAIC0wLDAgKzEsMTI1IEBACisKK1RoZXNlIHdlcmUgdGhlIHRlc3RzIGRvbmUgdG8gdmFsaWRhdGUgdGhlIERpZmZzZXJ2IHNjcmlwdHMuCitUaGlzIGRvY3VtZW50IHdpbGwgYmUgdXBkYXRlZCBjb250aW5vdXNseS4gSWYgeW91IGRvIG1vcmUKK3Rob3JvdWdoIHZhbGlkYXRpb24gdGVzdGluZyBwbGVhc2UgcG9zdCB0aGUgZGV0YWlscyB0byB0aGUKK2RpZmZzZXJ2IG1haWxpbmcgbGlzdC4gCitOZXZlcnRoZWxlc3MsIHRoZXNlIHRlc3RzIHNob3VsZCBzZXJ2ZSBmb3IgYmFzaWMgdmFsaWRhdGlvbi4KKworQUZDQlEsIEVGQ0JRLCBFRlBSSU8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZ2VuZXJhdGUgYWxsIHBvc3NpYmxlIERTQ1BzIGFuZCBvYnNlcnZlIHRoYXQgdGhleSAKK2dldCBzZW50IHRvIHRoZSBwcm9wZXIgY2xhc3Nlcy4gSW4gdGhlIGNhc2Ugb2YgQUYgYWxzbwordG8gdGhlIGNvcnJlY3QgVmlydHVhbCBRdWV1ZXMuCisKK0VkZ2UxCistLS0tLQorZ2VuZXJhdGUgVE9TIHZhbHVlcyAweDAsMHgxMCwweGJiIGVhY2ggd2l0aCBJUCBhZGRyZXNzZXMKKzEwLjIuMC4yNCAobWFyayAxKSwgMTAuMi4wLjMgKG1hcmsyKSBhbmQgMTAuMi4wLjMwIChtYXJrIDMpCithbmQgb2JzZXJ2ZSB0aGF0IHRoZXkgZ2V0IG1hcmtlZCBhcyBleHBlY3RlZC4KKworRWRnZTIKKy0tLS0tCisKKy1SZXBlYXQgdGhlIHRlc3RzIGluIEVkZ2UxCistZnRwIHdpdGggZGF0YSBkaXJlY3Rpb24gZnJvbSAxMC4yLjAuMgorCSpvYnNlcnZlIHRoYXQgdGhlIG1ldGVyaW5nL3BvbGljaW5nIHdvcmtzIGNvcnJlY3RseSAoYW5kIHRoZSBtYXJraW5nCisJYXMgd2VsbCkuIEluIHRoaXMgY2FzZSB0aGUgbWFyayB1c2VkIHdpbGwgYmUgMworCitFZGdlMzEtY2ItY2hhaW5zCistLS0tLS0tLS0tLS0tLS0tCisKKy1mdHAgd2l0aCBkYXRhIGRpcmVjdGlvbiBmcm9tIDEwLjIuMC4yCisKKwkqb2JzZXJ2ZSB0aGF0IHRoZSBtZXRlcmluZy9wb2xpY2luZyB3b3JrcyBjb3JyZWN0bHkgKGFuZCB0aGUgbWFya2luZworCWFzIHdlbGwpLiBJbiB0aGlzIGNhc2UgdGhlIG1hcmsgdXNlZCB3aWxsIGJlIDEuIAorCisJTWV0ZXJpbmc6IFRoZSBkYXRhIHRocm91Z2hwdXQgc2hvdWxkIG5vdCBleGNlZWQgMipDSVIxICsgMipDSVIyCisJd2hpY2ggaXMgcm91Z2hseTogNW1icHMKKworCU1hcmtpbmc6IHRoZSBzaG91bGQgYmUgYSB2YXJpYXRpb24gb2YgbWFya2VkIHBhY2tldHM6CisJQUY0MShUT1M9MHg4OCkgQUY0MigweDkwKSBBRjQzKDB4OTgpIGFuZCBCRSAoMHgwKQorCitNb3JlIHRlc3RzIHJlcXVpcmVkIHRvIHNlZSB0aGUgaW50ZXJhY3Rpb24gb2Ygc2V2ZXJhbCBzb3VyY2VzIChvdGhlcgordGhhbiBzdWJuZXQgMTAuMi4wLjAvMjQpLgorCitFZGdlMzEtY2EtdTMyCistLS0tLS0tLS0tLS0tLQorCitHZW5lcmF0ZSBkYXRhIHVzaW5nIG1vZGlmaWVkIHRjcGJsYXN0IGZyb20gMTAuMi4wLjIgKGJlaGluZCBldGgyKSB0byB0aGUgCitkaXNjYXJkIHBvcnQgb2YgMTAuMS4wLjIgKGJlaGluZCBldGgxKQorCisxKSBnZW5lcmF0ZSB3aXRoIHNyYyB0b3MgPSAweDg4CisJTWV0ZXJpbmc6IEFsbG9jYXRlZCB0aHJvdWdocHV0IHNob3VsZCBub3QgZXhjZWVkIDIqQ0lSMSArIDIqQ0lSMgorCWFwcHJveGltYXRlbHkgNW1icHMKKwlNYXJraW5nOiBTaG91bGQgdmFyeSBiZXR3ZWVuIDB4ODgsMHg5MCwweDk4IGFuZCAweDAKKworMikgZ2VuZXJhdGUgd2l0aCBzcmMgdG9zID0gMHg5MAorCU1ldGVyaW5nOiBBbGxvY2F0ZWQgdGhyb3VnaHB1dCBzaG91bGQgbm90IGV4Y2VlZCBDSVIxICsgMipDSVIyCisJYXBwcm94aW1hdGVseSAzLjVtYnBzCisJTWFya2luZzogU2hvdWxkIHZhcnkgYmV0d2VlbiAweDkwLDB4OTggYW5kIDB4MAorCiszKSBnZW5lcmF0ZSB3aXRoIHNyYyB0b3MgPSAweDk4CisJTWV0ZXJpbmc6IEFsbG9jYXRlZCB0aHJvdWdocHV0IHNob3VsZCBub3QgZXhjZWVkIENJUjEgKyBDSVIyCisJYXBwcm94aW1hdGVseSAyLjVtYnBzCisJTWFya2luZzogU2hvdWxkIHZhcnkgYmV0d2VlbiAweDk4IGFuZCAweDAKKworNCkgZ2VuZXJhdGUgd2l0aCBzcmMgdG9zIGFueSBvdGhlciB0aGFuIHRoZSBhYm92ZQorCU1ldGVyaW5nOiBBbGxvY2F0ZWQgdGhyb3VnaHB1dCBzaG91bGQgbm90IGV4Y2VlZCBDSVIxIAorCWFwcHJveGltYXRlbHkgMS41bWJwcworCU1hcmtpbmc6IFNob3VsZCBiZSBjb25zaXN0ZW50IGF0IDB4MAorCitUT0RPOiBUZXN0aW5nIG9uIGhvdyBlYWNoIGNvbG9yIHNoYXJlcyB3aGVuIGFsbCA0IHR5cGVzIG9mIHBhY2tldHMKK2FyZSBnb2luZyB0aHJvdWdoIHRoZSBlZGdlIGRldmljZQorCitFZGdlMzItY2ItdTMyLCBFZGdlMzItY2ItY2hhaW5zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy1mdHAgd2l0aCBkYXRhIGRpcmVjdGlvbiBmcm9tIDEwLjIuMC4yCisKKwkqb2JzZXJ2ZSB0aGF0IHRoZSBtZXRlcmluZy9wb2xpY2luZyB3b3JrcyBjb3JyZWN0bHkgKGFuZCB0aGUgbWFya2luZworCWFzIHdlbGwpLiAKKworCU1ldGVyaW5nOiAKKyAgICAgICAgVGhlIGRhdGEgdGhyb3VnaHB1dCBzaG91bGQgbm90IGV4Y2VlZCAyKkNJUjEgKyAyKkNJUjIKKwkrIDIqUElSMiArIFBJUjEgZm9yIHUzMiB3aGljaCBpcyByb3VnaGx5OiA2bWJwcworICAgICAgICBUaGUgZGF0YSB0aHJvdWdocHV0IHNob3VsZCBub3QgZXhjZWVkIDIqQ0lSMSArIDUqQ0lSMgorCWZvciBjaGFpbnMgd2hpY2ggaXMgcm91Z2hseTogNm1icHMKKworCU1hcmtpbmc6IHRoZSBzaG91bGQgYmUgYSB2YXJpYXRpb24gb2YgbWFya2VkIHBhY2tldHM6CisJQUY0MShUT1M9MHg4OCkgQUY0MigweDkwKSBBRjQzKDB4OTgpIGFuZCBCRSAoMHgwKQorCitUT0RPOgorLU1vcmUgdGVzdHMgcmVxdWlyZWQgdG8gc2VlIHRoZSBpbnRlcmFjdGlvbiBvZiBzZXZlcmFsIHNvdXJjZXMgKG90aGVyCit0aGFuIHN1Ym5ldCAxMC4yLjAuMC8yNCkuCistTW9yZSB0ZXN0cyBuZWVkZWQgdG8gY2FwdHVyZSBzdGF0cyBvbiBob3cgbWFueSB0aW1lcyB0aGUgQ0lSIHdhcyBleGNlZWRlZAorYnV0IHRoZSBkYXRhIHdhcyBub3QgcmVtYXJrZWQgZXRjLgorCitFZGdlMzItY2EtdTMyCistLS0tLS0tLS0tLS0tLQorCitHZW5lcmF0ZSBkYXRhIHVzaW5nIG1vZGlmaWVkIHRjcGJsYXN0IGZyb20gMTAuMi4wLjIgKGJlaGluZCBldGgyKSB0byB0aGUgCitkaXNjYXJkIHBvcnQgb2YgMTAuMS4wLjIgKGJlaGluZCBldGgxKQorCisxKSBnZW5lcmF0ZSB3aXRoIHNyYyB0b3MgPSAweDg4CisJTWV0ZXJpbmc6IEFsbG9jYXRlZCB0aHJvdWdocHV0IHNob3VsZCBub3QgZXhjZWVkIDIqQ0lSMSArIDIqQ0lSMgorCStQSVIxIC0tIGFwcHJveGltYXRlbHkgNG1icHMKKwlNYXJraW5nOiBTaG91bGQgdmFyeSBiZXR3ZWVuIDB4ODgsMHg5MCwweDk4IGFuZCAweDAKKworMikgZ2VuZXJhdGUgd2l0aCBzcmMgdG9zID0gMHg5MAorCU1ldGVyaW5nOiBBbGxvY2F0ZWQgdGhyb3VnaHB1dCBzaG91bGQgbm90IGV4Y2VlZCBDSVIxICsgMipDSVIyCisJKyAyKiBQSVIyIGFwcHJveGltYXRlbHkgM21icHMKKwlNYXJraW5nOiBTaG91bGQgdmFyeSBiZXR3ZWVuIDB4OTAsMHg5OCBhbmQgMHgwCisKKzMpIGdlbmVyYXRlIHdpdGggc3JjIHRvcyA9IDB4OTgKKwlNZXRlcmluZzogQWxsb2NhdGVkIHRocm91Z2hwdXQgc2hvdWxkIG5vdCBleGNlZWQgUElSMSsgQ0lSMSArIENJUjIKKwlhcHByb3hpbWF0ZWx5IDIuNW1icHMKKwlNYXJraW5nOiBTaG91bGQgdmFyeSBiZXR3ZWVuIDB4OTggYW5kIDB4MAorCis0KSBnZW5lcmF0ZSB3aXRoIHNyYyB0b3MgYW55IG90aGVyIHRoYW4gdGhlIGFib3ZlCisJTWV0ZXJpbmc6IEFsbG9jYXRlZCB0aHJvdWdocHV0IHNob3VsZCBub3QgZXhjZWVkIENJUjEgCisJYXBwcm94aW1hdGVseSAxbWJwcworCU1hcmtpbmc6IFNob3VsZCBiZSBjb25zaXN0ZW50IGF0IDB4MAorCitUT0RPOiBUZXN0aW5nIG9uIGhvdyBlYWNoIGNvbG9yIHNoYXJlcyB3aGVuIGFsbCA0IHR5cGVzIG9mIHBhY2tldHMKK2FyZSBnb2luZyB0aHJvdWdoIHRoZSBlZGdlIGRldmljZQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvZXhhbXBsZXMvZ2FpY29uZiBiL2lwcm91dGUyL2V4YW1wbGVzL2dhaWNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1MjkyYgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2V4YW1wbGVzL2dhaWNvbmYKQEAgLTAsMCArMSwxMzQgQEAKKyMhL2Jpbi9zaAorCisjCisjIFNldHVwIGFkZHJlc3MgbGFiZWwgZnJvbSAvZXRjL2dhaS5jb25mCisjCisjIFdyaXR0ZW4gYnkgWU9TSElGVUpJIEhpZGVha2kgPHlvc2hmdWppQGxpbnV4LWlwdjYub3JnPiwgMjAxMC4KKyMKKworSVA9aXAKK0RFRkFVTFRfR0FJQ09ORj0vZXRjL2dhaS5jb25mCit2ZXJib3NlPQorZGVidWc9CisKK2Z1bmN0aW9uIHJ1biAoKQoreworCWlmIFsgeCIkdmVyYm9zZSIgIT0geCIiIF07IHRoZW4KKwkJZWNobyAiJEAiCisJZmkKKwlpZiBbIHgiJGRlYnVnIiA9IHgiIiBdOyB0aGVuCisJCSIkQCIKKwlmaQorfQorCitmdW5jdGlvbiBkb19sb2FkX2NvbmZpZyAoKQoreworCWZpbGU9JDE7IHNoaWZ0CisJZmx1c2g9MQorCWNhdCAkZmlsZSB8IHdoaWxlIHJlYWQgY29tbWFuZCBwcmVmaXggbGFiZWw7IGRvCisJCWlmIFsgeCIkY29tbWFuZCIgPSB4IiNsYWJlbCIgXTsgdGhlbgorCQkJaWYgWyAke2ZsdXNofSA9IDEgXTsgdGhlbgorCQkJCXJ1biAke0lQfSAtNiBhZGRybGFiZWwgZmx1c2gKKwkJCQlmbHVzaD0wCisJCQlmaQorCQkJcnVuICR7SVB9IC02IGFkZHJsYWJlbCBhZGQgcHJlZml4ICRwcmVmaXggbGFiZWwgJGxhYmVsCisJCWZpCisJZG9uZQorfQorCitmdW5jdGlvbiBkb19saXN0X2NvbmZpZyAoKQoreworCSR7SVB9IC02IGFkZHJsYWJlbCBsaXN0IHwgd2hpbGUgcmVhZCBwIHBmeCBsIGxibDsgZG8KKwkJZWNobyBsYWJlbCAke3BmeH0gJHtsYmx9CisJZG9uZQorfQorCitmdW5jdGlvbiBoZWxwICgpCit7CisJZWNobyAiVXNhZ2U6ICQwIFstdl0gey0tbGlzdCB8IC0tY29uZmlnIFsgJHtERUZBVUxUX0dBSUNPTkZ9IF0gfCAtLWRlZmF1bHR9IgorCWV4aXQgMQorfQorCitURU1QPWBnZXRvcHQgLW8gYzo6ZGx2IC1sIGNvbmZpZzo6LGRlZmF1bHQsbGlzdCx2ZXJib3NlIC1uIGdhaWNvbmYgLS0gIiRAImAKKworaWYgWyAkPyAhPSAwIF07IHRoZW4KKwllY2hvICJUZXJtaW5hdGluZy4uLiIgPiYyCisJZXhpdCAxCitmaQorCitURU1QRklMRT1gbWt0ZW1wYAorCitldmFsIHNldCAtLSAiJFRFTVAiCisKK3doaWxlIHRydWUgOyBkbworCWNhc2UgIiQxIiBpbgorCQktY3wtLWNvbmZpZykKKwkJCWlmIFsgeCIkY21kIiAhPSB4IiIgXTsgdGhlbgorCQkJCWhlbHAKKwkJCWZpCisJCQljYXNlICIkMiIgaW4KKwkJCSIiKQlnYWlfY29uZj0iJHtERUZBVUxUX0dBSUNPTkZ9IgorCQkJCXNoaWZ0IDIKKwkJCQk7OworCQkJKikJZ2FpX2NvbmY9IiQyIgorCQkJCXNoaWZ0IDIKKwkJCWVzYWMKKwkJCWNtZD1jb25maWcKKwkJCTs7CisJCS1kfC0tZGVmYXVsdCkKKwkJCWlmIFsgeCIkY21kIiAhPSB4IiIgXTsgdGhlbgorCQkJCWhlbHAKKwkJCWZpCisJCQlnYWlfY29uZj0ke1RFTVBGSUxFfQorCQkJY21kPWNvbmZpZworCQkJOzsKKwkJLWx8LS1saXN0KQorCQkJaWYgWyB4IiRjbWQiICE9IHgiIiBdOyB0aGVuCisJCQkJaGVscAorCQkJZmkKKwkJCWNtZD1saXN0CisJCQlzaGlmdAorCQkJOzsKKwkJLXYpCisJCQl2ZXJib3NlPTEKKwkJCXNoaWZ0CisJCQk7OworCQktLSkKKwkJCXNoaWZ0OworCQkJYnJlYWsKKwkJCTs7CisJCSopCisJCQllY2hvICJJbnRlcm5hbCBlcnJvciEiID4mMgorCQkJZXhpdCAxCisJCQk7OworCWVzYWMKK2RvbmUKKworY2FzZSAiJGNtZCIgaW4KKwljb25maWcpCisJCWlmIFsgeCIkZ2FpX2NvbmYiID0geCIke1RFTVBGSUxFfSIgXTsgdGhlbgorCQkJc2VkIC1lICdzL15bWzpzcGFjZTpdXSovLycgPDxFTkRfT0ZfREVGQVVMVCA+JHtURU1QRklMRX0KKwkJCQlsYWJlbCA6OjEvMTI4ICAgICAgIDAKKwkJCQlsYWJlbCA6Oi8wICAgICAgICAgIDEKKwkJCQlsYWJlbCAyMDAyOjovMTYgICAgIDIKKwkJCQlsYWJlbCA6Oi85NiAgICAgICAgIDMKKwkJCQlsYWJlbCA6OmZmZmY6MDowLzk2IDQKKwkJCQlsYWJlbCBmZWMwOjovMTAgICAgIDUKKwkJCQlsYWJlbCBmYzAwOjovNyAgICAgIDYKKwkJCQlsYWJlbCAyMDAxOjA6Oi8zMiAgIDcKK0VORF9PRl9ERUZBVUxUCisJCWZpCisJCWRvX2xvYWRfY29uZmlnICIkZ2FpX2NvbmYiCisJCTs7CisJbGlzdCkKKwkJZG9fbGlzdF9jb25maWcKKwkJOzsKKwkqKQorCQloZWxwCisJCTs7Citlc2FjCisKK3JtIC1mICIke1RFTVBGSUxFfSIKKworZXhpdCAwCisKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2dlbmwvTWFrZWZpbGUgYi9pcHJvdXRlMi9nZW5sL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZDFmMjYKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9nZW5sL01ha2VmaWxlCkBAIC0wLDAgKzEsNDAgQEAKK0dFTkxPQko9Z2VubC5vCisKK2luY2x1ZGUgLi4vQ29uZmlnCitTSEFSRURfTElCUyA/PSB5CisKK0NGTEFHUyArPSAtZm5vLXN0cmljdC1hbGlhc2luZworCitHRU5MTU9EVUxFUyA6PQorR0VOTE1PRFVMRVMgKz0gY3RybC5vCisKK0dFTkxPQkogKz0gJChHRU5MTU9EVUxFUykKKworR0VOTExJQiA6PQorCitpZmVxICgkKFNIQVJFRF9MSUJTKSx5KQorTERGTEFHUyArPSAtV2wsLWV4cG9ydC1keW5hbWljCitMRExJQlMgICs9IC1sbSAtbGRsCitlbmRpZgorCithbGw6IGdlbmwKKworZ2VubDogJChHRU5MT0JKKSAkKExJQk5FVExJTkspICQoTElCVVRJTCkgJChHRU5MTElCKQorCitpbnN0YWxsOiBhbGwKKwlpbnN0YWxsIC1tIDA3NTUgZ2VubCAkKERFU1RESVIpJChTQklORElSKQorCitjbGVhbjoKKwlybSAtZiAkKEdFTkxPQkopICQoR0VOTExJQikgZ2VubAorCitpZm5lcSAoJChTSEFSRURfTElCUykseSkKKworZ2VubDogc3RhdGljLXN5bXMubworc3RhdGljLXN5bXMubzogc3RhdGljLXN5bXMuaAorc3RhdGljLXN5bXMuaDogJCh3aWxkY2FyZCAqLmMpCisJZmlsZXM9IiReIiA7IFwKKwlmb3IgcyBpbiBgZ3JlcCAtQiAzICdcPGRsc3ltJyAkJGZpbGVzIHwgc2VkIC1uICcvc25wcmludGYve3M6LioiXChbXiJdKlwpIi4qOlwxOjtzOiVzOjo7cH0nYCA7IGRvIFwKKwkJc2VkIC1uICcvJyQkcydbXiBdKiA9L3tzOi4qIFwoW14gXSonJCRzJ1teIF0qXCkgLio6ZXh0ZXJuIGNoYXIgXDFbXSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7IGlmICghc3RyY21wKHN5bSwgIlwxIikpIHJldHVybiBcMTs6O3B9JyAkJGZpbGVzIDsgXAorCWRvbmUgPiAkQAorCitlbmRpZgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvZ2VubC9jdHJsLmMgYi9pcHJvdXRlMi9nZW5sL2N0cmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2E4ODc4Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvZ2VubC9jdHJsLmMKQEAgLTAsMCArMSw0MTkgQEAKKy8qCisgKiBjdHJsLmMJZ2VuZXJpYyBuZXRsaW5rIGNvbnRyb2xsZXIKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJSiBIYWRpIFNhbGltIChoYWRpQGN5YmVydXMuY2EpCisgKgkJSm9oYW5uZXMgQmVyZyAoam9oYW5uZXNAc2lwc29sdXRpb25zLm5ldCkKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgImdlbmxfdXRpbHMuaCIKKworI2RlZmluZSBHRU5MX01BWF9GQU1fT1BTCTI1NgorI2RlZmluZSBHRU5MX01BWF9GQU1fR1JQUwkyNTYKKworc3RhdGljIGludCB1c2FnZSh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCJVc2FnZTogY3RybCA8Q01EPlxuIiBcCisJCSAgICAgICAiQ01EICAgOj0gZ2V0IDxQQVJNUz4gfCBsaXN0IHwgbW9uaXRvclxuIiBcCisJCSAgICAgICAiUEFSTVMgOj0gbmFtZSA8bmFtZT4gfCBpZCA8aWQ+XG4iIFwKKwkJICAgICAgICJFeGFtcGxlczpcbiIgXAorCQkgICAgICAgIlx0Y3RybCBsc1xuIiBcCisJCSAgICAgICAiXHRjdHJsIG1vbml0b3JcbiIgXAorCQkgICAgICAgIlx0Y3RybCBnZXQgbmFtZSBmb29iYXJcbiIgXAorCQkgICAgICAgIlx0Y3RybCBnZXQgaWQgMHhGXG4iKTsKKwlyZXR1cm4gLTE7Cit9CisKK2ludCBnZW5sX2N0cmxfcmVzb2x2ZV9mYW1pbHkoY29uc3QgY2hhciAqZmFtaWx5KQoreworCXN0cnVjdCBydG5sX2hhbmRsZSBydGg7CisJc3RydWN0IG5sbXNnaGRyICpubGg7CisJc3RydWN0IGdlbmxtc2doZHIgKmdoZHI7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyICAgICAgICAgbjsKKwkJY2hhciAgICAgICAgICAgICAgICAgICAgYnVmWzQwOTZdOworCX0gcmVxOworCisJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKworCW5saCA9ICZyZXEubjsKKwlubGgtPm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChHRU5MX0hEUkxFTik7CisJbmxoLT5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1QgfCBOTE1fRl9BQ0s7CisJbmxoLT5ubG1zZ190eXBlID0gR0VOTF9JRF9DVFJMOworCisJZ2hkciA9IE5MTVNHX0RBVEEoJnJlcS5uKTsKKwlnaGRyLT5jbWQgPSBDVFJMX0NNRF9HRVRGQU1JTFk7CisKKwlpZiAocnRubF9vcGVuX2J5cHJvdG8oJnJ0aCwgMCwgTkVUTElOS19HRU5FUklDKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgb3BlbiBnZW5lcmljIG5ldGxpbmsgc29ja2V0XG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlhZGRhdHRyX2wobmxoLCAxMjgsIENUUkxfQVRUUl9GQU1JTFlfTkFNRSwgZmFtaWx5LCBzdHJsZW4oZmFtaWx5KSArIDEpOworCisJaWYgKHJ0bmxfdGFsaygmcnRoLCBubGgsIG5saCwgc2l6ZW9mKHJlcSkpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHRhbGtpbmcgdG8gdGhlIGtlcm5lbFxuIik7CisJCWdvdG8gZXJyb3V0OworCX0KKworCXsKKwkJc3RydWN0IHJ0YXR0ciAqdGJbQ1RSTF9BVFRSX01BWCArIDFdOworCQlzdHJ1Y3QgZ2VubG1zZ2hkciAqZ2hkciA9IE5MTVNHX0RBVEEobmxoKTsKKwkJaW50IGxlbiA9IG5saC0+bmxtc2dfbGVuOworCQlzdHJ1Y3QgcnRhdHRyICphdHRyczsKKworCQlpZiAobmxoLT5ubG1zZ190eXBlICE9ICBHRU5MX0lEX0NUUkwpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiTm90IGEgY29udHJvbGxlciBtZXNzYWdlLCBubG1zZ19sZW49JWQgIgorCQkJCSJubG1zZ190eXBlPTB4JXhcbiIsIG5saC0+bmxtc2dfbGVuLCBubGgtPm5sbXNnX3R5cGUpOworCQkJZ290byBlcnJvdXQ7CisJCX0KKworCQlpZiAoZ2hkci0+Y21kICE9IENUUkxfQ01EX05FV0ZBTUlMWSkgeworCQkJZnByaW50ZihzdGRlcnIsICJVbmtub3duIGNvbnRyb2xsZXIgY29tbWFuZCAlZFxuIiwgZ2hkci0+Y21kKTsKKwkJCWdvdG8gZXJyb3V0OworCQl9CisKKwkJbGVuIC09IE5MTVNHX0xFTkdUSChHRU5MX0hEUkxFTik7CisKKwkJaWYgKGxlbiA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAid3JvbmcgY29udHJvbGxlciBtZXNzYWdlIGxlbiAlZFxuIiwgbGVuKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWF0dHJzID0gKHN0cnVjdCBydGF0dHIgKikgKChjaGFyICopIGdoZHIgKyBHRU5MX0hEUkxFTik7CisJCXBhcnNlX3J0YXR0cih0YiwgQ1RSTF9BVFRSX01BWCwgYXR0cnMsIGxlbik7CisKKwkJaWYgKHRiW0NUUkxfQVRUUl9GQU1JTFlfSURdID09IE5VTEwpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBmYW1pbHkgaWQgVExWXG4iKTsKKwkJCWdvdG8gZXJyb3V0OworCQl9CisKKwkJcmV0ID0gcnRhX2dldGF0dHJfdTE2KHRiW0NUUkxfQVRUUl9GQU1JTFlfSURdKTsKKwl9CisKK2Vycm91dDoKKwlydG5sX2Nsb3NlKCZydGgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2N0cmxfY21kX2ZsYWdzKEZJTEUgKmZwLCBfX3UzMiBmbCkKK3sKKwlmcHJpbnRmKGZwLCAiXG5cdFx0Q2FwYWJpbGl0aWVzICgweCV4KTpcbiAiLCBmbCk7CisJaWYgKCFmbCkgeworCQlmcHJpbnRmKGZwLCAiXG4iKTsKKwkJcmV0dXJuOworCX0KKwlmcHJpbnRmKGZwLCAiXHRcdCAiKTsKKworCWlmIChmbCAmIEdFTkxfQURNSU5fUEVSTSkKKwkJZnByaW50ZihmcCwgIiByZXF1aXJlcyBhZG1pbiBwZXJtaXNzaW9uOyIpOworCWlmIChmbCAmIEdFTkxfQ01EX0NBUF9ETykKKwkJZnByaW50ZihmcCwgIiBjYW4gZG9pdDsiKTsKKwlpZiAoZmwgJiBHRU5MX0NNRF9DQVBfRFVNUCkKKwkJZnByaW50ZihmcCwgIiBjYW4gZHVtcGl0OyIpOworCWlmIChmbCAmIEdFTkxfQ01EX0NBUF9IQVNQT0wpCisJCWZwcmludGYoZnAsICIgaGFzIHBvbGljeSIpOworCisJZnByaW50ZihmcCwgIlxuIik7Cit9CisJCitzdGF0aWMgaW50IHByaW50X2N0cmxfY21kcyhGSUxFICpmcCwgc3RydWN0IHJ0YXR0ciAqYXJnLCBfX3UzMiBjdHJsX3ZlcikKK3sKKwlzdHJ1Y3QgcnRhdHRyICp0YltDVFJMX0FUVFJfT1BfTUFYICsgMV07CisKKwlpZiAoYXJnID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBhcnNlX3J0YXR0cl9uZXN0ZWQodGIsIENUUkxfQVRUUl9PUF9NQVgsIGFyZyk7CisJaWYgKHRiW0NUUkxfQVRUUl9PUF9JRF0pIHsKKwkJX191MzIgKmlkID0gUlRBX0RBVEEodGJbQ1RSTF9BVFRSX09QX0lEXSk7CisJCWZwcmludGYoZnAsICIgSUQtMHgleCAiLCppZCk7CisJfQorCS8qIHdlIGFyZSBvbmx5IGdvbm5hIGRvIHRoaXMgZm9yIG5ld2VyIHZlcnNpb24gb2YgdGhlIGNvbnRyb2xsZXIgKi8KKwlpZiAodGJbQ1RSTF9BVFRSX09QX0ZMQUdTXSAmJiBjdHJsX3ZlciA+PSAweDIpIHsKKwkJX191MzIgKmZsID0gUlRBX0RBVEEodGJbQ1RSTF9BVFRSX09QX0ZMQUdTXSk7CisJCXByaW50X2N0cmxfY21kX2ZsYWdzKGZwLCAqZmwpOworCX0KKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IHByaW50X2N0cmxfZ3JwKEZJTEUgKmZwLCBzdHJ1Y3QgcnRhdHRyICphcmcsIF9fdTMyIGN0cmxfdmVyKQoreworCXN0cnVjdCBydGF0dHIgKnRiW0NUUkxfQVRUUl9NQ0FTVF9HUlBfTUFYICsgMV07CisKKwlpZiAoYXJnID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBhcnNlX3J0YXR0cl9uZXN0ZWQodGIsIENUUkxfQVRUUl9NQ0FTVF9HUlBfTUFYLCBhcmcpOworCWlmICh0YlsyXSkgeworCQlfX3UzMiAqaWQgPSBSVEFfREFUQSh0YltDVFJMX0FUVFJfTUNBU1RfR1JQX0lEXSk7CisJCWZwcmludGYoZnAsICIgSUQtMHgleCAiLCppZCk7CisJfQorCWlmICh0YlsxXSkgeworCQljaGFyICpuYW1lID0gUlRBX0RBVEEodGJbQ1RSTF9BVFRSX01DQVNUX0dSUF9OQU1FXSk7CisJCWZwcmludGYoZnAsICIgbmFtZTogJXMgIiwgbmFtZSk7CisJfQorCXJldHVybiAwOworCit9CisKKy8qCisgKiBUaGUgY29udHJvbGxlciBzZW5kcyBvbmUgbmxtc2cgcGVyIGZhbWlseQorKi8KK3N0YXRpYyBpbnQgcHJpbnRfY3RybChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobywKKwkJICAgICAgc3RydWN0IHJ0bmxfY3RybF9kYXRhICpjdHJsLAorCQkgICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcnRhdHRyICp0YltDVFJMX0FUVFJfTUFYICsgMV07CisJc3RydWN0IGdlbmxtc2doZHIgKmdoZHIgPSBOTE1TR19EQVRBKG4pOworCWludCBsZW4gPSBuLT5ubG1zZ19sZW47CisJc3RydWN0IHJ0YXR0ciAqYXR0cnM7CisJRklMRSAqZnAgPSAoRklMRSAqKSBhcmc7CisJX191MzIgY3RybF92ID0gMHgxOworCisJaWYgKG4tPm5sbXNnX3R5cGUgIT0gIEdFTkxfSURfQ1RSTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vdCBhIGNvbnRyb2xsZXIgbWVzc2FnZSwgbmxtc2dfbGVuPSVkICIKKwkJCSJubG1zZ190eXBlPTB4JXhcbiIsIG4tPm5sbXNnX2xlbiwgbi0+bmxtc2dfdHlwZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChnaGRyLT5jbWQgIT0gQ1RSTF9DTURfR0VURkFNSUxZICYmCisJICAgIGdoZHItPmNtZCAhPSBDVFJMX0NNRF9ERUxGQU1JTFkgJiYKKwkgICAgZ2hkci0+Y21kICE9IENUUkxfQ01EX05FV0ZBTUlMWSAmJgorCSAgICBnaGRyLT5jbWQgIT0gQ1RSTF9DTURfTkVXTUNBU1RfR1JQICYmCisJICAgIGdoZHItPmNtZCAhPSBDVFJMX0NNRF9ERUxNQ0FTVF9HUlApIHsKKwkJZnByaW50ZihzdGRlcnIsICJVbmtub3duIGNvbnRyb2xsZXIgY29tbWFuZCAlZFxuIiwgZ2hkci0+Y21kKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbGVuIC09IE5MTVNHX0xFTkdUSChHRU5MX0hEUkxFTik7CisKKwlpZiAobGVuIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIndyb25nIGNvbnRyb2xsZXIgbWVzc2FnZSBsZW4gJWRcbiIsIGxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlhdHRycyA9IChzdHJ1Y3QgcnRhdHRyICopICgoY2hhciAqKSBnaGRyICsgR0VOTF9IRFJMRU4pOworCXBhcnNlX3J0YXR0cih0YiwgQ1RSTF9BVFRSX01BWCwgYXR0cnMsIGxlbik7CisKKwlpZiAodGJbQ1RSTF9BVFRSX0ZBTUlMWV9OQU1FXSkgeworCQljaGFyICpuYW1lID0gUlRBX0RBVEEodGJbQ1RSTF9BVFRSX0ZBTUlMWV9OQU1FXSk7CisJCWZwcmludGYoZnAsICJcbk5hbWU6ICVzXG4iLG5hbWUpOworCX0KKwlpZiAodGJbQ1RSTF9BVFRSX0ZBTUlMWV9JRF0pIHsKKwkJX191MTYgKmlkID0gUlRBX0RBVEEodGJbQ1RSTF9BVFRSX0ZBTUlMWV9JRF0pOworCQlmcHJpbnRmKGZwLCAiXHRJRDogMHgleCAiLCppZCk7CisJfQorCWlmICh0YltDVFJMX0FUVFJfVkVSU0lPTl0pIHsKKwkJX191MzIgKnYgPSBSVEFfREFUQSh0YltDVFJMX0FUVFJfVkVSU0lPTl0pOworCQlmcHJpbnRmKGZwLCAiIFZlcnNpb246IDB4JXggIiwqdik7CisJCWN0cmxfdiA9ICp2OworCX0KKwlpZiAodGJbQ1RSTF9BVFRSX0hEUlNJWkVdKSB7CisJCV9fdTMyICpoID0gUlRBX0RBVEEodGJbQ1RSTF9BVFRSX0hEUlNJWkVdKTsKKwkJZnByaW50ZihmcCwgIiBoZWFkZXIgc2l6ZTogJWQgIiwqaCk7CisJfQorCWlmICh0YltDVFJMX0FUVFJfTUFYQVRUUl0pIHsKKwkJX191MzIgKm1hID0gUlRBX0RBVEEodGJbQ1RSTF9BVFRSX01BWEFUVFJdKTsKKwkJZnByaW50ZihmcCwgIiBtYXggYXR0cmliczogJWQgIiwqbWEpOworCX0KKwkvKiBlbmQgb2YgZmFtaWx5IGRlZmluaXRpb25zIC4uICovCisJZnByaW50ZihmcCwiXG4iKTsKKwlpZiAodGJbQ1RSTF9BVFRSX09QU10pIHsKKwkJc3RydWN0IHJ0YXR0ciAqdGIyW0dFTkxfTUFYX0ZBTV9PUFNdOworCQlpbnQgaT0wOworCQlwYXJzZV9ydGF0dHJfbmVzdGVkKHRiMiwgR0VOTF9NQVhfRkFNX09QUywgdGJbQ1RSTF9BVFRSX09QU10pOworCQlmcHJpbnRmKGZwLCAiXHRjb21tYW5kcyBzdXBwb3J0ZWQ6IFxuIik7CisJCWZvciAoaSA9IDA7IGkgPCBHRU5MX01BWF9GQU1fT1BTOyBpKyspIHsKKwkJCWlmICh0YjJbaV0pIHsKKwkJCQlmcHJpbnRmKGZwLCAiXHRcdCMlZDogIiwgaSk7CisJCQkJaWYgKDAgPiBwcmludF9jdHJsX2NtZHMoZnAsIHRiMltpXSwgY3RybF92KSkgeworCQkJCQlmcHJpbnRmKGZwLCAiRXJyb3IgcHJpbnRpbmcgY29tbWFuZFxuIik7CisJCQkJfQorCQkJCS8qIGZvciBuZXh0IGNvbW1hbmQgKi8KKwkJCQlmcHJpbnRmKGZwLCJcbiIpOworCQkJfQorCQl9CisKKwkJLyogZW5kIG9mIGZhbWlseTo6Y21kcyBkZWZpbml0aW9ucyAuLiAqLworCQlmcHJpbnRmKGZwLCJcbiIpOworCX0KKworCWlmICh0YltDVFJMX0FUVFJfTUNBU1RfR1JPVVBTXSkgeworCQlzdHJ1Y3QgcnRhdHRyICp0YjJbR0VOTF9NQVhfRkFNX0dSUFMgKyAxXTsKKwkJaW50IGk7CisKKwkJcGFyc2VfcnRhdHRyX25lc3RlZCh0YjIsIEdFTkxfTUFYX0ZBTV9HUlBTLAorCQkJCSAgICB0YltDVFJMX0FUVFJfTUNBU1RfR1JPVVBTXSk7CisJCWZwcmludGYoZnAsICJcdG11bHRpY2FzdCBncm91cHM6XG4iKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgR0VOTF9NQVhfRkFNX0dSUFM7IGkrKykgeworCQkJaWYgKHRiMltpXSkgeworCQkJCWZwcmludGYoZnAsICJcdFx0IyVkOiAiLCBpKTsKKwkJCQlpZiAoMCA+IHByaW50X2N0cmxfZ3JwKGZwLCB0YjJbaV0sIGN0cmxfdikpCisJCQkJCWZwcmludGYoZnAsICJFcnJvciBwcmludGluZyBncm91cFxuIik7CisJCQkJLyogZm9yIG5leHQgZ3JvdXAgKi8KKwkJCQlmcHJpbnRmKGZwLCJcbiIpOworCQkJfQorCQl9CisKKwkJLyogZW5kIG9mIGZhbWlseTo6Z3JvdXBzIGRlZmluaXRpb25zIC4uICovCisJCWZwcmludGYoZnAsIlxuIik7CisJfQorCisJZmZsdXNoKGZwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcmludF9jdHJsMihjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobywKKwkJICAgICAgc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcpCit7CisJcmV0dXJuIHByaW50X2N0cmwod2hvLCBOVUxMLCBuLCBhcmcpOworfQorCitzdGF0aWMgaW50IGN0cmxfbGlzdChpbnQgY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHJ0bmxfaGFuZGxlIHJ0aDsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKwlzdHJ1Y3QgZ2VubG1zZ2hkciAqZ2hkcjsKKwlpbnQgcmV0ID0gLTE7CisJY2hhciBkW0dFTkxfTkFNU0laXTsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgbmxtc2doZHIgICAgICAgICBuOworCQljaGFyICAgICAgICAgICAgICAgICAgICBidWZbNDA5Nl07CisJfSByZXE7CisKKwltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCisJbmxoID0gJnJlcS5uOworCW5saC0+bmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKEdFTkxfSERSTEVOKTsKKwlubGgtPm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVCB8IE5MTV9GX0FDSzsKKwlubGgtPm5sbXNnX3R5cGUgPSBHRU5MX0lEX0NUUkw7CisKKwlnaGRyID0gTkxNU0dfREFUQSgmcmVxLm4pOworCWdoZHItPmNtZCA9IENUUkxfQ01EX0dFVEZBTUlMWTsKKworCWlmIChydG5sX29wZW5fYnlwcm90bygmcnRoLCAwLCBORVRMSU5LX0dFTkVSSUMpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBvcGVuIGdlbmVyaWMgbmV0bGluayBzb2NrZXRcbiIpOworCQlleGl0KDEpOworCX0KKworCWlmIChjbWQgPT0gQ1RSTF9DTURfR0VURkFNSUxZKSB7CisJCWlmIChhcmdjICE9IDIpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiV3JvbmcgbnVtYmVyIG9mIHBhcmFtc1xuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAobWF0Y2hlcygqYXJndiwgIm5hbWUiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJc3RybmNweShkLCAqYXJndiwgc2l6ZW9mIChkKSAtIDEpOworCQkJYWRkYXR0cl9sKG5saCwgMTI4LCBDVFJMX0FUVFJfRkFNSUxZX05BTUUsCisJCQkJICBkLCBzdHJsZW4oZCkgKyAxKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiaWQiKSA9PSAwKSB7CisJCQlfX3UxNiBpZDsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UxNigmaWQsICphcmd2LCAwKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImlkXCJcbiIpOworCQkJCWdvdG8gY3RybF9kb25lOworCQkJfQorCisJCQlhZGRhdHRyX2wobmxoLCAxMjgsIENUUkxfQVRUUl9GQU1JTFlfSUQsICZpZCwgMik7CisKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiV3JvbmcgcGFyYW1zXG4iKTsKKwkJCWdvdG8gY3RybF9kb25lOworCQl9CisKKwkJaWYgKHJ0bmxfdGFsaygmcnRoLCBubGgsIG5saCwgc2l6ZW9mKHJlcSkpIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJFcnJvciB0YWxraW5nIHRvIHRoZSBrZXJuZWxcbiIpOworCQkJZ290byBjdHJsX2RvbmU7CisJCX0KKworCQlpZiAocHJpbnRfY3RybDIoTlVMTCwgbmxoLCAodm9pZCAqKSBzdGRvdXQpIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJEdW1wIHRlcm1pbmF0ZWRcbiIpOworCQkJZ290byBjdHJsX2RvbmU7CisJCX0KKworCX0KKworCWlmIChjbWQgPT0gQ1RSTF9DTURfVU5TUEVDKSB7CisJCW5saC0+bmxtc2dfZmxhZ3MgPSBOTE1fRl9ST09UfE5MTV9GX01BVENIfE5MTV9GX1JFUVVFU1Q7CisJCW5saC0+bmxtc2dfc2VxID0gcnRoLmR1bXAgPSArK3J0aC5zZXE7CisKKwkJaWYgKHJ0bmxfc2VuZCgmcnRoLCBubGgsIG5saC0+bmxtc2dfbGVuKSA8IDApIHsKKwkJCXBlcnJvcigiRmFpbGVkIHRvIHNlbmQgZHVtcCByZXF1ZXN0XG4iKTsKKwkJCWdvdG8gY3RybF9kb25lOworCQl9CisKKwkJcnRubF9kdW1wX2ZpbHRlcigmcnRoLCBwcmludF9jdHJsMiwgc3Rkb3V0KTsKKworICAgICAgICB9CisKKwlyZXQgPSAwOworY3RybF9kb25lOgorCXJ0bmxfY2xvc2UoJnJ0aCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjdHJsX2xpc3RlbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHJ0bmxfaGFuZGxlIHJ0aDsKKworCWlmIChydG5sX29wZW5fYnlwcm90bygmcnRoLCBubF9tZ3JwKEdFTkxfSURfQ1RSTCksIE5FVExJTktfR0VORVJJQykgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ2Fub3Qgb3BlbiBnZW5lcmljIG5ldGxpbmsgc29ja2V0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChydG5sX2xpc3RlbigmcnRoLCBwcmludF9jdHJsLCAodm9pZCAqKSBzdGRvdXQpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfY3RybChzdHJ1Y3QgZ2VubF91dGlsICphLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJYXJndisrOworCWlmICgtLWFyZ2MgPD0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIndyb25nIGNvbnRyb2xsZXIgcGFyYW1zXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChtYXRjaGVzKCphcmd2LCAibW9uaXRvciIpID09IDApCisJCXJldHVybiBjdHJsX2xpc3RlbihhcmdjLTEsIGFyZ3YrMSk7CisJaWYgKG1hdGNoZXMoKmFyZ3YsICJnZXQiKSA9PSAwKQorCQlyZXR1cm4gY3RybF9saXN0KENUUkxfQ01EX0dFVEZBTUlMWSwgYXJnYy0xLCBhcmd2KzEpOworCWlmIChtYXRjaGVzKCphcmd2LCAibGlzdCIpID09IDAgfHwKKwkgICAgbWF0Y2hlcygqYXJndiwgInNob3ciKSA9PSAwIHx8CisJICAgIG1hdGNoZXMoKmFyZ3YsICJsc3QiKSA9PSAwKQorCQlyZXR1cm4gY3RybF9saXN0KENUUkxfQ01EX1VOU1BFQywgYXJnYy0xLCBhcmd2KzEpOworCWlmIChtYXRjaGVzKCphcmd2LCAiaGVscCIpID09IDApCisJCXJldHVybiB1c2FnZSgpOworCisJZnByaW50ZihzdGRlcnIsICJjdHJsIGNvbW1hbmQgXCIlc1wiIGlzIHVua25vd24sIHRyeSBcImN0cmwgaGVscFwiLlxuIiwKKwkJKmFyZ3YpOworCisJcmV0dXJuIC0xOworfQorCitzdHJ1Y3QgZ2VubF91dGlsIGN0cmxfZ2VubF91dGlsID0geworCS5uYW1lID0gImN0cmwiLAorCS5wYXJzZV9nZW5sb3B0ID0gcGFyc2VfY3RybCwKKwkucHJpbnRfZ2VubG9wdCA9IHByaW50X2N0cmwyLAorfTsKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2dlbmwvZ2VubC5jIGIvaXByb3V0ZTIvZ2VubC9nZW5sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMzZmFmZAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2dlbmwvZ2VubC5jCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogZ2VubC5jCQkiZ2VubCIgdXRpbGl0eSBmcm9udGVuZC4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglKYW1hbCBIYWRpIFNhbGltCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPiAvKiB1bnRpbCB3ZSBwdXQgb3VyIG93biBoZWFkZXIgKi8KKyNpbmNsdWRlICJTTkFQU0hPVC5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiZ2VubF91dGlscy5oIgorCitpbnQgc2hvd19zdGF0cyA9IDA7CitpbnQgc2hvd19kZXRhaWxzID0gMDsKK2ludCBzaG93X3JhdyA9IDA7CitpbnQgcmVzb2x2ZV9ob3N0cyA9IDA7CisKK3N0YXRpYyB2b2lkICpCT0RZOworc3RhdGljIHN0cnVjdCBnZW5sX3V0aWwgKiBnZW5sX2xpc3Q7CisKKworc3RhdGljIGludCBwcmludF9ub2ZvcHQoY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8sIHN0cnVjdCBubG1zZ2hkciAqbiwKKwkJCXZvaWQgKmFyZykKK3sKKwlmcHJpbnRmKChGSUxFICopIGFyZywgInVua25vd24gZ2VubCB0eXBlIC4uXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9ub2ZvcHQoc3RydWN0IGdlbmxfdXRpbCAqZiwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWlmIChhcmdjKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5rbm93biBnZW5sIFwiJXNcIiwgaGVuY2Ugb3B0aW9uIFwiJXNcIiAiCisJCQkiaXMgdW5wYXJzYWJsZVxuIiwgZi0+bmFtZSwgKmFyZ3YpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2VubF91dGlsICpnZXRfZ2VubF9raW5kKGNvbnN0IGNoYXIgKnN0cikKK3sKKwl2b2lkICpkbGg7CisJY2hhciBidWZbMjU2XTsKKwlzdHJ1Y3QgZ2VubF91dGlsICpmOworCisJZm9yIChmID0gZ2VubF9saXN0OyBmOyBmID0gZi0+bmV4dCkKKwkJaWYgKHN0cmNtcChmLT5uYW1lLCBzdHIpID09IDApCisJCQlyZXR1cm4gZjsKKworCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcy5zbyIsIHN0cik7CisJZGxoID0gZGxvcGVuKGJ1ZiwgUlRMRF9MQVpZKTsKKwlpZiAoZGxoID09IE5VTEwpIHsKKwkJZGxoID0gQk9EWTsKKwkJaWYgKGRsaCA9PSBOVUxMKSB7CisJCQlkbGggPSBCT0RZID0gZGxvcGVuKE5VTEwsIFJUTERfTEFaWSk7CisJCQlpZiAoZGxoID09IE5VTEwpCisJCQkJZ290byBub2V4aXN0OworCQl9CisJfQorCisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzX2dlbmxfdXRpbCIsIHN0cik7CisKKwlmID0gZGxzeW0oZGxoLCBidWYpOworCWlmIChmID09IE5VTEwpCisJCWdvdG8gbm9leGlzdDsKK3JlZzoKKwlmLT5uZXh0ID0gZ2VubF9saXN0OworCWdlbmxfbGlzdCA9IGY7CisJcmV0dXJuIGY7CisKK25vZXhpc3Q6CisJZiA9IG1hbGxvYyhzaXplb2YoKmYpKTsKKwlpZiAoZikgeworCQltZW1zZXQoZiwgMCwgc2l6ZW9mKCpmKSk7CisJCXN0cm5jcHkoZi0+bmFtZSwgc3RyLCAxNSk7CisJCWYtPnBhcnNlX2dlbmxvcHQgPSBwYXJzZV9ub2ZvcHQ7CisJCWYtPnByaW50X2dlbmxvcHQgPSBwcmludF9ub2ZvcHQ7CisJCWdvdG8gcmVnOworCX0KKwlyZXR1cm4gZjsKK30KKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBnZW5sIFsgT1BUSU9OUyBdIE9CSkVDVCB8IGhlbHAgfVxuIgorCSAgICAgICAgICAgICAgICAid2hlcmUgIE9CSkVDVCA6PSB7IGN0cmwgZXRjIH1cbiIKKwkgICAgICAgICAgICAgICAgIiAgICAgICBPUFRJT05TIDo9IHsgLXNbdGF0aXN0aWNzXSB8IC1kW2V0YWlsc10gfCAtclthd10gfVxuIik7CisJZXhpdCgtMSk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwl3aGlsZSAoYXJnYyA+IDEpIHsKKwkJaWYgKGFyZ3ZbMV1bMF0gIT0gJy0nKQorCQkJYnJlYWs7CisJCWlmIChtYXRjaGVzKGFyZ3ZbMV0sICItc3RhdHMiKSA9PSAwIHx8CisJCSAgICBtYXRjaGVzKGFyZ3ZbMV0sICItc3RhdGlzdGljcyIpID09IDApIHsKKwkJCSsrc2hvd19zdGF0czsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKGFyZ3ZbMV0sICItZGV0YWlscyIpID09IDApIHsKKwkJCSsrc2hvd19kZXRhaWxzOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoYXJndlsxXSwgIi1yYXciKSA9PSAwKSB7CisJCQkrK3Nob3dfcmF3OworCQl9IGVsc2UgaWYgKG1hdGNoZXMoYXJndlsxXSwgIi1WZXJzaW9uIikgPT0gMCkgeworCQkJcHJpbnRmKCJnZW5sIHV0aWxpdHksIGlwcm91dGUyLXNzJXNcbiIsIFNOQVBTSE9UKTsKKwkJCWV4aXQoMCk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcyhhcmd2WzFdLCAiLWhlbHAiKSA9PSAwKSB7CisJCQl1c2FnZSgpOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJPcHRpb24gXCIlc1wiIGlzIHVua25vd24sIHRyeSAiCisJCQkJIlwiZ2VubCAtaGVscFwiLlxuIiwgYXJndlsxXSk7CisJCQlleGl0KC0xKTsKKwkJfQorCQlhcmdjLS07CWFyZ3YrKzsKKwl9CisKKwlpZiAoYXJnYyA+IDEpIHsKKwkJaW50IHJldDsKKwkJc3RydWN0IGdlbmxfdXRpbCAqYSA9IE5VTEw7CisJCWEgPSBnZXRfZ2VubF9raW5kKGFyZ3ZbMV0pOworCQlpZiAoIWEpIHsKKwkJCWZwcmludGYoc3RkZXJyLCJiYWQgZ2VubCAlc1xuIiwgYXJndlsxXSk7CisJCQlleGl0KC0xKTsKKwkJfQorCisJCXJldCA9IGEtPnBhcnNlX2dlbmxvcHQoYSwgYXJnYy0xLCBhcmd2KzEpOworCQlyZXR1cm4gcmV0OworCX0KKworCXVzYWdlKCk7Cit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9nZW5sL2dlbmxfdXRpbHMuaCBiL2lwcm91dGUyL2dlbmwvZ2VubF91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YjUxODMKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9nZW5sL2dlbmxfdXRpbHMuaApAQCAtMCwwICsxLDE3IEBACisjaWZuZGVmIF9UQ19VVElMX0hfCisjZGVmaW5lIF9UQ19VVElMX0hfIDEKKworI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAibGludXgvZ2VuZXRsaW5rLmgiCisKK3N0cnVjdCBnZW5sX3V0aWwKK3sKKwlzdHJ1Y3QgIGdlbmxfdXRpbCAqbmV4dDsKKwljaGFyCW5hbWVbMTZdOworCWludAkoKnBhcnNlX2dlbmxvcHQpKHN0cnVjdCBnZW5sX3V0aWwgKmZ1LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCWludAkoKnByaW50X2dlbmxvcHQpKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZyk7Cit9OworCitleHRlcm4gaW50IGdlbmxfY3RybF9yZXNvbHZlX2ZhbWlseShjb25zdCBjaGFyICpmYW1pbHkpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2dlbmwvc3RhdGljLXN5bXMuYyBiL2lwcm91dGUyL2dlbmwvc3RhdGljLXN5bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmM4MDc0Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvZ2VubC9zdGF0aWMtc3ltcy5jCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBUaGlzIGZpbGUgY3JlYXRlcyBhIGR1bW15IHZlcnNpb24gb2YgZHluYW1pYyBsb2FkaW5nCisgKiBmb3IgZW52aXJvbm1lbnRzIHdoZXJlIGR5bmFtaWMgbGlua2luZworICogaXMgbm90IHVzZWQgb3IgYXZhaWxhYmxlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJkbGZjbi5oIgorCit2b2lkICpfZGxzeW0oY29uc3QgY2hhciAqc3ltKQoreworI2luY2x1ZGUgInN0YXRpYy1zeW1zLmgiCisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL1NOQVBTSE9ULmggYi9pcHJvdXRlMi9pbmNsdWRlL1NOQVBTSE9ULmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThkMzYzMgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvU05BUFNIT1QuaApAQCAtMCwwICsxIEBACitzdGF0aWMgY29uc3QgY2hhciBTTkFQU0hPVFtdID0gIjE2MDExMSI7CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2JwZl9hcGkuaCBiL2lwcm91dGUyL2luY2x1ZGUvYnBmX2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NjZhMzEKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pbmNsdWRlL2JwZl9hcGkuaApAQCAtMCwwICsxLDIyNSBAQAorI2lmbmRlZiBfX0JQRl9BUElfXworI2RlZmluZSBfX0JQRl9BUElfXworCisvKiBOb3RlOgorICoKKyAqIFRoaXMgZmlsZSBjYW4gYmUgaW5jbHVkZWQgaW50byBlQlBGIGtlcm5lbCBwcm9ncmFtcy4gSXQgY29udGFpbnMKKyAqIGEgY291cGxlIG9mIHVzZWZ1bCBoZWxwZXIgZnVuY3Rpb25zLCBtYXAvc2VjdGlvbiBBQkkgKGJwZl9lbGYuaCksCisgKiBtaXNjIG1hY3JvcyBhbmQgc29tZSBlQlBGIHNwZWNpZmljIExMVk0gYnVpbHQtaW5zLgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BrdF9jbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9icGYuaD4KKyNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgImJwZl9lbGYuaCIKKworLyoqIE1pc2MgbWFjcm9zLiAqLworCisjaWZuZGVmIF9fc3RyaW5naWZ5CisjIGRlZmluZSBfX3N0cmluZ2lmeShYKQkJI1gKKyNlbmRpZgorCisjaWZuZGVmIF9fbWF5YmVfdW51c2VkCisjIGRlZmluZSBfX21heWJlX3VudXNlZAkJX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpCisjZW5kaWYKKworI2lmbmRlZiBvZmZzZXRvZgorIyBkZWZpbmUgb2Zmc2V0b2YoVFlQRSwgTUVNQkVSKQlfX2J1aWx0aW5fb2Zmc2V0b2YoVFlQRSwgTUVNQkVSKQorI2VuZGlmCisKKyNpZm5kZWYgbGlrZWx5CisjIGRlZmluZSBsaWtlbHkoWCkJCV9fYnVpbHRpbl9leHBlY3QoISEoWCksIDEpCisjZW5kaWYKKworI2lmbmRlZiB1bmxpa2VseQorIyBkZWZpbmUgdW5saWtlbHkoWCkJCV9fYnVpbHRpbl9leHBlY3QoISEoWCksIDApCisjZW5kaWYKKworI2lmbmRlZiBodG9ucworIyBkZWZpbmUgaHRvbnMoWCkJCV9fY29uc3RhbnRfaHRvbnMoKFgpKQorI2VuZGlmCisKKyNpZm5kZWYgbnRvaHMKKyMgZGVmaW5lIG50b2hzKFgpCQlfX2NvbnN0YW50X250b2hzKChYKSkKKyNlbmRpZgorCisjaWZuZGVmIGh0b25sCisjIGRlZmluZSBodG9ubChYKQkJX19jb25zdGFudF9odG9ubCgoWCkpCisjZW5kaWYKKworI2lmbmRlZiBudG9obAorIyBkZWZpbmUgbnRvaGwoWCkJCV9fY29uc3RhbnRfbnRvaGwoKFgpKQorI2VuZGlmCisKKy8qKiBTZWN0aW9uIGhlbHBlciBtYWNyb3MuICovCisKKyNpZm5kZWYgX19zZWN0aW9uCisjIGRlZmluZSBfX3NlY3Rpb24oTkFNRSkJCQkJCQlcCisJX19hdHRyaWJ1dGVfXygoc2VjdGlvbihOQU1FKSwgdXNlZCkpCisjZW5kaWYKKworI2lmbmRlZiBfX3NlY3Rpb25fdGFpbAorIyBkZWZpbmUgX19zZWN0aW9uX3RhaWwoSUQsIEtFWSkJCQkJCVwKKwlfX3NlY3Rpb24oX19zdHJpbmdpZnkoSUQpICIvIiBfX3N0cmluZ2lmeShLRVkpKQorI2VuZGlmCisKKyNpZm5kZWYgX19zZWN0aW9uX2Nsc19lbnRyeQorIyBkZWZpbmUgX19zZWN0aW9uX2Nsc19lbnRyeQkJCQkJCVwKKwlfX3NlY3Rpb24oRUxGX1NFQ1RJT05fQ0xBU1NJRklFUikKKyNlbmRpZgorCisjaWZuZGVmIF9fc2VjdGlvbl9hY3RfZW50cnkKKyMgZGVmaW5lIF9fc2VjdGlvbl9hY3RfZW50cnkJCQkJCQlcCisJX19zZWN0aW9uKEVMRl9TRUNUSU9OX0FDVElPTikKKyNlbmRpZgorCisjaWZuZGVmIF9fc2VjdGlvbl9saWNlbnNlCisjIGRlZmluZSBfX3NlY3Rpb25fbGljZW5zZQkJCQkJCVwKKwlfX3NlY3Rpb24oRUxGX1NFQ1RJT05fTElDRU5TRSkKKyNlbmRpZgorCisjaWZuZGVmIF9fc2VjdGlvbl9tYXBzCisjIGRlZmluZSBfX3NlY3Rpb25fbWFwcwkJCQkJCQlcCisJX19zZWN0aW9uKEVMRl9TRUNUSU9OX01BUFMpCisjZW5kaWYKKworLyoqIERlY2xhcmF0aW9uIGhlbHBlciBtYWNyb3MuICovCisKKyNpZm5kZWYgQlBGX0xJQ0VOU0UKKyMgZGVmaW5lIEJQRl9MSUNFTlNFKE5BTUUpCQkJCQkJXAorCWNoYXIgX19fX2xpY2Vuc2VbXSBfX3NlY3Rpb25fbGljZW5zZSA9IE5BTUUKKyNlbmRpZgorCisjaWZuZGVmIF9fQlBGX01BUAorIyBkZWZpbmUgX19CUEZfTUFQKE5BTUUsIFRZUEUsIElELCBTSVpFX0tFWSwgU0laRV9WQUxVRSwgUElOLCBNQVhfRUxFTSkJXAorCXN0cnVjdCBicGZfZWxmX21hcCBfX3NlY3Rpb25fbWFwcyBOQU1FID0gewkJCVwKKwkJLnR5cGUJCT0gKFRZUEUpLAkJCQlcCisJCS5pZAkJPSAoSUQpLAkJCQkJXAorCQkuc2l6ZV9rZXkJPSAoU0laRV9LRVkpLAkJCQlcCisJCS5zaXplX3ZhbHVlCT0gKFNJWkVfVkFMVUUpLAkJCQlcCisJCS5waW5uaW5nCT0gKFBJTiksCQkJCVwKKwkJLm1heF9lbGVtCT0gKE1BWF9FTEVNKSwJCQkJXAorCX0KKyNlbmRpZgorCisjaWZuZGVmIEJQRl9IQVNICisjIGRlZmluZSBCUEZfSEFTSChOQU1FLCBJRCwgU0laRV9LRVksIFNJWkVfVkFMVUUsIFBJTiwgTUFYX0VMRU0pCVwKKwlfX0JQRl9NQVAoTkFNRSwgQlBGX01BUF9UWVBFX0hBU0gsIElELCBTSVpFX0tFWSwgU0laRV9WQUxVRSwJXAorCQkgIFBJTiwgTUFYX0VMRU0pCisjZW5kaWYKKworI2lmbmRlZiBCUEZfQVJSQVkKKyMgZGVmaW5lIEJQRl9BUlJBWShOQU1FLCBJRCwgU0laRV9WQUxVRSwgUElOLCBNQVhfRUxFTSkJCQlcCisJX19CUEZfTUFQKE5BTUUsIEJQRl9NQVBfVFlQRV9BUlJBWSwgSUQsIHNpemVvZih1aW50MzJfdCksIAlcCisJCSAgU0laRV9WQUxVRSwgUElOLCBNQVhfRUxFTSkKKyNlbmRpZgorCisjaWZuZGVmIEJQRl9BUlJBWTIKKyMgZGVmaW5lIEJQRl9BUlJBWTIoTkFNRSwgSUQsIFBJTiwgTUFYX0VMRU0pCQkJCVwKKwlCUEZfQVJSQVkoTkFNRSwgSUQsIHNpemVvZih1aW50MTZfdCksIFBJTiwgTUFYX0VMRU0pCisjZW5kaWYKKworI2lmbmRlZiBCUEZfQVJSQVk0CisjIGRlZmluZSBCUEZfQVJSQVk0KE5BTUUsIElELCBQSU4sIE1BWF9FTEVNKQkJCQlcCisJQlBGX0FSUkFZKE5BTUUsIElELCBzaXplb2YodWludDMyX3QpLCBQSU4sIE1BWF9FTEVNKQorI2VuZGlmCisKKyNpZm5kZWYgQlBGX0FSUkFZOAorIyBkZWZpbmUgQlBGX0FSUkFZOChOQU1FLCBJRCwgUElOLCBNQVhfRUxFTSkJCQkJXAorCUJQRl9BUlJBWShOQU1FLCBJRCwgc2l6ZW9mKHVpbnQ2NF90KSwgUElOLCBNQVhfRUxFTSkKKyNlbmRpZgorCisjaWZuZGVmIEJQRl9QUk9HX0FSUkFZCisjIGRlZmluZSBCUEZfUFJPR19BUlJBWShOQU1FLCBJRCwgUElOLCBNQVhfRUxFTSkJCQlcCisJX19CUEZfTUFQKE5BTUUsIEJQRl9NQVBfVFlQRV9QUk9HX0FSUkFZLCBJRCwgc2l6ZW9mKHVpbnQzMl90KSwJXAorCQkgIHNpemVvZih1aW50MzJfdCksIFBJTiwgTUFYX0VMRU0pCisjZW5kaWYKKworLyoqIENsYXNzaWZpZXIgaGVscGVyICovCisKKyNpZm5kZWYgQlBGX0hfREVGQVVMVAorIyBkZWZpbmUgQlBGX0hfREVGQVVMVAktMQorI2VuZGlmCisKKy8qKiBCUEYgaGVscGVyIGZ1bmN0aW9ucyBmb3IgdGMuICovCisKKyNpZm5kZWYgQlBGX0ZVTkMKKyMgZGVmaW5lIEJQRl9GVU5DKE5BTUUsIC4uLikJCQkJCQlcCisJKCogTkFNRSkoX19WQV9BUkdTX18pIF9fbWF5YmVfdW51c2VkID0gKHZvaWQgKikgQlBGX0ZVTkNfIyNOQU1FCisjZW5kaWYKKworLyogTWFwIGFjY2Vzcy9tYW5pcHVsYXRpb24gKi8KK3N0YXRpYyB2b2lkICpCUEZfRlVOQyhtYXBfbG9va3VwX2VsZW0sIHZvaWQgKm1hcCwgY29uc3Qgdm9pZCAqa2V5KTsKK3N0YXRpYyBpbnQgQlBGX0ZVTkMobWFwX3VwZGF0ZV9lbGVtLCB2b2lkICptYXAsIGNvbnN0IHZvaWQgKmtleSwKKwkJICAgIGNvbnN0IHZvaWQgKnZhbHVlLCB1aW50MzJfdCBmbGFncyk7CitzdGF0aWMgaW50IEJQRl9GVU5DKG1hcF9kZWxldGVfZWxlbSwgdm9pZCAqbWFwLCBjb25zdCB2b2lkICprZXkpOworCisvKiBUaW1lIGFjY2VzcyAqLworc3RhdGljIHVpbnQ2NF90IEJQRl9GVU5DKGt0aW1lX2dldF9ucyk7CisKKy8qIERlYnVnZ2luZyAqLworc3RhdGljIHZvaWQgQlBGX0ZVTkModHJhY2VfcHJpbnRrLCBjb25zdCBjaGFyICpmbXQsIGludCBmbXRfc2l6ZSwgLi4uKTsKKworLyogUmFuZG9tIG51bWJlcnMgKi8KK3N0YXRpYyB1aW50MzJfdCBCUEZfRlVOQyhnZXRfcHJhbmRvbV91MzIpOworCisvKiBUYWlsIGNhbGxzICovCitzdGF0aWMgdm9pZCBCUEZfRlVOQyh0YWlsX2NhbGwsIHN0cnVjdCBfX3NrX2J1ZmYgKnNrYiwgdm9pZCAqbWFwLAorCQkgICAgIHVpbnQzMl90IGluZGV4KTsKKworLyogU3lzdGVtIGhlbHBlcnMgKi8KK3N0YXRpYyB1aW50MzJfdCBCUEZfRlVOQyhnZXRfc21wX3Byb2Nlc3Nvcl9pZCk7CisKKy8qIFBhY2tldCBtaXNjIG1ldGEgZGF0YSAqLworc3RhdGljIHVpbnQzMl90IEJQRl9GVU5DKGdldF9jZ3JvdXBfY2xhc3NpZCwgc3RydWN0IF9fc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB1aW50MzJfdCBCUEZfRlVOQyhnZXRfcm91dGVfcmVhbG0sIHN0cnVjdCBfX3NrX2J1ZmYgKnNrYik7CisKKy8qIFBhY2tldCByZWRpcmVjdGlvbiAqLworc3RhdGljIGludCBCUEZfRlVOQyhyZWRpcmVjdCwgaW50IGlmaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKK3N0YXRpYyBpbnQgQlBGX0ZVTkMoY2xvbmVfcmVkaXJlY3QsIHN0cnVjdCBfX3NrX2J1ZmYgKnNrYiwgaW50IGlmaW5kZXgsCisJCSAgICB1aW50MzJfdCBmbGFncyk7CisKKy8qIFBhY2tldCBtYW5pcHVsYXRpb24gKi8KKyNkZWZpbmUgQlBGX1BTRVVET19IRFIJCQkweDEwCisjZGVmaW5lIEJQRl9IQVNfUFNFVURPX0hEUihmbGFncykJKChmbGFncykgJiBCUEZfUFNFVURPX0hEUikKKyNkZWZpbmUgQlBGX0hEUl9GSUVMRF9TSVpFKGZsYWdzKQkoKGZsYWdzKSAmIDB4MGYpCisKK3N0YXRpYyBpbnQgQlBGX0ZVTkMoc2tiX3N0b3JlX2J5dGVzLCBzdHJ1Y3QgX19za19idWZmICpza2IsIHVpbnQzMl90IG9mZiwKKwkJICAgIHZvaWQgKmZyb20sIHVpbnQzMl90IGxlbiwgdWludDMyX3QgZmxhZ3MpOworc3RhdGljIGludCBCUEZfRlVOQyhsM19jc3VtX3JlcGxhY2UsIHN0cnVjdCBfX3NrX2J1ZmYgKnNrYiwgdWludDMyX3Qgb2ZmLAorCQkgICAgdWludDMyX3QgZnJvbSwgdWludDMyX3QgdG8sIHVpbnQzMl90IGZsYWdzKTsKK3N0YXRpYyBpbnQgQlBGX0ZVTkMobDRfY3N1bV9yZXBsYWNlLCBzdHJ1Y3QgX19za19idWZmICpza2IsIHVpbnQzMl90IG9mZiwKKwkJICAgIHVpbnQzMl90IGZyb20sIHVpbnQzMl90IHRvLCB1aW50MzJfdCBmbGFncyk7CisKKy8qIFBhY2tldCB2bGFuIGVuY2FwL2RlY2FwICovCitzdGF0aWMgaW50IEJQRl9GVU5DKHNrYl92bGFuX3B1c2gsIHN0cnVjdCBfX3NrX2J1ZmYgKnNrYiwgdWludDE2X3QgcHJvdG8sCisJCSAgICB1aW50MTZfdCB2bGFuX3RjaSk7CitzdGF0aWMgaW50IEJQRl9GVU5DKHNrYl92bGFuX3BvcCwgc3RydWN0IF9fc2tfYnVmZiAqc2tiKTsKKworLyogUGFja2V0IHR1bm5lbCBlbmNhcC9kZWNhcCAqLworc3RhdGljIGludCBCUEZfRlVOQyhza2JfZ2V0X3R1bm5lbF9rZXksIHN0cnVjdCBfX3NrX2J1ZmYgKnNrYiwKKwkJICAgIHN0cnVjdCBicGZfdHVubmVsX2tleSAqdG8sIHVpbnQzMl90IHNpemUsIHVpbnQzMl90IGZsYWdzKTsKK3N0YXRpYyBpbnQgQlBGX0ZVTkMoc2tiX3NldF90dW5uZWxfa2V5LCBzdHJ1Y3QgX19za19idWZmICpza2IsCisJCSAgICBzdHJ1Y3QgYnBmX3R1bm5lbF9rZXkgKmZyb20sIHVpbnQzMl90IHNpemUsIHVpbnQzMl90IGZsYWdzKTsKKworLyoqIExMVk0gYnVpbHQtaW5zICovCisKKyNpZm5kZWYgbG9ja194YWRkCisjIGRlZmluZSBsb2NrX3hhZGQocHRyLCB2YWwpCSgodm9pZCkgX19zeW5jX2ZldGNoX2FuZF9hZGQocHRyLCB2YWwpKQorI2VuZGlmCisKK3Vuc2lnbmVkIGxvbmcgbG9uZyBsb2FkX2J5dGUodm9pZCAqc2tiLCB1bnNpZ25lZCBsb25nIGxvbmcgb2ZmKQorCWFzbSAoImxsdm0uYnBmLmxvYWQuYnl0ZSIpOworCit1bnNpZ25lZCBsb25nIGxvbmcgbG9hZF9oYWxmKHZvaWQgKnNrYiwgdW5zaWduZWQgbG9uZyBsb25nIG9mZikKKwlhc20gKCJsbHZtLmJwZi5sb2FkLmhhbGYiKTsKKwordW5zaWduZWQgbG9uZyBsb25nIGxvYWRfd29yZCh2b2lkICpza2IsIHVuc2lnbmVkIGxvbmcgbG9uZyBvZmYpCisJYXNtICgibGx2bS5icGYubG9hZC53b3JkIik7CisKKyNlbmRpZiAvKiBfX0JQRl9BUElfXyAqLwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9icGZfZWxmLmggYi9pcHJvdXRlMi9pbmNsdWRlL2JwZl9lbGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWE4OTc0Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9icGZfZWxmLmgKQEAgLTAsMCArMSwzOSBAQAorI2lmbmRlZiBfX0JQRl9FTEZfXworI2RlZmluZSBfX0JQRl9FTEZfXworCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKy8qIE5vdGU6CisgKgorICogQmVsb3cgRUxGIHNlY3Rpb24gbmFtZXMgYW5kIGJwZl9lbGZfbWFwIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKiBhcmUgbm90ICghKSBrZXJuZWwgQUJJLiBJdCdzIHJhdGhlciBhICJjb250cmFjdCIgYmV0d2VlbiB0aGUKKyAqIGFwcGxpY2F0aW9uIGFuZCB0aGUgQlBGIGxvYWRlciBpbiB0Yy4gRm9yIGNvbXBhdGliaWxpdHksIHRoZQorICogc2VjdGlvbiBuYW1lcyBzaG91bGQgc3RheSBhcy1pcy4gSW50cm9kdWN0aW9uIG9mIGFsaWFzZXMsIGlmCisgKiBuZWVkZWQsIGFyZSBhIHBvc3NpYmlsaXR5LCB0aG91Z2guCisgKi8KKworLyogRUxGIHNlY3Rpb24gbmFtZXMsIGV0YyAqLworI2RlZmluZSBFTEZfU0VDVElPTl9MSUNFTlNFCSJsaWNlbnNlIgorI2RlZmluZSBFTEZfU0VDVElPTl9NQVBTCSJtYXBzIgorI2RlZmluZSBFTEZfU0VDVElPTl9DTEFTU0lGSUVSCSJjbGFzc2lmaWVyIgorI2RlZmluZSBFTEZfU0VDVElPTl9BQ1RJT04JImFjdGlvbiIKKworI2RlZmluZSBFTEZfTUFYX01BUFMJCTY0CisjZGVmaW5lIEVMRl9NQVhfTElDRU5TRV9MRU4JMTI4CisKKy8qIE9iamVjdCBwaW5uaW5nIHNldHRpbmdzICovCisjZGVmaW5lIFBJTl9OT05FCQkwCisjZGVmaW5lIFBJTl9PQkpFQ1RfTlMJCTEKKyNkZWZpbmUgUElOX0dMT0JBTF9OUwkJMgorCisvKiBFTEYgbWFwIGRlZmluaXRpb24gKi8KK3N0cnVjdCBicGZfZWxmX21hcCB7CisJX191MzIgdHlwZTsKKwlfX3UzMiBzaXplX2tleTsKKwlfX3UzMiBzaXplX3ZhbHVlOworCV9fdTMyIG1heF9lbGVtOworCV9fdTMyIGlkOworCV9fdTMyIHBpbm5pbmc7Cit9OworCisjZW5kaWYgLyogX19CUEZfRUxGX18gKi8KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2luY2x1ZGUvYnBmX3NjbS5oIGIvaXByb3V0ZTIvaW5jbHVkZS9icGZfc2NtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUxMTdkMQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvYnBmX3NjbS5oCkBAIC0wLDAgKzEsNzUgQEAKKyNpZm5kZWYgX19CUEZfU0NNX18KKyNkZWZpbmUgX19CUEZfU0NNX18KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiYnBmX2VsZi5oIgorCisjZGVmaW5lIEJQRl9TQ01fQVVYX1ZFUgkJMQorI2RlZmluZSBCUEZfU0NNX01BWF9GRFMJCUVMRl9NQVhfTUFQUworI2RlZmluZSBCUEZfU0NNX01TR19TSVpFCTEwMjQKKworc3RydWN0IGJwZl9lbGZfc3QgeworCWRldl90IHN0X2RldjsKKwlpbm9fdCBzdF9pbm87Cit9OworCitzdHJ1Y3QgYnBmX21hcF9hdXggeworCXVuc2lnbmVkIHNob3J0IHVkc192ZXI7CisJdW5zaWduZWQgc2hvcnQgbnVtX2VudDsKKwljaGFyIG9ial9uYW1lWzY0XTsKKwlzdHJ1Y3QgYnBmX2VsZl9zdCBvYmpfc3Q7CisJc3RydWN0IGJwZl9lbGZfbWFwIGVudFtCUEZfU0NNX01BWF9GRFNdOworfTsKKworc3RydWN0IGJwZl9tYXBfc2V0X21zZyB7CisJc3RydWN0IG1zZ2hkciBoZHI7CisJc3RydWN0IGlvdmVjIGlvdjsKKwljaGFyIG1zZ19idWZbQlBGX1NDTV9NU0dfU0laRV07CisJc3RydWN0IGJwZl9tYXBfYXV4IGF1eDsKK307CisKK3N0YXRpYyBpbmxpbmUgaW50ICpicGZfbWFwX3NldF9pbml0KHN0cnVjdCBicGZfbWFwX3NldF9tc2cgKm1zZywKKwkJCQkgICAgc3RydWN0IHNvY2thZGRyX3VuICphZGRyLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgYWRkcl9sZW4pCit7CisJY29uc3QgdW5zaWduZWQgaW50IGNtc2dfY3RsX2xlbiA9IHNpemVvZihpbnQpICogQlBGX1NDTV9NQVhfRkRTOworCXN0cnVjdCBjbXNnaGRyICpjbXNnOworCisJbXNnLT5pb3YuaW92X2Jhc2UgPSAmbXNnLT5hdXg7CisJbXNnLT5pb3YuaW92X2xlbiA9IHNpemVvZihtc2ctPmF1eCk7CisKKwltc2ctPmhkci5tc2dfaW92ID0gJm1zZy0+aW92OworCW1zZy0+aGRyLm1zZ19pb3ZsZW4gPSAxOworCisJbXNnLT5oZHIubXNnX25hbWUgPSAoc3RydWN0IHNvY2thZGRyICopYWRkcjsKKwltc2ctPmhkci5tc2dfbmFtZWxlbiA9IGFkZHJfbGVuOworCisJQlVJTERfQlVHX09OKHNpemVvZihtc2ctPm1zZ19idWYpIDwgY21zZ19jdGxfbGVuKTsKKwltc2ctPmhkci5tc2dfY29udHJvbCA9ICZtc2ctPm1zZ19idWY7CisJbXNnLT5oZHIubXNnX2NvbnRyb2xsZW4JPSBjbXNnX2N0bF9sZW47CisKKwljbXNnID0gQ01TR19GSVJTVEhEUigmbXNnLT5oZHIpOworCWNtc2ctPmNtc2dfbGVuID0gbXNnLT5oZHIubXNnX2NvbnRyb2xsZW47CisJY21zZy0+Y21zZ19sZXZlbCA9IFNPTF9TT0NLRVQ7CisJY21zZy0+Y21zZ190eXBlCT0gU0NNX1JJR0hUUzsKKworCXJldHVybiAoaW50ICopQ01TR19EQVRBKGNtc2cpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYnBmX21hcF9zZXRfaW5pdF9zaW5nbGUoc3RydWN0IGJwZl9tYXBfc2V0X21zZyAqbXNnLAorCQkJCQkgICBpbnQgbnVtKQoreworCXN0cnVjdCBjbXNnaGRyICpjbXNnOworCisJbXNnLT5oZHIubXNnX2NvbnRyb2xsZW4gPSBDTVNHX0xFTihzaXplb2YoaW50KSAqIG51bSk7CisJbXNnLT5pb3YuaW92X2xlbiA9IG9mZnNldG9mKHN0cnVjdCBicGZfbWFwX2F1eCwgZW50KSArCisJCQkgICBzaXplb2Yoc3RydWN0IGJwZl9lbGZfbWFwKSAqIG51bTsKKworCWNtc2cgPSBDTVNHX0ZJUlNUSERSKCZtc2ctPmhkcik7CisJY21zZy0+Y21zZ19sZW4gPSBtc2ctPmhkci5tc2dfY29udHJvbGxlbjsKK30KKworI2VuZGlmIC8qIF9fQlBGX1NDTV9fICovCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2NvbG9yLmggYi9pcHJvdXRlMi9pbmNsdWRlL2NvbG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg1MDAzYQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvY29sb3IuaApAQCAtMCwwICsxLDE2IEBACisjaWZuZGVmIF9fQ09MT1JfSF9fCisjZGVmaW5lIF9fQ09MT1JfSF9fIDEKKworZW51bSBjb2xvcl9hdHRyIHsKKwlDT0xPUl9JRk5BTUUsCisJQ09MT1JfTUFDLAorCUNPTE9SX0lORVQsCisJQ09MT1JfSU5FVDYsCisJQ09MT1JfT1BFUlNUQVRFX1VQLAorCUNPTE9SX09QRVJTVEFURV9ET1dOCit9OworCit2b2lkIGVuYWJsZV9jb2xvcih2b2lkKTsKK2ludCBjb2xvcl9mcHJpbnRmKEZJTEUgKmZwLCBlbnVtIGNvbG9yX2F0dHIgYXR0ciwgY29uc3QgY2hhciAqZm10LCAuLi4pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2luY2x1ZGUvZGxmY24uaCBiL2lwcm91dGUyL2luY2x1ZGUvZGxmY24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTViYzJjCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9kbGZjbi5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBTdHViIGRsZmNuIGltcGxlbWVudGF0aW9uIGZvciBzeXN0ZW1zIHRoYXQgbGFjayBzaGFyZWQgbGlicmFyeSBzdXBwb3J0CisgKiBidXQgb2J2aW91c2x5IGNhbiBzdGlsbCByZWZlcmVuY2UgY29tcGlsZWQtaW4gc3ltYm9scy4KKyAqLworCisjaWZuZGVmIE5PX1NIQVJFRF9MSUJTCisjaW5jbHVkZV9uZXh0IDxkbGZjbi5oPgorI2Vsc2UKKworI2RlZmluZSBSVExEX0xBWlkgMAorI2RlZmluZSBSVExEX0dMT0JBTCAxCisjZGVmaW5lIF9GQUtFX0RMRkNOX0hETCAodm9pZCAqKTB4YmVlZmNhZmUKKworc3RhdGljIGlubGluZSB2b2lkICpkbG9wZW4oY29uc3QgY2hhciAqZmlsZSwgaW50IGZsYWcpCit7CisJaWYgKGZpbGUgPT0gTlVMTCkKKwkJcmV0dXJuIF9GQUtFX0RMRkNOX0hETDsKKwllbHNlCisJCXJldHVybiBOVUxMOworfQorCit2b2lkICpfZGxzeW0oY29uc3QgY2hhciAqc3ltKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCAqZGxzeW0odm9pZCAqaGFuZGxlLCBjb25zdCBjaGFyICpzeW0pCit7CisJaWYgKGhhbmRsZSAhPSBfRkFLRV9ETEZDTl9IREwpCisJCXJldHVybiBOVUxMOworCXJldHVybiBfZGxzeW0oc3ltKTsKK30KKworc3RhdGljIGlubGluZSBjaGFyICpkbGVycm9yKHZvaWQpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRsY2xvc2Uodm9pZCAqaGFuZGxlKQoreworCXJldHVybiAoaGFuZGxlID09IF9GQUtFX0RMRkNOX0hETCkgPyAwIDogMTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2hsaXN0LmggYi9pcHJvdXRlMi9pbmNsdWRlL2hsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU4ZGU5ZQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvaGxpc3QuaApAQCAtMCwwICsxLDU2IEBACisjaWZuZGVmIF9fSExJU1RfSF9fCisjZGVmaW5lIF9fSExJU1RfSF9fIDEKKy8qIEhhc2ggbGlzdCBzdHVmZiBmcm9tIGtlcm5lbCAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNkZWZpbmUgY29udGFpbmVyX29mKHB0ciwgdHlwZSwgbWVtYmVyKSAoewkJCVwKKwljb25zdCB0eXBlb2YoICgodHlwZSAqKTApLT5tZW1iZXIgKSAqX19tcHRyID0gKHB0cik7CVwKKwkodHlwZSAqKSggKGNoYXIgKilfX21wdHIgLSBvZmZzZXRvZih0eXBlLG1lbWJlcikgKTt9KQorCitzdHJ1Y3QgaGxpc3RfaGVhZCB7CisJc3RydWN0IGhsaXN0X25vZGUgKmZpcnN0OworfTsKKworc3RydWN0IGhsaXN0X25vZGUgeworCXN0cnVjdCBobGlzdF9ub2RlICpuZXh0LCAqKnBwcmV2OworfTsKKworc3RhdGljIGlubGluZSB2b2lkIGhsaXN0X2RlbChzdHJ1Y3QgaGxpc3Rfbm9kZSAqbikKK3sKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbmV4dCA9IG4tPm5leHQ7CisJc3RydWN0IGhsaXN0X25vZGUgKipwcHJldiA9IG4tPnBwcmV2OworCSpwcHJldiA9IG5leHQ7CisJaWYgKG5leHQpCisJCW5leHQtPnBwcmV2ID0gcHByZXY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBobGlzdF9hZGRfaGVhZChzdHJ1Y3QgaGxpc3Rfbm9kZSAqbiwgc3RydWN0IGhsaXN0X2hlYWQgKmgpCit7CisJc3RydWN0IGhsaXN0X25vZGUgKmZpcnN0ID0gaC0+Zmlyc3Q7CisJbi0+bmV4dCA9IGZpcnN0OworCWlmIChmaXJzdCkKKwkJZmlyc3QtPnBwcmV2ID0gJm4tPm5leHQ7CisJaC0+Zmlyc3QgPSBuOworCW4tPnBwcmV2ID0gJmgtPmZpcnN0OworfQorCisjZGVmaW5lIGhsaXN0X2Zvcl9lYWNoKHBvcywgaGVhZCkgXAorCWZvciAocG9zID0gKGhlYWQpLT5maXJzdDsgcG9zIDsgcG9zID0gcG9zLT5uZXh0KQorCisKKyNkZWZpbmUgaGxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIG4sIGhlYWQpIFwKKwlmb3IgKHBvcyA9IChoZWFkKS0+Zmlyc3Q7IHBvcyAmJiAoeyBuID0gcG9zLT5uZXh0OyAxOyB9KTsgXAorCSAgICAgcG9zID0gbikKKworI2RlZmluZSBobGlzdF9lbnRyeV9zYWZlKHB0ciwgdHlwZSwgbWVtYmVyKSBcCisJKHsgdHlwZW9mKHB0cikgX19fX3B0ciA9IChwdHIpOyBcCisJICAgX19fX3B0ciA/IGhsaXN0X2VudHJ5KF9fX19wdHIsIHR5cGUsIG1lbWJlcikgOiBOVUxMOyBcCisJfSkKKworI2RlZmluZSBobGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsIGhlYWQsIG1lbWJlcikJCQkJXAorCWZvciAocG9zID0gaGxpc3RfZW50cnlfc2FmZSgoaGVhZCktPmZpcnN0LCB0eXBlb2YoKihwb3MpKSwgbWVtYmVyKTtcCisJICAgICBwb3M7CQkJCQkJCVwKKwkgICAgIHBvcyA9IGhsaXN0X2VudHJ5X3NhZmUoKHBvcyktPm1lbWJlci5uZXh0LCB0eXBlb2YoKihwb3MpKSwgbWVtYmVyKSkKKworI2VuZGlmIC8qIF9fSExJU1RfSF9fICovCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2lwNnRhYmxlcy5oIGIvaXByb3V0ZTIvaW5jbHVkZS9pcDZ0YWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjFjNWI2Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9pcDZ0YWJsZXMuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIF9JUDZUQUJMRVNfVVNFUl9ICisjZGVmaW5lIF9JUDZUQUJMRVNfVVNFUl9ICisKKyNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CisjaW5jbHVkZSA8eHRhYmxlcy5oPgorI2luY2x1ZGUgPGxpYmlwdGMvbGliaXA2dGMuaD4KKyNpbmNsdWRlIDxpcHRhYmxlcy9pbnRlcm5hbC5oPgorCisvKiBZb3VyIHNoYXJlZCBsaWJyYXJ5IHNob3VsZCBjYWxsIG9uZSBvZiB0aGVzZS4gKi8KK2V4dGVybiBpbnQgZG9fY29tbWFuZDYoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgY2hhciAqKnRhYmxlLAorCQkgICAgICAgc3RydWN0IHh0Y19oYW5kbGUgKipoYW5kbGUsIGJvb2wgcmVzdG9yZSk7CisKK2V4dGVybiBpbnQgZm9yX2VhY2hfY2hhaW42KGludCAoKmZuKShjb25zdCB4dF9jaGFpbmxhYmVsLCBpbnQsIHN0cnVjdCB4dGNfaGFuZGxlICopLCBpbnQgdmVyYm9zZSwgaW50IGJ1aWx0aW5zdG9vLCBzdHJ1Y3QgeHRjX2hhbmRsZSAqaGFuZGxlKTsKK2V4dGVybiBpbnQgZmx1c2hfZW50cmllczYoY29uc3QgeHRfY2hhaW5sYWJlbCBjaGFpbiwgaW50IHZlcmJvc2UsIHN0cnVjdCB4dGNfaGFuZGxlICpoYW5kbGUpOworZXh0ZXJuIGludCBkZWxldGVfY2hhaW42KGNvbnN0IHh0X2NoYWlubGFiZWwgY2hhaW4sIGludCB2ZXJib3NlLCBzdHJ1Y3QgeHRjX2hhbmRsZSAqaGFuZGxlKTsKK3ZvaWQgcHJpbnRfcnVsZTYoY29uc3Qgc3RydWN0IGlwNnRfZW50cnkgKmUsIHN0cnVjdCB4dGNfaGFuZGxlICpoLCBjb25zdCBjaGFyICpjaGFpbiwgaW50IGNvdW50ZXJzKTsKKworZXh0ZXJuIHN0cnVjdCB4dGFibGVzX2dsb2JhbHMgaXA2dGFibGVzX2dsb2JhbHM7CisKKyNlbmRpZiAvKl9JUDZUQUJMRVNfVVNFUl9IKi8KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2luY2x1ZGUvaXB0YWJsZXMuaCBiL2lwcm91dGUyL2luY2x1ZGUvaXB0YWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGMxMGFiCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9pcHRhYmxlcy5oCkBAIC0wLDAgKzEsMjUgQEAKKyNpZm5kZWYgX0lQVEFCTEVTX1VTRVJfSAorI2RlZmluZSBfSVBUQUJMRVNfVVNFUl9ICisKKyNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CisjaW5jbHVkZSA8eHRhYmxlcy5oPgorI2luY2x1ZGUgPGxpYmlwdGMvbGliaXB0Yy5oPgorI2luY2x1ZGUgPGlwdGFibGVzL2ludGVybmFsLmg+CisKKy8qIFlvdXIgc2hhcmVkIGxpYnJhcnkgc2hvdWxkIGNhbGwgb25lIG9mIHRoZXNlLiAqLworZXh0ZXJuIGludCBkb19jb21tYW5kNChpbnQgYXJnYywgY2hhciAqYXJndltdLCBjaGFyICoqdGFibGUsCisJCSAgICAgIHN0cnVjdCB4dGNfaGFuZGxlICoqaGFuZGxlLCBib29sIHJlc3RvcmUpOworZXh0ZXJuIGludCBkZWxldGVfY2hhaW40KGNvbnN0IHh0X2NoYWlubGFiZWwgY2hhaW4sIGludCB2ZXJib3NlLAorCQkJc3RydWN0IHh0Y19oYW5kbGUgKmhhbmRsZSk7CitleHRlcm4gaW50IGZsdXNoX2VudHJpZXM0KGNvbnN0IHh0X2NoYWlubGFiZWwgY2hhaW4sIGludCB2ZXJib3NlLCAKKwkJCXN0cnVjdCB4dGNfaGFuZGxlICpoYW5kbGUpOworZXh0ZXJuIGludCBmb3JfZWFjaF9jaGFpbjQoaW50ICgqZm4pKGNvbnN0IHh0X2NoYWlubGFiZWwsIGludCwgc3RydWN0IHh0Y19oYW5kbGUgKiksCisJCWludCB2ZXJib3NlLCBpbnQgYnVpbHRpbnN0b28sIHN0cnVjdCB4dGNfaGFuZGxlICpoYW5kbGUpOworZXh0ZXJuIHZvaWQgcHJpbnRfcnVsZTQoY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKwkJc3RydWN0IHh0Y19oYW5kbGUgKmhhbmRsZSwgY29uc3QgY2hhciAqY2hhaW4sIGludCBjb3VudGVycyk7CisKK2V4dGVybiBzdHJ1Y3QgeHRhYmxlc19nbG9iYWxzIGlwdGFibGVzX2dsb2JhbHM7CisKK2V4dGVybiBzdHJ1Y3QgeHRhYmxlc19nbG9iYWxzIHh0YWJsZXNfZ2xvYmFsczsKKworI2VuZGlmIC8qX0lQVEFCTEVTX1VTRVJfSCovCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2lwdGFibGVzL2ludGVybmFsLmggYi9pcHJvdXRlMi9pbmNsdWRlL2lwdGFibGVzL2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJhOGVjYgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvaXB0YWJsZXMvaW50ZXJuYWwuaApAQCAtMCwwICsxLDEzIEBACisjaWZuZGVmIElQVEFCTEVTX0lOVEVSTkFMX0gKKyNkZWZpbmUgSVBUQUJMRVNfSU5URVJOQUxfSCAxCisKKyNkZWZpbmUgSVBUQUJMRVNfVkVSU0lPTiAiMS42LjAiCisKKy8qKgorICogUHJvZ3JhbSdzIG93biBuYW1lIGFuZCB2ZXJzaW9uLgorICovCitleHRlcm4gY29uc3QgY2hhciAqcHJvZ3JhbV9uYW1lLCAqcHJvZ3JhbV92ZXJzaW9uOworCitleHRlcm4gaW50IGxpbmU7CisKKyNlbmRpZiAvKiBJUFRBQkxFU19JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2lwdGFibGVzX2NvbW1vbi5oIGIvaXByb3V0ZTIvaW5jbHVkZS9pcHRhYmxlc19jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDk5NjY3Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9pcHRhYmxlc19jb21tb24uaApAQCAtMCwwICsxLDUxIEBACisjaWZuZGVmIF9JUFRBQkxFU19DT01NT05fSAorI2RlZmluZSBfSVBUQUJMRVNfQ09NTU9OX0gKKy8qIFNoYXJlZCBkZWZpbml0aW9ucyBiZXR3ZWVuIGlwdjQgYW5kIGlwdjYuICovCisKK2VudW0gZXhpdHR5cGUgeworCU9USEVSX1BST0JMRU0gPSAxLAorCVBBUkFNRVRFUl9QUk9CTEVNLAorCVZFUlNJT05fUFJPQkxFTSwKKwlSRVNPVVJDRV9QUk9CTEVNCit9OworCisvKiB0aGlzIGlzIGEgc3BlY2lhbCA2NGJpdCBkYXRhIHR5cGUgdGhhdCBpcyA4LWJ5dGUgYWxpZ25lZCAqLworI2RlZmluZSBhbGlnbmVkX3U2NCB1bnNpZ25lZCBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpCisKK2V4dGVybiB2b2lkIGV4aXRfcHJpbnRoZWxwKHZvaWQpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CitleHRlcm4gdm9pZCBleGl0X3RyeWhlbHAoaW50KSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworaW50IGNoZWNrX2ludmVyc2UoY29uc3QgY2hhciBvcHRpb25bXSwgaW50ICppbnZlcnQsIGludCAqb3B0aW5kLCBpbnQgYXJnYyk7CitleHRlcm4gaW50IHN0cmluZ190b19udW1iZXIoY29uc3QgY2hhciAqLCAKKwkJCSAgICB1bnNpZ25lZCBpbnQsIAorCQkJICAgIHVuc2lnbmVkIGludCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKik7CitleHRlcm4gaW50IHN0cmluZ190b19udW1iZXJfbChjb25zdCBjaGFyICosIAorCQkJICAgIHVuc2lnbmVkIGxvbmcgaW50LCAKKwkJCSAgICB1bnNpZ25lZCBsb25nIGludCwKKwkJCSAgICB1bnNpZ25lZCBsb25nICopOworZXh0ZXJuIGludCBzdHJpbmdfdG9fbnVtYmVyX2xsKGNvbnN0IGNoYXIgKiwgCisJCQkgICAgdW5zaWduZWQgbG9uZyBsb25nIGludCwgCisJCQkgICAgdW5zaWduZWQgbG9uZyBsb25nIGludCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGxvbmcgKik7CitleHRlcm4gaW50IGlwdGFibGVzX2luc21vZChjb25zdCBjaGFyICptb2RuYW1lLCBjb25zdCBjaGFyICptb2Rwcm9iZSk7CitleHRlcm4gaW50IGxvYWRfaXB0YWJsZXNfa28oY29uc3QgY2hhciAqbW9kcHJvYmUpOwordm9pZCBleGl0X2Vycm9yKGVudW0gZXhpdHR5cGUsIGNoYXIgKiwgLi4uKV9fYXR0cmlidXRlX18oKG5vcmV0dXJuLAorCQkJCQkJCSAgZm9ybWF0KHByaW50ZiwyLDMpKSk7CitleHRlcm4gY29uc3QgY2hhciAqcHJvZ3JhbV9uYW1lLCAqcHJvZ3JhbV92ZXJzaW9uOworZXh0ZXJuIGNoYXIgKmxpYl9kaXI7CisKKyNkZWZpbmUgX2luaXQgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSBteV9pbml0CisjaWZkZWYgTk9fU0hBUkVEX0xJQlMKKyMgaWZkZWYgX0lOSVQKKyMgIHVuZGVmIF9pbml0CisjICBkZWZpbmUgX2luaXQgX0lOSVQKKyMgZW5kaWYKKyAgZXh0ZXJuIHZvaWQgaW5pdF9leHRlbnNpb25zKHZvaWQpOworI2VuZGlmCisKKyNkZWZpbmUgX19iZTMyCXVfaW50MzJfdAorI2RlZmluZSBfX2xlMzIJdV9pbnQzMl90CisjZGVmaW5lIF9fYmUxNgl1X2ludDE2X3QKKyNkZWZpbmUgX19sZTE2CXVfaW50MTZfdAorCisjZW5kaWYgLypfSVBUQUJMRVNfQ09NTU9OX0gqLwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9qc29uX3dyaXRlci5oIGIvaXByb3V0ZTIvaW5jbHVkZS9qc29uX3dyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiOWEwMDgKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pbmNsdWRlL2pzb25fd3JpdGVyLmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIFNpbXBsZSBzdHJlYW1pbmcgSlNPTiB3cml0ZXIKKyAqCisgKiBUaGlzIHRha2VzIGNhcmUgb2YgdGhlIGFubm95aW5nIGJpdHMgb2YgSlNPTiBzeW50YXggbGlrZSB0aGUgY29tbWFzCisgKiBhZnRlciBlbGVtZW50cworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJU3RlcGhlbiBIZW1taW5nZXIgPHN0ZXBoZW5AbmV0d29ya3BsdW1iZXIub3JnPgorICovCisKKyNpZm5kZWYgX0pTT05fV1JJVEVSX0hfCisjZGVmaW5lIF9KU09OX1dSSVRFUl9IXworCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBPcGFxdWUgY2xhc3Mgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBqc29uX3dyaXRlciBqc29uX3dyaXRlcl90OworCisvKiBDcmVhdGUgYSBuZXcgSlNPTiBzdHJlYW0gKi8KK2pzb25fd3JpdGVyX3QgKmpzb253X25ldyhGSUxFICpmKTsKKy8qIEVuZCBvdXRwdXQgdG8gSlNPTiBzdHJlYW0gKi8KK3ZvaWQganNvbndfZGVzdHJveShqc29uX3dyaXRlcl90ICoqc2VsZl9wKTsKKworLyogQ2F1c2Ugb3V0cHV0IHRvIGhhdmUgcHJldHR5IHdoaXRlc3BhY2UgKi8KK3ZvaWQganNvbndfcHJldHR5KGpzb25fd3JpdGVyX3QgKnNlbGYsIGJvb2wgb24pOworCisvKiBBZGQgcHJvcGVydHkgbmFtZSAqLwordm9pZCBqc29ud19uYW1lKGpzb25fd3JpdGVyX3QgKnNlbGYsIGNvbnN0IGNoYXIgKm5hbWUpOworCisvKiBBZGQgdmFsdWUgICovCit2b2lkIGpzb253X3N0cmluZyhqc29uX3dyaXRlcl90ICpzZWxmLCBjb25zdCBjaGFyICp2YWx1ZSk7Cit2b2lkIGpzb253X2Jvb2woanNvbl93cml0ZXJfdCAqc2VsZiwgYm9vbCB2YWx1ZSk7Cit2b2lkIGpzb253X2Zsb2F0KGpzb25fd3JpdGVyX3QgKnNlbGYsIGRvdWJsZSBudW1iZXIpOwordm9pZCBqc29ud191aW50KGpzb25fd3JpdGVyX3QgKnNlbGYsIHVpbnQ2NF90IG51bWJlcik7Cit2b2lkIGpzb253X2ludChqc29uX3dyaXRlcl90ICpzZWxmLCBpbnQ2NF90IG51bWJlcik7Cit2b2lkIGpzb253X251bGwoanNvbl93cml0ZXJfdCAqc2VsZik7CisKKy8qIFVzZWZ1bCBDb21iaW5hdGlvbnMgb2YgbmFtZSBhbmQgdmFsdWUgKi8KK3ZvaWQganNvbndfc3RyaW5nX2ZpZWxkKGpzb25fd3JpdGVyX3QgKnNlbGYsIGNvbnN0IGNoYXIgKnByb3AsIGNvbnN0IGNoYXIgKnZhbCk7Cit2b2lkIGpzb253X2Jvb2xfZmllbGQoanNvbl93cml0ZXJfdCAqc2VsZiwgY29uc3QgY2hhciAqcHJvcCwgYm9vbCB2YWx1ZSk7Cit2b2lkIGpzb253X2Zsb2F0X2ZpZWxkKGpzb25fd3JpdGVyX3QgKnNlbGYsIGNvbnN0IGNoYXIgKnByb3AsIGRvdWJsZSBudW0pOwordm9pZCBqc29ud191aW50X2ZpZWxkKGpzb25fd3JpdGVyX3QgKnNlbGYsIGNvbnN0IGNoYXIgKnByb3AsIHVpbnQ2NF90IG51bSk7Cit2b2lkIGpzb253X2ludF9maWVsZChqc29uX3dyaXRlcl90ICpzZWxmLCBjb25zdCBjaGFyICpwcm9wLCBpbnQ2NF90IG51bSk7Cit2b2lkIGpzb253X251bGxfZmllbGQoanNvbl93cml0ZXJfdCAqc2VsZiwgY29uc3QgY2hhciAqcHJvcCk7CisKKy8qIENvbGxlY3Rpb25zICovCit2b2lkIGpzb253X3N0YXJ0X29iamVjdChqc29uX3dyaXRlcl90ICpzZWxmKTsKK3ZvaWQganNvbndfZW5kX29iamVjdChqc29uX3dyaXRlcl90ICpzZWxmKTsKKwordm9pZCBqc29ud19zdGFydF9hcnJheShqc29uX3dyaXRlcl90ICpzZWxmKTsKK3ZvaWQganNvbndfZW5kX2FycmF5KGpzb25fd3JpdGVyX3QgKnNlbGYpOworCisvKiBPdmVycmlkZSBkZWZhdWx0IGV4Y2VwdGlvbiBoYW5kbGluZyAqLwordHlwZWRlZiB2b2lkIChqc29ud19lcnJfaGFuZGxlcl9mbikoY29uc3QgY2hhciAqKTsKKworI2VuZGlmIC8qIF9KU09OX1dSSVRFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saWJnZW5sLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpYmdlbmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGI0YmFmCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saWJnZW5sLmgKQEAgLTAsMCArMSwyNSBAQAorI2lmbmRlZiBfX0xJQkdFTkxfSF9fCisjZGVmaW5lIF9fTElCR0VOTF9IX18KKworI2luY2x1ZGUgImxpYm5ldGxpbmsuaCIKKworI2RlZmluZSBHRU5MX1JFUVVFU1QoX3JlcSwgX2J1ZnNpeiwgX2ZhbWlseSwgX2hkcnNpeiwgX3ZlciwgX2NtZCwgX2ZsYWdzKSBcCitzdHJ1Y3QgewkJCQkJCQkJXAorCXN0cnVjdCBubG1zZ2hkcgkJbjsJCQkJCVwKKwlzdHJ1Y3QgZ2VubG1zZ2hkcglnOwkJCQkJXAorCWNoYXIJCQlidWZbTkxNU0dfQUxJR04oX2hkcnNpeikgKyAoX2J1ZnNpeildOwlcCit9IF9yZXEgPSB7CQkJCQkJCQlcCisJLm4gPSB7CQkJCQkJCQlcCisJCS5ubG1zZ190eXBlID0gKF9mYW1pbHkpLAkJCQlcCisJCS5ubG1zZ19mbGFncyA9IChfZmxhZ3MpLAkJCQlcCisJCS5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoR0VOTF9IRFJMRU4gKyAoX2hkcnNpeikpLAlcCisJfSwJCQkJCQkJCVwKKwkuZyA9IHsJCQkJCQkJCVwKKwkJLmNtZCA9IChfY21kKSwJCQkJCQlcCisJCS52ZXJzaW9uID0gKF92ZXIpLAkJCQkJXAorCX0sCQkJCQkJCQlcCit9CisKK2V4dGVybiBpbnQgZ2VubF9yZXNvbHZlX2ZhbWlseShzdHJ1Y3QgcnRubF9oYW5kbGUgKmdydGgsIGNvbnN0IGNoYXIgKmZhbWlseSk7CisKKyNlbmRpZiAvKiBfX0xJQkdFTkxfSF9fICovCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpYmlwdGMvaXB0X2tlcm5lbF9oZWFkZXJzLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpYmlwdGMvaXB0X2tlcm5lbF9oZWFkZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU5NjNlOQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvbGliaXB0Yy9pcHRfa2VybmVsX2hlYWRlcnMuaApAQCAtMCwwICsxLDE1IEBACisvKiBUaGlzIGlzIHRoZSB1c2Vyc3BhY2Uva2VybmVsIGludGVyZmFjZSBmb3IgR2VuZXJpYyBJUCBDaGFpbnMsCisgICByZXF1aXJlZCBmb3IgbGliYzYuICovCisjaWZuZGVmIF9GV0NIQUlOU19LRVJORUxfSEVBREVSU19ICisjZGVmaW5lIF9GV0NIQUlOU19LRVJORUxfSEVBREVSU19ICisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2luY2x1ZGUgPG5ldGluZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pcF9pY21wLmg+CisjaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3VkcC5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpYmlwdGMvbGliaXA2dGMuaCBiL2lwcm91dGUyL2luY2x1ZGUvbGliaXB0Yy9saWJpcDZ0Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZWQ4MGEKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pbmNsdWRlL2xpYmlwdGMvbGliaXA2dGMuaApAQCAtMCwwICsxLDE2MSBAQAorI2lmbmRlZiBfTElCSVA2VENfSAorI2RlZmluZSBfTElCSVA2VENfSAorLyogTGlicmFyeSB3aGljaCBtYW5pcHVsYXRlcyBmaXJld2FsbCBydWxlcy4gVmVyc2lvbiAwLjIuICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpYmlwdGMvaXB0X2tlcm5lbF9oZWFkZXJzLmg+CisjaWZkZWYgX19jcGx1c3BsdXMKKyMJaW5jbHVkZSA8Y2xpbWl0cz4KKyNlbHNlCisjCWluY2x1ZGUgPGxpbWl0cy5oPiAvKiBJTlRfTUFYIGluIGlwNl90YWJsZXMuaCAqLworI2VuZGlmCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpYmlwdGMveHRjc2hhcmVkLmg+CisKKyNkZWZpbmUgaXA2dGNfaGFuZGxlIHh0Y19oYW5kbGUKKyNkZWZpbmUgaXA2dF9jaGFpbmxhYmVsIHh0X2NoYWlubGFiZWwKKworI2RlZmluZSBJUDZUQ19MQUJFTF9BQ0NFUFQgIkFDQ0VQVCIKKyNkZWZpbmUgSVA2VENfTEFCRUxfRFJPUCAiRFJPUCIKKyNkZWZpbmUgSVA2VENfTEFCRUxfUVVFVUUgICAiUVVFVUUiCisjZGVmaW5lIElQNlRDX0xBQkVMX1JFVFVSTiAiUkVUVVJOIgorCisvKiBEb2VzIHRoaXMgY2hhaW4gZXhpc3Q/ICovCitpbnQgaXA2dGNfaXNfY2hhaW4oY29uc3QgY2hhciAqY2hhaW4sIHN0cnVjdCB4dGNfaGFuZGxlICpjb25zdCBoYW5kbGUpOworCisvKiBUYWtlIGEgc25hcHNob3Qgb2YgdGhlIHJ1bGVzLiBSZXR1cm5zIE5VTEwgb24gZXJyb3IuICovCitzdHJ1Y3QgeHRjX2hhbmRsZSAqaXA2dGNfaW5pdChjb25zdCBjaGFyICp0YWJsZW5hbWUpOworCisvKiBDbGVhbnVwIGFmdGVyIGlwNnRjX2luaXQoKS4gKi8KK3ZvaWQgaXA2dGNfZnJlZShzdHJ1Y3QgeHRjX2hhbmRsZSAqaCk7CisKKy8qIEl0ZXJhdG9yIGZ1bmN0aW9ucyB0byBydW4gdGhyb3VnaCB0aGUgY2hhaW5zLiAgUmV0dXJucyBOVUxMIGF0IGVuZC4gKi8KK2NvbnN0IGNoYXIgKmlwNnRjX2ZpcnN0X2NoYWluKHN0cnVjdCB4dGNfaGFuZGxlICpoYW5kbGUpOworY29uc3QgY2hhciAqaXA2dGNfbmV4dF9jaGFpbihzdHJ1Y3QgeHRjX2hhbmRsZSAqaGFuZGxlKTsKKworLyogR2V0IGZpcnN0IHJ1bGUgaW4gdGhlIGdpdmVuIGNoYWluOiBOVUxMIGZvciBlbXB0eSBjaGFpbi4gKi8KK2NvbnN0IHN0cnVjdCBpcDZ0X2VudHJ5ICppcDZ0Y19maXJzdF9ydWxlKGNvbnN0IGNoYXIgKmNoYWluLAorCQkJCQkgIHN0cnVjdCB4dGNfaGFuZGxlICpoYW5kbGUpOworCisvKiBSZXR1cm5zIE5VTEwgd2hlbiBydWxlcyBydW4gb3V0LiAqLworY29uc3Qgc3RydWN0IGlwNnRfZW50cnkgKmlwNnRjX25leHRfcnVsZShjb25zdCBzdHJ1Y3QgaXA2dF9lbnRyeSAqcHJldiwKKwkJCQkJIHN0cnVjdCB4dGNfaGFuZGxlICpoYW5kbGUpOworCisvKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IG5hbWUgb2YgdGhpcyBwb3NpdGlvbi4gKi8KK2NvbnN0IGNoYXIgKmlwNnRjX2dldF90YXJnZXQoY29uc3Qgc3RydWN0IGlwNnRfZW50cnkgKmUsCisJCQkgICAgIHN0cnVjdCB4dGNfaGFuZGxlICpoYW5kbGUpOworCisvKiBJcyB0aGlzIGEgYnVpbHQtaW4gY2hhaW4/ICovCitpbnQgaXA2dGNfYnVpbHRpbihjb25zdCBjaGFyICpjaGFpbiwgc3RydWN0IHh0Y19oYW5kbGUgKmNvbnN0IGhhbmRsZSk7CisKKy8qIEdldCB0aGUgcG9saWN5IG9mIGEgZ2l2ZW4gYnVpbHQtaW4gY2hhaW4gKi8KK2NvbnN0IGNoYXIgKmlwNnRjX2dldF9wb2xpY3koY29uc3QgY2hhciAqY2hhaW4sCisJCQkgICAgIHN0cnVjdCB4dF9jb3VudGVycyAqY291bnRlcnMsCisJCQkgICAgIHN0cnVjdCB4dGNfaGFuZGxlICpoYW5kbGUpOworCisvKiBUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIFRSVUUgZm9yIE9LIG9yIDAgYW5kIHNldCBlcnJuby4gSWYgZXJybm8gPT0KKyAgIDAsIGl0IG1lYW5zIHRoZXJlIHdhcyBhIHZlcnNpb24gZXJyb3IgKGllLiB1cGdyYWRlIGxpYmlwdGMpLiAqLworLyogUnVsZSBudW1iZXJzIHN0YXJ0IGF0IDEgZm9yIHRoZSBmaXJzdCBydWxlLiAqLworCisvKiBJbnNlcnQgdGhlIGVudHJ5IGBmdycgaW4gY2hhaW4gYGNoYWluJyBpbnRvIHBvc2l0aW9uIGBydWxlbnVtJy4gKi8KK2ludCBpcDZ0Y19pbnNlcnRfZW50cnkoY29uc3QgeHRfY2hhaW5sYWJlbCBjaGFpbiwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X2VudHJ5ICplLAorCQkgICAgICAgdW5zaWduZWQgaW50IHJ1bGVudW0sCisJCSAgICAgICBzdHJ1Y3QgeHRjX2hhbmRsZSAqaGFuZGxlKTsKKworLyogQXRvbWljYWxseSByZXBsYWNlIHJ1bGUgYHJ1bGVudW0nIGluIGBjaGFpbicgd2l0aCBgZncnLiAqLworaW50IGlwNnRjX3JlcGxhY2VfZW50cnkoY29uc3QgeHRfY2hhaW5sYWJlbCBjaGFpbiwKKwkJCWNvbnN0IHN0cnVjdCBpcDZ0X2VudHJ5ICplLAorCQkJdW5zaWduZWQgaW50IHJ1bGVudW0sCisJCQlzdHJ1Y3QgeHRjX2hhbmRsZSAqaGFuZGxlKTsKKworLyogQXBwZW5kIGVudHJ5IGBmdycgdG8gY2hhaW4gYGNoYWluJy4gRXF1aXZhbGVudCB0byBpbnNlcnQgd2l0aAorICAgcnVsZW51bSA9IGxlbmd0aCBvZiBjaGFpbi4gKi8KK2ludCBpcDZ0Y19hcHBlbmRfZW50cnkoY29uc3QgeHRfY2hhaW5sYWJlbCBjaGFpbiwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X2VudHJ5ICplLAorCQkgICAgICAgc3RydWN0IHh0Y19oYW5kbGUgKmhhbmRsZSk7CisKKy8qIENoZWNrIHdoZXRoZXIgYSBtYXRjaGluZyBydWxlIGV4aXN0cyAqLworaW50IGlwNnRjX2NoZWNrX2VudHJ5KGNvbnN0IHh0X2NoYWlubGFiZWwgY2hhaW4sCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9lbnRyeSAqb3JpZ2Z3LAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqbWF0Y2htYXNrLAorCQkgICAgICAgc3RydWN0IHh0Y19oYW5kbGUgKmhhbmRsZSk7CisKKy8qIERlbGV0ZSB0aGUgZmlyc3QgcnVsZSBpbiBgY2hhaW4nIHdoaWNoIG1hdGNoZXMgYGZ3Jy4gKi8KK2ludCBpcDZ0Y19kZWxldGVfZW50cnkoY29uc3QgeHRfY2hhaW5sYWJlbCBjaGFpbiwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X2VudHJ5ICpvcmlnZncsCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICptYXRjaG1hc2ssCisJCSAgICAgICBzdHJ1Y3QgeHRjX2hhbmRsZSAqaGFuZGxlKTsKKworLyogRGVsZXRlIHRoZSBydWxlIGluIHBvc2l0aW9uIGBydWxlbnVtJyBpbiBgY2hhaW4nLiAqLworaW50IGlwNnRjX2RlbGV0ZV9udW1fZW50cnkoY29uc3QgeHRfY2hhaW5sYWJlbCBjaGFpbiwKKwkJCSAgIHVuc2lnbmVkIGludCBydWxlbnVtLAorCQkJICAgc3RydWN0IHh0Y19oYW5kbGUgKmhhbmRsZSk7CisKKy8qIENoZWNrIHRoZSBwYWNrZXQgYGZ3JyBvbiBjaGFpbiBgY2hhaW4nLiBSZXR1cm5zIHRoZSB2ZXJkaWN0LCBvcgorICAgTlVMTCBhbmQgc2V0cyBlcnJuby4gKi8KK2NvbnN0IGNoYXIgKmlwNnRjX2NoZWNrX3BhY2tldChjb25zdCB4dF9jaGFpbmxhYmVsIGNoYWluLAorCQkJICAgICAgIHN0cnVjdCBpcDZ0X2VudHJ5ICosCisJCQkgICAgICAgc3RydWN0IHh0Y19oYW5kbGUgKmhhbmRsZSk7CisKKy8qIEZsdXNoZXMgdGhlIGVudHJpZXMgaW4gdGhlIGdpdmVuIGNoYWluIChpZS4gZW1wdGllcyBjaGFpbikuICovCitpbnQgaXA2dGNfZmx1c2hfZW50cmllcyhjb25zdCB4dF9jaGFpbmxhYmVsIGNoYWluLAorCQkJc3RydWN0IHh0Y19oYW5kbGUgKmhhbmRsZSk7CisKKy8qIFplcm9lcyB0aGUgY291bnRlcnMgaW4gYSBjaGFpbi4gKi8KK2ludCBpcDZ0Y196ZXJvX2VudHJpZXMoY29uc3QgeHRfY2hhaW5sYWJlbCBjaGFpbiwKKwkJICAgICAgIHN0cnVjdCB4dGNfaGFuZGxlICpoYW5kbGUpOworCisvKiBDcmVhdGVzIGEgbmV3IGNoYWluLiAqLworaW50IGlwNnRjX2NyZWF0ZV9jaGFpbihjb25zdCB4dF9jaGFpbmxhYmVsIGNoYWluLAorCQkgICAgICAgc3RydWN0IHh0Y19oYW5kbGUgKmhhbmRsZSk7CisKKy8qIERlbGV0ZXMgYSBjaGFpbi4gKi8KK2ludCBpcDZ0Y19kZWxldGVfY2hhaW4oY29uc3QgeHRfY2hhaW5sYWJlbCBjaGFpbiwKKwkJICAgICAgIHN0cnVjdCB4dGNfaGFuZGxlICpoYW5kbGUpOworCisvKiBSZW5hbWVzIGEgY2hhaW4uICovCitpbnQgaXA2dGNfcmVuYW1lX2NoYWluKGNvbnN0IHh0X2NoYWlubGFiZWwgb2xkbmFtZSwKKwkJICAgICAgIGNvbnN0IHh0X2NoYWlubGFiZWwgbmV3bmFtZSwKKwkJICAgICAgIHN0cnVjdCB4dGNfaGFuZGxlICpoYW5kbGUpOworCisvKiBTZXRzIHRoZSBwb2xpY3kgb24gYSBidWlsdC1pbiBjaGFpbi4gKi8KK2ludCBpcDZ0Y19zZXRfcG9saWN5KGNvbnN0IHh0X2NoYWlubGFiZWwgY2hhaW4sCisJCSAgICAgY29uc3QgeHRfY2hhaW5sYWJlbCBwb2xpY3ksCisJCSAgICAgc3RydWN0IHh0X2NvdW50ZXJzICpjb3VudGVycywKKwkJICAgICBzdHJ1Y3QgeHRjX2hhbmRsZSAqaGFuZGxlKTsKKworLyogR2V0IHRoZSBudW1iZXIgb2YgcmVmZXJlbmNlcyB0byB0aGlzIGNoYWluICovCitpbnQgaXA2dGNfZ2V0X3JlZmVyZW5jZXModW5zaWduZWQgaW50ICpyZWYsIGNvbnN0IHh0X2NoYWlubGFiZWwgY2hhaW4sCisJCQkgc3RydWN0IHh0Y19oYW5kbGUgKmhhbmRsZSk7CisKKy8qIHJlYWQgcGFja2V0IGFuZCBieXRlIGNvdW50ZXJzIGZvciBhIHNwZWNpZmljIHJ1bGUgKi8KK3N0cnVjdCB4dF9jb3VudGVycyAqaXA2dGNfcmVhZF9jb3VudGVyKGNvbnN0IHh0X2NoYWlubGFiZWwgY2hhaW4sCisJCQkJCXVuc2lnbmVkIGludCBydWxlbnVtLAorCQkJCQlzdHJ1Y3QgeHRjX2hhbmRsZSAqaGFuZGxlKTsKKworLyogemVybyBwYWNrZXQgYW5kIGJ5dGUgY291bnRlcnMgZm9yIGEgc3BlY2lmaWMgcnVsZSAqLworaW50IGlwNnRjX3plcm9fY291bnRlcihjb25zdCB4dF9jaGFpbmxhYmVsIGNoYWluLAorCQkgICAgICAgdW5zaWduZWQgaW50IHJ1bGVudW0sCisJCSAgICAgICBzdHJ1Y3QgeHRjX2hhbmRsZSAqaGFuZGxlKTsKKworLyogc2V0IHBhY2tldCBhbmQgYnl0ZSBjb3VudGVycyBmb3IgYSBzcGVjaWZpYyBydWxlICovCitpbnQgaXA2dGNfc2V0X2NvdW50ZXIoY29uc3QgeHRfY2hhaW5sYWJlbCBjaGFpbiwKKwkJICAgICAgdW5zaWduZWQgaW50IHJ1bGVudW0sCisJCSAgICAgIHN0cnVjdCB4dF9jb3VudGVycyAqY291bnRlcnMsCisJCSAgICAgIHN0cnVjdCB4dGNfaGFuZGxlICpoYW5kbGUpOworCisvKiBNYWtlcyB0aGUgYWN0dWFsIGNoYW5nZXMuICovCitpbnQgaXA2dGNfY29tbWl0KHN0cnVjdCB4dGNfaGFuZGxlICpoYW5kbGUpOworCisvKiBHZXQgcmF3IHNvY2tldC4gKi8KK2ludCBpcDZ0Y19nZXRfcmF3X3NvY2tldCh2b2lkKTsKKworLyogVHJhbnNsYXRlcyBlcnJubyBudW1iZXJzIGludG8gbW9yZSBodW1hbi1yZWFkYWJsZSBmb3JtIHRoYW4gc3RyZXJyb3IuICovCitjb25zdCBjaGFyICppcDZ0Y19zdHJlcnJvcihpbnQgZXJyKTsKKworZXh0ZXJuIHZvaWQgZHVtcF9lbnRyaWVzNihzdHJ1Y3QgeHRjX2hhbmRsZSAqY29uc3QpOworCitleHRlcm4gY29uc3Qgc3RydWN0IHh0Y19vcHMgaXA2dGNfb3BzOworCisjZW5kaWYgLyogX0xJQklQNlRDX0ggKi8KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2luY2x1ZGUvbGliaXB0Yy9saWJpcHRjLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpYmlwdGMvbGliaXB0Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0Y2RiZGIKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pbmNsdWRlL2xpYmlwdGMvbGliaXB0Yy5oCkBAIC0wLDAgKzEsMTcyIEBACisjaWZuZGVmIF9MSUJJUFRDX0gKKyNkZWZpbmUgX0xJQklQVENfSAorLyogTGlicmFyeSB3aGljaCBtYW5pcHVsYXRlcyBmaWx0ZXJpbmcgcnVsZXMuICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpYmlwdGMvaXB0X2tlcm5lbF9oZWFkZXJzLmg+CisjaWZkZWYgX19jcGx1c3BsdXMKKyMJaW5jbHVkZSA8Y2xpbWl0cz4KKyNlbHNlCisjCWluY2x1ZGUgPGxpbWl0cy5oPiAvKiBJTlRfTUFYIGluIGlwX3RhYmxlcy5oICovCisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaWJpcHRjL3h0Y3NoYXJlZC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgaXB0Y19oYW5kbGUgeHRjX2hhbmRsZQorI2RlZmluZSBpcHRfY2hhaW5sYWJlbCB4dF9jaGFpbmxhYmVsCisKKyNkZWZpbmUgSVBUQ19MQUJFTF9BQ0NFUFQgICJBQ0NFUFQiCisjZGVmaW5lIElQVENfTEFCRUxfRFJPUCAgICAiRFJPUCIKKyNkZWZpbmUgSVBUQ19MQUJFTF9RVUVVRSAgICJRVUVVRSIKKyNkZWZpbmUgSVBUQ19MQUJFTF9SRVRVUk4gICJSRVRVUk4iCisKKy8qIERvZXMgdGhpcyBjaGFpbiBleGlzdD8gKi8KK2ludCBpcHRjX2lzX2NoYWluKGNvbnN0IGNoYXIgKmNoYWluLCBzdHJ1Y3QgeHRjX2hhbmRsZSAqY29uc3QgaGFuZGxlKTsKKworLyogVGFrZSBhIHNuYXBzaG90IG9mIHRoZSBydWxlcy4gIFJldHVybnMgTlVMTCBvbiBlcnJvci4gKi8KK3N0cnVjdCB4dGNfaGFuZGxlICppcHRjX2luaXQoY29uc3QgY2hhciAqdGFibGVuYW1lKTsKKworLyogQ2xlYW51cCBhZnRlciBpcHRjX2luaXQoKS4gKi8KK3ZvaWQgaXB0Y19mcmVlKHN0cnVjdCB4dGNfaGFuZGxlICpoKTsKKworLyogSXRlcmF0b3IgZnVuY3Rpb25zIHRvIHJ1biB0aHJvdWdoIHRoZSBjaGFpbnMuICBSZXR1cm5zIE5VTEwgYXQgZW5kLiAqLworY29uc3QgY2hhciAqaXB0Y19maXJzdF9jaGFpbihzdHJ1Y3QgeHRjX2hhbmRsZSAqaGFuZGxlKTsKK2NvbnN0IGNoYXIgKmlwdGNfbmV4dF9jaGFpbihzdHJ1Y3QgeHRjX2hhbmRsZSAqaGFuZGxlKTsKKworLyogR2V0IGZpcnN0IHJ1bGUgaW4gdGhlIGdpdmVuIGNoYWluOiBOVUxMIGZvciBlbXB0eSBjaGFpbi4gKi8KK2NvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmlwdGNfZmlyc3RfcnVsZShjb25zdCBjaGFyICpjaGFpbiwKKwkJCQkJc3RydWN0IHh0Y19oYW5kbGUgKmhhbmRsZSk7CisKKy8qIFJldHVybnMgTlVMTCB3aGVuIHJ1bGVzIHJ1biBvdXQuICovCitjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICppcHRjX25leHRfcnVsZShjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICpwcmV2LAorCQkJCSAgICAgICBzdHJ1Y3QgeHRjX2hhbmRsZSAqaGFuZGxlKTsKKworLyogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBuYW1lIG9mIHRoaXMgZW50cnkuICovCitjb25zdCBjaGFyICppcHRjX2dldF90YXJnZXQoY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKwkJCSAgICBzdHJ1Y3QgeHRjX2hhbmRsZSAqaGFuZGxlKTsKKworLyogSXMgdGhpcyBhIGJ1aWx0LWluIGNoYWluPyAqLworaW50IGlwdGNfYnVpbHRpbihjb25zdCBjaGFyICpjaGFpbiwgc3RydWN0IHh0Y19oYW5kbGUgKmNvbnN0IGhhbmRsZSk7CisKKy8qIEdldCB0aGUgcG9saWN5IG9mIGEgZ2l2ZW4gYnVpbHQtaW4gY2hhaW4gKi8KK2NvbnN0IGNoYXIgKmlwdGNfZ2V0X3BvbGljeShjb25zdCBjaGFyICpjaGFpbiwKKwkJCSAgICBzdHJ1Y3QgeHRfY291bnRlcnMgKmNvdW50ZXIsCisJCQkgICAgc3RydWN0IHh0Y19oYW5kbGUgKmhhbmRsZSk7CisKKy8qIFRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gVFJVRSBmb3IgT0sgb3IgMCBhbmQgc2V0IGVycm5vLiAgSWYgZXJybm8gPT0KKyAgIDAsIGl0IG1lYW5zIHRoZXJlIHdhcyBhIHZlcnNpb24gZXJyb3IgKGllLiB1cGdyYWRlIGxpYmlwdGMpLiAqLworLyogUnVsZSBudW1iZXJzIHN0YXJ0IGF0IDEgZm9yIHRoZSBmaXJzdCBydWxlLiAqLworCisvKiBJbnNlcnQgdGhlIGVudHJ5IGBlJyBpbiBjaGFpbiBgY2hhaW4nIGludG8gcG9zaXRpb24gYHJ1bGVudW0nLiAqLworaW50IGlwdGNfaW5zZXJ0X2VudHJ5KGNvbnN0IHh0X2NoYWlubGFiZWwgY2hhaW4sCisJCSAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisJCSAgICAgIHVuc2lnbmVkIGludCBydWxlbnVtLAorCQkgICAgICBzdHJ1Y3QgeHRjX2hhbmRsZSAqaGFuZGxlKTsKKworLyogQXRvbWljYWxseSByZXBsYWNlIHJ1bGUgYHJ1bGVudW0nIGluIGBjaGFpbicgd2l0aCBgZScuICovCitpbnQgaXB0Y19yZXBsYWNlX2VudHJ5KGNvbnN0IHh0X2NoYWlubGFiZWwgY2hhaW4sCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorCQkgICAgICAgdW5zaWduZWQgaW50IHJ1bGVudW0sCisJCSAgICAgICBzdHJ1Y3QgeHRjX2hhbmRsZSAqaGFuZGxlKTsKKworLyogQXBwZW5kIGVudHJ5IGBlJyB0byBjaGFpbiBgY2hhaW4nLiAgRXF1aXZhbGVudCB0byBpbnNlcnQgd2l0aAorICAgcnVsZW51bSA9IGxlbmd0aCBvZiBjaGFpbi4gKi8KK2ludCBpcHRjX2FwcGVuZF9lbnRyeShjb25zdCB4dF9jaGFpbmxhYmVsIGNoYWluLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorCQkgICAgICBzdHJ1Y3QgeHRjX2hhbmRsZSAqaGFuZGxlKTsKKworLyogQ2hlY2sgd2hldGhlciBhIG1hdGhjaGluZyBydWxlIGV4aXN0cyAqLworaW50IGlwdGNfY2hlY2tfZW50cnkoY29uc3QgeHRfY2hhaW5sYWJlbCBjaGFpbiwKKwkJICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqb3JpZ2Z3LAorCQkgICAgICB1bnNpZ25lZCBjaGFyICptYXRjaG1hc2ssCisJCSAgICAgIHN0cnVjdCB4dGNfaGFuZGxlICpoYW5kbGUpOworCisvKiBEZWxldGUgdGhlIGZpcnN0IHJ1bGUgaW4gYGNoYWluJyB3aGljaCBtYXRjaGVzIGBlJywgc3ViamVjdCB0bworICAgbWF0Y2htYXNrIChhcnJheSBvZiBsZW5ndGggPT0gb3JpZ2Z3KSAqLworaW50IGlwdGNfZGVsZXRlX2VudHJ5KGNvbnN0IHh0X2NoYWlubGFiZWwgY2hhaW4sCisJCSAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKm9yaWdmdywKKwkJICAgICAgdW5zaWduZWQgY2hhciAqbWF0Y2htYXNrLAorCQkgICAgICBzdHJ1Y3QgeHRjX2hhbmRsZSAqaGFuZGxlKTsKKworLyogRGVsZXRlIHRoZSBydWxlIGluIHBvc2l0aW9uIGBydWxlbnVtJyBpbiBgY2hhaW4nLiAqLworaW50IGlwdGNfZGVsZXRlX251bV9lbnRyeShjb25zdCB4dF9jaGFpbmxhYmVsIGNoYWluLAorCQkJICB1bnNpZ25lZCBpbnQgcnVsZW51bSwKKwkJCSAgc3RydWN0IHh0Y19oYW5kbGUgKmhhbmRsZSk7CisKKy8qIENoZWNrIHRoZSBwYWNrZXQgYGUnIG9uIGNoYWluIGBjaGFpbicuICBSZXR1cm5zIHRoZSB2ZXJkaWN0LCBvcgorICAgTlVMTCBhbmQgc2V0cyBlcnJuby4gKi8KK2NvbnN0IGNoYXIgKmlwdGNfY2hlY2tfcGFja2V0KGNvbnN0IHh0X2NoYWlubGFiZWwgY2hhaW4sCisJCQkgICAgICBzdHJ1Y3QgaXB0X2VudHJ5ICplbnRyeSwKKwkJCSAgICAgIHN0cnVjdCB4dGNfaGFuZGxlICpoYW5kbGUpOworCisvKiBGbHVzaGVzIHRoZSBlbnRyaWVzIGluIHRoZSBnaXZlbiBjaGFpbiAoaWUuIGVtcHRpZXMgY2hhaW4pLiAqLworaW50IGlwdGNfZmx1c2hfZW50cmllcyhjb25zdCB4dF9jaGFpbmxhYmVsIGNoYWluLAorCQkgICAgICAgc3RydWN0IHh0Y19oYW5kbGUgKmhhbmRsZSk7CisKKy8qIFplcm9lcyB0aGUgY291bnRlcnMgaW4gYSBjaGFpbi4gKi8KK2ludCBpcHRjX3plcm9fZW50cmllcyhjb25zdCB4dF9jaGFpbmxhYmVsIGNoYWluLAorCQkgICAgICBzdHJ1Y3QgeHRjX2hhbmRsZSAqaGFuZGxlKTsKKworLyogQ3JlYXRlcyBhIG5ldyBjaGFpbi4gKi8KK2ludCBpcHRjX2NyZWF0ZV9jaGFpbihjb25zdCB4dF9jaGFpbmxhYmVsIGNoYWluLAorCQkgICAgICBzdHJ1Y3QgeHRjX2hhbmRsZSAqaGFuZGxlKTsKKworLyogRGVsZXRlcyBhIGNoYWluLiAqLworaW50IGlwdGNfZGVsZXRlX2NoYWluKGNvbnN0IHh0X2NoYWlubGFiZWwgY2hhaW4sCisJCSAgICAgIHN0cnVjdCB4dGNfaGFuZGxlICpoYW5kbGUpOworCisvKiBSZW5hbWVzIGEgY2hhaW4uICovCitpbnQgaXB0Y19yZW5hbWVfY2hhaW4oY29uc3QgeHRfY2hhaW5sYWJlbCBvbGRuYW1lLAorCQkgICAgICBjb25zdCB4dF9jaGFpbmxhYmVsIG5ld25hbWUsCisJCSAgICAgIHN0cnVjdCB4dGNfaGFuZGxlICpoYW5kbGUpOworCisvKiBTZXRzIHRoZSBwb2xpY3kgb24gYSBidWlsdC1pbiBjaGFpbi4gKi8KK2ludCBpcHRjX3NldF9wb2xpY3koY29uc3QgeHRfY2hhaW5sYWJlbCBjaGFpbiwKKwkJICAgIGNvbnN0IHh0X2NoYWlubGFiZWwgcG9saWN5LAorCQkgICAgc3RydWN0IHh0X2NvdW50ZXJzICpjb3VudGVycywKKwkJICAgIHN0cnVjdCB4dGNfaGFuZGxlICpoYW5kbGUpOworCisvKiBHZXQgdGhlIG51bWJlciBvZiByZWZlcmVuY2VzIHRvIHRoaXMgY2hhaW4gKi8KK2ludCBpcHRjX2dldF9yZWZlcmVuY2VzKHVuc2lnbmVkIGludCAqcmVmLAorCQkJY29uc3QgeHRfY2hhaW5sYWJlbCBjaGFpbiwKKwkJCXN0cnVjdCB4dGNfaGFuZGxlICpoYW5kbGUpOworCisvKiByZWFkIHBhY2tldCBhbmQgYnl0ZSBjb3VudGVycyBmb3IgYSBzcGVjaWZpYyBydWxlICovCitzdHJ1Y3QgeHRfY291bnRlcnMgKmlwdGNfcmVhZF9jb3VudGVyKGNvbnN0IHh0X2NoYWlubGFiZWwgY2hhaW4sCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBydWxlbnVtLAorCQkJCSAgICAgICBzdHJ1Y3QgeHRjX2hhbmRsZSAqaGFuZGxlKTsKKworLyogemVybyBwYWNrZXQgYW5kIGJ5dGUgY291bnRlcnMgZm9yIGEgc3BlY2lmaWMgcnVsZSAqLworaW50IGlwdGNfemVyb19jb3VudGVyKGNvbnN0IHh0X2NoYWlubGFiZWwgY2hhaW4sCisJCSAgICAgIHVuc2lnbmVkIGludCBydWxlbnVtLAorCQkgICAgICBzdHJ1Y3QgeHRjX2hhbmRsZSAqaGFuZGxlKTsKKworLyogc2V0IHBhY2tldCBhbmQgYnl0ZSBjb3VudGVycyBmb3IgYSBzcGVjaWZpYyBydWxlICovCitpbnQgaXB0Y19zZXRfY291bnRlcihjb25zdCB4dF9jaGFpbmxhYmVsIGNoYWluLAorCQkgICAgIHVuc2lnbmVkIGludCBydWxlbnVtLAorCQkgICAgIHN0cnVjdCB4dF9jb3VudGVycyAqY291bnRlcnMsCisJCSAgICAgc3RydWN0IHh0Y19oYW5kbGUgKmhhbmRsZSk7CisKKy8qIE1ha2VzIHRoZSBhY3R1YWwgY2hhbmdlcy4gKi8KK2ludCBpcHRjX2NvbW1pdChzdHJ1Y3QgeHRjX2hhbmRsZSAqaGFuZGxlKTsKKworLyogR2V0IHJhdyBzb2NrZXQuICovCitpbnQgaXB0Y19nZXRfcmF3X3NvY2tldCh2b2lkKTsKKworLyogVHJhbnNsYXRlcyBlcnJubyBudW1iZXJzIGludG8gbW9yZSBodW1hbi1yZWFkYWJsZSBmb3JtIHRoYW4gc3RyZXJyb3IuICovCitjb25zdCBjaGFyICppcHRjX3N0cmVycm9yKGludCBlcnIpOworCitleHRlcm4gdm9pZCBkdW1wX2VudHJpZXMoc3RydWN0IHh0Y19oYW5kbGUgKmNvbnN0KTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCB4dGNfb3BzIGlwdGNfb3BzOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKyNlbmRpZiAvKiBfTElCSVBUQ19IICovCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpYmlwdGMvbGlieHRjLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpYmlwdGMvbGlieHRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcwMTAxOAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvbGliaXB0Yy9saWJ4dGMuaApAQCAtMCwwICsxLDMzIEBACisjaWZuZGVmIF9MSUJYVENfSAorI2RlZmluZSBfTElCWFRDX0gKKy8qIExpYnJhcnkgd2hpY2ggbWFuaXB1bGF0ZXMgZmlsdGVyaW5nIHJ1bGVzLiAqLworCisjaW5jbHVkZSA8bGliaXB0Yy9pcHRfa2VybmVsX2hlYWRlcnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZuZGVmIFhUX01JTl9BTElHTgorLyogeHRfZW50cnkgaGFzIHBvaW50ZXJzIGFuZCB1X2ludDY0X3QncyBpbiBpdCwgc28gaWYgeW91IGFsaWduIHRvCisgICBpdCwgeW91J2xsIGFsc28gYWxpZ24gdG8gYW55IGNyYXp5IG1hdGNoZXMgYW5kIHRhcmdldHMgc29tZW9uZQorICAgbWlnaHQgd3JpdGUgKi8KKyNkZWZpbmUgWFRfTUlOX0FMSUdOIChfX2FsaWdub2ZfXyhzdHJ1Y3QgeHRfZW50cnkpKQorI2VuZGlmCisKKyNpZm5kZWYgWFRfQUxJR04KKyNkZWZpbmUgWFRfQUxJR04ocykgKCgocykgKyAoKFhUX01JTl9BTElHTiktMSkpICYgfigoWFRfTUlOX0FMSUdOKS0xKSkKKyNlbmRpZgorCisjZGVmaW5lIFhUQ19MQUJFTF9BQ0NFUFQgICJBQ0NFUFQiCisjZGVmaW5lIFhUQ19MQUJFTF9EUk9QICAgICJEUk9QIgorI2RlZmluZSBYVENfTEFCRUxfUVVFVUUgICAiUVVFVUUiCisjZGVmaW5lIFhUQ19MQUJFTF9SRVRVUk4gICJSRVRVUk4iCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9MSUJYVENfSCAqLwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saWJpcHRjL3h0Y3NoYXJlZC5oIGIvaXByb3V0ZTIvaW5jbHVkZS9saWJpcHRjL3h0Y3NoYXJlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3M2ViYzQKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pbmNsdWRlL2xpYmlwdGMveHRjc2hhcmVkLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBfTElCWFRDX1NIQVJFRF9ICisjZGVmaW5lIF9MSUJYVENfU0hBUkVEX0ggMQorCit0eXBlZGVmIGNoYXIgeHRfY2hhaW5sYWJlbFszMl07CitzdHJ1Y3QgeHRjX2hhbmRsZTsKK3N0cnVjdCB4dF9jb3VudGVyczsKKworc3RydWN0IHh0Y19vcHMgeworCWludCAoKmNvbW1pdCkoc3RydWN0IHh0Y19oYW5kbGUgKik7CisJdm9pZCAoKmZyZWUpKHN0cnVjdCB4dGNfaGFuZGxlICopOworCWludCAoKmJ1aWx0aW4pKGNvbnN0IGNoYXIgKiwgc3RydWN0IHh0Y19oYW5kbGUgKmNvbnN0KTsKKwlpbnQgKCppc19jaGFpbikoY29uc3QgY2hhciAqLCBzdHJ1Y3QgeHRjX2hhbmRsZSAqY29uc3QpOworCWludCAoKmZsdXNoX2VudHJpZXMpKGNvbnN0IHh0X2NoYWlubGFiZWwsIHN0cnVjdCB4dGNfaGFuZGxlICopOworCWludCAoKmNyZWF0ZV9jaGFpbikoY29uc3QgeHRfY2hhaW5sYWJlbCwgc3RydWN0IHh0Y19oYW5kbGUgKik7CisJaW50ICgqc2V0X3BvbGljeSkoY29uc3QgeHRfY2hhaW5sYWJlbCwgY29uc3QgeHRfY2hhaW5sYWJlbCwKKwkJCSAgc3RydWN0IHh0X2NvdW50ZXJzICosIHN0cnVjdCB4dGNfaGFuZGxlICopOworCWNvbnN0IGNoYXIgKigqc3RyZXJyb3IpKGludCk7Cit9OworCisjZW5kaWYgLyogX0xJQlhUQ19TSEFSRURfSCAqLwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saWJuZXRsaW5rLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpYm5ldGxpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzExODllCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saWJuZXRsaW5rLmgKQEAgLTAsMCArMSwyMDUgQEAKKyNpZm5kZWYgX19MSUJORVRMSU5LX0hfXworI2RlZmluZSBfX0xJQk5FVExJTktfSF9fIDEKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2xpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hZGRyLmg+CisjaW5jbHVkZSA8bGludXgvbmVpZ2hib3VyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Y29uZi5oPgorCitzdHJ1Y3QgcnRubF9oYW5kbGUKK3sKKwlpbnQJCQlmZDsKKwlzdHJ1Y3Qgc29ja2FkZHJfbmwJbG9jYWw7CisJc3RydWN0IHNvY2thZGRyX25sCXBlZXI7CisJX191MzIJCQlzZXE7CisJX191MzIJCQlkdW1wOworCWludAkJCXByb3RvOworCUZJTEUJCSAgICAgICAqZHVtcF9mcDsKKyNkZWZpbmUgUlROTF9IQU5ETEVfRl9MSVNURU5fQUxMX05TSUQJCTB4MDEKKwlpbnQJCQlmbGFnczsKK307CisKK2V4dGVybiBpbnQgcmN2YnVmOworCitpbnQgcnRubF9vcGVuKHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoLCB1bnNpZ25lZCBzdWJzY3JpcHRpb25zKQorCV9fYXR0cmlidXRlX18oKHdhcm5fdW51c2VkX3Jlc3VsdCkpOworCitpbnQgcnRubF9vcGVuX2J5cHJvdG8oc3RydWN0IHJ0bmxfaGFuZGxlICpydGgsIHVuc2lnbmVkIHN1YnNjcmlwdGlvbnMsCisJCQkgICAgIGludCBwcm90b2NvbCkKKwlfX2F0dHJpYnV0ZV9fKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKKwordm9pZCBydG5sX2Nsb3NlKHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoKTsKK2ludCBydG5sX3dpbGRkdW1wX3JlcXVlc3Qoc3RydWN0IHJ0bmxfaGFuZGxlICpydGgsIGludCBmYW0sIGludCB0eXBlKQorCV9fYXR0cmlidXRlX18oKHdhcm5fdW51c2VkX3Jlc3VsdCkpOworaW50IHJ0bmxfd2lsZGR1bXBfcmVxX2ZpbHRlcihzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0aCwgaW50IGZhbSwgaW50IHR5cGUsCisJCQkJICAgIF9fdTMyIGZpbHRfbWFzaykKKwlfX2F0dHJpYnV0ZV9fKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKK2ludCBydG5sX2R1bXBfcmVxdWVzdChzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0aCwgaW50IHR5cGUsIHZvaWQgKnJlcSwKKwkJCSAgICAgaW50IGxlbikKKwlfX2F0dHJpYnV0ZV9fKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKK2ludCBydG5sX2R1bXBfcmVxdWVzdF9uKHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoLCBzdHJ1Y3Qgbmxtc2doZHIgKm4pCisJX19hdHRyaWJ1dGVfXygod2Fybl91bnVzZWRfcmVzdWx0KSk7CisKK3N0cnVjdCBydG5sX2N0cmxfZGF0YSB7CisJaW50CW5zaWQ7Cit9OworCit0eXBlZGVmIGludCAoKnJ0bmxfZmlsdGVyX3QpKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqLAorCQkJICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKik7CisKK3R5cGVkZWYgaW50ICgqcnRubF9saXN0ZW5fZmlsdGVyX3QpKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqLAorCQkJCSAgICBzdHJ1Y3QgcnRubF9jdHJsX2RhdGEgKiwKKwkJCQkgICAgc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICopOworCitzdHJ1Y3QgcnRubF9kdW1wX2ZpbHRlcl9hcmcKK3sKKwlydG5sX2ZpbHRlcl90IGZpbHRlcjsKKwl2b2lkICphcmcxOworCV9fdTE2IG5jX2ZsYWdzOworfTsKKworaW50IHJ0bmxfZHVtcF9maWx0ZXJfbChzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0aCwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBydG5sX2R1bXBfZmlsdGVyX2FyZyAqYXJnKTsKK2ludCBydG5sX2R1bXBfZmlsdGVyX25jKHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoLAorCQkJcnRubF9maWx0ZXJfdCBmaWx0ZXIsCisJCQl2b2lkICphcmcsIF9fdTE2IG5jX2ZsYWdzKTsKKyNkZWZpbmUgcnRubF9kdW1wX2ZpbHRlcihydGgsIGZpbHRlciwgYXJnKSBcCisJcnRubF9kdW1wX2ZpbHRlcl9uYyhydGgsIGZpbHRlciwgYXJnLCAwKQoraW50IHJ0bmxfdGFsayhzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0bmwsIHN0cnVjdCBubG1zZ2hkciAqbiwKKwkgICAgICBzdHJ1Y3Qgbmxtc2doZHIgKmFuc3dlciwgc2l6ZV90IGxlbikKKwlfX2F0dHJpYnV0ZV9fKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKK2ludCBydG5sX3NlbmQoc3RydWN0IHJ0bmxfaGFuZGxlICpydGgsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50KQorCV9fYXR0cmlidXRlX18oKHdhcm5fdW51c2VkX3Jlc3VsdCkpOworaW50IHJ0bmxfc2VuZF9jaGVjayhzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0aCwgY29uc3Qgdm9pZCAqYnVmLCBpbnQpCisJX19hdHRyaWJ1dGVfXygod2Fybl91bnVzZWRfcmVzdWx0KSk7CisKK2ludCBhZGRhdHRyKHN0cnVjdCBubG1zZ2hkciAqbiwgaW50IG1heGxlbiwgaW50IHR5cGUpOworaW50IGFkZGF0dHI4KHN0cnVjdCBubG1zZ2hkciAqbiwgaW50IG1heGxlbiwgaW50IHR5cGUsIF9fdTggZGF0YSk7CitpbnQgYWRkYXR0cjE2KHN0cnVjdCBubG1zZ2hkciAqbiwgaW50IG1heGxlbiwgaW50IHR5cGUsIF9fdTE2IGRhdGEpOworaW50IGFkZGF0dHIzMihzdHJ1Y3Qgbmxtc2doZHIgKm4sIGludCBtYXhsZW4sIGludCB0eXBlLCBfX3UzMiBkYXRhKTsKK2ludCBhZGRhdHRyNjQoc3RydWN0IG5sbXNnaGRyICpuLCBpbnQgbWF4bGVuLCBpbnQgdHlwZSwgX191NjQgZGF0YSk7CitpbnQgYWRkYXR0cnN0cnooc3RydWN0IG5sbXNnaGRyICpuLCBpbnQgbWF4bGVuLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqZGF0YSk7CisKK2ludCBhZGRhdHRyX2woc3RydWN0IG5sbXNnaGRyICpuLCBpbnQgbWF4bGVuLCBpbnQgdHlwZSwKKwkgICAgICBjb25zdCB2b2lkICpkYXRhLCBpbnQgYWxlbik7CitpbnQgYWRkcmF3X2woc3RydWN0IG5sbXNnaGRyICpuLCBpbnQgbWF4bGVuLCBjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKTsKK3N0cnVjdCBydGF0dHIgKmFkZGF0dHJfbmVzdChzdHJ1Y3Qgbmxtc2doZHIgKm4sIGludCBtYXhsZW4sIGludCB0eXBlKTsKK2ludCBhZGRhdHRyX25lc3RfZW5kKHN0cnVjdCBubG1zZ2hkciAqbiwgc3RydWN0IHJ0YXR0ciAqbmVzdCk7CitzdHJ1Y3QgcnRhdHRyICphZGRhdHRyX25lc3RfY29tcGF0KHN0cnVjdCBubG1zZ2hkciAqbiwgaW50IG1heGxlbiwgaW50IHR5cGUsCisJCQkJICAgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGxlbik7CitpbnQgYWRkYXR0cl9uZXN0X2NvbXBhdF9lbmQoc3RydWN0IG5sbXNnaGRyICpuLCBzdHJ1Y3QgcnRhdHRyICpuZXN0KTsKK2ludCBydGFfYWRkYXR0cjgoc3RydWN0IHJ0YXR0ciAqcnRhLCBpbnQgbWF4bGVuLCBpbnQgdHlwZSwgX191OCBkYXRhKTsKK2ludCBydGFfYWRkYXR0cjE2KHN0cnVjdCBydGF0dHIgKnJ0YSwgaW50IG1heGxlbiwgaW50IHR5cGUsIF9fdTE2IGRhdGEpOworaW50IHJ0YV9hZGRhdHRyMzIoc3RydWN0IHJ0YXR0ciAqcnRhLCBpbnQgbWF4bGVuLCBpbnQgdHlwZSwgX191MzIgZGF0YSk7CitpbnQgcnRhX2FkZGF0dHI2NChzdHJ1Y3QgcnRhdHRyICpydGEsIGludCBtYXhsZW4sIGludCB0eXBlLCBfX3U2NCBkYXRhKTsKK2ludCBydGFfYWRkYXR0cl9sKHN0cnVjdCBydGF0dHIgKnJ0YSwgaW50IG1heGxlbiwgaW50IHR5cGUsCisJCSAgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGFsZW4pOworCitpbnQgcGFyc2VfcnRhdHRyKHN0cnVjdCBydGF0dHIgKnRiW10sIGludCBtYXgsIHN0cnVjdCBydGF0dHIgKnJ0YSwgaW50IGxlbik7CitpbnQgcGFyc2VfcnRhdHRyX2ZsYWdzKHN0cnVjdCBydGF0dHIgKnRiW10sIGludCBtYXgsIHN0cnVjdCBydGF0dHIgKnJ0YSwKKwkJCSAgICAgIGludCBsZW4sIHVuc2lnbmVkIHNob3J0IGZsYWdzKTsKK2ludCBwYXJzZV9ydGF0dHJfYnlpbmRleChzdHJ1Y3QgcnRhdHRyICp0YltdLCBpbnQgbWF4LAorCQkJIHN0cnVjdCBydGF0dHIgKnJ0YSwgaW50IGxlbik7CitzdHJ1Y3QgcnRhdHRyICpwYXJzZV9ydGF0dHJfb25lKGludCB0eXBlLCBzdHJ1Y3QgcnRhdHRyICpydGEsIGludCBsZW4pOworaW50IF9fcGFyc2VfcnRhdHRyX25lc3RlZF9jb21wYXQoc3RydWN0IHJ0YXR0ciAqdGJbXSwgaW50IG1heCwgc3RydWN0IHJ0YXR0ciAqcnRhLCBpbnQgbGVuKTsKKworc3RydWN0IHJ0YXR0ciAqcnRhX25lc3Qoc3RydWN0IHJ0YXR0ciAqcnRhLCBpbnQgbWF4bGVuLCBpbnQgdHlwZSk7CitpbnQgcnRhX25lc3RfZW5kKHN0cnVjdCBydGF0dHIgKnJ0YSwgc3RydWN0IHJ0YXR0ciAqbmVzdCk7CisKKyNkZWZpbmUgUlRBX1RBSUwocnRhKSBcCisJCSgoc3RydWN0IHJ0YXR0ciAqKSAoKCh2b2lkICopIChydGEpKSArIFwKKwkJCQkgICAgUlRBX0FMSUdOKChydGEpLT5ydGFfbGVuKSkpCisKKyNkZWZpbmUgcGFyc2VfcnRhdHRyX25lc3RlZCh0YiwgbWF4LCBydGEpIFwKKwkocGFyc2VfcnRhdHRyKCh0YiksIChtYXgpLCBSVEFfREFUQShydGEpLCBSVEFfUEFZTE9BRChydGEpKSkKKworI2RlZmluZSBwYXJzZV9ydGF0dHJfb25lX25lc3RlZCh0eXBlLCBydGEpIFwKKwkocGFyc2VfcnRhdHRyX29uZSh0eXBlLCBSVEFfREFUQShydGEpLCBSVEFfUEFZTE9BRChydGEpKSkKKworI2RlZmluZSBwYXJzZV9ydGF0dHJfbmVzdGVkX2NvbXBhdCh0YiwgbWF4LCBydGEsIGRhdGEsIGxlbikgXAorCSh7IGRhdGEgPSBSVEFfUEFZTE9BRChydGEpID49IGxlbiA/IFJUQV9EQVRBKHJ0YSkgOiBOVUxMOwlcCisJCV9fcGFyc2VfcnRhdHRyX25lc3RlZF9jb21wYXQodGIsIG1heCwgcnRhLCBsZW4pOyB9KQorCitzdGF0aWMgaW5saW5lIF9fdTggcnRhX2dldGF0dHJfdTgoY29uc3Qgc3RydWN0IHJ0YXR0ciAqcnRhKQoreworCXJldHVybiAqKF9fdTggKilSVEFfREFUQShydGEpOworfQorc3RhdGljIGlubGluZSBfX3UxNiBydGFfZ2V0YXR0cl91MTYoY29uc3Qgc3RydWN0IHJ0YXR0ciAqcnRhKQoreworCXJldHVybiAqKF9fdTE2ICopUlRBX0RBVEEocnRhKTsKK30KK3N0YXRpYyBpbmxpbmUgX191MzIgcnRhX2dldGF0dHJfdTMyKGNvbnN0IHN0cnVjdCBydGF0dHIgKnJ0YSkKK3sKKwlyZXR1cm4gKihfX3UzMiAqKVJUQV9EQVRBKHJ0YSk7Cit9CitzdGF0aWMgaW5saW5lIF9fdTY0IHJ0YV9nZXRhdHRyX3U2NChjb25zdCBzdHJ1Y3QgcnRhdHRyICpydGEpCit7CisJX191NjQgdG1wOworCW1lbWNweSgmdG1wLCBSVEFfREFUQShydGEpLCBzaXplb2YoX191NjQpKTsKKwlyZXR1cm4gdG1wOworfQorc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpydGFfZ2V0YXR0cl9zdHIoY29uc3Qgc3RydWN0IHJ0YXR0ciAqcnRhKQoreworCXJldHVybiAoY29uc3QgY2hhciAqKVJUQV9EQVRBKHJ0YSk7Cit9CisKK2ludCBydG5sX2xpc3Rlbl9hbGxfbnNpZChzdHJ1Y3QgcnRubF9oYW5kbGUgKik7CitpbnQgcnRubF9saXN0ZW4oc3RydWN0IHJ0bmxfaGFuZGxlICosIHJ0bmxfbGlzdGVuX2ZpbHRlcl90IGhhbmRsZXIsCisJCXZvaWQgKmphcmcpOworaW50IHJ0bmxfZnJvbV9maWxlKEZJTEUgKiwgcnRubF9saXN0ZW5fZmlsdGVyX3QgaGFuZGxlciwKKwkJICAgdm9pZCAqamFyZyk7CisKKyNkZWZpbmUgTkxNU0dfVEFJTChubXNnKSBcCisJKChzdHJ1Y3QgcnRhdHRyICopICgoKHZvaWQgKikgKG5tc2cpKSArIE5MTVNHX0FMSUdOKChubXNnKS0+bmxtc2dfbGVuKSkpCisKKyNpZm5kZWYgSUZBX1JUQQorI2RlZmluZSBJRkFfUlRBKHIpIFwKKwkoKHN0cnVjdCBydGF0dHIqKSgoKGNoYXIqKShyKSkgKyBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IGlmYWRkcm1zZykpKSkKKyNlbmRpZgorI2lmbmRlZiBJRkFfUEFZTE9BRAorI2RlZmluZSBJRkFfUEFZTE9BRChuKQlOTE1TR19QQVlMT0FEKG4sc2l6ZW9mKHN0cnVjdCBpZmFkZHJtc2cpKQorI2VuZGlmCisKKyNpZm5kZWYgSUZMQV9SVEEKKyNkZWZpbmUgSUZMQV9SVEEocikgXAorCSgoc3RydWN0IHJ0YXR0ciopKCgoY2hhciopKHIpKSArIE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgaWZpbmZvbXNnKSkpKQorI2VuZGlmCisjaWZuZGVmIElGTEFfUEFZTE9BRAorI2RlZmluZSBJRkxBX1BBWUxPQUQobikJTkxNU0dfUEFZTE9BRChuLHNpemVvZihzdHJ1Y3QgaWZpbmZvbXNnKSkKKyNlbmRpZgorCisjaWZuZGVmIE5EQV9SVEEKKyNkZWZpbmUgTkRBX1JUQShyKSBcCisJKChzdHJ1Y3QgcnRhdHRyKikoKChjaGFyKikocikpICsgTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBuZG1zZykpKSkKKyNlbmRpZgorI2lmbmRlZiBOREFfUEFZTE9BRAorI2RlZmluZSBOREFfUEFZTE9BRChuKQlOTE1TR19QQVlMT0FEKG4sc2l6ZW9mKHN0cnVjdCBuZG1zZykpCisjZW5kaWYKKworI2lmbmRlZiBORFRBX1JUQQorI2RlZmluZSBORFRBX1JUQShyKSBcCisJKChzdHJ1Y3QgcnRhdHRyKikoKChjaGFyKikocikpICsgTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBuZHRtc2cpKSkpCisjZW5kaWYKKyNpZm5kZWYgTkRUQV9QQVlMT0FECisjZGVmaW5lIE5EVEFfUEFZTE9BRChuKSBOTE1TR19QQVlMT0FEKG4sc2l6ZW9mKHN0cnVjdCBuZHRtc2cpKQorI2VuZGlmCisKKyNpZm5kZWYgTkVUTlNfUlRBCisjZGVmaW5lIE5FVE5TX1JUQShyKSBcCisJKChzdHJ1Y3QgcnRhdHRyKikoKChjaGFyKikocikpICsgTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBydGdlbm1zZykpKSkKKyNlbmRpZgorI2lmbmRlZiBORVROU19QQVlMT0FECisjZGVmaW5lIE5FVE5TX1BBWUxPQUQobikJTkxNU0dfUEFZTE9BRChuLHNpemVvZihzdHJ1Y3QgcnRnZW5tc2cpKQorI2VuZGlmCisKKy8qIFVzZXIgZGVmaW5lZCBubG1zZ190eXBlIHdoaWNoIGlzIHVzZWQgbW9zdGx5IGZvciBsb2dnaW5nIG5ldGxpbmsKKyAqIG1lc3NhZ2VzIGZyb20gZHVtcCBmaWxlICovCisjZGVmaW5lIE5MTVNHX1RTVEFNUAkxNQorCisjZW5kaWYgLyogX19MSUJORVRMSU5LX0hfXyAqLworCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L2F0bS5oIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9hdG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGUyN2JlCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9hdG0uaApAQCAtMCwwICsxLDI0MSBAQAorLyogYXRtLmggLSBnZW5lcmFsIEFUTSBkZWNsYXJhdGlvbnMgKi8KKyAKKy8qIFdyaXR0ZW4gMTk5NS0yMDAwIGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgRVBGTCBMUkMvSUNBICovCisgCisKKy8qCisgKiBXQVJOSU5HOiBVc2VyLXNwYWNlIHByb2dyYW1zIHNob3VsZCBub3QgI2luY2x1ZGUgPGxpbnV4L2F0bS5oPiBkaXJlY3RseS4KKyAqICAgICAgICAgIEluc3RlYWQsICNpbmNsdWRlIDxhdG0uaD4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9BVE1fSAorI2RlZmluZSBfTElOVVhfQVRNX0gKKworLyoKKyAqIEJFR0lOX3h4IGFuZCBFTkRfeHggbWFya2VycyBhcmUgdXNlZCBmb3IgYXV0b21hdGljIGdlbmVyYXRpb24gb2YKKyAqIGRvY3VtZW50YXRpb24uIERvIG5vdCBjaGFuZ2UgdGhlbS4KKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9hdG1hcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1zYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1pb2MuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisKKy8qIGdlbmVyYWwgQVRNIGNvbnN0YW50cyAqLworI2RlZmluZSBBVE1fQ0VMTF9TSVpFCQkgICAgNTMJLyogQVRNIGNlbGwgc2l6ZSBpbmNsLiBoZWFkZXIgKi8KKyNkZWZpbmUgQVRNX0NFTExfUEFZTE9BRAkgICAgNDgJLyogQVRNIHBheWxvYWQgc2l6ZSAqLworI2RlZmluZSBBVE1fQUFMMF9TRFUJCSAgICA1MgkvKiBBQUwwIFNEVSBzaXplICovCisjZGVmaW5lIEFUTV9NQVhfQUFMMzRfUERVCSA2NTUzNQkvKiBtYXhpbXVtIEFBTDMvNCBQRFUgcGF5bG9hZCAqLworI2RlZmluZSBBVE1fQUFMNV9UUkFJTEVSCSAgICAgOAkvKiBBQUw1IHRyYWlsZXIgc2l6ZSAqLworI2RlZmluZSBBVE1fTUFYX0FBTDVfUERVCSA2NTUzNQkvKiBtYXhpbXVtIEFBTDUgUERVIHBheWxvYWQgKi8KKyNkZWZpbmUgQVRNX01BWF9DRFYJCSAgOTk5OQkvKiBtYXhpbXVtIChkZWZhdWx0KSBDRFYgKi8KKyNkZWZpbmUgQVRNX05PVF9SU1ZfVkNJCQkgICAgMzIJLyogZmlyc3Qgbm9uLXJlc2VydmVkIFZDSSB2YWx1ZSAqLworCisjZGVmaW5lIEFUTV9NQVhfVlBJCQkgICAyNTUJLyogbWF4aW11bSBWUEkgYXQgdGhlIFVOSSAqLworI2RlZmluZSBBVE1fTUFYX1ZQSV9OTkkJCSAgNDA5NgkvKiBtYXhpbXVtIFZQSSBhdCB0aGUgTk5JICovCisjZGVmaW5lIEFUTV9NQVhfVkNJCQkgNjU1MzUJLyogbWF4aW11bSBWQ0kgKi8KKworCisvKiAicHJvdGNvbCIgdmFsdWVzIGZvciB0aGUgc29ja2V0IHN5c3RlbSBjYWxsICovCisjZGVmaW5lIEFUTV9OT19BQUwJMAkJLyogQUFMIG5vdCBzcGVjaWZpZWQgKi8KKyNkZWZpbmUgQVRNX0FBTDAJMTMJCS8qICJyYXciIEFUTSBjZWxscyAqLworI2RlZmluZSBBVE1fQUFMMQkxCQkvKiBBQUwxIChDQlIpICovCisjZGVmaW5lIEFUTV9BQUwyCTIJCS8qIEFBTDIgKFZCUikgKi8KKyNkZWZpbmUgQVRNX0FBTDM0CTMJCS8qIEFBTDMvNCAoZGF0YSkgKi8KKyNkZWZpbmUgQVRNX0FBTDUJNQkJLyogQUFMNSAoZGF0YSkgKi8KKworLyoKKyAqIHNvY2tldCBvcHRpb24gbmFtZSBjb2RpbmcgZnVuY3Rpb25zCisgKgorICogTm90ZSB0aGF0IF9fU09fRU5DT0RFIGFuZCBfX1NPX0xFVkVMIGFyZSBzb21ld2hhdCBhIGhhY2sgc2luY2UgdGhlCisgKiA8PCAyMiBvbmx5IHJlc2VydmVzIDkgYml0cyBmb3IgdGhlIGxldmVsLiAgT24gc29tZSBhcmNoaXRlY3R1cmVzCisgKiBTT0xfU09DS0VUIGlzIDB4RkZGRiwgc28gdGhhdCdzIGEgYml0IG9mIGEgcHJvYmxlbQorICovCisKKyNkZWZpbmUgX19TT19FTkNPREUobCxuLHQpCSgoKChsKSAmIDB4MUZGKSA8PCAyMikgfCAoKG4pIDw8IDE2KSB8IFwKKwkJCQlzaXplb2YodCkpCisjZGVmaW5lIF9fU09fTEVWRUxfTUFUQ0goYyxtKQkoKChjKSA+PiAyMikgPT0gKChtKSAmIDB4MUZGKSkKKyNkZWZpbmUgX19TT19OVU1CRVIoYykJCSgoKGMpID4+IDE2KSAmIDB4M2YpCisjZGVmaW5lIF9fU09fU0laRShjKQkJKChjKSAmIDB4M2ZmZikKKworLyoKKyAqIEFUTSBsYXllcgorICovCisKKyNkZWZpbmUgU09fU0VUQ0xQCV9fU09fRU5DT0RFKFNPTF9BVE0sMCxpbnQpCisJCQkgICAgLyogc2V0IENMUCBiaXQgdmFsdWUgLSBUT0RPICovCisjZGVmaW5lIFNPX0NJUkFOR0UJX19TT19FTkNPREUoU09MX0FUTSwxLHN0cnVjdCBhdG1fY2lyYW5nZSkKKwkJCSAgICAvKiBjb25uZWN0aW9uIGlkZW50aWZpZXIgcmFuZ2U7IHNvY2tldCBtdXN0IGJlCisJCQkgICAgICAgYm91bmQgb3IgY29ubmVjdGVkICovCisjZGVmaW5lIFNPX0FUTVFPUwlfX1NPX0VOQ09ERShTT0xfQVRNLDIsc3RydWN0IGF0bV9xb3MpCisJCQkgICAgLyogUXVhbGl0eSBvZiBTZXJ2aWNlIHNldHRpbmcgKi8KKyNkZWZpbmUgU09fQVRNU0FQCV9fU09fRU5DT0RFKFNPTF9BVE0sMyxzdHJ1Y3QgYXRtX3NhcCkKKwkJCSAgICAvKiBTZXJ2aWNlIEFjY2VzcyBQb2ludCAqLworI2RlZmluZSBTT19BVE1QVkMJX19TT19FTkNPREUoU09MX0FUTSw0LHN0cnVjdCBzb2NrYWRkcl9hdG1wdmMpCisJCQkgICAgLyogIlBWQyIgYWRkcmVzcyAoYWxzbyBmb3IgU1ZDcyk7IGdldCBvbmx5ICovCisjZGVmaW5lIFNPX01VTFRJUE9JTlQJX19TT19FTkNPREUoU09MX0FUTSwgNSwgaW50KQorCQkJICAgIC8qIG1ha2UgdGhpcyB2YyBhIHAybXAgKi8KKworCisvKgorICogTm90ZSBAQEA6IHNpbmNlIHRoZSBzb2NrZXQgbGF5ZXJzIGRvbid0IHJlYWxseSBkaXN0aW5ndWlzaCB0aGUgY29udHJvbCBhbmQKKyAqIHRoZSBkYXRhIHBsYW5lIGJ1dCBnZW5lcmFsbHkgc2VlbXMgdG8gYmUgZGF0YSBwbGFuZS1jZW50cmljLCBhbnkgbGF5ZXIgaXMKKyAqIGFib3V0IGVxdWFsbHkgd3JvbmcgZm9yIHRoZSBTQVAuIElmIHlvdSBoYXZlIGEgYmV0dGVyIGlkZWEgYWJvdXQgdGhpcywKKyAqIHBsZWFzZSBzcGVhayB1cCAuLi4KKyAqLworCisKKy8qIEFUTSBjZWxsIGhlYWRlciAoZm9yIEFBTDApICovCisKKy8qIEJFR0lOX0NIICovCisjZGVmaW5lIEFUTV9IRFJfR0ZDX01BU0sJMHhmMDAwMDAwMAorI2RlZmluZSBBVE1fSERSX0dGQ19TSElGVAkyOAorI2RlZmluZSBBVE1fSERSX1ZQSV9NQVNLCTB4MGZmMDAwMDAKKyNkZWZpbmUgQVRNX0hEUl9WUElfU0hJRlQJMjAKKyNkZWZpbmUgQVRNX0hEUl9WQ0lfTUFTSwkweDAwMGZmZmYwCisjZGVmaW5lIEFUTV9IRFJfVkNJX1NISUZUCTQKKyNkZWZpbmUgQVRNX0hEUl9QVElfTUFTSwkweDAwMDAwMDBlCisjZGVmaW5lIEFUTV9IRFJfUFRJX1NISUZUCTEKKyNkZWZpbmUgQVRNX0hEUl9DTFAJCTB4MDAwMDAwMDEKKy8qIEVORF9DSCAqLworCisKKy8qIFBUSSBjb2RpbmdzICovCisKKy8qIEJFR0lOX1BUSSAqLworI2RlZmluZSBBVE1fUFRJX1VTMAkwICAvKiB1c2VyIGRhdGEgY2VsbCwgY29uZ2VzdGlvbiBub3QgZXhwLCBTRFUtdHlwZSAwICovCisjZGVmaW5lIEFUTV9QVElfVVMxCTEgIC8qIHVzZXIgZGF0YSBjZWxsLCBjb25nZXN0aW9uIG5vdCBleHAsIFNEVS10eXBlIDEgKi8KKyNkZWZpbmUgQVRNX1BUSV9VQ0VTMAkyICAvKiB1c2VyIGRhdGEgY2VsbCwgY29uZy4gZXhwZXJpZW5jZWQsIFNEVS10eXBlIDAgKi8KKyNkZWZpbmUgQVRNX1BUSV9VQ0VTMQkzICAvKiB1c2VyIGRhdGEgY2VsbCwgY29uZy4gZXhwZXJpZW5jZWQsIFNEVS10eXBlIDEgKi8KKyNkZWZpbmUgQVRNX1BUSV9TRUdGNQk0ICAvKiBzZWdtZW50IE9BTSBGNSBmbG93IHJlbGF0ZWQgY2VsbCAqLworI2RlZmluZSBBVE1fUFRJX0UyRUY1CTUgIC8qIGVuZC10by1lbmQgT0FNIEY1IGZsb3cgcmVsYXRlZCBjZWxsICovCisjZGVmaW5lIEFUTV9QVElfUlNWX1JNCTYgIC8qIHJlc2VydmVkIGZvciB0cmFmZmljIGNvbnRyb2wvcmVzb3VyY2UgbWdtdCAqLworI2RlZmluZSBBVE1fUFRJX1JTVgk3ICAvKiByZXNlcnZlZCAqLworLyogRU5EX1BUSSAqLworCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGl0ZW1zIHNob3VsZCBzdGF5IGluIGxpbnV4L2F0bS5oLCB3aGljaCBzaG91bGQgYmUgbGlua2VkIHRvCisgKiBuZXRhdG0vYXRtLmgKKyAqLworCisvKiBUcmFmZmljIGRlc2NyaXB0aW9uICovCisKKyNkZWZpbmUgQVRNX05PTkUJMAkJLyogbm8gdHJhZmZpYyAqLworI2RlZmluZSBBVE1fVUJSCQkxCisjZGVmaW5lIEFUTV9DQlIJCTIKKyNkZWZpbmUgQVRNX1ZCUgkJMworI2RlZmluZSBBVE1fQUJSCQk0CisjZGVmaW5lIEFUTV9BTllDTEFTUwk1CQkvKiBjb21wYXRpYmxlIHdpdGggZXZlcnl0aGluZyAqLworCisjZGVmaW5lIEFUTV9NQVhfUENSCS0xCQkvKiBtYXhpbXVtIGF2YWlsYWJsZSBQQ1IgKi8KKworc3RydWN0IGF0bV90cmFmcHJtIHsKKwl1bnNpZ25lZCBjaGFyCXRyYWZmaWNfY2xhc3M7CS8qIHRyYWZmaWMgY2xhc3MgKEFUTV9VQlIsIC4uLikgKi8KKwlpbnQJCW1heF9wY3I7CS8qIG1heGltdW0gUENSIGluIGNlbGxzIHBlciBzZWNvbmQgKi8KKwlpbnQJCXBjcjsJCS8qIGRlc2lyZWQgUENSIGluIGNlbGxzIHBlciBzZWNvbmQgKi8KKwlpbnQJCW1pbl9wY3I7CS8qIG1pbmltdW0gUENSIGluIGNlbGxzIHBlciBzZWNvbmQgKi8KKwlpbnQJCW1heF9jZHY7CS8qIG1heGltdW0gQ0RWIGluIG1pY3Jvc2Vjb25kcyAqLworCWludAkJbWF4X3NkdTsJLyogbWF4aW11bSBTRFUgaW4gYnl0ZXMgKi8KKyAgICAgICAgLyogZXh0cmEgcGFyYW1zIGZvciBBQlIgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IAlpY3I7ICAgICAgICAgCS8qIEluaXRpYWwgQ2VsbCBSYXRlICgyNC1iaXQpICovCisgICAgICAgIHVuc2lnbmVkIGludAl0YmU7CQkvKiBUcmFuc2llbnQgQnVmZmVyIEV4cG9zdXJlICgyNC1iaXQpICovIAorICAgICAgICB1bnNpZ25lZCBpbnQgCWZydHQgOiAyNDsJLyogRml4ZWQgUm91bmQgVHJpcCBUaW1lICgyNC1iaXQpICovCisgICAgICAgIHVuc2lnbmVkIGludCAJcmlmICA6IDQ7ICAgICAgIC8qIFJhdGUgSW5jcmVtZW50IEZhY3RvciAoNC1iaXQpICovCisgICAgICAgIHVuc2lnbmVkIGludCAJcmRmICA6IDQ7ICAgICAgIC8qIFJhdGUgRGVjcmVhc2UgRmFjdG9yICg0LWJpdCkgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IG5ybV9wcmVzICA6MTsgICAgICAvKiBucm0gcHJlc2VudCBiaXQgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IHRybV9wcmVzICA6MTsgICAgIAkvKiBybSBwcmVzZW50IGJpdCAqLworICAgICAgICB1bnNpZ25lZCBpbnQgYWR0Zl9wcmVzIDoxOyAgICAgCS8qIGFkdGYgcHJlc2VudCBiaXQgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IGNkZl9wcmVzICA6MTsgICAgCS8qIGNkZiBwcmVzZW50IGJpdCovCisgICAgICAgIHVuc2lnbmVkIGludCBucm0gICAgICAgOjM7ICAgICAJLyogTWF4ICMgb2YgQ2VsbHMgZm9yIGVhY2ggZm9yd2FyZCBSTSBjZWxsICgzLWJpdCkgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IHRybSAgICAgICA6MzsgICAgCS8qIFRpbWUgYmV0d2VlbiBmb3J3YXJkIFJNIGNlbGxzICgzLWJpdCkgKi8gICAgCisJdW5zaWduZWQgaW50IGFkdGYgICAgICA6MTA7ICAgICAvKiBBQ1IgRGVjcmVhc2UgVGltZSBGYWN0b3IgKDEwLWJpdCkgKi8KKwl1bnNpZ25lZCBpbnQgY2RmICAgICAgIDozOyAgICAgIC8qIEN1dG9mZiBEZWNyZWFzZSBGYWN0b3IgKDMtYml0KSAqLworICAgICAgICB1bnNpZ25lZCBpbnQgc3BhcmUgICAgIDo5OyAgICAgIC8qIHNwYXJlIGJpdHMgKi8gCit9OworCitzdHJ1Y3QgYXRtX3FvcyB7CisJc3RydWN0IGF0bV90cmFmcHJtIHR4dHA7CS8qIHBhcmFtZXRlcnMgaW4gVFggZGlyZWN0aW9uICovCisJc3RydWN0IGF0bV90cmFmcHJtIHJ4dHAgX19BVE1fQVBJX0FMSUdOOworCQkJCQkvKiBwYXJhbWV0ZXJzIGluIFJYIGRpcmVjdGlvbiAqLworCXVuc2lnbmVkIGNoYXIgYWFsIF9fQVRNX0FQSV9BTElHTjsKK307CisKKy8qIFBWQyBhZGRyZXNzaW5nICovCisKKyNkZWZpbmUgQVRNX0lURl9BTlkJLTEJCS8qICJtYWdpYyIgUFZDIGFkZHJlc3MgdmFsdWVzICovCisjZGVmaW5lIEFUTV9WUElfQU5ZCS0xCisjZGVmaW5lIEFUTV9WQ0lfQU5ZCS0xCisjZGVmaW5lIEFUTV9WUElfVU5TUEVDCS0yCisjZGVmaW5lIEFUTV9WQ0lfVU5TUEVDCS0yCisKKworc3RydWN0IHNvY2thZGRyX2F0bXB2YyB7CisJdW5zaWduZWQgc2hvcnQgCXNhcF9mYW1pbHk7CS8qIGFkZHJlc3MgZmFtaWx5LCBBRl9BVE1QVkMgICovCisJc3RydWN0IHsJCQkvKiBQVkMgYWRkcmVzcyAqLworCQlzaG9ydAlpdGY7CQkvKiBBVE0gaW50ZXJmYWNlICovCisJCXNob3J0CXZwaTsJCS8qIFZQSSAob25seSA4IGJpdHMgYXQgVU5JKSAqLworCQlpbnQJdmNpOwkJLyogVkNJIChvbmx5IDE2IGJpdHMgYXQgVU5JKSAqLworCX0gc2FwX2FkZHIgX19BVE1fQVBJX0FMSUdOOwkvKiBQVkMgYWRkcmVzcyAqLworfTsKKworLyogU1ZDIGFkZHJlc3NpbmcgKi8KKworI2RlZmluZQlBVE1fRVNBX0xFTgkyMAkJLyogQVRNIEVuZCBTeXN0ZW0gQWRkcmVzcyBsZW5ndGggKi8KKyNkZWZpbmUgQVRNX0UxNjRfTEVOCTEyCQkvKiBtYXhpbXVtIEUuMTY0IG51bWJlciBsZW5ndGggKi8KKworI2RlZmluZSBBVE1fQUZJX0RDQwkweDM5CQkvKiBEQ0MgQVRNIEZvcm1hdCAqLworI2RlZmluZSBBVE1fQUZJX0lDRAkweDQ3CQkvKiBJQ0QgQVRNIEZvcm1hdCAqLworI2RlZmluZSBBVE1fQUZJX0UxNjQJMHg0NQkJLyogRS4xNjQgQVRNIEZvcm1hdCAqLworI2RlZmluZSBBVE1fQUZJX0xPQ0FMCTB4NDkJCS8qIExvY2FsIEFUTSBGb3JtYXQgKi8gCisKKyNkZWZpbmUgQVRNX0FGSV9EQ0NfR1JPVVAJMHhCRAkvKiBEQ0MgQVRNIEdyb3VwIEZvcm1hdCAqLworI2RlZmluZSBBVE1fQUZJX0lDRF9HUk9VUAkweEM1CS8qIElDRCBBVE0gR3JvdXAgRm9ybWF0ICovCisjZGVmaW5lIEFUTV9BRklfRTE2NF9HUk9VUAkweEMzCS8qIEUuMTY0IEFUTSBHcm91cCBGb3JtYXQgKi8KKyNkZWZpbmUgQVRNX0FGSV9MT0NBTF9HUk9VUAkweEM3CS8qIExvY2FsIEFUTSBHcm91cCBGb3JtYXQgKi8KKworI2RlZmluZSBBVE1fTElKX05PTkUJMAkJLyogbm8gbGVhZi1pbml0aWF0ZWQgam9pbiAqLworI2RlZmluZSBBVE1fTElKCQkxCQkvKiByZXF1ZXN0IGpvaW5pbmcgKi8KKyNkZWZpbmUgQVRNX0xJSl9SUEoJMgkJLyogc2V0IHRvIHJvb3QtcHJvbXB0ZWQgam9pbiAqLworI2RlZmluZSBBVE1fTElKX05KCTMJCS8qIHNldCB0byBuZXR3b3JrIGpvaW4gKi8KKworCitzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjIHsKKyAgICB1bnNpZ25lZCBzaG9ydCAJc2FzX2ZhbWlseTsJLyogYWRkcmVzcyBmYW1pbHksIEFGX0FUTVNWQyAqLworICAgIHN0cnVjdCB7CQkJCS8qIFNWQyBhZGRyZXNzICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIJcHJ2W0FUTV9FU0FfTEVOXTsvKiBwcml2YXRlIEFUTSBhZGRyZXNzICovCisgICAgICAgIGNoYXIJCXB1YltBVE1fRTE2NF9MRU4rMV07IC8qIHB1YmxpYyBhZGRyZXNzIChFLjE2NCkgKi8KKyAgICAJCQkJCS8qIHVudXNlZCBhZGRyZXNzZXMgbXVzdCBiZSBiemVybydlZCAqLworCWNoYXIJCWxpal90eXBlOwkvKiByb2xlIGluIExJSiBjYWxsOyBvbmUgb2YgQVRNX0xJSiogKi8KKwlfX3UzMglsaWpfaWQ7CQkvKiBMSUogY2FsbCBpZGVudGlmaWVyICovCisgICAgfSBzYXNfYWRkciBfX0FUTV9BUElfQUxJR047CQkvKiBTVkMgYWRkcmVzcyAqLworfTsKKworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgYXRtc3ZjX2FkZHJfaW5fdXNlKHN0cnVjdCBzb2NrYWRkcl9hdG1zdmMgYWRkcikKK3sKKwlyZXR1cm4gKmFkZHIuc2FzX2FkZHIucHJ2IHx8ICphZGRyLnNhc19hZGRyLnB1YjsKK30KKworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgYXRtcHZjX2FkZHJfaW5fdXNlKHN0cnVjdCBzb2NrYWRkcl9hdG1wdmMgYWRkcikKK3sKKwlyZXR1cm4gYWRkci5zYXBfYWRkci5pdGYgfHwgYWRkci5zYXBfYWRkci52cGkgfHwgYWRkci5zYXBfYWRkci52Y2k7Cit9CisKKworLyoKKyAqIFNvbWUgc3R1ZmYgZm9yIGxpbnV4L3NvY2tpb3MuaAorICovCisKK3N0cnVjdCBhdG1pZl9zaW9jIHsKKwlpbnQgbnVtYmVyOworCWludCBsZW5ndGg7CisJdm9pZCAqYXJnOworfTsKKworCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGF0bV9iYWNrZW5kX3Q7CisjZW5kaWYgLyogX0xJTlVYX0FUTV9IICovCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L2F0bWFwaS5oIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9hdG1hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmU1NGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9hdG1hcGkuaApAQCAtMCwwICsxLDI5IEBACisvKiBhdG1hcGkuaCAtIEFUTSBBUEkgdXNlciBzcGFjZS9rZXJuZWwgY29tcGF0aWJpbGl0eSAqLworIAorLyogV3JpdHRlbiAxOTk5LDIwMDAgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMIElDQSAqLworIAorCisjaWZuZGVmIF9MSU5VWF9BVE1BUElfSAorI2RlZmluZSBfTElOVVhfQVRNQVBJX0gKKworI2lmIGRlZmluZWQoX19zcGFyY19fKSB8fCBkZWZpbmVkKF9faWE2NF9fKQorLyogc3VjaCBhbGlnbm1lbnQgaXMgbm90IHJlcXVpcmVkIG9uIDMyIGJpdCBzcGFyY3MsIGJ1dCB3ZSBjYW4ndAorICAgZmlndXJlIHRoYXQgd2UgYXJlIG9uIGEgc3BhcmM2NCB3aGlsZSBjb21waWxpbmcgdXNlci1zcGFjZSBwcm9ncmFtcy4gKi8KKyNkZWZpbmUgX19BVE1fQVBJX0FMSUdOCV9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKQorI2Vsc2UKKyNkZWZpbmUgX19BVE1fQVBJX0FMSUdOCisjZW5kaWYKKworCisvKgorICogT3BhcXVlIHR5cGUgZm9yIGtlcm5lbCBwb2ludGVycy4gTm90ZSB0aGF0IF8gaXMgbmV2ZXIgYWNjZXNzZWQuIFdlIG5lZWQKKyAqIHRoZSBzdHJ1Y3QgaW4gb3JkZXIgaGlkZSB0aGUgYXJyYXksIHNvIHRoYXQgd2UgY2FuIG1ha2Ugc2ltcGxlIGFzc2lnbm1lbnRzCisgKiBpbnN0ZWFkIG9mIGJlaW5nIGZvcmNlZCB0byB1c2UgbWVtY3B5LiBJdCBhbHNvIGltcHJvdmVzIGVycm9yIHJlcG9ydGluZyBmb3IKKyAqIGNvZGUgdGhhdCBzdGlsbCBhc3N1bWVzIHRoYXQgd2UncmUgcGFzc2luZyB1bnNpZ25lZCBsb25ncy4KKyAqCisgKiBDb252ZW50aW9uOiBOVUxMIHBvaW50ZXJzIGFyZSBwYXNzZWQgYXMgYSBmaWVsZCBvZiBhbGwgemVyb2VzLgorICovCisgCit0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGNoYXIgX1s4XTsgfSBfX0FUTV9BUElfQUxJR04gYXRtX2twdHJfdDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L2F0bWlvYy5oIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9hdG1pb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2Y2N2FhCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9hdG1pb2MuaApAQCAtMCwwICsxLDQxIEBACisvKiBhdG1pb2MuaCAtIHJhbmdlcyBmb3IgQVRNLXJlbGF0ZWQgaW9jdGwgbnVtYmVycyAqLworIAorLyogV3JpdHRlbiAxOTk1LTE5OTkgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMIExSQy9JQ0EgKi8KKworCisvKgorICogU2VlIGh0dHA6Ly9pY2F3d3cxLmVwZmwuY2gvbGludXgtYXRtL21hZ2ljLmh0bWwgZm9yIHRoZSBjb21wbGV0ZSBsaXN0IG9mCisgKiAibWFnaWMiIGlvY3RsIG51bWJlcnMuCisgKi8KKworCisjaWZuZGVmIF9MSU5VWF9BVE1JT0NfSAorI2RlZmluZSBfTElOVVhfQVRNSU9DX0gKKworI2luY2x1ZGUgPGFzbS9pb2N0bC5oPgorCQkvKiBldmVyeWJvZHkgaW5jbHVkaW5nIGF0bWlvYy5oIHdpbGwgYWxzbyBuZWVkIF9JT3ssUixXLFdSfSAqLworCisjZGVmaW5lIEFUTUlPQ19QSFlDT00JICAweDAwIC8qIFBIWSBkZXZpY2UgY29tbW9uIGlvY3RscywgZ2xvYmFsbHkgdW5pcXVlICovCisjZGVmaW5lIEFUTUlPQ19QSFlDT01fRU5EIDB4MGYKKyNkZWZpbmUgQVRNSU9DX1BIWVRZUAkgIDB4MTAgLyogUEhZIGRldiB0eXBlIGlvY3RscywgdW5pcXVlIHBlciBQSFkgdHlwZSAqLworI2RlZmluZSBBVE1JT0NfUEhZVFlQX0VORCAweDJmCisjZGVmaW5lIEFUTUlPQ19QSFlQUlYJICAweDMwIC8qIFBIWSBkZXYgcHJpdmF0ZSBpb2N0bHMsIHVuaXF1ZSBwZXIgZHJpdmVyICovCisjZGVmaW5lIEFUTUlPQ19QSFlQUlZfRU5EIDB4NGYKKyNkZWZpbmUgQVRNSU9DX1NBUkNPTQkgIDB4NTAgLyogU0FSIGRldmljZSBjb21tb24gaW9jdGxzLCBnbG9iYWxseSB1bmlxdWUgKi8KKyNkZWZpbmUgQVRNSU9DX1NBUkNPTV9FTkQgMHg1MAorI2RlZmluZSBBVE1JT0NfU0FSUFJWCSAgMHg2MCAvKiBTQVIgZGV2IHByaXZhdGUgaW9jdGxzLCB1bmlxdWUgcGVyIGRyaXZlciAqLworI2RlZmluZSBBVE1JT0NfU0FSUFJWX0VORCAweDdmCisjZGVmaW5lIEFUTUlPQ19JVEYJICAweDgwIC8qIEludGVyZmFjZSBpb2N0bHMsIGdsb2JhbGx5IHVuaXF1ZSAqLworI2RlZmluZSBBVE1JT0NfSVRGX0VORAkgIDB4OGYKKyNkZWZpbmUgQVRNSU9DX0JBQ0tFTkQJICAweDkwIC8qIEFUTSBnZW5lcmljIGJhY2tlbmQgaW9jdGxzLCB1LiBwZXIgYmFja2VuZCAqLworI2RlZmluZSBBVE1JT0NfQkFDS0VORF9FTkQgMHhhZgorLyogMHhiMC0weGJmOiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworI2RlZmluZSBBVE1JT0NfQVJFUVVJUEEJICAweGMwIC8qIEFwcGxpY2F0aW9uIHJlcXVlc3RlZCBJUCBvdmVyIEFUTSwgZ2xvYi4gdS4gKi8KKyNkZWZpbmUgQVRNSU9DX0xBTkUJICAweGQwIC8qIExBTiBFbXVsYXRpb24sIGdsb2JhbGx5IHVuaXF1ZSAqLworI2RlZmluZSBBVE1JT0NfTVBPQSAgICAgICAweGQ4IC8qIE1QT0EsIGdsb2JhbGx5IHVuaXF1ZSAqLworI2RlZmluZQlBVE1JT0NfQ0xJUAkgIDB4ZTAgLyogQ2xhc3NpY2FsIElQIG92ZXIgQVRNIGNvbnRyb2wsIGdsb2JhbGx5IHUuICovCisjZGVmaW5lCUFUTUlPQ19DTElQX0VORAkgIDB4ZWYKKyNkZWZpbmUJQVRNSU9DX1NQRUNJQUwJICAweGYwIC8qIFNwZWNpYWwtcHVycG9zZSBjb250cm9scywgZ2xvYmFsbHkgdW5pcXVlICovCisjZGVmaW5lCUFUTUlPQ19TUEVDSUFMX0VORCAweGZmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9hdG1zYXAuaCBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvYXRtc2FwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5YjEwNAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvYXRtc2FwLmgKQEAgLTAsMCArMSwxNjIgQEAKKy8qIGF0bXNhcC5oIC0gQVRNIFNlcnZpY2UgQWNjZXNzIFBvaW50IGFkZHJlc3NpbmcgZGVmaW5pdGlvbnMgKi8KKworLyogV3JpdHRlbiAxOTk1LTE5OTkgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMIExSQy9JQ0EgKi8KKworCisjaWZuZGVmIF9MSU5VWF9BVE1TQVBfSAorI2RlZmluZSBfTElOVVhfQVRNU0FQX0gKKworI2luY2x1ZGUgPGxpbnV4L2F0bWFwaS5oPgorCisvKgorICogQkVHSU5feHggYW5kIEVORF94eCBtYXJrZXJzIGFyZSB1c2VkIGZvciBhdXRvbWF0aWMgZ2VuZXJhdGlvbiBvZgorICogZG9jdW1lbnRhdGlvbi4gRG8gbm90IGNoYW5nZSB0aGVtLgorICovCisKKworLyoKKyAqIExheWVyIDIgcHJvdG9jb2wgaWRlbnRpZmllcnMKKyAqLworCisvKiBCRUdJTl9MMiAqLworI2RlZmluZSBBVE1fTDJfTk9ORQkwCS8qIEwyIG5vdCBzcGVjaWZpZWQgKi8KKyNkZWZpbmUgQVRNX0wyX0lTTzE3NDUgIDB4MDEJLyogQmFzaWMgbW9kZSBJU08gMTc0NSAqLworI2RlZmluZSBBVE1fTDJfUTI5MQkweDAyCS8qIElUVS1UIFEuMjkxIChSZWMuIEkuNDQxKSAqLworI2RlZmluZSBBVE1fTDJfWDI1X0xMCTB4MDYJLyogSVRVLVQgWC4yNSwgbGluayBsYXllciAqLworI2RlZmluZSBBVE1fTDJfWDI1X01MCTB4MDcJLyogSVRVLVQgWC4yNSwgbXVsdGlsaW5rICovCisjZGVmaW5lIEFUTV9MMl9MQVBCCTB4MDgJLyogRXh0ZW5kZWQgTEFQQiwgaGFsZi1kdXBsZXggKFJlYy4gVC43MSkgKi8KKyNkZWZpbmUgQVRNX0wyX0hETENfQVJNCTB4MDkJLyogSERMQyBBUk0gKElTTy9JRUMgNDMzNSkgKi8KKyNkZWZpbmUgQVRNX0wyX0hETENfTlJNCTB4MGEJLyogSERMQyBOUk0gKElTTy9JRUMgNDMzNSkgKi8KKyNkZWZpbmUgQVRNX0wyX0hETENfQUJNCTB4MGIJLyogSERMQyBBQk0gKElTTy9JRUMgNDMzNSkgKi8KKyNkZWZpbmUgQVRNX0wyX0lTTzg4MDIJMHgwYwkvKiBMQU4gTExDIChJU08vSUVDIDg4MDIvMikgKi8KKyNkZWZpbmUgQVRNX0wyX1g3NQkweDBkCS8qIElUVS1UIFguNzUsIFNMUCAqLworI2RlZmluZSBBVE1fTDJfUTkyMgkweDBlCS8qIElUVS1UIFEuOTIyICovCisjZGVmaW5lIEFUTV9MMl9VU0VSCTB4MTAJLyogdXNlci1zcGVjaWZpZWQgKi8KKyNkZWZpbmUgQVRNX0wyX0lTTzc3NzYJMHgxMQkvKiBJU08gNzc3NiBEVEUtRFRFICovCisvKiBFTkRfTDIgKi8KKworCisvKgorICogTGF5ZXIgMyBwcm90b2NvbCBpZGVudGlmaWVycworICovCisKKy8qIEJFR0lOX0wzICovCisjZGVmaW5lIEFUTV9MM19OT05FCTAJLyogTDMgbm90IHNwZWNpZmllZCAqLworI2RlZmluZSBBVE1fTDNfWDI1CTB4MDYJLyogSVRVLVQgWC4yNSwgcGFja2V0IGxheWVyICovCisjZGVmaW5lIEFUTV9MM19JU084MjA4CTB4MDcJLyogSVNPL0lFQyA4MjA4ICovCisjZGVmaW5lIEFUTV9MM19YMjIzCTB4MDgJLyogSVRVLVQgWC4yMjMgfCBJU08vSUVDIDg4NzggKi8KKyNkZWZpbmUgQVRNX0wzX0lTTzg0NzMJMHgwOQkvKiBJVFUtVCBYLjIzMyB8IElTTy9JRUMgODQ3MyAqLworI2RlZmluZSBBVE1fTDNfVDcwCTB4MGEJLyogSVRVLVQgVC43MCBtaW5pbXVtIG5ldHdvcmsgbGF5ZXIgKi8KKyNkZWZpbmUgQVRNX0wzX1RSOTU3NwkweDBiCS8qIElTTy9JRUMgVFIgOTU3NyAqLworI2RlZmluZSBBVE1fTDNfSDMxMAkweDBjCS8qIElUVS1UIFJlY29tbWVuZGF0aW9uIEguMzEwICovCisjZGVmaW5lIEFUTV9MM19IMzIxCTB4MGQJLyogSVRVLVQgUmVjb21tZW5kYXRpb24gSC4zMjEgKi8KKyNkZWZpbmUgQVRNX0wzX1VTRVIJMHgxMAkvKiB1c2VyLXNwZWNpZmllZCAqLworLyogRU5EX0wzICovCisKKworLyoKKyAqIEhpZ2ggbGF5ZXIgaWRlbnRpZmllcnMKKyAqLworCisvKiBCRUdJTl9ITCAqLworI2RlZmluZSBBVE1fSExfTk9ORQkwCS8qIEhMIG5vdCBzcGVjaWZpZWQgKi8KKyNkZWZpbmUgQVRNX0hMX0lTTwkweDAxCS8qIElTTyAqLworI2RlZmluZSBBVE1fSExfVVNFUgkweDAyCS8qIHVzZXItc3BlY2lmaWMgKi8KKyNkZWZpbmUgQVRNX0hMX0hMUAkweDAzCS8qIGhpZ2ggbGF5ZXIgcHJvZmlsZSAtIFVOSSAzLjAgb25seSAqLworI2RlZmluZSBBVE1fSExfVkVORE9SCTB4MDQJLyogdmVuZG9yLXNwZWNpZmljIGFwcGxpY2F0aW9uIGlkZW50aWZpZXIgKi8KKy8qIEVORF9ITCAqLworCisKKy8qCisgKiBJVFUtVCBjb2RlZCBtb2RlIG9mIG9wZXJhdGlvbgorICovCisKKy8qIEJFR0lOX0lNRCAqLworI2RlZmluZSBBVE1fSU1EX05PTkUJIDAJLyogbW9kZSBub3Qgc3BlY2lmaWVkICovCisjZGVmaW5lIEFUTV9JTURfTk9STUFMCSAxCS8qIG5vcm1hbCBtb2RlIG9mIG9wZXJhdGlvbiAqLworI2RlZmluZSBBVE1fSU1EX0VYVEVOREVEIDIJLyogZXh0ZW5kZWQgbW9kZSBvZiBvcGVyYXRpb24gKi8KKy8qIEVORF9JTUQgKi8KKworLyoKKyAqIEguMzEwIGNvZGUgcG9pbnRzCisgKi8KKworI2RlZmluZSBBVE1fVFRfTk9ORQkwCS8qIHRlcm1pbmFsIHR5cGUgbm90IHNwZWNpZmllZCAqLworI2RlZmluZSBBVE1fVFRfUlgJMQkvKiByZWNlaXZlIG9ubHkgKi8KKyNkZWZpbmUgQVRNX1RUX1RYCTIJLyogc2VuZCBvbmx5ICovCisjZGVmaW5lIEFUTV9UVF9SWFRYCTMJLyogcmVjZWl2ZSBhbmQgc2VuZCAqLworCisjZGVmaW5lIEFUTV9NQ19OT05FCTAJLyogbm8gbXVsdGlwbGV4aW5nICovCisjZGVmaW5lIEFUTV9NQ19UUwkxCS8qIHRyYW5zcG9ydCBzdHJlYW0gKFRTKSAqLworI2RlZmluZSBBVE1fTUNfVFNfRkVDCTIJLyogdHJhbnNwb3J0IHN0cmVhbSB3aXRoIGZvcndhcmQgZXJyb3IgY29yci4gKi8KKyNkZWZpbmUgQVRNX01DX1BTCTMJLyogcHJvZ3JhbSBzdHJlYW0gKFBTKSAqLworI2RlZmluZSBBVE1fTUNfUFNfRkVDCTQJLyogcHJvZ3JhbSBzdHJlYW0gd2l0aCBmb3J3YXJkIGVycm9yIGNvcnIuICovCisjZGVmaW5lIEFUTV9NQ19IMjIxCTUJLyogSVRVLVQgUmVjLiBILjIyMSAqLworCisvKgorICogU0FQIHN0cnVjdHVyZXMKKyAqLworCisjZGVmaW5lIEFUTV9NQVhfSExJCTgJLyogbWF4aW11bSBoaWdoLWxheWVyIGluZm9ybWF0aW9uIGxlbmd0aCAqLworCisKK3N0cnVjdCBhdG1fYmxsaSB7CisgICAgdW5zaWduZWQgY2hhciBsMl9wcm90bzsJLyogbGF5ZXIgMiBwcm90b2NvbCAqLworICAgIHVuaW9uIHsKKwlzdHJ1Y3QgeworCSAgICB1bnNpZ25lZCBjaGFyIG1vZGU7CS8qIG1vZGUgb2Ygb3BlcmF0aW9uIChBVE1fSU1EX3h4eCksIDAgaWYgKi8KKwkJCQkvKiBhYnNlbnQgKi8KKwkgICAgdW5zaWduZWQgY2hhciB3aW5kb3c7IC8qIHdpbmRvdyBzaXplIChrKSwgMS0xMjcgKDAgdG8gb21pdCkgKi8KKwl9IGl0dTsJCQkvKiBJVFUtVCBlbmNvZGluZyAqLworCXVuc2lnbmVkIGNoYXIgdXNlcjsJLyogdXNlci1zcGVjaWZpZWQgbDIgaW5mb3JtYXRpb24gKi8KKyAgICB9IGwyOworICAgIHVuc2lnbmVkIGNoYXIgbDNfcHJvdG87CS8qIGxheWVyIDMgcHJvdG9jb2wgKi8KKyAgICB1bmlvbiB7CisJc3RydWN0IHsKKwkgICAgdW5zaWduZWQgY2hhciBtb2RlOwkvKiBtb2RlIG9mIG9wZXJhdGlvbiAoQVRNX0lNRF94eHgpLCAwIGlmICovCisJCQkJLyogYWJzZW50ICovCisJICAgIHVuc2lnbmVkIGNoYXIgZGVmX3NpemU7IC8qIGRlZmF1bHQgcGFja2V0IHNpemUgKGxvZzIpLCA0LTEyICgwIHRvICovCisJCQkJICAgIC8qIG9taXQpICovCisJICAgIHVuc2lnbmVkIGNoYXIgd2luZG93Oy8qIHBhY2tldCB3aW5kb3cgc2l6ZSwgMS0xMjcgKDAgdG8gb21pdCkgKi8KKwl9IGl0dTsJCQkvKiBJVFUtVCBlbmNvZGluZyAqLworCXVuc2lnbmVkIGNoYXIgdXNlcjsJLyogdXNlciBzcGVjaWZpZWQgbDMgaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3QgewkJICAgICAgLyogaWYgbDNfcHJvdG8gPSBBVE1fTDNfSDMxMCAqLworCSAgICB1bnNpZ25lZCBjaGFyIHRlcm1fdHlwZTsgIC8qIHRlcm1pbmFsIHR5cGUgKi8KKwkgICAgdW5zaWduZWQgY2hhciBmd19tcHhfY2FwOyAvKiBmb3J3YXJkIG11bHRpcGxleGluZyBjYXBhYmlsaXR5ICovCisJCQkJICAgICAgLyogb25seSBpZiB0ZXJtX3R5cGUgIT0gQVRNX1RUX05PTkUgKi8KKwkgICAgdW5zaWduZWQgY2hhciBid19tcHhfY2FwOyAvKiBiYWNrd2FyZCBtdWx0aXBsZXhpbmcgY2FwYWJpbGl0eSAqLworCQkJCSAgICAgIC8qIG9ubHkgaWYgdGVybV90eXBlICE9IEFUTV9UVF9OT05FICovCisJfSBoMzEwOworCXN0cnVjdCB7CQkgIC8qIGlmIGwzX3Byb3RvID0gQVRNX0wzX1RSOTU3NyAqLworCSAgICB1bnNpZ25lZCBjaGFyIGlwaTsJICAvKiBpbml0aWFsIHByb3RvY29sIGlkICovCisJICAgIHVuc2lnbmVkIGNoYXIgc25hcFs1XTsvKiBJRUVFIDgwMi4xIFNOQVAgaWRlbnRpZmllciAqLworCQkJCSAgLyogKG9ubHkgaWYgaXBpID09IE5MUElEX0lFRUU4MDJfMV9TTkFQKSAqLworCX0gdHI5NTc3OworICAgIH0gbDM7Cit9IF9fQVRNX0FQSV9BTElHTjsKKworCitzdHJ1Y3QgYXRtX2JobGkgeworICAgIHVuc2lnbmVkIGNoYXIgaGxfdHlwZTsJLyogaGlnaCBsYXllciBpbmZvcm1hdGlvbiB0eXBlICovCisgICAgdW5zaWduZWQgY2hhciBobF9sZW5ndGg7CS8qIGxlbmd0aCAob25seSBpZiBobF90eXBlID09IEFUTV9ITF9VU0VSIHx8ICovCisJCQkJLyogaGxfdHlwZSA9PSBBVE1fSExfSVNPKSAqLworICAgIHVuc2lnbmVkIGNoYXIgaGxfaW5mb1tBVE1fTUFYX0hMSV07LyogaGlnaCBsYXllciBpbmZvcm1hdGlvbiAqLworfTsKKworCisjZGVmaW5lIEFUTV9NQVhfQkxMSQkzCQkvKiBtYXhpbXVtIG51bWJlciBvZiBCTExJIGVsZW1lbnRzICovCisKKworc3RydWN0IGF0bV9zYXAgeworCXN0cnVjdCBhdG1fYmhsaSBiaGxpOwkJLyogbG9jYWwgU0FQLCBoaWdoLWxheWVyIGluZm9ybWF0aW9uICovCisJc3RydWN0IGF0bV9ibGxpIGJsbGlbQVRNX01BWF9CTExJXSBfX0FUTV9BUElfQUxJR047CisJCQkJCS8qIGxvY2FsIFNBUCwgbG93LWxheWVyIGluZm8gKi8KK307CisKKworc3RhdGljIF9faW5saW5lX18gaW50IGJsbGlfaW5fdXNlKHN0cnVjdCBhdG1fYmxsaSBibGxpKQoreworCXJldHVybiBibGxpLmwyX3Byb3RvIHx8IGJsbGkubDNfcHJvdG87Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9icGYuaCBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvYnBmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk3MGY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvYnBmLmgKQEAgLTAsMCArMSwzMjYgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE0IFBMVU1ncmlkLCBodHRwOi8vcGx1bWdyaWQuY29tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2lmbmRlZiBfX0xJTlVYX0JQRl9IX18KKyNkZWZpbmUgX19MSU5VWF9CUEZfSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2JwZl9jb21tb24uaD4KKworLyogRXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gc2V0IGJhc2VkIG9uIHRvcCBvZiBjbGFzc2ljIEJQRiAqLworCisvKiBpbnN0cnVjdGlvbiBjbGFzc2VzICovCisjZGVmaW5lIEJQRl9BTFU2NAkweDA3CS8qIGFsdSBtb2RlIGluIGRvdWJsZSB3b3JkIHdpZHRoICovCisKKy8qIGxkL2xkeCBmaWVsZHMgKi8KKyNkZWZpbmUgQlBGX0RXCQkweDE4CS8qIGRvdWJsZSB3b3JkICovCisjZGVmaW5lIEJQRl9YQURECTB4YzAJLyogZXhjbHVzaXZlIGFkZCAqLworCisvKiBhbHUvam1wIGZpZWxkcyAqLworI2RlZmluZSBCUEZfTU9WCQkweGIwCS8qIG1vdiByZWcgdG8gcmVnICovCisjZGVmaW5lIEJQRl9BUlNICTB4YzAJLyogc2lnbiBleHRlbmRpbmcgYXJpdGhtZXRpYyBzaGlmdCByaWdodCAqLworCisvKiBjaGFuZ2UgZW5kaWFubmVzcyBvZiBhIHJlZ2lzdGVyICovCisjZGVmaW5lIEJQRl9FTkQJCTB4ZDAJLyogZmxhZ3MgZm9yIGVuZGlhbm5lc3MgY29udmVyc2lvbjogKi8KKyNkZWZpbmUgQlBGX1RPX0xFCTB4MDAJLyogY29udmVydCB0byBsaXR0bGUtZW5kaWFuICovCisjZGVmaW5lIEJQRl9UT19CRQkweDA4CS8qIGNvbnZlcnQgdG8gYmlnLWVuZGlhbiAqLworI2RlZmluZSBCUEZfRlJPTV9MRQlCUEZfVE9fTEUKKyNkZWZpbmUgQlBGX0ZST01fQkUJQlBGX1RPX0JFCisKKyNkZWZpbmUgQlBGX0pORQkJMHg1MAkvKiBqdW1wICE9ICovCisjZGVmaW5lIEJQRl9KU0dUCTB4NjAJLyogU0dUIGlzIHNpZ25lZCAnPicsIEdUIGluIHg4NiAqLworI2RlZmluZSBCUEZfSlNHRQkweDcwCS8qIFNHRSBpcyBzaWduZWQgJz49JywgR0UgaW4geDg2ICovCisjZGVmaW5lIEJQRl9DQUxMCTB4ODAJLyogZnVuY3Rpb24gY2FsbCAqLworI2RlZmluZSBCUEZfRVhJVAkweDkwCS8qIGZ1bmN0aW9uIHJldHVybiAqLworCisvKiBSZWdpc3RlciBudW1iZXJzICovCitlbnVtIHsKKwlCUEZfUkVHXzAgPSAwLAorCUJQRl9SRUdfMSwKKwlCUEZfUkVHXzIsCisJQlBGX1JFR18zLAorCUJQRl9SRUdfNCwKKwlCUEZfUkVHXzUsCisJQlBGX1JFR182LAorCUJQRl9SRUdfNywKKwlCUEZfUkVHXzgsCisJQlBGX1JFR185LAorCUJQRl9SRUdfMTAsCisJX19NQVhfQlBGX1JFRywKK307CisKKy8qIEJQRiBoYXMgMTAgZ2VuZXJhbCBwdXJwb3NlIDY0LWJpdCByZWdpc3RlcnMgYW5kIHN0YWNrIGZyYW1lLiAqLworI2RlZmluZSBNQVhfQlBGX1JFRwlfX01BWF9CUEZfUkVHCisKK3N0cnVjdCBicGZfaW5zbiB7CisJX191OAljb2RlOwkJLyogb3Bjb2RlICovCisJX191OAlkc3RfcmVnOjQ7CS8qIGRlc3QgcmVnaXN0ZXIgKi8KKwlfX3U4CXNyY19yZWc6NDsJLyogc291cmNlIHJlZ2lzdGVyICovCisJX19zMTYJb2ZmOwkJLyogc2lnbmVkIG9mZnNldCAqLworCV9fczMyCWltbTsJCS8qIHNpZ25lZCBpbW1lZGlhdGUgY29uc3RhbnQgKi8KK307CisKKy8qIEJQRiBzeXNjYWxsIGNvbW1hbmRzLCBzZWUgYnBmKDIpIG1hbi1wYWdlIGZvciBkZXRhaWxzLiAqLworZW51bSBicGZfY21kIHsKKwlCUEZfTUFQX0NSRUFURSwKKwlCUEZfTUFQX0xPT0tVUF9FTEVNLAorCUJQRl9NQVBfVVBEQVRFX0VMRU0sCisJQlBGX01BUF9ERUxFVEVfRUxFTSwKKwlCUEZfTUFQX0dFVF9ORVhUX0tFWSwKKwlCUEZfUFJPR19MT0FELAorCUJQRl9PQkpfUElOLAorCUJQRl9PQkpfR0VULAorfTsKKworZW51bSBicGZfbWFwX3R5cGUgeworCUJQRl9NQVBfVFlQRV9VTlNQRUMsCisJQlBGX01BUF9UWVBFX0hBU0gsCisJQlBGX01BUF9UWVBFX0FSUkFZLAorCUJQRl9NQVBfVFlQRV9QUk9HX0FSUkFZLAorCUJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZLAorfTsKKworZW51bSBicGZfcHJvZ190eXBlIHsKKwlCUEZfUFJPR19UWVBFX1VOU1BFQywKKwlCUEZfUFJPR19UWVBFX1NPQ0tFVF9GSUxURVIsCisJQlBGX1BST0dfVFlQRV9LUFJPQkUsCisJQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCisJQlBGX1BST0dfVFlQRV9TQ0hFRF9BQ1QsCit9OworCisjZGVmaW5lIEJQRl9QU0VVRE9fTUFQX0ZECTEKKworLyogZmxhZ3MgZm9yIEJQRl9NQVBfVVBEQVRFX0VMRU0gY29tbWFuZCAqLworI2RlZmluZSBCUEZfQU5ZCQkwIC8qIGNyZWF0ZSBuZXcgZWxlbWVudCBvciB1cGRhdGUgZXhpc3RpbmcgKi8KKyNkZWZpbmUgQlBGX05PRVhJU1QJMSAvKiBjcmVhdGUgbmV3IGVsZW1lbnQgaWYgaXQgZGlkbid0IGV4aXN0ICovCisjZGVmaW5lIEJQRl9FWElTVAkyIC8qIHVwZGF0ZSBleGlzdGluZyBlbGVtZW50ICovCisKK3VuaW9uIGJwZl9hdHRyIHsKKwlzdHJ1Y3QgeyAvKiBhbm9ueW1vdXMgc3RydWN0IHVzZWQgYnkgQlBGX01BUF9DUkVBVEUgY29tbWFuZCAqLworCQlfX3UzMgltYXBfdHlwZTsJLyogb25lIG9mIGVudW0gYnBmX21hcF90eXBlICovCisJCV9fdTMyCWtleV9zaXplOwkvKiBzaXplIG9mIGtleSBpbiBieXRlcyAqLworCQlfX3UzMgl2YWx1ZV9zaXplOwkvKiBzaXplIG9mIHZhbHVlIGluIGJ5dGVzICovCisJCV9fdTMyCW1heF9lbnRyaWVzOwkvKiBtYXggbnVtYmVyIG9mIGVudHJpZXMgaW4gYSBtYXAgKi8KKwl9OworCisJc3RydWN0IHsgLyogYW5vbnltb3VzIHN0cnVjdCB1c2VkIGJ5IEJQRl9NQVBfKl9FTEVNIGNvbW1hbmRzICovCisJCV9fdTMyCQltYXBfZmQ7CisJCV9fYWxpZ25lZF91NjQJa2V5OworCQl1bmlvbiB7CisJCQlfX2FsaWduZWRfdTY0IHZhbHVlOworCQkJX19hbGlnbmVkX3U2NCBuZXh0X2tleTsKKwkJfTsKKwkJX191NjQJCWZsYWdzOworCX07CisKKwlzdHJ1Y3QgeyAvKiBhbm9ueW1vdXMgc3RydWN0IHVzZWQgYnkgQlBGX1BST0dfTE9BRCBjb21tYW5kICovCisJCV9fdTMyCQlwcm9nX3R5cGU7CS8qIG9uZSBvZiBlbnVtIGJwZl9wcm9nX3R5cGUgKi8KKwkJX191MzIJCWluc25fY250OworCQlfX2FsaWduZWRfdTY0CWluc25zOworCQlfX2FsaWduZWRfdTY0CWxpY2Vuc2U7CisJCV9fdTMyCQlsb2dfbGV2ZWw7CS8qIHZlcmJvc2l0eSBsZXZlbCBvZiB2ZXJpZmllciAqLworCQlfX3UzMgkJbG9nX3NpemU7CS8qIHNpemUgb2YgdXNlciBidWZmZXIgKi8KKwkJX19hbGlnbmVkX3U2NAlsb2dfYnVmOwkvKiB1c2VyIHN1cHBsaWVkIGJ1ZmZlciAqLworCQlfX3UzMgkJa2Vybl92ZXJzaW9uOwkvKiBjaGVja2VkIHdoZW4gcHJvZ190eXBlPWtwcm9iZSAqLworCX07CisKKwlzdHJ1Y3QgeyAvKiBhbm9ueW1vdXMgc3RydWN0IHVzZWQgYnkgQlBGX09CSl8qIGNvbW1hbmRzICovCisJCV9fYWxpZ25lZF91NjQJcGF0aG5hbWU7CisJCV9fdTMyCQlicGZfZmQ7CisJfTsKK30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCisvKiBpbnRlZ2VyIHZhbHVlIGluICdpbW0nIGZpZWxkIG9mIEJQRl9DQUxMIGluc3RydWN0aW9uIHNlbGVjdHMgd2hpY2ggaGVscGVyCisgKiBmdW5jdGlvbiBlQlBGIHByb2dyYW0gaW50ZW5kcyB0byBjYWxsCisgKi8KK2VudW0gYnBmX2Z1bmNfaWQgeworCUJQRl9GVU5DX3Vuc3BlYywKKwlCUEZfRlVOQ19tYXBfbG9va3VwX2VsZW0sIC8qIHZvaWQgKm1hcF9sb29rdXBfZWxlbSgmbWFwLCAma2V5KSAqLworCUJQRl9GVU5DX21hcF91cGRhdGVfZWxlbSwgLyogaW50IG1hcF91cGRhdGVfZWxlbSgmbWFwLCAma2V5LCAmdmFsdWUsIGZsYWdzKSAqLworCUJQRl9GVU5DX21hcF9kZWxldGVfZWxlbSwgLyogaW50IG1hcF9kZWxldGVfZWxlbSgmbWFwLCAma2V5KSAqLworCUJQRl9GVU5DX3Byb2JlX3JlYWQsICAgICAgLyogaW50IGJwZl9wcm9iZV9yZWFkKHZvaWQgKmRzdCwgaW50IHNpemUsIHZvaWQgKnNyYykgKi8KKwlCUEZfRlVOQ19rdGltZV9nZXRfbnMsICAgIC8qIHU2NCBicGZfa3RpbWVfZ2V0X25zKHZvaWQpICovCisJQlBGX0ZVTkNfdHJhY2VfcHJpbnRrLCAgICAvKiBpbnQgYnBmX3RyYWNlX3ByaW50ayhjb25zdCBjaGFyICpmbXQsIGludCBmbXRfc2l6ZSwgLi4uKSAqLworCUJQRl9GVU5DX2dldF9wcmFuZG9tX3UzMiwgLyogdTMyIHByYW5kb21fdTMyKHZvaWQpICovCisJQlBGX0ZVTkNfZ2V0X3NtcF9wcm9jZXNzb3JfaWQsIC8qIHUzMiByYXdfc21wX3Byb2Nlc3Nvcl9pZCh2b2lkKSAqLworCisJLyoqCisJICogc2tiX3N0b3JlX2J5dGVzKHNrYiwgb2Zmc2V0LCBmcm9tLCBsZW4sIGZsYWdzKSAtIHN0b3JlIGJ5dGVzIGludG8gcGFja2V0CisJICogQHNrYjogcG9pbnRlciB0byBza2IKKwkgKiBAb2Zmc2V0OiBvZmZzZXQgd2l0aGluIHBhY2tldCBmcm9tIHNrYi0+bWFjX2hlYWRlcgorCSAqIEBmcm9tOiBwb2ludGVyIHdoZXJlIHRvIGNvcHkgYnl0ZXMgZnJvbQorCSAqIEBsZW46IG51bWJlciBvZiBieXRlcyB0byBzdG9yZSBpbnRvIHBhY2tldAorCSAqIEBmbGFnczogYml0IDAgLSBpZiB0cnVlLCByZWNvbXB1dGUgc2tiLT5jc3VtCisJICogICAgICAgICBvdGhlciBiaXRzIC0gcmVzZXJ2ZWQKKwkgKiBSZXR1cm46IDAgb24gc3VjY2VzcworCSAqLworCUJQRl9GVU5DX3NrYl9zdG9yZV9ieXRlcywKKworCS8qKgorCSAqIGwzX2NzdW1fcmVwbGFjZShza2IsIG9mZnNldCwgZnJvbSwgdG8sIGZsYWdzKSAtIHJlY29tcHV0ZSBJUCBjaGVja3N1bQorCSAqIEBza2I6IHBvaW50ZXIgdG8gc2tiCisJICogQG9mZnNldDogb2Zmc2V0IHdpdGhpbiBwYWNrZXQgd2hlcmUgSVAgY2hlY2tzdW0gaXMgbG9jYXRlZAorCSAqIEBmcm9tOiBvbGQgdmFsdWUgb2YgaGVhZGVyIGZpZWxkCisJICogQHRvOiBuZXcgdmFsdWUgb2YgaGVhZGVyIGZpZWxkCisJICogQGZsYWdzOiBiaXRzIDAtMyAtIHNpemUgb2YgaGVhZGVyIGZpZWxkCisJICogICAgICAgICBvdGhlciBiaXRzIC0gcmVzZXJ2ZWQKKwkgKiBSZXR1cm46IDAgb24gc3VjY2VzcworCSAqLworCUJQRl9GVU5DX2wzX2NzdW1fcmVwbGFjZSwKKworCS8qKgorCSAqIGw0X2NzdW1fcmVwbGFjZShza2IsIG9mZnNldCwgZnJvbSwgdG8sIGZsYWdzKSAtIHJlY29tcHV0ZSBUQ1AvVURQIGNoZWNrc3VtCisJICogQHNrYjogcG9pbnRlciB0byBza2IKKwkgKiBAb2Zmc2V0OiBvZmZzZXQgd2l0aGluIHBhY2tldCB3aGVyZSBUQ1AvVURQIGNoZWNrc3VtIGlzIGxvY2F0ZWQKKwkgKiBAZnJvbTogb2xkIHZhbHVlIG9mIGhlYWRlciBmaWVsZAorCSAqIEB0bzogbmV3IHZhbHVlIG9mIGhlYWRlciBmaWVsZAorCSAqIEBmbGFnczogYml0cyAwLTMgLSBzaXplIG9mIGhlYWRlciBmaWVsZAorCSAqICAgICAgICAgYml0IDQgLSBpcyBwc2V1ZG8gaGVhZGVyCisJICogICAgICAgICBvdGhlciBiaXRzIC0gcmVzZXJ2ZWQKKwkgKiBSZXR1cm46IDAgb24gc3VjY2VzcworCSAqLworCUJQRl9GVU5DX2w0X2NzdW1fcmVwbGFjZSwKKworCS8qKgorCSAqIGJwZl90YWlsX2NhbGwoY3R4LCBwcm9nX2FycmF5X21hcCwgaW5kZXgpIC0ganVtcCBpbnRvIGFub3RoZXIgQlBGIHByb2dyYW0KKwkgKiBAY3R4OiBjb250ZXh0IHBvaW50ZXIgcGFzc2VkIHRvIG5leHQgcHJvZ3JhbQorCSAqIEBwcm9nX2FycmF5X21hcDogcG9pbnRlciB0byBtYXAgd2hpY2ggdHlwZSBpcyBCUEZfTUFQX1RZUEVfUFJPR19BUlJBWQorCSAqIEBpbmRleDogaW5kZXggaW5zaWRlIGFycmF5IHRoYXQgc2VsZWN0cyBzcGVjaWZpYyBwcm9ncmFtIHRvIHJ1bgorCSAqIFJldHVybjogMCBvbiBzdWNjZXNzCisJICovCisJQlBGX0ZVTkNfdGFpbF9jYWxsLAorCisJLyoqCisJICogYnBmX2Nsb25lX3JlZGlyZWN0KHNrYiwgaWZpbmRleCwgZmxhZ3MpIC0gcmVkaXJlY3QgdG8gYW5vdGhlciBuZXRkZXYKKwkgKiBAc2tiOiBwb2ludGVyIHRvIHNrYgorCSAqIEBpZmluZGV4OiBpZmluZGV4IG9mIHRoZSBuZXQgZGV2aWNlCisJICogQGZsYWdzOiBiaXQgMCAtIGlmIHNldCwgcmVkaXJlY3QgdG8gaW5ncmVzcyBpbnN0ZWFkIG9mIGVncmVzcworCSAqICAgICAgICAgb3RoZXIgYml0cyAtIHJlc2VydmVkCisJICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MKKwkgKi8KKwlCUEZfRlVOQ19jbG9uZV9yZWRpcmVjdCwKKworCS8qKgorCSAqIHU2NCBicGZfZ2V0X2N1cnJlbnRfcGlkX3RnaWQodm9pZCkKKwkgKiBSZXR1cm46IGN1cnJlbnQtPnRnaWQgPDwgMzIgfCBjdXJyZW50LT5waWQKKwkgKi8KKwlCUEZfRlVOQ19nZXRfY3VycmVudF9waWRfdGdpZCwKKworCS8qKgorCSAqIHU2NCBicGZfZ2V0X2N1cnJlbnRfdWlkX2dpZCh2b2lkKQorCSAqIFJldHVybjogY3VycmVudF9naWQgPDwgMzIgfCBjdXJyZW50X3VpZAorCSAqLworCUJQRl9GVU5DX2dldF9jdXJyZW50X3VpZF9naWQsCisKKwkvKioKKwkgKiBicGZfZ2V0X2N1cnJlbnRfY29tbShjaGFyICpidWYsIGludCBzaXplX29mX2J1ZikKKwkgKiBzdG9yZXMgY3VycmVudC0+Y29tbSBpbnRvIGJ1ZgorCSAqIFJldHVybjogMCBvbiBzdWNjZXNzCisJICovCisJQlBGX0ZVTkNfZ2V0X2N1cnJlbnRfY29tbSwKKworCS8qKgorCSAqIGJwZl9nZXRfY2dyb3VwX2NsYXNzaWQoc2tiKSAtIHJldHJpZXZlIGEgcHJvYydzIGNsYXNzaWQKKwkgKiBAc2tiOiBwb2ludGVyIHRvIHNrYgorCSAqIFJldHVybjogY2xhc3NpZCBpZiAhPSAwCisJICovCisJQlBGX0ZVTkNfZ2V0X2Nncm91cF9jbGFzc2lkLAorCUJQRl9GVU5DX3NrYl92bGFuX3B1c2gsIC8qIGJwZl9za2Jfdmxhbl9wdXNoKHNrYiwgdmxhbl9wcm90bywgdmxhbl90Y2kpICovCisJQlBGX0ZVTkNfc2tiX3ZsYW5fcG9wLCAgLyogYnBmX3NrYl92bGFuX3BvcChza2IpICovCisKKwkvKioKKwkgKiBicGZfc2tiX1tnc11ldF90dW5uZWxfa2V5KHNrYiwga2V5LCBzaXplLCBmbGFncykKKwkgKiByZXRyaWV2ZSBvciBwb3B1bGF0ZSB0dW5uZWwgbWV0YWRhdGEKKwkgKiBAc2tiOiBwb2ludGVyIHRvIHNrYgorCSAqIEBrZXk6IHBvaW50ZXIgdG8gJ3N0cnVjdCBicGZfdHVubmVsX2tleScKKwkgKiBAc2l6ZTogc2l6ZSBvZiAnc3RydWN0IGJwZl90dW5uZWxfa2V5JworCSAqIEBmbGFnczogcm9vbSBmb3IgZnV0dXJlIGV4dGVuc2lvbnMKKwkgKiBSZXRydW46IDAgb24gc3VjY2VzcworCSAqLworCUJQRl9GVU5DX3NrYl9nZXRfdHVubmVsX2tleSwKKwlCUEZfRlVOQ19za2Jfc2V0X3R1bm5lbF9rZXksCisJQlBGX0ZVTkNfcGVyZl9ldmVudF9yZWFkLAkvKiB1NjQgYnBmX3BlcmZfZXZlbnRfcmVhZCgmbWFwLCBpbmRleCkgKi8KKwkvKioKKwkgKiBicGZfcmVkaXJlY3QoaWZpbmRleCwgZmxhZ3MpIC0gcmVkaXJlY3QgdG8gYW5vdGhlciBuZXRkZXYKKwkgKiBAaWZpbmRleDogaWZpbmRleCBvZiB0aGUgbmV0IGRldmljZQorCSAqIEBmbGFnczogYml0IDAgLSBpZiBzZXQsIHJlZGlyZWN0IHRvIGluZ3Jlc3MgaW5zdGVhZCBvZiBlZ3Jlc3MKKwkgKiAgICAgICAgIG90aGVyIGJpdHMgLSByZXNlcnZlZAorCSAqIFJldHVybjogVENfQUNUX1JFRElSRUNUCisJICovCisJQlBGX0ZVTkNfcmVkaXJlY3QsCisKKwkvKioKKwkgKiBicGZfZ2V0X3JvdXRlX3JlYWxtKHNrYikgLSByZXRyaWV2ZSBhIGRzdCdzIHRjbGFzc2lkCisJICogQHNrYjogcG9pbnRlciB0byBza2IKKwkgKiBSZXR1cm46IHJlYWxtIGlmICE9IDAKKwkgKi8KKwlCUEZfRlVOQ19nZXRfcm91dGVfcmVhbG0sCisKKwkvKioKKwkgKiBicGZfcGVyZl9ldmVudF9vdXRwdXQoY3R4LCBtYXAsIGluZGV4LCBkYXRhLCBzaXplKSAtIG91dHB1dCBwZXJmIHJhdyBzYW1wbGUKKwkgKiBAY3R4OiBzdHJ1Y3QgcHRfcmVncyoKKwkgKiBAbWFwOiBwb2ludGVyIHRvIHBlcmZfZXZlbnRfYXJyYXkgbWFwCisJICogQGluZGV4OiBpbmRleCBvZiBldmVudCBpbiB0aGUgbWFwCisJICogQGRhdGE6IGRhdGEgb24gc3RhY2sgdG8gYmUgb3V0cHV0IGFzIHJhdyBkYXRhCisJICogQHNpemU6IHNpemUgb2YgZGF0YQorCSAqIFJldHVybjogMCBvbiBzdWNjZXNzCisJICovCisJQlBGX0ZVTkNfcGVyZl9ldmVudF9vdXRwdXQsCisJQlBGX0ZVTkNfc2tiX2xvYWRfYnl0ZXMsCisJX19CUEZfRlVOQ19NQVhfSUQsCit9OworCisvKiBBbGwgZmxhZ3MgdXNlZCBieSBlQlBGIGhlbHBlciBmdW5jdGlvbnMsIHBsYWNlZCBoZXJlLiAqLworCisvKiBCUEZfRlVOQ19za2Jfc3RvcmVfYnl0ZXMgZmxhZ3MuICovCisjZGVmaW5lIEJQRl9GX1JFQ09NUFVURV9DU1VNCQkoMVVMTCA8PCAwKQorCisvKiBCUEZfRlVOQ19sM19jc3VtX3JlcGxhY2UgYW5kIEJQRl9GVU5DX2w0X2NzdW1fcmVwbGFjZSBmbGFncy4KKyAqIEZpcnN0IDQgYml0cyBhcmUgZm9yIHBhc3NpbmcgdGhlIGhlYWRlciBmaWVsZCBzaXplLgorICovCisjZGVmaW5lIEJQRl9GX0hEUl9GSUVMRF9NQVNLCQkweGZVTEwKKworLyogQlBGX0ZVTkNfbDRfY3N1bV9yZXBsYWNlIGZsYWdzLiAqLworI2RlZmluZSBCUEZfRl9QU0VVRE9fSERSCQkoMVVMTCA8PCA0KQorCisvKiBCUEZfRlVOQ19jbG9uZV9yZWRpcmVjdCBhbmQgQlBGX0ZVTkNfcmVkaXJlY3QgZmxhZ3MuICovCisjZGVmaW5lIEJQRl9GX0lOR1JFU1MJCQkoMVVMTCA8PCAwKQorCisvKiBCUEZfRlVOQ19za2Jfc2V0X3R1bm5lbF9rZXkgYW5kIEJQRl9GVU5DX3NrYl9nZXRfdHVubmVsX2tleSBmbGFncy4gKi8KKyNkZWZpbmUgQlBGX0ZfVFVOSU5GT19JUFY2CQkoMVVMTCA8PCAwKQorCisvKiB1c2VyIGFjY2Vzc2libGUgbWlycm9yIG9mIGluLWtlcm5lbCBza19idWZmLgorICogbmV3IGZpZWxkcyBjYW4gb25seSBiZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoaXMgc3RydWN0dXJlCisgKi8KK3N0cnVjdCBfX3NrX2J1ZmYgeworCV9fdTMyIGxlbjsKKwlfX3UzMiBwa3RfdHlwZTsKKwlfX3UzMiBtYXJrOworCV9fdTMyIHF1ZXVlX21hcHBpbmc7CisJX191MzIgcHJvdG9jb2w7CisJX191MzIgdmxhbl9wcmVzZW50OworCV9fdTMyIHZsYW5fdGNpOworCV9fdTMyIHZsYW5fcHJvdG87CisJX191MzIgcHJpb3JpdHk7CisJX191MzIgaW5ncmVzc19pZmluZGV4OworCV9fdTMyIGlmaW5kZXg7CisJX191MzIgdGNfaW5kZXg7CisJX191MzIgY2JbNV07CisJX191MzIgaGFzaDsKKwlfX3UzMiB0Y19jbGFzc2lkOworfTsKKworc3RydWN0IGJwZl90dW5uZWxfa2V5IHsKKwlfX3UzMiB0dW5uZWxfaWQ7CisJdW5pb24geworCQlfX3UzMiByZW1vdGVfaXB2NDsKKwkJX191MzIgcmVtb3RlX2lwdjZbNF07CisJfTsKKwlfX3U4IHR1bm5lbF90b3M7CisJX191OCB0dW5uZWxfdHRsOworfTsKKworI2VuZGlmIC8qIF9fTElOVVhfQlBGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9icGZfY29tbW9uLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L2JwZl9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmU3NDMzCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9icGZfY29tbW9uLmgKQEAgLTAsMCArMSw1NSBAQAorI2lmbmRlZiBfX0xJTlVYX0JQRl9DT01NT05fSF9fCisjZGVmaW5lIF9fTElOVVhfQlBGX0NPTU1PTl9IX18KKworLyogSW5zdHJ1Y3Rpb24gY2xhc3NlcyAqLworI2RlZmluZSBCUEZfQ0xBU1MoY29kZSkgKChjb2RlKSAmIDB4MDcpCisjZGVmaW5lCQlCUEZfTEQJCTB4MDAKKyNkZWZpbmUJCUJQRl9MRFgJCTB4MDEKKyNkZWZpbmUJCUJQRl9TVAkJMHgwMgorI2RlZmluZQkJQlBGX1NUWAkJMHgwMworI2RlZmluZQkJQlBGX0FMVQkJMHgwNAorI2RlZmluZQkJQlBGX0pNUAkJMHgwNQorI2RlZmluZQkJQlBGX1JFVAkJMHgwNgorI2RlZmluZQkJQlBGX01JU0MgICAgICAgIDB4MDcKKworLyogbGQvbGR4IGZpZWxkcyAqLworI2RlZmluZSBCUEZfU0laRShjb2RlKSAgKChjb2RlKSAmIDB4MTgpCisjZGVmaW5lCQlCUEZfVwkJMHgwMAorI2RlZmluZQkJQlBGX0gJCTB4MDgKKyNkZWZpbmUJCUJQRl9CCQkweDEwCisjZGVmaW5lIEJQRl9NT0RFKGNvZGUpICAoKGNvZGUpICYgMHhlMCkKKyNkZWZpbmUJCUJQRl9JTU0JCTB4MDAKKyNkZWZpbmUJCUJQRl9BQlMJCTB4MjAKKyNkZWZpbmUJCUJQRl9JTkQJCTB4NDAKKyNkZWZpbmUJCUJQRl9NRU0JCTB4NjAKKyNkZWZpbmUJCUJQRl9MRU4JCTB4ODAKKyNkZWZpbmUJCUJQRl9NU0gJCTB4YTAKKworLyogYWx1L2ptcCBmaWVsZHMgKi8KKyNkZWZpbmUgQlBGX09QKGNvZGUpICAgICgoY29kZSkgJiAweGYwKQorI2RlZmluZQkJQlBGX0FERAkJMHgwMAorI2RlZmluZQkJQlBGX1NVQgkJMHgxMAorI2RlZmluZQkJQlBGX01VTAkJMHgyMAorI2RlZmluZQkJQlBGX0RJVgkJMHgzMAorI2RlZmluZQkJQlBGX09SCQkweDQwCisjZGVmaW5lCQlCUEZfQU5ECQkweDUwCisjZGVmaW5lCQlCUEZfTFNICQkweDYwCisjZGVmaW5lCQlCUEZfUlNICQkweDcwCisjZGVmaW5lCQlCUEZfTkVHCQkweDgwCisjZGVmaW5lCQlCUEZfTU9ECQkweDkwCisjZGVmaW5lCQlCUEZfWE9SCQkweGEwCisKKyNkZWZpbmUJCUJQRl9KQQkJMHgwMAorI2RlZmluZQkJQlBGX0pFUQkJMHgxMAorI2RlZmluZQkJQlBGX0pHVAkJMHgyMAorI2RlZmluZQkJQlBGX0pHRQkJMHgzMAorI2RlZmluZQkJQlBGX0pTRVQgICAgICAgIDB4NDAKKyNkZWZpbmUgQlBGX1NSQyhjb2RlKSAgICgoY29kZSkgJiAweDA4KQorI2RlZmluZQkJQlBGX0sJCTB4MDAKKyNkZWZpbmUJCUJQRl9YCQkweDA4CisKKyNpZm5kZWYgQlBGX01BWElOU05TCisjZGVmaW5lIEJQRl9NQVhJTlNOUyA0MDk2CisjZW5kaWYKKworI2VuZGlmIC8qIF9fTElOVVhfQlBGX0NPTU1PTl9IX18gKi8KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2luY2x1ZGUvbGludXgvY2FuLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L2Nhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZjM5YjAKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L2Nhbi5oCkBAIC0wLDAgKzEsMjAwIEBACisvKgorICogbGludXgvY2FuLmgKKyAqCisgKiBEZWZpbml0aW9ucyBmb3IgQ0FOIG5ldHdvcmsgbGF5ZXIgKHNvY2tldCBhZGRyIC8gQ0FOIGZyYW1lIC8gQ0FOIGZpbHRlcikKKyAqCisgKiBBdXRob3JzOiBPbGl2ZXIgSGFydGtvcHAgPG9saXZlci5oYXJ0a29wcEB2b2xrc3dhZ2VuLmRlPgorICogICAgICAgICAgVXJzIFRodWVybWFubiAgIDx1cnMudGh1ZXJtYW5uQHZvbGtzd2FnZW4uZGU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNyBWb2xrc3dhZ2VuIEdyb3VwIEVsZWN0cm9uaWMgUmVzZWFyY2gKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFZvbGtzd2FnZW4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgaXMgcmV0YWluZWQgaW4gZnVsbCwgdGhpcworICogc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZQorICogR1BMIGFwcGx5IElOU1RFQUQgT0YgdGhvc2UgZ2l2ZW4gYWJvdmUuCisgKgorICogVGhlIHByb3ZpZGVkIGRhdGEgc3RydWN0dXJlcyBhbmQgZXh0ZXJuYWwgaW50ZXJmYWNlcyBmcm9tIHRoaXMgY29kZQorICogYXJlIG5vdCByZXN0cmljdGVkIHRvIGJlIHVzZWQgYnkgbW9kdWxlcyB3aXRoIGEgR1BMIGNvbXBhdGlibGUgbGljZW5zZS4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9DQU5fSAorI2RlZmluZSBfQ0FOX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisKKy8qIGNvbnRyb2xsZXIgYXJlYSBuZXR3b3JrIChDQU4pIGtlcm5lbCBkZWZpbml0aW9ucyAqLworCisvKiBzcGVjaWFsIGFkZHJlc3MgZGVzY3JpcHRpb24gZmxhZ3MgZm9yIHRoZSBDQU5fSUQgKi8KKyNkZWZpbmUgQ0FOX0VGRl9GTEFHIDB4ODAwMDAwMDBVIC8qIEVGRi9TRkYgaXMgc2V0IGluIHRoZSBNU0IgKi8KKyNkZWZpbmUgQ0FOX1JUUl9GTEFHIDB4NDAwMDAwMDBVIC8qIHJlbW90ZSB0cmFuc21pc3Npb24gcmVxdWVzdCAqLworI2RlZmluZSBDQU5fRVJSX0ZMQUcgMHgyMDAwMDAwMFUgLyogZXJyb3IgbWVzc2FnZSBmcmFtZSAqLworCisvKiB2YWxpZCBiaXRzIGluIENBTiBJRCBmb3IgZnJhbWUgZm9ybWF0cyAqLworI2RlZmluZSBDQU5fU0ZGX01BU0sgMHgwMDAwMDdGRlUgLyogc3RhbmRhcmQgZnJhbWUgZm9ybWF0IChTRkYpICovCisjZGVmaW5lIENBTl9FRkZfTUFTSyAweDFGRkZGRkZGVSAvKiBleHRlbmRlZCBmcmFtZSBmb3JtYXQgKEVGRikgKi8KKyNkZWZpbmUgQ0FOX0VSUl9NQVNLIDB4MUZGRkZGRkZVIC8qIG9taXQgRUZGLCBSVFIsIEVSUiBmbGFncyAqLworCisvKgorICogQ29udHJvbGxlciBBcmVhIE5ldHdvcmsgSWRlbnRpZmllciBzdHJ1Y3R1cmUKKyAqCisgKiBiaXQgMC0yOAk6IENBTiBpZGVudGlmaWVyICgxMS8yOSBiaXQpCisgKiBiaXQgMjkJOiBlcnJvciBtZXNzYWdlIGZyYW1lIGZsYWcgKDAgPSBkYXRhIGZyYW1lLCAxID0gZXJyb3IgbWVzc2FnZSkKKyAqIGJpdCAzMAk6IHJlbW90ZSB0cmFuc21pc3Npb24gcmVxdWVzdCBmbGFnICgxID0gcnRyIGZyYW1lKQorICogYml0IDMxCTogZnJhbWUgZm9ybWF0IGZsYWcgKDAgPSBzdGFuZGFyZCAxMSBiaXQsIDEgPSBleHRlbmRlZCAyOSBiaXQpCisgKi8KK3R5cGVkZWYgX191MzIgY2FuaWRfdDsKKworI2RlZmluZSBDQU5fU0ZGX0lEX0JJVFMJCTExCisjZGVmaW5lIENBTl9FRkZfSURfQklUUwkJMjkKKworLyoKKyAqIENvbnRyb2xsZXIgQXJlYSBOZXR3b3JrIEVycm9yIE1lc3NhZ2UgRnJhbWUgTWFzayBzdHJ1Y3R1cmUKKyAqCisgKiBiaXQgMC0yOAk6IGVycm9yIGNsYXNzIG1hc2sgKHNlZSBpbmNsdWRlL2xpbnV4L2Nhbi9lcnJvci5oKQorICogYml0IDI5LTMxCTogc2V0IHRvIHplcm8KKyAqLwordHlwZWRlZiBfX3UzMiBjYW5fZXJyX21hc2tfdDsKKworLyogQ0FOIHBheWxvYWQgbGVuZ3RoIGFuZCBETEMgZGVmaW5pdGlvbnMgYWNjb3JkaW5nIHRvIElTTyAxMTg5OC0xICovCisjZGVmaW5lIENBTl9NQVhfRExDIDgKKyNkZWZpbmUgQ0FOX01BWF9ETEVOIDgKKworLyogQ0FOIEZEIHBheWxvYWQgbGVuZ3RoIGFuZCBETEMgZGVmaW5pdGlvbnMgYWNjb3JkaW5nIHRvIElTTyAxMTg5OC03ICovCisjZGVmaW5lIENBTkZEX01BWF9ETEMgMTUKKyNkZWZpbmUgQ0FORkRfTUFYX0RMRU4gNjQKKworLyoqCisgKiBzdHJ1Y3QgY2FuX2ZyYW1lIC0gYmFzaWMgQ0FOIGZyYW1lIHN0cnVjdHVyZQorICogQGNhbl9pZDogIENBTiBJRCBvZiB0aGUgZnJhbWUgYW5kIENBTl8qX0ZMQUcgZmxhZ3MsIHNlZSBjYW5pZF90IGRlZmluaXRpb24KKyAqIEBjYW5fZGxjOiBmcmFtZSBwYXlsb2FkIGxlbmd0aCBpbiBieXRlICgwIC4uIDgpIGFrYSBkYXRhIGxlbmd0aCBjb2RlCisgKiAgICAgICAgICAgTi5CLiB0aGUgRExDIGZpZWxkIGZyb20gSVNPIDExODk4LTEgQ2hhcHRlciA4LjQuMi4zIGhhcyBhIDE6MQorICogICAgICAgICAgIG1hcHBpbmcgb2YgdGhlICdkYXRhIGxlbmd0aCBjb2RlJyB0byB0aGUgcmVhbCBwYXlsb2FkIGxlbmd0aAorICogQF9fcGFkOiAgIHBhZGRpbmcKKyAqIEBfX3JlczA6ICByZXNlcnZlZCAvIHBhZGRpbmcKKyAqIEBfX3JlczE6ICByZXNlcnZlZCAvIHBhZGRpbmcKKyAqIEBkYXRhOiAgICBDQU4gZnJhbWUgcGF5bG9hZCAodXAgdG8gOCBieXRlKQorICovCitzdHJ1Y3QgY2FuX2ZyYW1lIHsKKwljYW5pZF90IGNhbl9pZDsgIC8qIDMyIGJpdCBDQU5fSUQgKyBFRkYvUlRSL0VSUiBmbGFncyAqLworCV9fdTggICAgY2FuX2RsYzsgLyogZnJhbWUgcGF5bG9hZCBsZW5ndGggaW4gYnl0ZSAoMCAuLiBDQU5fTUFYX0RMRU4pICovCisJX191OCAgICBfX3BhZDsgICAvKiBwYWRkaW5nICovCisJX191OCAgICBfX3JlczA7ICAvKiByZXNlcnZlZCAvIHBhZGRpbmcgKi8KKwlfX3U4ICAgIF9fcmVzMTsgIC8qIHJlc2VydmVkIC8gcGFkZGluZyAqLworCV9fdTggICAgZGF0YVtDQU5fTUFYX0RMRU5dIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKK307CisKKy8qCisgKiBkZWZpbmVkIGJpdHMgZm9yIGNhbmZkX2ZyYW1lLmZsYWdzCisgKgorICogVGhlIHVzZSBvZiBzdHJ1Y3QgY2FuZmRfZnJhbWUgaW1wbGllcyB0aGUgRXh0ZW5kZWQgRGF0YSBMZW5ndGggKEVETCkgYml0IHRvCisgKiBiZSBzZXQgaW4gdGhlIENBTiBmcmFtZSBiaXRzdHJlYW0gb24gdGhlIHdpcmUuIFRoZSBFREwgYml0IHN3aXRjaCB0dXJucworICogdGhlIENBTiBjb250cm9sbGVycyBiaXRzdHJlYW0gcHJvY2Vzc29yIGludG8gdGhlIENBTiBGRCBtb2RlIHdoaWNoIGNyZWF0ZXMKKyAqIHR3byBuZXcgb3B0aW9ucyB3aXRoaW4gdGhlIENBTiBGRCBmcmFtZSBzcGVjaWZpY2F0aW9uOgorICoKKyAqIEJpdCBSYXRlIFN3aXRjaCAtIHRvIGluZGljYXRlIGEgc2Vjb25kIGJpdHJhdGUgaXMvd2FzIHVzZWQgZm9yIHRoZSBwYXlsb2FkCisgKiBFcnJvciBTdGF0ZSBJbmRpY2F0b3IgLSByZXByZXNlbnRzIHRoZSBlcnJvciBzdGF0ZSBvZiB0aGUgdHJhbnNtaXR0aW5nIG5vZGUKKyAqCisgKiBBcyB0aGUgQ0FORkRfRVNJIGJpdCBpcyBpbnRlcm5hbGx5IGdlbmVyYXRlZCBieSB0aGUgdHJhbnNtaXR0aW5nIENBTgorICogY29udHJvbGxlciBvbmx5IHRoZSBDQU5GRF9CUlMgYml0IGlzIHJlbGV2YW50IGZvciByZWFsIENBTiBjb250cm9sbGVycyB3aGVuCisgKiBidWlsZGluZyBhIENBTiBGRCBmcmFtZSBmb3IgdHJhbnNtaXNzaW9uLiBTZXR0aW5nIHRoZSBDQU5GRF9FU0kgYml0IGNhbiBtYWtlCisgKiBzZW5zZSBmb3IgdmlydHVhbCBDQU4gaW50ZXJmYWNlcyB0byB0ZXN0IGFwcGxpY2F0aW9ucyB3aXRoIGVjaG9lZCBmcmFtZXMuCisgKi8KKyNkZWZpbmUgQ0FORkRfQlJTIDB4MDEgLyogYml0IHJhdGUgc3dpdGNoIChzZWNvbmQgYml0cmF0ZSBmb3IgcGF5bG9hZCBkYXRhKSAqLworI2RlZmluZSBDQU5GRF9FU0kgMHgwMiAvKiBlcnJvciBzdGF0ZSBpbmRpY2F0b3Igb2YgdGhlIHRyYW5zbWl0dGluZyBub2RlICovCisKKy8qKgorICogc3RydWN0IGNhbmZkX2ZyYW1lIC0gQ0FOIGZsZXhpYmxlIGRhdGEgcmF0ZSBmcmFtZSBzdHJ1Y3R1cmUKKyAqIEBjYW5faWQ6IENBTiBJRCBvZiB0aGUgZnJhbWUgYW5kIENBTl8qX0ZMQUcgZmxhZ3MsIHNlZSBjYW5pZF90IGRlZmluaXRpb24KKyAqIEBsZW46ICAgIGZyYW1lIHBheWxvYWQgbGVuZ3RoIGluIGJ5dGUgKDAgLi4gQ0FORkRfTUFYX0RMRU4pCisgKiBAZmxhZ3M6ICBhZGRpdGlvbmFsIGZsYWdzIGZvciBDQU4gRkQKKyAqIEBfX3JlczA6IHJlc2VydmVkIC8gcGFkZGluZworICogQF9fcmVzMTogcmVzZXJ2ZWQgLyBwYWRkaW5nCisgKiBAZGF0YTogICBDQU4gRkQgZnJhbWUgcGF5bG9hZCAodXAgdG8gQ0FORkRfTUFYX0RMRU4gYnl0ZSkKKyAqLworc3RydWN0IGNhbmZkX2ZyYW1lIHsKKwljYW5pZF90IGNhbl9pZDsgIC8qIDMyIGJpdCBDQU5fSUQgKyBFRkYvUlRSL0VSUiBmbGFncyAqLworCV9fdTggICAgbGVuOyAgICAgLyogZnJhbWUgcGF5bG9hZCBsZW5ndGggaW4gYnl0ZSAqLworCV9fdTggICAgZmxhZ3M7ICAgLyogYWRkaXRpb25hbCBmbGFncyBmb3IgQ0FOIEZEICovCisJX191OCAgICBfX3JlczA7ICAvKiByZXNlcnZlZCAvIHBhZGRpbmcgKi8KKwlfX3U4ICAgIF9fcmVzMTsgIC8qIHJlc2VydmVkIC8gcGFkZGluZyAqLworCV9fdTggICAgZGF0YVtDQU5GRF9NQVhfRExFTl0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworfTsKKworI2RlZmluZSBDQU5fTVRVCQkoc2l6ZW9mKHN0cnVjdCBjYW5fZnJhbWUpKQorI2RlZmluZSBDQU5GRF9NVFUJKHNpemVvZihzdHJ1Y3QgY2FuZmRfZnJhbWUpKQorCisvKiBwYXJ0aWN1bGFyIHByb3RvY29scyBvZiB0aGUgcHJvdG9jb2wgZmFtaWx5IFBGX0NBTiAqLworI2RlZmluZSBDQU5fUkFXCQkxIC8qIFJBVyBzb2NrZXRzICovCisjZGVmaW5lIENBTl9CQ00JCTIgLyogQnJvYWRjYXN0IE1hbmFnZXIgKi8KKyNkZWZpbmUgQ0FOX1RQMTYJMyAvKiBWQUcgVHJhbnNwb3J0IFByb3RvY29sIHYxLjYgKi8KKyNkZWZpbmUgQ0FOX1RQMjAJNCAvKiBWQUcgVHJhbnNwb3J0IFByb3RvY29sIHYyLjAgKi8KKyNkZWZpbmUgQ0FOX01DTkVUCTUgLyogQm9zY2ggTUNOZXQgKi8KKyNkZWZpbmUgQ0FOX0lTT1RQCTYgLyogSVNPIDE1NzY1LTIgVHJhbnNwb3J0IFByb3RvY29sICovCisjZGVmaW5lIENBTl9OUFJPVE8JNworCisjZGVmaW5lIFNPTF9DQU5fQkFTRSAxMDAKKworLyoqCisgKiBzdHJ1Y3Qgc29ja2FkZHJfY2FuIC0gdGhlIHNvY2thZGRyIHN0cnVjdHVyZSBmb3IgQ0FOIHNvY2tldHMKKyAqIEBjYW5fZmFtaWx5OiAgYWRkcmVzcyBmYW1pbHkgbnVtYmVyIEFGX0NBTi4KKyAqIEBjYW5faWZpbmRleDogQ0FOIG5ldHdvcmsgaW50ZXJmYWNlIGluZGV4LgorICogQGNhbl9hZGRyOiAgICBwcm90b2NvbCBzcGVjaWZpYyBhZGRyZXNzIGluZm9ybWF0aW9uCisgKi8KK3N0cnVjdCBzb2NrYWRkcl9jYW4geworCV9fa2VybmVsX3NhX2ZhbWlseV90IGNhbl9mYW1pbHk7CisJaW50ICAgICAgICAgY2FuX2lmaW5kZXg7CisJdW5pb24geworCQkvKiB0cmFuc3BvcnQgcHJvdG9jb2wgY2xhc3MgYWRkcmVzcyBpbmZvcm1hdGlvbiAoZS5nLiBJU09UUCkgKi8KKwkJc3RydWN0IHsgY2FuaWRfdCByeF9pZCwgdHhfaWQ7IH0gdHA7CisKKwkJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBDQU4gcHJvdG9jb2xzIGFkZHJlc3MgaW5mb3JtYXRpb24gKi8KKwl9IGNhbl9hZGRyOworfTsKKworLyoqCisgKiBzdHJ1Y3QgY2FuX2ZpbHRlciAtIENBTiBJRCBiYXNlZCBmaWx0ZXIgaW4gY2FuX3JlZ2lzdGVyKCkuCisgKiBAY2FuX2lkOiAgIHJlbGV2YW50IGJpdHMgb2YgQ0FOIElEIHdoaWNoIGFyZSBub3QgbWFza2VkIG91dC4KKyAqIEBjYW5fbWFzazogQ0FOIG1hc2sgKHNlZSBkZXNjcmlwdGlvbikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEEgZmlsdGVyIG1hdGNoZXMsIHdoZW4KKyAqCisgKiAgICAgICAgICA8cmVjZWl2ZWRfY2FuX2lkPiAmIG1hc2sgPT0gY2FuX2lkICYgbWFzaworICoKKyAqIFRoZSBmaWx0ZXIgY2FuIGJlIGludmVydGVkIChDQU5fSU5WX0ZJTFRFUiBiaXQgc2V0IGluIGNhbl9pZCkgb3IgaXQgY2FuCisgKiBmaWx0ZXIgZm9yIGVycm9yIG1lc3NhZ2UgZnJhbWVzIChDQU5fRVJSX0ZMQUcgYml0IHNldCBpbiBtYXNrKS4KKyAqLworc3RydWN0IGNhbl9maWx0ZXIgeworCWNhbmlkX3QgY2FuX2lkOworCWNhbmlkX3QgY2FuX21hc2s7Cit9OworCisjZGVmaW5lIENBTl9JTlZfRklMVEVSIDB4MjAwMDAwMDBVIC8qIHRvIGJlIHNldCBpbiBjYW5fZmlsdGVyLmNhbl9pZCAqLworCisjZW5kaWYgLyogIV9VQVBJX0NBTl9IICovCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L2Nhbi9uZXRsaW5rLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L2Nhbi9uZXRsaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ0ZWMyYQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvY2FuL25ldGxpbmsuaApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIGxpbnV4L2Nhbi9uZXRsaW5rLmgKKyAqCisgKiBEZWZpbml0aW9ucyBmb3IgdGhlIENBTiBuZXRsaW5rIGludGVyZmFjZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBXb2xmZ2FuZyBHcmFuZGVnZ2VyIDx3Z0BncmFuZGVnZ2VyLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9DQU5fTkVUTElOS19ICisjZGVmaW5lIF9DQU5fTkVUTElOS19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogQ0FOIGJpdC10aW1pbmcgcGFyYW1ldGVycworICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLCBwbGVhc2UgcmVhZCBjaGFwdGVyICI4IEJJVCBUSU1JTkcKKyAqIFJFUVVJUkVNRU5UUyIgb2YgdGhlICJCb3NjaCBDQU4gU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDIuMCIKKyAqIGF0IGh0dHA6Ly93d3cuc2VtaWNvbmR1Y3RvcnMuYm9zY2guZGUvcGRmL2NhbjJzcGVjLnBkZi4KKyAqLworc3RydWN0IGNhbl9iaXR0aW1pbmcgeworCV9fdTMyIGJpdHJhdGU7CQkvKiBCaXQtcmF0ZSBpbiBiaXRzL3NlY29uZCAqLworCV9fdTMyIHNhbXBsZV9wb2ludDsJLyogU2FtcGxlIHBvaW50IGluIG9uZS10ZW50aCBvZiBhIHBlcmNlbnQgKi8KKwlfX3UzMiB0cTsJCS8qIFRpbWUgcXVhbnRhIChUUSkgaW4gbmFub3NlY29uZHMgKi8KKwlfX3UzMiBwcm9wX3NlZzsJCS8qIFByb3BhZ2F0aW9uIHNlZ21lbnQgaW4gVFFzICovCisJX191MzIgcGhhc2Vfc2VnMTsJLyogUGhhc2UgYnVmZmVyIHNlZ21lbnQgMSBpbiBUUXMgKi8KKwlfX3UzMiBwaGFzZV9zZWcyOwkvKiBQaGFzZSBidWZmZXIgc2VnbWVudCAyIGluIFRRcyAqLworCV9fdTMyIHNqdzsJCS8qIFN5bmNocm9uaXNhdGlvbiBqdW1wIHdpZHRoIGluIFRRcyAqLworCV9fdTMyIGJycDsJCS8qIEJpdC1yYXRlIHByZXNjYWxlciAqLworfTsKKworLyoKKyAqIENBTiBoYXJ3YXJlLWRlcGVuZGVudCBiaXQtdGltaW5nIGNvbnN0YW50CisgKgorICogVXNlZCBmb3IgY2FsY3VsYXRpbmcgYW5kIGNoZWNraW5nIGJpdC10aW1pbmcgcGFyYW1ldGVycworICovCitzdHJ1Y3QgY2FuX2JpdHRpbWluZ19jb25zdCB7CisJY2hhciBuYW1lWzE2XTsJCS8qIE5hbWUgb2YgdGhlIENBTiBjb250cm9sbGVyIGhhcmR3YXJlICovCisJX191MzIgdHNlZzFfbWluOwkvKiBUaW1lIHNlZ2VtZW50IDEgPSBwcm9wX3NlZyArIHBoYXNlX3NlZzEgKi8KKwlfX3UzMiB0c2VnMV9tYXg7CisJX191MzIgdHNlZzJfbWluOwkvKiBUaW1lIHNlZ2VtZW50IDIgPSBwaGFzZV9zZWcyICovCisJX191MzIgdHNlZzJfbWF4OworCV9fdTMyIHNqd19tYXg7CQkvKiBTeW5jaHJvbmlzYXRpb24ganVtcCB3aWR0aCAqLworCV9fdTMyIGJycF9taW47CQkvKiBCaXQtcmF0ZSBwcmVzY2FsZXIgKi8KKwlfX3UzMiBicnBfbWF4OworCV9fdTMyIGJycF9pbmM7Cit9OworCisvKgorICogQ0FOIGNsb2NrIHBhcmFtZXRlcnMKKyAqLworc3RydWN0IGNhbl9jbG9jayB7CisJX191MzIgZnJlcTsJCS8qIENBTiBzeXN0ZW0gY2xvY2sgZnJlcXVlbmN5IGluIEh6ICovCit9OworCisvKgorICogQ0FOIG9wZXJhdGlvbmFsIGFuZCBlcnJvciBzdGF0ZXMKKyAqLworZW51bSBjYW5fc3RhdGUgeworCUNBTl9TVEFURV9FUlJPUl9BQ1RJVkUgPSAwLAkvKiBSWC9UWCBlcnJvciBjb3VudCA8IDk2ICovCisJQ0FOX1NUQVRFX0VSUk9SX1dBUk5JTkcsCS8qIFJYL1RYIGVycm9yIGNvdW50IDwgMTI4ICovCisJQ0FOX1NUQVRFX0VSUk9SX1BBU1NJVkUsCS8qIFJYL1RYIGVycm9yIGNvdW50IDwgMjU2ICovCisJQ0FOX1NUQVRFX0JVU19PRkYsCQkvKiBSWC9UWCBlcnJvciBjb3VudCA+PSAyNTYgKi8KKwlDQU5fU1RBVEVfU1RPUFBFRCwJCS8qIERldmljZSBpcyBzdG9wcGVkICovCisJQ0FOX1NUQVRFX1NMRUVQSU5HLAkJLyogRGV2aWNlIGlzIHNsZWVwaW5nICovCisJQ0FOX1NUQVRFX01BWAorfTsKKworLyoKKyAqIENBTiBidXMgZXJyb3IgY291bnRlcnMKKyAqLworc3RydWN0IGNhbl9iZXJyX2NvdW50ZXIgeworCV9fdTE2IHR4ZXJyOworCV9fdTE2IHJ4ZXJyOworfTsKKworLyoKKyAqIENBTiBjb250cm9sbGVyIG1vZGUKKyAqLworc3RydWN0IGNhbl9jdHJsbW9kZSB7CisJX191MzIgbWFzazsKKwlfX3UzMiBmbGFnczsKK307CisKKyNkZWZpbmUgQ0FOX0NUUkxNT0RFX0xPT1BCQUNLCQkweDAxCS8qIExvb3BiYWNrIG1vZGUgKi8KKyNkZWZpbmUgQ0FOX0NUUkxNT0RFX0xJU1RFTk9OTFkJCTB4MDIJLyogTGlzdGVuLW9ubHkgbW9kZSAqLworI2RlZmluZSBDQU5fQ1RSTE1PREVfM19TQU1QTEVTCQkweDA0CS8qIFRyaXBsZSBzYW1wbGluZyBtb2RlICovCisjZGVmaW5lIENBTl9DVFJMTU9ERV9PTkVfU0hPVAkJMHgwOAkvKiBPbmUtU2hvdCBtb2RlICovCisjZGVmaW5lIENBTl9DVFJMTU9ERV9CRVJSX1JFUE9SVElORwkweDEwCS8qIEJ1cy1lcnJvciByZXBvcnRpbmcgKi8KKyNkZWZpbmUgQ0FOX0NUUkxNT0RFX0ZECQkJMHgyMAkvKiBDQU4gRkQgbW9kZSAqLworI2RlZmluZSBDQU5fQ1RSTE1PREVfUFJFU1VNRV9BQ0sJMHg0MAkvKiBJZ25vcmUgbWlzc2luZyBDQU4gQUNLcyAqLworI2RlZmluZSBDQU5fQ1RSTE1PREVfRkRfTk9OX0lTTwkJMHg4MAkvKiBDQU4gRkQgaW4gbm9uLUlTTyBtb2RlICovCisKKy8qCisgKiBDQU4gZGV2aWNlIHN0YXRpc3RpY3MKKyAqLworc3RydWN0IGNhbl9kZXZpY2Vfc3RhdHMgeworCV9fdTMyIGJ1c19lcnJvcjsJLyogQnVzIGVycm9ycyAqLworCV9fdTMyIGVycm9yX3dhcm5pbmc7CS8qIENoYW5nZXMgdG8gZXJyb3Igd2FybmluZyBzdGF0ZSAqLworCV9fdTMyIGVycm9yX3Bhc3NpdmU7CS8qIENoYW5nZXMgdG8gZXJyb3IgcGFzc2l2ZSBzdGF0ZSAqLworCV9fdTMyIGJ1c19vZmY7CQkvKiBDaGFuZ2VzIHRvIGJ1cyBvZmYgc3RhdGUgKi8KKwlfX3UzMiBhcmJpdHJhdGlvbl9sb3N0OyAvKiBBcmJpdHJhdGlvbiBsb3N0IGVycm9ycyAqLworCV9fdTMyIHJlc3RhcnRzOwkJLyogQ0FOIGNvbnRyb2xsZXIgcmUtc3RhcnRzICovCit9OworCisvKgorICogQ0FOIG5ldGxpbmsgaW50ZXJmYWNlCisgKi8KK2VudW0geworCUlGTEFfQ0FOX1VOU1BFQywKKwlJRkxBX0NBTl9CSVRUSU1JTkcsCisJSUZMQV9DQU5fQklUVElNSU5HX0NPTlNULAorCUlGTEFfQ0FOX0NMT0NLLAorCUlGTEFfQ0FOX1NUQVRFLAorCUlGTEFfQ0FOX0NUUkxNT0RFLAorCUlGTEFfQ0FOX1JFU1RBUlRfTVMsCisJSUZMQV9DQU5fUkVTVEFSVCwKKwlJRkxBX0NBTl9CRVJSX0NPVU5URVIsCisJSUZMQV9DQU5fREFUQV9CSVRUSU1JTkcsCisJSUZMQV9DQU5fREFUQV9CSVRUSU1JTkdfQ09OU1QsCisJX19JRkxBX0NBTl9NQVgKK307CisKKyNkZWZpbmUgSUZMQV9DQU5fTUFYCShfX0lGTEFfQ0FOX01BWCAtIDEpCisKKyNlbmRpZiAvKiAhX1VBUElfQ0FOX05FVExJTktfSCAqLwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9maWJfcnVsZXMuaCBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvZmliX3J1bGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRjZGU2NAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvZmliX3J1bGVzLmgKQEAgLTAsMCArMSw3NCBAQAorI2lmbmRlZiBfX0xJTlVYX0ZJQl9SVUxFU19ICisjZGVmaW5lIF9fTElOVVhfRklCX1JVTEVTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisKKy8qIHJ1bGUgaXMgcGVybWFuZW50LCBhbmQgY2Fubm90IGJlIGRlbGV0ZWQgKi8KKyNkZWZpbmUgRklCX1JVTEVfUEVSTUFORU5UCTB4MDAwMDAwMDEKKyNkZWZpbmUgRklCX1JVTEVfSU5WRVJUCQkweDAwMDAwMDAyCisjZGVmaW5lIEZJQl9SVUxFX1VOUkVTT0xWRUQJMHgwMDAwMDAwNAorI2RlZmluZSBGSUJfUlVMRV9JSUZfREVUQUNIRUQJMHgwMDAwMDAwOAorI2RlZmluZSBGSUJfUlVMRV9ERVZfREVUQUNIRUQJRklCX1JVTEVfSUlGX0RFVEFDSEVECisjZGVmaW5lIEZJQl9SVUxFX09JRl9ERVRBQ0hFRAkweDAwMDAwMDEwCisKKy8qIHRyeSB0byBmaW5kIHNvdXJjZSBhZGRyZXNzIGluIHJvdXRpbmcgbG9va3VwcyAqLworI2RlZmluZSBGSUJfUlVMRV9GSU5EX1NBRERSCTB4MDAwMTAwMDAKKworc3RydWN0IGZpYl9ydWxlX2hkciB7CisJX191OAkJZmFtaWx5OworCV9fdTgJCWRzdF9sZW47CisJX191OAkJc3JjX2xlbjsKKwlfX3U4CQl0b3M7CisKKwlfX3U4CQl0YWJsZTsKKwlfX3U4CQlyZXMxOwkvKiByZXNlcnZlZCAqLworCV9fdTgJCXJlczI7CS8qIHJlc2VydmVkICovCisJX191OAkJYWN0aW9uOworCisJX191MzIJCWZsYWdzOworfTsKKworZW51bSB7CisJRlJBX1VOU1BFQywKKwlGUkFfRFNULAkvKiBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisJRlJBX1NSQywJLyogc291cmNlIGFkZHJlc3MgKi8KKwlGUkFfSUlGTkFNRSwJLyogaW50ZXJmYWNlIG5hbWUgKi8KKyNkZWZpbmUgRlJBX0lGTkFNRQlGUkFfSUlGTkFNRQorCUZSQV9HT1RPLAkvKiB0YXJnZXQgdG8ganVtcCB0byAoRlJfQUNUX0dPVE8pICovCisJRlJBX1VOVVNFRDIsCisJRlJBX1BSSU9SSVRZLAkvKiBwcmlvcml0eS9wcmVmZXJlbmNlICovCisJRlJBX1VOVVNFRDMsCisJRlJBX1VOVVNFRDQsCisJRlJBX1VOVVNFRDUsCisJRlJBX0ZXTUFSSywJLyogbWFyayAqLworCUZSQV9GTE9XLAkvKiBmbG93L2NsYXNzIGlkICovCisJRlJBX1RVTl9JRCwKKwlGUkFfU1VQUFJFU1NfSUZHUk9VUCwKKwlGUkFfU1VQUFJFU1NfUFJFRklYTEVOLAorCUZSQV9UQUJMRSwJLyogRXh0ZW5kZWQgdGFibGUgaWQgKi8KKwlGUkFfRldNQVNLLAkvKiBtYXNrIGZvciBuZXRmaWx0ZXIgbWFyayAqLworCUZSQV9PSUZOQU1FLAorCUZSQV9VSURfU1RBUlQsCisJRlJBX1VJRF9FTkQsCisJX19GUkFfTUFYCit9OworCisjZGVmaW5lIEZSQV9NQVggKF9fRlJBX01BWCAtIDEpCisKK2VudW0geworCUZSX0FDVF9VTlNQRUMsCisJRlJfQUNUX1RPX1RCTCwJCS8qIFBhc3MgdG8gZml4ZWQgdGFibGUgKi8KKwlGUl9BQ1RfR09UTywJCS8qIEp1bXAgdG8gYW5vdGhlciBydWxlICovCisJRlJfQUNUX05PUCwJCS8qIE5vIG9wZXJhdGlvbiAqLworCUZSX0FDVF9SRVMzLAorCUZSX0FDVF9SRVM0LAorCUZSX0FDVF9CTEFDS0hPTEUsCS8qIERyb3Agd2l0aG91dCBub3RpZmljYXRpb24gKi8KKwlGUl9BQ1RfVU5SRUFDSEFCTEUsCS8qIERyb3Agd2l0aCBFTkVUVU5SRUFDSCAqLworCUZSX0FDVF9QUk9ISUJJVCwJLyogRHJvcCB3aXRoIEVBQ0NFUyAqLworCV9fRlJfQUNUX01BWCwKK307CisKKyNkZWZpbmUgRlJfQUNUX01BWCAoX19GUl9BQ1RfTUFYIC0gMSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L2ZpbHRlci5oIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9maWx0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGYyZjc0Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9maWx0ZXIuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogTGludXggU29ja2V0IEZpbHRlciBEYXRhIFN0cnVjdHVyZXMKKyAqLworCisjaWZuZGVmIF9fTElOVVhfRklMVEVSX0hfXworI2RlZmluZSBfX0xJTlVYX0ZJTFRFUl9IX18KKworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9icGZfY29tbW9uLmg+CisKKy8qCisgKiBDdXJyZW50IHZlcnNpb24gb2YgdGhlIGZpbHRlciBjb2RlIGFyY2hpdGVjdHVyZS4KKyAqLworI2RlZmluZSBCUEZfTUFKT1JfVkVSU0lPTiAxCisjZGVmaW5lIEJQRl9NSU5PUl9WRVJTSU9OIDEKKworLyoKKyAqCVRyeSBhbmQga2VlcCB0aGVzZSB2YWx1ZXMgYW5kIHN0cnVjdHVyZXMgc2ltaWxhciB0byBCU0QsIGVzcGVjaWFsbHkKKyAqCXRoZSBCUEYgY29kZSBkZWZpbml0aW9ucyB3aGljaCBuZWVkIHRvIG1hdGNoIHNvIHlvdSBjYW4gc2hhcmUgZmlsdGVycworICovCisgCitzdHJ1Y3Qgc29ja19maWx0ZXIgewkvKiBGaWx0ZXIgYmxvY2sgKi8KKwlfX3UxNgljb2RlOyAgIC8qIEFjdHVhbCBmaWx0ZXIgY29kZSAqLworCV9fdTgJanQ7CS8qIEp1bXAgdHJ1ZSAqLworCV9fdTgJamY7CS8qIEp1bXAgZmFsc2UgKi8KKwlfX3UzMglrOyAgICAgIC8qIEdlbmVyaWMgbXVsdGl1c2UgZmllbGQgKi8KK307CisKK3N0cnVjdCBzb2NrX2Zwcm9nIHsJLyogUmVxdWlyZWQgZm9yIFNPX0FUVEFDSF9GSUxURVIuICovCisJdW5zaWduZWQgc2hvcnQJCWxlbjsJLyogTnVtYmVyIG9mIGZpbHRlciBibG9ja3MgKi8KKwlzdHJ1Y3Qgc29ja19maWx0ZXIgKmZpbHRlcjsKK307CisKKy8qIHJldCAtIEJQRl9LIGFuZCBCUEZfWCBhbHNvIGFwcGx5ICovCisjZGVmaW5lIEJQRl9SVkFMKGNvZGUpICAoKGNvZGUpICYgMHgxOCkKKyNkZWZpbmUgICAgICAgICBCUEZfQSAgICAgICAgICAgMHgxMAorCisvKiBtaXNjICovCisjZGVmaW5lIEJQRl9NSVNDT1AoY29kZSkgKChjb2RlKSAmIDB4ZjgpCisjZGVmaW5lICAgICAgICAgQlBGX1RBWCAgICAgICAgIDB4MDAKKyNkZWZpbmUgICAgICAgICBCUEZfVFhBICAgICAgICAgMHg4MAorCisvKgorICogTWFjcm9zIGZvciBmaWx0ZXIgYmxvY2sgYXJyYXkgaW5pdGlhbGl6ZXJzLgorICovCisjaWZuZGVmIEJQRl9TVE1UCisjZGVmaW5lIEJQRl9TVE1UKGNvZGUsIGspIHsgKHVuc2lnbmVkIHNob3J0KShjb2RlKSwgMCwgMCwgayB9CisjZW5kaWYKKyNpZm5kZWYgQlBGX0pVTVAKKyNkZWZpbmUgQlBGX0pVTVAoY29kZSwgaywganQsIGpmKSB7ICh1bnNpZ25lZCBzaG9ydCkoY29kZSksIGp0LCBqZiwgayB9CisjZW5kaWYKKworLyoKKyAqIE51bWJlciBvZiBzY3JhdGNoIG1lbW9yeSB3b3JkcyBmb3I6IEJQRl9TVCBhbmQgQlBGX1NUWAorICovCisjZGVmaW5lIEJQRl9NRU1XT1JEUyAxNgorCisvKiBSQVRJT05BTEUuIE5lZ2F0aXZlIG9mZnNldHMgYXJlIGludmFsaWQgaW4gQlBGLgorICAgV2UgdXNlIHRoZW0gdG8gcmVmZXJlbmNlIGFuY2lsbGFyeSBkYXRhLgorICAgVW5saWtlIGludHJvZHVjdGlvbiBuZXcgaW5zdHJ1Y3Rpb25zLCBpdCBkb2VzIG5vdCBicmVhaworICAgZXhpc3RpbmcgY29tcGlsZXJzL29wdGltaXplcnMuCisgKi8KKyNkZWZpbmUgU0tGX0FEX09GRiAgICAoLTB4MTAwMCkKKyNkZWZpbmUgU0tGX0FEX1BST1RPQ09MIDAKKyNkZWZpbmUgU0tGX0FEX1BLVFRZUEUgCTQKKyNkZWZpbmUgU0tGX0FEX0lGSU5ERVggCTgKKyNkZWZpbmUgU0tGX0FEX05MQVRUUgkxMgorI2RlZmluZSBTS0ZfQURfTkxBVFRSX05FU1QJMTYKKyNkZWZpbmUgU0tGX0FEX01BUksgCTIwCisjZGVmaW5lIFNLRl9BRF9RVUVVRQkyNAorI2RlZmluZSBTS0ZfQURfSEFUWVBFCTI4CisjZGVmaW5lIFNLRl9BRF9SWEhBU0gJMzIKKyNkZWZpbmUgU0tGX0FEX0NQVQkzNgorI2RlZmluZSBTS0ZfQURfQUxVX1hPUl9YCTQwCisjZGVmaW5lIFNLRl9BRF9WTEFOX1RBRwk0NAorI2RlZmluZSBTS0ZfQURfVkxBTl9UQUdfUFJFU0VOVCA0OAorI2RlZmluZSBTS0ZfQURfUEFZX09GRlNFVAk1MgorI2RlZmluZSBTS0ZfQURfUkFORE9NCTU2CisjZGVmaW5lIFNLRl9BRF9WTEFOX1RQSUQJNjAKKyNkZWZpbmUgU0tGX0FEX01BWAk2NAorCisjZGVmaW5lIFNLRl9ORVRfT0ZGCSgtMHgxMDAwMDApCisjZGVmaW5lIFNLRl9MTF9PRkYJKC0weDIwMDAwMCkKKworI2RlZmluZSBCUEZfTkVUX09GRglTS0ZfTkVUX09GRgorI2RlZmluZSBCUEZfTExfT0ZGCVNLRl9MTF9PRkYKKworI2VuZGlmIC8qIF9fTElOVVhfRklMVEVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9mb3UuaCBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvZm91LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ0YzMyMwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvZm91LmgKQEAgLTAsMCArMSw0MSBAQAorLyogZm91LmggLSBGT1UgSW50ZXJmYWNlICovCisKKyNpZm5kZWYgX0xJTlVYX0ZPVV9ICisjZGVmaW5lIF9MSU5VWF9GT1VfSAorCisvKiBORVRMSU5LX0dFTkVSSUMgcmVsYXRlZCBpbmZvCisgKi8KKyNkZWZpbmUgRk9VX0dFTkxfTkFNRQkJImZvdSIKKyNkZWZpbmUgRk9VX0dFTkxfVkVSU0lPTgkweDEKKworZW51bSB7CisJRk9VX0FUVFJfVU5TUEVDLAorCUZPVV9BVFRSX1BPUlQsCQkJCS8qIHUxNiAqLworCUZPVV9BVFRSX0FGLAkJCQkvKiB1OCAqLworCUZPVV9BVFRSX0lQUFJPVE8sCQkJLyogdTggKi8KKwlGT1VfQVRUUl9UWVBFLAkJCQkvKiB1OCAqLworCUZPVV9BVFRSX1JFTUNTVU1fTk9QQVJUSUFMLAkJLyogZmxhZyAqLworCisJX19GT1VfQVRUUl9NQVgsCit9OworCisjZGVmaW5lIEZPVV9BVFRSX01BWAkJKF9fRk9VX0FUVFJfTUFYIC0gMSkKKworZW51bSB7CisJRk9VX0NNRF9VTlNQRUMsCisJRk9VX0NNRF9BREQsCisJRk9VX0NNRF9ERUwsCisJRk9VX0NNRF9HRVQsCisKKwlfX0ZPVV9DTURfTUFYLAorfTsKKworZW51bSB7CisJRk9VX0VOQ0FQX1VOU1BFQywKKwlGT1VfRU5DQVBfRElSRUNULAorCUZPVV9FTkNBUF9HVUUsCit9OworCisjZGVmaW5lIEZPVV9DTURfTUFYCShfX0ZPVV9DTURfTUFYIC0gMSkKKworI2VuZGlmIC8qIF9MSU5VWF9GT1VfSCAqLwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9nZW5fc3RhdHMuaCBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvZ2VuX3N0YXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ4NzMxNwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvZ2VuX3N0YXRzLmgKQEAgLTAsMCArMSw3OCBAQAorI2lmbmRlZiBfX0xJTlVYX0dFTl9TVEFUU19ICisjZGVmaW5lIF9fTElOVVhfR0VOX1NUQVRTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK2VudW0geworCVRDQV9TVEFUU19VTlNQRUMsCisJVENBX1NUQVRTX0JBU0lDLAorCVRDQV9TVEFUU19SQVRFX0VTVCwKKwlUQ0FfU1RBVFNfUVVFVUUsCisJVENBX1NUQVRTX0FQUCwKKwlUQ0FfU1RBVFNfUkFURV9FU1Q2NCwKKwlfX1RDQV9TVEFUU19NQVgsCit9OworI2RlZmluZSBUQ0FfU1RBVFNfTUFYIChfX1RDQV9TVEFUU19NQVggLSAxKQorCisvKioKKyAqIHN0cnVjdCBnbmV0X3N0YXRzX2Jhc2ljIC0gYnl0ZS9wYWNrZXQgdGhyb3VnaHB1dCBzdGF0aXN0aWNzCisgKiBAYnl0ZXM6IG51bWJlciBvZiBzZWVuIGJ5dGVzCisgKiBAcGFja2V0czogbnVtYmVyIG9mIHNlZW4gcGFja2V0cworICovCitzdHJ1Y3QgZ25ldF9zdGF0c19iYXNpYyB7CisJX191NjQJYnl0ZXM7CisJX191MzIJcGFja2V0czsKK307CitzdHJ1Y3QgZ25ldF9zdGF0c19iYXNpY19wYWNrZWQgeworCV9fdTY0CWJ5dGVzOworCV9fdTMyCXBhY2tldHM7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoqCisgKiBzdHJ1Y3QgZ25ldF9zdGF0c19yYXRlX2VzdCAtIHJhdGUgZXN0aW1hdG9yCisgKiBAYnBzOiBjdXJyZW50IGJ5dGUgcmF0ZQorICogQHBwczogY3VycmVudCBwYWNrZXQgcmF0ZQorICovCitzdHJ1Y3QgZ25ldF9zdGF0c19yYXRlX2VzdCB7CisJX191MzIJYnBzOworCV9fdTMyCXBwczsKK307CisKKy8qKgorICogc3RydWN0IGduZXRfc3RhdHNfcmF0ZV9lc3Q2NCAtIHJhdGUgZXN0aW1hdG9yCisgKiBAYnBzOiBjdXJyZW50IGJ5dGUgcmF0ZQorICogQHBwczogY3VycmVudCBwYWNrZXQgcmF0ZQorICovCitzdHJ1Y3QgZ25ldF9zdGF0c19yYXRlX2VzdDY0IHsKKwlfX3U2NAlicHM7CisJX191NjQJcHBzOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZ25ldF9zdGF0c19xdWV1ZSAtIHF1ZXVpbmcgc3RhdGlzdGljcworICogQHFsZW46IHF1ZXVlIGxlbmd0aAorICogQGJhY2tsb2c6IGJhY2tsb2cgc2l6ZSBvZiBxdWV1ZQorICogQGRyb3BzOiBudW1iZXIgb2YgZHJvcHBlZCBwYWNrZXRzCisgKiBAcmVxdWV1ZXM6IG51bWJlciBvZiByZXF1ZXVlcworICogQG92ZXJsaW1pdHM6IG51bWJlciBvZiBlbnF1ZXVlcyBvdmVyIHRoZSBsaW1pdAorICovCitzdHJ1Y3QgZ25ldF9zdGF0c19xdWV1ZSB7CisJX191MzIJcWxlbjsKKwlfX3UzMgliYWNrbG9nOworCV9fdTMyCWRyb3BzOworCV9fdTMyCXJlcXVldWVzOworCV9fdTMyCW92ZXJsaW1pdHM7Cit9OworCisvKioKKyAqIHN0cnVjdCBnbmV0X2VzdGltYXRvciAtIHJhdGUgZXN0aW1hdG9yIGNvbmZpZ3VyYXRpb24KKyAqIEBpbnRlcnZhbDogc2FtcGxpbmcgcGVyaW9kCisgKiBAZXdtYV9sb2c6IHRoZSBsb2cgb2YgbWVhc3VyZW1lbnQgd2luZG93IHdlaWdodAorICovCitzdHJ1Y3QgZ25ldF9lc3RpbWF0b3IgeworCXNpZ25lZCBjaGFyCWludGVydmFsOworCXVuc2lnbmVkIGNoYXIJZXdtYV9sb2c7Cit9OworCisKKyNlbmRpZiAvKiBfX0xJTlVYX0dFTl9TVEFUU19IICovCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L2dlbmV0bGluay5oIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9nZW5ldGxpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTFkNTAwCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9nZW5ldGxpbmsuaApAQCAtMCwwICsxLDg2IEBACisjaWZuZGVmIF9fTElOVVhfR0VORVJJQ19ORVRMSU5LX0gKKyNkZWZpbmUgX19MSU5VWF9HRU5FUklDX05FVExJTktfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisKKyNkZWZpbmUgR0VOTF9OQU1TSVoJMTYJLyogbGVuZ3RoIG9mIGZhbWlseSBuYW1lICovCisKKyNkZWZpbmUgR0VOTF9NSU5fSUQJTkxNU0dfTUlOX1RZUEUKKyNkZWZpbmUgR0VOTF9NQVhfSUQJMTAyMworCitzdHJ1Y3QgZ2VubG1zZ2hkciB7CisJX191OAljbWQ7CisJX191OAl2ZXJzaW9uOworCV9fdTE2CXJlc2VydmVkOworfTsKKworI2RlZmluZSBHRU5MX0hEUkxFTglOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IGdlbmxtc2doZHIpKQorCisjZGVmaW5lIEdFTkxfQURNSU5fUEVSTQkJMHgwMQorI2RlZmluZSBHRU5MX0NNRF9DQVBfRE8JCTB4MDIKKyNkZWZpbmUgR0VOTF9DTURfQ0FQX0RVTVAJMHgwNAorI2RlZmluZSBHRU5MX0NNRF9DQVBfSEFTUE9MCTB4MDgKKworLyoKKyAqIExpc3Qgb2YgcmVzZXJ2ZWQgc3RhdGljIGdlbmVyaWMgbmV0bGluayBpZGVudGlmaWVyczoKKyAqLworI2RlZmluZSBHRU5MX0lEX0dFTkVSQVRFCTAKKyNkZWZpbmUgR0VOTF9JRF9DVFJMCQlOTE1TR19NSU5fVFlQRQorI2RlZmluZSBHRU5MX0lEX1ZGU19EUVVPVAkoTkxNU0dfTUlOX1RZUEUgKyAxKQorI2RlZmluZSBHRU5MX0lEX1BNQ1JBSUQJCShOTE1TR19NSU5fVFlQRSArIDIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29udHJvbGxlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitlbnVtIHsKKwlDVFJMX0NNRF9VTlNQRUMsCisJQ1RSTF9DTURfTkVXRkFNSUxZLAorCUNUUkxfQ01EX0RFTEZBTUlMWSwKKwlDVFJMX0NNRF9HRVRGQU1JTFksCisJQ1RSTF9DTURfTkVXT1BTLAorCUNUUkxfQ01EX0RFTE9QUywKKwlDVFJMX0NNRF9HRVRPUFMsCisJQ1RSTF9DTURfTkVXTUNBU1RfR1JQLAorCUNUUkxfQ01EX0RFTE1DQVNUX0dSUCwKKwlDVFJMX0NNRF9HRVRNQ0FTVF9HUlAsIC8qIHVudXNlZCAqLworCV9fQ1RSTF9DTURfTUFYLAorfTsKKworI2RlZmluZSBDVFJMX0NNRF9NQVggKF9fQ1RSTF9DTURfTUFYIC0gMSkKKworZW51bSB7CisJQ1RSTF9BVFRSX1VOU1BFQywKKwlDVFJMX0FUVFJfRkFNSUxZX0lELAorCUNUUkxfQVRUUl9GQU1JTFlfTkFNRSwKKwlDVFJMX0FUVFJfVkVSU0lPTiwKKwlDVFJMX0FUVFJfSERSU0laRSwKKwlDVFJMX0FUVFJfTUFYQVRUUiwKKwlDVFJMX0FUVFJfT1BTLAorCUNUUkxfQVRUUl9NQ0FTVF9HUk9VUFMsCisJX19DVFJMX0FUVFJfTUFYLAorfTsKKworI2RlZmluZSBDVFJMX0FUVFJfTUFYIChfX0NUUkxfQVRUUl9NQVggLSAxKQorCitlbnVtIHsKKwlDVFJMX0FUVFJfT1BfVU5TUEVDLAorCUNUUkxfQVRUUl9PUF9JRCwKKwlDVFJMX0FUVFJfT1BfRkxBR1MsCisJX19DVFJMX0FUVFJfT1BfTUFYLAorfTsKKworI2RlZmluZSBDVFJMX0FUVFJfT1BfTUFYIChfX0NUUkxfQVRUUl9PUF9NQVggLSAxKQorCitlbnVtIHsKKwlDVFJMX0FUVFJfTUNBU1RfR1JQX1VOU1BFQywKKwlDVFJMX0FUVFJfTUNBU1RfR1JQX05BTUUsCisJQ1RSTF9BVFRSX01DQVNUX0dSUF9JRCwKKwlfX0NUUkxfQVRUUl9NQ0FTVF9HUlBfTUFYLAorfTsKKworI2RlZmluZSBDVFJMX0FUVFJfTUNBU1RfR1JQX01BWCAoX19DVFJMX0FUVFJfTUNBU1RfR1JQX01BWCAtIDEpCisKKworI2VuZGlmIC8qIF9fTElOVVhfR0VORVJJQ19ORVRMSU5LX0ggKi8KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2luY2x1ZGUvbGludXgvaGRsYy9pb2N0bC5oIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9oZGxjL2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRiYzAyNwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvaGRsYy9pb2N0bC5oCkBAIC0wLDAgKzEsODQgQEAKKyNpZm5kZWYgX19IRExDX0lPQ1RMX0hfXworI2RlZmluZSBfX0hETENfSU9DVExfSF9fCisKKworI2RlZmluZSBHRU5FUklDX0hETENfVkVSU0lPTiA0CS8qIEZvciBzeW5jaHJvbml6YXRpb24gd2l0aCBzZXRoZGxjIHV0aWxpdHkgKi8KKworI2RlZmluZSBDTE9DS19ERUZBVUxUICAgMAkvKiBEZWZhdWx0IHNldHRpbmcgKi8KKyNkZWZpbmUgQ0xPQ0tfRVhUCTEJLyogRXh0ZXJuYWwgVFggYW5kIFJYIGNsb2NrIC0gRFRFICovCisjZGVmaW5lIENMT0NLX0lOVAkyCS8qIEludGVybmFsIFRYIGFuZCBSWCBjbG9jayAtIERDRSAqLworI2RlZmluZSBDTE9DS19UWElOVAkzCS8qIEludGVybmFsIFRYIGFuZCBleHRlcm5hbCBSWCBjbG9jayAqLworI2RlZmluZSBDTE9DS19UWEZST01SWAk0CS8qIFRYIGNsb2NrIGRlcml2ZWQgZnJvbSBleHRlcm5hbCBSWCBjbG9jayAqLworCisKKyNkZWZpbmUgRU5DT0RJTkdfREVGQVVMVAkwIC8qIERlZmF1bHQgc2V0dGluZyAqLworI2RlZmluZSBFTkNPRElOR19OUloJCTEKKyNkZWZpbmUgRU5DT0RJTkdfTlJaSQkJMgorI2RlZmluZSBFTkNPRElOR19GTV9NQVJLCTMKKyNkZWZpbmUgRU5DT0RJTkdfRk1fU1BBQ0UJNAorI2RlZmluZSBFTkNPRElOR19NQU5DSEVTVEVSCTUKKworCisjZGVmaW5lIFBBUklUWV9ERUZBVUxUCQkwIC8qIERlZmF1bHQgc2V0dGluZyAqLworI2RlZmluZSBQQVJJVFlfTk9ORQkJMSAvKiBObyBwYXJpdHkgKi8KKyNkZWZpbmUgUEFSSVRZX0NSQzE2X1BSMAkyIC8qIENSQzE2LCBpbml0aWFsIHZhbHVlIDB4MDAwMCAqLworI2RlZmluZSBQQVJJVFlfQ1JDMTZfUFIxCTMgLyogQ1JDMTYsIGluaXRpYWwgdmFsdWUgMHhGRkZGICovCisjZGVmaW5lIFBBUklUWV9DUkMxNl9QUjBfQ0NJVFQJNCAvKiBDUkMxNiwgaW5pdGlhbCAweDAwMDAsIElUVS1UIHZlcnNpb24gKi8KKyNkZWZpbmUgUEFSSVRZX0NSQzE2X1BSMV9DQ0lUVAk1IC8qIENSQzE2LCBpbml0aWFsIDB4RkZGRiwgSVRVLVQgdmVyc2lvbiAqLworI2RlZmluZSBQQVJJVFlfQ1JDMzJfUFIwX0NDSVRUCTYgLyogQ1JDMzIsIGluaXRpYWwgdmFsdWUgMHgwMDAwMDAwMCAqLworI2RlZmluZSBQQVJJVFlfQ1JDMzJfUFIxX0NDSVRUCTcgLyogQ1JDMzIsIGluaXRpYWwgdmFsdWUgMHhGRkZGRkZGRiAqLworCisjZGVmaW5lIExNSV9ERUZBVUxUCQkwIC8qIERlZmF1bHQgc2V0dGluZyAqLworI2RlZmluZSBMTUlfTk9ORQkJMSAvKiBObyBMTUksIGFsbCBQVkNzIGFyZSBzdGF0aWMgKi8KKyNkZWZpbmUgTE1JX0FOU0kJCTIgLyogQU5TSSBBbm5leCBEICovCisjZGVmaW5lIExNSV9DQ0lUVAkJMyAvKiBJVFUtVCBBbm5leCBBICovCisjZGVmaW5lIExNSV9DSVNDTwkJNCAvKiBUaGUgIm9yaWdpbmFsIiBMTUksIGFrYSBHYW5nIG9mIEZvdXIgKi8KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBjbG9ja19yYXRlOyAvKiBiaXRzIHBlciBzZWNvbmQgKi8KKwl1bnNpZ25lZCBpbnQgY2xvY2tfdHlwZTsgLyogaW50ZXJuYWwsIGV4dGVybmFsLCBUWC1pbnRlcm5hbCBldGMuICovCisJdW5zaWduZWQgc2hvcnQgbG9vcGJhY2s7Cit9IHN5bmNfc2VyaWFsX3NldHRpbmdzOyAgICAgICAgICAvKiBWLjM1LCBWLjI0LCBYLjIxICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgY2xvY2tfcmF0ZTsgLyogYml0cyBwZXIgc2Vjb25kICovCisJdW5zaWduZWQgaW50IGNsb2NrX3R5cGU7IC8qIGludGVybmFsLCBleHRlcm5hbCwgVFgtaW50ZXJuYWwgZXRjLiAqLworCXVuc2lnbmVkIHNob3J0IGxvb3BiYWNrOworCXVuc2lnbmVkIGludCBzbG90X21hcDsKK30gdGUxX3NldHRpbmdzOyAgICAgICAgICAgICAgICAgIC8qIFQxLCBFMSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgc2hvcnQgZW5jb2Rpbmc7CisJdW5zaWduZWQgc2hvcnQgcGFyaXR5OworfSByYXdfaGRsY19wcm90bzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCB0MzkxOworCXVuc2lnbmVkIGludCB0MzkyOworCXVuc2lnbmVkIGludCBuMzkxOworCXVuc2lnbmVkIGludCBuMzkyOworCXVuc2lnbmVkIGludCBuMzkzOworCXVuc2lnbmVkIHNob3J0IGxtaTsKKwl1bnNpZ25lZCBzaG9ydCBkY2U7IC8qIDEgZm9yIERDRSAobmV0d29yayBzaWRlKSBvcGVyYXRpb24gKi8KK30gZnJfcHJvdG87CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgZGxjaTsKK30gZnJfcHJvdG9fcHZjOyAgICAgICAgICAvKiBmb3IgY3JlYXRpbmcvZGVsZXRpbmcgRlIgUFZDcyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGRsY2k7CisJY2hhciBtYXN0ZXJbSUZOQU1TSVpdOwkvKiBOYW1lIG9mIG1hc3RlciBGUkFEIGRldmljZSAqLworfWZyX3Byb3RvX3B2Y19pbmZvOwkJLyogZm9yIHJldHVybmluZyBQVkMgaW5mb3JtYXRpb24gb25seSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQgaW50IGludGVydmFsOworICAgIHVuc2lnbmVkIGludCB0aW1lb3V0OworfSBjaXNjb19wcm90bzsKKworLyogUFBQIGRvZXNuJ3QgbmVlZCBhbnkgaW5mbyBub3cgLSBzdXBwbHkgbGVuZ3RoID0gMCB0byBpb2N0bCAqLworCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisjZW5kaWYgLyogX19IRExDX0lPQ1RMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9pZi5oIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9pZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NWE5ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L2lmLmgKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJR2xvYmFsIGRlZmluaXRpb25zIGZvciB0aGUgSU5FVCBpbnRlcmZhY2UgbW9kdWxlLgorICoKKyAqIFZlcnNpb246CUAoIylpZi5oCTEuMC4yCTA0LzE4LzkzCisgKgorICogQXV0aG9yczoJT3JpZ2luYWwgdGFrZW4gZnJvbSBCZXJrZWxleSBVTklYIDQuMywgKGMpIFVDQiAxOTgyLTE5ODgKKyAqCQlSb3NzIEJpcm8KKyAqCQlGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfTElOVVhfSUZfSAorI2RlZmluZSBfTElOVVhfSUZfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4JCS8qIGZvciAiX19rZXJuZWxfY2FkZHJfdCIgZXQgYWwJKi8KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4JCS8qIGZvciAic3RydWN0IHNvY2thZGRyIiBldCBhbAkqLworCQkvKiBmb3IgIl9fdXNlciIgZXQgYWwgICAgICAgICAgICovCisKKyNkZWZpbmUJSUZOQU1TSVoJMTYKKyNkZWZpbmUJSUZBTElBU1oJMjU2CisjaW5jbHVkZSA8bGludXgvaGRsYy9pb2N0bC5oPgorCisvKioKKyAqIGVudW0gbmV0X2RldmljZV9mbGFncyAtICZzdHJ1Y3QgbmV0X2RldmljZSBmbGFncworICoKKyAqIFRoZXNlIGFyZSB0aGUgJnN0cnVjdCBuZXRfZGV2aWNlIGZsYWdzLCB0aGV5IGNhbiBiZSBzZXQgYnkgZHJpdmVycywgdGhlCisgKiBrZXJuZWwgYW5kIHNvbWUgY2FuIGJlIHRyaWdnZXJlZCBieSB1c2Vyc3BhY2UuIFVzZXJzcGFjZSBjYW4gcXVlcnkgYW5kCisgKiBzZXQgdGhlc2UgZmxhZ3MgdXNpbmcgdXNlcnNwYWNlIHV0aWxpdGllcyBidXQgdGhlcmUgaXMgYWxzbyBhIHN5c2ZzCisgKiBlbnRyeSBhdmFpbGFibGUgZm9yIGFsbCBkZXYgZmxhZ3Mgd2hpY2ggY2FuIGJlIHF1ZXJpZWQgYW5kIHNldC4gVGhlc2UgZmxhZ3MKKyAqIGFyZSBzaGFyZWQgZm9yIGFsbCB0eXBlcyBvZiBuZXRfZGV2aWNlcy4gVGhlIHN5c2ZzIGVudHJpZXMgYXJlIGF2YWlsYWJsZQorICogdmlhIC9zeXMvY2xhc3MvbmV0LzxkZXY+L2ZsYWdzLiBGbGFncyB3aGljaCBjYW4gYmUgdG9nZ2xlZCB0aHJvdWdoIHN5c2ZzCisgKiBhcmUgYW5ub3RhdGVkIGJlbG93LCBub3RlIHRoYXQgb25seSBhIGZldyBmbGFncyBjYW4gYmUgdG9nZ2xlZCBhbmQgc29tZQorICogb3RoZXIgZmxhZ3MgYXJlIGFsd2F5cyBhbHdheXMgcHJlc2VydmVkIGZyb20gdGhlIG9yaWdpbmFsIG5ldF9kZXZpY2UgZmxhZ3MKKyAqIGV2ZW4gaWYgeW91IHRyeSB0byBzZXQgdGhlbSB2aWEgc3lzZnMuIEZsYWdzIHdoaWNoIGFyZSBhbHdheXMgcHJlc2VydmVkCisgKiBhcmUga2VwdCB1bmRlciB0aGUgZmxhZyBncm91cGluZyBASUZGX1ZPTEFUSUxFLiBGbGFncyB3aGljaCBhcmUgX192b2xhdGlsZV9fCisgKiBhcmUgYW5ub3RhdGVkIGJlbG93IGFzIHN1Y2guCisgKgorICogWW91IHNob3VsZCBoYXZlIGEgcHJldHR5IGdvb2QgcmVhc29uIHRvIGJlIGV4dGVuZGluZyB0aGVzZSBmbGFncy4KKyAqCisgKiBASUZGX1VQOiBpbnRlcmZhY2UgaXMgdXAuIENhbiBiZSB0b2dnbGVkIHRocm91Z2ggc3lzZnMuCisgKiBASUZGX0JST0FEQ0FTVDogYnJvYWRjYXN0IGFkZHJlc3MgdmFsaWQuIFZvbGF0aWxlLgorICogQElGRl9ERUJVRzogdHVybiBvbiBkZWJ1Z2dpbmcuIENhbiBiZSB0b2dnbGVkIHRocm91Z2ggc3lzZnMuCisgKiBASUZGX0xPT1BCQUNLOiBpcyBhIGxvb3BiYWNrIG5ldC4gVm9sYXRpbGUuCisgKiBASUZGX1BPSU5UT1BPSU5UOiBpbnRlcmZhY2UgaXMgaGFzIHAtcCBsaW5rLiBWb2xhdGlsZS4KKyAqIEBJRkZfTk9UUkFJTEVSUzogYXZvaWQgdXNlIG9mIHRyYWlsZXJzLiBDYW4gYmUgdG9nZ2xlZCB0aHJvdWdoIHN5c2ZzLgorICoJVm9sYXRpbGUuCisgKiBASUZGX1JVTk5JTkc6IGludGVyZmFjZSBSRkMyODYzIE9QRVJfVVAuIFZvbGF0aWxlLgorICogQElGRl9OT0FSUDogbm8gQVJQIHByb3RvY29sLiBDYW4gYmUgdG9nZ2xlZCB0aHJvdWdoIHN5c2ZzLiBWb2xhdGlsZS4KKyAqIEBJRkZfUFJPTUlTQzogcmVjZWl2ZSBhbGwgcGFja2V0cy4gQ2FuIGJlIHRvZ2dsZWQgdGhyb3VnaCBzeXNmcy4KKyAqIEBJRkZfQUxMTVVMVEk6IHJlY2VpdmUgYWxsIG11bHRpY2FzdCBwYWNrZXRzLiBDYW4gYmUgdG9nZ2xlZCB0aHJvdWdoCisgKglzeXNmcy4KKyAqIEBJRkZfTUFTVEVSOiBtYXN0ZXIgb2YgYSBsb2FkIGJhbGFuY2VyLiBWb2xhdGlsZS4KKyAqIEBJRkZfU0xBVkU6IHNsYXZlIG9mIGEgbG9hZCBiYWxhbmNlci4gVm9sYXRpbGUuCisgKiBASUZGX01VTFRJQ0FTVDogU3VwcG9ydHMgbXVsdGljYXN0LiBDYW4gYmUgdG9nZ2xlZCB0aHJvdWdoIHN5c2ZzLgorICogQElGRl9QT1JUU0VMOiBjYW4gc2V0IG1lZGlhIHR5cGUuIENhbiBiZSB0b2dnbGVkIHRocm91Z2ggc3lzZnMuCisgKiBASUZGX0FVVE9NRURJQTogYXV0byBtZWRpYSBzZWxlY3QgYWN0aXZlLiBDYW4gYmUgdG9nZ2xlZCB0aHJvdWdoIHN5c2ZzLgorICogQElGRl9EWU5BTUlDOiBkaWFsdXAgZGV2aWNlIHdpdGggY2hhbmdpbmcgYWRkcmVzc2VzLiBDYW4gYmUgdG9nZ2xlZAorICoJdGhyb3VnaCBzeXNmcy4KKyAqIEBJRkZfTE9XRVJfVVA6IGRyaXZlciBzaWduYWxzIEwxIHVwLiBWb2xhdGlsZS4KKyAqIEBJRkZfRE9STUFOVDogZHJpdmVyIHNpZ25hbHMgZG9ybWFudC4gVm9sYXRpbGUuCisgKiBASUZGX0VDSE86IGVjaG8gc2VudCBwYWNrZXRzLiBWb2xhdGlsZS4KKyAqLworZW51bSBuZXRfZGV2aWNlX2ZsYWdzIHsKKwlJRkZfVVAJCQkJPSAxPDwwLCAgLyogc3lzZnMgKi8KKwlJRkZfQlJPQURDQVNUCQkJPSAxPDwxLCAgLyogX192b2xhdGlsZV9fICovCisJSUZGX0RFQlVHCQkJPSAxPDwyLCAgLyogc3lzZnMgKi8KKwlJRkZfTE9PUEJBQ0sJCQk9IDE8PDMsICAvKiBfX3ZvbGF0aWxlX18gKi8KKwlJRkZfUE9JTlRPUE9JTlQJCQk9IDE8PDQsICAvKiBfX3ZvbGF0aWxlX18gKi8KKwlJRkZfTk9UUkFJTEVSUwkJCT0gMTw8NSwgIC8qIHN5c2ZzICovCisJSUZGX1JVTk5JTkcJCQk9IDE8PDYsICAvKiBfX3ZvbGF0aWxlX18gKi8KKwlJRkZfTk9BUlAJCQk9IDE8PDcsICAvKiBzeXNmcyAqLworCUlGRl9QUk9NSVNDCQkJPSAxPDw4LCAgLyogc3lzZnMgKi8KKwlJRkZfQUxMTVVMVEkJCQk9IDE8PDksICAvKiBzeXNmcyAqLworCUlGRl9NQVNURVIJCQk9IDE8PDEwLCAvKiBfX3ZvbGF0aWxlX18gKi8KKwlJRkZfU0xBVkUJCQk9IDE8PDExLCAvKiBfX3ZvbGF0aWxlX18gKi8KKwlJRkZfTVVMVElDQVNUCQkJPSAxPDwxMiwgLyogc3lzZnMgKi8KKwlJRkZfUE9SVFNFTAkJCT0gMTw8MTMsIC8qIHN5c2ZzICovCisJSUZGX0FVVE9NRURJQQkJCT0gMTw8MTQsIC8qIHN5c2ZzICovCisJSUZGX0RZTkFNSUMJCQk9IDE8PDE1LCAvKiBzeXNmcyAqLworCUlGRl9MT1dFUl9VUAkJCT0gMTw8MTYsIC8qIF9fdm9sYXRpbGVfXyAqLworCUlGRl9ET1JNQU5UCQkJPSAxPDwxNywgLyogX192b2xhdGlsZV9fICovCisJSUZGX0VDSE8JCQk9IDE8PDE4LCAvKiBfX3ZvbGF0aWxlX18gKi8KK307CisKKyNkZWZpbmUgSUZGX1VQCQkJCUlGRl9VUAorI2RlZmluZSBJRkZfQlJPQURDQVNUCQkJSUZGX0JST0FEQ0FTVAorI2RlZmluZSBJRkZfREVCVUcJCQlJRkZfREVCVUcKKyNkZWZpbmUgSUZGX0xPT1BCQUNLCQkJSUZGX0xPT1BCQUNLCisjZGVmaW5lIElGRl9QT0lOVE9QT0lOVAkJCUlGRl9QT0lOVE9QT0lOVAorI2RlZmluZSBJRkZfTk9UUkFJTEVSUwkJCUlGRl9OT1RSQUlMRVJTCisjZGVmaW5lIElGRl9SVU5OSU5HCQkJSUZGX1JVTk5JTkcKKyNkZWZpbmUgSUZGX05PQVJQCQkJSUZGX05PQVJQCisjZGVmaW5lIElGRl9QUk9NSVNDCQkJSUZGX1BST01JU0MKKyNkZWZpbmUgSUZGX0FMTE1VTFRJCQkJSUZGX0FMTE1VTFRJCisjZGVmaW5lIElGRl9NQVNURVIJCQlJRkZfTUFTVEVSCisjZGVmaW5lIElGRl9TTEFWRQkJCUlGRl9TTEFWRQorI2RlZmluZSBJRkZfTVVMVElDQVNUCQkJSUZGX01VTFRJQ0FTVAorI2RlZmluZSBJRkZfUE9SVFNFTAkJCUlGRl9QT1JUU0VMCisjZGVmaW5lIElGRl9BVVRPTUVESUEJCQlJRkZfQVVUT01FRElBCisjZGVmaW5lIElGRl9EWU5BTUlDCQkJSUZGX0RZTkFNSUMKKyNkZWZpbmUgSUZGX0xPV0VSX1VQCQkJSUZGX0xPV0VSX1VQCisjZGVmaW5lIElGRl9ET1JNQU5UCQkJSUZGX0RPUk1BTlQKKyNkZWZpbmUgSUZGX0VDSE8JCQlJRkZfRUNITworCisjZGVmaW5lIElGRl9WT0xBVElMRQkoSUZGX0xPT1BCQUNLfElGRl9QT0lOVE9QT0lOVHxJRkZfQlJPQURDQVNUfElGRl9FQ0hPfFwKKwkJSUZGX01BU1RFUnxJRkZfU0xBVkV8SUZGX1JVTk5JTkd8SUZGX0xPV0VSX1VQfElGRl9ET1JNQU5UKQorCisjZGVmaW5lIElGX0dFVF9JRkFDRQkweDAwMDEJCS8qIGZvciBxdWVyeWluZyBvbmx5ICovCisjZGVmaW5lIElGX0dFVF9QUk9UTwkweDAwMDIKKworLyogRm9yIGRlZmluaXRpb25zIHNlZSBoZGxjLmggKi8KKyNkZWZpbmUgSUZfSUZBQ0VfVjM1CTB4MTAwMAkJLyogVi4zNSBzZXJpYWwgaW50ZXJmYWNlCSovCisjZGVmaW5lIElGX0lGQUNFX1YyNAkweDEwMDEJCS8qIFYuMjQgc2VyaWFsIGludGVyZmFjZQkqLworI2RlZmluZSBJRl9JRkFDRV9YMjEJMHgxMDAyCQkvKiBYLjIxIHNlcmlhbCBpbnRlcmZhY2UJKi8KKyNkZWZpbmUgSUZfSUZBQ0VfVDEJMHgxMDAzCQkvKiBUMSB0ZWxjbyBzZXJpYWwgaW50ZXJmYWNlCSovCisjZGVmaW5lIElGX0lGQUNFX0UxCTB4MTAwNAkJLyogRTEgdGVsY28gc2VyaWFsIGludGVyZmFjZQkqLworI2RlZmluZSBJRl9JRkFDRV9TWU5DX1NFUklBTCAweDEwMDUJLyogY2FuJ3QgYmUgc2V0IGJ5IHNvZnR3YXJlCSovCisjZGVmaW5lIElGX0lGQUNFX1gyMUQgICAweDEwMDYgICAgICAgICAgLyogWC4yMSBEdWFsIENsb2NraW5nIChGYXJTaXRlKSAqLworCisvKiBGb3IgZGVmaW5pdGlvbnMgc2VlIGhkbGMuaCAqLworI2RlZmluZSBJRl9QUk9UT19IRExDCTB4MjAwMAkJLyogcmF3IEhETEMgcHJvdG9jb2wJCSovCisjZGVmaW5lIElGX1BST1RPX1BQUAkweDIwMDEJCS8qIFBQUCBwcm90b2NvbAkJCSovCisjZGVmaW5lIElGX1BST1RPX0NJU0NPCTB4MjAwMgkJLyogQ2lzY28gSERMQyBwcm90b2NvbAkJKi8KKyNkZWZpbmUgSUZfUFJPVE9fRlIJMHgyMDAzCQkvKiBGcmFtZSBSZWxheSBwcm90b2NvbAkJKi8KKyNkZWZpbmUgSUZfUFJPVE9fRlJfQUREX1BWQyAweDIwMDQJLyogICAgQ3JlYXRlIEZSIFBWQwkJKi8KKyNkZWZpbmUgSUZfUFJPVE9fRlJfREVMX1BWQyAweDIwMDUJLyogICAgRGVsZXRlIEZSIFBWQwkJKi8KKyNkZWZpbmUgSUZfUFJPVE9fWDI1CTB4MjAwNgkJLyogWC4yNQkJCQkqLworI2RlZmluZSBJRl9QUk9UT19IRExDX0VUSCAweDIwMDcJLyogcmF3IEhETEMsIEV0aGVybmV0IGVtdWxhdGlvbgkqLworI2RlZmluZSBJRl9QUk9UT19GUl9BRERfRVRIX1BWQyAweDIwMDgJLyogIENyZWF0ZSBGUiBFdGhlcm5ldC1icmlkZ2VkIFBWQyAqLworI2RlZmluZSBJRl9QUk9UT19GUl9ERUxfRVRIX1BWQyAweDIwMDkJLyogIERlbGV0ZSBGUiBFdGhlcm5ldC1icmlkZ2VkIFBWQyAqLworI2RlZmluZSBJRl9QUk9UT19GUl9QVkMJMHgyMDBBCQkvKiBmb3IgcmVhZGluZyBQVkMgc3RhdHVzCSovCisjZGVmaW5lIElGX1BST1RPX0ZSX0VUSF9QVkMgMHgyMDBCCisjZGVmaW5lIElGX1BST1RPX1JBVyAgICAweDIwMEMgICAgICAgICAgLyogUkFXIFNvY2tldCAgICAgICAgICAgICAgICAgICAqLworCisvKiBSRkMgMjg2MyBvcGVyYXRpb25hbCBzdGF0dXMgKi8KK2VudW0geworCUlGX09QRVJfVU5LTk9XTiwKKwlJRl9PUEVSX05PVFBSRVNFTlQsCisJSUZfT1BFUl9ET1dOLAorCUlGX09QRVJfTE9XRVJMQVlFUkRPV04sCisJSUZfT1BFUl9URVNUSU5HLAorCUlGX09QRVJfRE9STUFOVCwKKwlJRl9PUEVSX1VQLAorfTsKKworLyogbGluayBtb2RlcyAqLworZW51bSB7CisJSUZfTElOS19NT0RFX0RFRkFVTFQsCisJSUZfTElOS19NT0RFX0RPUk1BTlQsCS8qIGxpbWl0IHVwd2FyZCB0cmFuc2l0aW9uIHRvIGRvcm1hbnQgKi8KK307CisKKy8qCisgKglEZXZpY2UgbWFwcGluZyBzdHJ1Y3R1cmUuIEknZCBqdXN0IGdvbmUgb2ZmIGFuZCBkZXNpZ25lZCBhIAorICoJYmVhdXRpZnVsIHNjaGVtZSB1c2luZyBvbmx5IGxvYWRhYmxlIG1vZHVsZXMgd2l0aCBhcmd1bWVudHMKKyAqCWZvciBkcml2ZXIgb3B0aW9ucyBhbmQgYWxvbmcgY29tZSB0aGUgUENNQ0lBIHBlb3BsZSA4KQorICoKKyAqCUFoIHdlbGwuIFRoZSBnZXQoKSBzaWRlIG9mIHRoaXMgaXMgZ29vZCBmb3IgV0RTRVRVUCwgYW5kIGl0J2xsCisgKgliZSBoYW5keSBmb3IgZGVidWdnaW5nIHRoaW5ncy4gVGhlIHNldCBzaWRlIGlzIGZpbmUgZm9yIG5vdyBhbmQKKyAqCWJlaW5nIHZlcnkgc21hbGwgbWlnaHQgYmUgd29ydGgga2VlcGluZyBmb3IgY2xlYW4gY29uZmlndXJhdGlvbi4KKyAqLworCitzdHJ1Y3QgaWZtYXAgeworCXVuc2lnbmVkIGxvbmcgbWVtX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgbWVtX2VuZDsKKwl1bnNpZ25lZCBzaG9ydCBiYXNlX2FkZHI7IAorCXVuc2lnbmVkIGNoYXIgaXJxOworCXVuc2lnbmVkIGNoYXIgZG1hOworCXVuc2lnbmVkIGNoYXIgcG9ydDsKKwkvKiAzIGJ5dGVzIHNwYXJlICovCit9OworCitzdHJ1Y3QgaWZfc2V0dGluZ3MgeworCXVuc2lnbmVkIGludCB0eXBlOwkvKiBUeXBlIG9mIHBoeXNpY2FsIGRldmljZSBvciBwcm90b2NvbCAqLworCXVuc2lnbmVkIGludCBzaXplOwkvKiBTaXplIG9mIHRoZSBkYXRhIGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyICovCisJdW5pb24geworCQkvKiB7YXRtL2V0aC9kc2x9X3NldHRpbmdzIGFueW9uZSA/ICovCisJCXJhd19oZGxjX3Byb3RvCQkqcmF3X2hkbGM7CisJCWNpc2NvX3Byb3RvCQkqY2lzY287CisJCWZyX3Byb3RvCQkqZnI7CisJCWZyX3Byb3RvX3B2YwkJKmZyX3B2YzsKKwkJZnJfcHJvdG9fcHZjX2luZm8JKmZyX3B2Y19pbmZvOworCisJCS8qIGludGVyZmFjZSBzZXR0aW5ncyAqLworCQlzeW5jX3NlcmlhbF9zZXR0aW5ncwkqc3luYzsKKwkJdGUxX3NldHRpbmdzCQkqdGUxOworCX0gaWZzX2lmc3U7Cit9OworCisvKgorICogSW50ZXJmYWNlIHJlcXVlc3Qgc3RydWN0dXJlIHVzZWQgZm9yIHNvY2tldAorICogaW9jdGwncy4gIEFsbCBpbnRlcmZhY2UgaW9jdGwncyBtdXN0IGhhdmUgcGFyYW1ldGVyCisgKiBkZWZpbml0aW9ucyB3aGljaCBiZWdpbiB3aXRoIGlmcl9uYW1lLiAgVGhlCisgKiByZW1haW5kZXIgbWF5IGJlIGludGVyZmFjZSBzcGVjaWZpYy4KKyAqLworCitzdHJ1Y3QgaWZyZXEgeworI2RlZmluZSBJRkhXQUREUkxFTgk2CisJdW5pb24KKwl7CisJCWNoYXIJaWZybl9uYW1lW0lGTkFNU0laXTsJCS8qIGlmIG5hbWUsIGUuZy4gImVuMCIgKi8KKwl9IGlmcl9pZnJuOworCQorCXVuaW9uIHsKKwkJc3RydWN0CXNvY2thZGRyIGlmcnVfYWRkcjsKKwkJc3RydWN0CXNvY2thZGRyIGlmcnVfZHN0YWRkcjsKKwkJc3RydWN0CXNvY2thZGRyIGlmcnVfYnJvYWRhZGRyOworCQlzdHJ1Y3QJc29ja2FkZHIgaWZydV9uZXRtYXNrOworCQlzdHJ1Y3QgIHNvY2thZGRyIGlmcnVfaHdhZGRyOworCQlzaG9ydAlpZnJ1X2ZsYWdzOworCQlpbnQJaWZydV9pdmFsdWU7CisJCWludAlpZnJ1X210dTsKKwkJc3RydWN0ICBpZm1hcCBpZnJ1X21hcDsKKwkJY2hhcglpZnJ1X3NsYXZlW0lGTkFNU0laXTsJLyogSnVzdCBmaXRzIHRoZSBzaXplICovCisJCWNoYXIJaWZydV9uZXduYW1lW0lGTkFNU0laXTsKKwkJdm9pZCAqCWlmcnVfZGF0YTsKKwkJc3RydWN0CWlmX3NldHRpbmdzIGlmcnVfc2V0dGluZ3M7CisJfSBpZnJfaWZydTsKK307CisKKyNkZWZpbmUgaWZyX25hbWUJaWZyX2lmcm4uaWZybl9uYW1lCS8qIGludGVyZmFjZSBuYW1lIAkqLworI2RlZmluZSBpZnJfaHdhZGRyCWlmcl9pZnJ1LmlmcnVfaHdhZGRyCS8qIE1BQyBhZGRyZXNzIAkJKi8KKyNkZWZpbmUJaWZyX2FkZHIJaWZyX2lmcnUuaWZydV9hZGRyCS8qIGFkZHJlc3MJCSovCisjZGVmaW5lCWlmcl9kc3RhZGRyCWlmcl9pZnJ1LmlmcnVfZHN0YWRkcgkvKiBvdGhlciBlbmQgb2YgcC1wIGxuawkqLworI2RlZmluZQlpZnJfYnJvYWRhZGRyCWlmcl9pZnJ1LmlmcnVfYnJvYWRhZGRyCS8qIGJyb2FkY2FzdCBhZGRyZXNzCSovCisjZGVmaW5lCWlmcl9uZXRtYXNrCWlmcl9pZnJ1LmlmcnVfbmV0bWFzawkvKiBpbnRlcmZhY2UgbmV0IG1hc2sJKi8KKyNkZWZpbmUJaWZyX2ZsYWdzCWlmcl9pZnJ1LmlmcnVfZmxhZ3MJLyogZmxhZ3MJCSovCisjZGVmaW5lCWlmcl9tZXRyaWMJaWZyX2lmcnUuaWZydV9pdmFsdWUJLyogbWV0cmljCQkqLworI2RlZmluZQlpZnJfbXR1CQlpZnJfaWZydS5pZnJ1X210dQkvKiBtdHUJCQkqLworI2RlZmluZSBpZnJfbWFwCQlpZnJfaWZydS5pZnJ1X21hcAkvKiBkZXZpY2UgbWFwCQkqLworI2RlZmluZSBpZnJfc2xhdmUJaWZyX2lmcnUuaWZydV9zbGF2ZQkvKiBzbGF2ZSBkZXZpY2UJCSovCisjZGVmaW5lCWlmcl9kYXRhCWlmcl9pZnJ1LmlmcnVfZGF0YQkvKiBmb3IgdXNlIGJ5IGludGVyZmFjZQkqLworI2RlZmluZSBpZnJfaWZpbmRleAlpZnJfaWZydS5pZnJ1X2l2YWx1ZQkvKiBpbnRlcmZhY2UgaW5kZXgJKi8KKyNkZWZpbmUgaWZyX2JhbmR3aWR0aAlpZnJfaWZydS5pZnJ1X2l2YWx1ZSAgICAvKiBsaW5rIGJhbmR3aWR0aAkqLworI2RlZmluZSBpZnJfcWxlbglpZnJfaWZydS5pZnJ1X2l2YWx1ZQkvKiBRdWV1ZSBsZW5ndGggCSovCisjZGVmaW5lIGlmcl9uZXduYW1lCWlmcl9pZnJ1LmlmcnVfbmV3bmFtZQkvKiBOZXcgbmFtZQkJKi8KKyNkZWZpbmUgaWZyX3NldHRpbmdzCWlmcl9pZnJ1LmlmcnVfc2V0dGluZ3MJLyogRGV2aWNlL3Byb3RvIHNldHRpbmdzKi8KKworLyoKKyAqIFN0cnVjdHVyZSB1c2VkIGluIFNJT0NHSUZDT05GIHJlcXVlc3QuCisgKiBVc2VkIHRvIHJldHJpZXZlIGludGVyZmFjZSBjb25maWd1cmF0aW9uCisgKiBmb3IgbWFjaGluZSAodXNlZnVsIGZvciBwcm9ncmFtcyB3aGljaAorICogbXVzdCBrbm93IGFsbCBuZXR3b3JrcyBhY2Nlc3NpYmxlKS4KKyAqLworCitzdHJ1Y3QgaWZjb25mICB7CisJaW50CWlmY19sZW47CQkJLyogc2l6ZSBvZiBidWZmZXIJKi8KKwl1bmlvbiB7CisJCWNoYXIgKmlmY3VfYnVmOworCQlzdHJ1Y3QgaWZyZXEgKmlmY3VfcmVxOworCX0gaWZjX2lmY3U7Cit9OworI2RlZmluZQlpZmNfYnVmCWlmY19pZmN1LmlmY3VfYnVmCQkvKiBidWZmZXIgYWRkcmVzcwkqLworI2RlZmluZQlpZmNfcmVxCWlmY19pZmN1LmlmY3VfcmVxCQkvKiBhcnJheSBvZiBzdHJ1Y3R1cmVzCSovCisKKyNlbmRpZiAvKiBfTElOVVhfSUZfSCAqLwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9pZl9hZGRyLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L2lmX2FkZHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmYwZWNmCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9pZl9hZGRyLmgKQEAgLTAsMCArMSw2NyBAQAorI2lmbmRlZiBfX0xJTlVYX0lGX0FERFJfSAorI2RlZmluZSBfX0xJTlVYX0lGX0FERFJfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisKK3N0cnVjdCBpZmFkZHJtc2cgeworCV9fdTgJCWlmYV9mYW1pbHk7CisJX191OAkJaWZhX3ByZWZpeGxlbjsJLyogVGhlIHByZWZpeCBsZW5ndGgJCSovCisJX191OAkJaWZhX2ZsYWdzOwkvKiBGbGFncwkJCSovCisJX191OAkJaWZhX3Njb3BlOwkvKiBBZGRyZXNzIHNjb3BlCQkqLworCV9fdTMyCQlpZmFfaW5kZXg7CS8qIExpbmsgaW5kZXgJCQkqLworfTsKKworLyoKKyAqIEltcG9ydGFudCBjb21tZW50OgorICogSUZBX0FERFJFU1MgaXMgcHJlZml4IGFkZHJlc3MsIHJhdGhlciB0aGFuIGxvY2FsIGludGVyZmFjZSBhZGRyZXNzLgorICogSXQgbWFrZXMgbm8gZGlmZmVyZW5jZSBmb3Igbm9ybWFsbHkgY29uZmlndXJlZCBicm9hZGNhc3QgaW50ZXJmYWNlcywKKyAqIGJ1dCBmb3IgcG9pbnQtdG8tcG9pbnQgSUZBX0FERFJFU1MgaXMgREVTVElOQVRJT04gYWRkcmVzcywKKyAqIGxvY2FsIGFkZHJlc3MgaXMgc3VwcGxpZWQgaW4gSUZBX0xPQ0FMIGF0dHJpYnV0ZS4KKyAqCisgKiBJRkFfRkxBR1MgaXMgYSB1MzIgYXR0cmlidXRlIHRoYXQgZXh0ZW5kcyB0aGUgdTggZmllbGQgaWZhX2ZsYWdzLgorICogSWYgcHJlc2VudCwgdGhlIHZhbHVlIGZyb20gc3RydWN0IGlmYWRkcm1zZyB3aWxsIGJlIGlnbm9yZWQuCisgKi8KK2VudW0geworCUlGQV9VTlNQRUMsCisJSUZBX0FERFJFU1MsCisJSUZBX0xPQ0FMLAorCUlGQV9MQUJFTCwKKwlJRkFfQlJPQURDQVNULAorCUlGQV9BTllDQVNULAorCUlGQV9DQUNIRUlORk8sCisJSUZBX01VTFRJQ0FTVCwKKwlJRkFfRkxBR1MsCisJX19JRkFfTUFYLAorfTsKKworI2RlZmluZSBJRkFfTUFYIChfX0lGQV9NQVggLSAxKQorCisvKiBpZmFfZmxhZ3MgKi8KKyNkZWZpbmUgSUZBX0ZfU0VDT05EQVJZCQkweDAxCisjZGVmaW5lIElGQV9GX1RFTVBPUkFSWQkJSUZBX0ZfU0VDT05EQVJZCisKKyNkZWZpbmUJSUZBX0ZfTk9EQUQJCTB4MDIKKyNkZWZpbmUgSUZBX0ZfT1BUSU1JU1RJQwkweDA0CisjZGVmaW5lIElGQV9GX0RBREZBSUxFRAkJMHgwOAorI2RlZmluZQlJRkFfRl9IT01FQUREUkVTUwkweDEwCisjZGVmaW5lIElGQV9GX0RFUFJFQ0FURUQJMHgyMAorI2RlZmluZSBJRkFfRl9URU5UQVRJVkUJCTB4NDAKKyNkZWZpbmUgSUZBX0ZfUEVSTUFORU5UCQkweDgwCisjZGVmaW5lIElGQV9GX01BTkFHRVRFTVBBRERSCTB4MTAwCisjZGVmaW5lIElGQV9GX05PUFJFRklYUk9VVEUJMHgyMDAKKyNkZWZpbmUgSUZBX0ZfTUNBVVRPSk9JTgkweDQwMAorI2RlZmluZSBJRkFfRl9TVEFCTEVfUFJJVkFDWQkweDgwMAorCitzdHJ1Y3QgaWZhX2NhY2hlaW5mbyB7CisJX191MzIJaWZhX3ByZWZlcmVkOworCV9fdTMyCWlmYV92YWxpZDsKKwlfX3UzMgljc3RhbXA7IC8qIGNyZWF0ZWQgdGltZXN0YW1wLCBodW5kcmVkdGhzIG9mIHNlY29uZHMgKi8KKwlfX3UzMgl0c3RhbXA7IC8qIHVwZGF0ZWQgdGltZXN0YW1wLCBodW5kcmVkdGhzIG9mIHNlY29uZHMgKi8KK307CisKKy8qIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciB1c2Vyc3BhY2UgKi8KKyNkZWZpbmUgSUZBX1JUQShyKSAgKChzdHJ1Y3QgcnRhdHRyKikoKChjaGFyKikocikpICsgTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBpZmFkZHJtc2cpKSkpCisjZGVmaW5lIElGQV9QQVlMT0FEKG4pIE5MTVNHX1BBWUxPQUQobixzaXplb2Yoc3RydWN0IGlmYWRkcm1zZykpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9pZl9hZGRybGFiZWwuaCBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvaWZfYWRkcmxhYmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ1ODBjMgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvaWZfYWRkcmxhYmVsLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIGlmX2FkZHJsYWJlbC5oIC0gbmV0bGluayBpbnRlcmZhY2UgZm9yIGFkZHJlc3MgbGFiZWxzCisgKgorICogQ29weXJpZ2h0IChDKTIwMDcgVVNBR0kvV0lERSBQcm9qZWN0LCAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBBdXRob3JzOgorICoJWU9TSElGVUpJIEhpZGVha2kgQCBVU0FHSS9XSURFIDx5b3NoZnVqaUBsaW51eC1pcHY2Lm9yZz4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfSUZfQUREUkxBQkVMX0gKKyNkZWZpbmUgX19MSU5VWF9JRl9BRERSTEFCRUxfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IGlmYWRkcmxibG1zZyB7CisJX191OAkJaWZhbF9mYW1pbHk7CQkvKiBBZGRyZXNzIGZhbWlseSAqLworCV9fdTgJCV9faWZhbF9yZXNlcnZlZDsJLyogUmVzZXJ2ZWQgKi8KKwlfX3U4CQlpZmFsX3ByZWZpeGxlbjsJCS8qIFByZWZpeCBsZW5ndGggKi8KKwlfX3U4CQlpZmFsX2ZsYWdzOwkJLyogRmxhZ3MgKi8KKwlfX3UzMgkJaWZhbF9pbmRleDsJCS8qIExpbmsgaW5kZXggKi8KKwlfX3UzMgkJaWZhbF9zZXE7CQkvKiBzZXF1ZW5jZSBudW1iZXIgKi8KK307CisKK2VudW0geworCUlGQUxfQUREUkVTUyA9IDEsCisJSUZBTF9MQUJFTCA9IDIsCisJX19JRkFMX01BWAorfTsKKworI2RlZmluZSBJRkFMX01BWAkoX19JRkFMX01BWCAtIDEpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9pZl9hcnAuaCBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvaWZfYXJwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAwMWJkYgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvaWZfYXJwLmgKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJR2xvYmFsIGRlZmluaXRpb25zIGZvciB0aGUgQVJQIChSRkMgODI2KSBwcm90b2NvbC4KKyAqCisgKiBWZXJzaW9uOglAKCMpaWZfYXJwLmgJMS4wLjEJMDQvMTYvOTMKKyAqCisgKiBBdXRob3JzOglPcmlnaW5hbCB0YWtlbiBmcm9tIEJlcmtlbGV5IFVOSVggNC4zLCAoYykgVUNCIDE5ODYtMTk4OAorICoJCVBvcnRpb25zIHRha2VuIGZyb20gdGhlIEtBOVEvTk9TICh2Mi4wMG0gUEEwR1JJKSBzb3VyY2UuCisgKgkJUm9zcyBCaXJvCisgKgkJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CisgKgkJRmxvcmlhbiBMYSBSb2NoZSwKKyAqCQlKb25hdGhhbiBMYXllcyA8bGF5ZXNAbG9yYW4uY29tPgorICoJCUFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPiBBUlBIUkRfSFdYMjUKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfTElOVVhfSUZfQVJQX0gKKyNkZWZpbmUgX0xJTlVYX0lGX0FSUF9ICisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKworLyogQVJQIHByb3RvY29sIEhBUkRXQVJFIGlkZW50aWZpZXJzLiAqLworI2RlZmluZSBBUlBIUkRfTkVUUk9NCTAJCS8qIGZyb20gS0E5UTogTkVUL1JPTSBwc2V1ZG8JKi8KKyNkZWZpbmUgQVJQSFJEX0VUSEVSIAkxCQkvKiBFdGhlcm5ldCAxME1icHMJCSovCisjZGVmaW5lCUFSUEhSRF9FRVRIRVIJMgkJLyogRXhwZXJpbWVudGFsIEV0aGVybmV0CSovCisjZGVmaW5lCUFSUEhSRF9BWDI1CTMJCS8qIEFYLjI1IExldmVsIDIJCSovCisjZGVmaW5lCUFSUEhSRF9QUk9ORVQJNAkJLyogUFJPbmV0IHRva2VuIHJpbmcJCSovCisjZGVmaW5lCUFSUEhSRF9DSEFPUwk1CQkvKiBDaGFvc25ldAkJCSovCisjZGVmaW5lCUFSUEhSRF9JRUVFODAyCTYJCS8qIElFRUUgODAyLjIgRXRoZXJuZXQvVFIvVEIJKi8KKyNkZWZpbmUJQVJQSFJEX0FSQ05FVAk3CQkvKiBBUkNuZXQJCQkqLworI2RlZmluZQlBUlBIUkRfQVBQTEVUTEsJOAkJLyogQVBQTEV0YWxrCQkJKi8KKyNkZWZpbmUgQVJQSFJEX0RMQ0kJMTUJCS8qIEZyYW1lIFJlbGF5IERMQ0kJCSovCisjZGVmaW5lIEFSUEhSRF9BVE0JMTkJCS8qIEFUTSAJCQkJKi8KKyNkZWZpbmUgQVJQSFJEX01FVFJJQ09NCTIzCQkvKiBNZXRyaWNvbSBTVFJJUCAobmV3IElBTkEgaWQpCSovCisjZGVmaW5lCUFSUEhSRF9JRUVFMTM5NAkyNAkJLyogSUVFRSAxMzk0IElQdjQgLSBSRkMgMjczNAkqLworI2RlZmluZSBBUlBIUkRfRVVJNjQJMjcJCS8qIEVVSS02NCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQVJQSFJEX0lORklOSUJBTkQgMzIJCS8qIEluZmluaUJhbmQJCQkqLworCisvKiBEdW1teSB0eXBlcyBmb3Igbm9uIEFSUCBoYXJkd2FyZSAqLworI2RlZmluZSBBUlBIUkRfU0xJUAkyNTYKKyNkZWZpbmUgQVJQSFJEX0NTTElQCTI1NworI2RlZmluZSBBUlBIUkRfU0xJUDYJMjU4CisjZGVmaW5lIEFSUEhSRF9DU0xJUDYJMjU5CisjZGVmaW5lIEFSUEhSRF9SU1JWRAkyNjAJCS8qIE5vdGlvbmFsIEtJU1MgdHlwZSAJCSovCisjZGVmaW5lIEFSUEhSRF9BREFQVAkyNjQKKyNkZWZpbmUgQVJQSFJEX1JPU0UJMjcwCisjZGVmaW5lIEFSUEhSRF9YMjUJMjcxCQkvKiBDQ0lUVCBYLjI1CQkJKi8KKyNkZWZpbmUgQVJQSFJEX0hXWDI1CTI3MgkJLyogQm9hcmRzIHdpdGggWC4yNSBpbiBmaXJtd2FyZQkqLworI2RlZmluZSBBUlBIUkRfQ0FOCTI4MAkJLyogQ29udHJvbGxlciBBcmVhIE5ldHdvcmsgICAgICAqLworI2RlZmluZSBBUlBIUkRfUFBQCTUxMgorI2RlZmluZSBBUlBIUkRfQ0lTQ08JNTEzCQkvKiBDaXNjbyBIRExDCSAJCSovCisjZGVmaW5lIEFSUEhSRF9IRExDCUFSUEhSRF9DSVNDTworI2RlZmluZSBBUlBIUkRfTEFQQgk1MTYJCS8qIExBUEIJCQkJKi8KKyNkZWZpbmUgQVJQSFJEX0REQ01QICAgIDUxNwkJLyogRGlnaXRhbCdzIEREQ01QIHByb3RvY29sICAgICAqLworI2RlZmluZSBBUlBIUkRfUkFXSERMQwk1MTgJCS8qIFJhdyBIRExDCQkJKi8KKworI2RlZmluZSBBUlBIUkRfVFVOTkVMCTc2OAkJLyogSVBJUCB0dW5uZWwJCQkqLworI2RlZmluZSBBUlBIUkRfVFVOTkVMNgk3NjkJCS8qIElQNklQNiB0dW5uZWwgICAgICAgCQkqLworI2RlZmluZSBBUlBIUkRfRlJBRAk3NzAgICAgICAgICAgICAgLyogRnJhbWUgUmVsYXkgQWNjZXNzIERldmljZSAgICAqLworI2RlZmluZSBBUlBIUkRfU0tJUAk3NzEJCS8qIFNLSVAgdmlmCQkJKi8KKyNkZWZpbmUgQVJQSFJEX0xPT1BCQUNLCTc3MgkJLyogTG9vcGJhY2sgZGV2aWNlCQkqLworI2RlZmluZSBBUlBIUkRfTE9DQUxUTEsgNzczCQkvKiBMb2NhbHRhbGsgZGV2aWNlCQkqLworI2RlZmluZSBBUlBIUkRfRkRESQk3NzQJCS8qIEZpYmVyIERpc3RyaWJ1dGVkIERhdGEgSW50ZXJmYWNlICovCisjZGVmaW5lIEFSUEhSRF9CSUYgICAgICA3NzUgICAgICAgICAgICAgLyogQVAxMDAwIEJJRiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBUlBIUkRfU0lUCTc3NgkJLyogc2l0MCBkZXZpY2UgLSBJUHY2LWluLUlQdjQJKi8KKyNkZWZpbmUgQVJQSFJEX0lQRERQCTc3NwkJLyogSVAgb3ZlciBERFAgdHVubmVsbGVyCSovCisjZGVmaW5lIEFSUEhSRF9JUEdSRQk3NzgJCS8qIEdSRSBvdmVyIElQCQkJKi8KKyNkZWZpbmUgQVJQSFJEX1BJTVJFRwk3NzkJCS8qIFBJTVNNIHJlZ2lzdGVyIGludGVyZmFjZQkqLworI2RlZmluZSBBUlBIUkRfSElQUEkJNzgwCQkvKiBIaWdoIFBlcmZvcm1hbmNlIFBhcmFsbGVsIEludGVyZmFjZSAqLworI2RlZmluZSBBUlBIUkRfQVNICTc4MQkJLyogTmV4dXMgNjRNYnBzIEFzaAkJKi8KKyNkZWZpbmUgQVJQSFJEX0VDT05FVAk3ODIJCS8qIEFjb3JuIEVjb25ldAkJCSovCisjZGVmaW5lIEFSUEhSRF9JUkRBIAk3ODMJCS8qIExpbnV4LUlyREEJCQkqLworLyogQVJQIHdvcmtzIGRpZmZlcmVudGx5IG9uIGRpZmZlcmVudCBGQyBtZWRpYSAuLiBzbyAgKi8KKyNkZWZpbmUgQVJQSFJEX0ZDUFAJNzg0CQkvKiBQb2ludCB0byBwb2ludCBmaWJyZWNoYW5uZWwJKi8KKyNkZWZpbmUgQVJQSFJEX0ZDQUwJNzg1CQkvKiBGaWJyZWNoYW5uZWwgYXJiaXRyYXRlZCBsb29wICovCisjZGVmaW5lIEFSUEhSRF9GQ1BMCTc4NgkJLyogRmlicmVjaGFubmVsIHB1YmxpYyBsb29wCSovCisjZGVmaW5lIEFSUEhSRF9GQ0ZBQlJJQwk3ODcJCS8qIEZpYnJlY2hhbm5lbCBmYWJyaWMJCSovCisJLyogNzg3LT43OTkgcmVzZXJ2ZWQgZm9yIGZpYnJlY2hhbm5lbCBtZWRpYSB0eXBlcyAqLworI2RlZmluZSBBUlBIUkRfSUVFRTgwMl9UUiA4MDAJCS8qIE1hZ2ljIHR5cGUgaWRlbnQgZm9yIFRSCSovCisjZGVmaW5lIEFSUEhSRF9JRUVFODAyMTEgODAxCQkvKiBJRUVFIDgwMi4xMQkJCSovCisjZGVmaW5lIEFSUEhSRF9JRUVFODAyMTFfUFJJU00gODAyCS8qIElFRUUgODAyLjExICsgUHJpc20yIGhlYWRlciAgKi8KKyNkZWZpbmUgQVJQSFJEX0lFRUU4MDIxMV9SQURJT1RBUCA4MDMJLyogSUVFRSA4MDIuMTEgKyByYWRpb3RhcCBoZWFkZXIgKi8KKyNkZWZpbmUgQVJQSFJEX0lFRUU4MDIxNTQJICA4MDQKKyNkZWZpbmUgQVJQSFJEX0lFRUU4MDIxNTRfTU9OSVRPUiA4MDUJLyogSUVFRSA4MDIuMTUuNCBuZXR3b3JrIG1vbml0b3IgKi8KKworI2RlZmluZSBBUlBIUkRfUEhPTkVUCTgyMAkJLyogUGhvTmV0IG1lZGlhIHR5cGUJCSovCisjZGVmaW5lIEFSUEhSRF9QSE9ORVRfUElQRSA4MjEJCS8qIFBob05ldCBwaXBlIGhlYWRlcgkJKi8KKyNkZWZpbmUgQVJQSFJEX0NBSUYJODIyCQkvKiBDQUlGIG1lZGlhIHR5cGUJCSovCisjZGVmaW5lIEFSUEhSRF9JUDZHUkUJODIzCQkvKiBHUkUgb3ZlciBJUHY2CQkqLworI2RlZmluZSBBUlBIUkRfTkVUTElOSwk4MjQJCS8qIE5ldGxpbmsgaGVhZGVyCQkqLworI2RlZmluZSBBUlBIUkRfNkxPV1BBTgk4MjUJCS8qIElQdjYgb3ZlciBMb1dQQU4gICAgICAgICAgICAgKi8KKworI2RlZmluZSBBUlBIUkRfVk9JRAkgIDB4RkZGRgkvKiBWb2lkIHR5cGUsIG5vdGhpbmcgaXMga25vd24gKi8KKyNkZWZpbmUgQVJQSFJEX05PTkUJICAweEZGRkUJLyogemVybyBoZWFkZXIgbGVuZ3RoICovCisKKy8qIEFSUCBwcm90b2NvbCBvcGNvZGVzLiAqLworI2RlZmluZQlBUlBPUF9SRVFVRVNUCTEJCS8qIEFSUCByZXF1ZXN0CQkJKi8KKyNkZWZpbmUJQVJQT1BfUkVQTFkJMgkJLyogQVJQIHJlcGx5CQkJKi8KKyNkZWZpbmUJQVJQT1BfUlJFUVVFU1QJMwkJLyogUkFSUCByZXF1ZXN0CQkJKi8KKyNkZWZpbmUJQVJQT1BfUlJFUExZCTQJCS8qIFJBUlAgcmVwbHkJCQkqLworI2RlZmluZQlBUlBPUF9JblJFUVVFU1QJOAkJLyogSW5BUlAgcmVxdWVzdAkJKi8KKyNkZWZpbmUJQVJQT1BfSW5SRVBMWQk5CQkvKiBJbkFSUCByZXBseQkJCSovCisjZGVmaW5lCUFSUE9QX05BSwkxMAkJLyogKEFUTSlBUlAgTkFLCQkJKi8KKworCisvKiBBUlAgaW9jdGwgcmVxdWVzdC4gKi8KK3N0cnVjdCBhcnByZXEgeworICBzdHJ1Y3Qgc29ja2FkZHIJYXJwX3BhOwkJLyogcHJvdG9jb2wgYWRkcmVzcwkJKi8KKyAgc3RydWN0IHNvY2thZGRyCWFycF9oYTsJCS8qIGhhcmR3YXJlIGFkZHJlc3MJCSovCisgIGludAkJCWFycF9mbGFnczsJLyogZmxhZ3MJCQkqLworICBzdHJ1Y3Qgc29ja2FkZHIgICAgICAgYXJwX25ldG1hc2s7ICAgIC8qIG5ldG1hc2sgKG9ubHkgZm9yIHByb3h5IGFycHMpICovCisgIGNoYXIJCQlhcnBfZGV2WzE2XTsKK307CisKK3N0cnVjdCBhcnByZXFfb2xkIHsKKyAgc3RydWN0IHNvY2thZGRyCWFycF9wYTsJCS8qIHByb3RvY29sIGFkZHJlc3MJCSovCisgIHN0cnVjdCBzb2NrYWRkcglhcnBfaGE7CQkvKiBoYXJkd2FyZSBhZGRyZXNzCQkqLworICBpbnQJCQlhcnBfZmxhZ3M7CS8qIGZsYWdzCQkJKi8KKyAgc3RydWN0IHNvY2thZGRyICAgICAgIGFycF9uZXRtYXNrOyAgICAvKiBuZXRtYXNrIChvbmx5IGZvciBwcm94eSBhcnBzKSAqLworfTsKKworLyogQVJQIEZsYWcgdmFsdWVzLiAqLworI2RlZmluZSBBVEZfQ09NCQkweDAyCQkvKiBjb21wbGV0ZWQgZW50cnkgKGhhIHZhbGlkKQkqLworI2RlZmluZQlBVEZfUEVSTQkweDA0CQkvKiBwZXJtYW5lbnQgZW50cnkJCSovCisjZGVmaW5lCUFURl9QVUJMCTB4MDgJCS8qIHB1Ymxpc2ggZW50cnkJCSovCisjZGVmaW5lCUFURl9VU0VUUkFJTEVSUwkweDEwCQkvKiBoYXMgcmVxdWVzdGVkIHRyYWlsZXJzCSovCisjZGVmaW5lIEFURl9ORVRNQVNLICAgICAweDIwICAgICAgICAgICAgLyogd2FudCB0byB1c2UgYSBuZXRtYXNrIChvbmx5CisJCQkJCSAgIGZvciBwcm94eSBlbnRyaWVzKSAqLworI2RlZmluZSBBVEZfRE9OVFBVQgkweDQwCQkvKiBkb24ndCBhbnN3ZXIgdGhpcyBhZGRyZXNzZXMJKi8KKworLyoKKyAqCVRoaXMgc3RydWN0dXJlIGRlZmluZXMgYW4gZXRoZXJuZXQgYXJwIGhlYWRlci4KKyAqLworCitzdHJ1Y3QgYXJwaGRyIHsKKwlfX2JlMTYJCWFyX2hyZDsJCS8qIGZvcm1hdCBvZiBoYXJkd2FyZSBhZGRyZXNzCSovCisJX19iZTE2CQlhcl9wcm87CQkvKiBmb3JtYXQgb2YgcHJvdG9jb2wgYWRkcmVzcwkqLworCXVuc2lnbmVkIGNoYXIJYXJfaGxuOwkJLyogbGVuZ3RoIG9mIGhhcmR3YXJlIGFkZHJlc3MJKi8KKwl1bnNpZ25lZCBjaGFyCWFyX3BsbjsJCS8qIGxlbmd0aCBvZiBwcm90b2NvbCBhZGRyZXNzCSovCisJX19iZTE2CQlhcl9vcDsJCS8qIEFSUCBvcGNvZGUgKGNvbW1hbmQpCQkqLworCisjaWYgMAorCSAvKgorCSAgKgkgRXRoZXJuZXQgbG9va3MgbGlrZSB0aGlzIDogVGhpcyBiaXQgaXMgdmFyaWFibGUgc2l6ZWQgaG93ZXZlci4uLgorCSAgKi8KKwl1bnNpZ25lZCBjaGFyCQlhcl9zaGFbRVRIX0FMRU5dOwkvKiBzZW5kZXIgaGFyZHdhcmUgYWRkcmVzcwkqLworCXVuc2lnbmVkIGNoYXIJCWFyX3NpcFs0XTsJCS8qIHNlbmRlciBJUCBhZGRyZXNzCQkqLworCXVuc2lnbmVkIGNoYXIJCWFyX3RoYVtFVEhfQUxFTl07CS8qIHRhcmdldCBoYXJkd2FyZSBhZGRyZXNzCSovCisJdW5zaWduZWQgY2hhcgkJYXJfdGlwWzRdOwkJLyogdGFyZ2V0IElQIGFkZHJlc3MJCSovCisjZW5kaWYKKworfTsKKworCisjZW5kaWYgLyogX0xJTlVYX0lGX0FSUF9IICovCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L2lmX2JyaWRnZS5oIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9pZl9icmlkZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTE5N2EzCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9pZl9icmlkZ2UuaApAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqCUxpbnV4IGV0aGVybmV0IGJyaWRnZQorICoKKyAqCUF1dGhvcnM6CisgKglMZW5uZXJ0IEJ1eXRlbmhlawkJPGJ1eXRlbmhAZ251Lm9yZz4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0lGX0JSSURHRV9ICisjZGVmaW5lIF9MSU5VWF9JRl9CUklER0VfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorCisjZGVmaW5lIFNZU0ZTX0JSSURHRV9BVFRSCSJicmlkZ2UiCisjZGVmaW5lIFNZU0ZTX0JSSURHRV9GREIJImJyZm9yd2FyZCIKKyNkZWZpbmUgU1lTRlNfQlJJREdFX1BPUlRfU1VCRElSICJicmlmIgorI2RlZmluZSBTWVNGU19CUklER0VfUE9SVF9BVFRSCSJicnBvcnQiCisjZGVmaW5lIFNZU0ZTX0JSSURHRV9QT1JUX0xJTksJImJyaWRnZSIKKworI2RlZmluZSBCUkNUTF9WRVJTSU9OIDEKKworI2RlZmluZSBCUkNUTF9HRVRfVkVSU0lPTiAwCisjZGVmaW5lIEJSQ1RMX0dFVF9CUklER0VTIDEKKyNkZWZpbmUgQlJDVExfQUREX0JSSURHRSAyCisjZGVmaW5lIEJSQ1RMX0RFTF9CUklER0UgMworI2RlZmluZSBCUkNUTF9BRERfSUYgNAorI2RlZmluZSBCUkNUTF9ERUxfSUYgNQorI2RlZmluZSBCUkNUTF9HRVRfQlJJREdFX0lORk8gNgorI2RlZmluZSBCUkNUTF9HRVRfUE9SVF9MSVNUIDcKKyNkZWZpbmUgQlJDVExfU0VUX0JSSURHRV9GT1JXQVJEX0RFTEFZIDgKKyNkZWZpbmUgQlJDVExfU0VUX0JSSURHRV9IRUxMT19USU1FIDkKKyNkZWZpbmUgQlJDVExfU0VUX0JSSURHRV9NQVhfQUdFIDEwCisjZGVmaW5lIEJSQ1RMX1NFVF9BR0VJTkdfVElNRSAxMQorI2RlZmluZSBCUkNUTF9TRVRfR0NfSU5URVJWQUwgMTIKKyNkZWZpbmUgQlJDVExfR0VUX1BPUlRfSU5GTyAxMworI2RlZmluZSBCUkNUTF9TRVRfQlJJREdFX1NUUF9TVEFURSAxNAorI2RlZmluZSBCUkNUTF9TRVRfQlJJREdFX1BSSU9SSVRZIDE1CisjZGVmaW5lIEJSQ1RMX1NFVF9QT1JUX1BSSU9SSVRZIDE2CisjZGVmaW5lIEJSQ1RMX1NFVF9QQVRIX0NPU1QgMTcKKyNkZWZpbmUgQlJDVExfR0VUX0ZEQl9FTlRSSUVTIDE4CisKKyNkZWZpbmUgQlJfU1RBVEVfRElTQUJMRUQgMAorI2RlZmluZSBCUl9TVEFURV9MSVNURU5JTkcgMQorI2RlZmluZSBCUl9TVEFURV9MRUFSTklORyAyCisjZGVmaW5lIEJSX1NUQVRFX0ZPUldBUkRJTkcgMworI2RlZmluZSBCUl9TVEFURV9CTE9DS0lORyA0CisKK3N0cnVjdCBfX2JyaWRnZV9pbmZvIHsKKwlfX3U2NCBkZXNpZ25hdGVkX3Jvb3Q7CisJX191NjQgYnJpZGdlX2lkOworCV9fdTMyIHJvb3RfcGF0aF9jb3N0OworCV9fdTMyIG1heF9hZ2U7CisJX191MzIgaGVsbG9fdGltZTsKKwlfX3UzMiBmb3J3YXJkX2RlbGF5OworCV9fdTMyIGJyaWRnZV9tYXhfYWdlOworCV9fdTMyIGJyaWRnZV9oZWxsb190aW1lOworCV9fdTMyIGJyaWRnZV9mb3J3YXJkX2RlbGF5OworCV9fdTggdG9wb2xvZ3lfY2hhbmdlOworCV9fdTggdG9wb2xvZ3lfY2hhbmdlX2RldGVjdGVkOworCV9fdTggcm9vdF9wb3J0OworCV9fdTggc3RwX2VuYWJsZWQ7CisJX191MzIgYWdlaW5nX3RpbWU7CisJX191MzIgZ2NfaW50ZXJ2YWw7CisJX191MzIgaGVsbG9fdGltZXJfdmFsdWU7CisJX191MzIgdGNuX3RpbWVyX3ZhbHVlOworCV9fdTMyIHRvcG9sb2d5X2NoYW5nZV90aW1lcl92YWx1ZTsKKwlfX3UzMiBnY190aW1lcl92YWx1ZTsKK307CisKK3N0cnVjdCBfX3BvcnRfaW5mbyB7CisJX191NjQgZGVzaWduYXRlZF9yb290OworCV9fdTY0IGRlc2lnbmF0ZWRfYnJpZGdlOworCV9fdTE2IHBvcnRfaWQ7CisJX191MTYgZGVzaWduYXRlZF9wb3J0OworCV9fdTMyIHBhdGhfY29zdDsKKwlfX3UzMiBkZXNpZ25hdGVkX2Nvc3Q7CisJX191OCBzdGF0ZTsKKwlfX3U4IHRvcF9jaGFuZ2VfYWNrOworCV9fdTggY29uZmlnX3BlbmRpbmc7CisJX191OCB1bnVzZWQwOworCV9fdTMyIG1lc3NhZ2VfYWdlX3RpbWVyX3ZhbHVlOworCV9fdTMyIGZvcndhcmRfZGVsYXlfdGltZXJfdmFsdWU7CisJX191MzIgaG9sZF90aW1lcl92YWx1ZTsKK307CisKK3N0cnVjdCBfX2ZkYl9lbnRyeSB7CisJX191OCBtYWNfYWRkcltFVEhfQUxFTl07CisJX191OCBwb3J0X25vOworCV9fdTggaXNfbG9jYWw7CisJX191MzIgYWdlaW5nX3RpbWVyX3ZhbHVlOworCV9fdTggcG9ydF9oaTsKKwlfX3U4IHBhZDA7CisJX191MTYgdW51c2VkOworfTsKKworLyogQnJpZGdlIEZsYWdzICovCisjZGVmaW5lIEJSSURHRV9GTEFHU19NQVNURVIJMQkvKiBCcmlkZ2UgY29tbWFuZCB0by9mcm9tIG1hc3RlciAqLworI2RlZmluZSBCUklER0VfRkxBR1NfU0VMRgkyCS8qIEJyaWRnZSBjb21tYW5kIHRvL2Zyb20gbG93ZXJkZXYgKi8KKworI2RlZmluZSBCUklER0VfTU9ERV9WRUIJCTAJLyogRGVmYXVsdCBsb29wYmFjayBtb2RlICovCisjZGVmaW5lIEJSSURHRV9NT0RFX1ZFUEEJMQkvKiA4MDIuMVFiZyBkZWZpbmVkIFZFUEEgbW9kZSAqLworI2RlZmluZSBCUklER0VfTU9ERV9VTkRFRgkweEZGRkYgIC8qIG1vZGUgdW5kZWZpbmVkICovCisKKy8qIEJyaWRnZSBtYW5hZ2VtZW50IG5lc3RlZCBhdHRyaWJ1dGVzCisgKiBbSUZMQV9BRl9TUEVDXSA9IHsKKyAqICAgICBbSUZMQV9CUklER0VfRkxBR1NdCisgKiAgICAgW0lGTEFfQlJJREdFX01PREVdCisgKiAgICAgW0lGTEFfQlJJREdFX1ZMQU5fSU5GT10KKyAqIH0KKyAqLworZW51bSB7CisJSUZMQV9CUklER0VfRkxBR1MsCisJSUZMQV9CUklER0VfTU9ERSwKKwlJRkxBX0JSSURHRV9WTEFOX0lORk8sCisJX19JRkxBX0JSSURHRV9NQVgsCit9OworI2RlZmluZSBJRkxBX0JSSURHRV9NQVggKF9fSUZMQV9CUklER0VfTUFYIC0gMSkKKworI2RlZmluZSBCUklER0VfVkxBTl9JTkZPX01BU1RFUgkoMTw8MCkJLyogT3BlcmF0ZSBvbiBCcmlkZ2UgZGV2aWNlIGFzIHdlbGwgKi8KKyNkZWZpbmUgQlJJREdFX1ZMQU5fSU5GT19QVklECSgxPDwxKQkvKiBWTEFOIGlzIFBWSUQsIGluZ3Jlc3MgdW50YWdnZWQgKi8KKyNkZWZpbmUgQlJJREdFX1ZMQU5fSU5GT19VTlRBR0dFRAkoMTw8MikJLyogVkxBTiBlZ3Jlc3NlcyB1bnRhZ2dlZCAqLworI2RlZmluZSBCUklER0VfVkxBTl9JTkZPX1JBTkdFX0JFR0lOCSgxPDwzKSAvKiBWTEFOIGlzIHN0YXJ0IG9mIHZsYW4gcmFuZ2UgKi8KKyNkZWZpbmUgQlJJREdFX1ZMQU5fSU5GT19SQU5HRV9FTkQJKDE8PDQpIC8qIFZMQU4gaXMgZW5kIG9mIHZsYW4gcmFuZ2UgKi8KKyNkZWZpbmUgQlJJREdFX1ZMQU5fSU5GT19CUkVOVFJZCSgxPDw1KSAvKiBHbG9iYWwgYnJpZGdlIFZMQU4gZW50cnkgKi8KKworc3RydWN0IGJyaWRnZV92bGFuX2luZm8geworCV9fdTE2IGZsYWdzOworCV9fdTE2IHZpZDsKK307CisKKy8qIEJyaWRnZSBtdWx0aWNhc3QgZGF0YWJhc2UgYXR0cmlidXRlcworICogW01EQkFfTURCXSA9IHsKKyAqICAgICBbTURCQV9NREJfRU5UUlldID0geworICogICAgICAgICBbTURCQV9NREJfRU5UUllfSU5GT10KKyAqICAgICB9CisgKiB9CisgKiBbTURCQV9ST1VURVJdID0geworICogICAgW01EQkFfUk9VVEVSX1BPUlRdCisgKiB9CisgKi8KK2VudW0geworCU1EQkFfVU5TUEVDLAorCU1EQkFfTURCLAorCU1EQkFfUk9VVEVSLAorCV9fTURCQV9NQVgsCit9OworI2RlZmluZSBNREJBX01BWCAoX19NREJBX01BWCAtIDEpCisKK2VudW0geworCU1EQkFfTURCX1VOU1BFQywKKwlNREJBX01EQl9FTlRSWSwKKwlfX01EQkFfTURCX01BWCwKK307CisjZGVmaW5lIE1EQkFfTURCX01BWCAoX19NREJBX01EQl9NQVggLSAxKQorCitlbnVtIHsKKwlNREJBX01EQl9FTlRSWV9VTlNQRUMsCisJTURCQV9NREJfRU5UUllfSU5GTywKKwlfX01EQkFfTURCX0VOVFJZX01BWCwKK307CisjZGVmaW5lIE1EQkFfTURCX0VOVFJZX01BWCAoX19NREJBX01EQl9FTlRSWV9NQVggLSAxKQorCitlbnVtIHsKKwlNREJBX1JPVVRFUl9VTlNQRUMsCisJTURCQV9ST1VURVJfUE9SVCwKKwlfX01EQkFfUk9VVEVSX01BWCwKK307CisjZGVmaW5lIE1EQkFfUk9VVEVSX01BWCAoX19NREJBX1JPVVRFUl9NQVggLSAxKQorCitzdHJ1Y3QgYnJfcG9ydF9tc2cgeworCV9fdTggIGZhbWlseTsKKwlfX3UzMiBpZmluZGV4OworfTsKKworc3RydWN0IGJyX21kYl9lbnRyeSB7CisJX191MzIgaWZpbmRleDsKKyNkZWZpbmUgTURCX1RFTVBPUkFSWSAwCisjZGVmaW5lIE1EQl9QRVJNQU5FTlQgMQorCV9fdTggc3RhdGU7CisJX191MTYgdmlkOworCXN0cnVjdCB7CisJCXVuaW9uIHsKKwkJCV9fYmUzMglpcDQ7CisJCQlzdHJ1Y3QgaW42X2FkZHIgaXA2OworCQl9IHU7CisJCV9fYmUxNgkJcHJvdG87CisJfSBhZGRyOworfTsKKworZW51bSB7CisJTURCQV9TRVRfRU5UUllfVU5TUEVDLAorCU1EQkFfU0VUX0VOVFJZLAorCV9fTURCQV9TRVRfRU5UUllfTUFYLAorfTsKKyNkZWZpbmUgTURCQV9TRVRfRU5UUllfTUFYIChfX01EQkFfU0VUX0VOVFJZX01BWCAtIDEpCisKKyNlbmRpZiAvKiBfTElOVVhfSUZfQlJJREdFX0ggKi8KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2luY2x1ZGUvbGludXgvaWZfZXRoZXIuaCBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvaWZfZXRoZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjI3OGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9pZl9ldGhlci5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKgkJaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICoJCUdsb2JhbCBkZWZpbml0aW9ucyBmb3IgdGhlIEV0aGVybmV0IElFRUUgODAyLjMgaW50ZXJmYWNlLgorICoKKyAqIFZlcnNpb246CUAoIylpZl9ldGhlci5oCTEuMC4xYQkwMi8wOC85NAorICoKKyAqIEF1dGhvcjoJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CisgKgkJRG9uYWxkIEJlY2tlciwgPGJlY2tlckBzdXBlci5vcmc+CisgKgkJQWxhbiBDb3gsIDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CisgKgkJU3RldmUgV2hpdGVob3VzZSwgPGd3N3JybUBlZXNoYWNrMy5zd2FuLmFjLnVrPgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0lGX0VUSEVSX0gKKyNkZWZpbmUgX0xJTlVYX0lGX0VUSEVSX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKglJRUVFIDgwMi4zIEV0aGVybmV0IG1hZ2ljIGNvbnN0YW50cy4gIFRoZSBmcmFtZSBzaXplcyBvbWl0IHRoZSBwcmVhbWJsZQorICoJYW5kIEZDUy9DUkMgKGZyYW1lIGNoZWNrIHNlcXVlbmNlKS4KKyAqLworCisjZGVmaW5lIEVUSF9BTEVOCTYJCS8qIE9jdGV0cyBpbiBvbmUgZXRoZXJuZXQgYWRkcgkgKi8KKyNkZWZpbmUgRVRIX0hMRU4JMTQJCS8qIFRvdGFsIG9jdGV0cyBpbiBoZWFkZXIuCSAqLworI2RlZmluZSBFVEhfWkxFTgk2MAkJLyogTWluLiBvY3RldHMgaW4gZnJhbWUgc2FucyBGQ1MgKi8KKyNkZWZpbmUgRVRIX0RBVEFfTEVOCTE1MDAJCS8qIE1heC4gb2N0ZXRzIGluIHBheWxvYWQJICovCisjZGVmaW5lIEVUSF9GUkFNRV9MRU4JMTUxNAkJLyogTWF4LiBvY3RldHMgaW4gZnJhbWUgc2FucyBGQ1MgKi8KKyNkZWZpbmUgRVRIX0ZDU19MRU4JNAkJLyogT2N0ZXRzIGluIHRoZSBGQ1MJCSAqLworCisvKgorICoJVGhlc2UgYXJlIHRoZSBkZWZpbmVkIEV0aGVybmV0IFByb3RvY29sIElEJ3MuCisgKi8KKworI2RlZmluZSBFVEhfUF9MT09QCTB4MDA2MAkJLyogRXRoZXJuZXQgTG9vcGJhY2sgcGFja2V0CSovCisjZGVmaW5lIEVUSF9QX1BVUAkweDAyMDAJCS8qIFhlcm94IFBVUCBwYWNrZXQJCSovCisjZGVmaW5lIEVUSF9QX1BVUEFUCTB4MDIwMQkJLyogWGVyb3ggUFVQIEFkZHIgVHJhbnMgcGFja2V0CSovCisjZGVmaW5lIEVUSF9QX1RTTgkweDIyRjAJCS8qIFRTTiAoSUVFRSAxNzIyKSBwYWNrZXQJKi8KKyNkZWZpbmUgRVRIX1BfSVAJMHgwODAwCQkvKiBJbnRlcm5ldCBQcm90b2NvbCBwYWNrZXQJKi8KKyNkZWZpbmUgRVRIX1BfWDI1CTB4MDgwNQkJLyogQ0NJVFQgWC4yNQkJCSovCisjZGVmaW5lIEVUSF9QX0FSUAkweDA4MDYJCS8qIEFkZHJlc3MgUmVzb2x1dGlvbiBwYWNrZXQJKi8KKyNkZWZpbmUJRVRIX1BfQlBRCTB4MDhGRgkJLyogRzhCUFEgQVguMjUgRXRoZXJuZXQgUGFja2V0CVsgTk9UIEFOIE9GRklDSUFMTFkgUkVHSVNURVJFRCBJRCBdICovCisjZGVmaW5lIEVUSF9QX0lFRUVQVVAJMHgwYTAwCQkvKiBYZXJveCBJRUVFODAyLjMgUFVQIHBhY2tldCAqLworI2RlZmluZSBFVEhfUF9JRUVFUFVQQVQJMHgwYTAxCQkvKiBYZXJveCBJRUVFODAyLjMgUFVQIEFkZHIgVHJhbnMgcGFja2V0ICovCisjZGVmaW5lIEVUSF9QX0JBVE1BTgkweDQzMDUJCS8qIEIuQS5ULk0uQS5OLi1BZHZhbmNlZCBwYWNrZXQgWyBOT1QgQU4gT0ZGSUNJQUxMWSBSRUdJU1RFUkVEIElEIF0gKi8KKyNkZWZpbmUgRVRIX1BfREVDICAgICAgIDB4NjAwMCAgICAgICAgICAvKiBERUMgQXNzaWduZWQgcHJvdG8gICAgICAgICAgICovCisjZGVmaW5lIEVUSF9QX0ROQV9ETCAgICAweDYwMDEgICAgICAgICAgLyogREVDIEROQSBEdW1wL0xvYWQgICAgICAgICAgICAqLworI2RlZmluZSBFVEhfUF9ETkFfUkMgICAgMHg2MDAyICAgICAgICAgIC8qIERFQyBETkEgUmVtb3RlIENvbnNvbGUgICAgICAgKi8KKyNkZWZpbmUgRVRIX1BfRE5BX1JUICAgIDB4NjAwMyAgICAgICAgICAvKiBERUMgRE5BIFJvdXRpbmcgICAgICAgICAgICAgICovCisjZGVmaW5lIEVUSF9QX0xBVCAgICAgICAweDYwMDQgICAgICAgICAgLyogREVDIExBVCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFVEhfUF9ESUFHICAgICAgMHg2MDA1ICAgICAgICAgIC8qIERFQyBEaWFnbm9zdGljcyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVRIX1BfQ1VTVCAgICAgIDB4NjAwNiAgICAgICAgICAvKiBERUMgQ3VzdG9tZXIgdXNlICAgICAgICAgICAgICovCisjZGVmaW5lIEVUSF9QX1NDQSAgICAgICAweDYwMDcgICAgICAgICAgLyogREVDIFN5c3RlbXMgQ29tbXMgQXJjaCAgICAgICAqLworI2RlZmluZSBFVEhfUF9URUIJMHg2NTU4CQkvKiBUcmFucyBFdGhlciBCcmlkZ2luZwkJKi8KKyNkZWZpbmUgRVRIX1BfUkFSUCAgICAgIDB4ODAzNQkJLyogUmV2ZXJzZSBBZGRyIFJlcyBwYWNrZXQJKi8KKyNkZWZpbmUgRVRIX1BfQVRBTEsJMHg4MDlCCQkvKiBBcHBsZXRhbGsgRERQCQkqLworI2RlZmluZSBFVEhfUF9BQVJQCTB4ODBGMwkJLyogQXBwbGV0YWxrIEFBUlAJCSovCisjZGVmaW5lIEVUSF9QXzgwMjFRCTB4ODEwMCAgICAgICAgICAvKiA4MDIuMVEgVkxBTiBFeHRlbmRlZCBIZWFkZXIgICovCisjZGVmaW5lIEVUSF9QX0lQWAkweDgxMzcJCS8qIElQWCBvdmVyIERJWAkJCSovCisjZGVmaW5lIEVUSF9QX0lQVjYJMHg4NkRECQkvKiBJUHY2IG92ZXIgYmx1ZWJvb2sJCSovCisjZGVmaW5lIEVUSF9QX1BBVVNFCTB4ODgwOAkJLyogSUVFRSBQYXVzZSBmcmFtZXMuIFNlZSA4MDIuMyAzMUIgKi8KKyNkZWZpbmUgRVRIX1BfU0xPVwkweDg4MDkJCS8qIFNsb3cgUHJvdG9jb2wuIFNlZSA4MDIuM2FkIDQzQiAqLworI2RlZmluZSBFVEhfUF9XQ0NQCTB4ODgzRQkJLyogV2ViLWNhY2hlIGNvb3JkaW5hdGlvbiBwcm90b2NvbAorCQkJCQkgKiBkZWZpbmVkIGluIGRyYWZ0LXdpbHNvbi13cmVjLXdjY3AtdjItMDAudHh0ICovCisjZGVmaW5lIEVUSF9QX01QTFNfVUMJMHg4ODQ3CQkvKiBNUExTIFVuaWNhc3QgdHJhZmZpYwkJKi8KKyNkZWZpbmUgRVRIX1BfTVBMU19NQwkweDg4NDgJCS8qIE1QTFMgTXVsdGljYXN0IHRyYWZmaWMJKi8KKyNkZWZpbmUgRVRIX1BfQVRNTVBPQQkweDg4NGMJCS8qIE11bHRpUHJvdG9jb2wgT3ZlciBBVE0JKi8KKyNkZWZpbmUgRVRIX1BfUFBQX0RJU0MJMHg4ODYzCQkvKiBQUFBvRSBkaXNjb3ZlcnkgbWVzc2FnZXMgICAgICovCisjZGVmaW5lIEVUSF9QX1BQUF9TRVMJMHg4ODY0CQkvKiBQUFBvRSBzZXNzaW9uIG1lc3NhZ2VzCSovCisjZGVmaW5lIEVUSF9QX0xJTktfQ1RMCTB4ODg2YwkJLyogSFBOQSwgd2xhbiBsaW5rIGxvY2FsIHR1bm5lbCAqLworI2RlZmluZSBFVEhfUF9BVE1GQVRFCTB4ODg4NAkJLyogRnJhbWUtYmFzZWQgQVRNIFRyYW5zcG9ydAorCQkJCQkgKiBvdmVyIEV0aGVybmV0CisJCQkJCSAqLworI2RlZmluZSBFVEhfUF9QQUUJMHg4ODhFCQkvKiBQb3J0IEFjY2VzcyBFbnRpdHkgKElFRUUgODAyLjFYKSAqLworI2RlZmluZSBFVEhfUF9BT0UJMHg4OEEyCQkvKiBBVEEgb3ZlciBFdGhlcm5ldAkJKi8KKyNkZWZpbmUgRVRIX1BfODAyMUFECTB4ODhBOCAgICAgICAgICAvKiA4MDIuMWFkIFNlcnZpY2UgVkxBTgkJKi8KKyNkZWZpbmUgRVRIX1BfODAyX0VYMQkweDg4QjUJCS8qIDgwMi4xIExvY2FsIEV4cGVyaW1lbnRhbCAxLiAgKi8KKyNkZWZpbmUgRVRIX1BfVElQQwkweDg4Q0EJCS8qIFRJUEMgCQkJKi8KKyNkZWZpbmUgRVRIX1BfODAyMUFICTB4ODhFNyAgICAgICAgICAvKiA4MDIuMWFoIEJhY2tib25lIFNlcnZpY2UgVGFnICovCisjZGVmaW5lIEVUSF9QX01WUlAJMHg4OEY1ICAgICAgICAgIC8qIDgwMi4xUSBNVlJQICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVRIX1BfMTU4OAkweDg4RjcJCS8qIElFRUUgMTU4OCBUaW1lc3luYyAqLworI2RlZmluZSBFVEhfUF9QUlAJMHg4OEZCCQkvKiBJRUMgNjI0MzktMyBQUlAvSFNSdjAJKi8KKyNkZWZpbmUgRVRIX1BfRkNPRQkweDg5MDYJCS8qIEZpYnJlIENoYW5uZWwgb3ZlciBFdGhlcm5ldCAgKi8KKyNkZWZpbmUgRVRIX1BfVERMUwkweDg5MEQgICAgICAgICAgLyogVERMUyAqLworI2RlZmluZSBFVEhfUF9GSVAJMHg4OTE0CQkvKiBGQ29FIEluaXRpYWxpemF0aW9uIFByb3RvY29sICovCisjZGVmaW5lIEVUSF9QXzgwMjIxCTB4ODkxNwkJLyogSUVFRSA4MDIuMjEgTWVkaWEgSW5kZXBlbmRlbnQgSGFuZG92ZXIgUHJvdG9jb2wgKi8KKyNkZWZpbmUgRVRIX1BfTE9PUEJBQ0sJMHg5MDAwCQkvKiBFdGhlcm5ldCBsb29wYmFjayBwYWNrZXQsIHBlciBJRUVFIDgwMi4zICovCisjZGVmaW5lIEVUSF9QX1FJTlExCTB4OTEwMAkJLyogZGVwcmVjYXRlZCBRaW5RIFZMQU4gWyBOT1QgQU4gT0ZGSUNJQUxMWSBSRUdJU1RFUkVEIElEIF0gKi8KKyNkZWZpbmUgRVRIX1BfUUlOUTIJMHg5MjAwCQkvKiBkZXByZWNhdGVkIFFpblEgVkxBTiBbIE5PVCBBTiBPRkZJQ0lBTExZIFJFR0lTVEVSRUQgSUQgXSAqLworI2RlZmluZSBFVEhfUF9RSU5RMwkweDkzMDAJCS8qIGRlcHJlY2F0ZWQgUWluUSBWTEFOIFsgTk9UIEFOIE9GRklDSUFMTFkgUkVHSVNURVJFRCBJRCBdICovCisjZGVmaW5lIEVUSF9QX0VEU0EJMHhEQURBCQkvKiBFdGhlcnR5cGUgRFNBIFsgTk9UIEFOIE9GRklDSUFMTFkgUkVHSVNURVJFRCBJRCBdICovCisjZGVmaW5lIEVUSF9QX0FGX0lVQ1YgICAweEZCRkIJCS8qIElCTSBhZl9pdWN2IFsgTk9UIEFOIE9GRklDSUFMTFkgUkVHSVNURVJFRCBJRCBdICovCisKKyNkZWZpbmUgRVRIX1BfODAyXzNfTUlOCTB4MDYwMAkJLyogSWYgdGhlIHZhbHVlIGluIHRoZSBldGhlcm5ldCB0eXBlIGlzIGxlc3MgdGhhbiB0aGlzIHZhbHVlCisJCQkJCSAqIHRoZW4gdGhlIGZyYW1lIGlzIEV0aGVybmV0IElJLiBFbHNlIGl0IGlzIDgwMi4zICovCisKKy8qCisgKglOb24gRElYIHR5cGVzLiBXb24ndCBjbGFzaCBmb3IgMTUwMCB0eXBlcy4KKyAqLworCisjZGVmaW5lIEVUSF9QXzgwMl8zCTB4MDAwMQkJLyogRHVtbXkgdHlwZSBmb3IgODAyLjMgZnJhbWVzICAqLworI2RlZmluZSBFVEhfUF9BWDI1CTB4MDAwMgkJLyogRHVtbXkgcHJvdG9jb2wgaWQgZm9yIEFYLjI1ICAqLworI2RlZmluZSBFVEhfUF9BTEwJMHgwMDAzCQkvKiBFdmVyeSBwYWNrZXQgKGJlIGNhcmVmdWwhISEpICovCisjZGVmaW5lIEVUSF9QXzgwMl8yCTB4MDAwNAkJLyogODAyLjIgZnJhbWVzIAkJKi8KKyNkZWZpbmUgRVRIX1BfU05BUAkweDAwMDUJCS8qIEludGVybmFsIG9ubHkJCSovCisjZGVmaW5lIEVUSF9QX0REQ01QICAgICAweDAwMDYgICAgICAgICAgLyogREVDIEREQ01QOiBJbnRlcm5hbCBvbmx5ICAgICAqLworI2RlZmluZSBFVEhfUF9XQU5fUFBQICAgMHgwMDA3ICAgICAgICAgIC8qIER1bW15IHR5cGUgZm9yIFdBTiBQUFAgZnJhbWVzKi8KKyNkZWZpbmUgRVRIX1BfUFBQX01QICAgIDB4MDAwOCAgICAgICAgICAvKiBEdW1teSB0eXBlIGZvciBQUFAgTVAgZnJhbWVzICovCisjZGVmaW5lIEVUSF9QX0xPQ0FMVEFMSyAweDAwMDkJCS8qIExvY2FsdGFsayBwc2V1ZG8gdHlwZSAJKi8KKyNkZWZpbmUgRVRIX1BfQ0FOCTB4MDAwQwkJLyogQ0FOOiBDb250cm9sbGVyIEFyZWEgTmV0d29yayAqLworI2RlZmluZSBFVEhfUF9DQU5GRAkweDAwMEQJCS8qIENBTkZEOiBDQU4gZmxleGlibGUgZGF0YSByYXRlKi8KKyNkZWZpbmUgRVRIX1BfUFBQVEFMSwkweDAwMTAJCS8qIER1bW15IHR5cGUgZm9yIEF0YWxrIG92ZXIgUFBQKi8KKyNkZWZpbmUgRVRIX1BfVFJfODAyXzIJMHgwMDExCQkvKiA4MDIuMiBmcmFtZXMgCQkqLworI2RlZmluZSBFVEhfUF9NT0JJVEVYCTB4MDAxNQkJLyogTW9iaXRleCAoa2F6QGNhZmUubmV0KQkqLworI2RlZmluZSBFVEhfUF9DT05UUk9MCTB4MDAxNgkJLyogQ2FyZCBzcGVjaWZpYyBjb250cm9sIGZyYW1lcyAqLworI2RlZmluZSBFVEhfUF9JUkRBCTB4MDAxNwkJLyogTGludXgtSXJEQQkJCSovCisjZGVmaW5lIEVUSF9QX0VDT05FVAkweDAwMTgJCS8qIEFjb3JuIEVjb25ldAkJCSovCisjZGVmaW5lIEVUSF9QX0hETEMJMHgwMDE5CQkvKiBIRExDIGZyYW1lcwkJCSovCisjZGVmaW5lIEVUSF9QX0FSQ05FVAkweDAwMUEJCS8qIDFBIGZvciBBcmNOZXQgOi0pICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVRIX1BfRFNBCTB4MDAxQgkJLyogRGlzdHJpYnV0ZWQgU3dpdGNoIEFyY2guCSovCisjZGVmaW5lIEVUSF9QX1RSQUlMRVIJMHgwMDFDCQkvKiBUcmFpbGVyIHN3aXRjaCB0YWdnaW5nCSovCisjZGVmaW5lIEVUSF9QX1BIT05FVAkweDAwRjUJCS8qIE5va2lhIFBob25ldCBmcmFtZXMgICAgICAgICAgKi8KKyNkZWZpbmUgRVRIX1BfSUVFRTgwMjE1NCAweDAwRjYJCS8qIElFRUU4MDIuMTUuNCBmcmFtZQkJKi8KKyNkZWZpbmUgRVRIX1BfQ0FJRgkweDAwRjcJCS8qIFNULUVyaWNzc29uIENBSUYgcHJvdG9jb2wJKi8KKyNkZWZpbmUgRVRIX1BfWERTQQkweDAwRjgJCS8qIE11bHRpcGxleGVkIERTQSBwcm90b2NvbAkqLworCisvKgorICoJVGhpcyBpcyBhbiBFdGhlcm5ldCBmcmFtZSBoZWFkZXIuCisgKi8KKworc3RydWN0IGV0aGhkciB7CisJdW5zaWduZWQgY2hhcgloX2Rlc3RbRVRIX0FMRU5dOwkvKiBkZXN0aW5hdGlvbiBldGggYWRkcgkqLworCXVuc2lnbmVkIGNoYXIJaF9zb3VyY2VbRVRIX0FMRU5dOwkvKiBzb3VyY2UgZXRoZXIgYWRkcgkqLworCV9fYmUxNgkJaF9wcm90bzsJCS8qIHBhY2tldCB0eXBlIElEIGZpZWxkCSovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKyNlbmRpZiAvKiBfTElOVVhfSUZfRVRIRVJfSCAqLwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9pZl9saW5rLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L2lmX2xpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTFmMmM5Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9pZl9saW5rLmgKQEAgLTAsMCArMSw3MjggQEAKKyNpZm5kZWYgX0xJTlVYX0lGX0xJTktfSAorI2RlZmluZSBfTElOVVhfSUZfTElOS19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKworLyogVGhpcyBzdHJ1Y3Qgc2hvdWxkIGJlIGluIHN5bmMgd2l0aCBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKi8KK3N0cnVjdCBydG5sX2xpbmtfc3RhdHMgeworCV9fdTMyCXJ4X3BhY2tldHM7CQkvKiB0b3RhbCBwYWNrZXRzIHJlY2VpdmVkCSovCisJX191MzIJdHhfcGFja2V0czsJCS8qIHRvdGFsIHBhY2tldHMgdHJhbnNtaXR0ZWQJKi8KKwlfX3UzMglyeF9ieXRlczsJCS8qIHRvdGFsIGJ5dGVzIHJlY2VpdmVkIAkqLworCV9fdTMyCXR4X2J5dGVzOwkJLyogdG90YWwgYnl0ZXMgdHJhbnNtaXR0ZWQJKi8KKwlfX3UzMglyeF9lcnJvcnM7CQkvKiBiYWQgcGFja2V0cyByZWNlaXZlZAkJKi8KKwlfX3UzMgl0eF9lcnJvcnM7CQkvKiBwYWNrZXQgdHJhbnNtaXQgcHJvYmxlbXMJKi8KKwlfX3UzMglyeF9kcm9wcGVkOwkJLyogbm8gc3BhY2UgaW4gbGludXggYnVmZmVycwkqLworCV9fdTMyCXR4X2Ryb3BwZWQ7CQkvKiBubyBzcGFjZSBhdmFpbGFibGUgaW4gbGludXgJKi8KKwlfX3UzMgltdWx0aWNhc3Q7CQkvKiBtdWx0aWNhc3QgcGFja2V0cyByZWNlaXZlZAkqLworCV9fdTMyCWNvbGxpc2lvbnM7CisKKwkvKiBkZXRhaWxlZCByeF9lcnJvcnM6ICovCisJX191MzIJcnhfbGVuZ3RoX2Vycm9yczsKKwlfX3UzMglyeF9vdmVyX2Vycm9yczsJCS8qIHJlY2VpdmVyIHJpbmcgYnVmZiBvdmVyZmxvdwkqLworCV9fdTMyCXJ4X2NyY19lcnJvcnM7CQkvKiByZWN2ZWQgcGt0IHdpdGggY3JjIGVycm9yCSovCisJX191MzIJcnhfZnJhbWVfZXJyb3JzOwkvKiByZWN2J2QgZnJhbWUgYWxpZ25tZW50IGVycm9yICovCisJX191MzIJcnhfZmlmb19lcnJvcnM7CQkvKiByZWN2J3IgZmlmbyBvdmVycnVuCQkqLworCV9fdTMyCXJ4X21pc3NlZF9lcnJvcnM7CS8qIHJlY2VpdmVyIG1pc3NlZCBwYWNrZXQJKi8KKworCS8qIGRldGFpbGVkIHR4X2Vycm9ycyAqLworCV9fdTMyCXR4X2Fib3J0ZWRfZXJyb3JzOworCV9fdTMyCXR4X2NhcnJpZXJfZXJyb3JzOworCV9fdTMyCXR4X2ZpZm9fZXJyb3JzOworCV9fdTMyCXR4X2hlYXJ0YmVhdF9lcnJvcnM7CisJX191MzIJdHhfd2luZG93X2Vycm9yczsKKworCS8qIGZvciBjc2xpcCBldGMgKi8KKwlfX3UzMglyeF9jb21wcmVzc2VkOworCV9fdTMyCXR4X2NvbXByZXNzZWQ7Cit9OworCisvKiBUaGUgbWFpbiBkZXZpY2Ugc3RhdGlzdGljcyBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCB7CisJX191NjQJcnhfcGFja2V0czsJCS8qIHRvdGFsIHBhY2tldHMgcmVjZWl2ZWQJKi8KKwlfX3U2NAl0eF9wYWNrZXRzOwkJLyogdG90YWwgcGFja2V0cyB0cmFuc21pdHRlZAkqLworCV9fdTY0CXJ4X2J5dGVzOwkJLyogdG90YWwgYnl0ZXMgcmVjZWl2ZWQgCSovCisJX191NjQJdHhfYnl0ZXM7CQkvKiB0b3RhbCBieXRlcyB0cmFuc21pdHRlZAkqLworCV9fdTY0CXJ4X2Vycm9yczsJCS8qIGJhZCBwYWNrZXRzIHJlY2VpdmVkCQkqLworCV9fdTY0CXR4X2Vycm9yczsJCS8qIHBhY2tldCB0cmFuc21pdCBwcm9ibGVtcwkqLworCV9fdTY0CXJ4X2Ryb3BwZWQ7CQkvKiBubyBzcGFjZSBpbiBsaW51eCBidWZmZXJzCSovCisJX191NjQJdHhfZHJvcHBlZDsJCS8qIG5vIHNwYWNlIGF2YWlsYWJsZSBpbiBsaW51eAkqLworCV9fdTY0CW11bHRpY2FzdDsJCS8qIG11bHRpY2FzdCBwYWNrZXRzIHJlY2VpdmVkCSovCisJX191NjQJY29sbGlzaW9uczsKKworCS8qIGRldGFpbGVkIHJ4X2Vycm9yczogKi8KKwlfX3U2NAlyeF9sZW5ndGhfZXJyb3JzOworCV9fdTY0CXJ4X292ZXJfZXJyb3JzOwkJLyogcmVjZWl2ZXIgcmluZyBidWZmIG92ZXJmbG93CSovCisJX191NjQJcnhfY3JjX2Vycm9yczsJCS8qIHJlY3ZlZCBwa3Qgd2l0aCBjcmMgZXJyb3IJKi8KKwlfX3U2NAlyeF9mcmFtZV9lcnJvcnM7CS8qIHJlY3YnZCBmcmFtZSBhbGlnbm1lbnQgZXJyb3IgKi8KKwlfX3U2NAlyeF9maWZvX2Vycm9yczsJCS8qIHJlY3YnciBmaWZvIG92ZXJydW4JCSovCisJX191NjQJcnhfbWlzc2VkX2Vycm9yczsJLyogcmVjZWl2ZXIgbWlzc2VkIHBhY2tldAkqLworCisJLyogZGV0YWlsZWQgdHhfZXJyb3JzICovCisJX191NjQJdHhfYWJvcnRlZF9lcnJvcnM7CisJX191NjQJdHhfY2Fycmllcl9lcnJvcnM7CisJX191NjQJdHhfZmlmb19lcnJvcnM7CisJX191NjQJdHhfaGVhcnRiZWF0X2Vycm9yczsKKwlfX3U2NAl0eF93aW5kb3dfZXJyb3JzOworCisJLyogZm9yIGNzbGlwIGV0YyAqLworCV9fdTY0CXJ4X2NvbXByZXNzZWQ7CisJX191NjQJdHhfY29tcHJlc3NlZDsKK307CisKKy8qIFRoZSBzdHJ1Y3Qgc2hvdWxkIGJlIGluIHN5bmMgd2l0aCBzdHJ1Y3QgaWZtYXAgKi8KK3N0cnVjdCBydG5sX2xpbmtfaWZtYXAgeworCV9fdTY0CW1lbV9zdGFydDsKKwlfX3U2NAltZW1fZW5kOworCV9fdTY0CWJhc2VfYWRkcjsKKwlfX3UxNglpcnE7CisJX191OAlkbWE7CisJX191OAlwb3J0OworfTsKKworLyoKKyAqIElGTEFfQUZfU1BFQworICogICBDb250YWlucyBuZXN0ZWQgYXR0cmlidXRlcyBmb3IgYWRkcmVzcyBmYW1pbHkgc3BlY2lmaWMgYXR0cmlidXRlcy4KKyAqICAgRWFjaCBhZGRyZXNzIGZhbWlseSBtYXkgY3JlYXRlIGEgYXR0cmlidXRlIHdpdGggdGhlIGFkZHJlc3MgZmFtaWx5CisgKiAgIG51bWJlciBhcyB0eXBlIGFuZCBjcmVhdGUgaXRzIG93biBhdHRyaWJ1dGUgc3RydWN0dXJlIGluIGl0LgorICoKKyAqICAgRXhhbXBsZToKKyAqICAgW0lGTEFfQUZfU1BFQ10gPSB7CisgKiAgICAgICBbQUZfSU5FVF0gPSB7CisgKiAgICAgICAgICAgW0lGTEFfSU5FVF9DT05GXSA9IC4uLiwKKyAqICAgICAgIH0sCisgKiAgICAgICBbQUZfSU5FVDZdID0geworICogICAgICAgICAgIFtJRkxBX0lORVQ2X0ZMQUdTXSA9IC4uLiwKKyAqICAgICAgICAgICBbSUZMQV9JTkVUNl9DT05GXSA9IC4uLiwKKyAqICAgICAgIH0KKyAqICAgfQorICovCisKK2VudW0geworCUlGTEFfVU5TUEVDLAorCUlGTEFfQUREUkVTUywKKwlJRkxBX0JST0FEQ0FTVCwKKwlJRkxBX0lGTkFNRSwKKwlJRkxBX01UVSwKKwlJRkxBX0xJTkssCisJSUZMQV9RRElTQywKKwlJRkxBX1NUQVRTLAorCUlGTEFfQ09TVCwKKyNkZWZpbmUgSUZMQV9DT1NUIElGTEFfQ09TVAorCUlGTEFfUFJJT1JJVFksCisjZGVmaW5lIElGTEFfUFJJT1JJVFkgSUZMQV9QUklPUklUWQorCUlGTEFfTUFTVEVSLAorI2RlZmluZSBJRkxBX01BU1RFUiBJRkxBX01BU1RFUgorCUlGTEFfV0lSRUxFU1MsCQkvKiBXaXJlbGVzcyBFeHRlbnNpb24gZXZlbnQgLSBzZWUgd2lyZWxlc3MuaCAqLworI2RlZmluZSBJRkxBX1dJUkVMRVNTIElGTEFfV0lSRUxFU1MKKwlJRkxBX1BST1RJTkZPLAkJLyogUHJvdG9jb2wgc3BlY2lmaWMgaW5mb3JtYXRpb24gZm9yIGEgbGluayAqLworI2RlZmluZSBJRkxBX1BST1RJTkZPIElGTEFfUFJPVElORk8KKwlJRkxBX1RYUUxFTiwKKyNkZWZpbmUgSUZMQV9UWFFMRU4gSUZMQV9UWFFMRU4KKwlJRkxBX01BUCwKKyNkZWZpbmUgSUZMQV9NQVAgSUZMQV9NQVAKKwlJRkxBX1dFSUdIVCwKKyNkZWZpbmUgSUZMQV9XRUlHSFQgSUZMQV9XRUlHSFQKKwlJRkxBX09QRVJTVEFURSwKKwlJRkxBX0xJTktNT0RFLAorCUlGTEFfTElOS0lORk8sCisjZGVmaW5lIElGTEFfTElOS0lORk8gSUZMQV9MSU5LSU5GTworCUlGTEFfTkVUX05TX1BJRCwKKwlJRkxBX0lGQUxJQVMsCisJSUZMQV9OVU1fVkYsCQkvKiBOdW1iZXIgb2YgVkZzIGlmIGRldmljZSBpcyBTUi1JT1YgUEYgKi8KKwlJRkxBX1ZGSU5GT19MSVNULAorCUlGTEFfU1RBVFM2NCwKKwlJRkxBX1ZGX1BPUlRTLAorCUlGTEFfUE9SVF9TRUxGLAorCUlGTEFfQUZfU1BFQywKKwlJRkxBX0dST1VQLAkJLyogR3JvdXAgdGhlIGRldmljZSBiZWxvbmdzIHRvICovCisJSUZMQV9ORVRfTlNfRkQsCisJSUZMQV9FWFRfTUFTSywJCS8qIEV4dGVuZGVkIGluZm8gbWFzaywgVkZzLCBldGMgKi8KKwlJRkxBX1BST01JU0NVSVRZLAkvKiBQcm9taXNjdWl0eSBjb3VudDogPiAwIG1lYW5zIGFjdHMgUFJPTUlTQyAqLworI2RlZmluZSBJRkxBX1BST01JU0NVSVRZIElGTEFfUFJPTUlTQ1VJVFkKKwlJRkxBX05VTV9UWF9RVUVVRVMsCisJSUZMQV9OVU1fUlhfUVVFVUVTLAorCUlGTEFfQ0FSUklFUiwKKwlJRkxBX1BIWVNfUE9SVF9JRCwKKwlJRkxBX0NBUlJJRVJfQ0hBTkdFUywKKwlJRkxBX1BIWVNfU1dJVENIX0lELAorCUlGTEFfTElOS19ORVROU0lELAorCUlGTEFfUEhZU19QT1JUX05BTUUsCisJSUZMQV9QUk9UT19ET1dOLAorCV9fSUZMQV9NQVgKK307CisKKworI2RlZmluZSBJRkxBX01BWCAoX19JRkxBX01BWCAtIDEpCisKKy8qIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciB1c2Vyc3BhY2UgKi8KKyNkZWZpbmUgSUZMQV9SVEEocikgICgoc3RydWN0IHJ0YXR0ciopKCgoY2hhciopKHIpKSArIE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgaWZpbmZvbXNnKSkpKQorI2RlZmluZSBJRkxBX1BBWUxPQUQobikgTkxNU0dfUEFZTE9BRChuLHNpemVvZihzdHJ1Y3QgaWZpbmZvbXNnKSkKKworZW51bSB7CisJSUZMQV9JTkVUX1VOU1BFQywKKwlJRkxBX0lORVRfQ09ORiwKKwlfX0lGTEFfSU5FVF9NQVgsCit9OworCisjZGVmaW5lIElGTEFfSU5FVF9NQVggKF9fSUZMQV9JTkVUX01BWCAtIDEpCisKKy8qIGlmaV9mbGFncy4KKworICAgSUZGXyogZmxhZ3MuCisKKyAgIFRoZSBvbmx5IGNoYW5nZSBpczoKKyAgIElGRl9MT09QQkFDSywgSUZGX0JST0FEQ0FTVCBhbmQgSUZGX1BPSU5UT1BPSU5UIGFyZQorICAgbW9yZSBub3QgY2hhbmdlYWJsZSBieSB1c2VyLiBUaGV5IGRlc2NyaWJlIGxpbmsgbWVkaWEKKyAgIGNoYXJhY3RlcmlzdGljcyBhbmQgc2V0IGJ5IGRldmljZSBkcml2ZXIuCisKKyAgIENvbW1lbnRzOgorICAgLSBDb21iaW5hdGlvbiBJRkZfQlJPQURDQVNUfElGRl9QT0lOVE9QT0lOVCBpcyBpbnZhbGlkCisgICAtIElmIG5laXRoZXIgb2YgdGhlc2UgdGhyZWUgZmxhZ3MgYXJlIHNldDsKKyAgICAgdGhlIGludGVyZmFjZSBpcyBOQk1BLgorCisgICAtIElGRl9NVUxUSUNBU1QgZG9lcyBub3QgbWVhbiBhbnl0aGluZyBzcGVjaWFsOgorICAgbXVsdGljYXN0cyBjYW4gYmUgdXNlZCBvbiBhbGwgbm90LU5CTUEgbGlua3MuCisgICBJRkZfTVVMVElDQVNUIG1lYW5zIHRoYXQgdGhpcyBtZWRpYSB1c2VzIHNwZWNpYWwgZW5jYXBzdWxhdGlvbgorICAgZm9yIG11bHRpY2FzdCBmcmFtZXMuIEFwcGFyZW50bHksIGFsbCBJRkZfUE9JTlRPUE9JTlQgYW5kCisgICBJRkZfQlJPQURDQVNUIGRldmljZXMgYXJlIGFibGUgdG8gdXNlIG11bHRpY2FzdHMgdG9vLgorICovCisKKy8qIElGTEFfTElOSy4KKyAgIEZvciB1c3VhbCBkZXZpY2VzIGl0IGlzIGVxdWFsIGlmaV9pbmRleC4KKyAgIElmIGl0IGlzIGEgInZpcnR1YWwgaW50ZXJmYWNlIiAoZi5lLiB0dW5uZWwpLCBpZmlfbGluaworICAgY2FuIHBvaW50IHRvIHJlYWwgcGh5c2ljYWwgaW50ZXJmYWNlIChmLmUuIGZvciBiYW5kd2lkdGggY2FsY3VsYXRpb25zKSwKKyAgIG9yIG1heWJlIDAsIHdoYXQgbWVhbnMsIHRoYXQgcmVhbCBtZWRpYSBpcyB1bmtub3duICh1c3VhbAorICAgZm9yIElQSVAgdHVubmVscywgd2hlbiByb3V0ZSB0byBlbmRwb2ludCBpcyBhbGxvd2VkIHRvIGNoYW5nZSkKKyAqLworCisvKiBTdWJ0eXBlIGF0dHJpYnV0ZXMgZm9yIElGTEFfUFJPVElORk8gKi8KK2VudW0geworCUlGTEFfSU5FVDZfVU5TUEVDLAorCUlGTEFfSU5FVDZfRkxBR1MsCS8qIGxpbmsgZmxhZ3MJCQkqLworCUlGTEFfSU5FVDZfQ09ORiwJLyogc3lzY3RsIHBhcmFtZXRlcnMJCSovCisJSUZMQV9JTkVUNl9TVEFUUywJLyogc3RhdGlzdGljcwkJCSovCisJSUZMQV9JTkVUNl9NQ0FTVCwJLyogTUMgdGhpbmdzLiBXaGF0IG9mIHRoZW0/CSovCisJSUZMQV9JTkVUNl9DQUNIRUlORk8sCS8qIHRpbWUgdmFsdWVzIGFuZCBtYXggcmVhc20gc2l6ZSAqLworCUlGTEFfSU5FVDZfSUNNUDZTVEFUUywJLyogc3RhdGlzdGljcyAoaWNtcHY2KQkJKi8KKwlJRkxBX0lORVQ2X1RPS0VOLAkvKiBkZXZpY2UgdG9rZW4JCQkqLworCUlGTEFfSU5FVDZfQUREUl9HRU5fTU9ERSwgLyogaW1wbGljaXQgYWRkcmVzcyBnZW5lcmF0b3IgbW9kZSAqLworCV9fSUZMQV9JTkVUNl9NQVgKK307CisKKyNkZWZpbmUgSUZMQV9JTkVUNl9NQVgJKF9fSUZMQV9JTkVUNl9NQVggLSAxKQorCitlbnVtIGluNl9hZGRyX2dlbl9tb2RlIHsKKwlJTjZfQUREUl9HRU5fTU9ERV9FVUk2NCwKKwlJTjZfQUREUl9HRU5fTU9ERV9OT05FLAorCUlONl9BRERSX0dFTl9NT0RFX1NUQUJMRV9QUklWQUNZLAorCUlONl9BRERSX0dFTl9NT0RFX1JBTkRPTSwKK307CisKKy8qIEJyaWRnZSBzZWN0aW9uICovCisKK2VudW0geworCUlGTEFfQlJfVU5TUEVDLAorCUlGTEFfQlJfRk9SV0FSRF9ERUxBWSwKKwlJRkxBX0JSX0hFTExPX1RJTUUsCisJSUZMQV9CUl9NQVhfQUdFLAorCUlGTEFfQlJfQUdFSU5HX1RJTUUsCisJSUZMQV9CUl9TVFBfU1RBVEUsCisJSUZMQV9CUl9QUklPUklUWSwKKwlJRkxBX0JSX1ZMQU5fRklMVEVSSU5HLAorCUlGTEFfQlJfVkxBTl9QUk9UT0NPTCwKKwlJRkxBX0JSX0dST1VQX0ZXRF9NQVNLLAorCUlGTEFfQlJfUk9PVF9JRCwKKwlJRkxBX0JSX0JSSURHRV9JRCwKKwlJRkxBX0JSX1JPT1RfUE9SVCwKKwlJRkxBX0JSX1JPT1RfUEFUSF9DT1NULAorCUlGTEFfQlJfVE9QT0xPR1lfQ0hBTkdFLAorCUlGTEFfQlJfVE9QT0xPR1lfQ0hBTkdFX0RFVEVDVEVELAorCUlGTEFfQlJfSEVMTE9fVElNRVIsCisJSUZMQV9CUl9UQ05fVElNRVIsCisJSUZMQV9CUl9UT1BPTE9HWV9DSEFOR0VfVElNRVIsCisJSUZMQV9CUl9HQ19USU1FUiwKKwlJRkxBX0JSX0dST1VQX0FERFIsCisJSUZMQV9CUl9GREJfRkxVU0gsCisJSUZMQV9CUl9NQ0FTVF9ST1VURVIsCisJSUZMQV9CUl9NQ0FTVF9TTk9PUElORywKKwlJRkxBX0JSX01DQVNUX1FVRVJZX1VTRV9JRkFERFIsCisJSUZMQV9CUl9NQ0FTVF9RVUVSSUVSLAorCUlGTEFfQlJfTUNBU1RfSEFTSF9FTEFTVElDSVRZLAorCUlGTEFfQlJfTUNBU1RfSEFTSF9NQVgsCisJSUZMQV9CUl9NQ0FTVF9MQVNUX01FTUJFUl9DTlQsCisJSUZMQV9CUl9NQ0FTVF9TVEFSVFVQX1FVRVJZX0NOVCwKKwlJRkxBX0JSX01DQVNUX0xBU1RfTUVNQkVSX0lOVFZMLAorCUlGTEFfQlJfTUNBU1RfTUVNQkVSU0hJUF9JTlRWTCwKKwlJRkxBX0JSX01DQVNUX1FVRVJJRVJfSU5UVkwsCisJSUZMQV9CUl9NQ0FTVF9RVUVSWV9JTlRWTCwKKwlJRkxBX0JSX01DQVNUX1FVRVJZX1JFU1BPTlNFX0lOVFZMLAorCUlGTEFfQlJfTUNBU1RfU1RBUlRVUF9RVUVSWV9JTlRWTCwKKwlJRkxBX0JSX05GX0NBTExfSVBUQUJMRVMsCisJSUZMQV9CUl9ORl9DQUxMX0lQNlRBQkxFUywKKwlJRkxBX0JSX05GX0NBTExfQVJQVEFCTEVTLAorCUlGTEFfQlJfVkxBTl9ERUZBVUxUX1BWSUQsCisJX19JRkxBX0JSX01BWCwKK307CisKKyNkZWZpbmUgSUZMQV9CUl9NQVgJKF9fSUZMQV9CUl9NQVggLSAxKQorCitzdHJ1Y3QgaWZsYV9icmlkZ2VfaWQgeworCV9fdTgJcHJpb1syXTsKKwlfX3U4CWFkZHJbNl07IC8qIEVUSF9BTEVOICovCit9OworCitlbnVtIHsKKwlCUklER0VfTU9ERV9VTlNQRUMsCisJQlJJREdFX01PREVfSEFJUlBJTiwKK307CisKK2VudW0geworCUlGTEFfQlJQT1JUX1VOU1BFQywKKwlJRkxBX0JSUE9SVF9TVEFURSwJLyogU3Bhbm5pbmcgdHJlZSBzdGF0ZSAgICAgKi8KKwlJRkxBX0JSUE9SVF9QUklPUklUWSwJLyogIiAgICAgICAgICAgICBwcmlvcml0eSAgKi8KKwlJRkxBX0JSUE9SVF9DT1NULAkvKiAiICAgICAgICAgICAgIGNvc3QgICAgICAqLworCUlGTEFfQlJQT1JUX01PREUsCS8qIG1vZGUgKGhhaXJwaW4pICAgICAgICAgICovCisJSUZMQV9CUlBPUlRfR1VBUkQsCS8qIGJwZHUgZ3VhcmQgICAgICAgICAgICAgICovCisJSUZMQV9CUlBPUlRfUFJPVEVDVCwJLyogcm9vdCBwb3J0IHByb3RlY3Rpb24gICAgKi8KKwlJRkxBX0JSUE9SVF9GQVNUX0xFQVZFLAkvKiBtdWx0aWNhc3QgZmFzdCBsZWF2ZSAgICAqLworCUlGTEFfQlJQT1JUX0xFQVJOSU5HLAkvKiBtYWMgbGVhcm5pbmcgKi8KKwlJRkxBX0JSUE9SVF9VTklDQVNUX0ZMT09ELCAvKiBmbG9vZCB1bmljYXN0IHRyYWZmaWMgKi8KKwlJRkxBX0JSUE9SVF9QUk9YWUFSUCwJLyogcHJveHkgQVJQICovCisJSUZMQV9CUlBPUlRfTEVBUk5JTkdfU1lOQywgLyogbWFjIGxlYXJuaW5nIHN5bmMgZnJvbSBkZXZpY2UgKi8KKwlJRkxBX0JSUE9SVF9QUk9YWUFSUF9XSUZJLCAvKiBwcm94eSBBUlAgZm9yIFdpLUZpICovCisJSUZMQV9CUlBPUlRfUk9PVF9JRCwJLyogZGVzaWduYXRlZCByb290ICovCisJSUZMQV9CUlBPUlRfQlJJREdFX0lELAkvKiBkZXNpZ25hdGVkIGJyaWRnZSAqLworCUlGTEFfQlJQT1JUX0RFU0lHTkFURURfUE9SVCwKKwlJRkxBX0JSUE9SVF9ERVNJR05BVEVEX0NPU1QsCisJSUZMQV9CUlBPUlRfSUQsCisJSUZMQV9CUlBPUlRfTk8sCisJSUZMQV9CUlBPUlRfVE9QT0xPR1lfQ0hBTkdFX0FDSywKKwlJRkxBX0JSUE9SVF9DT05GSUdfUEVORElORywKKwlJRkxBX0JSUE9SVF9NRVNTQUdFX0FHRV9USU1FUiwKKwlJRkxBX0JSUE9SVF9GT1JXQVJEX0RFTEFZX1RJTUVSLAorCUlGTEFfQlJQT1JUX0hPTERfVElNRVIsCisJSUZMQV9CUlBPUlRfRkxVU0gsCisJSUZMQV9CUlBPUlRfTVVMVElDQVNUX1JPVVRFUiwKKwlfX0lGTEFfQlJQT1JUX01BWAorfTsKKyNkZWZpbmUgSUZMQV9CUlBPUlRfTUFYIChfX0lGTEFfQlJQT1JUX01BWCAtIDEpCisKK3N0cnVjdCBpZmxhX2NhY2hlaW5mbyB7CisJX191MzIJbWF4X3JlYXNtX2xlbjsKKwlfX3UzMgl0c3RhbXA7CQkvKiBpcHY2SW50ZXJmYWNlVGFibGUgdXBkYXRlZCB0aW1lc3RhbXAgKi8KKwlfX3UzMglyZWFjaGFibGVfdGltZTsKKwlfX3UzMglyZXRyYW5zX3RpbWU7Cit9OworCitlbnVtIHsKKwlJRkxBX0lORk9fVU5TUEVDLAorCUlGTEFfSU5GT19LSU5ELAorCUlGTEFfSU5GT19EQVRBLAorCUlGTEFfSU5GT19YU1RBVFMsCisJSUZMQV9JTkZPX1NMQVZFX0tJTkQsCisJSUZMQV9JTkZPX1NMQVZFX0RBVEEsCisJX19JRkxBX0lORk9fTUFYLAorfTsKKworI2RlZmluZSBJRkxBX0lORk9fTUFYCShfX0lGTEFfSU5GT19NQVggLSAxKQorCisvKiBWTEFOIHNlY3Rpb24gKi8KKworZW51bSB7CisJSUZMQV9WTEFOX1VOU1BFQywKKwlJRkxBX1ZMQU5fSUQsCisJSUZMQV9WTEFOX0ZMQUdTLAorCUlGTEFfVkxBTl9FR1JFU1NfUU9TLAorCUlGTEFfVkxBTl9JTkdSRVNTX1FPUywKKwlJRkxBX1ZMQU5fUFJPVE9DT0wsCisJX19JRkxBX1ZMQU5fTUFYLAorfTsKKworI2RlZmluZSBJRkxBX1ZMQU5fTUFYCShfX0lGTEFfVkxBTl9NQVggLSAxKQorCitzdHJ1Y3QgaWZsYV92bGFuX2ZsYWdzIHsKKwlfX3UzMglmbGFnczsKKwlfX3UzMgltYXNrOworfTsKKworZW51bSB7CisJSUZMQV9WTEFOX1FPU19VTlNQRUMsCisJSUZMQV9WTEFOX1FPU19NQVBQSU5HLAorCV9fSUZMQV9WTEFOX1FPU19NQVgKK307CisKKyNkZWZpbmUgSUZMQV9WTEFOX1FPU19NQVgJKF9fSUZMQV9WTEFOX1FPU19NQVggLSAxKQorCitzdHJ1Y3QgaWZsYV92bGFuX3Fvc19tYXBwaW5nIHsKKwlfX3UzMiBmcm9tOworCV9fdTMyIHRvOworfTsKKworLyogTUFDVkxBTiBzZWN0aW9uICovCitlbnVtIHsKKwlJRkxBX01BQ1ZMQU5fVU5TUEVDLAorCUlGTEFfTUFDVkxBTl9NT0RFLAorCUlGTEFfTUFDVkxBTl9GTEFHUywKKwlJRkxBX01BQ1ZMQU5fTUFDQUREUl9NT0RFLAorCUlGTEFfTUFDVkxBTl9NQUNBRERSLAorCUlGTEFfTUFDVkxBTl9NQUNBRERSX0RBVEEsCisJSUZMQV9NQUNWTEFOX01BQ0FERFJfQ09VTlQsCisJX19JRkxBX01BQ1ZMQU5fTUFYLAorfTsKKworI2RlZmluZSBJRkxBX01BQ1ZMQU5fTUFYIChfX0lGTEFfTUFDVkxBTl9NQVggLSAxKQorCitlbnVtIG1hY3ZsYW5fbW9kZSB7CisJTUFDVkxBTl9NT0RFX1BSSVZBVEUgPSAxLCAvKiBkb24ndCB0YWxrIHRvIG90aGVyIG1hY3ZsYW5zICovCisJTUFDVkxBTl9NT0RFX1ZFUEEgICAgPSAyLCAvKiB0YWxrIHRvIG90aGVyIHBvcnRzIHRocm91Z2ggZXh0IGJyaWRnZSAqLworCU1BQ1ZMQU5fTU9ERV9CUklER0UgID0gNCwgLyogdGFsayB0byBicmlkZ2UgcG9ydHMgZGlyZWN0bHkgKi8KKwlNQUNWTEFOX01PREVfUEFTU1RIUlUgPSA4LC8qIHRha2Ugb3ZlciB0aGUgdW5kZXJseWluZyBkZXZpY2UgKi8KKwlNQUNWTEFOX01PREVfU09VUkNFICA9IDE2LC8qIHVzZSBzb3VyY2UgTUFDIGFkZHJlc3MgbGlzdCB0byBhc3NpZ24gKi8KK307CisKK2VudW0gbWFjdmxhbl9tYWNhZGRyX21vZGUgeworCU1BQ1ZMQU5fTUFDQUREUl9BREQsCisJTUFDVkxBTl9NQUNBRERSX0RFTCwKKwlNQUNWTEFOX01BQ0FERFJfRkxVU0gsCisJTUFDVkxBTl9NQUNBRERSX1NFVCwKK307CisKKyNkZWZpbmUgTUFDVkxBTl9GTEFHX05PUFJPTUlTQwkxCisKKy8qIFZSRiBzZWN0aW9uICovCitlbnVtIHsKKwlJRkxBX1ZSRl9VTlNQRUMsCisJSUZMQV9WUkZfVEFCTEUsCisJX19JRkxBX1ZSRl9NQVgKK307CisKKyNkZWZpbmUgSUZMQV9WUkZfTUFYIChfX0lGTEFfVlJGX01BWCAtIDEpCisKKy8qIElQVkxBTiBzZWN0aW9uICovCitlbnVtIHsKKwlJRkxBX0lQVkxBTl9VTlNQRUMsCisJSUZMQV9JUFZMQU5fTU9ERSwKKwlfX0lGTEFfSVBWTEFOX01BWAorfTsKKworI2RlZmluZSBJRkxBX0lQVkxBTl9NQVggKF9fSUZMQV9JUFZMQU5fTUFYIC0gMSkKKworZW51bSBpcHZsYW5fbW9kZSB7CisJSVBWTEFOX01PREVfTDIgPSAwLAorCUlQVkxBTl9NT0RFX0wzLAorCUlQVkxBTl9NT0RFX01BWAorfTsKKworLyogVlhMQU4gc2VjdGlvbiAqLworZW51bSB7CisJSUZMQV9WWExBTl9VTlNQRUMsCisJSUZMQV9WWExBTl9JRCwKKwlJRkxBX1ZYTEFOX0dST1VQLAkvKiBncm91cCBvciByZW1vdGUgYWRkcmVzcyAqLworCUlGTEFfVlhMQU5fTElOSywKKwlJRkxBX1ZYTEFOX0xPQ0FMLAorCUlGTEFfVlhMQU5fVFRMLAorCUlGTEFfVlhMQU5fVE9TLAorCUlGTEFfVlhMQU5fTEVBUk5JTkcsCisJSUZMQV9WWExBTl9BR0VJTkcsCisJSUZMQV9WWExBTl9MSU1JVCwKKwlJRkxBX1ZYTEFOX1BPUlRfUkFOR0UsCS8qIHNvdXJjZSBwb3J0ICovCisJSUZMQV9WWExBTl9QUk9YWSwKKwlJRkxBX1ZYTEFOX1JTQywKKwlJRkxBX1ZYTEFOX0wyTUlTUywKKwlJRkxBX1ZYTEFOX0wzTUlTUywKKwlJRkxBX1ZYTEFOX1BPUlQsCS8qIGRlc3RpbmF0aW9uIHBvcnQgKi8KKwlJRkxBX1ZYTEFOX0dST1VQNiwKKwlJRkxBX1ZYTEFOX0xPQ0FMNiwKKwlJRkxBX1ZYTEFOX1VEUF9DU1VNLAorCUlGTEFfVlhMQU5fVURQX1pFUk9fQ1NVTTZfVFgsCisJSUZMQV9WWExBTl9VRFBfWkVST19DU1VNNl9SWCwKKwlJRkxBX1ZYTEFOX1JFTUNTVU1fVFgsCisJSUZMQV9WWExBTl9SRU1DU1VNX1JYLAorCUlGTEFfVlhMQU5fR0JQLAorCUlGTEFfVlhMQU5fUkVNQ1NVTV9OT1BBUlRJQUwsCisJSUZMQV9WWExBTl9DT0xMRUNUX01FVEFEQVRBLAorCV9fSUZMQV9WWExBTl9NQVgKK307CisjZGVmaW5lIElGTEFfVlhMQU5fTUFYCShfX0lGTEFfVlhMQU5fTUFYIC0gMSkKKworc3RydWN0IGlmbGFfdnhsYW5fcG9ydF9yYW5nZSB7CisJX19iZTE2CWxvdzsKKwlfX2JlMTYJaGlnaDsKK307CisKKy8qIEdFTkVWRSBzZWN0aW9uICovCitlbnVtIHsKKwlJRkxBX0dFTkVWRV9VTlNQRUMsCisJSUZMQV9HRU5FVkVfSUQsCisJSUZMQV9HRU5FVkVfUkVNT1RFLAorCUlGTEFfR0VORVZFX1RUTCwKKwlJRkxBX0dFTkVWRV9UT1MsCisJSUZMQV9HRU5FVkVfUE9SVCwJLyogZGVzdGluYXRpb24gcG9ydCAqLworCUlGTEFfR0VORVZFX0NPTExFQ1RfTUVUQURBVEEsCisJSUZMQV9HRU5FVkVfUkVNT1RFNiwKKwlJRkxBX0dFTkVWRV9VRFBfQ1NVTSwKKwlJRkxBX0dFTkVWRV9VRFBfWkVST19DU1VNNl9UWCwKKwlJRkxBX0dFTkVWRV9VRFBfWkVST19DU1VNNl9SWCwKKwlfX0lGTEFfR0VORVZFX01BWAorfTsKKyNkZWZpbmUgSUZMQV9HRU5FVkVfTUFYCShfX0lGTEFfR0VORVZFX01BWCAtIDEpCisKKy8qIEJvbmRpbmcgc2VjdGlvbiAqLworCitlbnVtIHsKKwlJRkxBX0JPTkRfVU5TUEVDLAorCUlGTEFfQk9ORF9NT0RFLAorCUlGTEFfQk9ORF9BQ1RJVkVfU0xBVkUsCisJSUZMQV9CT05EX01JSU1PTiwKKwlJRkxBX0JPTkRfVVBERUxBWSwKKwlJRkxBX0JPTkRfRE9XTkRFTEFZLAorCUlGTEFfQk9ORF9VU0VfQ0FSUklFUiwKKwlJRkxBX0JPTkRfQVJQX0lOVEVSVkFMLAorCUlGTEFfQk9ORF9BUlBfSVBfVEFSR0VULAorCUlGTEFfQk9ORF9BUlBfVkFMSURBVEUsCisJSUZMQV9CT05EX0FSUF9BTExfVEFSR0VUUywKKwlJRkxBX0JPTkRfUFJJTUFSWSwKKwlJRkxBX0JPTkRfUFJJTUFSWV9SRVNFTEVDVCwKKwlJRkxBX0JPTkRfRkFJTF9PVkVSX01BQywKKwlJRkxBX0JPTkRfWE1JVF9IQVNIX1BPTElDWSwKKwlJRkxBX0JPTkRfUkVTRU5EX0lHTVAsCisJSUZMQV9CT05EX05VTV9QRUVSX05PVElGLAorCUlGTEFfQk9ORF9BTExfU0xBVkVTX0FDVElWRSwKKwlJRkxBX0JPTkRfTUlOX0xJTktTLAorCUlGTEFfQk9ORF9MUF9JTlRFUlZBTCwKKwlJRkxBX0JPTkRfUEFDS0VUU19QRVJfU0xBVkUsCisJSUZMQV9CT05EX0FEX0xBQ1BfUkFURSwKKwlJRkxBX0JPTkRfQURfU0VMRUNULAorCUlGTEFfQk9ORF9BRF9JTkZPLAorCUlGTEFfQk9ORF9BRF9BQ1RPUl9TWVNfUFJJTywKKwlJRkxBX0JPTkRfQURfVVNFUl9QT1JUX0tFWSwKKwlJRkxBX0JPTkRfQURfQUNUT1JfU1lTVEVNLAorCUlGTEFfQk9ORF9UTEJfRFlOQU1JQ19MQiwKKwlfX0lGTEFfQk9ORF9NQVgsCit9OworCisjZGVmaW5lIElGTEFfQk9ORF9NQVgJKF9fSUZMQV9CT05EX01BWCAtIDEpCisKK2VudW0geworCUlGTEFfQk9ORF9BRF9JTkZPX1VOU1BFQywKKwlJRkxBX0JPTkRfQURfSU5GT19BR0dSRUdBVE9SLAorCUlGTEFfQk9ORF9BRF9JTkZPX05VTV9QT1JUUywKKwlJRkxBX0JPTkRfQURfSU5GT19BQ1RPUl9LRVksCisJSUZMQV9CT05EX0FEX0lORk9fUEFSVE5FUl9LRVksCisJSUZMQV9CT05EX0FEX0lORk9fUEFSVE5FUl9NQUMsCisJX19JRkxBX0JPTkRfQURfSU5GT19NQVgsCit9OworCisjZGVmaW5lIElGTEFfQk9ORF9BRF9JTkZPX01BWAkoX19JRkxBX0JPTkRfQURfSU5GT19NQVggLSAxKQorCitlbnVtIHsKKwlJRkxBX0JPTkRfU0xBVkVfVU5TUEVDLAorCUlGTEFfQk9ORF9TTEFWRV9TVEFURSwKKwlJRkxBX0JPTkRfU0xBVkVfTUlJX1NUQVRVUywKKwlJRkxBX0JPTkRfU0xBVkVfTElOS19GQUlMVVJFX0NPVU5ULAorCUlGTEFfQk9ORF9TTEFWRV9QRVJNX0hXQUREUiwKKwlJRkxBX0JPTkRfU0xBVkVfUVVFVUVfSUQsCisJSUZMQV9CT05EX1NMQVZFX0FEX0FHR1JFR0FUT1JfSUQsCisJSUZMQV9CT05EX1NMQVZFX0FEX0FDVE9SX09QRVJfUE9SVF9TVEFURSwKKwlJRkxBX0JPTkRfU0xBVkVfQURfUEFSVE5FUl9PUEVSX1BPUlRfU1RBVEUsCisJX19JRkxBX0JPTkRfU0xBVkVfTUFYLAorfTsKKworI2RlZmluZSBJRkxBX0JPTkRfU0xBVkVfTUFYCShfX0lGTEFfQk9ORF9TTEFWRV9NQVggLSAxKQorCisvKiBTUi1JT1YgdmlydHVhbCBmdW5jdGlvbiBtYW5hZ2VtZW50IHNlY3Rpb24gKi8KKworZW51bSB7CisJSUZMQV9WRl9JTkZPX1VOU1BFQywKKwlJRkxBX1ZGX0lORk8sCisJX19JRkxBX1ZGX0lORk9fTUFYLAorfTsKKworI2RlZmluZSBJRkxBX1ZGX0lORk9fTUFYIChfX0lGTEFfVkZfSU5GT19NQVggLSAxKQorCitlbnVtIHsKKwlJRkxBX1ZGX1VOU1BFQywKKwlJRkxBX1ZGX01BQywJCS8qIEhhcmR3YXJlIHF1ZXVlIHNwZWNpZmljIGF0dHJpYnV0ZXMgKi8KKwlJRkxBX1ZGX1ZMQU4sCisJSUZMQV9WRl9UWF9SQVRFLAkvKiBNYXggVFggQmFuZHdpZHRoIEFsbG9jYXRpb24gKi8KKwlJRkxBX1ZGX1NQT09GQ0hLLAkvKiBTcG9vZiBDaGVja2luZyBvbi9vZmYgc3dpdGNoICovCisJSUZMQV9WRl9MSU5LX1NUQVRFLAkvKiBsaW5rIHN0YXRlIGVuYWJsZS9kaXNhYmxlL2F1dG8gc3dpdGNoICovCisJSUZMQV9WRl9SQVRFLAkJLyogTWluIGFuZCBNYXggVFggQmFuZHdpZHRoIEFsbG9jYXRpb24gKi8KKwlJRkxBX1ZGX1JTU19RVUVSWV9FTiwJLyogUlNTIFJlZGlyZWN0aW9uIFRhYmxlIGFuZCBIYXNoIEtleSBxdWVyeQorCQkJCSAqIG9uL29mZiBzd2l0Y2gKKwkJCQkgKi8KKwlJRkxBX1ZGX1NUQVRTLAkJLyogbmV0d29yayBkZXZpY2Ugc3RhdGlzdGljcyAqLworCUlGTEFfVkZfVFJVU1QsCQkvKiBUcnVzdCBWRiAqLworCV9fSUZMQV9WRl9NQVgsCit9OworCisjZGVmaW5lIElGTEFfVkZfTUFYIChfX0lGTEFfVkZfTUFYIC0gMSkKKworc3RydWN0IGlmbGFfdmZfbWFjIHsKKwlfX3UzMiB2ZjsKKwlfX3U4IG1hY1szMl07IC8qIE1BWF9BRERSX0xFTiAqLworfTsKKworc3RydWN0IGlmbGFfdmZfdmxhbiB7CisJX191MzIgdmY7CisJX191MzIgdmxhbjsgLyogMCAtIDQwOTUsIDAgZGlzYWJsZXMgVkxBTiBmaWx0ZXIgKi8KKwlfX3UzMiBxb3M7Cit9OworCitzdHJ1Y3QgaWZsYV92Zl90eF9yYXRlIHsKKwlfX3UzMiB2ZjsKKwlfX3UzMiByYXRlOyAvKiBNYXggVFggYmFuZHdpZHRoIGluIE1icHMsIDAgZGlzYWJsZXMgdGhyb3R0bGluZyAqLworfTsKKworc3RydWN0IGlmbGFfdmZfcmF0ZSB7CisJX191MzIgdmY7CisJX191MzIgbWluX3R4X3JhdGU7IC8qIE1pbiBCYW5kd2lkdGggaW4gTWJwcyAqLworCV9fdTMyIG1heF90eF9yYXRlOyAvKiBNYXggQmFuZHdpZHRoIGluIE1icHMgKi8KK307CisKK3N0cnVjdCBpZmxhX3ZmX3Nwb29mY2hrIHsKKwlfX3UzMiB2ZjsKKwlfX3UzMiBzZXR0aW5nOworfTsKKworZW51bSB7CisJSUZMQV9WRl9MSU5LX1NUQVRFX0FVVE8sCS8qIGxpbmsgc3RhdGUgb2YgdGhlIHVwbGluayAqLworCUlGTEFfVkZfTElOS19TVEFURV9FTkFCTEUsCS8qIGxpbmsgYWx3YXlzIHVwICovCisJSUZMQV9WRl9MSU5LX1NUQVRFX0RJU0FCTEUsCS8qIGxpbmsgYWx3YXlzIGRvd24gKi8KKwlfX0lGTEFfVkZfTElOS19TVEFURV9NQVgsCit9OworCitzdHJ1Y3QgaWZsYV92Zl9saW5rX3N0YXRlIHsKKwlfX3UzMiB2ZjsKKwlfX3UzMiBsaW5rX3N0YXRlOworfTsKKworc3RydWN0IGlmbGFfdmZfcnNzX3F1ZXJ5X2VuIHsKKwlfX3UzMiB2ZjsKKwlfX3UzMiBzZXR0aW5nOworfTsKKworZW51bSB7CisJSUZMQV9WRl9TVEFUU19SWF9QQUNLRVRTLAorCUlGTEFfVkZfU1RBVFNfVFhfUEFDS0VUUywKKwlJRkxBX1ZGX1NUQVRTX1JYX0JZVEVTLAorCUlGTEFfVkZfU1RBVFNfVFhfQllURVMsCisJSUZMQV9WRl9TVEFUU19CUk9BRENBU1QsCisJSUZMQV9WRl9TVEFUU19NVUxUSUNBU1QsCisJX19JRkxBX1ZGX1NUQVRTX01BWCwKK307CisKKyNkZWZpbmUgSUZMQV9WRl9TVEFUU19NQVggKF9fSUZMQV9WRl9TVEFUU19NQVggLSAxKQorCitzdHJ1Y3QgaWZsYV92Zl90cnVzdCB7CisJX191MzIgdmY7CisJX191MzIgc2V0dGluZzsKK307CisKKy8qIFZGIHBvcnRzIG1hbmFnZW1lbnQgc2VjdGlvbgorICoKKyAqCU5lc3RlZCBsYXlvdXQgb2Ygc2V0L2dldCBtc2cgaXM6CisgKgorICoJCVtJRkxBX05VTV9WRl0KKyAqCQlbSUZMQV9WRl9QT1JUU10KKyAqCQkJW0lGTEFfVkZfUE9SVF0KKyAqCQkJCVtJRkxBX1BPUlRfKl0sIC4uLgorICoJCQlbSUZMQV9WRl9QT1JUXQorICoJCQkJW0lGTEFfUE9SVF8qXSwgLi4uCisgKgkJCS4uLgorICoJCVtJRkxBX1BPUlRfU0VMRl0KKyAqCQkJW0lGTEFfUE9SVF8qXSwgLi4uCisgKi8KKworZW51bSB7CisJSUZMQV9WRl9QT1JUX1VOU1BFQywKKwlJRkxBX1ZGX1BPUlQsCQkJLyogbmVzdCAqLworCV9fSUZMQV9WRl9QT1JUX01BWCwKK307CisKKyNkZWZpbmUgSUZMQV9WRl9QT1JUX01BWCAoX19JRkxBX1ZGX1BPUlRfTUFYIC0gMSkKKworZW51bSB7CisJSUZMQV9QT1JUX1VOU1BFQywKKwlJRkxBX1BPUlRfVkYsCQkJLyogX191MzIgKi8KKwlJRkxBX1BPUlRfUFJPRklMRSwJCS8qIHN0cmluZyAqLworCUlGTEFfUE9SVF9WU0lfVFlQRSwJCS8qIDgwMi4xUWJnIChwcmUtKXN0YW5kYXJkIFZEUCAqLworCUlGTEFfUE9SVF9JTlNUQU5DRV9VVUlELAkvKiBiaW5hcnkgVVVJRCAqLworCUlGTEFfUE9SVF9IT1NUX1VVSUQsCQkvKiBiaW5hcnkgVVVJRCAqLworCUlGTEFfUE9SVF9SRVFVRVNULAkJLyogX191OCAqLworCUlGTEFfUE9SVF9SRVNQT05TRSwJCS8qIF9fdTE2LCBvdXRwdXQgb25seSAqLworCV9fSUZMQV9QT1JUX01BWCwKK307CisKKyNkZWZpbmUgSUZMQV9QT1JUX01BWCAoX19JRkxBX1BPUlRfTUFYIC0gMSkKKworI2RlZmluZSBQT1JUX1BST0ZJTEVfTUFYCTQwCisjZGVmaW5lIFBPUlRfVVVJRF9NQVgJCTE2CisjZGVmaW5lIFBPUlRfU0VMRl9WRgkJLTEKKworZW51bSB7CisJUE9SVF9SRVFVRVNUX1BSRUFTU09DSUFURSA9IDAsCisJUE9SVF9SRVFVRVNUX1BSRUFTU09DSUFURV9SUiwKKwlQT1JUX1JFUVVFU1RfQVNTT0NJQVRFLAorCVBPUlRfUkVRVUVTVF9ESVNBU1NPQ0lBVEUsCit9OworCitlbnVtIHsKKwlQT1JUX1ZEUF9SRVNQT05TRV9TVUNDRVNTID0gMCwKKwlQT1JUX1ZEUF9SRVNQT05TRV9JTlZBTElEX0ZPUk1BVCwKKwlQT1JUX1ZEUF9SRVNQT05TRV9JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTLAorCVBPUlRfVkRQX1JFU1BPTlNFX1VOVVNFRF9WVElELAorCVBPUlRfVkRQX1JFU1BPTlNFX1ZUSURfVklPTEFUSU9OLAorCVBPUlRfVkRQX1JFU1BPTlNFX1ZUSURfVkVSU0lPTl9WSU9BTFRJT04sCisJUE9SVF9WRFBfUkVTUE9OU0VfT1VUX09GX1NZTkMsCisJLyogMHgwOC0weEZGIHJlc2VydmVkIGZvciBmdXR1cmUgVkRQIHVzZSAqLworCVBPUlRfUFJPRklMRV9SRVNQT05TRV9TVUNDRVNTID0gMHgxMDAsCisJUE9SVF9QUk9GSUxFX1JFU1BPTlNFX0lOUFJPR1JFU1MsCisJUE9SVF9QUk9GSUxFX1JFU1BPTlNFX0lOVkFMSUQsCisJUE9SVF9QUk9GSUxFX1JFU1BPTlNFX0JBRFNUQVRFLAorCVBPUlRfUFJPRklMRV9SRVNQT05TRV9JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTLAorCVBPUlRfUFJPRklMRV9SRVNQT05TRV9FUlJPUiwKK307CisKK3N0cnVjdCBpZmxhX3BvcnRfdnNpIHsKKwlfX3U4IHZzaV9tZ3JfaWQ7CisJX191OCB2c2lfdHlwZV9pZFszXTsKKwlfX3U4IHZzaV90eXBlX3ZlcnNpb247CisJX191OCBwYWRbM107Cit9OworCisKKy8qIElQb0lCIHNlY3Rpb24gKi8KKworZW51bSB7CisJSUZMQV9JUE9JQl9VTlNQRUMsCisJSUZMQV9JUE9JQl9QS0VZLAorCUlGTEFfSVBPSUJfTU9ERSwKKwlJRkxBX0lQT0lCX1VNQ0FTVCwKKwlfX0lGTEFfSVBPSUJfTUFYCit9OworCitlbnVtIHsKKwlJUE9JQl9NT0RFX0RBVEFHUkFNICA9IDAsIC8qIHVzaW5nIHVucmVsaWFibGUgZGF0YWdyYW0gUVBzICovCisJSVBPSUJfTU9ERV9DT05ORUNURUQgPSAxLCAvKiB1c2luZyBjb25uZWN0ZWQgUVBzICovCit9OworCisjZGVmaW5lIElGTEFfSVBPSUJfTUFYIChfX0lGTEFfSVBPSUJfTUFYIC0gMSkKKworCisvKiBIU1Igc2VjdGlvbiAqLworCitlbnVtIHsKKwlJRkxBX0hTUl9VTlNQRUMsCisJSUZMQV9IU1JfU0xBVkUxLAorCUlGTEFfSFNSX1NMQVZFMiwKKwlJRkxBX0hTUl9NVUxUSUNBU1RfU1BFQywJLyogTGFzdCBieXRlIG9mIHN1cGVydmlzaW9uIGFkZHIgKi8KKwlJRkxBX0hTUl9TVVBFUlZJU0lPTl9BRERSLAkvKiBTdXBlcnZpc2lvbiBmcmFtZSBtdWx0aWNhc3QgYWRkciAqLworCUlGTEFfSFNSX1NFUV9OUiwKKwlfX0lGTEFfSFNSX01BWCwKK307CisKKyNkZWZpbmUgSUZMQV9IU1JfTUFYIChfX0lGTEFfSFNSX01BWCAtIDEpCisKKyNlbmRpZiAvKiBfTElOVVhfSUZfTElOS19IICovCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L2lmX3R1bi5oIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9pZl90dW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWVjYjQyCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9pZl90dW4uaApAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqICBVbml2ZXJzYWwgVFVOL1RBUCBkZXZpY2UgZHJpdmVyLgorICogIENvcHlyaWdodCAoQykgMTk5OS0yMDAwIE1heGltIEtyYXNueWFuc2t5IDxtYXhfbWtAeWFob28uY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0lGX1RVTl9ICisjZGVmaW5lIF9fSUZfVFVOX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KKworLyogUmVhZCBxdWV1ZSBzaXplICovCisjZGVmaW5lIFRVTl9SRUFEUV9TSVpFCTUwMAorLyogVFVOIGRldmljZSB0eXBlIGZsYWdzOiBkZXByZWNhdGVkLiBVc2UgSUZGX1RVTi9JRkZfVEFQIGluc3RlYWQuICovCisjZGVmaW5lIFRVTl9UVU5fREVWIAlJRkZfVFVOCisjZGVmaW5lIFRVTl9UQVBfREVWCUlGRl9UQVAKKyNkZWZpbmUgVFVOX1RZUEVfTUFTSyAgIDB4MDAwZgorCisvKiBJb2N0bCBkZWZpbmVzICovCisjZGVmaW5lIFRVTlNFVE5PQ1NVTSAgX0lPVygnVCcsIDIwMCwgaW50KSAKKyNkZWZpbmUgVFVOU0VUREVCVUcgICBfSU9XKCdUJywgMjAxLCBpbnQpIAorI2RlZmluZSBUVU5TRVRJRkYgICAgIF9JT1coJ1QnLCAyMDIsIGludCkgCisjZGVmaW5lIFRVTlNFVFBFUlNJU1QgX0lPVygnVCcsIDIwMywgaW50KSAKKyNkZWZpbmUgVFVOU0VUT1dORVIgICBfSU9XKCdUJywgMjA0LCBpbnQpCisjZGVmaW5lIFRVTlNFVExJTksgICAgX0lPVygnVCcsIDIwNSwgaW50KQorI2RlZmluZSBUVU5TRVRHUk9VUCAgIF9JT1coJ1QnLCAyMDYsIGludCkKKyNkZWZpbmUgVFVOR0VURkVBVFVSRVMgX0lPUignVCcsIDIwNywgdW5zaWduZWQgaW50KQorI2RlZmluZSBUVU5TRVRPRkZMT0FEICBfSU9XKCdUJywgMjA4LCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIFRVTlNFVFRYRklMVEVSIF9JT1coJ1QnLCAyMDksIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgVFVOR0VUSUZGICAgICAgX0lPUignVCcsIDIxMCwgdW5zaWduZWQgaW50KQorI2RlZmluZSBUVU5HRVRTTkRCVUYgICBfSU9SKCdUJywgMjExLCBpbnQpCisjZGVmaW5lIFRVTlNFVFNOREJVRiAgIF9JT1coJ1QnLCAyMTIsIGludCkKKyNkZWZpbmUgVFVOQVRUQUNIRklMVEVSIF9JT1coJ1QnLCAyMTMsIHN0cnVjdCBzb2NrX2Zwcm9nKQorI2RlZmluZSBUVU5ERVRBQ0hGSUxURVIgX0lPVygnVCcsIDIxNCwgc3RydWN0IHNvY2tfZnByb2cpCisjZGVmaW5lIFRVTkdFVFZORVRIRFJTWiBfSU9SKCdUJywgMjE1LCBpbnQpCisjZGVmaW5lIFRVTlNFVFZORVRIRFJTWiBfSU9XKCdUJywgMjE2LCBpbnQpCisjZGVmaW5lIFRVTlNFVFFVRVVFICBfSU9XKCdUJywgMjE3LCBpbnQpCisjZGVmaW5lIFRVTlNFVElGSU5ERVgJX0lPVygnVCcsIDIxOCwgdW5zaWduZWQgaW50KQorI2RlZmluZSBUVU5HRVRGSUxURVIgX0lPUignVCcsIDIxOSwgc3RydWN0IHNvY2tfZnByb2cpCisjZGVmaW5lIFRVTlNFVFZORVRMRSBfSU9XKCdUJywgMjIwLCBpbnQpCisjZGVmaW5lIFRVTkdFVFZORVRMRSBfSU9SKCdUJywgMjIxLCBpbnQpCisvKiBUaGUgVFVOU0VUVk5FVEJFIGFuZCBUVU5HRVRWTkVUQkUgaW9jdGxzIGFyZSBmb3IgY3Jvc3MtZW5kaWFuIHN1cHBvcnQgb24KKyAqIGxpdHRsZS1lbmRpYW4gaG9zdHMuIE5vdCBhbGwga2VybmVsIGNvbmZpZ3VyYXRpb25zIHN1cHBvcnQgdGhlbSwgYnV0IGFsbAorICogY29uZmlndXJhdGlvbnMgdGhhdCBzdXBwb3J0IFNFVCBhbHNvIHN1cHBvcnQgR0VULgorICovCisjZGVmaW5lIFRVTlNFVFZORVRCRSBfSU9XKCdUJywgMjIyLCBpbnQpCisjZGVmaW5lIFRVTkdFVFZORVRCRSBfSU9SKCdUJywgMjIzLCBpbnQpCisKKy8qIFRVTlNFVElGRiBpZnIgZmxhZ3MgKi8KKyNkZWZpbmUgSUZGX1RVTgkJMHgwMDAxCisjZGVmaW5lIElGRl9UQVAJCTB4MDAwMgorI2RlZmluZSBJRkZfTk9fUEkJMHgxMDAwCisvKiBUaGlzIGZsYWcgaGFzIG5vIHJlYWwgZWZmZWN0ICovCisjZGVmaW5lIElGRl9PTkVfUVVFVUUJMHgyMDAwCisjZGVmaW5lIElGRl9WTkVUX0hEUgkweDQwMDAKKyNkZWZpbmUgSUZGX1RVTl9FWENMCTB4ODAwMAorI2RlZmluZSBJRkZfTVVMVElfUVVFVUUgMHgwMTAwCisjZGVmaW5lIElGRl9BVFRBQ0hfUVVFVUUgMHgwMjAwCisjZGVmaW5lIElGRl9ERVRBQ0hfUVVFVUUgMHgwNDAwCisvKiByZWFkLW9ubHkgZmxhZyAqLworI2RlZmluZSBJRkZfUEVSU0lTVAkweDA4MDAKKyNkZWZpbmUgSUZGX05PRklMVEVSCTB4MTAwMAorCisvKiBTb2NrZXQgb3B0aW9ucyAqLworI2RlZmluZSBUVU5fVFhfVElNRVNUQU1QIDEKKworLyogRmVhdHVyZXMgZm9yIEdTTyAoVFVOU0VUT0ZGTE9BRCkuICovCisjZGVmaW5lIFRVTl9GX0NTVU0JMHgwMQkvKiBZb3UgY2FuIGhhbmQgbWUgdW5jaGVja3N1bW1lZCBwYWNrZXRzLiAqLworI2RlZmluZSBUVU5fRl9UU080CTB4MDIJLyogSSBjYW4gaGFuZGxlIFRTTyBmb3IgSVB2NCBwYWNrZXRzICovCisjZGVmaW5lIFRVTl9GX1RTTzYJMHgwNAkvKiBJIGNhbiBoYW5kbGUgVFNPIGZvciBJUHY2IHBhY2tldHMgKi8KKyNkZWZpbmUgVFVOX0ZfVFNPX0VDTgkweDA4CS8qIEkgY2FuIGhhbmRsZSBUU08gd2l0aCBFQ04gYml0cy4gKi8KKyNkZWZpbmUgVFVOX0ZfVUZPCTB4MTAJLyogSSBjYW4gaGFuZGxlIFVGTyBwYWNrZXRzICovCisKKy8qIFByb3RvY29sIGluZm8gcHJlcGVuZGVkIHRvIHRoZSBwYWNrZXRzICh3aGVuIElGRl9OT19QSSBpcyBub3Qgc2V0KSAqLworI2RlZmluZSBUVU5fUEtUX1NUUklQCTB4MDAwMQorc3RydWN0IHR1bl9waSB7CisJX191MTYgIGZsYWdzOworCV9fYmUxNiBwcm90bzsKK307CisKKy8qCisgKiBGaWx0ZXIgc3BlYyAodXNlZCBmb3IgU0VUWFhGSUxURVIgaW9jdGxzKQorICogVGhpcyBzdHVmZiBpcyBhcHBsaWNhYmxlIG9ubHkgdG8gdGhlIFRBUCAoRXRoZXJuZXQpIGRldmljZXMuCisgKiBJZiB0aGUgY291bnQgaXMgemVybyB0aGUgZmlsdGVyIGlzIGRpc2FibGVkIGFuZCB0aGUgZHJpdmVyIGFjY2VwdHMKKyAqIGFsbCBwYWNrZXRzIChwcm9taXNjIG1vZGUpLgorICogSWYgdGhlIGZpbHRlciBpcyBlbmFibGVkIGluIG9yZGVyIHRvIGFjY2VwdCBicm9hZGNhc3QgcGFja2V0cworICogYnJvYWRjYXN0IGFkZHIgbXVzdCBiZSBleHBsaWNpdGx5IGluY2x1ZGVkIGluIHRoZSBhZGRyIGxpc3QuCisgKi8KKyNkZWZpbmUgVFVOX0ZMVF9BTExNVUxUSSAweDAwMDEgLyogQWNjZXB0IGFsbCBtdWx0aWNhc3QgcGFja2V0cyAqLworc3RydWN0IHR1bl9maWx0ZXIgeworCV9fdTE2ICBmbGFnczsgLyogVFVOX0ZMVF8gZmxhZ3Mgc2VlIGFib3ZlICovCisJX191MTYgIGNvdW50OyAvKiBOdW1iZXIgb2YgYWRkcmVzc2VzICovCisJX191OCAgIGFkZHJbMF1bRVRIX0FMRU5dOworfTsKKworI2VuZGlmIC8qIF9fSUZfVFVOX0ggKi8KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2luY2x1ZGUvbGludXgvaWZfdHVubmVsLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L2lmX3R1bm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMjAxY2EKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L2lmX3R1bm5lbC5oCkBAIC0wLDAgKzEsMTM1IEBACisjaWZuZGVmIF9JRl9UVU5ORUxfSF8KKyNkZWZpbmUgX0lGX1RVTk5FTF9IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKworI2RlZmluZSBTSU9DR0VUVFVOTkVMICAgKFNJT0NERVZQUklWQVRFICsgMCkKKyNkZWZpbmUgU0lPQ0FERFRVTk5FTCAgIChTSU9DREVWUFJJVkFURSArIDEpCisjZGVmaW5lIFNJT0NERUxUVU5ORUwgICAoU0lPQ0RFVlBSSVZBVEUgKyAyKQorI2RlZmluZSBTSU9DQ0hHVFVOTkVMICAgKFNJT0NERVZQUklWQVRFICsgMykKKyNkZWZpbmUgU0lPQ0dFVFBSTCAgICAgIChTSU9DREVWUFJJVkFURSArIDQpCisjZGVmaW5lIFNJT0NBRERQUkwgICAgICAoU0lPQ0RFVlBSSVZBVEUgKyA1KQorI2RlZmluZSBTSU9DREVMUFJMICAgICAgKFNJT0NERVZQUklWQVRFICsgNikKKyNkZWZpbmUgU0lPQ0NIR1BSTCAgICAgIChTSU9DREVWUFJJVkFURSArIDcpCisjZGVmaW5lIFNJT0NHRVQ2UkQgICAgICAoU0lPQ0RFVlBSSVZBVEUgKyA4KQorI2RlZmluZSBTSU9DQURENlJEICAgICAgKFNJT0NERVZQUklWQVRFICsgOSkKKyNkZWZpbmUgU0lPQ0RFTDZSRCAgICAgIChTSU9DREVWUFJJVkFURSArIDEwKQorI2RlZmluZSBTSU9DQ0hHNlJEICAgICAgKFNJT0NERVZQUklWQVRFICsgMTEpCisKKyNkZWZpbmUgR1JFX0NTVU0JX19jcHVfdG9fYmUxNigweDgwMDApCisjZGVmaW5lIEdSRV9ST1VUSU5HCV9fY3B1X3RvX2JlMTYoMHg0MDAwKQorI2RlZmluZSBHUkVfS0VZCQlfX2NwdV90b19iZTE2KDB4MjAwMCkKKyNkZWZpbmUgR1JFX1NFUQkJX19jcHVfdG9fYmUxNigweDEwMDApCisjZGVmaW5lIEdSRV9TVFJJQ1QJX19jcHVfdG9fYmUxNigweDA4MDApCisjZGVmaW5lIEdSRV9SRUMJCV9fY3B1X3RvX2JlMTYoMHgwNzAwKQorI2RlZmluZSBHUkVfRkxBR1MJX19jcHVfdG9fYmUxNigweDAwRjgpCisjZGVmaW5lIEdSRV9WRVJTSU9OCV9fY3B1X3RvX2JlMTYoMHgwMDA3KQorCitzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0geworCWNoYXIJCQluYW1lW0lGTkFNU0laXTsKKwlpbnQJCQlsaW5rOworCV9fYmUxNgkJCWlfZmxhZ3M7CisJX19iZTE2CQkJb19mbGFnczsKKwlfX2JlMzIJCQlpX2tleTsKKwlfX2JlMzIJCQlvX2tleTsKKwlzdHJ1Y3QgaXBoZHIJCWlwaDsKK307CisKK2VudW0geworCUlGTEFfSVBUVU5fVU5TUEVDLAorCUlGTEFfSVBUVU5fTElOSywKKwlJRkxBX0lQVFVOX0xPQ0FMLAorCUlGTEFfSVBUVU5fUkVNT1RFLAorCUlGTEFfSVBUVU5fVFRMLAorCUlGTEFfSVBUVU5fVE9TLAorCUlGTEFfSVBUVU5fRU5DQVBfTElNSVQsCisJSUZMQV9JUFRVTl9GTE9XSU5GTywKKwlJRkxBX0lQVFVOX0ZMQUdTLAorCUlGTEFfSVBUVU5fUFJPVE8sCisJSUZMQV9JUFRVTl9QTVRVRElTQywKKwlJRkxBX0lQVFVOXzZSRF9QUkVGSVgsCisJSUZMQV9JUFRVTl82UkRfUkVMQVlfUFJFRklYLAorCUlGTEFfSVBUVU5fNlJEX1BSRUZJWExFTiwKKwlJRkxBX0lQVFVOXzZSRF9SRUxBWV9QUkVGSVhMRU4sCisJSUZMQV9JUFRVTl9FTkNBUF9UWVBFLAorCUlGTEFfSVBUVU5fRU5DQVBfRkxBR1MsCisJSUZMQV9JUFRVTl9FTkNBUF9TUE9SVCwKKwlJRkxBX0lQVFVOX0VOQ0FQX0RQT1JULAorCV9fSUZMQV9JUFRVTl9NQVgsCit9OworI2RlZmluZSBJRkxBX0lQVFVOX01BWAkoX19JRkxBX0lQVFVOX01BWCAtIDEpCisKK2VudW0gdHVubmVsX2VuY2FwX3R5cGVzIHsKKwlUVU5ORUxfRU5DQVBfTk9ORSwKKwlUVU5ORUxfRU5DQVBfRk9VLAorCVRVTk5FTF9FTkNBUF9HVUUsCit9OworCisjZGVmaW5lIFRVTk5FTF9FTkNBUF9GTEFHX0NTVU0JCSgxPDwwKQorI2RlZmluZSBUVU5ORUxfRU5DQVBfRkxBR19DU1VNNgkJKDE8PDEpCisjZGVmaW5lIFRVTk5FTF9FTkNBUF9GTEFHX1JFTUNTVU0JKDE8PDIpCisKKy8qIFNJVC1tb2RlIGlfZmxhZ3MgKi8KKyNkZWZpbmUJU0lUX0lTQVRBUAkweDAwMDEKKworc3RydWN0IGlwX3R1bm5lbF9wcmwgeworCV9fYmUzMgkJCWFkZHI7CisJX191MTYJCQlmbGFnczsKKwlfX3UxNgkJCV9fcmVzZXJ2ZWQ7CisJX191MzIJCQlkYXRhbGVuOworCV9fdTMyCQkJX19yZXNlcnZlZDI7CisJLyogZGF0YSBmb2xsb3dzICovCit9OworCisvKiBQUkwgZmxhZ3MgKi8KKyNkZWZpbmUJUFJMX0RFRkFVTFQJCTB4MDAwMQorCitzdHJ1Y3QgaXBfdHVubmVsXzZyZCB7CisJc3RydWN0IGluNl9hZGRyCQlwcmVmaXg7CisJX19iZTMyCQkJcmVsYXlfcHJlZml4OworCV9fdTE2CQkJcHJlZml4bGVuOworCV9fdTE2CQkJcmVsYXlfcHJlZml4bGVuOworfTsKKworZW51bSB7CisJSUZMQV9HUkVfVU5TUEVDLAorCUlGTEFfR1JFX0xJTkssCisJSUZMQV9HUkVfSUZMQUdTLAorCUlGTEFfR1JFX09GTEFHUywKKwlJRkxBX0dSRV9JS0VZLAorCUlGTEFfR1JFX09LRVksCisJSUZMQV9HUkVfTE9DQUwsCisJSUZMQV9HUkVfUkVNT1RFLAorCUlGTEFfR1JFX1RUTCwKKwlJRkxBX0dSRV9UT1MsCisJSUZMQV9HUkVfUE1UVURJU0MsCisJSUZMQV9HUkVfRU5DQVBfTElNSVQsCisJSUZMQV9HUkVfRkxPV0lORk8sCisJSUZMQV9HUkVfRkxBR1MsCisJSUZMQV9HUkVfRU5DQVBfVFlQRSwKKwlJRkxBX0dSRV9FTkNBUF9GTEFHUywKKwlJRkxBX0dSRV9FTkNBUF9TUE9SVCwKKwlJRkxBX0dSRV9FTkNBUF9EUE9SVCwKKwlJRkxBX0dSRV9DT0xMRUNUX01FVEFEQVRBLAorCV9fSUZMQV9HUkVfTUFYLAorfTsKKworI2RlZmluZSBJRkxBX0dSRV9NQVgJKF9fSUZMQV9HUkVfTUFYIC0gMSkKKworLyogVlRJLW1vZGUgaV9mbGFncyAqLworI2RlZmluZSBWVElfSVNWVEkgKChfX2JlMTYpMHgwMDAxKQorCitlbnVtIHsKKwlJRkxBX1ZUSV9VTlNQRUMsCisJSUZMQV9WVElfTElOSywKKwlJRkxBX1ZUSV9JS0VZLAorCUlGTEFfVlRJX09LRVksCisJSUZMQV9WVElfTE9DQUwsCisJSUZMQV9WVElfUkVNT1RFLAorCV9fSUZMQV9WVElfTUFYLAorfTsKKworI2RlZmluZSBJRkxBX1ZUSV9NQVgJKF9fSUZMQV9WVElfTUFYIC0gMSkKKyNlbmRpZiAvKiBfSUZfVFVOTkVMX0hfICovCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L2lmX3ZsYW4uaCBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvaWZfdmxhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YWUwMDcKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L2lmX3ZsYW4uaApAQCAtMCwwICsxLDY0IEBACisvKgorICogVkxBTgkJQW4gaW1wbGVtZW50YXRpb24gb2YgODAyLjFRIFZMQU4gdGFnZ2luZy4KKyAqCisgKiBBdXRob3JzOglCZW4gR3JlZWFyIDxncmVlYXJiQGNhbmRlbGF0ZWNoLmNvbT4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfTElOVVhfSUZfVkxBTl9IXworI2RlZmluZSBfTElOVVhfSUZfVkxBTl9IXworCisKKy8qIFZMQU4gSU9DVExzIGFyZSBmb3VuZCBpbiBzb2NraW9zLmggKi8KKworLyogUGFzc2VkIGluIHZsYW5faW9jdGxfYXJncyBzdHJ1Y3R1cmUgdG8gZGV0ZXJtaW5lIGJlaGF2aW91ci4gKi8KK2VudW0gdmxhbl9pb2N0bF9jbWRzIHsKKwlBRERfVkxBTl9DTUQsCisJREVMX1ZMQU5fQ01ELAorCVNFVF9WTEFOX0lOR1JFU1NfUFJJT1JJVFlfQ01ELAorCVNFVF9WTEFOX0VHUkVTU19QUklPUklUWV9DTUQsCisJR0VUX1ZMQU5fSU5HUkVTU19QUklPUklUWV9DTUQsCisJR0VUX1ZMQU5fRUdSRVNTX1BSSU9SSVRZX0NNRCwKKwlTRVRfVkxBTl9OQU1FX1RZUEVfQ01ELAorCVNFVF9WTEFOX0ZMQUdfQ01ELAorCUdFVF9WTEFOX1JFQUxERVZfTkFNRV9DTUQsIC8qIElmIHRoaXMgd29ya3MsIHlvdSBrbm93IGl0J3MgYSBWTEFOIGRldmljZSwgYnR3ICovCisJR0VUX1ZMQU5fVklEX0NNRCAvKiBHZXQgdGhlIFZJRCBvZiB0aGlzIFZMQU4gKHNwZWNpZmllZCBieSBuYW1lKSAqLworfTsKKworZW51bSB2bGFuX2ZsYWdzIHsKKwlWTEFOX0ZMQUdfUkVPUkRFUl9IRFIJPSAweDEsCisJVkxBTl9GTEFHX0dWUlAJCT0gMHgyLAorCVZMQU5fRkxBR19MT09TRV9CSU5ESU5HCT0gMHg0LAorCVZMQU5fRkxBR19NVlJQCQk9IDB4OCwKK307CisKK2VudW0gdmxhbl9uYW1lX3R5cGVzIHsKKwlWTEFOX05BTUVfVFlQRV9QTFVTX1ZJRCwgLyogTmFtZSB3aWxsIGxvb2sgbGlrZTogIHZsYW4wMDA1ICovCisJVkxBTl9OQU1FX1RZUEVfUkFXX1BMVVNfVklELCAvKiBuYW1lIHdpbGwgbG9vayBsaWtlOiAgZXRoMS4wMDA1ICovCisJVkxBTl9OQU1FX1RZUEVfUExVU19WSURfTk9fUEFELCAvKiBOYW1lIHdpbGwgbG9vayBsaWtlOiAgdmxhbjUgKi8KKwlWTEFOX05BTUVfVFlQRV9SQVdfUExVU19WSURfTk9fUEFELCAvKiBOYW1lIHdpbGwgbG9vayBsaWtlOiAgZXRoMC41ICovCisJVkxBTl9OQU1FX1RZUEVfSElHSEVTVAorfTsKKworc3RydWN0IHZsYW5faW9jdGxfYXJncyB7CisJaW50IGNtZDsgLyogU2hvdWxkIGJlIG9uZSBvZiB0aGUgdmxhbl9pb2N0bF9jbWRzIGVudW0gYWJvdmUuICovCisJY2hhciBkZXZpY2UxWzI0XTsKKworICAgICAgICB1bmlvbiB7CisJCWNoYXIgZGV2aWNlMlsyNF07CisJCWludCBWSUQ7CisJCXVuc2lnbmVkIGludCBza2JfcHJpb3JpdHk7CisJCXVuc2lnbmVkIGludCBuYW1lX3R5cGU7CisJCXVuc2lnbmVkIGludCBiaW5kX3R5cGU7CisJCXVuc2lnbmVkIGludCBmbGFnOyAvKiBNYXRjaGVzIHZsYW5fZGV2X3ByaXYgZmxhZ3MgKi8KKyAgICAgICAgfSB1OworCisJc2hvcnQgdmxhbl9xb3M7ICAgCit9OworCisjZW5kaWYgLyogX0xJTlVYX0lGX1ZMQU5fSF8gKi8KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2luY2x1ZGUvbGludXgvaWxhLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L2lsYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOWUxZGUKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L2lsYS5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qIGlsYS5oIC0gSUxBIEludGVyZmFjZSAqLworCisjaWZuZGVmIF9MSU5VWF9JTEFfSAorI2RlZmluZSBfTElOVVhfSUxBX0gKKworLyogTkVUTElOS19HRU5FUklDIHJlbGF0ZWQgaW5mbyAqLworI2RlZmluZSBJTEFfR0VOTF9OQU1FCQkiaWxhIgorI2RlZmluZSBJTEFfR0VOTF9WRVJTSU9OCTB4MQorCitlbnVtIHsKKwlJTEFfQVRUUl9VTlNQRUMsCisJSUxBX0FUVFJfTE9DQVRPUiwJCQkvKiB1NjQgKi8KKwlJTEFfQVRUUl9JREVOVElGSUVSLAkJCS8qIHU2NCAqLworCUlMQV9BVFRSX0xPQ0FUT1JfTUFUQ0gsCQkJLyogdTY0ICovCisJSUxBX0FUVFJfSUZJTkRFWCwJCQkvKiBzMzIgKi8KKwlJTEFfQVRUUl9ESVIsCQkJCS8qIHUzMiAqLworCisJX19JTEFfQVRUUl9NQVgsCit9OworCisjZGVmaW5lIElMQV9BVFRSX01BWAkJKF9fSUxBX0FUVFJfTUFYIC0gMSkKKworZW51bSB7CisJSUxBX0NNRF9VTlNQRUMsCisJSUxBX0NNRF9BREQsCisJSUxBX0NNRF9ERUwsCisJSUxBX0NNRF9HRVQsCisKKwlfX0lMQV9DTURfTUFYLAorfTsKKworI2RlZmluZSBJTEFfQ01EX01BWAkoX19JTEFfQ01EX01BWCAtIDEpCisKKyNkZWZpbmUgSUxBX0RJUl9JTgkoMSA8PCAwKQorI2RlZmluZSBJTEFfRElSX09VVAkoMSA8PCAxKQorCisjZW5kaWYgLyogX0xJTlVYX0lMQV9IICovCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L2luLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk0YjQzYgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvaW4uaApAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlEZWZpbml0aW9ucyBvZiB0aGUgSW50ZXJuZXQgUHJvdG9jb2wuCisgKgorICogVmVyc2lvbjoJQCgjKWluLmgJMS4wLjEJMDQvMjEvOTMKKyAqCisgKiBBdXRob3JzOglPcmlnaW5hbCB0YWtlbiBmcm9tIHRoZSBHTlUgUHJvamVjdCA8bmV0aW5ldC9pbi5oPiBmaWxlLgorICoJCUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9MSU5VWF9JTl9ICisjZGVmaW5lIF9MSU5VWF9JTl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpYmMtY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisKKyNpZiBfX1VBUElfREVGX0lOX0lQUFJPVE8KKy8qIFN0YW5kYXJkIHdlbGwtZGVmaW5lZCBJUCBwcm90b2NvbHMuICAqLworZW51bSB7CisgIElQUFJPVE9fSVAgPSAwLAkJLyogRHVtbXkgcHJvdG9jb2wgZm9yIFRDUAkJKi8KKyNkZWZpbmUgSVBQUk9UT19JUAkJSVBQUk9UT19JUAorICBJUFBST1RPX0lDTVAgPSAxLAkJLyogSW50ZXJuZXQgQ29udHJvbCBNZXNzYWdlIFByb3RvY29sCSovCisjZGVmaW5lIElQUFJPVE9fSUNNUAkJSVBQUk9UT19JQ01QCisgIElQUFJPVE9fSUdNUCA9IDIsCQkvKiBJbnRlcm5ldCBHcm91cCBNYW5hZ2VtZW50IFByb3RvY29sCSovCisjZGVmaW5lIElQUFJPVE9fSUdNUAkJSVBQUk9UT19JR01QCisgIElQUFJPVE9fSVBJUCA9IDQsCQkvKiBJUElQIHR1bm5lbHMgKG9sZGVyIEtBOVEgdHVubmVscyB1c2UgOTQpICovCisjZGVmaW5lIElQUFJPVE9fSVBJUAkJSVBQUk9UT19JUElQCisgIElQUFJPVE9fVENQID0gNiwJCS8qIFRyYW5zbWlzc2lvbiBDb250cm9sIFByb3RvY29sCSovCisjZGVmaW5lIElQUFJPVE9fVENQCQlJUFBST1RPX1RDUAorICBJUFBST1RPX0VHUCA9IDgsCQkvKiBFeHRlcmlvciBHYXRld2F5IFByb3RvY29sCQkqLworI2RlZmluZSBJUFBST1RPX0VHUAkJSVBQUk9UT19FR1AKKyAgSVBQUk9UT19QVVAgPSAxMiwJCS8qIFBVUCBwcm90b2NvbAkJCQkqLworI2RlZmluZSBJUFBST1RPX1BVUAkJSVBQUk9UT19QVVAKKyAgSVBQUk9UT19VRFAgPSAxNywJCS8qIFVzZXIgRGF0YWdyYW0gUHJvdG9jb2wJCSovCisjZGVmaW5lIElQUFJPVE9fVURQCQlJUFBST1RPX1VEUAorICBJUFBST1RPX0lEUCA9IDIyLAkJLyogWE5TIElEUCBwcm90b2NvbAkJCSovCisjZGVmaW5lIElQUFJPVE9fSURQCQlJUFBST1RPX0lEUAorICBJUFBST1RPX1RQID0gMjksCQkvKiBTTyBUcmFuc3BvcnQgUHJvdG9jb2wgQ2xhc3MgNAkqLworI2RlZmluZSBJUFBST1RPX1RQCQlJUFBST1RPX1RQCisgIElQUFJPVE9fRENDUCA9IDMzLAkJLyogRGF0YWdyYW0gQ29uZ2VzdGlvbiBDb250cm9sIFByb3RvY29sICovCisjZGVmaW5lIElQUFJPVE9fRENDUAkJSVBQUk9UT19EQ0NQCisgIElQUFJPVE9fSVBWNiA9IDQxLAkJLyogSVB2Ni1pbi1JUHY0IHR1bm5lbGxpbmcJCSovCisjZGVmaW5lIElQUFJPVE9fSVBWNgkJSVBQUk9UT19JUFY2CisgIElQUFJPVE9fUlNWUCA9IDQ2LAkJLyogUlNWUCBQcm90b2NvbAkJCSovCisjZGVmaW5lIElQUFJPVE9fUlNWUAkJSVBQUk9UT19SU1ZQCisgIElQUFJPVE9fR1JFID0gNDcsCQkvKiBDaXNjbyBHUkUgdHVubmVscyAocmZjIDE3MDEsMTcwMikJKi8KKyNkZWZpbmUgSVBQUk9UT19HUkUJCUlQUFJPVE9fR1JFCisgIElQUFJPVE9fRVNQID0gNTAsCQkvKiBFbmNhcHN1bGF0aW9uIFNlY3VyaXR5IFBheWxvYWQgcHJvdG9jb2wgKi8KKyNkZWZpbmUgSVBQUk9UT19FU1AJCUlQUFJPVE9fRVNQCisgIElQUFJPVE9fQUggPSA1MSwJCS8qIEF1dGhlbnRpY2F0aW9uIEhlYWRlciBwcm90b2NvbAkqLworI2RlZmluZSBJUFBST1RPX0FICQlJUFBST1RPX0FICisgIElQUFJPVE9fTVRQID0gOTIsCQkvKiBNdWx0aWNhc3QgVHJhbnNwb3J0IFByb3RvY29sCQkqLworI2RlZmluZSBJUFBST1RPX01UUAkJSVBQUk9UT19NVFAKKyAgSVBQUk9UT19CRUVUUEggPSA5NCwJCS8qIElQIG9wdGlvbiBwc2V1ZG8gaGVhZGVyIGZvciBCRUVUCSovCisjZGVmaW5lIElQUFJPVE9fQkVFVFBICQlJUFBST1RPX0JFRVRQSAorICBJUFBST1RPX0VOQ0FQID0gOTgsCQkvKiBFbmNhcHN1bGF0aW9uIEhlYWRlcgkJCSovCisjZGVmaW5lIElQUFJPVE9fRU5DQVAJCUlQUFJPVE9fRU5DQVAKKyAgSVBQUk9UT19QSU0gPSAxMDMsCQkvKiBQcm90b2NvbCBJbmRlcGVuZGVudCBNdWx0aWNhc3QJKi8KKyNkZWZpbmUgSVBQUk9UT19QSU0JCUlQUFJPVE9fUElNCisgIElQUFJPVE9fQ09NUCA9IDEwOCwJCS8qIENvbXByZXNzaW9uIEhlYWRlciBQcm90b2NvbAkJKi8KKyNkZWZpbmUgSVBQUk9UT19DT01QCQlJUFBST1RPX0NPTVAKKyAgSVBQUk9UT19TQ1RQID0gMTMyLAkJLyogU3RyZWFtIENvbnRyb2wgVHJhbnNwb3J0IFByb3RvY29sCSovCisjZGVmaW5lIElQUFJPVE9fU0NUUAkJSVBQUk9UT19TQ1RQCisgIElQUFJPVE9fVURQTElURSA9IDEzNiwJLyogVURQLUxpdGUgKFJGQyAzODI4KQkJCSovCisjZGVmaW5lIElQUFJPVE9fVURQTElURQkJSVBQUk9UT19VRFBMSVRFCisgIElQUFJPVE9fTVBMUyA9IDEzNywJCS8qIE1QTFMgaW4gSVAgKFJGQyA0MDIzKQkJKi8KKyNkZWZpbmUgSVBQUk9UT19NUExTCQlJUFBST1RPX01QTFMKKyAgSVBQUk9UT19SQVcgPSAyNTUsCQkvKiBSYXcgSVAgcGFja2V0cwkJCSovCisjZGVmaW5lIElQUFJPVE9fUkFXCQlJUFBST1RPX1JBVworICBJUFBST1RPX01BWAorfTsKKyNlbmRpZgorCisjaWYgX19VQVBJX0RFRl9JTl9BRERSCisvKiBJbnRlcm5ldCBhZGRyZXNzLiAqLworc3RydWN0IGluX2FkZHIgeworCV9fYmUzMglzX2FkZHI7Cit9OworI2VuZGlmCisKKyNkZWZpbmUgSVBfVE9TCQkxCisjZGVmaW5lIElQX1RUTAkJMgorI2RlZmluZSBJUF9IRFJJTkNMCTMKKyNkZWZpbmUgSVBfT1BUSU9OUwk0CisjZGVmaW5lIElQX1JPVVRFUl9BTEVSVAk1CisjZGVmaW5lIElQX1JFQ1ZPUFRTCTYKKyNkZWZpbmUgSVBfUkVUT1BUUwk3CisjZGVmaW5lIElQX1BLVElORk8JOAorI2RlZmluZSBJUF9QS1RPUFRJT05TCTkKKyNkZWZpbmUgSVBfTVRVX0RJU0NPVkVSCTEwCisjZGVmaW5lIElQX1JFQ1ZFUlIJMTEKKyNkZWZpbmUgSVBfUkVDVlRUTAkxMgorI2RlZmluZQlJUF9SRUNWVE9TCTEzCisjZGVmaW5lIElQX01UVQkJMTQKKyNkZWZpbmUgSVBfRlJFRUJJTkQJMTUKKyNkZWZpbmUgSVBfSVBTRUNfUE9MSUNZCTE2CisjZGVmaW5lIElQX1hGUk1fUE9MSUNZCTE3CisjZGVmaW5lIElQX1BBU1NTRUMJMTgKKyNkZWZpbmUgSVBfVFJBTlNQQVJFTlQJMTkKKworLyogQlNEIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgSVBfUkVDVlJFVE9QVFMJSVBfUkVUT1BUUworCisvKiBUUHJveHkgb3JpZ2luYWwgYWRkcmVzc2VzICovCisjZGVmaW5lIElQX09SSUdEU1RBRERSICAgICAgIDIwCisjZGVmaW5lIElQX1JFQ1ZPUklHRFNUQUREUiAgIElQX09SSUdEU1RBRERSCisKKyNkZWZpbmUgSVBfTUlOVFRMICAgICAgIDIxCisjZGVmaW5lIElQX05PREVGUkFHICAgICAyMgorI2RlZmluZSBJUF9DSEVDS1NVTQkyMworI2RlZmluZSBJUF9CSU5EX0FERFJFU1NfTk9fUE9SVAkyNAorCisvKiBJUF9NVFVfRElTQ09WRVIgdmFsdWVzICovCisjZGVmaW5lIElQX1BNVFVESVNDX0RPTlQJCTAJLyogTmV2ZXIgc2VuZCBERiBmcmFtZXMgKi8KKyNkZWZpbmUgSVBfUE1UVURJU0NfV0FOVAkJMQkvKiBVc2UgcGVyIHJvdXRlIGhpbnRzCSovCisjZGVmaW5lIElQX1BNVFVESVNDX0RPCQkJMgkvKiBBbHdheXMgREYJCSovCisjZGVmaW5lIElQX1BNVFVESVNDX1BST0JFCQkzICAgICAgIC8qIElnbm9yZSBkc3QgcG10dSAgICAgICovCisvKiBBbHdheXMgdXNlIGludGVyZmFjZSBtdHUgKGlnbm9yZXMgZHN0IHBtdHUpIGJ1dCBkb24ndCBzZXQgREYgZmxhZy4KKyAqIEFsc28gaW5jb21pbmcgSUNNUCBmcmFnX25lZWRlZCBub3RpZmljYXRpb25zIHdpbGwgYmUgaWdub3JlZCBvbgorICogdGhpcyBzb2NrZXQgdG8gcHJldmVudCBhY2NlcHRpbmcgc3Bvb2ZlZCBvbmVzLgorICovCisjZGVmaW5lIElQX1BNVFVESVNDX0lOVEVSRkFDRQkJNAorLyogd2Vha2VyIHZlcnNpb24gb2YgSVBfUE1UVURJU0NfSU5URVJGQUNFLCB3aGljaCBhbGxvcyBwYWNrZXRzIHRvIGdldAorICogZnJhZ21lbnRlZCBpZiB0aGV5IGV4ZWVkIHRoZSBpbnRlcmZhY2UgbXR1CisgKi8KKyNkZWZpbmUgSVBfUE1UVURJU0NfT01JVAkJNQorCisjZGVmaW5lIElQX01VTFRJQ0FTVF9JRgkJCTMyCisjZGVmaW5lIElQX01VTFRJQ0FTVF9UVEwgCQkzMworI2RlZmluZSBJUF9NVUxUSUNBU1RfTE9PUCAJCTM0CisjZGVmaW5lIElQX0FERF9NRU1CRVJTSElQCQkzNQorI2RlZmluZSBJUF9EUk9QX01FTUJFUlNISVAJCTM2CisjZGVmaW5lIElQX1VOQkxPQ0tfU09VUkNFCQkzNworI2RlZmluZSBJUF9CTE9DS19TT1VSQ0UJCQkzOAorI2RlZmluZSBJUF9BRERfU09VUkNFX01FTUJFUlNISVAJMzkKKyNkZWZpbmUgSVBfRFJPUF9TT1VSQ0VfTUVNQkVSU0hJUAk0MAorI2RlZmluZSBJUF9NU0ZJTFRFUgkJCTQxCisjZGVmaW5lIE1DQVNUX0pPSU5fR1JPVVAJCTQyCisjZGVmaW5lIE1DQVNUX0JMT0NLX1NPVVJDRQkJNDMKKyNkZWZpbmUgTUNBU1RfVU5CTE9DS19TT1VSQ0UJCTQ0CisjZGVmaW5lIE1DQVNUX0xFQVZFX0dST1VQCQk0NQorI2RlZmluZSBNQ0FTVF9KT0lOX1NPVVJDRV9HUk9VUAkJNDYKKyNkZWZpbmUgTUNBU1RfTEVBVkVfU09VUkNFX0dST1VQCTQ3CisjZGVmaW5lIE1DQVNUX01TRklMVEVSCQkJNDgKKyNkZWZpbmUgSVBfTVVMVElDQVNUX0FMTAkJNDkKKyNkZWZpbmUgSVBfVU5JQ0FTVF9JRgkJCTUwCisKKyNkZWZpbmUgTUNBU1RfRVhDTFVERQkwCisjZGVmaW5lIE1DQVNUX0lOQ0xVREUJMQorCisvKiBUaGVzZSBuZWVkIHRvIGFwcGVhciBzb21ld2hlcmUgYXJvdW5kIGhlcmUgKi8KKyNkZWZpbmUgSVBfREVGQVVMVF9NVUxUSUNBU1RfVFRMICAgICAgICAxCisjZGVmaW5lIElQX0RFRkFVTFRfTVVMVElDQVNUX0xPT1AgICAgICAgMQorCisvKiBSZXF1ZXN0IHN0cnVjdCBmb3IgbXVsdGljYXN0IHNvY2tldCBvcHMgKi8KKworI2lmIF9fVUFQSV9ERUZfSVBfTVJFUQorc3RydWN0IGlwX21yZXEgIHsKKwlzdHJ1Y3QgaW5fYWRkciBpbXJfbXVsdGlhZGRyOwkvKiBJUCBtdWx0aWNhc3QgYWRkcmVzcyBvZiBncm91cCAqLworCXN0cnVjdCBpbl9hZGRyIGltcl9pbnRlcmZhY2U7CS8qIGxvY2FsIElQIGFkZHJlc3Mgb2YgaW50ZXJmYWNlICovCit9OworCitzdHJ1Y3QgaXBfbXJlcW4geworCXN0cnVjdCBpbl9hZGRyCWltcl9tdWx0aWFkZHI7CQkvKiBJUCBtdWx0aWNhc3QgYWRkcmVzcyBvZiBncm91cCAqLworCXN0cnVjdCBpbl9hZGRyCWltcl9hZGRyZXNzOwkJLyogbG9jYWwgSVAgYWRkcmVzcyBvZiBpbnRlcmZhY2UgKi8KKwlpbnQJCWltcl9pZmluZGV4OwkJLyogSW50ZXJmYWNlIGluZGV4ICovCit9OworCitzdHJ1Y3QgaXBfbXJlcV9zb3VyY2UgeworCV9fYmUzMgkJaW1yX211bHRpYWRkcjsKKwlfX2JlMzIJCWltcl9pbnRlcmZhY2U7CisJX19iZTMyCQlpbXJfc291cmNlYWRkcjsKK307CisKK3N0cnVjdCBpcF9tc2ZpbHRlciB7CisJX19iZTMyCQlpbXNmX211bHRpYWRkcjsKKwlfX2JlMzIJCWltc2ZfaW50ZXJmYWNlOworCV9fdTMyCQlpbXNmX2Ztb2RlOworCV9fdTMyCQlpbXNmX251bXNyYzsKKwlfX2JlMzIJCWltc2Zfc2xpc3RbMV07Cit9OworCisjZGVmaW5lIElQX01TRklMVEVSX1NJWkUobnVtc3JjKSBcCisJKHNpemVvZihzdHJ1Y3QgaXBfbXNmaWx0ZXIpIC0gc2l6ZW9mKF9fdTMyKSBcCisJKyAobnVtc3JjKSAqIHNpemVvZihfX3UzMikpCisKK3N0cnVjdCBncm91cF9yZXEgeworCV9fdTMyCQkJCSBncl9pbnRlcmZhY2U7CS8qIGludGVyZmFjZSBpbmRleCAqLworCXN0cnVjdCBfX2tlcm5lbF9zb2NrYWRkcl9zdG9yYWdlIGdyX2dyb3VwOwkvKiBncm91cCBhZGRyZXNzICovCit9OworCitzdHJ1Y3QgZ3JvdXBfc291cmNlX3JlcSB7CisJX191MzIJCQkJIGdzcl9pbnRlcmZhY2U7CS8qIGludGVyZmFjZSBpbmRleCAqLworCXN0cnVjdCBfX2tlcm5lbF9zb2NrYWRkcl9zdG9yYWdlIGdzcl9ncm91cDsJLyogZ3JvdXAgYWRkcmVzcyAqLworCXN0cnVjdCBfX2tlcm5lbF9zb2NrYWRkcl9zdG9yYWdlIGdzcl9zb3VyY2U7CS8qIHNvdXJjZSBhZGRyZXNzICovCit9OworCitzdHJ1Y3QgZ3JvdXBfZmlsdGVyIHsKKwlfX3UzMgkJCQkgZ2ZfaW50ZXJmYWNlOwkvKiBpbnRlcmZhY2UgaW5kZXggKi8KKwlzdHJ1Y3QgX19rZXJuZWxfc29ja2FkZHJfc3RvcmFnZSBnZl9ncm91cDsJLyogbXVsdGljYXN0IGFkZHJlc3MgKi8KKwlfX3UzMgkJCQkgZ2ZfZm1vZGU7CS8qIGZpbHRlciBtb2RlICovCisJX191MzIJCQkJIGdmX251bXNyYzsJLyogbnVtYmVyIG9mIHNvdXJjZXMgKi8KKwlzdHJ1Y3QgX19rZXJuZWxfc29ja2FkZHJfc3RvcmFnZSBnZl9zbGlzdFsxXTsJLyogaW50ZXJmYWNlIGluZGV4ICovCit9OworCisjZGVmaW5lIEdST1VQX0ZJTFRFUl9TSVpFKG51bXNyYykgXAorCShzaXplb2Yoc3RydWN0IGdyb3VwX2ZpbHRlcikgLSBzaXplb2Yoc3RydWN0IF9fa2VybmVsX3NvY2thZGRyX3N0b3JhZ2UpIFwKKwkrIChudW1zcmMpICogc2l6ZW9mKHN0cnVjdCBfX2tlcm5lbF9zb2NrYWRkcl9zdG9yYWdlKSkKKyNlbmRpZgorCisjaWYgX19VQVBJX0RFRl9JTl9QS1RJTkZPCitzdHJ1Y3QgaW5fcGt0aW5mbyB7CisJaW50CQlpcGlfaWZpbmRleDsKKwlzdHJ1Y3QgaW5fYWRkcglpcGlfc3BlY19kc3Q7CisJc3RydWN0IGluX2FkZHIJaXBpX2FkZHI7Cit9OworI2VuZGlmCisKKy8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIGFuIEludGVybmV0IChJUCkgc29ja2V0IGFkZHJlc3MuICovCisjaWYgIF9fVUFQSV9ERUZfU09DS0FERFJfSU4KKyNkZWZpbmUgX19TT0NLX1NJWkVfXwkxNgkJLyogc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikJKi8KK3N0cnVjdCBzb2NrYWRkcl9pbiB7CisgIF9fa2VybmVsX3NhX2ZhbWlseV90CXNpbl9mYW1pbHk7CS8qIEFkZHJlc3MgZmFtaWx5CQkqLworICBfX2JlMTYJCXNpbl9wb3J0OwkvKiBQb3J0IG51bWJlcgkJCSovCisgIHN0cnVjdCBpbl9hZGRyCXNpbl9hZGRyOwkvKiBJbnRlcm5ldCBhZGRyZXNzCQkqLworCisgIC8qIFBhZCB0byBzaXplIG9mIGBzdHJ1Y3Qgc29ja2FkZHInLiAqLworICB1bnNpZ25lZCBjaGFyCQlfX3BhZFtfX1NPQ0tfU0laRV9fIC0gc2l6ZW9mKHNob3J0IGludCkgLQorCQkJc2l6ZW9mKHVuc2lnbmVkIHNob3J0IGludCkgLSBzaXplb2Yoc3RydWN0IGluX2FkZHIpXTsKK307CisjZGVmaW5lIHNpbl96ZXJvCV9fcGFkCQkvKiBmb3IgQlNEIFVOSVggY29tcC4gLUZ2SwkqLworI2VuZGlmCisKKyNpZiBfX1VBUElfREVGX0lOX0NMQVNTCisvKgorICogRGVmaW5pdGlvbnMgb2YgdGhlIGJpdHMgaW4gYW4gSW50ZXJuZXQgYWRkcmVzcyBpbnRlZ2VyLgorICogT24gc3VibmV0cywgaG9zdCBhbmQgbmV0d29yayBwYXJ0cyBhcmUgZm91bmQgYWNjb3JkaW5nCisgKiB0byB0aGUgc3VibmV0IG1hc2ssIG5vdCB0aGVzZSBtYXNrcy4KKyAqLworI2RlZmluZQlJTl9DTEFTU0EoYSkJCSgoKChsb25nIGludCkgKGEpKSAmIDB4ODAwMDAwMDApID09IDApCisjZGVmaW5lCUlOX0NMQVNTQV9ORVQJCTB4ZmYwMDAwMDAKKyNkZWZpbmUJSU5fQ0xBU1NBX05TSElGVAkyNAorI2RlZmluZQlJTl9DTEFTU0FfSE9TVAkJKDB4ZmZmZmZmZmYgJiB+SU5fQ0xBU1NBX05FVCkKKyNkZWZpbmUJSU5fQ0xBU1NBX01BWAkJMTI4CisKKyNkZWZpbmUJSU5fQ0xBU1NCKGEpCQkoKCgobG9uZyBpbnQpIChhKSkgJiAweGMwMDAwMDAwKSA9PSAweDgwMDAwMDAwKQorI2RlZmluZQlJTl9DTEFTU0JfTkVUCQkweGZmZmYwMDAwCisjZGVmaW5lCUlOX0NMQVNTQl9OU0hJRlQJMTYKKyNkZWZpbmUJSU5fQ0xBU1NCX0hPU1QJCSgweGZmZmZmZmZmICYgfklOX0NMQVNTQl9ORVQpCisjZGVmaW5lCUlOX0NMQVNTQl9NQVgJCTY1NTM2CisKKyNkZWZpbmUJSU5fQ0xBU1NDKGEpCQkoKCgobG9uZyBpbnQpIChhKSkgJiAweGUwMDAwMDAwKSA9PSAweGMwMDAwMDAwKQorI2RlZmluZQlJTl9DTEFTU0NfTkVUCQkweGZmZmZmZjAwCisjZGVmaW5lCUlOX0NMQVNTQ19OU0hJRlQJOAorI2RlZmluZQlJTl9DTEFTU0NfSE9TVAkJKDB4ZmZmZmZmZmYgJiB+SU5fQ0xBU1NDX05FVCkKKworI2RlZmluZQlJTl9DTEFTU0QoYSkJCSgoKChsb25nIGludCkgKGEpKSAmIDB4ZjAwMDAwMDApID09IDB4ZTAwMDAwMDApCisjZGVmaW5lCUlOX01VTFRJQ0FTVChhKQkJSU5fQ0xBU1NEKGEpCisjZGVmaW5lIElOX01VTFRJQ0FTVF9ORVQJMHhGMDAwMDAwMAorCisjZGVmaW5lCUlOX0VYUEVSSU1FTlRBTChhKQkoKCgobG9uZyBpbnQpIChhKSkgJiAweGYwMDAwMDAwKSA9PSAweGYwMDAwMDAwKQorI2RlZmluZQlJTl9CQURDTEFTUyhhKQkJSU5fRVhQRVJJTUVOVEFMKChhKSkKKworLyogQWRkcmVzcyB0byBhY2NlcHQgYW55IGluY29taW5nIG1lc3NhZ2VzLiAqLworI2RlZmluZQlJTkFERFJfQU5ZCQkoKHVuc2lnbmVkIGxvbmcgaW50KSAweDAwMDAwMDAwKQorCisvKiBBZGRyZXNzIHRvIHNlbmQgdG8gYWxsIGhvc3RzLiAqLworI2RlZmluZQlJTkFERFJfQlJPQURDQVNUCSgodW5zaWduZWQgbG9uZyBpbnQpIDB4ZmZmZmZmZmYpCisKKy8qIEFkZHJlc3MgaW5kaWNhdGluZyBhbiBlcnJvciByZXR1cm4uICovCisjZGVmaW5lCUlOQUREUl9OT05FCQkoKHVuc2lnbmVkIGxvbmcgaW50KSAweGZmZmZmZmZmKQorCisvKiBOZXR3b3JrIG51bWJlciBmb3IgbG9jYWwgaG9zdCBsb29wYmFjay4gKi8KKyNkZWZpbmUJSU5fTE9PUEJBQ0tORVQJCTEyNworCisvKiBBZGRyZXNzIHRvIGxvb3BiYWNrIGluIHNvZnR3YXJlIHRvIGxvY2FsIGhvc3QuICAqLworI2RlZmluZQlJTkFERFJfTE9PUEJBQ0sJCTB4N2YwMDAwMDEJLyogMTI3LjAuMC4xICAgKi8KKyNkZWZpbmUJSU5fTE9PUEJBQ0soYSkJCSgoKChsb25nIGludCkgKGEpKSAmIDB4ZmYwMDAwMDApID09IDB4N2YwMDAwMDApCisKKy8qIERlZmluZXMgZm9yIE11bHRpY2FzdCBJTkFERFIgKi8KKyNkZWZpbmUgSU5BRERSX1VOU1BFQ19HUk9VUCAgIAkweGUwMDAwMDAwVQkvKiAyMjQuMC4wLjAgICAqLworI2RlZmluZSBJTkFERFJfQUxMSE9TVFNfR1JPVVAgCTB4ZTAwMDAwMDFVCS8qIDIyNC4wLjAuMSAgICovCisjZGVmaW5lIElOQUREUl9BTExSVFJTX0dST1VQICAgIDB4ZTAwMDAwMDJVCS8qIDIyNC4wLjAuMiAqLworI2RlZmluZSBJTkFERFJfTUFYX0xPQ0FMX0dST1VQICAweGUwMDAwMGZmVQkvKiAyMjQuMC4wLjI1NSAqLworI2VuZGlmCisKKy8qIDxhc20vYnl0ZW9yZGVyLmg+IGNvbnRhaW5zIHRoZSBodG9ubCB0eXBlIHN0dWZmLi4gKi8KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+IAorCisKKyNlbmRpZiAvKiBfTElOVVhfSU5fSCAqLwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9pbjYuaCBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvaW42LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE1YjY2ZAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvaW42LmgKQEAgLTAsMCArMSwyOTQgQEAKKy8qCisgKglUeXBlcyBhbmQgZGVmaW5pdGlvbnMgZm9yIEFGX0lORVQ2IAorICoJTGludXggSU5FVDYgaW1wbGVtZW50YXRpb24gCisgKgorICoJQXV0aG9yczoKKyAqCVBlZHJvIFJvcXVlCQk8cm9xdWVAZGkuZmMudWwucHQ+CQorICoKKyAqCVNvdXJjZXM6CisgKglJUHY2IFByb2dyYW0gSW50ZXJmYWNlcyBmb3IgQlNEIFN5c3RlbXMKKyAqICAgICAgPGRyYWZ0LWlldGYtaXBuZ3dnLWJzZC1hcGktMDUudHh0PgorICoKKyAqCUFkdmFuY2VkIFNvY2tldHMgQVBJIGZvciBJUHY2CisgKgk8ZHJhZnQtc3RldmVucy1hZHZhbmNlZC1hcGktMDAudHh0PgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfTElOVVhfSU42X0gKKyNkZWZpbmUgX0xJTlVYX0lONl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpYmMtY29tcGF0Lmg+CisKKy8qCisgKglJUHY2IGFkZHJlc3Mgc3RydWN0dXJlCisgKi8KKworI2lmIF9fVUFQSV9ERUZfSU42X0FERFIKK3N0cnVjdCBpbjZfYWRkciB7CisJdW5pb24geworCQlfX3U4CQl1Nl9hZGRyOFsxNl07CisjaWYgX19VQVBJX0RFRl9JTjZfQUREUl9BTFQKKwkJX19iZTE2CQl1Nl9hZGRyMTZbOF07CisJCV9fYmUzMgkJdTZfYWRkcjMyWzRdOworI2VuZGlmCisJfSBpbjZfdTsKKyNkZWZpbmUgczZfYWRkcgkJCWluNl91LnU2X2FkZHI4CisjaWYgX19VQVBJX0RFRl9JTjZfQUREUl9BTFQKKyNkZWZpbmUgczZfYWRkcjE2CQlpbjZfdS51Nl9hZGRyMTYKKyNkZWZpbmUgczZfYWRkcjMyCQlpbjZfdS51Nl9hZGRyMzIKKyNlbmRpZgorfTsKKyNlbmRpZiAvKiBfX1VBUElfREVGX0lONl9BRERSICovCisKKyNpZiBfX1VBUElfREVGX1NPQ0tBRERSX0lONgorc3RydWN0IHNvY2thZGRyX2luNiB7CisJdW5zaWduZWQgc2hvcnQgaW50CXNpbjZfZmFtaWx5OyAgICAvKiBBRl9JTkVUNiAqLworCV9fYmUxNgkJCXNpbjZfcG9ydDsgICAgICAvKiBUcmFuc3BvcnQgbGF5ZXIgcG9ydCAjICovCisJX19iZTMyCQkJc2luNl9mbG93aW5mbzsgIC8qIElQdjYgZmxvdyBpbmZvcm1hdGlvbiAqLworCXN0cnVjdCBpbjZfYWRkcgkJc2luNl9hZGRyOyAgICAgIC8qIElQdjYgYWRkcmVzcyAqLworCV9fdTMyCQkJc2luNl9zY29wZV9pZDsgIC8qIHNjb3BlIGlkIChuZXcgaW4gUkZDMjU1MykgKi8KK307CisjZW5kaWYgLyogX19VQVBJX0RFRl9TT0NLQUREUl9JTjYgKi8KKworI2lmIF9fVUFQSV9ERUZfSVBWNl9NUkVRCitzdHJ1Y3QgaXB2Nl9tcmVxIHsKKwkvKiBJUHY2IG11bHRpY2FzdCBhZGRyZXNzIG9mIGdyb3VwICovCisJc3RydWN0IGluNl9hZGRyIGlwdjZtcl9tdWx0aWFkZHI7CisKKwkvKiBsb2NhbCBJUHY2IGFkZHJlc3Mgb2YgaW50ZXJmYWNlICovCisJaW50CQlpcHY2bXJfaWZpbmRleDsKK307CisjZW5kaWYgLyogX19VQVBJX0RFRl9JVlA2X01SRVEgKi8KKworI2RlZmluZSBpcHY2bXJfYWNhZGRyCWlwdjZtcl9tdWx0aWFkZHIKKworc3RydWN0IGluNl9mbG93bGFiZWxfcmVxIHsKKwlzdHJ1Y3QgaW42X2FkZHIJZmxyX2RzdDsKKwlfX2JlMzIJZmxyX2xhYmVsOworCV9fdTgJZmxyX2FjdGlvbjsKKwlfX3U4CWZscl9zaGFyZTsKKwlfX3UxNglmbHJfZmxhZ3M7CisJX191MTYgCWZscl9leHBpcmVzOworCV9fdTE2CWZscl9saW5nZXI7CisJX191MzIJX19mbHJfcGFkOworCS8qIE9wdGlvbnMgaW4gZm9ybWF0IG9mIElQVjZfUEtUT1BUSU9OUyAqLworfTsKKworI2RlZmluZSBJUFY2X0ZMX0FfR0VUCTAKKyNkZWZpbmUgSVBWNl9GTF9BX1BVVAkxCisjZGVmaW5lIElQVjZfRkxfQV9SRU5FVwkyCisKKyNkZWZpbmUgSVBWNl9GTF9GX0NSRUFURQkxCisjZGVmaW5lIElQVjZfRkxfRl9FWENMCQkyCisjZGVmaW5lIElQVjZfRkxfRl9SRUZMRUNUCTQKKyNkZWZpbmUgSVBWNl9GTF9GX1JFTU9URQk4CisKKyNkZWZpbmUgSVBWNl9GTF9TX05PTkUJCTAKKyNkZWZpbmUgSVBWNl9GTF9TX0VYQ0wJCTEKKyNkZWZpbmUgSVBWNl9GTF9TX1BST0NFU1MJMgorI2RlZmluZSBJUFY2X0ZMX1NfVVNFUgkJMworI2RlZmluZSBJUFY2X0ZMX1NfQU5ZCQkyNTUKKworCisvKgorICoJQml0bWFzayBjb25zdGFudCBkZWNsYXJhdGlvbnMgdG8gaGVscCBhcHBsaWNhdGlvbnMgc2VsZWN0IG91dCB0aGUgCisgKglmbG93IGxhYmVsIGFuZCBwcmlvcml0eSBmaWVsZHMuCisgKgorICoJTm90ZSB0aGF0IHRoaXMgYXJlIGluIGhvc3QgYnl0ZSBvcmRlciB3aGlsZSB0aGUgZmxvd2luZm8gZmllbGQgb2YKKyAqCXNvY2thZGRyX2luNiBpcyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgKi8KKworI2RlZmluZSBJUFY2X0ZMT1dJTkZPX0ZMT1dMQUJFTAkJMHgwMDBmZmZmZgorI2RlZmluZSBJUFY2X0ZMT1dJTkZPX1BSSU9SSVRZCQkweDBmZjAwMDAwCisKKy8qIFRoZXNlIGRlZmluaXRpb25zIGFyZSBvYnNvbGV0ZSAqLworI2RlZmluZSBJUFY2X1BSSU9SSVRZX1VOQ0hBUkFDVEVSSVpFRAkweDAwMDAKKyNkZWZpbmUgSVBWNl9QUklPUklUWV9GSUxMRVIJCTB4MDEwMAorI2RlZmluZSBJUFY2X1BSSU9SSVRZX1VOQVRURU5ERUQJMHgwMjAwCisjZGVmaW5lIElQVjZfUFJJT1JJVFlfUkVTRVJWRUQxCQkweDAzMDAKKyNkZWZpbmUgSVBWNl9QUklPUklUWV9CVUxLCQkweDA0MDAKKyNkZWZpbmUgSVBWNl9QUklPUklUWV9SRVNFUlZFRDIJCTB4MDUwMAorI2RlZmluZSBJUFY2X1BSSU9SSVRZX0lOVEVSQUNUSVZFCTB4MDYwMAorI2RlZmluZSBJUFY2X1BSSU9SSVRZX0NPTlRST0wJCTB4MDcwMAorI2RlZmluZSBJUFY2X1BSSU9SSVRZXzgJCQkweDA4MDAKKyNkZWZpbmUgSVBWNl9QUklPUklUWV85CQkJMHgwOTAwCisjZGVmaW5lIElQVjZfUFJJT1JJVFlfMTAJCTB4MGEwMAorI2RlZmluZSBJUFY2X1BSSU9SSVRZXzExCQkweDBiMDAKKyNkZWZpbmUgSVBWNl9QUklPUklUWV8xMgkJMHgwYzAwCisjZGVmaW5lIElQVjZfUFJJT1JJVFlfMTMJCTB4MGQwMAorI2RlZmluZSBJUFY2X1BSSU9SSVRZXzE0CQkweDBlMDAKKyNkZWZpbmUgSVBWNl9QUklPUklUWV8xNQkJMHgwZjAwCisKKy8qCisgKglJUFY2IGV4dGVuc2lvbiBoZWFkZXJzCisgKi8KKyNpZiBfX1VBUElfREVGX0lQUFJPVE9fVjYKKyNkZWZpbmUgSVBQUk9UT19IT1BPUFRTCQkwCS8qIElQdjYgaG9wLWJ5LWhvcCBvcHRpb25zCSovCisjZGVmaW5lIElQUFJPVE9fUk9VVElORwkJNDMJLyogSVB2NiByb3V0aW5nIGhlYWRlcgkJKi8KKyNkZWZpbmUgSVBQUk9UT19GUkFHTUVOVAk0NAkvKiBJUHY2IGZyYWdtZW50YXRpb24gaGVhZGVyCSovCisjZGVmaW5lIElQUFJPVE9fSUNNUFY2CQk1OAkvKiBJQ01QdjYJCQkqLworI2RlZmluZSBJUFBST1RPX05PTkUJCTU5CS8qIElQdjYgbm8gbmV4dCBoZWFkZXIJCSovCisjZGVmaW5lIElQUFJPVE9fRFNUT1BUUwkJNjAJLyogSVB2NiBkZXN0aW5hdGlvbiBvcHRpb25zCSovCisjZGVmaW5lIElQUFJPVE9fTUgJCTEzNQkvKiBJUHY2IG1vYmlsaXR5IGhlYWRlcgkJKi8KKyNlbmRpZiAvKiBfX1VBUElfREVGX0lQUFJPVE9fVjYgKi8KKworLyoKKyAqCUlQdjYgVExWIG9wdGlvbnMuCisgKi8KKyNkZWZpbmUgSVBWNl9UTFZfUEFEMQkJMAorI2RlZmluZSBJUFY2X1RMVl9QQUROCQkxCisjZGVmaW5lIElQVjZfVExWX1JPVVRFUkFMRVJUCTUKKyNkZWZpbmUgSVBWNl9UTFZfSlVNQk8JCTE5NAorI2RlZmluZSBJUFY2X1RMVl9IQU8JCTIwMQkvKiBob21lIGFkZHJlc3Mgb3B0aW9uICovCisKKy8qCisgKglJUFY2IHNvY2tldCBvcHRpb25zCisgKi8KKyNpZiBfX1VBUElfREVGX0lQVjZfT1BUSU9OUworI2RlZmluZSBJUFY2X0FERFJGT1JNCQkxCisjZGVmaW5lIElQVjZfMjI5MlBLVElORk8JMgorI2RlZmluZSBJUFY2XzIyOTJIT1BPUFRTCTMKKyNkZWZpbmUgSVBWNl8yMjkyRFNUT1BUUwk0CisjZGVmaW5lIElQVjZfMjI5MlJUSERSCQk1CisjZGVmaW5lIElQVjZfMjI5MlBLVE9QVElPTlMJNgorI2RlZmluZSBJUFY2X0NIRUNLU1VNCQk3CisjZGVmaW5lIElQVjZfMjI5MkhPUExJTUlUCTgKKyNkZWZpbmUgSVBWNl9ORVhUSE9QCQk5CisjZGVmaW5lIElQVjZfQVVUSEhEUgkJMTAJLyogb2Jzb2xldGUgKi8KKyNkZWZpbmUgSVBWNl9GTE9XSU5GTwkJMTEKKworI2RlZmluZSBJUFY2X1VOSUNBU1RfSE9QUwkxNgorI2RlZmluZSBJUFY2X01VTFRJQ0FTVF9JRgkxNworI2RlZmluZSBJUFY2X01VTFRJQ0FTVF9IT1BTCTE4CisjZGVmaW5lIElQVjZfTVVMVElDQVNUX0xPT1AJMTkKKyNkZWZpbmUgSVBWNl9BRERfTUVNQkVSU0hJUAkyMAorI2RlZmluZSBJUFY2X0RST1BfTUVNQkVSU0hJUAkyMQorI2RlZmluZSBJUFY2X1JPVVRFUl9BTEVSVAkyMgorI2RlZmluZSBJUFY2X01UVV9ESVNDT1ZFUgkyMworI2RlZmluZSBJUFY2X01UVQkJMjQKKyNkZWZpbmUgSVBWNl9SRUNWRVJSCQkyNQorI2RlZmluZSBJUFY2X1Y2T05MWQkJMjYKKyNkZWZpbmUgSVBWNl9KT0lOX0FOWUNBU1QJMjcKKyNkZWZpbmUgSVBWNl9MRUFWRV9BTllDQVNUCTI4CisKKy8qIElQVjZfTVRVX0RJU0NPVkVSIHZhbHVlcyAqLworI2RlZmluZSBJUFY2X1BNVFVESVNDX0RPTlQJCTAKKyNkZWZpbmUgSVBWNl9QTVRVRElTQ19XQU5UCQkxCisjZGVmaW5lIElQVjZfUE1UVURJU0NfRE8JCTIKKyNkZWZpbmUgSVBWNl9QTVRVRElTQ19QUk9CRQkJMworLyogc2FtZSBhcyBJUFY2X1BNVFVESVNDX1BST0JFLCBwcm92aWRlZCBmb3Igc3ltZXRyeSB3aXRoIElQdjQKKyAqIGFsc28gc2VlIGNvbW1lbnRzIG9uIElQX1BNVFVESVNDX0lOVEVSRkFDRQorICovCisjZGVmaW5lIElQVjZfUE1UVURJU0NfSU5URVJGQUNFCQk0CisvKiB3ZWFrZXIgdmVyc2lvbiBvZiBJUFY2X1BNVFVESVNDX0lOVEVSRkFDRSwgd2hpY2ggYWxsb3dzIHBhY2tldHMgdG8KKyAqIGdldCBmcmFnbWVudGVkIGlmIHRoZXkgZXhjZWVkIHRoZSBpbnRlcmZhY2UgbXR1CisgKi8KKyNkZWZpbmUgSVBWNl9QTVRVRElTQ19PTUlUCQk1CisKKy8qIEZsb3dsYWJlbCAqLworI2RlZmluZSBJUFY2X0ZMT1dMQUJFTF9NR1IJMzIKKyNkZWZpbmUgSVBWNl9GTE9XSU5GT19TRU5ECTMzCisKKyNkZWZpbmUgSVBWNl9JUFNFQ19QT0xJQ1kJMzQKKyNkZWZpbmUgSVBWNl9YRlJNX1BPTElDWQkzNQorI2RlZmluZSBJUFY2X0hEUklOQ0wJCTM2CisjZW5kaWYKKworLyoKKyAqIE11bHRpY2FzdDoKKyAqIEZvbGxvd2luZyBzb2NrZXQgb3B0aW9ucyBhcmUgc2hhcmVkIGJldHdlZW4gSVB2NCBhbmQgSVB2Ni4KKyAqCisgKiBNQ0FTVF9KT0lOX0dST1VQCQk0MgorICogTUNBU1RfQkxPQ0tfU09VUkNFCQk0MworICogTUNBU1RfVU5CTE9DS19TT1VSQ0UJCTQ0CisgKiBNQ0FTVF9MRUFWRV9HUk9VUAkJNDUKKyAqIE1DQVNUX0pPSU5fU09VUkNFX0dST1VQCTQ2CisgKiBNQ0FTVF9MRUFWRV9TT1VSQ0VfR1JPVVAJNDcKKyAqIE1DQVNUX01TRklMVEVSCQk0OAorICovCisKKy8qCisgKiBBZHZhbmNlZCBBUEkgKFJGQzM1NDIpICgxKQorICoKKyAqIE5vdGU6IElQVjZfUkVDVlJUSERSRFNUT1BUUyBkb2VzIG5vdCBleGlzdC4gc2VlIG5ldC9pcHY2L2RhdGFncmFtLmMuCisgKi8KKworI2RlZmluZSBJUFY2X1JFQ1ZQS1RJTkZPCTQ5CisjZGVmaW5lIElQVjZfUEtUSU5GTwkJNTAKKyNkZWZpbmUgSVBWNl9SRUNWSE9QTElNSVQJNTEKKyNkZWZpbmUgSVBWNl9IT1BMSU1JVAkJNTIKKyNkZWZpbmUgSVBWNl9SRUNWSE9QT1BUUwk1MworI2RlZmluZSBJUFY2X0hPUE9QVFMJCTU0CisjZGVmaW5lIElQVjZfUlRIRFJEU1RPUFRTCTU1CisjZGVmaW5lIElQVjZfUkVDVlJUSERSCQk1NgorI2RlZmluZSBJUFY2X1JUSERSCQk1NworI2RlZmluZSBJUFY2X1JFQ1ZEU1RPUFRTCTU4CisjZGVmaW5lIElQVjZfRFNUT1BUUwkJNTkKKyNkZWZpbmUgSVBWNl9SRUNWUEFUSE1UVQk2MAorI2RlZmluZSBJUFY2X1BBVEhNVFUJCTYxCisjZGVmaW5lIElQVjZfRE9OVEZSQUcJCTYyCisjaWYgMAkvKiBub3QgeWV0ICovCisjZGVmaW5lIElQVjZfVVNFX01JTl9NVFUJNjMKKyNlbmRpZgorCisvKgorICogTmV0ZmlsdGVyICgxKQorICoKKyAqIEZvbGxvd2luZyBzb2NrZXQgb3B0aW9ucyBhcmUgdXNlZCBpbiBpcDZfdGFibGVzOworICogc2VlIGluY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oLgorICoKKyAqIElQNlRfU09fU0VUX1JFUExBQ0UgLyBJUDZUX1NPX0dFVF9JTkZPCQk2NAorICogSVA2VF9TT19TRVRfQUREX0NPVU5URVJTIC8gSVA2VF9TT19HRVRfRU5UUklFUwk2NQorICovCisKKy8qCisgKiBBZHZhbmNlZCBBUEkgKFJGQzM1NDIpICgyKQorICovCisjZGVmaW5lIElQVjZfUkVDVlRDTEFTUwkJNjYKKyNkZWZpbmUgSVBWNl9UQ0xBU1MJCTY3CisKKy8qCisgKiBOZXRmaWx0ZXIgKDIpCisgKgorICogRm9sbG93aW5nIHNvY2tldCBvcHRpb25zIGFyZSB1c2VkIGluIGlwNl90YWJsZXM7CisgKiBzZWUgaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmguCisgKgorICogSVA2VF9TT19HRVRfUkVWSVNJT05fTUFUQ0gJNjgKKyAqIElQNlRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAk2OQorICogSVA2VF9TT19PUklHSU5BTF9EU1QJCTgwCisgKi8KKworI2RlZmluZSBJUFY2X0FVVE9GTE9XTEFCRUwJNzAKKy8qIFJGQzUwMTQ6IFNvdXJjZSBhZGRyZXNzIHNlbGVjdGlvbiAqLworI2RlZmluZSBJUFY2X0FERFJfUFJFRkVSRU5DRVMJNzIKKworI2RlZmluZSBJUFY2X1BSRUZFUl9TUkNfVE1QCQkweDAwMDEKKyNkZWZpbmUgSVBWNl9QUkVGRVJfU1JDX1BVQkxJQwkJMHgwMDAyCisjZGVmaW5lIElQVjZfUFJFRkVSX1NSQ19QVUJUTVBfREVGQVVMVAkweDAxMDAKKyNkZWZpbmUgSVBWNl9QUkVGRVJfU1JDX0NPQQkJMHgwMDA0CisjZGVmaW5lIElQVjZfUFJFRkVSX1NSQ19IT01FCQkweDA0MDAKKyNkZWZpbmUgSVBWNl9QUkVGRVJfU1JDX0NHQQkJMHgwMDA4CisjZGVmaW5lIElQVjZfUFJFRkVSX1NSQ19OT05DR0EJCTB4MDgwMAorCisvKiBSRkM1MDgyOiBHZW5lcmFsaXplZCBUdGwgU2VjdXJpdHkgTWVjaGFuaXNtICovCisjZGVmaW5lIElQVjZfTUlOSE9QQ09VTlQJCTczCisKKyNkZWZpbmUgSVBWNl9PUklHRFNUQUREUiAgICAgICAgNzQKKyNkZWZpbmUgSVBWNl9SRUNWT1JJR0RTVEFERFIgICAgSVBWNl9PUklHRFNUQUREUgorI2RlZmluZSBJUFY2X1RSQU5TUEFSRU5UICAgICAgICA3NQorI2RlZmluZSBJUFY2X1VOSUNBU1RfSUYgICAgICAgICA3NgorCisvKgorICogTXVsdGljYXN0IFJvdXRpbmc6CisgKiBzZWUgaW5jbHVkZS91YXBpL2xpbnV4L21yb3V0ZTYuaC4KKyAqCisgKiBNUlQ2X0JBU0UJCQkyMDAKKyAqIC4uLgorICogTVJUNl9NQVgKKyAqLworI2VuZGlmIC8qIF9MSU5VWF9JTjZfSCAqLwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9pbmV0X2RpYWcuaCBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvaW5ldF9kaWFnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRiNDExNgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvaW5ldF9kaWFnLmgKQEAgLTAsMCArMSwxNTIgQEAKKyNpZm5kZWYgX0lORVRfRElBR19IXworI2RlZmluZSBfSU5FVF9ESUFHX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBKdXN0IHNvbWUgcmFuZG9tIG51bWJlciAqLworI2RlZmluZSBUQ1BESUFHX0dFVFNPQ0sgMTgKKyNkZWZpbmUgRENDUERJQUdfR0VUU09DSyAxOQorCisjZGVmaW5lIElORVRfRElBR19HRVRTT0NLX01BWCAyNAorCisvKiBTb2NrZXQgaWRlbnRpdHkgKi8KK3N0cnVjdCBpbmV0X2RpYWdfc29ja2lkIHsKKwlfX2JlMTYJaWRpYWdfc3BvcnQ7CisJX19iZTE2CWlkaWFnX2Rwb3J0OworCV9fYmUzMglpZGlhZ19zcmNbNF07CisJX19iZTMyCWlkaWFnX2RzdFs0XTsKKwlfX3UzMglpZGlhZ19pZjsKKwlfX3UzMglpZGlhZ19jb29raWVbMl07CisjZGVmaW5lIElORVRfRElBR19OT0NPT0tJRSAofjBVKQorfTsKKworLyogUmVxdWVzdCBzdHJ1Y3R1cmUgKi8KKworc3RydWN0IGluZXRfZGlhZ19yZXEgeworCV9fdTgJaWRpYWdfZmFtaWx5OwkJLyogRmFtaWx5IG9mIGFkZHJlc3Nlcy4gKi8KKwlfX3U4CWlkaWFnX3NyY19sZW47CisJX191OAlpZGlhZ19kc3RfbGVuOworCV9fdTgJaWRpYWdfZXh0OwkJLyogUXVlcnkgZXh0ZW5kZWQgaW5mb3JtYXRpb24gKi8KKworCXN0cnVjdCBpbmV0X2RpYWdfc29ja2lkIGlkOworCisJX191MzIJaWRpYWdfc3RhdGVzOwkJLyogU3RhdGVzIHRvIGR1bXAgKi8KKwlfX3UzMglpZGlhZ19kYnM7CQkvKiBUYWJsZXMgdG8gZHVtcCAoTkkpICovCit9OworCitzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiB7CisJX191OAlzZGlhZ19mYW1pbHk7CisJX191OAlzZGlhZ19wcm90b2NvbDsKKwlfX3U4CWlkaWFnX2V4dDsKKwlfX3U4CXBhZDsKKwlfX3UzMglpZGlhZ19zdGF0ZXM7CisJc3RydWN0IGluZXRfZGlhZ19zb2NraWQgaWQ7Cit9OworCitlbnVtIHsKKwlJTkVUX0RJQUdfUkVRX05PTkUsCisJSU5FVF9ESUFHX1JFUV9CWVRFQ09ERSwKK307CisKKyNkZWZpbmUgSU5FVF9ESUFHX1JFUV9NQVggSU5FVF9ESUFHX1JFUV9CWVRFQ09ERQorCisvKiBCeXRlY29kZSBpcyBzZXF1ZW5jZSBvZiA0IGJ5dGUgY29tbWFuZHMgZm9sbG93ZWQgYnkgdmFyaWFibGUgYXJndW1lbnRzLgorICogQWxsIHRoZSBjb21tYW5kcyBpZGVudGlmaWVkIGJ5ICJjb2RlIiBhcmUgY29uZGl0aW9uYWwganVtcHMgZm9yd2FyZDoKKyAqIHRvIG9mZnNldCBjYysieWVzIiBvciB0byBvZmZzZXQgY2MrIm5vIi4gInllcyIgaXMgc3VwcG9zZWQgdG8gYmUKKyAqIGxlbmd0aCBvZiB0aGUgY29tbWFuZCBhbmQgaXRzIGFyZ3VtZW50cy4KKyAqLworIAorc3RydWN0IGluZXRfZGlhZ19iY19vcCB7CisJdW5zaWduZWQgY2hhcgljb2RlOworCXVuc2lnbmVkIGNoYXIJeWVzOworCXVuc2lnbmVkIHNob3J0CW5vOworfTsKKworZW51bSB7CisJSU5FVF9ESUFHX0JDX05PUCwKKwlJTkVUX0RJQUdfQkNfSk1QLAorCUlORVRfRElBR19CQ19TX0dFLAorCUlORVRfRElBR19CQ19TX0xFLAorCUlORVRfRElBR19CQ19EX0dFLAorCUlORVRfRElBR19CQ19EX0xFLAorCUlORVRfRElBR19CQ19BVVRPLAorCUlORVRfRElBR19CQ19TX0NPTkQsCisJSU5FVF9ESUFHX0JDX0RfQ09ORCwKK307CisKK3N0cnVjdCBpbmV0X2RpYWdfaG9zdGNvbmQgeworCV9fdTgJZmFtaWx5OworCV9fdTgJcHJlZml4X2xlbjsKKwlpbnQJcG9ydDsKKwlfX2JlMzIJYWRkclswXTsKK307CisKKy8qIEJhc2UgaW5mbyBzdHJ1Y3R1cmUuIEl0IGNvbnRhaW5zIHNvY2tldCBpZGVudGl0eSAoYWRkcnMvcG9ydHMvY29va2llKQorICogYW5kLCBhbGFzLCB0aGUgaW5mb3JtYXRpb24gc2hvd24gYnkgbmV0c3RhdC4gKi8KK3N0cnVjdCBpbmV0X2RpYWdfbXNnIHsKKwlfX3U4CWlkaWFnX2ZhbWlseTsKKwlfX3U4CWlkaWFnX3N0YXRlOworCV9fdTgJaWRpYWdfdGltZXI7CisJX191OAlpZGlhZ19yZXRyYW5zOworCisJc3RydWN0IGluZXRfZGlhZ19zb2NraWQgaWQ7CisKKwlfX3UzMglpZGlhZ19leHBpcmVzOworCV9fdTMyCWlkaWFnX3JxdWV1ZTsKKwlfX3UzMglpZGlhZ193cXVldWU7CisJX191MzIJaWRpYWdfdWlkOworCV9fdTMyCWlkaWFnX2lub2RlOworfTsKKworLyogRXh0ZW5zaW9ucyAqLworCitlbnVtIHsKKwlJTkVUX0RJQUdfTk9ORSwKKwlJTkVUX0RJQUdfTUVNSU5GTywKKwlJTkVUX0RJQUdfSU5GTywKKwlJTkVUX0RJQUdfVkVHQVNJTkZPLAorCUlORVRfRElBR19DT05HLAorCUlORVRfRElBR19UT1MsCisJSU5FVF9ESUFHX1RDTEFTUywKKwlJTkVUX0RJQUdfU0tNRU1JTkZPLAorCUlORVRfRElBR19TSFVURE9XTiwKKwlJTkVUX0RJQUdfRENUQ1BJTkZPLAorCUlORVRfRElBR19QUk9UT0NPTCwgIC8qIHJlc3BvbnNlIGF0dHJpYnV0ZSBvbmx5ICovCisJSU5FVF9ESUFHX1NLVjZPTkxZLAorfTsKKworI2RlZmluZSBJTkVUX0RJQUdfTUFYIElORVRfRElBR19TS1Y2T05MWQorCisvKiBJTkVUX0RJQUdfTUVNICovCisKK3N0cnVjdCBpbmV0X2RpYWdfbWVtaW5mbyB7CisJX191MzIJaWRpYWdfcm1lbTsKKwlfX3UzMglpZGlhZ193bWVtOworCV9fdTMyCWlkaWFnX2ZtZW07CisJX191MzIJaWRpYWdfdG1lbTsKK307CisKKy8qIElORVRfRElBR19WRUdBU0lORk8gKi8KKworc3RydWN0IHRjcHZlZ2FzX2luZm8geworCV9fdTMyCXRjcHZfZW5hYmxlZDsKKwlfX3UzMgl0Y3B2X3J0dGNudDsKKwlfX3UzMgl0Y3B2X3J0dDsKKwlfX3UzMgl0Y3B2X21pbnJ0dDsKK307CisKKy8qIElORVRfRElBR19EQ1RDUElORk8gKi8KKworc3RydWN0IHRjcF9kY3RjcF9pbmZvIHsKKwlfX3UxNglkY3RjcF9lbmFibGVkOworCV9fdTE2CWRjdGNwX2NlX3N0YXRlOworCV9fdTMyCWRjdGNwX2FscGhhOworCV9fdTMyCWRjdGNwX2FiX2VjbjsKKwlfX3UzMglkY3RjcF9hYl90b3Q7Cit9OworCit1bmlvbiB0Y3BfY2NfaW5mbyB7CisJc3RydWN0IHRjcHZlZ2FzX2luZm8JdmVnYXM7CisJc3RydWN0IHRjcF9kY3RjcF9pbmZvCWRjdGNwOworfTsKKyNlbmRpZiAvKiBfSU5FVF9ESUFHX0hfICovCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L2lwNl90dW5uZWwuaCBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvaXA2X3R1bm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YWY2M2MKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L2lwNl90dW5uZWwuaApAQCAtMCwwICsxLDUxIEBACisjaWZuZGVmIF9JUDZfVFVOTkVMX0gKKyNkZWZpbmUgX0lQNl9UVU5ORUxfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBJUFY2X1RMVl9UTkxfRU5DQVBfTElNSVQgNAorI2RlZmluZSBJUFY2X0RFRkFVTFRfVE5MX0VOQ0FQX0xJTUlUIDQKKworLyogZG9uJ3QgYWRkIGVuY2Fwc3VsYXRpb24gbGltaXQgaWYgb25lIGlzbid0IHByZXNlbnQgaW4gaW5uZXIgcGFja2V0ICovCisjZGVmaW5lIElQNl9UTkxfRl9JR05fRU5DQVBfTElNSVQgMHgxCisvKiBjb3B5IHRoZSB0cmFmZmljIGNsYXNzIGZpZWxkIGZyb20gdGhlIGlubmVyIHBhY2tldCAqLworI2RlZmluZSBJUDZfVE5MX0ZfVVNFX09SSUdfVENMQVNTIDB4MgorLyogY29weSB0aGUgZmxvd2xhYmVsIGZyb20gdGhlIGlubmVyIHBhY2tldCAqLworI2RlZmluZSBJUDZfVE5MX0ZfVVNFX09SSUdfRkxPV0xBQkVMIDB4NAorLyogYmVpbmcgdXNlZCBmb3IgTW9iaWxlIElQdjYgKi8KKyNkZWZpbmUgSVA2X1ROTF9GX01JUDZfREVWIDB4OAorLyogY29weSBEU0NQIGZyb20gdGhlIG91dGVyIHBhY2tldCAqLworI2RlZmluZSBJUDZfVE5MX0ZfUkNWX0RTQ1BfQ09QWSAweDEwCisvKiBjb3B5IGZ3bWFyayBmcm9tIGlubmVyIHBhY2tldCAqLworI2RlZmluZSBJUDZfVE5MX0ZfVVNFX09SSUdfRldNQVJLIDB4MjAKKworc3RydWN0IGlwNl90bmxfcGFybSB7CisJY2hhciBuYW1lW0lGTkFNU0laXTsJLyogbmFtZSBvZiB0dW5uZWwgZGV2aWNlICovCisJaW50IGxpbms7CQkvKiBpZmluZGV4IG9mIHVuZGVybHlpbmcgTDIgaW50ZXJmYWNlICovCisJX191OCBwcm90bzsJCS8qIHR1bm5lbCBwcm90b2NvbCAqLworCV9fdTggZW5jYXBfbGltaXQ7CS8qIGVuY2Fwc3VsYXRpb24gbGltaXQgZm9yIHR1bm5lbCAqLworCV9fdTggaG9wX2xpbWl0OwkJLyogaG9wIGxpbWl0IGZvciB0dW5uZWwgKi8KKwlfX2JlMzIgZmxvd2luZm87CS8qIHRyYWZmaWMgY2xhc3MgYW5kIGZsb3dsYWJlbCBmb3IgdHVubmVsICovCisJX191MzIgZmxhZ3M7CQkvKiB0dW5uZWwgZmxhZ3MgKi8KKwlzdHJ1Y3QgaW42X2FkZHIgbGFkZHI7CS8qIGxvY2FsIHR1bm5lbCBlbmQtcG9pbnQgYWRkcmVzcyAqLworCXN0cnVjdCBpbjZfYWRkciByYWRkcjsJLyogcmVtb3RlIHR1bm5lbCBlbmQtcG9pbnQgYWRkcmVzcyAqLworfTsKKworc3RydWN0IGlwNl90bmxfcGFybTIgeworCWNoYXIgbmFtZVtJRk5BTVNJWl07CS8qIG5hbWUgb2YgdHVubmVsIGRldmljZSAqLworCWludCBsaW5rOwkJLyogaWZpbmRleCBvZiB1bmRlcmx5aW5nIEwyIGludGVyZmFjZSAqLworCV9fdTggcHJvdG87CQkvKiB0dW5uZWwgcHJvdG9jb2wgKi8KKwlfX3U4IGVuY2FwX2xpbWl0OwkvKiBlbmNhcHN1bGF0aW9uIGxpbWl0IGZvciB0dW5uZWwgKi8KKwlfX3U4IGhvcF9saW1pdDsJCS8qIGhvcCBsaW1pdCBmb3IgdHVubmVsICovCisJX19iZTMyIGZsb3dpbmZvOwkvKiB0cmFmZmljIGNsYXNzIGFuZCBmbG93bGFiZWwgZm9yIHR1bm5lbCAqLworCV9fdTMyIGZsYWdzOwkJLyogdHVubmVsIGZsYWdzICovCisJc3RydWN0IGluNl9hZGRyIGxhZGRyOwkvKiBsb2NhbCB0dW5uZWwgZW5kLXBvaW50IGFkZHJlc3MgKi8KKwlzdHJ1Y3QgaW42X2FkZHIgcmFkZHI7CS8qIHJlbW90ZSB0dW5uZWwgZW5kLXBvaW50IGFkZHJlc3MgKi8KKworCV9fYmUxNgkJCWlfZmxhZ3M7CisJX19iZTE2CQkJb19mbGFnczsKKwlfX2JlMzIJCQlpX2tleTsKKwlfX2JlMzIJCQlvX2tleTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9sMnRwLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L2wydHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjBlMzZkCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9sMnRwLmgKQEAgLTAsMCArMSwxODEgQEAKKy8qCisgKiBMMlRQLW92ZXItSVAgc29ja2V0IGZvciBMMlRQdjMuCisgKgorICogQXV0aG9yOiBKYW1lcyBDaGFwbWFuIDxqY2hhcG1hbkBrYXRhbGl4LmNvbT4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9MMlRQX0hfCisjZGVmaW5lIF9MSU5VWF9MMlRQX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2RlZmluZSBJUFBST1RPX0wyVFAJCTExNQorCisvKioKKyAqIHN0cnVjdCBzb2NrYWRkcl9sMnRwaXAgLSB0aGUgc29ja2FkZHIgc3RydWN0dXJlIGZvciBMMlRQLW92ZXItSVAgc29ja2V0cworICogQGwydHBfZmFtaWx5OiAgYWRkcmVzcyBmYW1pbHkgbnVtYmVyIEFGX0wyVFBJUC4KKyAqIEBsMnRwX2FkZHI6ICAgIHByb3RvY29sIHNwZWNpZmljIGFkZHJlc3MgaW5mb3JtYXRpb24KKyAqIEBsMnRwX2Nvbm5faWQ6IGNvbm5lY3Rpb24gaWQgb2YgdHVubmVsCisgKi8KKyNkZWZpbmUgX19TT0NLX1NJWkVfXwkxNgkJLyogc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikJKi8KK3N0cnVjdCBzb2NrYWRkcl9sMnRwaXAgeworCS8qIFRoZSBmaXJzdCBmaWVsZHMgbXVzdCBtYXRjaCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKi8KKwlfX2tlcm5lbF9zYV9mYW1pbHlfdCBsMnRwX2ZhbWlseTsgLyogQUZfSU5FVCAqLworCV9fYmUxNgkJbDJ0cF91bnVzZWQ7CS8qIElORVQgcG9ydCBudW1iZXIgKHVudXNlZCkgKi8KKwlzdHJ1Y3QgaW5fYWRkcglsMnRwX2FkZHI7CS8qIEludGVybmV0IGFkZHJlc3MgKi8KKworCV9fdTMyCQlsMnRwX2Nvbm5faWQ7CS8qIENvbm5lY3Rpb24gSUQgb2YgdHVubmVsICovCisKKwkvKiBQYWQgdG8gc2l6ZSBvZiBgc3RydWN0IHNvY2thZGRyJy4gKi8KKwl1bnNpZ25lZCBjaGFyCV9fcGFkW3NpemVvZihzdHJ1Y3Qgc29ja2FkZHIpIC0KKwkJCSAgICAgIHNpemVvZihfX2tlcm5lbF9zYV9mYW1pbHlfdCkgLQorCQkJICAgICAgc2l6ZW9mKF9fYmUxNikgLSBzaXplb2Yoc3RydWN0IGluX2FkZHIpIC0KKwkJCSAgICAgIHNpemVvZihfX3UzMildOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc29ja2FkZHJfbDJ0cGlwNiAtIHRoZSBzb2NrYWRkciBzdHJ1Y3R1cmUgZm9yIEwyVFAtb3Zlci1JUHY2IHNvY2tldHMKKyAqIEBsMnRwX2ZhbWlseTogIGFkZHJlc3MgZmFtaWx5IG51bWJlciBBRl9MMlRQSVAuCisgKiBAbDJ0cF9hZGRyOiAgICBwcm90b2NvbCBzcGVjaWZpYyBhZGRyZXNzIGluZm9ybWF0aW9uCisgKiBAbDJ0cF9jb25uX2lkOiBjb25uZWN0aW9uIGlkIG9mIHR1bm5lbAorICovCitzdHJ1Y3Qgc29ja2FkZHJfbDJ0cGlwNiB7CisJLyogVGhlIGZpcnN0IGZpZWxkcyBtdXN0IG1hdGNoIHN0cnVjdCBzb2NrYWRkcl9pbjYgKi8KKwlfX2tlcm5lbF9zYV9mYW1pbHlfdCBsMnRwX2ZhbWlseTsgLyogQUZfSU5FVDYgKi8KKwlfX2JlMTYJCWwydHBfdW51c2VkOwkvKiBJTkVUIHBvcnQgbnVtYmVyICh1bnVzZWQpICovCisJX19iZTMyCQlsMnRwX2Zsb3dpbmZvOwkvKiBJUHY2IGZsb3cgaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3QgaW42X2FkZHIJbDJ0cF9hZGRyOwkvKiBJUHY2IGFkZHJlc3MgKi8KKwlfX3UzMgkJbDJ0cF9zY29wZV9pZDsJLyogc2NvcGUgaWQgKG5ldyBpbiBSRkMyNTUzKSAqLworCV9fdTMyCQlsMnRwX2Nvbm5faWQ7CS8qIENvbm5lY3Rpb24gSUQgb2YgdHVubmVsICovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBORVRMSU5LX0dFTkVSSUMgbmV0bGluayBmYW1pbHkuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb21tYW5kcy4KKyAqIFZhbGlkIFRMVnMgb2YgZWFjaCBjb21tYW5kIGFyZTotCisgKiBUVU5ORUxfQ1JFQVRFCS0gQ09OTl9JRCwgcHdfdHlwZSwgbmV0bnMsIGlmbmFtZSwgaXBpbmZvLCB1ZHBpbmZvLCB1ZHBjc3VtLCB2bGFuaWQKKyAqIFRVTk5FTF9ERUxFVEUJLSBDT05OX0lECisgKiBUVU5ORUxfTU9ESUZZCS0gQ09OTl9JRCwgdWRwY3N1bQorICogVFVOTkVMX0dFVFNUQVRTCS0gQ09OTl9JRCwgKHN0YXRzKQorICogVFVOTkVMX0dFVAkJLSBDT05OX0lELCAoLi4uKQorICogU0VTU0lPTl9DUkVBVEUJLSBTRVNTSU9OX0lELCBQV19UWVBFLCBvZmZzZXQsIGRhdGFfc2VxLCBjb29raWUsIHBlZXJfY29va2llLCBvZmZzZXQsIGwyc3BlYworICogU0VTU0lPTl9ERUxFVEUJLSBTRVNTSU9OX0lECisgKiBTRVNTSU9OX01PRElGWQktIFNFU1NJT05fSUQsIGRhdGFfc2VxCisgKiBTRVNTSU9OX0dFVAkJLSBTRVNTSU9OX0lELCAoLi4uKQorICogU0VTU0lPTl9HRVRTVEFUUwktIFNFU1NJT05fSUQsIChzdGF0cykKKyAqCisgKi8KK2VudW0geworCUwyVFBfQ01EX05PT1AsCisJTDJUUF9DTURfVFVOTkVMX0NSRUFURSwKKwlMMlRQX0NNRF9UVU5ORUxfREVMRVRFLAorCUwyVFBfQ01EX1RVTk5FTF9NT0RJRlksCisJTDJUUF9DTURfVFVOTkVMX0dFVCwKKwlMMlRQX0NNRF9TRVNTSU9OX0NSRUFURSwKKwlMMlRQX0NNRF9TRVNTSU9OX0RFTEVURSwKKwlMMlRQX0NNRF9TRVNTSU9OX01PRElGWSwKKwlMMlRQX0NNRF9TRVNTSU9OX0dFVCwKKwlfX0wyVFBfQ01EX01BWCwKK307CisKKyNkZWZpbmUgTDJUUF9DTURfTUFYCQkJKF9fTDJUUF9DTURfTUFYIC0gMSkKKworLyoKKyAqIEFUVFIgdHlwZXMgZGVmaW5lZCBmb3IgTDJUUAorICovCitlbnVtIHsKKwlMMlRQX0FUVFJfTk9ORSwJCQkvKiBubyBkYXRhICovCisJTDJUUF9BVFRSX1BXX1RZUEUsCQkvKiB1MTYsIGVudW0gbDJ0cF9wd3R5cGUgKi8KKwlMMlRQX0FUVFJfRU5DQVBfVFlQRSwJCS8qIHUxNiwgZW51bSBsMnRwX2VuY2FwX3R5cGUgKi8KKwlMMlRQX0FUVFJfT0ZGU0VULAkJLyogdTE2ICovCisJTDJUUF9BVFRSX0RBVEFfU0VRLAkJLyogdTE2ICovCisJTDJUUF9BVFRSX0wyU1BFQ19UWVBFLAkJLyogdTgsIGVudW0gbDJ0cF9sMnNwZWNfdHlwZSAqLworCUwyVFBfQVRUUl9MMlNQRUNfTEVOLAkJLyogdTgsIGVudW0gbDJ0cF9sMnNwZWNfdHlwZSAqLworCUwyVFBfQVRUUl9QUk9UT19WRVJTSU9OLAkvKiB1OCAqLworCUwyVFBfQVRUUl9JRk5BTUUsCQkvKiBzdHJpbmcgKi8KKwlMMlRQX0FUVFJfQ09OTl9JRCwJCS8qIHUzMiAqLworCUwyVFBfQVRUUl9QRUVSX0NPTk5fSUQsCQkvKiB1MzIgKi8KKwlMMlRQX0FUVFJfU0VTU0lPTl9JRCwJCS8qIHUzMiAqLworCUwyVFBfQVRUUl9QRUVSX1NFU1NJT05fSUQsCS8qIHUzMiAqLworCUwyVFBfQVRUUl9VRFBfQ1NVTSwJCS8qIHU4ICovCisJTDJUUF9BVFRSX1ZMQU5fSUQsCQkvKiB1MTYgKi8KKwlMMlRQX0FUVFJfQ09PS0lFLAkJLyogMCwgNCBvciA4IGJ5dGVzICovCisJTDJUUF9BVFRSX1BFRVJfQ09PS0lFLAkJLyogMCwgNCBvciA4IGJ5dGVzICovCisJTDJUUF9BVFRSX0RFQlVHLAkJLyogdTMyICovCisJTDJUUF9BVFRSX1JFQ1ZfU0VRLAkJLyogdTggKi8KKwlMMlRQX0FUVFJfU0VORF9TRVEsCQkvKiB1OCAqLworCUwyVFBfQVRUUl9MTlNfTU9ERSwJCS8qIHU4ICovCisJTDJUUF9BVFRSX1VTSU5HX0lQU0VDLAkJLyogdTggKi8KKwlMMlRQX0FUVFJfUkVDVl9USU1FT1VULAkJLyogbXNlYyAqLworCUwyVFBfQVRUUl9GRCwJCQkvKiBpbnQgKi8KKwlMMlRQX0FUVFJfSVBfU0FERFIsCQkvKiB1MzIgKi8KKwlMMlRQX0FUVFJfSVBfREFERFIsCQkvKiB1MzIgKi8KKwlMMlRQX0FUVFJfVURQX1NQT1JULAkJLyogdTE2ICovCisJTDJUUF9BVFRSX1VEUF9EUE9SVCwJCS8qIHUxNiAqLworCUwyVFBfQVRUUl9NVFUsCQkJLyogdTE2ICovCisJTDJUUF9BVFRSX01SVSwJCQkvKiB1MTYgKi8KKwlMMlRQX0FUVFJfU1RBVFMsCQkvKiBuZXN0ZWQgKi8KKwlMMlRQX0FUVFJfSVA2X1NBRERSLAkJLyogc3RydWN0IGluNl9hZGRyICovCisJTDJUUF9BVFRSX0lQNl9EQUREUiwJCS8qIHN0cnVjdCBpbjZfYWRkciAqLworCUwyVFBfQVRUUl9VRFBfWkVST19DU1VNNl9UWCwJLyogdTggKi8KKwlMMlRQX0FUVFJfVURQX1pFUk9fQ1NVTTZfUlgsCS8qIHU4ICovCisJX19MMlRQX0FUVFJfTUFYLAorfTsKKworI2RlZmluZSBMMlRQX0FUVFJfTUFYCQkJKF9fTDJUUF9BVFRSX01BWCAtIDEpCisKKy8qIE5lc3RlZCBpbiBMMlRQX0FUVFJfU1RBVFMgKi8KK2VudW0geworCUwyVFBfQVRUUl9TVEFUU19OT05FLAkJLyogbm8gZGF0YSAqLworCUwyVFBfQVRUUl9UWF9QQUNLRVRTLAkJLyogdTY0ICovCisJTDJUUF9BVFRSX1RYX0JZVEVTLAkJLyogdTY0ICovCisJTDJUUF9BVFRSX1RYX0VSUk9SUywJCS8qIHU2NCAqLworCUwyVFBfQVRUUl9SWF9QQUNLRVRTLAkJLyogdTY0ICovCisJTDJUUF9BVFRSX1JYX0JZVEVTLAkJLyogdTY0ICovCisJTDJUUF9BVFRSX1JYX1NFUV9ESVNDQVJEUywJLyogdTY0ICovCisJTDJUUF9BVFRSX1JYX09PU19QQUNLRVRTLAkvKiB1NjQgKi8KKwlMMlRQX0FUVFJfUlhfRVJST1JTLAkJLyogdTY0ICovCisJX19MMlRQX0FUVFJfU1RBVFNfTUFYLAorfTsKKworI2RlZmluZSBMMlRQX0FUVFJfU1RBVFNfTUFYCQkoX19MMlRQX0FUVFJfU1RBVFNfTUFYIC0gMSkKKworZW51bSBsMnRwX3B3dHlwZSB7CisJTDJUUF9QV1RZUEVfTk9ORSA9IDB4MDAwMCwKKwlMMlRQX1BXVFlQRV9FVEhfVkxBTiA9IDB4MDAwNCwKKwlMMlRQX1BXVFlQRV9FVEggPSAweDAwMDUsCisJTDJUUF9QV1RZUEVfUFBQID0gMHgwMDA3LAorCUwyVFBfUFdUWVBFX1BQUF9BQyA9IDB4MDAwOCwKKwlMMlRQX1BXVFlQRV9JUCA9IDB4MDAwYiwKKwlfX0wyVFBfUFdUWVBFX01BWAorfTsKKworZW51bSBsMnRwX2wyc3BlY190eXBlIHsKKwlMMlRQX0wyU1BFQ1RZUEVfTk9ORSwKKwlMMlRQX0wyU1BFQ1RZUEVfREVGQVVMVCwKK307CisKK2VudW0gbDJ0cF9lbmNhcF90eXBlIHsKKwlMMlRQX0VOQ0FQVFlQRV9VRFAsCisJTDJUUF9FTkNBUFRZUEVfSVAsCit9OworCitlbnVtIGwydHBfc2VxbW9kZSB7CisJTDJUUF9TRVFfTk9ORSA9IDAsCisJTDJUUF9TRVFfSVAgPSAxLAorCUwyVFBfU0VRX0FMTCA9IDIsCit9OworCisvKgorICogTkVUTElOS19HRU5FUklDIHJlbGF0ZWQgaW5mbworICovCisjZGVmaW5lIEwyVFBfR0VOTF9OQU1FCQkibDJ0cCIKKyNkZWZpbmUgTDJUUF9HRU5MX1ZFUlNJT04JMHgxCisjZGVmaW5lIEwyVFBfR0VOTF9NQ0dST1VQICAgICAgICJsMnRwIgorCisjZW5kaWYgLyogX0xJTlVYX0wyVFBfSF8gKi8KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2luY2x1ZGUvbGludXgvbGliYy1jb21wYXQuaCBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvbGliYy1jb21wYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmVkNWI2Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9saWJjLWNvbXBhdC5oCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29tcGF0aWJpbGl0eSBpbnRlcmZhY2UgZm9yIHVzZXJzcGFjZSBsaWJjIGhlYWRlciBjb29yZGluYXRpb246CisgKgorICogRGVmaW5lIGNvbXBhdGliaWxpdHkgbWFjcm9zIHRoYXQgYXJlIHVzZWQgdG8gY29udHJvbCB0aGUgaW5jbHVzaW9uIG9yCisgKiBleGNsdXNpb24gb2YgVUFQSSBzdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucyBpbiBjb29yZGluYXRpb24gd2l0aCBhbm90aGVyCisgKiB1c2Vyc3BhY2UgQyBsaWJyYXJ5LgorICoKKyAqIFRoaXMgaGVhZGVyIGlzIGludGVuZGVkIHRvIHNvbHZlIHRoZSBwcm9ibGVtIG9mIFVBUEkgZGVmaW5pdGlvbnMgdGhhdAorICogY29uZmxpY3Qgd2l0aCB1c2Vyc3BhY2UgZGVmaW5pdGlvbnMuIElmIGEgVUFQSSBoZWFkZXIgaGFzIHN1Y2ggY29uZmxpY3RpbmcKKyAqIGRlZmluaXRpb25zIHRoZW4gdGhlIHNvbHV0aW9uIGlzIGFzIGZvbGxvd3M6CisgKgorICogKiBTeW5jaHJvbml6ZSB0aGUgVUFQSSBoZWFkZXIgYW5kIHRoZSBsaWJjIGhlYWRlcnMgc28gZWl0aGVyIG9uZSBjYW4gYmUKKyAqICAgdXNlZCBhbmQgc3VjaCB0aGF0IHRoZSBBQkkgaXMgcHJlc2VydmVkLiBJZiB0aGlzIGlzIG5vdCBwb3NzaWJsZSB0aGVuCisgKiAgIG5vIHNpbXBsZSBjb21wYXRpYmlsaXR5IGludGVyZmFjZSBleGlzdHMgKHlvdSBuZWVkIHRvIHdyaXRlIHRyYW5zbGF0aW5nCisgKiAgIHdyYXBwZXJzIGFuZCByZW5hbWUgdGhpbmdzKSBhbmQgeW91IGNhbid0IHVzZSB0aGlzIGludGVyZmFjZS4KKyAqCisgKiBUaGVuIGZvbGxvdyB0aGlzIHByb2Nlc3M6CisgKgorICogKGEpIEluY2x1ZGUgbGliYy1jb21wYXQuaCBpbiB0aGUgVUFQSSBoZWFkZXIuCisgKiAgICAgIGUuZy4gI2luY2x1ZGUgPGxpbnV4L2xpYmMtY29tcGF0Lmg+CisgKiAgICAgVGhpcyBpbmNsdWRlIG11c3QgYmUgYXMgZWFybHkgYXMgcG9zc2libGUuCisgKgorICogKGIpIEluIGxpYmMtY29tcGF0LmggYWRkIGVub3VnaCBjb2RlIHRvIGRldGVjdCB0aGF0IHRoZSBjb21mbGljdGluZworICogICAgIHVzZXJzcGFjZSBsaWJjIGhlYWRlciBoYXMgYmVlbiBpbmNsdWRlZCBmaXJzdC4KKyAqCisgKiAoYykgSWYgdGhlIHVzZXJzcGFjZSBsaWJjIGhlYWRlciBoYXMgYmVlbiBpbmNsdWRlZCBmaXJzdCBkZWZpbmUgYSBzZXQgb2YKKyAqICAgICBndWFyZCBtYWNyb3Mgb2YgdGhlIGZvcm0gX19VQVBJX0RFRl9GT08gYW5kIHNldCB0aGVpciB2YWx1ZXMgdG8gMSwgZWxzZQorICogICAgIHNldCB0aGVpciB2YWx1ZXMgdG8gMC4KKyAqCisgKiAoZCkgQmFjayBpbiB0aGUgVUFQSSBoZWFkZXIgd2l0aCB0aGUgY29uZmxpY3RpbmcgZGVmaW5pdGlvbnMsIGd1YXJkIHRoZQorICogICAgIGRlZmluaXRpb25zIHdpdGg6CisgKiAgICAgI2lmIF9fVUFQSV9ERUZfRk9PCisgKiAgICAgICAuLi4KKyAqICAgICAjZW5kaWYKKyAqCisgKiBUaGlzIGZpeGVzIHRoZSBzaXR1YXRpb24gd2hlcmUgdGhlIGxpbnV4IGhlYWRlcnMgYXJlIGluY2x1ZGVkICphZnRlciogdGhlCisgKiBsaWJjIGhlYWRlcnMuIFRvIGZpeCB0aGUgcHJvYmxlbSB3aXRoIHRoZSBpbmNsdXNpb24gaW4gdGhlIG90aGVyIG9yZGVyIHRoZQorICogdXNlcnNwYWNlIGxpYmMgaGVhZGVycyBtdXN0IGJlIGZpeGVkIGxpa2UgdGhpczoKKyAqCisgKiAqIEZvciBhbGwgZGVmaW5pdGlvbnMgdGhhdCBjb25mbGljdCB3aXRoIGtlcm5lbCBkZWZpbml0aW9ucyB3cmFwIHRob3NlCisgKiAgIGRlZmluZXMgaW4gdGhlIGZvbGxvd2luZzoKKyAqICAgI2lmICFfX1VBUElfREVGX0ZPTworICogICAgIC4uLgorICogICAjZW5kaWYKKyAqCisgKiBUaGlzIHByZXZlbnRzIHRoZSByZWRlZmluaXRpb24gb2YgYSBjb25zdHJ1Y3QgYWxyZWFkeSBkZWZpbmVkIGJ5IHRoZSBrZXJuZWwuCisgKi8KKyNpZm5kZWYgX0xJQkNfQ09NUEFUX0gKKyNkZWZpbmUgX0xJQkNfQ09NUEFUX0gKKworLyogV2UgaGF2ZSBpbmNsdWRlZCBnbGliYyBoZWFkZXJzLi4uICovCisjaWYgZGVmaW5lZChfX0dMSUJDX18pCisKKy8qIENvb3JkaW5hdGUgd2l0aCBnbGliYyBuZXRpbmV0L2luLmggaGVhZGVyLiAqLworI2lmIGRlZmluZWQoX05FVElORVRfSU5fSCkKKworLyogR0xJQkMgaGVhZGVycyBpbmNsdWRlZCBmaXJzdCBzbyBkb24ndCBkZWZpbmUgYW55dGhpbmcKKyAqIHRoYXQgd291bGQgYWxyZWFkeSBiZSBkZWZpbmVkLiAqLworI2RlZmluZSBfX1VBUElfREVGX0lOX0FERFIJCTAKKyNkZWZpbmUgX19VQVBJX0RFRl9JTl9JUFBST1RPCQkwCisjZGVmaW5lIF9fVUFQSV9ERUZfSU5fUEtUSU5GTwkJMAorI2RlZmluZSBfX1VBUElfREVGX0lQX01SRVEJCTAKKyNkZWZpbmUgX19VQVBJX0RFRl9TT0NLQUREUl9JTgkJMAorI2RlZmluZSBfX1VBUElfREVGX0lOX0NMQVNTCQkwCisKKyNkZWZpbmUgX19VQVBJX0RFRl9JTjZfQUREUgkJMAorLyogVGhlIGV4Y2VwdGlvbiBpcyB0aGUgaW42X2FkZHIgbWFjcm9zIHdoaWNoIG11c3QgYmUgZGVmaW5lZAorICogaWYgdGhlIGdsaWJjIGNvZGUgZGlkbid0IGRlZmluZSB0aGVtLiBUaGlzIGd1YXJkIG1hdGNoZXMKKyAqIHRoZSBndWFyZCBpbiBnbGliYy9pbmV0L25ldGluZXQvaW4uaCB3aGljaCBkZWZpbmVzIHRoZQorICogYWRkaXRpb25hbCBpbjZfYWRkciBtYWNyb3MgZS5nLiBzNl9hZGRyMTYsIGFuZCBzNl9hZGRyMzIuICovCisjaWYgZGVmaW5lZChfX1VTRV9NSVNDKSB8fCBkZWZpbmVkIChfX1VTRV9HTlUpCisjZGVmaW5lIF9fVUFQSV9ERUZfSU42X0FERFJfQUxUCQkwCisjZWxzZQorI2RlZmluZSBfX1VBUElfREVGX0lONl9BRERSX0FMVAkJMQorI2VuZGlmCisjZGVmaW5lIF9fVUFQSV9ERUZfU09DS0FERFJfSU42CQkwCisjZGVmaW5lIF9fVUFQSV9ERUZfSVBWNl9NUkVRCQkwCisjZGVmaW5lIF9fVUFQSV9ERUZfSVBQUk9UT19WNgkJMAorI2RlZmluZSBfX1VBUElfREVGX0lQVjZfT1BUSU9OUwkJMAorI2RlZmluZSBfX1VBUElfREVGX0lONl9QS1RJTkZPCQkwCisjZGVmaW5lIF9fVUFQSV9ERUZfSVA2X01UVUlORk8JCTAKKworI2Vsc2UKKworLyogTGludXggaGVhZGVycyBpbmNsdWRlZCBmaXJzdCwgYW5kIHdlIG11c3QgZGVmaW5lIGV2ZXJ5dGhpbmcKKyAqIHdlIG5lZWQuIFRoZSBleHBlY3RhdGlvbiBpcyB0aGF0IGdsaWJjIHdpbGwgY2hlY2sgdGhlCisgKiBfX1VBUElfREVGXyogZGVmaW5lcyBhbmQgYWRqdXN0IGFwcHJvcHJpYXRlbHkuICovCisjZGVmaW5lIF9fVUFQSV9ERUZfSU5fQUREUgkJMQorI2RlZmluZSBfX1VBUElfREVGX0lOX0lQUFJPVE8JCTEKKyNkZWZpbmUgX19VQVBJX0RFRl9JTl9QS1RJTkZPCQkxCisjZGVmaW5lIF9fVUFQSV9ERUZfSVBfTVJFUQkJMQorI2RlZmluZSBfX1VBUElfREVGX1NPQ0tBRERSX0lOCQkxCisjZGVmaW5lIF9fVUFQSV9ERUZfSU5fQ0xBU1MJCTEKKworI2RlZmluZSBfX1VBUElfREVGX0lONl9BRERSCQkxCisvKiBXZSB1bmNvbmRpdGlvbmFsbHkgZGVmaW5lIHRoZSBpbjZfYWRkciBtYWNyb3MgYW5kIGdsaWJjIG11c3QKKyAqIGNvb3JkaW5hdGUuICovCisjZGVmaW5lIF9fVUFQSV9ERUZfSU42X0FERFJfQUxUCQkxCisjZGVmaW5lIF9fVUFQSV9ERUZfU09DS0FERFJfSU42CQkxCisjZGVmaW5lIF9fVUFQSV9ERUZfSVBWNl9NUkVRCQkxCisjZGVmaW5lIF9fVUFQSV9ERUZfSVBQUk9UT19WNgkJMQorI2RlZmluZSBfX1VBUElfREVGX0lQVjZfT1BUSU9OUwkJMQorI2RlZmluZSBfX1VBUElfREVGX0lONl9QS1RJTkZPCQkxCisjZGVmaW5lIF9fVUFQSV9ERUZfSVA2X01UVUlORk8JCTEKKworI2VuZGlmIC8qIF9ORVRJTkVUX0lOX0ggKi8KKworLyogRGVmaW5pdGlvbnMgZm9yIHhhdHRyLmggKi8KKyNpZiBkZWZpbmVkKF9TWVNfWEFUVFJfSCkKKyNkZWZpbmUgX19VQVBJX0RFRl9YQVRUUgkJMAorI2Vsc2UKKyNkZWZpbmUgX19VQVBJX0RFRl9YQVRUUgkJMQorI2VuZGlmCisKKy8qIElmIHdlIGRpZCBub3Qgc2VlIGFueSBoZWFkZXJzIGZyb20gYW55IHN1cHBvcnRlZCBDIGxpYnJhcmllcywKKyAqIG9yIHdlIGFyZSBiZWluZyBpbmNsdWRlZCBpbiB0aGUga2VybmVsLCB0aGVuIGRlZmluZSBldmVyeXRoaW5nCisgKiB0aGF0IHdlIG5lZWQuICovCisjZWxzZSAvKiAhZGVmaW5lZChfX0dMSUJDX18pICovCisKKy8qIERlZmluaXRpb25zIGZvciBpbi5oICovCisjZGVmaW5lIF9fVUFQSV9ERUZfSU5fQUREUgkJMQorI2RlZmluZSBfX1VBUElfREVGX0lOX0lQUFJPVE8JCTEKKyNkZWZpbmUgX19VQVBJX0RFRl9JTl9QS1RJTkZPCQkxCisjZGVmaW5lIF9fVUFQSV9ERUZfSVBfTVJFUQkJMQorI2RlZmluZSBfX1VBUElfREVGX1NPQ0tBRERSX0lOCQkxCisjZGVmaW5lIF9fVUFQSV9ERUZfSU5fQ0xBU1MJCTEKKworLyogRGVmaW5pdGlvbnMgZm9yIGluNi5oICovCisjZGVmaW5lIF9fVUFQSV9ERUZfSU42X0FERFIJCTEKKyNkZWZpbmUgX19VQVBJX0RFRl9JTjZfQUREUl9BTFQJCTEKKyNkZWZpbmUgX19VQVBJX0RFRl9TT0NLQUREUl9JTjYJCTEKKyNkZWZpbmUgX19VQVBJX0RFRl9JUFY2X01SRVEJCTEKKyNkZWZpbmUgX19VQVBJX0RFRl9JUFBST1RPX1Y2CQkxCisjZGVmaW5lIF9fVUFQSV9ERUZfSVBWNl9PUFRJT05TCQkxCisjZGVmaW5lIF9fVUFQSV9ERUZfSU42X1BLVElORk8JCTEKKyNkZWZpbmUgX19VQVBJX0RFRl9JUDZfTVRVSU5GTwkJMQorCisvKiBEZWZpbml0aW9ucyBmb3IgeGF0dHIuaCAqLworI2RlZmluZSBfX1VBUElfREVGX1hBVFRSCQkxCisKKyNlbmRpZiAvKiBfX0dMSUJDX18gKi8KKworI2VuZGlmIC8qIF9MSUJDX0NPTVBBVF9IICovCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L2x3dHVubmVsLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L2x3dHVubmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQyZjRmNgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvbHd0dW5uZWwuaApAQCAtMCwwICsxLDQzIEBACisjaWZuZGVmIF9MV1RVTk5FTF9IXworI2RlZmluZSBfTFdUVU5ORUxfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK2VudW0gbHd0dW5uZWxfZW5jYXBfdHlwZXMgeworCUxXVFVOTkVMX0VOQ0FQX05PTkUsCisJTFdUVU5ORUxfRU5DQVBfTVBMUywKKwlMV1RVTk5FTF9FTkNBUF9JUCwKKwlMV1RVTk5FTF9FTkNBUF9JTEEsCisJTFdUVU5ORUxfRU5DQVBfSVA2LAorCV9fTFdUVU5ORUxfRU5DQVBfTUFYLAorfTsKKworI2RlZmluZSBMV1RVTk5FTF9FTkNBUF9NQVggKF9fTFdUVU5ORUxfRU5DQVBfTUFYIC0gMSkKKworZW51bSBsd3R1bm5lbF9pcF90IHsKKwlMV1RVTk5FTF9JUF9VTlNQRUMsCisJTFdUVU5ORUxfSVBfSUQsCisJTFdUVU5ORUxfSVBfRFNULAorCUxXVFVOTkVMX0lQX1NSQywKKwlMV1RVTk5FTF9JUF9UVEwsCisJTFdUVU5ORUxfSVBfVE9TLAorCUxXVFVOTkVMX0lQX0ZMQUdTLAorCV9fTFdUVU5ORUxfSVBfTUFYLAorfTsKKworI2RlZmluZSBMV1RVTk5FTF9JUF9NQVggKF9fTFdUVU5ORUxfSVBfTUFYIC0gMSkKKworZW51bSBsd3R1bm5lbF9pcDZfdCB7CisJTFdUVU5ORUxfSVA2X1VOU1BFQywKKwlMV1RVTk5FTF9JUDZfSUQsCisJTFdUVU5ORUxfSVA2X0RTVCwKKwlMV1RVTk5FTF9JUDZfU1JDLAorCUxXVFVOTkVMX0lQNl9IT1BMSU1JVCwKKwlMV1RVTk5FTF9JUDZfVEMsCisJTFdUVU5ORUxfSVA2X0ZMQUdTLAorCV9fTFdUVU5ORUxfSVA2X01BWCwKK307CisKKyNkZWZpbmUgTFdUVU5ORUxfSVA2X01BWCAoX19MV1RVTk5FTF9JUDZfTUFYIC0gMSkKKworI2VuZGlmIC8qIF9MV1RVTk5FTF9IXyAqLwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9tcGxzLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L21wbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTRiNTRiCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9tcGxzLmgKQEAgLTAsMCArMSw0NiBAQAorI2lmbmRlZiBfTVBMU19ICisjZGVmaW5lIF9NUExTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisvKiBSZWZlcmVuY2U6IFJGQyA1NDYyLCBSRkMgMzAzMgorICoKKyAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICAgICAgICBMYWJlbCAgICAgICAgICAgICAgICAgIHwgVEMgIHxTfCAgICAgICBUVEwgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKgorICoJTGFiZWw6ICBMYWJlbCBWYWx1ZSwgMjAgYml0cworICoJVEM6ICAgICBUcmFmZmljIENsYXNzIGZpZWxkLCAzIGJpdHMKKyAqCVM6ICAgICAgQm90dG9tIG9mIFN0YWNrLCAxIGJpdAorICoJVFRMOiAgICBUaW1lIHRvIExpdmUsIDggYml0cworICovCisKK3N0cnVjdCBtcGxzX2xhYmVsIHsKKwlfX2JlMzIgZW50cnk7Cit9OworCisjZGVmaW5lIE1QTFNfTFNfTEFCRUxfTUFTSyAgICAgIDB4RkZGRkYwMDAKKyNkZWZpbmUgTVBMU19MU19MQUJFTF9TSElGVCAgICAgMTIKKyNkZWZpbmUgTVBMU19MU19UQ19NQVNLICAgICAgICAgMHgwMDAwMEUwMAorI2RlZmluZSBNUExTX0xTX1RDX1NISUZUICAgICAgICA5CisjZGVmaW5lIE1QTFNfTFNfU19NQVNLICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgTVBMU19MU19TX1NISUZUICAgICAgICAgOAorI2RlZmluZSBNUExTX0xTX1RUTF9NQVNLICAgICAgICAweDAwMDAwMEZGCisjZGVmaW5lIE1QTFNfTFNfVFRMX1NISUZUICAgICAgIDAKKworLyogUmVzZXJ2ZWQgbGFiZWxzICovCisjZGVmaW5lIE1QTFNfTEFCRUxfSVBWNE5VTEwJCTAgLyogUkZDMzAzMiAqLworI2RlZmluZSBNUExTX0xBQkVMX1JUQUxFUlQJCTEgLyogUkZDMzAzMiAqLworI2RlZmluZSBNUExTX0xBQkVMX0lQVjZOVUxMCQkyIC8qIFJGQzMwMzIgKi8KKyNkZWZpbmUgTVBMU19MQUJFTF9JTVBMTlVMTAkJMyAvKiBSRkMzMDMyICovCisjZGVmaW5lIE1QTFNfTEFCRUxfRU5UUk9QWQkJNyAvKiBSRkM2NzkwICovCisjZGVmaW5lIE1QTFNfTEFCRUxfR0FMCQkJMTMgLyogUkZDNTU4NiAqLworI2RlZmluZSBNUExTX0xBQkVMX09BTUFMRVJUCQkxNCAvKiBSRkMzNDI5ICovCisjZGVmaW5lIE1QTFNfTEFCRUxfRVhURU5TSU9OCQkxNSAvKiBSRkM3Mjc0ICovCisKKyNkZWZpbmUgTVBMU19MQUJFTF9GSVJTVF9VTlJFU0VSVkVECTE2IC8qIFJGQzMwMzIgKi8KKworI2VuZGlmIC8qIF9NUExTX0ggKi8KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2luY2x1ZGUvbGludXgvbXBsc19pcHR1bm5lbC5oIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9tcGxzX2lwdHVubmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEzMmMzYwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvbXBsc19pcHR1bm5lbC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKgltcGxzIHR1bm5lbCBhcGkKKyAqCisgKglBdXRob3JzOgorICoJCVJvb3BhIFByYWJodSA8cm9vcGFAY3VtdWx1c25ldHdvcmtzLmNvbT4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX01QTFNfSVBUVU5ORUxfSAorI2RlZmluZSBfTElOVVhfTVBMU19JUFRVTk5FTF9ICisKKy8qIE1QTFMgdHVubmVsIGF0dHJpYnV0ZXMKKyAqIFtSVEFfRU5DQVBdID0geworICogICAgIFtNUExTX0lQVFVOTkVMX0RTVF0KKyAqIH0KKyAqLworZW51bSB7CisJTVBMU19JUFRVTk5FTF9VTlNQRUMsCisJTVBMU19JUFRVTk5FTF9EU1QsCisJX19NUExTX0lQVFVOTkVMX01BWCwKK307CisjZGVmaW5lIE1QTFNfSVBUVU5ORUxfTUFYIChfX01QTFNfSVBUVU5ORUxfTUFYIC0gMSkKKworI2VuZGlmIC8qIF9MSU5VWF9NUExTX0lQVFVOTkVMX0ggKi8KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2luY2x1ZGUvbGludXgvbmVpZ2hib3VyLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L25laWdoYm91ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ODY1NWIKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L25laWdoYm91ci5oCkBAIC0wLDAgKzEsMTY3IEBACisjaWZuZGVmIF9fTElOVVhfTkVJR0hCT1VSX0gKKyNkZWZpbmUgX19MSU5VWF9ORUlHSEJPVVJfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisKK3N0cnVjdCBuZG1zZyB7CisJX191OAkJbmRtX2ZhbWlseTsKKwlfX3U4CQluZG1fcGFkMTsKKwlfX3UxNgkJbmRtX3BhZDI7CisJX19zMzIJCW5kbV9pZmluZGV4OworCV9fdTE2CQluZG1fc3RhdGU7CisJX191OAkJbmRtX2ZsYWdzOworCV9fdTgJCW5kbV90eXBlOworfTsKKworZW51bSB7CisJTkRBX1VOU1BFQywKKwlOREFfRFNULAorCU5EQV9MTEFERFIsCisJTkRBX0NBQ0hFSU5GTywKKwlOREFfUFJPQkVTLAorCU5EQV9WTEFOLAorCU5EQV9QT1JULAorCU5EQV9WTkksCisJTkRBX0lGSU5ERVgsCisJTkRBX01BU1RFUiwKKwlOREFfTElOS19ORVROU0lELAorCV9fTkRBX01BWAorfTsKKworI2RlZmluZSBOREFfTUFYIChfX05EQV9NQVggLSAxKQorCisvKgorICoJTmVpZ2hib3IgQ2FjaGUgRW50cnkgRmxhZ3MKKyAqLworCisjZGVmaW5lIE5URl9VU0UJCTB4MDEKKyNkZWZpbmUgTlRGX1NFTEYJMHgwMgorI2RlZmluZSBOVEZfTUFTVEVSCTB4MDQKKyNkZWZpbmUgTlRGX1BST1hZCTB4MDgJLyogPT0gQVRGX1BVQkwgKi8KKyNkZWZpbmUgTlRGX0VYVF9MRUFSTkVECTB4MTAKKyNkZWZpbmUgTlRGX1JPVVRFUgkweDgwCisKKy8qCisgKglOZWlnaGJvciBDYWNoZSBFbnRyeSBTdGF0ZXMuCisgKi8KKworI2RlZmluZSBOVURfSU5DT01QTEVURQkweDAxCisjZGVmaW5lIE5VRF9SRUFDSEFCTEUJMHgwMgorI2RlZmluZSBOVURfU1RBTEUJMHgwNAorI2RlZmluZSBOVURfREVMQVkJMHgwOAorI2RlZmluZSBOVURfUFJPQkUJMHgxMAorI2RlZmluZSBOVURfRkFJTEVECTB4MjAKKworLyogRHVtbXkgc3RhdGVzICovCisjZGVmaW5lIE5VRF9OT0FSUAkweDQwCisjZGVmaW5lIE5VRF9QRVJNQU5FTlQJMHg4MAorI2RlZmluZSBOVURfTk9ORQkweDAwCisKKy8qIE5VRF9OT0FSUCAmIE5VRF9QRVJNQU5FTlQgYXJlIHBzZXVkb3N0YXRlcywgdGhleSBuZXZlciBjaGFuZ2UKKyAgIGFuZCBtYWtlIG5vIGFkZHJlc3MgcmVzb2x1dGlvbiBvciBOVUQuCisgICBOVURfUEVSTUFORU5UIGFsc28gY2Fubm90IGJlIGRlbGV0ZWQgYnkgZ2FyYmFnZSBjb2xsZWN0b3JzLgorICovCisKK3N0cnVjdCBuZGFfY2FjaGVpbmZvIHsKKwlfX3UzMgkJbmRtX2NvbmZpcm1lZDsKKwlfX3UzMgkJbmRtX3VzZWQ7CisJX191MzIJCW5kbV91cGRhdGVkOworCV9fdTMyCQluZG1fcmVmY250OworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJTmVpZ2hib3VyIHRhYmxlcyBzcGVjaWZpYyBtZXNzYWdlcy4KKyAqCisgKiBUbyByZXRyaWV2ZSB0aGUgbmVpZ2hib3VyIHRhYmxlcyBzZW5kIFJUTV9HRVRORUlHSFRCTCB3aXRoIHRoZQorICogTkxNX0ZfRFVNUCBmbGFnIHNldC4gRXZlcnkgbmVpZ2hib3VyIHRhYmxlIGNvbmZpZ3VyYXRpb24gaXMKKyAqIHNwcmVhZCBvdmVyIG11bHRpcGxlIG1lc3NhZ2VzIHRvIGF2b2lkIHJ1bm5pbmcgaW50byBtZXNzYWdlCisgKiBzaXplIGxpbWl0cyBvbiBzeXN0ZW1zIHdpdGggbWFueSBpbnRlcmZhY2VzLiBUaGUgZmlyc3QgbWVzc2FnZQorICogaW4gdGhlIHNlcXVlbmNlIHRyYW5zcG9ydHMgYWxsIG5vdCBkZXZpY2Ugc3BlY2lmaWMgZGF0YSBzdWNoIGFzCisgKiBzdGF0aXN0aWNzLCBjb25maWd1cmF0aW9uLCBhbmQgdGhlIGRlZmF1bHQgcGFyYW1ldGVyIHNldC4KKyAqIFRoaXMgbWVzc2FnZSBpcyBmb2xsb3dlZCBieSAwLi5uIG1lc3NhZ2VzIGNhcnJ5aW5nIGRldmljZQorICogc3BlY2lmaWMgcGFyYW1ldGVyIHNldHMuCisgKiBBbHRob3VnaCB0aGUgb3JkZXJpbmcgc2hvdWxkIGJlIHN1ZmZpY2llbnQsIE5EVEFfTkFNRSBjYW4gYmUKKyAqIHVzZWQgdG8gaWRlbnRpZnkgc2VxdWVuY2VzLiBUaGUgaW5pdGlhbCBtZXNzYWdlIGNhbiBiZSBpZGVudGlmaWVkCisgKiBieSBjaGVja2luZyBmb3IgTkRUQV9DT05GSUcuIFRoZSBkZXZpY2Ugc3BlY2lmaWMgbWVzc2FnZXMgZG8KKyAqIG5vdCBjb250YWluIHRoaXMgVExWIGJ1dCBoYXZlIE5EVFBBX0lGSU5ERVggc2V0IHRvIHRoZQorICogY29ycmVzcG9uZGluZyBpbnRlcmZhY2UgaW5kZXguCisgKgorICogVG8gY2hhbmdlIG5laWdoYm91ciB0YWJsZSBhdHRyaWJ1dGVzLCBzZW5kIFJUTV9TRVRORUlHSFRCTAorICogd2l0aCBORFRBX05BTUUgc2V0LiBDaGFuZ2VhYmxlIGF0dHJpYnV0ZSBpbmNsdWRlIE5EVEFfVEhSRVNIWzEtM10sCisgKiBORFRBX0dDX0lOVEVSVkFMLCBhbmQgYWxsIFRMVnMgaW4gTkRUQV9QQVJNUyB1bmxlc3MgbWFya2VkCisgKiBvdGhlcndpc2UuIERldmljZSBzcGVjaWZpYyBwYXJhbWV0ZXIgc2V0cyBjYW4gYmUgY2hhbmdlZCBieQorICogc2V0dGluZyBORFRQQV9JRklOREVYIHRvIHRoZSBpbnRlcmZhY2UgaW5kZXggb2YgdGhlIGNvcnJlc3BvbmRpbmcKKyAqIGRldmljZS4KKyAqKioqLworCitzdHJ1Y3QgbmR0X3N0YXRzIHsKKwlfX3U2NAkJbmR0c19hbGxvY3M7CisJX191NjQJCW5kdHNfZGVzdHJveXM7CisJX191NjQJCW5kdHNfaGFzaF9ncm93czsKKwlfX3U2NAkJbmR0c19yZXNfZmFpbGVkOworCV9fdTY0CQluZHRzX2xvb2t1cHM7CisJX191NjQJCW5kdHNfaGl0czsKKwlfX3U2NAkJbmR0c19yY3ZfcHJvYmVzX21jYXN0OworCV9fdTY0CQluZHRzX3Jjdl9wcm9iZXNfdWNhc3Q7CisJX191NjQJCW5kdHNfcGVyaW9kaWNfZ2NfcnVuczsKKwlfX3U2NAkJbmR0c19mb3JjZWRfZ2NfcnVuczsKKwlfX3U2NAkJbmR0c190YWJsZV9mdWxsczsKK307CisKK2VudW0geworCU5EVFBBX1VOU1BFQywKKwlORFRQQV9JRklOREVYLAkJCS8qIHUzMiwgdW5jaGFuZ2VhYmxlICovCisJTkRUUEFfUkVGQ05ULAkJCS8qIHUzMiwgcmVhZC1vbmx5ICovCisJTkRUUEFfUkVBQ0hBQkxFX1RJTUUsCQkvKiB1NjQsIHJlYWQtb25seSwgbXNlY3MgKi8KKwlORFRQQV9CQVNFX1JFQUNIQUJMRV9USU1FLAkvKiB1NjQsIG1zZWNzICovCisJTkRUUEFfUkVUUkFOU19USU1FLAkJLyogdTY0LCBtc2VjcyAqLworCU5EVFBBX0dDX1NUQUxFVElNRSwJCS8qIHU2NCwgbXNlY3MgKi8KKwlORFRQQV9ERUxBWV9QUk9CRV9USU1FLAkJLyogdTY0LCBtc2VjcyAqLworCU5EVFBBX1FVRVVFX0xFTiwJCS8qIHUzMiAqLworCU5EVFBBX0FQUF9QUk9CRVMsCQkvKiB1MzIgKi8KKwlORFRQQV9VQ0FTVF9QUk9CRVMsCQkvKiB1MzIgKi8KKwlORFRQQV9NQ0FTVF9QUk9CRVMsCQkvKiB1MzIgKi8KKwlORFRQQV9BTllDQVNUX0RFTEFZLAkJLyogdTY0LCBtc2VjcyAqLworCU5EVFBBX1BST1hZX0RFTEFZLAkJLyogdTY0LCBtc2VjcyAqLworCU5EVFBBX1BST1hZX1FMRU4sCQkvKiB1MzIgKi8KKwlORFRQQV9MT0NLVElNRSwJCQkvKiB1NjQsIG1zZWNzICovCisJTkRUUEFfUVVFVUVfTEVOQllURVMsCQkvKiB1MzIgKi8KKwlORFRQQV9NQ0FTVF9SRVBST0JFUywJCS8qIHUzMiAqLworCV9fTkRUUEFfTUFYCit9OworI2RlZmluZSBORFRQQV9NQVggKF9fTkRUUEFfTUFYIC0gMSkKKworc3RydWN0IG5kdG1zZyB7CisJX191OAkJbmR0bV9mYW1pbHk7CisJX191OAkJbmR0bV9wYWQxOworCV9fdTE2CQluZHRtX3BhZDI7Cit9OworCitzdHJ1Y3QgbmR0X2NvbmZpZyB7CisJX191MTYJCW5kdGNfa2V5X2xlbjsKKwlfX3UxNgkJbmR0Y19lbnRyeV9zaXplOworCV9fdTMyCQluZHRjX2VudHJpZXM7CisJX191MzIJCW5kdGNfbGFzdF9mbHVzaDsJLyogZGVsdGEgdG8gbm93IGluIG1zZWNzICovCisJX191MzIJCW5kdGNfbGFzdF9yYW5kOwkJLyogZGVsdGEgdG8gbm93IGluIG1zZWNzICovCisJX191MzIJCW5kdGNfaGFzaF9ybmQ7CisJX191MzIJCW5kdGNfaGFzaF9tYXNrOworCV9fdTMyCQluZHRjX2hhc2hfY2hhaW5fZ2M7CisJX191MzIJCW5kdGNfcHJveHlfcWxlbjsKK307CisKK2VudW0geworCU5EVEFfVU5TUEVDLAorCU5EVEFfTkFNRSwJCQkvKiBjaGFyICosIHVuY2hhbmdlYWJsZSAqLworCU5EVEFfVEhSRVNIMSwJCQkvKiB1MzIgKi8KKwlORFRBX1RIUkVTSDIsCQkJLyogdTMyICovCisJTkRUQV9USFJFU0gzLAkJCS8qIHUzMiAqLworCU5EVEFfQ09ORklHLAkJCS8qIHN0cnVjdCBuZHRfY29uZmlnLCByZWFkLW9ubHkgKi8KKwlORFRBX1BBUk1TLAkJCS8qIG5lc3RlZCBUTFYgTkRUUEFfKiAqLworCU5EVEFfU1RBVFMsCQkJLyogc3RydWN0IG5kdF9zdGF0cywgcmVhZC1vbmx5ICovCisJTkRUQV9HQ19JTlRFUlZBTCwJCS8qIHU2NCwgbXNlY3MgKi8KKwlfX05EVEFfTUFYCit9OworI2RlZmluZSBORFRBX01BWCAoX19ORFRBX01BWCAtIDEpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9uZXRfbmFtZXNwYWNlLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L25ldF9uYW1lc3BhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTkyYjdlCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9uZXRfbmFtZXNwYWNlLmgKQEAgLTAsMCArMSwyMyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1IDZXSU5EIFMuQS4KKyAqIEF1dGhvcjogTmljb2xhcyBEaWNodGVsIDxuaWNvbGFzLmRpY2h0ZWxANndpbmQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2lmbmRlZiBfTElOVVhfTkVUX05BTUVTUEFDRV9IXworI2RlZmluZSBfTElOVVhfTkVUX05BTUVTUEFDRV9IXworCisvKiBBdHRyaWJ1dGVzIG9mIFJUTV9ORVdOU0lEL1JUTV9HRVROU0lEIG1lc3NhZ2VzICovCitlbnVtIHsKKwlORVROU0FfTk9ORSwKKyNkZWZpbmUgTkVUTlNBX05TSURfTk9UX0FTU0lHTkVEIC0xCisJTkVUTlNBX05TSUQsCisJTkVUTlNBX1BJRCwKKwlORVROU0FfRkQsCisJX19ORVROU0FfTUFYLAorfTsKKworI2RlZmluZSBORVROU0FfTUFYCQkoX19ORVROU0FfTUFYIC0gMSkKKworI2VuZGlmIC8qIF9MSU5VWF9ORVRfTkFNRVNQQUNFX0hfICovCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L25ldGNvbmYuaCBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvbmV0Y29uZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMTBmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L25ldGNvbmYuaApAQCAtMCwwICsxLDI2IEBACisjaWZuZGVmIF9MSU5VWF9ORVRDT05GX0hfCisjZGVmaW5lIF9MSU5VWF9ORVRDT05GX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKworc3RydWN0IG5ldGNvbmZtc2cgeworCV9fdTgJbmNtX2ZhbWlseTsKK307CisKK2VudW0geworCU5FVENPTkZBX1VOU1BFQywKKwlORVRDT05GQV9JRklOREVYLAorCU5FVENPTkZBX0ZPUldBUkRJTkcsCisJTkVUQ09ORkFfUlBfRklMVEVSLAorCU5FVENPTkZBX01DX0ZPUldBUkRJTkcsCisJTkVUQ09ORkFfUFJPWFlfTkVJR0gsCisJTkVUQ09ORkFfSUdOT1JFX1JPVVRFU19XSVRIX0xJTktET1dOLAorCV9fTkVUQ09ORkFfTUFYCit9OworI2RlZmluZSBORVRDT05GQV9NQVgJKF9fTkVUQ09ORkFfTUFYIC0gMSkKKworI2RlZmluZSBORVRDT05GQV9JRklOREVYX0FMTAkJLTEKKyNkZWZpbmUgTkVUQ09ORkFfSUZJTkRFWF9ERUZBVUxUCS0yCisKKyNlbmRpZiAvKiBfTElOVVhfTkVUQ09ORl9IXyAqLwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaCBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZmY2ViNAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlEZWZpbml0aW9ucyBmb3IgdGhlIEludGVyZmFjZXMgaGFuZGxlci4KKyAqCisgKiBWZXJzaW9uOglAKCMpZGV2LmgJMS4wLjEwCTA4LzEyLzkzCisgKgorICogQXV0aG9yczoJUm9zcyBCaXJvCisgKgkJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CisgKgkJQ29yZXkgTWlueWFyZCA8d2YtcmNoIW1pbnlhcmRAcmVsYXkuRVUubmV0PgorICoJCURvbmFsZCBKLiBCZWNrZXIsIDxiZWNrZXJAY2VzZGlzLmdzZmMubmFzYS5nb3Y+CisgKgkJQWxhbiBDb3gsIDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CisgKgkJQmpvcm4gRWt3YWxsLiA8Ymowcm5AYmxveC5zZT4KKyAqICAgICAgICAgICAgICBQZWtrYSBSaWlrb25lbiA8cHJpaWtvbmVAcG9zZWlkb24ucHNwdC5maT4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgkJTW92ZWQgdG8gL3Vzci9pbmNsdWRlL2xpbnV4IGZvciBORVQzCisgKi8KKyNpZm5kZWYgX0xJTlVYX05FVERFVklDRV9ICisjZGVmaW5lIF9MSU5VWF9ORVRERVZJQ0VfSAorCisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3BhY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2xpbmsuaD4KKworCisjZGVmaW5lIE1BWF9BRERSX0xFTgkzMgkJLyogTGFyZ2VzdCBoYXJkd2FyZSBhZGRyZXNzIGxlbmd0aCAqLworCisvKiBJbml0aWFsIG5ldCBkZXZpY2UgZ3JvdXAuIEFsbCBkZXZpY2VzIGJlbG9uZyB0byBncm91cCAwIGJ5IGRlZmF1bHQuICovCisjZGVmaW5lIElOSVRfTkVUREVWX0dST1VQCTAKKworCisvKiBpbnRlcmZhY2UgbmFtZSBhc3NpZ25tZW50IHR5cGVzIChzeXNmcyBuYW1lX2Fzc2lnbl90eXBlIGF0dHJpYnV0ZSkgKi8KKyNkZWZpbmUgTkVUX05BTUVfVU5LTk9XTgkwCS8qIHVua25vd24gb3JpZ2luIChub3QgZXhwb3NlZCB0byB1c2Vyc3BhY2UpICovCisjZGVmaW5lIE5FVF9OQU1FX0VOVU0JCTEJLyogZW51bWVyYXRlZCBieSBrZXJuZWwgKi8KKyNkZWZpbmUgTkVUX05BTUVfUFJFRElDVEFCTEUJMgkvKiBwcmVkaWN0YWJseSBuYW1lZCBieSB0aGUga2VybmVsICovCisjZGVmaW5lIE5FVF9OQU1FX1VTRVIJCTMJLyogcHJvdmlkZWQgYnkgdXNlci1zcGFjZSAqLworI2RlZmluZSBORVRfTkFNRV9SRU5BTUVECTQJLyogcmVuYW1lZCBieSB1c2VyLXNwYWNlICovCisKKy8qIE1lZGlhIHNlbGVjdGlvbiBvcHRpb25zLiAqLworZW51bSB7CisgICAgICAgIElGX1BPUlRfVU5LTk9XTiA9IDAsCisgICAgICAgIElGX1BPUlRfMTBCQVNFMiwKKyAgICAgICAgSUZfUE9SVF8xMEJBU0VULAorICAgICAgICBJRl9QT1JUX0FVSSwKKyAgICAgICAgSUZfUE9SVF8xMDBCQVNFVCwKKyAgICAgICAgSUZfUE9SVF8xMDBCQVNFVFgsCisgICAgICAgIElGX1BPUlRfMTAwQkFTRUZYCit9OworCisvKiBoYXJkd2FyZSBhZGRyZXNzIGFzc2lnbm1lbnQgdHlwZXMgKi8KKyNkZWZpbmUgTkVUX0FERFJfUEVSTQkJMAkvKiBhZGRyZXNzIGlzIHBlcm1hbmVudCAoZGVmYXVsdCkgKi8KKyNkZWZpbmUgTkVUX0FERFJfUkFORE9NCQkxCS8qIGFkZHJlc3MgaXMgZ2VuZXJhdGVkIHJhbmRvbWx5ICovCisjZGVmaW5lIE5FVF9BRERSX1NUT0xFTgkJMgkvKiBhZGRyZXNzIGlzIHN0b2xlbiBmcm9tIG90aGVyIGRldmljZSAqLworI2RlZmluZSBORVRfQUREUl9TRVQJCTMJLyogYWRkcmVzcyBpcyBzZXQgdXNpbmcKKwkJCQkJICogZGV2X3NldF9tYWNfYWRkcmVzcygpICovCisKKyNlbmRpZiAvKiBfTElOVVhfTkVUREVWSUNFX0ggKi8KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MWI0YzkKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci5oCkBAIC0wLDAgKzEsNzggQEAKKyNpZm5kZWYgX19MSU5VWF9ORVRGSUxURVJfSAorI2RlZmluZSBfX0xJTlVYX05FVEZJTFRFUl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKworLyogUmVzcG9uc2VzIGZyb20gaG9vayBmdW5jdGlvbnMuICovCisjZGVmaW5lIE5GX0RST1AgMAorI2RlZmluZSBORl9BQ0NFUFQgMQorI2RlZmluZSBORl9TVE9MRU4gMgorI2RlZmluZSBORl9RVUVVRSAzCisjZGVmaW5lIE5GX1JFUEVBVCA0CisjZGVmaW5lIE5GX1NUT1AgNQorI2RlZmluZSBORl9NQVhfVkVSRElDVCBORl9TVE9QCisKKy8qIHdlIG92ZXJsb2FkIHRoZSBoaWdoZXIgYml0cyBmb3IgZW5jb2RpbmcgYXV4aWxpYXJ5IGRhdGEgc3VjaCBhcyB0aGUgcXVldWUKKyAqIG51bWJlciBvciBlcnJubyB2YWx1ZXMuIE5vdCBuaWNlLCBidXQgYmV0dGVyIHRoYW4gYWRkaXRpb25hbCBmdW5jdGlvbgorICogYXJndW1lbnRzLiAqLworI2RlZmluZSBORl9WRVJESUNUX01BU0sgMHgwMDAwMDBmZgorCisvKiBleHRyYSB2ZXJkaWN0IGZsYWdzIGhhdmUgbWFzayAweDAwMDBmZjAwICovCisjZGVmaW5lIE5GX1ZFUkRJQ1RfRkxBR19RVUVVRV9CWVBBU1MJMHgwMDAwODAwMAorCisvKiBxdWV1ZSBudW1iZXIgKE5GX1FVRVVFKSBvciBlcnJubyAoTkZfRFJPUCkgKi8KKyNkZWZpbmUgTkZfVkVSRElDVF9RTUFTSyAweGZmZmYwMDAwCisjZGVmaW5lIE5GX1ZFUkRJQ1RfUUJJVFMgMTYKKworI2RlZmluZSBORl9RVUVVRV9OUih4KSAoKCgoeCkgPDwgMTYpICYgTkZfVkVSRElDVF9RTUFTSykgfCBORl9RVUVVRSkKKworI2RlZmluZSBORl9EUk9QX0VSUih4KSAoKCgteCkgPDwgMTYpIHwgTkZfRFJPUCkKKworLyogb25seSBmb3IgdXNlcnNwYWNlIGNvbXBhdGliaWxpdHkgKi8KKy8qIEdlbmVyaWMgY2FjaGUgcmVzcG9uc2VzIGZyb20gaG9vayBmdW5jdGlvbnMuCisgICA8PSAweDIwMDAgaXMgdXNlZCBmb3IgcHJvdG9jb2wtZmxhZ3MuICovCisjZGVmaW5lIE5GQ19VTktOT1dOIDB4NDAwMAorI2RlZmluZSBORkNfQUxURVJFRCAweDgwMDAKKworLyogTkZfVkVSRElDVF9CSVRTIHNob3VsZCBiZSA4IG5vdywgYnV0IHVzZXJzcGFjZSBtaWdodCBicmVhayBpZiB0aGlzIGNoYW5nZXMgKi8KKyNkZWZpbmUgTkZfVkVSRElDVF9CSVRTIDE2CisKK2VudW0gbmZfaW5ldF9ob29rcyB7CisJTkZfSU5FVF9QUkVfUk9VVElORywKKwlORl9JTkVUX0xPQ0FMX0lOLAorCU5GX0lORVRfRk9SV0FSRCwKKwlORl9JTkVUX0xPQ0FMX09VVCwKKwlORl9JTkVUX1BPU1RfUk9VVElORywKKwlORl9JTkVUX05VTUhPT0tTCit9OworCitlbnVtIG5mX2Rldl9ob29rcyB7CisJTkZfTkVUREVWX0lOR1JFU1MsCisJTkZfTkVUREVWX05VTUhPT0tTCit9OworCitlbnVtIHsKKwlORlBST1RPX1VOU1BFQyA9ICAwLAorCU5GUFJPVE9fSU5FVCAgID0gIDEsCisJTkZQUk9UT19JUFY0ICAgPSAgMiwKKwlORlBST1RPX0FSUCAgICA9ICAzLAorCU5GUFJPVE9fTkVUREVWID0gIDUsCisJTkZQUk9UT19CUklER0UgPSAgNywKKwlORlBST1RPX0lQVjYgICA9IDEwLAorCU5GUFJPVE9fREVDTkVUID0gMTIsCisJTkZQUk9UT19OVU1QUk9UTywKK307CisKK3VuaW9uIG5mX2luZXRfYWRkciB7CisJX191MzIJCWFsbFs0XTsKKwlfX2JlMzIJCWlwOworCV9fYmUzMgkJaXA2WzRdOworCXN0cnVjdCBpbl9hZGRyCWluOworCXN0cnVjdCBpbjZfYWRkcglpbjY7Cit9OworCisjZW5kaWYgLyogX19MSU5VWF9ORVRGSUxURVJfSCAqLwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaCBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEyMDk3MAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmgKQEAgLTAsMCArMSwxODUgQEAKKyNpZm5kZWYgX1hfVEFCTEVTX0gKKyNkZWZpbmUgX1hfVEFCTEVTX0gKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIFhUX0ZVTkNUSU9OX01BWE5BTUVMRU4gMzAKKyNkZWZpbmUgWFRfRVhURU5TSU9OX01BWE5BTUVMRU4gMjkKKyNkZWZpbmUgWFRfVEFCTEVfTUFYTkFNRUxFTiAzMgorCitzdHJ1Y3QgeHRfZW50cnlfbWF0Y2ggeworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTE2IG1hdGNoX3NpemU7CisKKwkJCS8qIFVzZWQgYnkgdXNlcnNwYWNlICovCisJCQljaGFyIG5hbWVbWFRfRVhURU5TSU9OX01BWE5BTUVMRU5dOworCQkJX191OCByZXZpc2lvbjsKKwkJfSB1c2VyOworCQlzdHJ1Y3QgeworCQkJX191MTYgbWF0Y2hfc2l6ZTsKKworCQkJLyogVXNlZCBpbnNpZGUgdGhlIGtlcm5lbCAqLworCQkJc3RydWN0IHh0X21hdGNoICptYXRjaDsKKwkJfSBrZXJuZWw7CisKKwkJLyogVG90YWwgbGVuZ3RoICovCisJCV9fdTE2IG1hdGNoX3NpemU7CisJfSB1OworCisJdW5zaWduZWQgY2hhciBkYXRhWzBdOworfTsKKworc3RydWN0IHh0X2VudHJ5X3RhcmdldCB7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX191MTYgdGFyZ2V0X3NpemU7CisKKwkJCS8qIFVzZWQgYnkgdXNlcnNwYWNlICovCisJCQljaGFyIG5hbWVbWFRfRVhURU5TSU9OX01BWE5BTUVMRU5dOworCQkJX191OCByZXZpc2lvbjsKKwkJfSB1c2VyOworCQlzdHJ1Y3QgeworCQkJX191MTYgdGFyZ2V0X3NpemU7CisKKwkJCS8qIFVzZWQgaW5zaWRlIHRoZSBrZXJuZWwgKi8KKwkJCXN0cnVjdCB4dF90YXJnZXQgKnRhcmdldDsKKwkJfSBrZXJuZWw7CisKKwkJLyogVG90YWwgbGVuZ3RoICovCisJCV9fdTE2IHRhcmdldF9zaXplOworCX0gdTsKKworCXVuc2lnbmVkIGNoYXIgZGF0YVswXTsKK307CisKKyNkZWZpbmUgWFRfVEFSR0VUX0lOSVQoX19uYW1lLCBfX3NpemUpCQkJCQkgICAgICAgXAorewkJCQkJCQkJCSAgICAgICBcCisJLnRhcmdldC51LnVzZXIgPSB7CQkJCQkJICAgICAgIFwKKwkJLnRhcmdldF9zaXplCT0gWFRfQUxJR04oX19zaXplKSwJCQkgICAgICAgXAorCQkubmFtZQkJPSBfX25hbWUsCQkJCSAgICAgICBcCisJfSwJCQkJCQkJCSAgICAgICBcCit9CisKK3N0cnVjdCB4dF9zdGFuZGFyZF90YXJnZXQgeworCXN0cnVjdCB4dF9lbnRyeV90YXJnZXQgdGFyZ2V0OworCWludCB2ZXJkaWN0OworfTsKKworc3RydWN0IHh0X2Vycm9yX3RhcmdldCB7CisJc3RydWN0IHh0X2VudHJ5X3RhcmdldCB0YXJnZXQ7CisJY2hhciBlcnJvcm5hbWVbWFRfRlVOQ1RJT05fTUFYTkFNRUxFTl07Cit9OworCisvKiBUaGUgYXJndW1lbnQgdG8gSVBUX1NPX0dFVF9SRVZJU0lPTl8qLiAgUmV0dXJucyBoaWdoZXN0IHJldmlzaW9uCisgKiBrZXJuZWwgc3VwcG9ydHMsIGlmID49IHJldmlzaW9uLiAqLworc3RydWN0IHh0X2dldF9yZXZpc2lvbiB7CisJY2hhciBuYW1lW1hUX0VYVEVOU0lPTl9NQVhOQU1FTEVOXTsKKwlfX3U4IHJldmlzaW9uOworfTsKKworLyogQ09OVElOVUUgdmVyZGljdCBmb3IgdGFyZ2V0cyAqLworI2RlZmluZSBYVF9DT05USU5VRSAweEZGRkZGRkZGCisKKy8qIEZvciBzdGFuZGFyZCB0YXJnZXQgKi8KKyNkZWZpbmUgWFRfUkVUVVJOICgtTkZfUkVQRUFUIC0gMSkKKworLyogdGhpcyBpcyBhIGR1bW15IHN0cnVjdHVyZSB0byBmaW5kIG91dCB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50IGZvciBhIHN0cnVjdAorICogY29udGFpbmluZyBhbGwgdGhlIGZ1bmRhbWVudGFsIGRhdGEgdHlwZXMgdGhhdCBhcmUgdXNlZCBpbiBpcHRfZW50cnksCisgKiBpcDZ0X2VudHJ5IGFuZCBhcnB0X2VudHJ5LiAgVGhpcyBzdWNrcywgYW5kIGl0IGlzIGEgaGFjay4gIEl0IHdpbGwgYmUgbXkKKyAqIHBlcnNvbmFsIHBsZWFzdXJlIHRvIHJlbW92ZSBpdCAtSFcKKyAqLworc3RydWN0IF94dF9hbGlnbiB7CisJX191OCB1ODsKKwlfX3UxNiB1MTY7CisJX191MzIgdTMyOworCV9fdTY0IHU2NDsKK307CisKKyNkZWZpbmUgWFRfQUxJR04ocykgX19BTElHTl9LRVJORUwoKHMpLCBfX2FsaWdub2ZfXyhzdHJ1Y3QgX3h0X2FsaWduKSkKKworLyogU3RhbmRhcmQgcmV0dXJuIHZlcmRpY3QsIG9yIGRvIGp1bXAuICovCisjZGVmaW5lIFhUX1NUQU5EQVJEX1RBUkdFVCAiIgorLyogRXJyb3IgdmVyZGljdC4gKi8KKyNkZWZpbmUgWFRfRVJST1JfVEFSR0VUICJFUlJPUiIKKworI2RlZmluZSBTRVRfQ09VTlRFUihjLGIscCkgZG8geyAoYykuYmNudCA9IChiKTsgKGMpLnBjbnQgPSAocCk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgQUREX0NPVU5URVIoYyxiLHApIGRvIHsgKGMpLmJjbnQgKz0gKGIpOyAoYykucGNudCArPSAocCk7IH0gd2hpbGUoMCkKKworc3RydWN0IHh0X2NvdW50ZXJzIHsKKwlfX3U2NCBwY250LCBiY250OwkJCS8qIFBhY2tldCBhbmQgYnl0ZSBjb3VudGVycyAqLworfTsKKworLyogVGhlIGFyZ3VtZW50IHRvIElQVF9TT19BRERfQ09VTlRFUlMuICovCitzdHJ1Y3QgeHRfY291bnRlcnNfaW5mbyB7CisJLyogV2hpY2ggdGFibGUuICovCisJY2hhciBuYW1lW1hUX1RBQkxFX01BWE5BTUVMRU5dOworCisJdW5zaWduZWQgaW50IG51bV9jb3VudGVyczsKKworCS8qIFRoZSBjb3VudGVycyAoYWN0dWFsbHkgYG51bWJlcicgb2YgdGhlc2UpLiAqLworCXN0cnVjdCB4dF9jb3VudGVycyBjb3VudGVyc1swXTsKK307CisKKyNkZWZpbmUgWFRfSU5WX1BST1RPCQkweDQwCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgUFJPVE8uICovCisKKy8qIGZuIHJldHVybnMgMCB0byBjb250aW51ZSBpdGVyYXRpb24gKi8KKyNkZWZpbmUgWFRfTUFUQ0hfSVRFUkFURSh0eXBlLCBlLCBmbiwgYXJncy4uLikJCQlcCisoewkJCQkJCQkJXAorCXVuc2lnbmVkIGludCBfX2k7CQkJCQlcCisJaW50IF9fcmV0ID0gMDsJCQkJCQlcCisJc3RydWN0IHh0X2VudHJ5X21hdGNoICpfX207CQkJCVwKKwkJCQkJCQkJXAorCWZvciAoX19pID0gc2l6ZW9mKHR5cGUpOwkJCQlcCisJICAgICBfX2kgPCAoZSktPnRhcmdldF9vZmZzZXQ7CQkJCVwKKwkgICAgIF9faSArPSBfX20tPnUubWF0Y2hfc2l6ZSkgewkJCVwKKwkJX19tID0gKHZvaWQgKillICsgX19pOwkJCQlcCisJCQkJCQkJCVwKKwkJX19yZXQgPSBmbihfX20gLCAjIyBhcmdzKTsJCQlcCisJCWlmIChfX3JldCAhPSAwKQkJCQkJXAorCQkJYnJlYWs7CQkJCQlcCisJfQkJCQkJCQlcCisJX19yZXQ7CQkJCQkJCVwKK30pCisKKy8qIGZuIHJldHVybnMgMCB0byBjb250aW51ZSBpdGVyYXRpb24gKi8KKyNkZWZpbmUgWFRfRU5UUllfSVRFUkFURV9DT05USU5VRSh0eXBlLCBlbnRyaWVzLCBzaXplLCBuLCBmbiwgYXJncy4uLikgXAorKHsJCQkJCQkJCVwKKwl1bnNpZ25lZCBpbnQgX19pLCBfX247CQkJCQlcCisJaW50IF9fcmV0ID0gMDsJCQkJCQlcCisJdHlwZSAqX19lbnRyeTsJCQkJCQlcCisJCQkJCQkJCVwKKwlmb3IgKF9faSA9IDAsIF9fbiA9IDA7IF9faSA8IChzaXplKTsJCQlcCisJICAgICBfX2kgKz0gX19lbnRyeS0+bmV4dF9vZmZzZXQsIF9fbisrKSB7IAkJXAorCQlfX2VudHJ5ID0gKHZvaWQgKikoZW50cmllcykgKyBfX2k7CQlcCisJCWlmIChfX24gPCBuKQkJCQkJXAorCQkJY29udGludWU7CQkJCVwKKwkJCQkJCQkJXAorCQlfX3JldCA9IGZuKF9fZW50cnkgLCAjIyBhcmdzKTsJCQlcCisJCWlmIChfX3JldCAhPSAwKQkJCQkJXAorCQkJYnJlYWs7CQkJCQlcCisJfQkJCQkJCQlcCisJX19yZXQ7CQkJCQkJCVwKK30pCisKKy8qIGZuIHJldHVybnMgMCB0byBjb250aW51ZSBpdGVyYXRpb24gKi8KKyNkZWZpbmUgWFRfRU5UUllfSVRFUkFURSh0eXBlLCBlbnRyaWVzLCBzaXplLCBmbiwgYXJncy4uLikgXAorCVhUX0VOVFJZX0lURVJBVEVfQ09OVElOVUUodHlwZSwgZW50cmllcywgc2l6ZSwgMCwgZm4sIGFyZ3MpCisKKworLyogcG9zIGlzIG5vcm1hbGx5IGEgc3RydWN0IGlwdF9lbnRyeS9pcDZ0X2VudHJ5L2V0Yy4gKi8KKyNkZWZpbmUgeHRfZW50cnlfZm9yZWFjaChwb3MsIGVoZWFkLCBlc2l6ZSkgXAorCWZvciAoKHBvcykgPSAodHlwZW9mKHBvcykpKGVoZWFkKTsgXAorCSAgICAgKHBvcykgPCAodHlwZW9mKHBvcykpKChjaGFyICopKGVoZWFkKSArIChlc2l6ZSkpOyBcCisJICAgICAocG9zKSA9ICh0eXBlb2YocG9zKSkoKGNoYXIgKikocG9zKSArIChwb3MpLT5uZXh0X29mZnNldCkpCisKKy8qIGNhbiBvbmx5IGJlIHh0X2VudHJ5X21hdGNoLCBzbyBubyB1c2Ugb2YgdHlwZW9mIGhlcmUgKi8KKyNkZWZpbmUgeHRfZW1hdGNoX2ZvcmVhY2gocG9zLCBlbnRyeSkgXAorCWZvciAoKHBvcykgPSAoc3RydWN0IHh0X2VudHJ5X21hdGNoICopZW50cnktPmVsZW1zOyBcCisJICAgICAocG9zKSA8IChzdHJ1Y3QgeHRfZW50cnlfbWF0Y2ggKikoKGNoYXIgKikoZW50cnkpICsgXAorCSAgICAgICAgICAgICAoZW50cnkpLT50YXJnZXRfb2Zmc2V0KTsgXAorCSAgICAgKHBvcykgPSAoc3RydWN0IHh0X2VudHJ5X21hdGNoICopKChjaGFyICopKHBvcykgKyBcCisJICAgICAgICAgICAgIChwb3MpLT51Lm1hdGNoX3NpemUpKQorCisKKyNlbmRpZiAvKiBfWF9UQUJMRVNfSCAqLwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfdGNwdWRwLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF90Y3B1ZHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGFhN2IzCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfdGNwdWRwLmgKQEAgLTAsMCArMSwzNiBAQAorI2lmbmRlZiBfWFRfVENQVURQX0gKKyNkZWZpbmUgX1hUX1RDUFVEUF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBUQ1AgbWF0Y2hpbmcgc3R1ZmYgKi8KK3N0cnVjdCB4dF90Y3AgeworCV9fdTE2IHNwdHNbMl07CQkJLyogU291cmNlIHBvcnQgcmFuZ2UuICovCisJX191MTYgZHB0c1syXTsJCQkvKiBEZXN0aW5hdGlvbiBwb3J0IHJhbmdlLiAqLworCV9fdTggb3B0aW9uOwkJCS8qIFRDUCBPcHRpb24gaWZmIG5vbi16ZXJvKi8KKwlfX3U4IGZsZ19tYXNrOwkJCS8qIFRDUCBmbGFncyBtYXNrIGJ5dGUgKi8KKwlfX3U4IGZsZ19jbXA7CQkJLyogVENQIGZsYWdzIGNvbXBhcmUgYnl0ZSAqLworCV9fdTggaW52ZmxhZ3M7CQkJLyogSW52ZXJzZSBmbGFncyAqLworfTsKKworLyogVmFsdWVzIGZvciAiaW52IiBmaWVsZCBpbiBzdHJ1Y3QgaXB0X3RjcC4gKi8KKyNkZWZpbmUgWFRfVENQX0lOVl9TUkNQVAkweDAxCS8qIEludmVydCB0aGUgc2Vuc2Ugb2Ygc291cmNlIHBvcnRzLiAqLworI2RlZmluZSBYVF9UQ1BfSU5WX0RTVFBUCTB4MDIJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBkZXN0IHBvcnRzLiAqLworI2RlZmluZSBYVF9UQ1BfSU5WX0ZMQUdTCTB4MDQJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBUQ1AgZmxhZ3MuICovCisjZGVmaW5lIFhUX1RDUF9JTlZfT1BUSU9OCTB4MDgJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBvcHRpb24gdGVzdC4gKi8KKyNkZWZpbmUgWFRfVENQX0lOVl9NQVNLCQkweDBGCS8qIEFsbCBwb3NzaWJsZSBmbGFncy4gKi8KKworLyogVURQIG1hdGNoaW5nIHN0dWZmICovCitzdHJ1Y3QgeHRfdWRwIHsKKwlfX3UxNiBzcHRzWzJdOwkJCS8qIFNvdXJjZSBwb3J0IHJhbmdlLiAqLworCV9fdTE2IGRwdHNbMl07CQkJLyogRGVzdGluYXRpb24gcG9ydCByYW5nZS4gKi8KKwlfX3U4IGludmZsYWdzOwkJCS8qIEludmVyc2UgZmxhZ3MgKi8KK307CisKKy8qIFZhbHVlcyBmb3IgImludmZsYWdzIiBmaWVsZCBpbiBzdHJ1Y3QgaXB0X3VkcC4gKi8KKyNkZWZpbmUgWFRfVURQX0lOVl9TUkNQVAkweDAxCS8qIEludmVydCB0aGUgc2Vuc2Ugb2Ygc291cmNlIHBvcnRzLiAqLworI2RlZmluZSBYVF9VRFBfSU5WX0RTVFBUCTB4MDIJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBkZXN0IHBvcnRzLiAqLworI2RlZmluZSBYVF9VRFBfSU5WX01BU0sJMHgwMwkvKiBBbGwgcG9zc2libGUgZmxhZ3MuICovCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0LmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVmNGRjNwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQuaApAQCAtMCwwICsxLDc5IEBACisvKiBJUHY0LXNwZWNpZmljIGRlZmluZXMgZm9yIG5ldGZpbHRlci4gCisgKiAoQykxOTk4IFJ1c3R5IFJ1c3NlbGwgLS0gVGhpcyBjb2RlIGlzIEdQTC4KKyAqLworI2lmbmRlZiBfX0xJTlVYX0lQX05FVEZJTFRFUl9ICisjZGVmaW5lIF9fTElOVVhfSVBfTkVURklMVEVSX0gKKworCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisKKy8qIG9ubHkgZm9yIHVzZXJzcGFjZSBjb21wYXRpYmlsaXR5ICovCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4gLyogZm9yIElOVF9NSU4sIElOVF9NQVggKi8KKworLyogSVAgQ2FjaGUgYml0cy4gKi8KKy8qIFNyYyBJUCBhZGRyZXNzLiAqLworI2RlZmluZSBORkNfSVBfU1JDCQkweDAwMDEKKy8qIERlc3QgSVAgYWRkcmVzcy4gKi8KKyNkZWZpbmUgTkZDX0lQX0RTVAkJMHgwMDAyCisvKiBJbnB1dCBkZXZpY2UuICovCisjZGVmaW5lIE5GQ19JUF9JRl9JTgkJMHgwMDA0CisvKiBPdXRwdXQgZGV2aWNlLiAqLworI2RlZmluZSBORkNfSVBfSUZfT1VUCQkweDAwMDgKKy8qIFRPUy4gKi8KKyNkZWZpbmUgTkZDX0lQX1RPUwkJMHgwMDEwCisvKiBQcm90b2NvbC4gKi8KKyNkZWZpbmUgTkZDX0lQX1BST1RPCQkweDAwMjAKKy8qIElQIG9wdGlvbnMuICovCisjZGVmaW5lIE5GQ19JUF9PUFRJT05TCQkweDAwNDAKKy8qIEZyYWcgJiBmbGFncy4gKi8KKyNkZWZpbmUgTkZDX0lQX0ZSQUcJCTB4MDA4MAorCisvKiBQZXItcHJvdG9jb2wgaW5mb3JtYXRpb246IG9ubHkgbWF0dGVycyBpZiBwcm90byBtYXRjaC4gKi8KKy8qIFRDUCBmbGFncy4gKi8KKyNkZWZpbmUgTkZDX0lQX1RDUEZMQUdTCQkweDAxMDAKKy8qIFNvdXJjZSBwb3J0LiAqLworI2RlZmluZSBORkNfSVBfU1JDX1BUCQkweDAyMDAKKy8qIERlc3QgcG9ydC4gKi8KKyNkZWZpbmUgTkZDX0lQX0RTVF9QVAkJMHgwNDAwCisvKiBTb21ldGhpbmcgZWxzZSBhYm91dCB0aGUgcHJvdG8gKi8KKyNkZWZpbmUgTkZDX0lQX1BST1RPX1VOS05PV04JMHgyMDAwCisKKy8qIElQIEhvb2tzICovCisvKiBBZnRlciBwcm9taXNjIGRyb3BzLCBjaGVja3N1bSBjaGVja3MuICovCisjZGVmaW5lIE5GX0lQX1BSRV9ST1VUSU5HCTAKKy8qIElmIHRoZSBwYWNrZXQgaXMgZGVzdGluZWQgZm9yIHRoaXMgYm94LiAqLworI2RlZmluZSBORl9JUF9MT0NBTF9JTgkJMQorLyogSWYgdGhlIHBhY2tldCBpcyBkZXN0aW5lZCBmb3IgYW5vdGhlciBpbnRlcmZhY2UuICovCisjZGVmaW5lIE5GX0lQX0ZPUldBUkQJCTIKKy8qIFBhY2tldHMgY29taW5nIGZyb20gYSBsb2NhbCBwcm9jZXNzLiAqLworI2RlZmluZSBORl9JUF9MT0NBTF9PVVQJCTMKKy8qIFBhY2tldHMgYWJvdXQgdG8gaGl0IHRoZSB3aXJlLiAqLworI2RlZmluZSBORl9JUF9QT1NUX1JPVVRJTkcJNAorI2RlZmluZSBORl9JUF9OVU1IT09LUwkJNQorCitlbnVtIG5mX2lwX2hvb2tfcHJpb3JpdGllcyB7CisJTkZfSVBfUFJJX0ZJUlNUID0gSU5UX01JTiwKKwlORl9JUF9QUklfQ09OTlRSQUNLX0RFRlJBRyA9IC00MDAsCisJTkZfSVBfUFJJX1JBVyA9IC0zMDAsCisJTkZfSVBfUFJJX1NFTElOVVhfRklSU1QgPSAtMjI1LAorCU5GX0lQX1BSSV9DT05OVFJBQ0sgPSAtMjAwLAorCU5GX0lQX1BSSV9NQU5HTEUgPSAtMTUwLAorCU5GX0lQX1BSSV9OQVRfRFNUID0gLTEwMCwKKwlORl9JUF9QUklfRklMVEVSID0gMCwKKwlORl9JUF9QUklfU0VDVVJJVFkgPSA1MCwKKwlORl9JUF9QUklfTkFUX1NSQyA9IDEwMCwKKwlORl9JUF9QUklfU0VMSU5VWF9MQVNUID0gMjI1LAorCU5GX0lQX1BSSV9DT05OVFJBQ0tfSEVMUEVSID0gMzAwLAorCU5GX0lQX1BSSV9DT05OVFJBQ0tfQ09ORklSTSA9IElOVF9NQVgsCisJTkZfSVBfUFJJX0xBU1QgPSBJTlRfTUFYLAorfTsKKworLyogQXJndW1lbnRzIGZvciBzZXRzb2Nrb3B0IFNPTF9JUDogKi8KKy8qIDIuMCBmaXJld2FsbGluZyB3ZW50IGZyb20gNjQgdGhyb3VnaCA3MSAoYW5kICsyNTYsICs1MTIsIGV0YykuICovCisvKiAyLjIgZmlyZXdhbGxpbmcgKCsgbWFzcSkgd2VudCBmcm9tIDY0IHRocm91Z2ggNzYgKi8KKy8qIDIuNCBmaXJld2FsbGluZyB3ZW50IDY0IHRocm91Z2ggNjcuICovCisjZGVmaW5lIFNPX09SSUdJTkFMX0RTVCA4MAorCisKKyNlbmRpZiAvKiBfX0xJTlVYX0lQX05FVEZJTFRFUl9IICovCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODU0MmI0Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaApAQCAtMCwwICsxLDIyNyBAQAorLyoKKyAqIDI1LUp1bC0xOTk4IE1ham9yIGNoYW5nZXMgdG8gYWxsb3cgZm9yIGlwIGNoYWluIHRhYmxlCisgKgorICogMy1KYW4tMjAwMCBOYW1lZCB0YWJsZXMgdG8gYWxsb3cgcGFja2V0IHNlbGVjdGlvbiBmb3IgZGlmZmVyZW50IHVzZXMuCisgKi8KKworLyoKKyAqIAlGb3JtYXQgb2YgYW4gSVAgZmlyZXdhbGwgZGVzY3JpcHRvcgorICoKKyAqIAlzcmMsIGRzdCwgc3JjX21hc2ssIGRzdF9tYXNrIGFyZSBhbHdheXMgc3RvcmVkIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KKyAqIAlmbGFncyBhcmUgc3RvcmVkIGluIGhvc3QgYnl0ZSBvcmRlciAob2YgY291cnNlKS4KKyAqIAlQb3J0IG51bWJlcnMgYXJlIHN0b3JlZCBpbiBIT1NUIGJ5dGUgb3JkZXIuCisgKi8KKworI2lmbmRlZiBfSVBUQUJMRVNfSAorI2RlZmluZSBfSVBUQUJMRVNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKworI2RlZmluZSBJUFRfRlVOQ1RJT05fTUFYTkFNRUxFTiBYVF9GVU5DVElPTl9NQVhOQU1FTEVOCisjZGVmaW5lIElQVF9UQUJMRV9NQVhOQU1FTEVOIFhUX1RBQkxFX01BWE5BTUVMRU4KKyNkZWZpbmUgaXB0X21hdGNoIHh0X21hdGNoCisjZGVmaW5lIGlwdF90YXJnZXQgeHRfdGFyZ2V0CisjZGVmaW5lIGlwdF90YWJsZSB4dF90YWJsZQorI2RlZmluZSBpcHRfZ2V0X3JldmlzaW9uIHh0X2dldF9yZXZpc2lvbgorI2RlZmluZSBpcHRfZW50cnlfbWF0Y2ggeHRfZW50cnlfbWF0Y2gKKyNkZWZpbmUgaXB0X2VudHJ5X3RhcmdldCB4dF9lbnRyeV90YXJnZXQKKyNkZWZpbmUgaXB0X3N0YW5kYXJkX3RhcmdldCB4dF9zdGFuZGFyZF90YXJnZXQKKyNkZWZpbmUgaXB0X2Vycm9yX3RhcmdldCB4dF9lcnJvcl90YXJnZXQKKyNkZWZpbmUgaXB0X2NvdW50ZXJzIHh0X2NvdW50ZXJzCisjZGVmaW5lIElQVF9DT05USU5VRSBYVF9DT05USU5VRQorI2RlZmluZSBJUFRfUkVUVVJOIFhUX1JFVFVSTgorCisvKiBUaGlzIGdyb3VwIGlzIG9sZGVyIHRoYW4gb2xkIChpcHRhYmxlcyA8IHYxLjQuMC1yYzF+ODkpICovCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3RjcHVkcC5oPgorI2RlZmluZSBpcHRfdWRwIHh0X3VkcAorI2RlZmluZSBpcHRfdGNwIHh0X3RjcAorI2RlZmluZSBJUFRfVENQX0lOVl9TUkNQVAlYVF9UQ1BfSU5WX1NSQ1BUCisjZGVmaW5lIElQVF9UQ1BfSU5WX0RTVFBUCVhUX1RDUF9JTlZfRFNUUFQKKyNkZWZpbmUgSVBUX1RDUF9JTlZfRkxBR1MJWFRfVENQX0lOVl9GTEFHUworI2RlZmluZSBJUFRfVENQX0lOVl9PUFRJT04JWFRfVENQX0lOVl9PUFRJT04KKyNkZWZpbmUgSVBUX1RDUF9JTlZfTUFTSwlYVF9UQ1BfSU5WX01BU0sKKyNkZWZpbmUgSVBUX1VEUF9JTlZfU1JDUFQJWFRfVURQX0lOVl9TUkNQVAorI2RlZmluZSBJUFRfVURQX0lOVl9EU1RQVAlYVF9VRFBfSU5WX0RTVFBUCisjZGVmaW5lIElQVF9VRFBfSU5WX01BU0sJWFRfVURQX0lOVl9NQVNLCisKKy8qIFRoZSBhcmd1bWVudCB0byBJUFRfU09fQUREX0NPVU5URVJTLiAqLworI2RlZmluZSBpcHRfY291bnRlcnNfaW5mbyB4dF9jb3VudGVyc19pbmZvCisvKiBTdGFuZGFyZCByZXR1cm4gdmVyZGljdCwgb3IgZG8ganVtcC4gKi8KKyNkZWZpbmUgSVBUX1NUQU5EQVJEX1RBUkdFVCBYVF9TVEFOREFSRF9UQVJHRVQKKy8qIEVycm9yIHZlcmRpY3QuICovCisjZGVmaW5lIElQVF9FUlJPUl9UQVJHRVQgWFRfRVJST1JfVEFSR0VUCisKKy8qIGZuIHJldHVybnMgMCB0byBjb250aW51ZSBpdGVyYXRpb24gKi8KKyNkZWZpbmUgSVBUX01BVENIX0lURVJBVEUoZSwgZm4sIGFyZ3MuLi4pIFwKKwlYVF9NQVRDSF9JVEVSQVRFKHN0cnVjdCBpcHRfZW50cnksIGUsIGZuLCAjIyBhcmdzKQorCisvKiBmbiByZXR1cm5zIDAgdG8gY29udGludWUgaXRlcmF0aW9uICovCisjZGVmaW5lIElQVF9FTlRSWV9JVEVSQVRFKGVudHJpZXMsIHNpemUsIGZuLCBhcmdzLi4uKSBcCisJWFRfRU5UUllfSVRFUkFURShzdHJ1Y3QgaXB0X2VudHJ5LCBlbnRyaWVzLCBzaXplLCBmbiwgIyMgYXJncykKKworLyogWWVzLCBWaXJnaW5pYSwgeW91IGhhdmUgdG8gemVybyB0aGUgcGFkZGluZy4gKi8KK3N0cnVjdCBpcHRfaXAgeworCS8qIFNvdXJjZSBhbmQgZGVzdGluYXRpb24gSVAgYWRkciAqLworCXN0cnVjdCBpbl9hZGRyIHNyYywgZHN0OworCS8qIE1hc2sgZm9yIHNyYyBhbmQgZGVzdCBJUCBhZGRyICovCisJc3RydWN0IGluX2FkZHIgc21zaywgZG1zazsKKwljaGFyIGluaWZhY2VbSUZOQU1TSVpdLCBvdXRpZmFjZVtJRk5BTVNJWl07CisJdW5zaWduZWQgY2hhciBpbmlmYWNlX21hc2tbSUZOQU1TSVpdLCBvdXRpZmFjZV9tYXNrW0lGTkFNU0laXTsKKworCS8qIFByb3RvY29sLCAwID0gQU5ZICovCisJX191MTYgcHJvdG87CisKKwkvKiBGbGFncyB3b3JkICovCisJX191OCBmbGFnczsKKwkvKiBJbnZlcnNlIGZsYWdzICovCisJX191OCBpbnZmbGFnczsKK307CisKKy8qIFZhbHVlcyBmb3IgImZsYWciIGZpZWxkIGluIHN0cnVjdCBpcHRfaXAgKGdlbmVyYWwgaXAgc3RydWN0dXJlKS4gKi8KKyNkZWZpbmUgSVBUX0ZfRlJBRwkJMHgwMQkvKiBTZXQgaWYgcnVsZSBpcyBhIGZyYWdtZW50IHJ1bGUgKi8KKyNkZWZpbmUgSVBUX0ZfR09UTwkJMHgwMgkvKiBTZXQgaWYganVtcCBpcyBhIGdvdG8gKi8KKyNkZWZpbmUgSVBUX0ZfTUFTSwkJMHgwMwkvKiBBbGwgcG9zc2libGUgZmxhZyBiaXRzIG1hc2suICovCisKKy8qIFZhbHVlcyBmb3IgImludiIgZmllbGQgaW4gc3RydWN0IGlwdF9pcC4gKi8KKyNkZWZpbmUgSVBUX0lOVl9WSUFfSU4JCTB4MDEJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBJTiBJRkFDRS4gKi8KKyNkZWZpbmUgSVBUX0lOVl9WSUFfT1VUCQkweDAyCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgT1VUIElGQUNFICovCisjZGVmaW5lIElQVF9JTlZfVE9TCQkweDA0CS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgVE9TLiAqLworI2RlZmluZSBJUFRfSU5WX1NSQ0lQCQkweDA4CS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgU1JDIElQLiAqLworI2RlZmluZSBJUFRfSU5WX0RTVElQCQkweDEwCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgRFNUIE9QLiAqLworI2RlZmluZSBJUFRfSU5WX0ZSQUcJCTB4MjAJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBGUkFHLiAqLworI2RlZmluZSBJUFRfSU5WX1BST1RPCQlYVF9JTlZfUFJPVE8KKyNkZWZpbmUgSVBUX0lOVl9NQVNLCQkweDdGCS8qIEFsbCBwb3NzaWJsZSBmbGFnIGJpdHMgbWFzay4gKi8KKworLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBlYWNoIG9mIHRoZSBmaXJld2FsbCBydWxlcy4gIENvbnNpc3RzIG9mIDMKKyAgIHBhcnRzIHdoaWNoIGFyZSAxKSBnZW5lcmFsIElQIGhlYWRlciBzdHVmZiAyKSBtYXRjaCBzcGVjaWZpYworICAgc3R1ZmYgMykgdGhlIHRhcmdldCB0byBwZXJmb3JtIGlmIHRoZSBydWxlIG1hdGNoZXMgKi8KK3N0cnVjdCBpcHRfZW50cnkgeworCXN0cnVjdCBpcHRfaXAgaXA7CisKKwkvKiBNYXJrIHdpdGggZmllbGRzIHRoYXQgd2UgY2FyZSBhYm91dC4gKi8KKwl1bnNpZ25lZCBpbnQgbmZjYWNoZTsKKworCS8qIFNpemUgb2YgaXB0X2VudHJ5ICsgbWF0Y2hlcyAqLworCV9fdTE2IHRhcmdldF9vZmZzZXQ7CisJLyogU2l6ZSBvZiBpcHRfZW50cnkgKyBtYXRjaGVzICsgdGFyZ2V0ICovCisJX191MTYgbmV4dF9vZmZzZXQ7CisKKwkvKiBCYWNrIHBvaW50ZXIgKi8KKwl1bnNpZ25lZCBpbnQgY29tZWZyb207CisKKwkvKiBQYWNrZXQgYW5kIGJ5dGUgY291bnRlcnMuICovCisJc3RydWN0IHh0X2NvdW50ZXJzIGNvdW50ZXJzOworCisJLyogVGhlIG1hdGNoZXMgKGlmIGFueSksIHRoZW4gdGhlIHRhcmdldC4gKi8KKwl1bnNpZ25lZCBjaGFyIGVsZW1zWzBdOworfTsKKworLyoKKyAqIE5ldyBJUCBmaXJld2FsbCBvcHRpb25zIGZvciBbZ3NdZXRzb2Nrb3B0IGF0IHRoZSBSQVcgSVAgbGV2ZWwuCisgKiBVbmxpa2UgQlNEIExpbnV4IGluaGVyaXRzIElQIG9wdGlvbnMgc28geW91IGRvbid0IGhhdmUgdG8gdXNlIGEgcmF3CisgKiBzb2NrZXQgZm9yIHRoaXMuIEluc3RlYWQgd2UgY2hlY2sgcmlnaHRzIGluIHRoZSBjYWxscy4KKyAqCisgKiBBVFRFTlRJT046IGNoZWNrIGxpbnV4L2luLmggYmVmb3JlIGFkZGluZyBuZXcgbnVtYmVyIGhlcmUuCisgKi8KKyNkZWZpbmUgSVBUX0JBU0VfQ1RMCQk2NAorCisjZGVmaW5lIElQVF9TT19TRVRfUkVQTEFDRQkoSVBUX0JBU0VfQ1RMKQorI2RlZmluZSBJUFRfU09fU0VUX0FERF9DT1VOVEVSUwkoSVBUX0JBU0VfQ1RMICsgMSkKKyNkZWZpbmUgSVBUX1NPX1NFVF9NQVgJCUlQVF9TT19TRVRfQUREX0NPVU5URVJTCisKKyNkZWZpbmUgSVBUX1NPX0dFVF9JTkZPCQkJKElQVF9CQVNFX0NUTCkKKyNkZWZpbmUgSVBUX1NPX0dFVF9FTlRSSUVTCQkoSVBUX0JBU0VfQ1RMICsgMSkKKyNkZWZpbmUgSVBUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSAkoSVBUX0JBU0VfQ1RMICsgMikKKyNkZWZpbmUgSVBUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQJKElQVF9CQVNFX0NUTCArIDMpCisjZGVmaW5lIElQVF9TT19HRVRfTUFYCQkJSVBUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQKKworLyogSUNNUCBtYXRjaGluZyBzdHVmZiAqLworc3RydWN0IGlwdF9pY21wIHsKKwlfX3U4IHR5cGU7CQkJCS8qIHR5cGUgdG8gbWF0Y2ggKi8KKwlfX3U4IGNvZGVbMl07CQkJCS8qIHJhbmdlIG9mIGNvZGUgKi8KKwlfX3U4IGludmZsYWdzOwkJCQkvKiBJbnZlcnNlIGZsYWdzICovCit9OworCisvKiBWYWx1ZXMgZm9yICJpbnYiIGZpZWxkIGZvciBzdHJ1Y3QgaXB0X2ljbXAuICovCisjZGVmaW5lIElQVF9JQ01QX0lOVgkweDAxCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgdHlwZS9jb2RlIHRlc3QgKi8KKworLyogVGhlIGFyZ3VtZW50IHRvIElQVF9TT19HRVRfSU5GTyAqLworc3RydWN0IGlwdF9nZXRpbmZvIHsKKwkvKiBXaGljaCB0YWJsZTogY2FsbGVyIGZpbGxzIHRoaXMgaW4uICovCisJY2hhciBuYW1lW1hUX1RBQkxFX01BWE5BTUVMRU5dOworCisJLyogS2VybmVsIGZpbGxzIHRoZXNlIGluLiAqLworCS8qIFdoaWNoIGhvb2sgZW50cnkgcG9pbnRzIGFyZSB2YWxpZDogYml0bWFzayAqLworCXVuc2lnbmVkIGludCB2YWxpZF9ob29rczsKKworCS8qIEhvb2sgZW50cnkgcG9pbnRzOiBvbmUgcGVyIG5ldGZpbHRlciBob29rLiAqLworCXVuc2lnbmVkIGludCBob29rX2VudHJ5W05GX0lORVRfTlVNSE9PS1NdOworCisJLyogVW5kZXJmbG93IHBvaW50cy4gKi8KKwl1bnNpZ25lZCBpbnQgdW5kZXJmbG93W05GX0lORVRfTlVNSE9PS1NdOworCisJLyogTnVtYmVyIG9mIGVudHJpZXMgKi8KKwl1bnNpZ25lZCBpbnQgbnVtX2VudHJpZXM7CisKKwkvKiBTaXplIG9mIGVudHJpZXMuICovCisJdW5zaWduZWQgaW50IHNpemU7Cit9OworCisvKiBUaGUgYXJndW1lbnQgdG8gSVBUX1NPX1NFVF9SRVBMQUNFLiAqLworc3RydWN0IGlwdF9yZXBsYWNlIHsKKwkvKiBXaGljaCB0YWJsZS4gKi8KKwljaGFyIG5hbWVbWFRfVEFCTEVfTUFYTkFNRUxFTl07CisKKwkvKiBXaGljaCBob29rIGVudHJ5IHBvaW50cyBhcmUgdmFsaWQ6IGJpdG1hc2suICBZb3UgY2FuJ3QKKyAgICAgICAgICAgY2hhbmdlIHRoaXMuICovCisJdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzOworCisJLyogTnVtYmVyIG9mIGVudHJpZXMgKi8KKwl1bnNpZ25lZCBpbnQgbnVtX2VudHJpZXM7CisKKwkvKiBUb3RhbCBzaXplIG9mIG5ldyBlbnRyaWVzICovCisJdW5zaWduZWQgaW50IHNpemU7CisKKwkvKiBIb29rIGVudHJ5IHBvaW50cy4gKi8KKwl1bnNpZ25lZCBpbnQgaG9va19lbnRyeVtORl9JTkVUX05VTUhPT0tTXTsKKworCS8qIFVuZGVyZmxvdyBwb2ludHMuICovCisJdW5zaWduZWQgaW50IHVuZGVyZmxvd1tORl9JTkVUX05VTUhPT0tTXTsKKworCS8qIEluZm9ybWF0aW9uIGFib3V0IG9sZCBlbnRyaWVzOiAqLworCS8qIE51bWJlciBvZiBjb3VudGVycyAobXVzdCBiZSBlcXVhbCB0byBjdXJyZW50IG51bWJlciBvZiBlbnRyaWVzKS4gKi8KKwl1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzOworCS8qIFRoZSBvbGQgZW50cmllcycgY291bnRlcnMuICovCisJc3RydWN0IHh0X2NvdW50ZXJzICpjb3VudGVyczsKKworCS8qIFRoZSBlbnRyaWVzIChoYW5nIG9mZiBlbmQ6IG5vdCByZWFsbHkgYW4gYXJyYXkpLiAqLworCXN0cnVjdCBpcHRfZW50cnkgZW50cmllc1swXTsKK307CisKKy8qIFRoZSBhcmd1bWVudCB0byBJUFRfU09fR0VUX0VOVFJJRVMuICovCitzdHJ1Y3QgaXB0X2dldF9lbnRyaWVzIHsKKwkvKiBXaGljaCB0YWJsZTogdXNlciBmaWxscyB0aGlzIGluLiAqLworCWNoYXIgbmFtZVtYVF9UQUJMRV9NQVhOQU1FTEVOXTsKKworCS8qIFVzZXIgZmlsbHMgdGhpcyBpbjogdG90YWwgZW50cnkgc2l6ZS4gKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCS8qIFRoZSBlbnRyaWVzLiAqLworCXN0cnVjdCBpcHRfZW50cnkgZW50cnl0YWJsZVswXTsKK307CisKKy8qIEhlbHBlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyBfX2lubGluZV9fIHN0cnVjdCB4dF9lbnRyeV90YXJnZXQgKgoraXB0X2dldF90YXJnZXQoc3RydWN0IGlwdF9lbnRyeSAqZSkKK3sKKwlyZXR1cm4gKHZvaWQgKillICsgZS0+dGFyZ2V0X29mZnNldDsKK30KKworLyoKKyAqCU1haW4gZmlyZXdhbGwgY2hhaW5zIGRlZmluaXRpb25zIGFuZCBnbG9iYWwgdmFyJ3MgZGVmaW5pdGlvbnMuCisgKi8KKyNlbmRpZiAvKiBfSVBUQUJMRVNfSCAqLwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9uZXRsaW5rLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L25ldGxpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTdjYTVjCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9uZXRsaW5rLmgKQEAgLTAsMCArMSwxODkgQEAKKyNpZm5kZWYgX19MSU5VWF9ORVRMSU5LX0gKKyNkZWZpbmUgX19MSU5VWF9ORVRMSU5LX0gKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPiAvKiBmb3IgX19rZXJuZWxfc2FfZmFtaWx5X3QgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIE5FVExJTktfUk9VVEUJCTAJLyogUm91dGluZy9kZXZpY2UgaG9vawkJCQkqLworI2RlZmluZSBORVRMSU5LX1VOVVNFRAkJMQkvKiBVbnVzZWQgbnVtYmVyCQkJCSovCisjZGVmaW5lIE5FVExJTktfVVNFUlNPQ0sJMgkvKiBSZXNlcnZlZCBmb3IgdXNlciBtb2RlIHNvY2tldCBwcm90b2NvbHMgCSovCisjZGVmaW5lIE5FVExJTktfRklSRVdBTEwJMwkvKiBVbnVzZWQgbnVtYmVyLCBmb3JtZXJseSBpcF9xdWV1ZQkJKi8KKyNkZWZpbmUgTkVUTElOS19TT0NLX0RJQUcJNAkvKiBzb2NrZXQgbW9uaXRvcmluZwkJCQkqLworI2RlZmluZSBORVRMSU5LX05GTE9HCQk1CS8qIG5ldGZpbHRlci9pcHRhYmxlcyBVTE9HICovCisjZGVmaW5lIE5FVExJTktfWEZSTQkJNgkvKiBpcHNlYyAqLworI2RlZmluZSBORVRMSU5LX1NFTElOVVgJCTcJLyogU0VMaW51eCBldmVudCBub3RpZmljYXRpb25zICovCisjZGVmaW5lIE5FVExJTktfSVNDU0kJCTgJLyogT3Blbi1pU0NTSSAqLworI2RlZmluZSBORVRMSU5LX0FVRElUCQk5CS8qIGF1ZGl0aW5nICovCisjZGVmaW5lIE5FVExJTktfRklCX0xPT0tVUAkxMAkKKyNkZWZpbmUgTkVUTElOS19DT05ORUNUT1IJMTEKKyNkZWZpbmUgTkVUTElOS19ORVRGSUxURVIJMTIJLyogbmV0ZmlsdGVyIHN1YnN5c3RlbSAqLworI2RlZmluZSBORVRMSU5LX0lQNl9GVwkJMTMKKyNkZWZpbmUgTkVUTElOS19ETlJUTVNHCQkxNAkvKiBERUNuZXQgcm91dGluZyBtZXNzYWdlcyAqLworI2RlZmluZSBORVRMSU5LX0tPQkpFQ1RfVUVWRU5UCTE1CS8qIEtlcm5lbCBtZXNzYWdlcyB0byB1c2Vyc3BhY2UgKi8KKyNkZWZpbmUgTkVUTElOS19HRU5FUklDCQkxNgorLyogbGVhdmUgcm9vbSBmb3IgTkVUTElOS19ETSAoRE0gRXZlbnRzKSAqLworI2RlZmluZSBORVRMSU5LX1NDU0lUUkFOU1BPUlQJMTgJLyogU0NTSSBUcmFuc3BvcnRzICovCisjZGVmaW5lIE5FVExJTktfRUNSWVBURlMJMTkKKyNkZWZpbmUgTkVUTElOS19SRE1BCQkyMAorI2RlZmluZSBORVRMSU5LX0NSWVBUTwkJMjEJLyogQ3J5cHRvIGxheWVyICovCisKKyNkZWZpbmUgTkVUTElOS19JTkVUX0RJQUcJTkVUTElOS19TT0NLX0RJQUcKKworI2RlZmluZSBNQVhfTElOS1MgMzIJCQorCitzdHJ1Y3Qgc29ja2FkZHJfbmwgeworCV9fa2VybmVsX3NhX2ZhbWlseV90CW5sX2ZhbWlseTsJLyogQUZfTkVUTElOSwkqLworCXVuc2lnbmVkIHNob3J0CW5sX3BhZDsJCS8qIHplcm8JCSovCisJX191MzIJCW5sX3BpZDsJCS8qIHBvcnQgSUQJKi8KKyAgICAgICAJX191MzIJCW5sX2dyb3VwczsJLyogbXVsdGljYXN0IGdyb3VwcyBtYXNrICovCit9OworCitzdHJ1Y3Qgbmxtc2doZHIgeworCV9fdTMyCQlubG1zZ19sZW47CS8qIExlbmd0aCBvZiBtZXNzYWdlIGluY2x1ZGluZyBoZWFkZXIgKi8KKwlfX3UxNgkJbmxtc2dfdHlwZTsJLyogTWVzc2FnZSBjb250ZW50ICovCisJX191MTYJCW5sbXNnX2ZsYWdzOwkvKiBBZGRpdGlvbmFsIGZsYWdzICovCisJX191MzIJCW5sbXNnX3NlcTsJLyogU2VxdWVuY2UgbnVtYmVyICovCisJX191MzIJCW5sbXNnX3BpZDsJLyogU2VuZGluZyBwcm9jZXNzIHBvcnQgSUQgKi8KK307CisKKy8qIEZsYWdzIHZhbHVlcyAqLworCisjZGVmaW5lIE5MTV9GX1JFUVVFU1QJCTEJLyogSXQgaXMgcmVxdWVzdCBtZXNzYWdlLiAJKi8KKyNkZWZpbmUgTkxNX0ZfTVVMVEkJCTIJLyogTXVsdGlwYXJ0IG1lc3NhZ2UsIHRlcm1pbmF0ZWQgYnkgTkxNU0dfRE9ORSAqLworI2RlZmluZSBOTE1fRl9BQ0sJCTQJLyogUmVwbHkgd2l0aCBhY2ssIHdpdGggemVybyBvciBlcnJvciBjb2RlICovCisjZGVmaW5lIE5MTV9GX0VDSE8JCTgJLyogRWNobyB0aGlzIHJlcXVlc3QgCQkqLworI2RlZmluZSBOTE1fRl9EVU1QX0lOVFIJCTE2CS8qIER1bXAgd2FzIGluY29uc2lzdGVudCBkdWUgdG8gc2VxdWVuY2UgY2hhbmdlICovCisjZGVmaW5lIE5MTV9GX0RVTVBfRklMVEVSRUQJMzIJLyogRHVtcCB3YXMgZmlsdGVyZWQgYXMgcmVxdWVzdGVkICovCisKKy8qIE1vZGlmaWVycyB0byBHRVQgcmVxdWVzdCAqLworI2RlZmluZSBOTE1fRl9ST09UCTB4MTAwCS8qIHNwZWNpZnkgdHJlZQlyb290CSovCisjZGVmaW5lIE5MTV9GX01BVENICTB4MjAwCS8qIHJldHVybiBhbGwgbWF0Y2hpbmcJKi8KKyNkZWZpbmUgTkxNX0ZfQVRPTUlDCTB4NDAwCS8qIGF0b21pYyBHRVQJCSovCisjZGVmaW5lIE5MTV9GX0RVTVAJKE5MTV9GX1JPT1R8TkxNX0ZfTUFUQ0gpCisKKy8qIE1vZGlmaWVycyB0byBORVcgcmVxdWVzdCAqLworI2RlZmluZSBOTE1fRl9SRVBMQUNFCTB4MTAwCS8qIE92ZXJyaWRlIGV4aXN0aW5nCQkqLworI2RlZmluZSBOTE1fRl9FWENMCTB4MjAwCS8qIERvIG5vdCB0b3VjaCwgaWYgaXQgZXhpc3RzCSovCisjZGVmaW5lIE5MTV9GX0NSRUFURQkweDQwMAkvKiBDcmVhdGUsIGlmIGl0IGRvZXMgbm90IGV4aXN0CSovCisjZGVmaW5lIE5MTV9GX0FQUEVORAkweDgwMAkvKiBBZGQgdG8gZW5kIG9mIGxpc3QJCSovCisKKy8qCisgICA0LjRCU0QgQURECQlOTE1fRl9DUkVBVEV8TkxNX0ZfRVhDTAorICAgNC40QlNEIENIQU5HRQlOTE1fRl9SRVBMQUNFCisKKyAgIFRydWUgQ0hBTkdFCQlOTE1fRl9DUkVBVEV8TkxNX0ZfUkVQTEFDRQorICAgQXBwZW5kCQlOTE1fRl9DUkVBVEUKKyAgIENoZWNrCQlOTE1fRl9FWENMCisgKi8KKworI2RlZmluZSBOTE1TR19BTElHTlRPCTRVCisjZGVmaW5lIE5MTVNHX0FMSUdOKGxlbikgKCAoKGxlbikrTkxNU0dfQUxJR05UTy0xKSAmIH4oTkxNU0dfQUxJR05UTy0xKSApCisjZGVmaW5lIE5MTVNHX0hEUkxFTgkgKChpbnQpIE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3Qgbmxtc2doZHIpKSkKKyNkZWZpbmUgTkxNU0dfTEVOR1RIKGxlbikgKChsZW4pICsgTkxNU0dfSERSTEVOKQorI2RlZmluZSBOTE1TR19TUEFDRShsZW4pIE5MTVNHX0FMSUdOKE5MTVNHX0xFTkdUSChsZW4pKQorI2RlZmluZSBOTE1TR19EQVRBKG5saCkgICgodm9pZCopKCgoY2hhciopbmxoKSArIE5MTVNHX0xFTkdUSCgwKSkpCisjZGVmaW5lIE5MTVNHX05FWFQobmxoLGxlbikJICgobGVuKSAtPSBOTE1TR19BTElHTigobmxoKS0+bmxtc2dfbGVuKSwgXAorCQkJCSAgKHN0cnVjdCBubG1zZ2hkciopKCgoY2hhciopKG5saCkpICsgTkxNU0dfQUxJR04oKG5saCktPm5sbXNnX2xlbikpKQorI2RlZmluZSBOTE1TR19PSyhubGgsbGVuKSAoKGxlbikgPj0gKGludClzaXplb2Yoc3RydWN0IG5sbXNnaGRyKSAmJiBcCisJCQkgICAobmxoKS0+bmxtc2dfbGVuID49IHNpemVvZihzdHJ1Y3Qgbmxtc2doZHIpICYmIFwKKwkJCSAgIChubGgpLT5ubG1zZ19sZW4gPD0gKGxlbikpCisjZGVmaW5lIE5MTVNHX1BBWUxPQUQobmxoLGxlbikgKChubGgpLT5ubG1zZ19sZW4gLSBOTE1TR19TUEFDRSgobGVuKSkpCisKKyNkZWZpbmUgTkxNU0dfTk9PUAkJMHgxCS8qIE5vdGhpbmcuCQkqLworI2RlZmluZSBOTE1TR19FUlJPUgkJMHgyCS8qIEVycm9yCQkqLworI2RlZmluZSBOTE1TR19ET05FCQkweDMJLyogRW5kIG9mIGEgZHVtcAkqLworI2RlZmluZSBOTE1TR19PVkVSUlVOCQkweDQJLyogRGF0YSBsb3N0CQkqLworCisjZGVmaW5lIE5MTVNHX01JTl9UWVBFCQkweDEwCS8qIDwgMHgxMDogcmVzZXJ2ZWQgY29udHJvbCBtZXNzYWdlcyAqLworCitzdHJ1Y3Qgbmxtc2dlcnIgeworCWludAkJZXJyb3I7CisJc3RydWN0IG5sbXNnaGRyIG1zZzsKK307CisKKyNkZWZpbmUgTkVUTElOS19BRERfTUVNQkVSU0hJUAkJMQorI2RlZmluZSBORVRMSU5LX0RST1BfTUVNQkVSU0hJUAkJMgorI2RlZmluZSBORVRMSU5LX1BLVElORk8JCQkzCisjZGVmaW5lIE5FVExJTktfQlJPQURDQVNUX0VSUk9SCQk0CisjZGVmaW5lIE5FVExJTktfTk9fRU5PQlVGUwkJNQorI2RlZmluZSBORVRMSU5LX1JYX1JJTkcJCQk2CisjZGVmaW5lIE5FVExJTktfVFhfUklORwkJCTcKKyNkZWZpbmUgTkVUTElOS19MSVNURU5fQUxMX05TSUQJCTgKKyNkZWZpbmUgTkVUTElOS19MSVNUX01FTUJFUlNISVBTCTkKKyNkZWZpbmUgTkVUTElOS19DQVBfQUNLCQkJMTAKKworc3RydWN0IG5sX3BrdGluZm8geworCV9fdTMyCWdyb3VwOworfTsKKworc3RydWN0IG5sX21tYXBfcmVxIHsKKwl1bnNpZ25lZCBpbnQJbm1fYmxvY2tfc2l6ZTsKKwl1bnNpZ25lZCBpbnQJbm1fYmxvY2tfbnI7CisJdW5zaWduZWQgaW50CW5tX2ZyYW1lX3NpemU7CisJdW5zaWduZWQgaW50CW5tX2ZyYW1lX25yOworfTsKKworc3RydWN0IG5sX21tYXBfaGRyIHsKKwl1bnNpZ25lZCBpbnQJbm1fc3RhdHVzOworCXVuc2lnbmVkIGludAlubV9sZW47CisJX191MzIJCW5tX2dyb3VwOworCS8qIGNyZWRlbnRpYWxzICovCisJX191MzIJCW5tX3BpZDsKKwlfX3UzMgkJbm1fdWlkOworCV9fdTMyCQlubV9naWQ7Cit9OworCitlbnVtIG5sX21tYXBfc3RhdHVzIHsKKwlOTF9NTUFQX1NUQVRVU19VTlVTRUQsCisJTkxfTU1BUF9TVEFUVVNfUkVTRVJWRUQsCisJTkxfTU1BUF9TVEFUVVNfVkFMSUQsCisJTkxfTU1BUF9TVEFUVVNfQ09QWSwKKwlOTF9NTUFQX1NUQVRVU19TS0lQLAorfTsKKworI2RlZmluZSBOTF9NTUFQX01TR19BTElHTk1FTlQJCU5MTVNHX0FMSUdOVE8KKyNkZWZpbmUgTkxfTU1BUF9NU0dfQUxJR04oc3opCQlfX0FMSUdOX0tFUk5FTChzeiwgTkxfTU1BUF9NU0dfQUxJR05NRU5UKQorI2RlZmluZSBOTF9NTUFQX0hEUkxFTgkJCU5MX01NQVBfTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmxfbW1hcF9oZHIpKQorCisjZGVmaW5lIE5FVF9NQUpPUiAzNgkJLyogTWFqb3IgMzYgaXMgcmVzZXJ2ZWQgZm9yIG5ldHdvcmtpbmcgCQkJCQkJKi8KKworZW51bSB7CisJTkVUTElOS19VTkNPTk5FQ1RFRCA9IDAsCisJTkVUTElOS19DT05ORUNURUQsCit9OworCisvKgorICogIDwtLS0tLS0tIE5MQV9IRFJMRU4gLS0tLS0tPiA8LS0gTkxBX0FMSUdOKHBheWxvYWQpLS0+CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0gLSAtKy0gLSAtIC0gLSAtIC0gLSAtIC0rLSAtIC0rCisgKiB8ICAgICAgICBIZWFkZXIgICAgICAgfCBQYWQgfCAgICAgUGF5bG9hZCAgICAgICB8IFBhZCB8CisgKiB8ICAgKHN0cnVjdCBubGF0dHIpICAgfCBpbmcgfCAgICAgICAgICAgICAgICAgICB8IGluZyB8CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0gLSAtKy0gLSAtIC0gLSAtIC0gLSAtIC0rLSAtIC0rCisgKiAgPC0tLS0tLS0tLS0tLS0tIG5sYXR0ci0+bmxhX2xlbiAtLS0tLS0tLS0tLS0tLT4KKyAqLworCitzdHJ1Y3QgbmxhdHRyIHsKKwlfX3UxNiAgICAgICAgICAgbmxhX2xlbjsKKwlfX3UxNiAgICAgICAgICAgbmxhX3R5cGU7Cit9OworCisvKgorICogbmxhX3R5cGUgKDE2IGJpdHMpCisgKiArLS0tKy0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogfCBOIHwgTyB8IEF0dHJpYnV0ZSBUeXBlICAgICAgICAgICAgICAgIHwKKyAqICstLS0rLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiBOIDo9IENhcnJpZXMgbmVzdGVkIGF0dHJpYnV0ZXMKKyAqIE8gOj0gUGF5bG9hZCBzdG9yZWQgaW4gbmV0d29yayBieXRlIG9yZGVyCisgKgorICogTm90ZTogVGhlIE4gYW5kIE8gZmxhZyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgorICovCisjZGVmaW5lIE5MQV9GX05FU1RFRAkJKDEgPDwgMTUpCisjZGVmaW5lIE5MQV9GX05FVF9CWVRFT1JERVIJKDEgPDwgMTQpCisjZGVmaW5lIE5MQV9UWVBFX01BU0sJCX4oTkxBX0ZfTkVTVEVEIHwgTkxBX0ZfTkVUX0JZVEVPUkRFUikKKworI2RlZmluZSBOTEFfQUxJR05UTwkJNAorI2RlZmluZSBOTEFfQUxJR04obGVuKQkJKCgobGVuKSArIE5MQV9BTElHTlRPIC0gMSkgJiB+KE5MQV9BTElHTlRPIC0gMSkpCisjZGVmaW5lIE5MQV9IRFJMRU4JCSgoaW50KSBOTEFfQUxJR04oc2l6ZW9mKHN0cnVjdCBubGF0dHIpKSkKKworCisjZW5kaWYgLyogX19MSU5VWF9ORVRMSU5LX0ggKi8KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2luY2x1ZGUvbGludXgvbmV0bGlua19kaWFnLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L25ldGxpbmtfZGlhZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMTU5ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L25ldGxpbmtfZGlhZy5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgX19ORVRMSU5LX0RJQUdfSF9fCisjZGVmaW5lIF9fTkVUTElOS19ESUFHX0hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IG5ldGxpbmtfZGlhZ19yZXEgeworCV9fdTgJc2RpYWdfZmFtaWx5OworCV9fdTgJc2RpYWdfcHJvdG9jb2w7CisJX191MTYJcGFkOworCV9fdTMyCW5kaWFnX2lubzsKKwlfX3UzMgluZGlhZ19zaG93OworCV9fdTMyCW5kaWFnX2Nvb2tpZVsyXTsKK307CisKK3N0cnVjdCBuZXRsaW5rX2RpYWdfbXNnIHsKKwlfX3U4CW5kaWFnX2ZhbWlseTsKKwlfX3U4CW5kaWFnX3R5cGU7CisJX191OAluZGlhZ19wcm90b2NvbDsKKwlfX3U4CW5kaWFnX3N0YXRlOworCisJX191MzIJbmRpYWdfcG9ydGlkOworCV9fdTMyCW5kaWFnX2RzdF9wb3J0aWQ7CisJX191MzIJbmRpYWdfZHN0X2dyb3VwOworCV9fdTMyCW5kaWFnX2lubzsKKwlfX3UzMgluZGlhZ19jb29raWVbMl07Cit9OworCitzdHJ1Y3QgbmV0bGlua19kaWFnX3JpbmcgeworCV9fdTMyCW5kcl9ibG9ja19zaXplOworCV9fdTMyCW5kcl9ibG9ja19ucjsKKwlfX3UzMgluZHJfZnJhbWVfc2l6ZTsKKwlfX3UzMgluZHJfZnJhbWVfbnI7Cit9OworCitlbnVtIHsKKwkvKiBORVRMSU5LX0RJQUdfTk9ORSwgc3RhbmRhcmQgbmwgQVBJIHJlcXVpcmVzIHRoaXMgYXR0cmlidXRlISAgKi8KKwlORVRMSU5LX0RJQUdfTUVNSU5GTywKKwlORVRMSU5LX0RJQUdfR1JPVVBTLAorCU5FVExJTktfRElBR19SWF9SSU5HLAorCU5FVExJTktfRElBR19UWF9SSU5HLAorCisJX19ORVRMSU5LX0RJQUdfTUFYLAorfTsKKworI2RlZmluZSBORVRMSU5LX0RJQUdfTUFYIChfX05FVExJTktfRElBR19NQVggLSAxKQorCisjZGVmaW5lIE5ESUFHX1BST1RPX0FMTAkJKChfX3U4KSB+MCkKKworI2RlZmluZSBORElBR19TSE9XX01FTUlORk8JMHgwMDAwMDAwMSAvKiBzaG93IG1lbW9yeSBpbmZvIG9mIGEgc29ja2V0ICovCisjZGVmaW5lIE5ESUFHX1NIT1dfR1JPVVBTCTB4MDAwMDAwMDIgLyogc2hvdyBncm91cHMgb2YgYSBuZXRsaW5rIHNvY2tldCAqLworI2RlZmluZSBORElBR19TSE9XX1JJTkdfQ0ZHCTB4MDAwMDAwMDQgLyogc2hvdyByaW5nIGNvbmZpZ3VyYXRpb24gKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3BhY2tldF9kaWFnLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3BhY2tldF9kaWFnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA4YzYzZgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvcGFja2V0X2RpYWcuaApAQCAtMCwwICsxLDgwIEBACisjaWZuZGVmIF9fUEFDS0VUX0RJQUdfSF9fCisjZGVmaW5lIF9fUEFDS0VUX0RJQUdfSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgcGFja2V0X2RpYWdfcmVxIHsKKwlfX3U4CXNkaWFnX2ZhbWlseTsKKwlfX3U4CXNkaWFnX3Byb3RvY29sOworCV9fdTE2CXBhZDsKKwlfX3UzMglwZGlhZ19pbm87CisJX191MzIJcGRpYWdfc2hvdzsKKwlfX3UzMglwZGlhZ19jb29raWVbMl07Cit9OworCisjZGVmaW5lIFBBQ0tFVF9TSE9XX0lORk8JMHgwMDAwMDAwMSAvKiBCYXNpYyBwYWNrZXRfc2sgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgUEFDS0VUX1NIT1dfTUNMSVNUCTB4MDAwMDAwMDIgLyogQSBzZXQgb2YgcGFja2V0X2RpYWdfbWNsaXN0LXMgKi8KKyNkZWZpbmUgUEFDS0VUX1NIT1dfUklOR19DRkcJMHgwMDAwMDAwNCAvKiBSaW5ncyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgUEFDS0VUX1NIT1dfRkFOT1VUCTB4MDAwMDAwMDgKKyNkZWZpbmUgUEFDS0VUX1NIT1dfTUVNSU5GTwkweDAwMDAwMDEwCisjZGVmaW5lIFBBQ0tFVF9TSE9XX0ZJTFRFUgkweDAwMDAwMDIwCisKK3N0cnVjdCBwYWNrZXRfZGlhZ19tc2cgeworCV9fdTgJcGRpYWdfZmFtaWx5OworCV9fdTgJcGRpYWdfdHlwZTsKKwlfX3UxNglwZGlhZ19udW07CisKKwlfX3UzMglwZGlhZ19pbm87CisJX191MzIJcGRpYWdfY29va2llWzJdOworfTsKKworZW51bSB7CisJLyogUEFDS0VUX0RJQUdfTk9ORSwgc3RhbmRhcmQgbmwgQVBJIHJlcXVpcmVzIHRoaXMgYXR0cmlidXRlISAgKi8KKwlQQUNLRVRfRElBR19JTkZPLAorCVBBQ0tFVF9ESUFHX01DTElTVCwKKwlQQUNLRVRfRElBR19SWF9SSU5HLAorCVBBQ0tFVF9ESUFHX1RYX1JJTkcsCisJUEFDS0VUX0RJQUdfRkFOT1VULAorCVBBQ0tFVF9ESUFHX1VJRCwKKwlQQUNLRVRfRElBR19NRU1JTkZPLAorCVBBQ0tFVF9ESUFHX0ZJTFRFUiwKKworCV9fUEFDS0VUX0RJQUdfTUFYLAorfTsKKworI2RlZmluZSBQQUNLRVRfRElBR19NQVggKF9fUEFDS0VUX0RJQUdfTUFYIC0gMSkKKworc3RydWN0IHBhY2tldF9kaWFnX2luZm8geworCV9fdTMyCXBkaV9pbmRleDsKKwlfX3UzMglwZGlfdmVyc2lvbjsKKwlfX3UzMglwZGlfcmVzZXJ2ZTsKKwlfX3UzMglwZGlfY29weV90aHJlc2g7CisJX191MzIJcGRpX3RzdGFtcDsKKwlfX3UzMglwZGlfZmxhZ3M7CisKKyNkZWZpbmUgUERJX1JVTk5JTkcJMHgxCisjZGVmaW5lIFBESV9BVVhEQVRBCTB4MgorI2RlZmluZSBQRElfT1JJR0RFVgkweDQKKyNkZWZpbmUgUERJX1ZORVRIRFIJMHg4CisjZGVmaW5lIFBESV9MT1NTCTB4MTAKK307CisKK3N0cnVjdCBwYWNrZXRfZGlhZ19tY2xpc3QgeworCV9fdTMyCXBkbWNfaW5kZXg7CisJX191MzIJcGRtY19jb3VudDsKKwlfX3UxNglwZG1jX3R5cGU7CisJX191MTYJcGRtY19hbGVuOworCV9fdTgJcGRtY19hZGRyW01BWF9BRERSX0xFTl07Cit9OworCitzdHJ1Y3QgcGFja2V0X2RpYWdfcmluZyB7CisJX191MzIJcGRyX2Jsb2NrX3NpemU7CisJX191MzIJcGRyX2Jsb2NrX25yOworCV9fdTMyCXBkcl9mcmFtZV9zaXplOworCV9fdTMyCXBkcl9mcmFtZV9ucjsKKwlfX3UzMglwZHJfcmV0aXJlX3RtbzsKKwlfX3UzMglwZHJfc2l6ZW9mX3ByaXY7CisJX191MzIJcGRyX2ZlYXR1cmVzOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3BrdF9jbHMuaCBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvcGt0X2Nscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMjMxNDYKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3BrdF9jbHMuaApAQCAtMCwwICsxLDQ0OCBAQAorI2lmbmRlZiBfX0xJTlVYX1BLVF9DTFNfSAorI2RlZmluZSBfX0xJTlVYX1BLVF9DTFNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wa3Rfc2NoZWQuaD4KKworCisvKiBBY3Rpb24gYXR0cmlidXRlcyAqLworZW51bSB7CisJVENBX0FDVF9VTlNQRUMsCisJVENBX0FDVF9LSU5ELAorCVRDQV9BQ1RfT1BUSU9OUywKKwlUQ0FfQUNUX0lOREVYLAorCVRDQV9BQ1RfU1RBVFMsCisJX19UQ0FfQUNUX01BWAorfTsKKworI2RlZmluZSBUQ0FfQUNUX01BWCBfX1RDQV9BQ1RfTUFYCisjZGVmaW5lIFRDQV9PTERfQ09NUEFUIChUQ0FfQUNUX01BWCsxKQorI2RlZmluZSBUQ0FfQUNUX01BWF9QUklPIDMyCisjZGVmaW5lIFRDQV9BQ1RfQklORAkxCisjZGVmaW5lIFRDQV9BQ1RfTk9CSU5ECTAKKyNkZWZpbmUgVENBX0FDVF9VTkJJTkQJMQorI2RlZmluZSBUQ0FfQUNUX05PVU5CSU5ECTAKKyNkZWZpbmUgVENBX0FDVF9SRVBMQUNFCQkxCisjZGVmaW5lIFRDQV9BQ1RfTk9SRVBMQUNFCTAKKworI2RlZmluZSBUQ19BQ1RfVU5TUEVDCSgtMSkKKyNkZWZpbmUgVENfQUNUX09LCQkwCisjZGVmaW5lIFRDX0FDVF9SRUNMQVNTSUZZCTEKKyNkZWZpbmUgVENfQUNUX1NIT1QJCTIKKyNkZWZpbmUgVENfQUNUX1BJUEUJCTMKKyNkZWZpbmUgVENfQUNUX1NUT0xFTgkJNAorI2RlZmluZSBUQ19BQ1RfUVVFVUVECQk1CisjZGVmaW5lIFRDX0FDVF9SRVBFQVQJCTYKKyNkZWZpbmUgVENfQUNUX1JFRElSRUNUCQk3CisjZGVmaW5lIFRDX0FDVF9KVU1QCQkweDEwMDAwMDAwCisKKy8qIEFjdGlvbiB0eXBlIGlkZW50aWZpZXJzKi8KK2VudW0geworCVRDQV9JRF9VTlNQRUM9MCwKKwlUQ0FfSURfUE9MSUNFPTEsCisJLyogb3RoZXIgYWN0aW9ucyBnbyBoZXJlICovCisJX19UQ0FfSURfTUFYPTI1NQorfTsKKworI2RlZmluZSBUQ0FfSURfTUFYIF9fVENBX0lEX01BWAorCitzdHJ1Y3QgdGNfcG9saWNlIHsKKwlfX3UzMgkJCWluZGV4OworCWludAkJCWFjdGlvbjsKKyNkZWZpbmUgVENfUE9MSUNFX1VOU1BFQwlUQ19BQ1RfVU5TUEVDCisjZGVmaW5lIFRDX1BPTElDRV9PSwkJVENfQUNUX09LCisjZGVmaW5lIFRDX1BPTElDRV9SRUNMQVNTSUZZCVRDX0FDVF9SRUNMQVNTSUZZCisjZGVmaW5lIFRDX1BPTElDRV9TSE9UCQlUQ19BQ1RfU0hPVAorI2RlZmluZSBUQ19QT0xJQ0VfUElQRQkJVENfQUNUX1BJUEUKKworCV9fdTMyCQkJbGltaXQ7CisJX191MzIJCQlidXJzdDsKKwlfX3UzMgkJCW10dTsKKwlzdHJ1Y3QgdGNfcmF0ZXNwZWMJcmF0ZTsKKwlzdHJ1Y3QgdGNfcmF0ZXNwZWMJcGVha3JhdGU7CisJaW50IAkJCXJlZmNudDsKKwlpbnQgCQkJYmluZGNudDsKKwlfX3UzMgkJCWNhcGFiOworfTsKKworc3RydWN0IHRjZl90IHsKKwlfX3U2NCAgIGluc3RhbGw7CisJX191NjQgICBsYXN0dXNlOworCV9fdTY0ICAgZXhwaXJlczsKK307CisKK3N0cnVjdCB0Y19jbnQgeworCWludCAgICAgICAgICAgICAgICAgICByZWZjbnQ7IAorCWludCAgICAgICAgICAgICAgICAgICBiaW5kY250OworfTsKKworI2RlZmluZSB0Y19nZW4gXAorCV9fdTMyICAgICAgICAgICAgICAgICBpbmRleDsgXAorCV9fdTMyICAgICAgICAgICAgICAgICBjYXBhYjsgXAorCWludCAgICAgICAgICAgICAgICAgICBhY3Rpb247IFwKKwlpbnQgICAgICAgICAgICAgICAgICAgcmVmY250OyBcCisJaW50ICAgICAgICAgICAgICAgICAgIGJpbmRjbnQKKworZW51bSB7CisJVENBX1BPTElDRV9VTlNQRUMsCisJVENBX1BPTElDRV9UQkYsCisJVENBX1BPTElDRV9SQVRFLAorCVRDQV9QT0xJQ0VfUEVBS1JBVEUsCisJVENBX1BPTElDRV9BVlJBVEUsCisJVENBX1BPTElDRV9SRVNVTFQsCisJX19UQ0FfUE9MSUNFX01BWAorI2RlZmluZSBUQ0FfUE9MSUNFX1JFU1VMVCBUQ0FfUE9MSUNFX1JFU1VMVAorfTsKKworI2RlZmluZSBUQ0FfUE9MSUNFX01BWCAoX19UQ0FfUE9MSUNFX01BWCAtIDEpCisKKy8qIFUzMiBmaWx0ZXJzICovCisKKyNkZWZpbmUgVENfVTMyX0hUSUQoaCkgKChoKSYweEZGRjAwMDAwKQorI2RlZmluZSBUQ19VMzJfVVNFUkhUSUQoaCkgKFRDX1UzMl9IVElEKGgpPj4yMCkKKyNkZWZpbmUgVENfVTMyX0hBU0goaCkgKCgoaCk+PjEyKSYweEZGKQorI2RlZmluZSBUQ19VMzJfTk9ERShoKSAoKGgpJjB4RkZGKQorI2RlZmluZSBUQ19VMzJfS0VZKGgpICgoaCkmMHhGRkZGRikKKyNkZWZpbmUgVENfVTMyX1VOU1BFQwkwCisjZGVmaW5lIFRDX1UzMl9ST09UCSgweEZGRjAwMDAwKQorCitlbnVtIHsKKwlUQ0FfVTMyX1VOU1BFQywKKwlUQ0FfVTMyX0NMQVNTSUQsCisJVENBX1UzMl9IQVNILAorCVRDQV9VMzJfTElOSywKKwlUQ0FfVTMyX0RJVklTT1IsCisJVENBX1UzMl9TRUwsCisJVENBX1UzMl9QT0xJQ0UsCisJVENBX1UzMl9BQ1QsICAgCisJVENBX1UzMl9JTkRFViwKKwlUQ0FfVTMyX1BDTlQsCisJVENBX1UzMl9NQVJLLAorCV9fVENBX1UzMl9NQVgKK307CisKKyNkZWZpbmUgVENBX1UzMl9NQVggKF9fVENBX1UzMl9NQVggLSAxKQorCitzdHJ1Y3QgdGNfdTMyX2tleSB7CisJX19iZTMyCQltYXNrOworCV9fYmUzMgkJdmFsOworCWludAkJb2ZmOworCWludAkJb2ZmbWFzazsKK307CisKK3N0cnVjdCB0Y191MzJfc2VsIHsKKwl1bnNpZ25lZCBjaGFyCQlmbGFnczsKKwl1bnNpZ25lZCBjaGFyCQlvZmZzaGlmdDsKKwl1bnNpZ25lZCBjaGFyCQlua2V5czsKKworCV9fYmUxNgkJCW9mZm1hc2s7CisJX191MTYJCQlvZmY7CisJc2hvcnQJCQlvZmZvZmY7CisKKwlzaG9ydAkJCWhvZmY7CisJX19iZTMyCQkJaG1hc2s7CisJc3RydWN0IHRjX3UzMl9rZXkJa2V5c1swXTsKK307CisKK3N0cnVjdCB0Y191MzJfbWFyayB7CisJX191MzIJCXZhbDsKKwlfX3UzMgkJbWFzazsKKwlfX3UzMgkJc3VjY2VzczsKK307CisKK3N0cnVjdCB0Y191MzJfcGNudCB7CisJX191NjQgcmNudDsKKwlfX3U2NCByaGl0OworCV9fdTY0IGtjbnRzWzBdOworfTsKKworLyogRmxhZ3MgKi8KKworI2RlZmluZSBUQ19VMzJfVEVSTUlOQUwJCTEKKyNkZWZpbmUgVENfVTMyX09GRlNFVAkJMgorI2RlZmluZSBUQ19VMzJfVkFST0ZGU0VUCTQKKyNkZWZpbmUgVENfVTMyX0VBVAkJOAorCisjZGVmaW5lIFRDX1UzMl9NQVhERVBUSCA4CisKKworLyogUlNWUCBmaWx0ZXIgKi8KKworZW51bSB7CisJVENBX1JTVlBfVU5TUEVDLAorCVRDQV9SU1ZQX0NMQVNTSUQsCisJVENBX1JTVlBfRFNULAorCVRDQV9SU1ZQX1NSQywKKwlUQ0FfUlNWUF9QSU5GTywKKwlUQ0FfUlNWUF9QT0xJQ0UsCisJVENBX1JTVlBfQUNULAorCV9fVENBX1JTVlBfTUFYCit9OworCisjZGVmaW5lIFRDQV9SU1ZQX01BWCAoX19UQ0FfUlNWUF9NQVggLSAxICkKKworc3RydWN0IHRjX3JzdnBfZ3BpIHsKKwlfX3UzMglrZXk7CisJX191MzIJbWFzazsKKwlpbnQJb2Zmc2V0OworfTsKKworc3RydWN0IHRjX3JzdnBfcGluZm8geworCXN0cnVjdCB0Y19yc3ZwX2dwaSBkcGk7CisJc3RydWN0IHRjX3JzdnBfZ3BpIHNwaTsKKwlfX3U4CXByb3RvY29sOworCV9fdTgJdHVubmVsaWQ7CisJX191OAl0dW5uZWxoZHI7CisJX191OAlwYWQ7Cit9OworCisvKiBST1VURSBmaWx0ZXIgKi8KKworZW51bSB7CisJVENBX1JPVVRFNF9VTlNQRUMsCisJVENBX1JPVVRFNF9DTEFTU0lELAorCVRDQV9ST1VURTRfVE8sCisJVENBX1JPVVRFNF9GUk9NLAorCVRDQV9ST1VURTRfSUlGLAorCVRDQV9ST1VURTRfUE9MSUNFLAorCVRDQV9ST1VURTRfQUNULAorCV9fVENBX1JPVVRFNF9NQVgKK307CisKKyNkZWZpbmUgVENBX1JPVVRFNF9NQVggKF9fVENBX1JPVVRFNF9NQVggLSAxKQorCisKKy8qIEZXIGZpbHRlciAqLworCitlbnVtIHsKKwlUQ0FfRldfVU5TUEVDLAorCVRDQV9GV19DTEFTU0lELAorCVRDQV9GV19QT0xJQ0UsCisJVENBX0ZXX0lOREVWLCAvKiAgdXNlZCBieSBDT05GSUdfTkVUX0NMU19JTkQgKi8KKwlUQ0FfRldfQUNULCAvKiB1c2VkIGJ5IENPTkZJR19ORVRfQ0xTX0FDVCAqLworCVRDQV9GV19NQVNLLAorCV9fVENBX0ZXX01BWAorfTsKKworI2RlZmluZSBUQ0FfRldfTUFYIChfX1RDQV9GV19NQVggLSAxKQorCisvKiBUQyBpbmRleCBmaWx0ZXIgKi8KKworZW51bSB7CisJVENBX1RDSU5ERVhfVU5TUEVDLAorCVRDQV9UQ0lOREVYX0hBU0gsCisJVENBX1RDSU5ERVhfTUFTSywKKwlUQ0FfVENJTkRFWF9TSElGVCwKKwlUQ0FfVENJTkRFWF9GQUxMX1RIUk9VR0gsCisJVENBX1RDSU5ERVhfQ0xBU1NJRCwKKwlUQ0FfVENJTkRFWF9QT0xJQ0UsCisJVENBX1RDSU5ERVhfQUNULAorCV9fVENBX1RDSU5ERVhfTUFYCit9OworCisjZGVmaW5lIFRDQV9UQ0lOREVYX01BWCAgICAgKF9fVENBX1RDSU5ERVhfTUFYIC0gMSkKKworLyogRmxvdyBmaWx0ZXIgKi8KKworZW51bSB7CisJRkxPV19LRVlfU1JDLAorCUZMT1dfS0VZX0RTVCwKKwlGTE9XX0tFWV9QUk9UTywKKwlGTE9XX0tFWV9QUk9UT19TUkMsCisJRkxPV19LRVlfUFJPVE9fRFNULAorCUZMT1dfS0VZX0lJRiwKKwlGTE9XX0tFWV9QUklPUklUWSwKKwlGTE9XX0tFWV9NQVJLLAorCUZMT1dfS0VZX05GQ1QsCisJRkxPV19LRVlfTkZDVF9TUkMsCisJRkxPV19LRVlfTkZDVF9EU1QsCisJRkxPV19LRVlfTkZDVF9QUk9UT19TUkMsCisJRkxPV19LRVlfTkZDVF9QUk9UT19EU1QsCisJRkxPV19LRVlfUlRDTEFTU0lELAorCUZMT1dfS0VZX1NLVUlELAorCUZMT1dfS0VZX1NLR0lELAorCUZMT1dfS0VZX1ZMQU5fVEFHLAorCUZMT1dfS0VZX1JYSEFTSCwKKwlfX0ZMT1dfS0VZX01BWCwKK307CisKKyNkZWZpbmUgRkxPV19LRVlfTUFYCShfX0ZMT1dfS0VZX01BWCAtIDEpCisKK2VudW0geworCUZMT1dfTU9ERV9NQVAsCisJRkxPV19NT0RFX0hBU0gsCit9OworCitlbnVtIHsKKwlUQ0FfRkxPV19VTlNQRUMsCisJVENBX0ZMT1dfS0VZUywKKwlUQ0FfRkxPV19NT0RFLAorCVRDQV9GTE9XX0JBU0VDTEFTUywKKwlUQ0FfRkxPV19SU0hJRlQsCisJVENBX0ZMT1dfQURERU5ELAorCVRDQV9GTE9XX01BU0ssCisJVENBX0ZMT1dfWE9SLAorCVRDQV9GTE9XX0RJVklTT1IsCisJVENBX0ZMT1dfQUNULAorCVRDQV9GTE9XX1BPTElDRSwKKwlUQ0FfRkxPV19FTUFUQ0hFUywKKwlUQ0FfRkxPV19QRVJUVVJCLAorCV9fVENBX0ZMT1dfTUFYCit9OworCisjZGVmaW5lIFRDQV9GTE9XX01BWAkoX19UQ0FfRkxPV19NQVggLSAxKQorCisvKiBCYXNpYyBmaWx0ZXIgKi8KKworZW51bSB7CisJVENBX0JBU0lDX1VOU1BFQywKKwlUQ0FfQkFTSUNfQ0xBU1NJRCwKKwlUQ0FfQkFTSUNfRU1BVENIRVMsCisJVENBX0JBU0lDX0FDVCwKKwlUQ0FfQkFTSUNfUE9MSUNFLAorCV9fVENBX0JBU0lDX01BWAorfTsKKworI2RlZmluZSBUQ0FfQkFTSUNfTUFYIChfX1RDQV9CQVNJQ19NQVggLSAxKQorCisKKy8qIENncm91cCBjbGFzc2lmaWVyICovCisKK2VudW0geworCVRDQV9DR1JPVVBfVU5TUEVDLAorCVRDQV9DR1JPVVBfQUNULAorCVRDQV9DR1JPVVBfUE9MSUNFLAorCVRDQV9DR1JPVVBfRU1BVENIRVMsCisJX19UQ0FfQ0dST1VQX01BWCwKK307CisKKyNkZWZpbmUgVENBX0NHUk9VUF9NQVggKF9fVENBX0NHUk9VUF9NQVggLSAxKQorCisvKiBCUEYgY2xhc3NpZmllciAqLworCisjZGVmaW5lIFRDQV9CUEZfRkxBR19BQ1RfRElSRUNUCQkoMSA8PCAwKQorCitlbnVtIHsKKwlUQ0FfQlBGX1VOU1BFQywKKwlUQ0FfQlBGX0FDVCwKKwlUQ0FfQlBGX1BPTElDRSwKKwlUQ0FfQlBGX0NMQVNTSUQsCisJVENBX0JQRl9PUFNfTEVOLAorCVRDQV9CUEZfT1BTLAorCVRDQV9CUEZfRkQsCisJVENBX0JQRl9OQU1FLAorCVRDQV9CUEZfRkxBR1MsCisJX19UQ0FfQlBGX01BWCwKK307CisKKyNkZWZpbmUgVENBX0JQRl9NQVggKF9fVENBX0JQRl9NQVggLSAxKQorCisvKiBGbG93ZXIgY2xhc3NpZmllciAqLworCitlbnVtIHsKKwlUQ0FfRkxPV0VSX1VOU1BFQywKKwlUQ0FfRkxPV0VSX0NMQVNTSUQsCisJVENBX0ZMT1dFUl9JTkRFViwKKwlUQ0FfRkxPV0VSX0FDVCwKKwlUQ0FfRkxPV0VSX0tFWV9FVEhfRFNULAkJLyogRVRIX0FMRU4gKi8KKwlUQ0FfRkxPV0VSX0tFWV9FVEhfRFNUX01BU0ssCS8qIEVUSF9BTEVOICovCisJVENBX0ZMT1dFUl9LRVlfRVRIX1NSQywJCS8qIEVUSF9BTEVOICovCisJVENBX0ZMT1dFUl9LRVlfRVRIX1NSQ19NQVNLLAkvKiBFVEhfQUxFTiAqLworCVRDQV9GTE9XRVJfS0VZX0VUSF9UWVBFLAkvKiBiZTE2ICovCisJVENBX0ZMT1dFUl9LRVlfSVBfUFJPVE8sCS8qIHU4ICovCisJVENBX0ZMT1dFUl9LRVlfSVBWNF9TUkMsCS8qIGJlMzIgKi8KKwlUQ0FfRkxPV0VSX0tFWV9JUFY0X1NSQ19NQVNLLAkvKiBiZTMyICovCisJVENBX0ZMT1dFUl9LRVlfSVBWNF9EU1QsCS8qIGJlMzIgKi8KKwlUQ0FfRkxPV0VSX0tFWV9JUFY0X0RTVF9NQVNLLAkvKiBiZTMyICovCisJVENBX0ZMT1dFUl9LRVlfSVBWNl9TUkMsCS8qIHN0cnVjdCBpbjZfYWRkciAqLworCVRDQV9GTE9XRVJfS0VZX0lQVjZfU1JDX01BU0ssCS8qIHN0cnVjdCBpbjZfYWRkciAqLworCVRDQV9GTE9XRVJfS0VZX0lQVjZfRFNULAkvKiBzdHJ1Y3QgaW42X2FkZHIgKi8KKwlUQ0FfRkxPV0VSX0tFWV9JUFY2X0RTVF9NQVNLLAkvKiBzdHJ1Y3QgaW42X2FkZHIgKi8KKwlUQ0FfRkxPV0VSX0tFWV9UQ1BfU1JDLAkJLyogYmUxNiAqLworCVRDQV9GTE9XRVJfS0VZX1RDUF9EU1QsCQkvKiBiZTE2ICovCisJVENBX0ZMT1dFUl9LRVlfVURQX1NSQywJCS8qIGJlMTYgKi8KKwlUQ0FfRkxPV0VSX0tFWV9VRFBfRFNULAkJLyogYmUxNiAqLworCV9fVENBX0ZMT1dFUl9NQVgsCit9OworCisjZGVmaW5lIFRDQV9GTE9XRVJfTUFYIChfX1RDQV9GTE9XRVJfTUFYIC0gMSkKKworLyogRXh0ZW5kZWQgTWF0Y2hlcyAqLworCitzdHJ1Y3QgdGNmX2VtYXRjaF90cmVlX2hkciB7CisJX191MTYJCW5tYXRjaGVzOworCV9fdTE2CQlwcm9naWQ7Cit9OworCitlbnVtIHsKKwlUQ0FfRU1BVENIX1RSRUVfVU5TUEVDLAorCVRDQV9FTUFUQ0hfVFJFRV9IRFIsCisJVENBX0VNQVRDSF9UUkVFX0xJU1QsCisJX19UQ0FfRU1BVENIX1RSRUVfTUFYCit9OworI2RlZmluZSBUQ0FfRU1BVENIX1RSRUVfTUFYIChfX1RDQV9FTUFUQ0hfVFJFRV9NQVggLSAxKQorCitzdHJ1Y3QgdGNmX2VtYXRjaF9oZHIgeworCV9fdTE2CQltYXRjaGlkOworCV9fdTE2CQlraW5kOworCV9fdTE2CQlmbGFnczsKKwlfX3UxNgkJcGFkOyAvKiBjdXJyZW50bHkgdW51c2VkICovCit9OworCisvKiAgMCAgICAgICAgICAgICAgICAgICAxCisgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSAKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstKy0rLS0tKworICogfCAgICAgICAgIFVudXNlZCAgICAgICAgfFN8SXwgUiB8CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLSstKy0tLSsKKyAqCisgKiBSKDIpIDo6PSByZWxhdGlvbiB0byBuZXh0IGVtYXRjaAorICogICAgICAgICAgd2hlcmU6IDAgMCBFTkQgKGxhc3QgZW1hdGNoKQorICogICAgICAgICAgICAgICAgIDAgMSBBTkQKKyAqICAgICAgICAgICAgICAgICAxIDAgT1IKKyAqICAgICAgICAgICAgICAgICAxIDEgVW51c2VkIChpbnZhbGlkKQorICogSSgxKSA6Oj0gaW52ZXJ0IHJlc3VsdAorICogUygxKSA6Oj0gc2ltcGxlIHBheWxvYWQKKyAqLworI2RlZmluZSBUQ0ZfRU1fUkVMX0VORAkwCisjZGVmaW5lIFRDRl9FTV9SRUxfQU5ECSgxPDwwKQorI2RlZmluZSBUQ0ZfRU1fUkVMX09SCSgxPDwxKQorI2RlZmluZSBUQ0ZfRU1fSU5WRVJUCSgxPDwyKQorI2RlZmluZSBUQ0ZfRU1fU0lNUExFCSgxPDwzKQorCisjZGVmaW5lIFRDRl9FTV9SRUxfTUFTSwkzCisjZGVmaW5lIFRDRl9FTV9SRUxfVkFMSUQodikgKCgodikgJiBUQ0ZfRU1fUkVMX01BU0spICE9IFRDRl9FTV9SRUxfTUFTSykKKworZW51bSB7CisJVENGX0xBWUVSX0xJTkssCisJVENGX0xBWUVSX05FVFdPUkssCisJVENGX0xBWUVSX1RSQU5TUE9SVCwKKwlfX1RDRl9MQVlFUl9NQVgKK307CisjZGVmaW5lIFRDRl9MQVlFUl9NQVggKF9fVENGX0xBWUVSX01BWCAtIDEpCisKKy8qIEVtYXRjaCB0eXBlIGFzc2lnbm1lbnRzCisgKiAgIDEuLjMyNzY3CQlSZXNlcnZlZCBmb3IgZW1hdGNoZXMgaW5zaWRlIGtlcm5lbCB0cmVlCisgKiAgIDMyNzY4Li42NTUzNQlGcmVlIHRvIHVzZSwgbm90IHJlbGlhYmxlCisgKi8KKyNkZWZpbmUJVENGX0VNX0NPTlRBSU5FUgkwCisjZGVmaW5lCVRDRl9FTV9DTVAJCTEKKyNkZWZpbmUJVENGX0VNX05CWVRFCQkyCisjZGVmaW5lCVRDRl9FTV9VMzIJCTMKKyNkZWZpbmUJVENGX0VNX01FVEEJCTQKKyNkZWZpbmUJVENGX0VNX1RFWFQJCTUKKyNkZWZpbmUJVENGX0VNX1ZMQU4JCTYKKyNkZWZpbmUJVENGX0VNX0NBTklECQk3CisjZGVmaW5lCVRDRl9FTV9JUFNFVAkJOAorI2RlZmluZQlUQ0ZfRU1fTUFYCQk4CisKK2VudW0geworCVRDRl9FTV9QUk9HX1RDCit9OworCitlbnVtIHsKKwlUQ0ZfRU1fT1BORF9FUSwKKwlUQ0ZfRU1fT1BORF9HVCwKKwlUQ0ZfRU1fT1BORF9MVAorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3BrdF9zY2hlZC5oIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9wa3Rfc2NoZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2IxOGI0Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9wa3Rfc2NoZWQuaApAQCAtMCwwICsxLDg1NyBAQAorI2lmbmRlZiBfX0xJTlVYX1BLVF9TQ0hFRF9ICisjZGVmaW5lIF9fTElOVVhfUEtUX1NDSEVEX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIExvZ2ljYWwgcHJpb3JpdHkgYmFuZHMgbm90IGRlcGVuZGluZyBvbiBzcGVjaWZpYyBwYWNrZXQgc2NoZWR1bGVyLgorICAgRXZlcnkgc2NoZWR1bGVyIHdpbGwgbWFwIHRoZW0gdG8gcmVhbCB0cmFmZmljIGNsYXNzZXMsIGlmIGl0IGhhcworICAgbm8gbW9yZSBwcmVjaXNlIG1lY2hhbmlzbSB0byBjbGFzc2lmeSBwYWNrZXRzLgorCisgICBUaGVzZSBudW1iZXJzIGhhdmUgbm8gc3BlY2lhbCBtZWFuaW5nLCB0aG91Z2ggdGhlaXIgY29pbmNpZGVuY2UKKyAgIHdpdGggb2Jzb2xldGUgSVB2NiB2YWx1ZXMgaXMgbm90IG9jY2FzaW9uYWwgOi0pLiBOZXcgSVB2NiBkcmFmdHMKKyAgIHByZWZlcnJlZCBmdWxsIGFuYXJjaHkgaW5zcGlyZWQgYnkgZGlmZnNlcnYgZ3JvdXAuCisKKyAgIE5vdGU6IFRDX1BSSU9fQkVTVEVGRk9SVCBkb2VzIG5vdCBtZWFuIHRoYXQgaXQgaXMgdGhlIG1vc3QgdW5oYXBweQorICAgY2xhc3MsIGFjdHVhbGx5LCBhcyBydWxlIGl0IHdpbGwgYmUgaGFuZGxlZCB3aXRoIG1vcmUgY2FyZSB0aGFuCisgICBmaWxsZXIgb3IgZXZlbiBidWxrLgorICovCisKKyNkZWZpbmUgVENfUFJJT19CRVNURUZGT1JUCQkwCisjZGVmaW5lIFRDX1BSSU9fRklMTEVSCQkJMQorI2RlZmluZSBUQ19QUklPX0JVTEsJCQkyCisjZGVmaW5lIFRDX1BSSU9fSU5URVJBQ1RJVkVfQlVMSwk0CisjZGVmaW5lIFRDX1BSSU9fSU5URVJBQ1RJVkUJCTYKKyNkZWZpbmUgVENfUFJJT19DT05UUk9MCQkJNworCisjZGVmaW5lIFRDX1BSSU9fTUFYCQkJMTUKKworLyogR2VuZXJpYyBxdWV1ZSBzdGF0aXN0aWNzLCBhdmFpbGFibGUgZm9yIGFsbCB0aGUgZWxlbWVudHMuCisgICBQYXJ0aWN1bGFyIHNjaGVkdWxlcnMgbWF5IGhhdmUgYWxzbyB0aGVpciBwcml2YXRlIHJlY29yZHMuCisgKi8KKworc3RydWN0IHRjX3N0YXRzIHsKKwlfX3U2NAlieXRlczsJCQkvKiBOdW1iZXIgb2YgZW5xdWV1ZWQgYnl0ZXMgKi8KKwlfX3UzMglwYWNrZXRzOwkJLyogTnVtYmVyIG9mIGVucXVldWVkIHBhY2tldHMJKi8KKwlfX3UzMglkcm9wczsJCQkvKiBQYWNrZXRzIGRyb3BwZWQgYmVjYXVzZSBvZiBsYWNrIG9mIHJlc291cmNlcyAqLworCV9fdTMyCW92ZXJsaW1pdHM7CQkvKiBOdW1iZXIgb2YgdGhyb3R0bGUgZXZlbnRzIHdoZW4gdGhpcworCQkJCQkgKiBmbG93IGdvZXMgb3V0IG9mIGFsbG9jYXRlZCBiYW5kd2lkdGggKi8KKwlfX3UzMglicHM7CQkJLyogQ3VycmVudCBmbG93IGJ5dGUgcmF0ZSAqLworCV9fdTMyCXBwczsJCQkvKiBDdXJyZW50IGZsb3cgcGFja2V0IHJhdGUgKi8KKwlfX3UzMglxbGVuOworCV9fdTMyCWJhY2tsb2c7Cit9OworCitzdHJ1Y3QgdGNfZXN0aW1hdG9yIHsKKwlzaWduZWQgY2hhcglpbnRlcnZhbDsKKwl1bnNpZ25lZCBjaGFyCWV3bWFfbG9nOworfTsKKworLyogIkhhbmRsZXMiCisgICAtLS0tLS0tLS0KKworICAgIEFsbCB0aGUgdHJhZmZpYyBjb250cm9sIG9iamVjdHMgaGF2ZSAzMmJpdCBpZGVudGlmaWVycywgb3IgImhhbmRsZXMiLgorCisgICAgVGhleSBjYW4gYmUgY29uc2lkZXJlZCBhcyBvcGFxdWUgbnVtYmVycyBmcm9tIHVzZXIgQVBJIHZpZXdwb2ludCwKKyAgICBidXQgYWN0dWFsbHkgdGhleSBhbHdheXMgY29uc2lzdCBvZiB0d28gZmllbGRzOiBtYWpvciBhbmQKKyAgICBtaW5vciBudW1iZXJzLCB3aGljaCBhcmUgaW50ZXJwcmV0ZWQgYnkga2VybmVsIHNwZWNpYWxseSwKKyAgICB0aGF0IG1heSBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucywgdGhvdWdoIG5vdCByZWNvbW1lbmRlZC4KKworICAgIEYuZS4gcWRpc2MgaGFuZGxlcyBhbHdheXMgaGF2ZSBtaW5vciBudW1iZXIgZXF1YWwgdG8gemVybywKKyAgICBjbGFzc2VzIChvciBmbG93cykgaGF2ZSBtYWpvciBlcXVhbCB0byBwYXJlbnQgcWRpc2MgbWFqb3IsIGFuZAorICAgIG1pbm9yIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIGNsYXNzIGluc2lkZSBxZGlzYy4KKworICAgIE1hY3JvcyB0byBtYW5pcHVsYXRlIGhhbmRsZXM6CisgKi8KKworI2RlZmluZSBUQ19IX01BSl9NQVNLICgweEZGRkYwMDAwVSkKKyNkZWZpbmUgVENfSF9NSU5fTUFTSyAoMHgwMDAwRkZGRlUpCisjZGVmaW5lIFRDX0hfTUFKKGgpICgoaCkmVENfSF9NQUpfTUFTSykKKyNkZWZpbmUgVENfSF9NSU4oaCkgKChoKSZUQ19IX01JTl9NQVNLKQorI2RlZmluZSBUQ19IX01BS0UobWFqLG1pbikgKCgobWFqKSZUQ19IX01BSl9NQVNLKXwoKG1pbikmVENfSF9NSU5fTUFTSykpCisKKyNkZWZpbmUgVENfSF9VTlNQRUMJKDBVKQorI2RlZmluZSBUQ19IX1JPT1QJKDB4RkZGRkZGRkZVKQorI2RlZmluZSBUQ19IX0lOR1JFU1MgICAgKDB4RkZGRkZGRjFVKQorI2RlZmluZSBUQ19IX0NMU0FDVAlUQ19IX0lOR1JFU1MKKworI2RlZmluZSBUQ19IX01JTl9JTkdSRVNTCTB4RkZGMlUKKyNkZWZpbmUgVENfSF9NSU5fRUdSRVNTCQkweEZGRjNVCisKKy8qIE5lZWQgdG8gY29ycm9zcG9uZCB0byBpcHJvdXRlMiB0Yy90Y19jb3JlLmggImVudW0gbGlua19sYXllciIgKi8KK2VudW0gdGNfbGlua19sYXllciB7CisJVENfTElOS0xBWUVSX1VOQVdBUkUsIC8qIEluZGljYXRlIHVuYXdhcmUgb2xkIGlwcm91dGUyIHV0aWwgKi8KKwlUQ19MSU5LTEFZRVJfRVRIRVJORVQsCisJVENfTElOS0xBWUVSX0FUTSwKK307CisjZGVmaW5lIFRDX0xJTktMQVlFUl9NQVNLIDB4MEYgLyogbGltaXQgdXNlIHRvIGxvd2VyIDQgYml0cyAqLworCitzdHJ1Y3QgdGNfcmF0ZXNwZWMgeworCXVuc2lnbmVkIGNoYXIJY2VsbF9sb2c7CisJX191OAkJbGlua2xheWVyOyAvKiBsb3dlciA0IGJpdHMgKi8KKwl1bnNpZ25lZCBzaG9ydAlvdmVyaGVhZDsKKwlzaG9ydAkJY2VsbF9hbGlnbjsKKwl1bnNpZ25lZCBzaG9ydAltcHU7CisJX191MzIJCXJhdGU7Cit9OworCisjZGVmaW5lIFRDX1JUQUJfU0laRQkxMDI0CisKK3N0cnVjdCB0Y19zaXplc3BlYyB7CisJdW5zaWduZWQgY2hhcgljZWxsX2xvZzsKKwl1bnNpZ25lZCBjaGFyCXNpemVfbG9nOworCXNob3J0CQljZWxsX2FsaWduOworCWludAkJb3ZlcmhlYWQ7CisJdW5zaWduZWQgaW50CWxpbmtsYXllcjsKKwl1bnNpZ25lZCBpbnQJbXB1OworCXVuc2lnbmVkIGludAltdHU7CisJdW5zaWduZWQgaW50CXRzaXplOworfTsKKworZW51bSB7CisJVENBX1NUQUJfVU5TUEVDLAorCVRDQV9TVEFCX0JBU0UsCisJVENBX1NUQUJfREFUQSwKKwlfX1RDQV9TVEFCX01BWAorfTsKKworI2RlZmluZSBUQ0FfU1RBQl9NQVggKF9fVENBX1NUQUJfTUFYIC0gMSkKKworLyogRklGTyBzZWN0aW9uICovCisKK3N0cnVjdCB0Y19maWZvX3FvcHQgeworCV9fdTMyCWxpbWl0OwkvKiBRdWV1ZSBsZW5ndGg6IGJ5dGVzIGZvciBiZmlmbywgcGFja2V0cyBmb3IgcGZpZm8gKi8KK307CisKKy8qIFBSSU8gc2VjdGlvbiAqLworCisjZGVmaW5lIFRDUV9QUklPX0JBTkRTCTE2CisjZGVmaW5lIFRDUV9NSU5fUFJJT19CQU5EUyAyCisKK3N0cnVjdCB0Y19wcmlvX3FvcHQgeworCWludAliYW5kczsJCQkvKiBOdW1iZXIgb2YgYmFuZHMgKi8KKwlfX3U4CXByaW9tYXBbVENfUFJJT19NQVgrMV07CS8qIE1hcDogbG9naWNhbCBwcmlvcml0eSAtPiBQUklPIGJhbmQgKi8KK307CisKKy8qIE1VTFRJUSBzZWN0aW9uICovCisKK3N0cnVjdCB0Y19tdWx0aXFfcW9wdCB7CisJX191MTYJYmFuZHM7CQkJLyogTnVtYmVyIG9mIGJhbmRzICovCisJX191MTYJbWF4X2JhbmRzOwkJLyogTWF4aW11bSBudW1iZXIgb2YgcXVldWVzICovCit9OworCisvKiBQTFVHIHNlY3Rpb24gKi8KKworI2RlZmluZSBUQ1FfUExVR19CVUZGRVIgICAgICAgICAgICAgICAgMAorI2RlZmluZSBUQ1FfUExVR19SRUxFQVNFX09ORSAgICAgICAgICAgMQorI2RlZmluZSBUQ1FfUExVR19SRUxFQVNFX0lOREVGSU5JVEUgICAgMgorI2RlZmluZSBUQ1FfUExVR19MSU1JVCAgICAgICAgICAgICAgICAgMworCitzdHJ1Y3QgdGNfcGx1Z19xb3B0IHsKKwkvKiBUQ1FfUExVR19CVUZGRVI6IEluc2V0IGEgcGx1ZyBpbnRvIHRoZSBxdWV1ZSBhbmQKKwkgKiAgYnVmZmVyIGFueSBpbmNvbWluZyBwYWNrZXRzCisJICogVENRX1BMVUdfUkVMRUFTRV9PTkU6IERlcXVldWUgcGFja2V0cyBmcm9tIHF1ZXVlIGhlYWQKKwkgKiAgIHRvIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBwbHVnLgorCSAqIFRDUV9QTFVHX1JFTEVBU0VfSU5ERUZJTklURTogRGVxdWV1ZSBhbGwgcGFja2V0cyBmcm9tIHF1ZXVlLgorCSAqICAgU3RvcCBidWZmZXJpbmcgcGFja2V0cyB1bnRpbCB0aGUgbmV4dCBUQ1FfUExVR19CVUZGRVIKKwkgKiAgIGNvbW1hbmQgaXMgcmVjZWl2ZWQgKGp1c3QgYWN0IGFzIGEgcGFzcy10aHJ1IHF1ZXVlKS4KKwkgKiBUQ1FfUExVR19MSU1JVDogSW5jcmVhc2UvZGVjcmVhc2UgcXVldWUgc2l6ZQorCSAqLworCWludCAgICAgICAgICAgICBhY3Rpb247CisJX191MzIgICAgICAgICAgIGxpbWl0OworfTsKKworLyogVEJGIHNlY3Rpb24gKi8KKworc3RydWN0IHRjX3RiZl9xb3B0IHsKKwlzdHJ1Y3QgdGNfcmF0ZXNwZWMgcmF0ZTsKKwlzdHJ1Y3QgdGNfcmF0ZXNwZWMgcGVha3JhdGU7CisJX191MzIJCWxpbWl0OworCV9fdTMyCQlidWZmZXI7CisJX191MzIJCW10dTsKK307CisKK2VudW0geworCVRDQV9UQkZfVU5TUEVDLAorCVRDQV9UQkZfUEFSTVMsCisJVENBX1RCRl9SVEFCLAorCVRDQV9UQkZfUFRBQiwKKwlUQ0FfVEJGX1JBVEU2NCwKKwlUQ0FfVEJGX1BSQVRFNjQsCisJVENBX1RCRl9CVVJTVCwKKwlUQ0FfVEJGX1BCVVJTVCwKKwlfX1RDQV9UQkZfTUFYLAorfTsKKworI2RlZmluZSBUQ0FfVEJGX01BWCAoX19UQ0FfVEJGX01BWCAtIDEpCisKKworLyogVEVRTCBzZWN0aW9uICovCisKKy8qIFRFUUwgZG9lcyBub3QgcmVxdWlyZSBhbnkgcGFyYW1ldGVycyAqLworCisvKiBTRlEgc2VjdGlvbiAqLworCitzdHJ1Y3QgdGNfc2ZxX3FvcHQgeworCXVuc2lnbmVkCXF1YW50dW07CS8qIEJ5dGVzIHBlciByb3VuZCBhbGxvY2F0ZWQgdG8gZmxvdyAqLworCWludAkJcGVydHVyYl9wZXJpb2Q7CS8qIFBlcmlvZCBvZiBoYXNoIHBlcnR1cmJhdGlvbiAqLworCV9fdTMyCQlsaW1pdDsJCS8qIE1heGltYWwgcGFja2V0cyBpbiBxdWV1ZSAqLworCXVuc2lnbmVkCWRpdmlzb3I7CS8qIEhhc2ggZGl2aXNvciAgKi8KKwl1bnNpZ25lZAlmbG93czsJCS8qIE1heGltYWwgbnVtYmVyIG9mIGZsb3dzICAqLworfTsKKworc3RydWN0IHRjX3NmcXJlZF9zdGF0cyB7CisJX191MzIgICAgICAgICAgIHByb2JfZHJvcDsgICAgICAvKiBFYXJseSBkcm9wcywgYmVsb3cgbWF4IHRocmVzaG9sZCAqLworCV9fdTMyICAgICAgICAgICBmb3JjZWRfZHJvcDsJLyogRWFybHkgZHJvcHMsIGFmdGVyIG1heCB0aHJlc2hvbGQgKi8KKwlfX3UzMiAgICAgICAgICAgcHJvYl9tYXJrOyAgICAgIC8qIE1hcmtlZCBwYWNrZXRzLCBiZWxvdyBtYXggdGhyZXNob2xkICovCisJX191MzIgICAgICAgICAgIGZvcmNlZF9tYXJrOyAgICAvKiBNYXJrZWQgcGFja2V0cywgYWZ0ZXIgbWF4IHRocmVzaG9sZCAqLworCV9fdTMyICAgICAgICAgICBwcm9iX21hcmtfaGVhZDsgLyogTWFya2VkIHBhY2tldHMsIGJlbG93IG1heCB0aHJlc2hvbGQgKi8KKwlfX3UzMiAgICAgICAgICAgZm9yY2VkX21hcmtfaGVhZDsvKiBNYXJrZWQgcGFja2V0cywgYWZ0ZXIgbWF4IHRocmVzaG9sZCAqLworfTsKKworc3RydWN0IHRjX3NmcV9xb3B0X3YxIHsKKwlzdHJ1Y3QgdGNfc2ZxX3FvcHQgdjA7CisJdW5zaWduZWQgaW50CWRlcHRoOwkJLyogbWF4IG51bWJlciBvZiBwYWNrZXRzIHBlciBmbG93ICovCisJdW5zaWduZWQgaW50CWhlYWRkcm9wOworLyogU0ZRUkVEIHBhcmFtZXRlcnMgKi8KKwlfX3UzMgkJbGltaXQ7CQkvKiBIQVJEIG1heGltYWwgZmxvdyBxdWV1ZSBsZW5ndGggKGJ5dGVzKSAqLworCV9fdTMyCQlxdGhfbWluOwkvKiBNaW4gYXZlcmFnZSBsZW5ndGggdGhyZXNob2xkIChieXRlcykgKi8KKwlfX3UzMgkJcXRoX21heDsJLyogTWF4IGF2ZXJhZ2UgbGVuZ3RoIHRocmVzaG9sZCAoYnl0ZXMpICovCisJdW5zaWduZWQgY2hhciAgIFdsb2c7CQkvKiBsb2coVykJCSovCisJdW5zaWduZWQgY2hhciAgIFBsb2c7CQkvKiBsb2coUF9tYXgvKHF0aF9tYXgtcXRoX21pbikpCSovCisJdW5zaWduZWQgY2hhciAgIFNjZWxsX2xvZzsJLyogY2VsbCBzaXplIGZvciBpZGxlIGRhbXBpbmcgKi8KKwl1bnNpZ25lZCBjaGFyCWZsYWdzOworCV9fdTMyCQltYXhfUDsJCS8qIHByb2JhYmlsaXR5LCBoaWdoIHJlc29sdXRpb24gKi8KKy8qIFNGUVJFRCBzdGF0cyAqLworCXN0cnVjdCB0Y19zZnFyZWRfc3RhdHMgc3RhdHM7Cit9OworCisKK3N0cnVjdCB0Y19zZnFfeHN0YXRzIHsKKwlfX3MzMgkJYWxsb3Q7Cit9OworCisvKiBSRUQgc2VjdGlvbiAqLworCitlbnVtIHsKKwlUQ0FfUkVEX1VOU1BFQywKKwlUQ0FfUkVEX1BBUk1TLAorCVRDQV9SRURfU1RBQiwKKwlUQ0FfUkVEX01BWF9QLAorCV9fVENBX1JFRF9NQVgsCit9OworCisjZGVmaW5lIFRDQV9SRURfTUFYIChfX1RDQV9SRURfTUFYIC0gMSkKKworc3RydWN0IHRjX3JlZF9xb3B0IHsKKwlfX3UzMgkJbGltaXQ7CQkvKiBIQVJEIG1heGltYWwgcXVldWUgbGVuZ3RoIChieXRlcykJKi8KKwlfX3UzMgkJcXRoX21pbjsJLyogTWluIGF2ZXJhZ2UgbGVuZ3RoIHRocmVzaG9sZCAoYnl0ZXMpICovCisJX191MzIJCXF0aF9tYXg7CS8qIE1heCBhdmVyYWdlIGxlbmd0aCB0aHJlc2hvbGQgKGJ5dGVzKSAqLworCXVuc2lnbmVkIGNoYXIgICBXbG9nOwkJLyogbG9nKFcpCQkqLworCXVuc2lnbmVkIGNoYXIgICBQbG9nOwkJLyogbG9nKFBfbWF4LyhxdGhfbWF4LXF0aF9taW4pKQkqLworCXVuc2lnbmVkIGNoYXIgICBTY2VsbF9sb2c7CS8qIGNlbGwgc2l6ZSBmb3IgaWRsZSBkYW1waW5nICovCisJdW5zaWduZWQgY2hhcglmbGFnczsKKyNkZWZpbmUgVENfUkVEX0VDTgkJMQorI2RlZmluZSBUQ19SRURfSEFSRERST1AJCTIKKyNkZWZpbmUgVENfUkVEX0FEQVBUQVRJVkUJNAorfTsKKworc3RydWN0IHRjX3JlZF94c3RhdHMgeworCV9fdTMyICAgICAgICAgICBlYXJseTsgICAgICAgICAgLyogRWFybHkgZHJvcHMgKi8KKwlfX3UzMiAgICAgICAgICAgcGRyb3A7ICAgICAgICAgIC8qIERyb3BzIGR1ZSB0byBxdWV1ZSBsaW1pdHMgKi8KKwlfX3UzMiAgICAgICAgICAgb3RoZXI7ICAgICAgICAgIC8qIERyb3BzIGR1ZSB0byBkcm9wKCkgY2FsbHMgKi8KKwlfX3UzMiAgICAgICAgICAgbWFya2VkOyAgICAgICAgIC8qIE1hcmtlZCBwYWNrZXRzICovCit9OworCisvKiBHUkVEIHNlY3Rpb24gKi8KKworI2RlZmluZSBNQVhfRFBzIDE2CisKK2VudW0geworICAgICAgIFRDQV9HUkVEX1VOU1BFQywKKyAgICAgICBUQ0FfR1JFRF9QQVJNUywKKyAgICAgICBUQ0FfR1JFRF9TVEFCLAorICAgICAgIFRDQV9HUkVEX0RQUywKKyAgICAgICBUQ0FfR1JFRF9NQVhfUCwKKyAgICAgICBUQ0FfR1JFRF9MSU1JVCwKKyAgICAgICBfX1RDQV9HUkVEX01BWCwKK307CisKKyNkZWZpbmUgVENBX0dSRURfTUFYIChfX1RDQV9HUkVEX01BWCAtIDEpCisKK3N0cnVjdCB0Y19ncmVkX3FvcHQgeworCV9fdTMyCQlsaW1pdDsgICAgICAgIC8qIEhBUkQgbWF4aW1hbCBxdWV1ZSBsZW5ndGggKGJ5dGVzKSAgICAqLworCV9fdTMyCQlxdGhfbWluOyAgICAgIC8qIE1pbiBhdmVyYWdlIGxlbmd0aCB0aHJlc2hvbGQgKGJ5dGVzKSAqLworCV9fdTMyCQlxdGhfbWF4OyAgICAgIC8qIE1heCBhdmVyYWdlIGxlbmd0aCB0aHJlc2hvbGQgKGJ5dGVzKSAqLworCV9fdTMyCQlEUDsgICAgICAgICAgIC8qIHVwIHRvIDJeMzIgRFBzICovCisJX191MzIJCWJhY2tsb2c7CisJX191MzIJCXFhdmU7CisJX191MzIJCWZvcmNlZDsKKwlfX3UzMgkJZWFybHk7CisJX191MzIJCW90aGVyOworCV9fdTMyCQlwZHJvcDsKKwlfX3U4CQlXbG9nOyAgICAgICAgIC8qIGxvZyhXKSAgICAgICAgICAgICAgICovCisJX191OAkJUGxvZzsgICAgICAgICAvKiBsb2coUF9tYXgvKHF0aF9tYXgtcXRoX21pbikpICovCisJX191OAkJU2NlbGxfbG9nOyAgICAvKiBjZWxsIHNpemUgZm9yIGlkbGUgZGFtcGluZyAqLworCV9fdTgJCXByaW87ICAgICAgICAgLyogcHJpbyBvZiB0aGlzIFZRICovCisJX191MzIJCXBhY2tldHM7CisJX191MzIJCWJ5dGVzaW47Cit9OworCisvKiBncmVkIHNldHVwICovCitzdHJ1Y3QgdGNfZ3JlZF9zb3B0IHsKKwlfX3UzMgkJRFBzOworCV9fdTMyCQlkZWZfRFA7CisJX191OAkJZ3JpbzsKKwlfX3U4CQlmbGFnczsKKwlfX3UxNgkJcGFkMTsKK307CisKKy8qIENIT0tlIHNlY3Rpb24gKi8KKworZW51bSB7CisJVENBX0NIT0tFX1VOU1BFQywKKwlUQ0FfQ0hPS0VfUEFSTVMsCisJVENBX0NIT0tFX1NUQUIsCisJVENBX0NIT0tFX01BWF9QLAorCV9fVENBX0NIT0tFX01BWCwKK307CisKKyNkZWZpbmUgVENBX0NIT0tFX01BWCAoX19UQ0FfQ0hPS0VfTUFYIC0gMSkKKworc3RydWN0IHRjX2Nob2tlX3FvcHQgeworCV9fdTMyCQlsaW1pdDsJCS8qIEhhcmQgcXVldWUgbGVuZ3RoIChwYWNrZXRzKQkqLworCV9fdTMyCQlxdGhfbWluOwkvKiBNaW4gYXZlcmFnZSB0aHJlc2hvbGQgKHBhY2tldHMpICovCisJX191MzIJCXF0aF9tYXg7CS8qIE1heCBhdmVyYWdlIHRocmVzaG9sZCAocGFja2V0cykgKi8KKwl1bnNpZ25lZCBjaGFyICAgV2xvZzsJCS8qIGxvZyhXKQkJKi8KKwl1bnNpZ25lZCBjaGFyICAgUGxvZzsJCS8qIGxvZyhQX21heC8ocXRoX21heC1xdGhfbWluKSkJKi8KKwl1bnNpZ25lZCBjaGFyICAgU2NlbGxfbG9nOwkvKiBjZWxsIHNpemUgZm9yIGlkbGUgZGFtcGluZyAqLworCXVuc2lnbmVkIGNoYXIJZmxhZ3M7CQkvKiBzZWUgUkVEIGZsYWdzICovCit9OworCitzdHJ1Y3QgdGNfY2hva2VfeHN0YXRzIHsKKwlfX3UzMgkJZWFybHk7ICAgICAgICAgIC8qIEVhcmx5IGRyb3BzICovCisJX191MzIJCXBkcm9wOyAgICAgICAgICAvKiBEcm9wcyBkdWUgdG8gcXVldWUgbGltaXRzICovCisJX191MzIJCW90aGVyOyAgICAgICAgICAvKiBEcm9wcyBkdWUgdG8gZHJvcCgpIGNhbGxzICovCisJX191MzIJCW1hcmtlZDsgICAgICAgICAvKiBNYXJrZWQgcGFja2V0cyAqLworCV9fdTMyCQltYXRjaGVkOwkvKiBEcm9wcyBkdWUgdG8gZmxvdyBtYXRjaCAqLworfTsKKworLyogSFRCIHNlY3Rpb24gKi8KKyNkZWZpbmUgVENfSFRCX05VTVBSSU8JCTgKKyNkZWZpbmUgVENfSFRCX01BWERFUFRICQk4CisjZGVmaW5lIFRDX0hUQl9QUk9UT1ZFUgkJMyAvKiB0aGUgc2FtZSBhcyBIVEIgYW5kIFRDJ3MgbWFqb3IgKi8KKworc3RydWN0IHRjX2h0Yl9vcHQgeworCXN0cnVjdCB0Y19yYXRlc3BlYyAJcmF0ZTsKKwlzdHJ1Y3QgdGNfcmF0ZXNwZWMgCWNlaWw7CisJX191MzIJYnVmZmVyOworCV9fdTMyCWNidWZmZXI7CisJX191MzIJcXVhbnR1bTsKKwlfX3UzMglsZXZlbDsJCS8qIG91dCBvbmx5ICovCisJX191MzIJcHJpbzsKK307CitzdHJ1Y3QgdGNfaHRiX2dsb2IgeworCV9fdTMyIHZlcnNpb247CQkvKiB0byBtYXRjaCBIVEIvVEMgKi8KKyAgICAJX191MzIgcmF0ZTJxdWFudHVtOwkvKiBicHMtPnF1YW50dW0gZGl2aXNvciAqLworICAgIAlfX3UzMiBkZWZjbHM7CQkvKiBkZWZhdWx0IGNsYXNzIG51bWJlciAqLworCV9fdTMyIGRlYnVnOwkJLyogZGVidWcgZmxhZ3MgKi8KKworCS8qIHN0YXRzICovCisJX191MzIgZGlyZWN0X3BrdHM7IC8qIGNvdW50IG9mIG5vbiBzaGFwZWQgcGFja2V0cyAqLworfTsKK2VudW0geworCVRDQV9IVEJfVU5TUEVDLAorCVRDQV9IVEJfUEFSTVMsCisJVENBX0hUQl9JTklULAorCVRDQV9IVEJfQ1RBQiwKKwlUQ0FfSFRCX1JUQUIsCisJVENBX0hUQl9ESVJFQ1RfUUxFTiwKKwlUQ0FfSFRCX1JBVEU2NCwKKwlUQ0FfSFRCX0NFSUw2NCwKKwlfX1RDQV9IVEJfTUFYLAorfTsKKworI2RlZmluZSBUQ0FfSFRCX01BWCAoX19UQ0FfSFRCX01BWCAtIDEpCisKK3N0cnVjdCB0Y19odGJfeHN0YXRzIHsKKwlfX3UzMiBsZW5kczsKKwlfX3UzMiBib3Jyb3dzOworCV9fdTMyIGdpYW50czsJLyogdG9vIGJpZyBwYWNrZXRzIChyYXRlIHdpbGwgbm90IGJlIGFjY3VyYXRlKSAqLworCV9fdTMyIHRva2VuczsKKwlfX3UzMiBjdG9rZW5zOworfTsKKworLyogSEZTQyBzZWN0aW9uICovCisKK3N0cnVjdCB0Y19oZnNjX3FvcHQgeworCV9fdTE2CWRlZmNsczsJCS8qIGRlZmF1bHQgY2xhc3MgKi8KK307CisKK3N0cnVjdCB0Y19zZXJ2aWNlX2N1cnZlIHsKKwlfX3UzMgltMTsJCS8qIHNsb3BlIG9mIHRoZSBmaXJzdCBzZWdtZW50IGluIGJwcyAqLworCV9fdTMyCWQ7CQkvKiB4LXByb2plY3Rpb24gb2YgdGhlIGZpcnN0IHNlZ21lbnQgaW4gdXMgKi8KKwlfX3UzMgltMjsJCS8qIHNsb3BlIG9mIHRoZSBzZWNvbmQgc2VnbWVudCBpbiBicHMgKi8KK307CisKK3N0cnVjdCB0Y19oZnNjX3N0YXRzIHsKKwlfX3U2NAl3b3JrOwkJLyogdG90YWwgd29yayBkb25lICovCisJX191NjQJcnR3b3JrOwkJLyogd29yayBkb25lIGJ5IHJlYWwtdGltZSBjcml0ZXJpYSAqLworCV9fdTMyCXBlcmlvZDsJCS8qIGN1cnJlbnQgcGVyaW9kICovCisJX191MzIJbGV2ZWw7CQkvKiBjbGFzcyBsZXZlbCBpbiBoaWVyYXJjaHkgKi8KK307CisKK2VudW0geworCVRDQV9IRlNDX1VOU1BFQywKKwlUQ0FfSEZTQ19SU0MsCisJVENBX0hGU0NfRlNDLAorCVRDQV9IRlNDX1VTQywKKwlfX1RDQV9IRlNDX01BWCwKK307CisKKyNkZWZpbmUgVENBX0hGU0NfTUFYIChfX1RDQV9IRlNDX01BWCAtIDEpCisKKworLyogQ0JRIHNlY3Rpb24gKi8KKworI2RlZmluZSBUQ19DQlFfTUFYUFJJTwkJOAorI2RlZmluZSBUQ19DQlFfTUFYTEVWRUwJCTgKKyNkZWZpbmUgVENfQ0JRX0RFRl9FV01BCQk1CisKK3N0cnVjdCB0Y19jYnFfbHNzb3B0IHsKKwl1bnNpZ25lZCBjaGFyCWNoYW5nZTsKKwl1bnNpZ25lZCBjaGFyCWZsYWdzOworI2RlZmluZSBUQ0ZfQ0JRX0xTU19CT1VOREVECTEKKyNkZWZpbmUgVENGX0NCUV9MU1NfSVNPTEFURUQJMgorCXVuc2lnbmVkIGNoYXIgIAlld21hX2xvZzsKKwl1bnNpZ25lZCBjaGFyICAJbGV2ZWw7CisjZGVmaW5lIFRDRl9DQlFfTFNTX0ZMQUdTCTEKKyNkZWZpbmUgVENGX0NCUV9MU1NfRVdNQQkyCisjZGVmaW5lIFRDRl9DQlFfTFNTX01BWElETEUJNAorI2RlZmluZSBUQ0ZfQ0JRX0xTU19NSU5JRExFCTgKKyNkZWZpbmUgVENGX0NCUV9MU1NfT0ZGVElNRQkweDEwCisjZGVmaW5lIFRDRl9DQlFfTFNTX0FWUEtUCTB4MjAKKwlfX3UzMgkJbWF4aWRsZTsKKwlfX3UzMgkJbWluaWRsZTsKKwlfX3UzMgkJb2ZmdGltZTsKKwlfX3UzMgkJYXZwa3Q7Cit9OworCitzdHJ1Y3QgdGNfY2JxX3dycm9wdCB7CisJdW5zaWduZWQgY2hhcglmbGFnczsKKwl1bnNpZ25lZCBjaGFyCXByaW9yaXR5OworCXVuc2lnbmVkIGNoYXIJY3ByaW9yaXR5OworCXVuc2lnbmVkIGNoYXIJX19yZXNlcnZlZDsKKwlfX3UzMgkJYWxsb3Q7CisJX191MzIJCXdlaWdodDsKK307CisKK3N0cnVjdCB0Y19jYnFfb3ZsIHsKKwl1bnNpZ25lZCBjaGFyCXN0cmF0ZWd5OworI2RlZmluZQlUQ19DQlFfT1ZMX0NMQVNTSUMJMAorI2RlZmluZQlUQ19DQlFfT1ZMX0RFTEFZCTEKKyNkZWZpbmUJVENfQ0JRX09WTF9MT1dQUklPCTIKKyNkZWZpbmUJVENfQ0JRX09WTF9EUk9QCQkzCisjZGVmaW5lCVRDX0NCUV9PVkxfUkNMQVNTSUMJNAorCXVuc2lnbmVkIGNoYXIJcHJpb3JpdHkyOworCV9fdTE2CQlwYWQ7CisJX191MzIJCXBlbmFsdHk7Cit9OworCitzdHJ1Y3QgdGNfY2JxX3BvbGljZSB7CisJdW5zaWduZWQgY2hhcglwb2xpY2U7CisJdW5zaWduZWQgY2hhcglfX3JlczE7CisJdW5zaWduZWQgc2hvcnQJX19yZXMyOworfTsKKworc3RydWN0IHRjX2NicV9mb3B0IHsKKwlfX3UzMgkJc3BsaXQ7CisJX191MzIJCWRlZm1hcDsKKwlfX3UzMgkJZGVmY2hhbmdlOworfTsKKworc3RydWN0IHRjX2NicV94c3RhdHMgeworCV9fdTMyCQlib3Jyb3dzOworCV9fdTMyCQlvdmVyYWN0aW9uczsKKwlfX3MzMgkJYXZnaWRsZTsKKwlfX3MzMgkJdW5kZXJ0aW1lOworfTsKKworZW51bSB7CisJVENBX0NCUV9VTlNQRUMsCisJVENBX0NCUV9MU1NPUFQsCisJVENBX0NCUV9XUlJPUFQsCisJVENBX0NCUV9GT1BULAorCVRDQV9DQlFfT1ZMX1NUUkFURUdZLAorCVRDQV9DQlFfUkFURSwKKwlUQ0FfQ0JRX1JUQUIsCisJVENBX0NCUV9QT0xJQ0UsCisJX19UQ0FfQ0JRX01BWCwKK307CisKKyNkZWZpbmUgVENBX0NCUV9NQVgJKF9fVENBX0NCUV9NQVggLSAxKQorCisvKiBkc21hcmsgc2VjdGlvbiAqLworCitlbnVtIHsKKwlUQ0FfRFNNQVJLX1VOU1BFQywKKwlUQ0FfRFNNQVJLX0lORElDRVMsCisJVENBX0RTTUFSS19ERUZBVUxUX0lOREVYLAorCVRDQV9EU01BUktfU0VUX1RDX0lOREVYLAorCVRDQV9EU01BUktfTUFTSywKKwlUQ0FfRFNNQVJLX1ZBTFVFLAorCV9fVENBX0RTTUFSS19NQVgsCit9OworCisjZGVmaW5lIFRDQV9EU01BUktfTUFYIChfX1RDQV9EU01BUktfTUFYIC0gMSkKKworLyogQVRNICBzZWN0aW9uICovCisKK2VudW0geworCVRDQV9BVE1fVU5TUEVDLAorCVRDQV9BVE1fRkQsCQkvKiBmaWxlL3NvY2tldCBkZXNjcmlwdG9yICovCisJVENBX0FUTV9QVFIsCQkvKiBwb2ludGVyIHRvIGRlc2NyaXB0b3IgLSBsYXRlciAqLworCVRDQV9BVE1fSERSLAkJLyogTEwgaGVhZGVyICovCisJVENBX0FUTV9FWENFU1MsCQkvKiBleGNlc3MgdHJhZmZpYyBjbGFzcyAoMCBmb3IgQ0xQKSAgKi8KKwlUQ0FfQVRNX0FERFIsCQkvKiBQVkMgYWRkcmVzcyAoZm9yIG91dHB1dCBvbmx5KSAqLworCVRDQV9BVE1fU1RBVEUsCQkvKiBWQyBzdGF0ZSAoQVRNX1ZTXyo7IGZvciBvdXRwdXQgb25seSkgKi8KKwlfX1RDQV9BVE1fTUFYLAorfTsKKworI2RlZmluZSBUQ0FfQVRNX01BWAkoX19UQ0FfQVRNX01BWCAtIDEpCisKKy8qIE5ldHdvcmsgZW11bGF0b3IgKi8KKworZW51bSB7CisJVENBX05FVEVNX1VOU1BFQywKKwlUQ0FfTkVURU1fQ09SUiwKKwlUQ0FfTkVURU1fREVMQVlfRElTVCwKKwlUQ0FfTkVURU1fUkVPUkRFUiwKKwlUQ0FfTkVURU1fQ09SUlVQVCwKKwlUQ0FfTkVURU1fTE9TUywKKwlUQ0FfTkVURU1fUkFURSwKKwlUQ0FfTkVURU1fRUNOLAorCVRDQV9ORVRFTV9SQVRFNjQsCisJX19UQ0FfTkVURU1fTUFYLAorfTsKKworI2RlZmluZSBUQ0FfTkVURU1fTUFYIChfX1RDQV9ORVRFTV9NQVggLSAxKQorCitzdHJ1Y3QgdGNfbmV0ZW1fcW9wdCB7CisJX191MzIJbGF0ZW5jeTsJLyogYWRkZWQgZGVsYXkgKHVzKSAqLworCV9fdTMyICAgbGltaXQ7CQkvKiBmaWZvIGxpbWl0IChwYWNrZXRzKSAqLworCV9fdTMyCWxvc3M7CQkvKiByYW5kb20gcGFja2V0IGxvc3MgKDA9bm9uZSB+MD0xMDAlKSAqLworCV9fdTMyCWdhcDsJCS8qIHJlLW9yZGVyaW5nIGdhcCAoMCBmb3Igbm9uZSkgKi8KKwlfX3UzMiAgIGR1cGxpY2F0ZTsJLyogcmFuZG9tIHBhY2tldCBkdXAgICgwPW5vbmUgfjA9MTAwJSkgKi8KKwlfX3UzMglqaXR0ZXI7CQkvKiByYW5kb20gaml0dGVyIGluIGxhdGVuY3kgKHVzKSAqLworfTsKKworc3RydWN0IHRjX25ldGVtX2NvcnIgeworCV9fdTMyCWRlbGF5X2NvcnI7CS8qIGRlbGF5IGNvcnJlbGF0aW9uICovCisJX191MzIJbG9zc19jb3JyOwkvKiBwYWNrZXQgbG9zcyBjb3JyZWxhdGlvbiAqLworCV9fdTMyCWR1cF9jb3JyOwkvKiBkdXBsaWNhdGUgY29ycmVsYXRpb24gICovCit9OworCitzdHJ1Y3QgdGNfbmV0ZW1fcmVvcmRlciB7CisJX191MzIJcHJvYmFiaWxpdHk7CisJX191MzIJY29ycmVsYXRpb247Cit9OworCitzdHJ1Y3QgdGNfbmV0ZW1fY29ycnVwdCB7CisJX191MzIJcHJvYmFiaWxpdHk7CisJX191MzIJY29ycmVsYXRpb247Cit9OworCitzdHJ1Y3QgdGNfbmV0ZW1fcmF0ZSB7CisJX191MzIJcmF0ZTsJLyogYnl0ZS9zICovCisJX19zMzIJcGFja2V0X292ZXJoZWFkOworCV9fdTMyCWNlbGxfc2l6ZTsKKwlfX3MzMgljZWxsX292ZXJoZWFkOworfTsKKworZW51bSB7CisJTkVURU1fTE9TU19VTlNQRUMsCisJTkVURU1fTE9TU19HSSwJCS8qIEdlbmVyYWwgSW50dWl0aXZlIC0gNCBzdGF0ZSBtb2RlbCAqLworCU5FVEVNX0xPU1NfR0UsCQkvKiBHaWxiZXJ0IEVsbGlvdCBtb2RlbHMgKi8KKwlfX05FVEVNX0xPU1NfTUFYCit9OworI2RlZmluZSBORVRFTV9MT1NTX01BWCAoX19ORVRFTV9MT1NTX01BWCAtIDEpCisKKy8qIFN0YXRlIHRyYW5zaXRpb24gcHJvYmFiaWxpdGllcyBmb3IgNCBzdGF0ZSBtb2RlbCAqLworc3RydWN0IHRjX25ldGVtX2dpbW9kZWwgeworCV9fdTMyCXAxMzsKKwlfX3UzMglwMzE7CisJX191MzIJcDMyOworCV9fdTMyCXAxNDsKKwlfX3UzMglwMjM7Cit9OworCisvKiBHaWxiZXJ0LUVsbGlvdCBtb2RlbHMgKi8KK3N0cnVjdCB0Y19uZXRlbV9nZW1vZGVsIHsKKwlfX3UzMiBwOworCV9fdTMyIHI7CisJX191MzIgaDsKKwlfX3UzMiBrMTsKK307CisKKyNkZWZpbmUgTkVURU1fRElTVF9TQ0FMRQk4MTkyCisjZGVmaW5lIE5FVEVNX0RJU1RfTUFYCQkxNjM4NAorCisvKiBEUlIgKi8KKworZW51bSB7CisJVENBX0RSUl9VTlNQRUMsCisJVENBX0RSUl9RVUFOVFVNLAorCV9fVENBX0RSUl9NQVgKK307CisKKyNkZWZpbmUgVENBX0RSUl9NQVgJKF9fVENBX0RSUl9NQVggLSAxKQorCitzdHJ1Y3QgdGNfZHJyX3N0YXRzIHsKKwlfX3UzMglkZWZpY2l0OworfTsKKworLyogTVFQUklPICovCisjZGVmaW5lIFRDX1FPUFRfQklUTUFTSyAxNQorI2RlZmluZSBUQ19RT1BUX01BWF9RVUVVRSAxNgorCitzdHJ1Y3QgdGNfbXFwcmlvX3FvcHQgeworCV9fdTgJbnVtX3RjOworCV9fdTgJcHJpb190Y19tYXBbVENfUU9QVF9CSVRNQVNLICsgMV07CisJX191OAlodzsKKwlfX3UxNgljb3VudFtUQ19RT1BUX01BWF9RVUVVRV07CisJX191MTYJb2Zmc2V0W1RDX1FPUFRfTUFYX1FVRVVFXTsKK307CisKKy8qIFNGQiAqLworCitlbnVtIHsKKwlUQ0FfU0ZCX1VOU1BFQywKKwlUQ0FfU0ZCX1BBUk1TLAorCV9fVENBX1NGQl9NQVgsCit9OworCisjZGVmaW5lIFRDQV9TRkJfTUFYIChfX1RDQV9TRkJfTUFYIC0gMSkKKworLyoKKyAqIE5vdGU6IGluY3JlbWVudCwgZGVjcmVtZW50IGFyZSBRMC4xNiBmaXhlZC1wb2ludCB2YWx1ZXMuCisgKi8KK3N0cnVjdCB0Y19zZmJfcW9wdCB7CisJX191MzIgcmVoYXNoX2ludGVydmFsOwkvKiBkZWxheSBiZXR3ZWVuIGhhc2ggbW92ZSwgaW4gbXMgKi8KKwlfX3UzMiB3YXJtdXBfdGltZTsJLyogZG91YmxlIGJ1ZmZlcmluZyB3YXJtdXAgdGltZSBpbiBtcyAod2FybXVwX3RpbWUgPCByZWhhc2hfaW50ZXJ2YWwpICovCisJX191MzIgbWF4OwkJLyogbWF4IGxlbiBvZiBxbGVuX21pbiAqLworCV9fdTMyIGJpbl9zaXplOwkJLyogbWF4aW11bSBxdWV1ZSBsZW5ndGggcGVyIGJpbiAqLworCV9fdTMyIGluY3JlbWVudDsJLyogcHJvYmFiaWxpdHkgaW5jcmVtZW50LCAoZDEgaW4gQmx1ZSkgKi8KKwlfX3UzMiBkZWNyZW1lbnQ7CS8qIHByb2JhYmlsaXR5IGRlY3JlbWVudCwgKGQyIGluIEJsdWUpICovCisJX191MzIgbGltaXQ7CQkvKiBtYXggU0ZCIHF1ZXVlIGxlbmd0aCAqLworCV9fdTMyIHBlbmFsdHlfcmF0ZTsJLyogaW5lbGFzdGljIGZsb3dzIGFyZSByYXRlIGxpbWl0ZWQgdG8gJ3JhdGUnIHBwcyAqLworCV9fdTMyIHBlbmFsdHlfYnVyc3Q7Cit9OworCitzdHJ1Y3QgdGNfc2ZiX3hzdGF0cyB7CisJX191MzIgZWFybHlkcm9wOworCV9fdTMyIHBlbmFsdHlkcm9wOworCV9fdTMyIGJ1Y2tldGRyb3A7CisJX191MzIgcXVldWVkcm9wOworCV9fdTMyIGNoaWxkZHJvcDsgLyogZHJvcHMgaW4gY2hpbGQgcWRpc2MgKi8KKwlfX3UzMiBtYXJrZWQ7CisJX191MzIgbWF4cWxlbjsKKwlfX3UzMiBtYXhwcm9iOworCV9fdTMyIGF2Z3Byb2I7Cit9OworCisjZGVmaW5lIFNGQl9NQVhfUFJPQiAweEZGRkYKKworLyogUUZRICovCitlbnVtIHsKKwlUQ0FfUUZRX1VOU1BFQywKKwlUQ0FfUUZRX1dFSUdIVCwKKwlUQ0FfUUZRX0xNQVgsCisJX19UQ0FfUUZRX01BWAorfTsKKworI2RlZmluZSBUQ0FfUUZRX01BWAkoX19UQ0FfUUZRX01BWCAtIDEpCisKK3N0cnVjdCB0Y19xZnFfc3RhdHMgeworCV9fdTMyIHdlaWdodDsKKwlfX3UzMiBsbWF4OworfTsKKworLyogQ09ERUwgKi8KKworZW51bSB7CisJVENBX0NPREVMX1VOU1BFQywKKwlUQ0FfQ09ERUxfVEFSR0VULAorCVRDQV9DT0RFTF9MSU1JVCwKKwlUQ0FfQ09ERUxfSU5URVJWQUwsCisJVENBX0NPREVMX0VDTiwKKwlUQ0FfQ09ERUxfQ0VfVEhSRVNIT0xELAorCV9fVENBX0NPREVMX01BWAorfTsKKworI2RlZmluZSBUQ0FfQ09ERUxfTUFYCShfX1RDQV9DT0RFTF9NQVggLSAxKQorCitzdHJ1Y3QgdGNfY29kZWxfeHN0YXRzIHsKKwlfX3UzMgltYXhwYWNrZXQ7IC8qIGxhcmdlc3QgcGFja2V0IHdlJ3ZlIHNlZW4gc28gZmFyICovCisJX191MzIJY291bnQ7CSAgIC8qIGhvdyBtYW55IGRyb3BzIHdlJ3ZlIGRvbmUgc2luY2UgdGhlIGxhc3QgdGltZSB3ZQorCQkJICAgICogZW50ZXJlZCBkcm9wcGluZyBzdGF0ZQorCQkJICAgICovCisJX191MzIJbGFzdGNvdW50OyAvKiBjb3VudCBhdCBlbnRyeSB0byBkcm9wcGluZyBzdGF0ZSAqLworCV9fdTMyCWxkZWxheTsgICAgLyogaW4tcXVldWUgZGVsYXkgc2VlbiBieSBtb3N0IHJlY2VudGx5IGRlcXVldWVkIHBhY2tldCAqLworCV9fczMyCWRyb3BfbmV4dDsgLyogdGltZSB0byBkcm9wIG5leHQgcGFja2V0ICovCisJX191MzIJZHJvcF9vdmVybGltaXQ7IC8qIG51bWJlciBvZiB0aW1lIG1heCBxZGlzYyBwYWNrZXQgbGltaXQgd2FzIGhpdCAqLworCV9fdTMyCWVjbl9tYXJrOyAgLyogbnVtYmVyIG9mIHBhY2tldHMgd2UgRUNOIG1hcmtlZCBpbnN0ZWFkIG9mIGRyb3BwZWQgKi8KKwlfX3UzMglkcm9wcGluZzsgIC8qIGFyZSB3ZSBpbiBkcm9wcGluZyBzdGF0ZSA/ICovCisJX191MzIJY2VfbWFyazsgICAvKiBudW1iZXIgb2YgQ0UgbWFya2VkIHBhY2tldHMgYmVjYXVzZSBvZiBjZV90aHJlc2hvbGQgKi8KK307CisKKy8qIEZRX0NPREVMICovCisKK2VudW0geworCVRDQV9GUV9DT0RFTF9VTlNQRUMsCisJVENBX0ZRX0NPREVMX1RBUkdFVCwKKwlUQ0FfRlFfQ09ERUxfTElNSVQsCisJVENBX0ZRX0NPREVMX0lOVEVSVkFMLAorCVRDQV9GUV9DT0RFTF9FQ04sCisJVENBX0ZRX0NPREVMX0ZMT1dTLAorCVRDQV9GUV9DT0RFTF9RVUFOVFVNLAorCVRDQV9GUV9DT0RFTF9DRV9USFJFU0hPTEQsCisJX19UQ0FfRlFfQ09ERUxfTUFYCit9OworCisjZGVmaW5lIFRDQV9GUV9DT0RFTF9NQVgJKF9fVENBX0ZRX0NPREVMX01BWCAtIDEpCisKK2VudW0geworCVRDQV9GUV9DT0RFTF9YU1RBVFNfUURJU0MsCisJVENBX0ZRX0NPREVMX1hTVEFUU19DTEFTUywKK307CisKK3N0cnVjdCB0Y19mcV9jb2RlbF9xZF9zdGF0cyB7CisJX191MzIJbWF4cGFja2V0OwkvKiBsYXJnZXN0IHBhY2tldCB3ZSd2ZSBzZWVuIHNvIGZhciAqLworCV9fdTMyCWRyb3Bfb3ZlcmxpbWl0OyAvKiBudW1iZXIgb2YgdGltZSBtYXggcWRpc2MKKwkJCQkgKiBwYWNrZXQgbGltaXQgd2FzIGhpdAorCQkJCSAqLworCV9fdTMyCWVjbl9tYXJrOwkvKiBudW1iZXIgb2YgcGFja2V0cyB3ZSBFQ04gbWFya2VkCisJCQkJICogaW5zdGVhZCBvZiBiZWluZyBkcm9wcGVkCisJCQkJICovCisJX191MzIJbmV3X2Zsb3dfY291bnQ7IC8qIG51bWJlciBvZiB0aW1lIHBhY2tldHMKKwkJCQkgKiBjcmVhdGVkIGEgJ25ldyBmbG93JworCQkJCSAqLworCV9fdTMyCW5ld19mbG93c19sZW47CS8qIGNvdW50IG9mIGZsb3dzIGluIG5ldyBsaXN0ICovCisJX191MzIJb2xkX2Zsb3dzX2xlbjsJLyogY291bnQgb2YgZmxvd3MgaW4gb2xkIGxpc3QgKi8KKwlfX3UzMgljZV9tYXJrOwkvKiBwYWNrZXRzIGFib3ZlIGNlX3RocmVzaG9sZCAqLworfTsKKworc3RydWN0IHRjX2ZxX2NvZGVsX2NsX3N0YXRzIHsKKwlfX3MzMglkZWZpY2l0OworCV9fdTMyCWxkZWxheTsJCS8qIGluLXF1ZXVlIGRlbGF5IHNlZW4gYnkgbW9zdCByZWNlbnRseQorCQkJCSAqIGRlcXVldWVkIHBhY2tldAorCQkJCSAqLworCV9fdTMyCWNvdW50OworCV9fdTMyCWxhc3Rjb3VudDsKKwlfX3UzMglkcm9wcGluZzsKKwlfX3MzMglkcm9wX25leHQ7Cit9OworCitzdHJ1Y3QgdGNfZnFfY29kZWxfeHN0YXRzIHsKKwlfX3UzMgl0eXBlOworCXVuaW9uIHsKKwkJc3RydWN0IHRjX2ZxX2NvZGVsX3FkX3N0YXRzIHFkaXNjX3N0YXRzOworCQlzdHJ1Y3QgdGNfZnFfY29kZWxfY2xfc3RhdHMgY2xhc3Nfc3RhdHM7CisJfTsKK307CisKKy8qIEZRICovCisKK2VudW0geworCVRDQV9GUV9VTlNQRUMsCisKKwlUQ0FfRlFfUExJTUlULAkJLyogbGltaXQgb2YgdG90YWwgbnVtYmVyIG9mIHBhY2tldHMgaW4gcXVldWUgKi8KKworCVRDQV9GUV9GTE9XX1BMSU1JVCwJLyogbGltaXQgb2YgcGFja2V0cyBwZXIgZmxvdyAqLworCisJVENBX0ZRX1FVQU5UVU0sCQkvKiBSUiBxdWFudHVtICovCisKKwlUQ0FfRlFfSU5JVElBTF9RVUFOVFVNLAkJLyogUlIgcXVhbnR1bSBmb3IgbmV3IGZsb3cgKi8KKworCVRDQV9GUV9SQVRFX0VOQUJMRSwJLyogZW5hYmxlL2Rpc2FibGUgcmF0ZSBsaW1pdGluZyAqLworCisJVENBX0ZRX0ZMT1dfREVGQVVMVF9SQVRFLC8qIG9ic29sZXRlLCBkbyBub3QgdXNlICovCisKKwlUQ0FfRlFfRkxPV19NQVhfUkFURSwJLyogcGVyIGZsb3cgbWF4IHJhdGUgKi8KKworCVRDQV9GUV9CVUNLRVRTX0xPRywJLyogbG9nMihudW1iZXIgb2YgYnVja2V0cykgKi8KKworCVRDQV9GUV9GTE9XX1JFRklMTF9ERUxBWSwJLyogZmxvdyBjcmVkaXQgcmVmaWxsIGRlbGF5IGluIHVzZWMgKi8KKworCVRDQV9GUV9PUlBIQU5fTUFTSywJLyogbWFzayBhcHBsaWVkIHRvIG9ycGhhbmVkIHNrYiBoYXNoZXMgKi8KKworCV9fVENBX0ZRX01BWAorfTsKKworI2RlZmluZSBUQ0FfRlFfTUFYCShfX1RDQV9GUV9NQVggLSAxKQorCitzdHJ1Y3QgdGNfZnFfcWRfc3RhdHMgeworCV9fdTY0CWdjX2Zsb3dzOworCV9fdTY0CWhpZ2hwcmlvX3BhY2tldHM7CisJX191NjQJdGNwX3JldHJhbnM7CisJX191NjQJdGhyb3R0bGVkOworCV9fdTY0CWZsb3dzX3BsaW1pdDsKKwlfX3U2NAlwa3RzX3Rvb19sb25nOworCV9fdTY0CWFsbG9jYXRpb25fZXJyb3JzOworCV9fczY0CXRpbWVfbmV4dF9kZWxheWVkX2Zsb3c7CisJX191MzIJZmxvd3M7CisJX191MzIJaW5hY3RpdmVfZmxvd3M7CisJX191MzIJdGhyb3R0bGVkX2Zsb3dzOworCV9fdTMyCXBhZDsKK307CisKKy8qIEhlYXZ5LUhpdHRlciBGaWx0ZXIgKi8KKworZW51bSB7CisJVENBX0hIRl9VTlNQRUMsCisJVENBX0hIRl9CQUNLTE9HX0xJTUlULAorCVRDQV9ISEZfUVVBTlRVTSwKKwlUQ0FfSEhGX0hIX0ZMT1dTX0xJTUlULAorCVRDQV9ISEZfUkVTRVRfVElNRU9VVCwKKwlUQ0FfSEhGX0FETUlUX0JZVEVTLAorCVRDQV9ISEZfRVZJQ1RfVElNRU9VVCwKKwlUQ0FfSEhGX05PTl9ISF9XRUlHSFQsCisJX19UQ0FfSEhGX01BWAorfTsKKworI2RlZmluZSBUQ0FfSEhGX01BWAkoX19UQ0FfSEhGX01BWCAtIDEpCisKK3N0cnVjdCB0Y19oaGZfeHN0YXRzIHsKKwlfX3UzMglkcm9wX292ZXJsaW1pdDsgLyogbnVtYmVyIG9mIHRpbWVzIG1heCBxZGlzYyBwYWNrZXQgbGltaXQKKwkJCQkgKiB3YXMgaGl0CisJCQkJICovCisJX191MzIJaGhfb3ZlcmxpbWl0OyAgIC8qIG51bWJlciBvZiB0aW1lcyBtYXggaGVhdnktaGl0dGVycyB3YXMgaGl0ICovCisJX191MzIJaGhfdG90X2NvdW50OyAgIC8qIG51bWJlciBvZiBjYXB0dXJlZCBoZWF2eS1oaXR0ZXJzIHNvIGZhciAqLworCV9fdTMyCWhoX2N1cl9jb3VudDsgICAvKiBudW1iZXIgb2YgY3VycmVudCBoZWF2eS1oaXR0ZXJzICovCit9OworCisvKiBQSUUgKi8KK2VudW0geworCVRDQV9QSUVfVU5TUEVDLAorCVRDQV9QSUVfVEFSR0VULAorCVRDQV9QSUVfTElNSVQsCisJVENBX1BJRV9UVVBEQVRFLAorCVRDQV9QSUVfQUxQSEEsCisJVENBX1BJRV9CRVRBLAorCVRDQV9QSUVfRUNOLAorCVRDQV9QSUVfQllURU1PREUsCisJX19UQ0FfUElFX01BWAorfTsKKyNkZWZpbmUgVENBX1BJRV9NQVggICAoX19UQ0FfUElFX01BWCAtIDEpCisKK3N0cnVjdCB0Y19waWVfeHN0YXRzIHsKKwlfX3UzMiBwcm9iOyAgICAgICAgICAgICAvKiBjdXJyZW50IHByb2JhYmlsaXR5ICovCisJX191MzIgZGVsYXk7ICAgICAgICAgICAgLyogY3VycmVudCBkZWxheSBpbiBtcyAqLworCV9fdTMyIGF2Z19kcV9yYXRlOyAgICAgIC8qIGN1cnJlbnQgYXZlcmFnZSBkcV9yYXRlIGluIGJpdHMvcGllX3RpbWUgKi8KKwlfX3UzMiBwYWNrZXRzX2luOyAgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgcGFja2V0cyBlbnF1ZXVlZCAqLworCV9fdTMyIGRyb3BwZWQ7ICAgICAgICAgIC8qIHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gcGllX2FjdGlvbiAqLworCV9fdTMyIG92ZXJsaW1pdDsgICAgICAgIC8qIGRyb3BwZWQgZHVlIHRvIGxhY2sgb2Ygc3BhY2UgaW4gcXVldWUgKi8KKwlfX3UzMiBtYXhxOyAgICAgICAgICAgICAvKiBtYXhpbXVtIHF1ZXVlIHNpemUgKi8KKwlfX3UzMiBlY25fbWFyazsgICAgICAgICAvKiBwYWNrZXRzIG1hcmtlZCB3aXRoIGVjbiovCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3J0bmV0bGluay5oIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9ydG5ldGxpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWQyZThlCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9ydG5ldGxpbmsuaApAQCAtMCwwICsxLDY3NiBAQAorI2lmbmRlZiBfX0xJTlVYX1JUTkVUTElOS19ICisjZGVmaW5lIF9fTElOVVhfUlRORVRMSU5LX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2xpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hZGRyLmg+CisjaW5jbHVkZSA8bGludXgvbmVpZ2hib3VyLmg+CisKKy8qIHJ0bmV0bGluayBmYW1pbGllcy4gVmFsdWVzIHVwIHRvIDEyNyBhcmUgcmVzZXJ2ZWQgZm9yIHJlYWwgYWRkcmVzcworICogZmFtaWxpZXMsIHZhbHVlcyBhYm92ZSAxMjggbWF5IGJlIHVzZWQgYXJiaXRyYXJpbHkuCisgKi8KKyNkZWZpbmUgUlROTF9GQU1JTFlfSVBNUgkJMTI4CisjZGVmaW5lIFJUTkxfRkFNSUxZX0lQNk1SCQkxMjkKKyNkZWZpbmUgUlROTF9GQU1JTFlfTUFYCQkJMTI5CisKKy8qKioqCisgKgkJUm91dGluZy9uZWlnaGJvdXIgZGlzY292ZXJ5IG1lc3NhZ2VzLgorICoqKiovCisKKy8qIFR5cGVzIG9mIG1lc3NhZ2VzICovCisKK2VudW0geworCVJUTV9CQVNFCT0gMTYsCisjZGVmaW5lIFJUTV9CQVNFCVJUTV9CQVNFCisKKwlSVE1fTkVXTElOSwk9IDE2LAorI2RlZmluZSBSVE1fTkVXTElOSwlSVE1fTkVXTElOSworCVJUTV9ERUxMSU5LLAorI2RlZmluZSBSVE1fREVMTElOSwlSVE1fREVMTElOSworCVJUTV9HRVRMSU5LLAorI2RlZmluZSBSVE1fR0VUTElOSwlSVE1fR0VUTElOSworCVJUTV9TRVRMSU5LLAorI2RlZmluZSBSVE1fU0VUTElOSwlSVE1fU0VUTElOSworCisJUlRNX05FV0FERFIJPSAyMCwKKyNkZWZpbmUgUlRNX05FV0FERFIJUlRNX05FV0FERFIKKwlSVE1fREVMQUREUiwKKyNkZWZpbmUgUlRNX0RFTEFERFIJUlRNX0RFTEFERFIKKwlSVE1fR0VUQUREUiwKKyNkZWZpbmUgUlRNX0dFVEFERFIJUlRNX0dFVEFERFIKKworCVJUTV9ORVdST1VURQk9IDI0LAorI2RlZmluZSBSVE1fTkVXUk9VVEUJUlRNX05FV1JPVVRFCisJUlRNX0RFTFJPVVRFLAorI2RlZmluZSBSVE1fREVMUk9VVEUJUlRNX0RFTFJPVVRFCisJUlRNX0dFVFJPVVRFLAorI2RlZmluZSBSVE1fR0VUUk9VVEUJUlRNX0dFVFJPVVRFCisKKwlSVE1fTkVXTkVJR0gJPSAyOCwKKyNkZWZpbmUgUlRNX05FV05FSUdICVJUTV9ORVdORUlHSAorCVJUTV9ERUxORUlHSCwKKyNkZWZpbmUgUlRNX0RFTE5FSUdICVJUTV9ERUxORUlHSAorCVJUTV9HRVRORUlHSCwKKyNkZWZpbmUgUlRNX0dFVE5FSUdICVJUTV9HRVRORUlHSAorCisJUlRNX05FV1JVTEUJPSAzMiwKKyNkZWZpbmUgUlRNX05FV1JVTEUJUlRNX05FV1JVTEUKKwlSVE1fREVMUlVMRSwKKyNkZWZpbmUgUlRNX0RFTFJVTEUJUlRNX0RFTFJVTEUKKwlSVE1fR0VUUlVMRSwKKyNkZWZpbmUgUlRNX0dFVFJVTEUJUlRNX0dFVFJVTEUKKworCVJUTV9ORVdRRElTQwk9IDM2LAorI2RlZmluZSBSVE1fTkVXUURJU0MJUlRNX05FV1FESVNDCisJUlRNX0RFTFFESVNDLAorI2RlZmluZSBSVE1fREVMUURJU0MJUlRNX0RFTFFESVNDCisJUlRNX0dFVFFESVNDLAorI2RlZmluZSBSVE1fR0VUUURJU0MJUlRNX0dFVFFESVNDCisKKwlSVE1fTkVXVENMQVNTCT0gNDAsCisjZGVmaW5lIFJUTV9ORVdUQ0xBU1MJUlRNX05FV1RDTEFTUworCVJUTV9ERUxUQ0xBU1MsCisjZGVmaW5lIFJUTV9ERUxUQ0xBU1MJUlRNX0RFTFRDTEFTUworCVJUTV9HRVRUQ0xBU1MsCisjZGVmaW5lIFJUTV9HRVRUQ0xBU1MJUlRNX0dFVFRDTEFTUworCisJUlRNX05FV1RGSUxURVIJPSA0NCwKKyNkZWZpbmUgUlRNX05FV1RGSUxURVIJUlRNX05FV1RGSUxURVIKKwlSVE1fREVMVEZJTFRFUiwKKyNkZWZpbmUgUlRNX0RFTFRGSUxURVIJUlRNX0RFTFRGSUxURVIKKwlSVE1fR0VUVEZJTFRFUiwKKyNkZWZpbmUgUlRNX0dFVFRGSUxURVIJUlRNX0dFVFRGSUxURVIKKworCVJUTV9ORVdBQ1RJT04JPSA0OCwKKyNkZWZpbmUgUlRNX05FV0FDVElPTiAgIFJUTV9ORVdBQ1RJT04KKwlSVE1fREVMQUNUSU9OLAorI2RlZmluZSBSVE1fREVMQUNUSU9OICAgUlRNX0RFTEFDVElPTgorCVJUTV9HRVRBQ1RJT04sCisjZGVmaW5lIFJUTV9HRVRBQ1RJT04gICBSVE1fR0VUQUNUSU9OCisKKwlSVE1fTkVXUFJFRklYCT0gNTIsCisjZGVmaW5lIFJUTV9ORVdQUkVGSVgJUlRNX05FV1BSRUZJWAorCisJUlRNX0dFVE1VTFRJQ0FTVCA9IDU4LAorI2RlZmluZSBSVE1fR0VUTVVMVElDQVNUIFJUTV9HRVRNVUxUSUNBU1QKKworCVJUTV9HRVRBTllDQVNUCT0gNjIsCisjZGVmaW5lIFJUTV9HRVRBTllDQVNUCVJUTV9HRVRBTllDQVNUCisKKwlSVE1fTkVXTkVJR0hUQkwJPSA2NCwKKyNkZWZpbmUgUlRNX05FV05FSUdIVEJMCVJUTV9ORVdORUlHSFRCTAorCVJUTV9HRVRORUlHSFRCTAk9IDY2LAorI2RlZmluZSBSVE1fR0VUTkVJR0hUQkwJUlRNX0dFVE5FSUdIVEJMCisJUlRNX1NFVE5FSUdIVEJMLAorI2RlZmluZSBSVE1fU0VUTkVJR0hUQkwJUlRNX1NFVE5FSUdIVEJMCisKKwlSVE1fTkVXTkRVU0VST1BUID0gNjgsCisjZGVmaW5lIFJUTV9ORVdORFVTRVJPUFQgUlRNX05FV05EVVNFUk9QVAorCisJUlRNX05FV0FERFJMQUJFTCA9IDcyLAorI2RlZmluZSBSVE1fTkVXQUREUkxBQkVMIFJUTV9ORVdBRERSTEFCRUwKKwlSVE1fREVMQUREUkxBQkVMLAorI2RlZmluZSBSVE1fREVMQUREUkxBQkVMIFJUTV9ERUxBRERSTEFCRUwKKwlSVE1fR0VUQUREUkxBQkVMLAorI2RlZmluZSBSVE1fR0VUQUREUkxBQkVMIFJUTV9HRVRBRERSTEFCRUwKKworCVJUTV9HRVREQ0IgPSA3OCwKKyNkZWZpbmUgUlRNX0dFVERDQiBSVE1fR0VURENCCisJUlRNX1NFVERDQiwKKyNkZWZpbmUgUlRNX1NFVERDQiBSVE1fU0VURENCCisKKwlSVE1fTkVXTkVUQ09ORiA9IDgwLAorI2RlZmluZSBSVE1fTkVXTkVUQ09ORiBSVE1fTkVXTkVUQ09ORgorCVJUTV9HRVRORVRDT05GID0gODIsCisjZGVmaW5lIFJUTV9HRVRORVRDT05GIFJUTV9HRVRORVRDT05GCisKKwlSVE1fTkVXTURCID0gODQsCisjZGVmaW5lIFJUTV9ORVdNREIgUlRNX05FV01EQgorCVJUTV9ERUxNREIgPSA4NSwKKyNkZWZpbmUgUlRNX0RFTE1EQiBSVE1fREVMTURCCisJUlRNX0dFVE1EQiA9IDg2LAorI2RlZmluZSBSVE1fR0VUTURCIFJUTV9HRVRNREIKKworCVJUTV9ORVdOU0lEID0gODgsCisjZGVmaW5lIFJUTV9ORVdOU0lEIFJUTV9ORVdOU0lECisJUlRNX0RFTE5TSUQgPSA4OSwKKyNkZWZpbmUgUlRNX0RFTE5TSUQgUlRNX0RFTE5TSUQKKwlSVE1fR0VUTlNJRCA9IDkwLAorI2RlZmluZSBSVE1fR0VUTlNJRCBSVE1fR0VUTlNJRAorCisJX19SVE1fTUFYLAorI2RlZmluZSBSVE1fTUFYCQkoKChfX1JUTV9NQVggKyAzKSAmIH4zKSAtIDEpCit9OworCisjZGVmaW5lIFJUTV9OUl9NU0dUWVBFUwkoUlRNX01BWCArIDEgLSBSVE1fQkFTRSkKKyNkZWZpbmUgUlRNX05SX0ZBTUlMSUVTCShSVE1fTlJfTVNHVFlQRVMgPj4gMikKKyNkZWZpbmUgUlRNX0ZBTShjbWQpCSgoKGNtZCkgLSBSVE1fQkFTRSkgPj4gMikKKworLyogCisgICBHZW5lcmljIHN0cnVjdHVyZSBmb3IgZW5jYXBzdWxhdGlvbiBvZiBvcHRpb25hbCByb3V0ZSBpbmZvcm1hdGlvbi4KKyAgIEl0IGlzIHJlbWluaXNjZW50IG9mIHNvY2thZGRyLCBidXQgd2l0aCBzYV9mYW1pbHkgcmVwbGFjZWQKKyAgIHdpdGggYXR0cmlidXRlIHR5cGUuCisgKi8KKworc3RydWN0IHJ0YXR0ciB7CisJdW5zaWduZWQgc2hvcnQJcnRhX2xlbjsKKwl1bnNpZ25lZCBzaG9ydAlydGFfdHlwZTsKK307CisKKy8qIE1hY3JvcyB0byBoYW5kbGUgcnRhdHRyaWJ1dGVzICovCisKKyNkZWZpbmUgUlRBX0FMSUdOVE8JNFUKKyNkZWZpbmUgUlRBX0FMSUdOKGxlbikgKCAoKGxlbikrUlRBX0FMSUdOVE8tMSkgJiB+KFJUQV9BTElHTlRPLTEpICkKKyNkZWZpbmUgUlRBX09LKHJ0YSxsZW4pICgobGVuKSA+PSAoaW50KXNpemVvZihzdHJ1Y3QgcnRhdHRyKSAmJiBcCisJCQkgKHJ0YSktPnJ0YV9sZW4gPj0gc2l6ZW9mKHN0cnVjdCBydGF0dHIpICYmIFwKKwkJCSAocnRhKS0+cnRhX2xlbiA8PSAobGVuKSkKKyNkZWZpbmUgUlRBX05FWFQocnRhLGF0dHJsZW4pCSgoYXR0cmxlbikgLT0gUlRBX0FMSUdOKChydGEpLT5ydGFfbGVuKSwgXAorCQkJCSAoc3RydWN0IHJ0YXR0ciopKCgoY2hhciopKHJ0YSkpICsgUlRBX0FMSUdOKChydGEpLT5ydGFfbGVuKSkpCisjZGVmaW5lIFJUQV9MRU5HVEgobGVuKQkoUlRBX0FMSUdOKHNpemVvZihzdHJ1Y3QgcnRhdHRyKSkgKyAobGVuKSkKKyNkZWZpbmUgUlRBX1NQQUNFKGxlbikJUlRBX0FMSUdOKFJUQV9MRU5HVEgobGVuKSkKKyNkZWZpbmUgUlRBX0RBVEEocnRhKSAgICgodm9pZCopKCgoY2hhciopKHJ0YSkpICsgUlRBX0xFTkdUSCgwKSkpCisjZGVmaW5lIFJUQV9QQVlMT0FEKHJ0YSkgKChpbnQpKChydGEpLT5ydGFfbGVuKSAtIFJUQV9MRU5HVEgoMCkpCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlEZWZpbml0aW9ucyB1c2VkIGluIHJvdXRpbmcgdGFibGUgYWRtaW5pc3RyYXRpb24uCisgKioqKi8KKworc3RydWN0IHJ0bXNnIHsKKwl1bnNpZ25lZCBjaGFyCQlydG1fZmFtaWx5OworCXVuc2lnbmVkIGNoYXIJCXJ0bV9kc3RfbGVuOworCXVuc2lnbmVkIGNoYXIJCXJ0bV9zcmNfbGVuOworCXVuc2lnbmVkIGNoYXIJCXJ0bV90b3M7CisKKwl1bnNpZ25lZCBjaGFyCQlydG1fdGFibGU7CS8qIFJvdXRpbmcgdGFibGUgaWQgKi8KKwl1bnNpZ25lZCBjaGFyCQlydG1fcHJvdG9jb2w7CS8qIFJvdXRpbmcgcHJvdG9jb2w7IHNlZSBiZWxvdwkqLworCXVuc2lnbmVkIGNoYXIJCXJ0bV9zY29wZTsJLyogU2VlIGJlbG93ICovCQorCXVuc2lnbmVkIGNoYXIJCXJ0bV90eXBlOwkvKiBTZWUgYmVsb3cJKi8KKworCXVuc2lnbmVkCQlydG1fZmxhZ3M7Cit9OworCisvKiBydG1fdHlwZSAqLworCitlbnVtIHsKKwlSVE5fVU5TUEVDLAorCVJUTl9VTklDQVNULAkJLyogR2F0ZXdheSBvciBkaXJlY3Qgcm91dGUJKi8KKwlSVE5fTE9DQUwsCQkvKiBBY2NlcHQgbG9jYWxseQkJKi8KKwlSVE5fQlJPQURDQVNULAkJLyogQWNjZXB0IGxvY2FsbHkgYXMgYnJvYWRjYXN0LAorCQkJCSAgIHNlbmQgYXMgYnJvYWRjYXN0ICovCisJUlROX0FOWUNBU1QsCQkvKiBBY2NlcHQgbG9jYWxseSBhcyBicm9hZGNhc3QsCisJCQkJICAgYnV0IHNlbmQgYXMgdW5pY2FzdCAqLworCVJUTl9NVUxUSUNBU1QsCQkvKiBNdWx0aWNhc3Qgcm91dGUJCSovCisJUlROX0JMQUNLSE9MRSwJCS8qIERyb3AJCQkJKi8KKwlSVE5fVU5SRUFDSEFCTEUsCS8qIERlc3RpbmF0aW9uIGlzIHVucmVhY2hhYmxlICAgKi8KKwlSVE5fUFJPSElCSVQsCQkvKiBBZG1pbmlzdHJhdGl2ZWx5IHByb2hpYml0ZWQJKi8KKwlSVE5fVEhST1csCQkvKiBOb3QgaW4gdGhpcyB0YWJsZQkJKi8KKwlSVE5fTkFULAkJLyogVHJhbnNsYXRlIHRoaXMgYWRkcmVzcwkqLworCVJUTl9YUkVTT0xWRSwJCS8qIFVzZSBleHRlcm5hbCByZXNvbHZlcgkqLworCV9fUlROX01BWAorfTsKKworI2RlZmluZSBSVE5fTUFYIChfX1JUTl9NQVggLSAxKQorCisKKy8qIHJ0bV9wcm90b2NvbCAqLworCisjZGVmaW5lIFJUUFJPVF9VTlNQRUMJMAorI2RlZmluZSBSVFBST1RfUkVESVJFQ1QJMQkvKiBSb3V0ZSBpbnN0YWxsZWQgYnkgSUNNUCByZWRpcmVjdHM7CisJCQkJICAgbm90IHVzZWQgYnkgY3VycmVudCBJUHY0ICovCisjZGVmaW5lIFJUUFJPVF9LRVJORUwJMgkvKiBSb3V0ZSBpbnN0YWxsZWQgYnkga2VybmVsCQkqLworI2RlZmluZSBSVFBST1RfQk9PVAkzCS8qIFJvdXRlIGluc3RhbGxlZCBkdXJpbmcgYm9vdAkJKi8KKyNkZWZpbmUgUlRQUk9UX1NUQVRJQwk0CS8qIFJvdXRlIGluc3RhbGxlZCBieSBhZG1pbmlzdHJhdG9yCSovCisKKy8qIFZhbHVlcyBvZiBwcm90b2NvbCA+PSBSVFBST1RfU1RBVElDIGFyZSBub3QgaW50ZXJwcmV0ZWQgYnkga2VybmVsOworICAgdGhleSBhcmUganVzdCBwYXNzZWQgZnJvbSB1c2VyIGFuZCBiYWNrIGFzIGlzLgorICAgSXQgd2lsbCBiZSB1c2VkIGJ5IGh5cG90aGV0aWNhbCBtdWx0aXBsZSByb3V0aW5nIGRhZW1vbnMuCisgICBOb3RlIHRoYXQgcHJvdG9jb2wgdmFsdWVzIHNob3VsZCBiZSBzdGFuZGFyZGl6ZWQgaW4gb3JkZXIgdG8KKyAgIGF2b2lkIGNvbmZsaWN0cy4KKyAqLworCisjZGVmaW5lIFJUUFJPVF9HQVRFRAk4CS8qIEFwcGFyZW50bHksIEdhdGVEICovCisjZGVmaW5lIFJUUFJPVF9SQQk5CS8qIFJESVNDL05EIHJvdXRlciBhZHZlcnRpc2VtZW50cyAqLworI2RlZmluZSBSVFBST1RfTVJUCTEwCS8qIE1lcml0IE1SVCAqLworI2RlZmluZSBSVFBST1RfWkVCUkEJMTEJLyogWmVicmEgKi8KKyNkZWZpbmUgUlRQUk9UX0JJUkQJMTIJLyogQklSRCAqLworI2RlZmluZSBSVFBST1RfRE5ST1VURUQJMTMJLyogREVDbmV0IHJvdXRpbmcgZGFlbW9uICovCisjZGVmaW5lIFJUUFJPVF9YT1JQCTE0CS8qIFhPUlAgKi8KKyNkZWZpbmUgUlRQUk9UX05USwkxNQkvKiBOZXRzdWt1a3UgKi8KKyNkZWZpbmUgUlRQUk9UX0RIQ1AJMTYgICAgICAvKiBESENQIGNsaWVudCAqLworI2RlZmluZSBSVFBST1RfTVJPVVRFRAkxNyAgICAgIC8qIE11bHRpY2FzdCBkYWVtb24gKi8KKyNkZWZpbmUgUlRQUk9UX0JBQkVMCTQyICAgICAgLyogQmFiZWwgZGFlbW9uICovCisKKy8qIHJ0bV9zY29wZQorCisgICBSZWFsbHkgaXQgaXMgbm90IHNjb3BlLCBidXQgc29ydCBvZiBkaXN0YW5jZSB0byB0aGUgZGVzdGluYXRpb24uCisgICBOT1dIRVJFIGFyZSByZXNlcnZlZCBmb3Igbm90IGV4aXN0aW5nIGRlc3RpbmF0aW9ucywgSE9TVCBpcyBvdXIKKyAgIGxvY2FsIGFkZHJlc3NlcywgTElOSyBhcmUgZGVzdGluYXRpb25zLCBsb2NhdGVkIG9uIGRpcmVjdGx5IGF0dGFjaGVkCisgICBsaW5rIGFuZCBVTklWRVJTRSBpcyBldmVyeXdoZXJlIGluIHRoZSBVbml2ZXJzZS4KKworICAgSW50ZXJtZWRpYXRlIHZhbHVlcyBhcmUgYWxzbyBwb3NzaWJsZSBmLmUuIGludGVyaW9yIHJvdXRlcworICAgY291bGQgYmUgYXNzaWduZWQgYSB2YWx1ZSBiZXR3ZWVuIFVOSVZFUlNFIGFuZCBMSU5LLgorKi8KKworZW51bSBydF9zY29wZV90IHsKKwlSVF9TQ09QRV9VTklWRVJTRT0wLAorLyogVXNlciBkZWZpbmVkIHZhbHVlcyAgKi8KKwlSVF9TQ09QRV9TSVRFPTIwMCwKKwlSVF9TQ09QRV9MSU5LPTI1MywKKwlSVF9TQ09QRV9IT1NUPTI1NCwKKwlSVF9TQ09QRV9OT1dIRVJFPTI1NQorfTsKKworLyogcnRtX2ZsYWdzICovCisKKyNkZWZpbmUgUlRNX0ZfTk9USUZZCQkweDEwMAkvKiBOb3RpZnkgdXNlciBvZiByb3V0ZSBjaGFuZ2UJKi8KKyNkZWZpbmUgUlRNX0ZfQ0xPTkVECQkweDIwMAkvKiBUaGlzIHJvdXRlIGlzIGNsb25lZAkJKi8KKyNkZWZpbmUgUlRNX0ZfRVFVQUxJWkUJCTB4NDAwCS8qIE11bHRpcGF0aCBlcXVhbGl6ZXI6IE5JCSovCisjZGVmaW5lIFJUTV9GX1BSRUZJWAkJMHg4MDAJLyogUHJlZml4IGFkZHJlc3NlcwkJKi8KKyNkZWZpbmUgUlRNX0ZfTE9PS1VQX1RBQkxFCTB4MTAwMAkvKiBzZXQgcnRtX3RhYmxlIHRvIEZJQiBsb29rdXAgcmVzdWx0ICovCisKKy8qIFJlc2VydmVkIHRhYmxlIGlkZW50aWZpZXJzICovCisKK2VudW0gcnRfY2xhc3NfdCB7CisJUlRfVEFCTEVfVU5TUEVDPTAsCisvKiBVc2VyIGRlZmluZWQgdmFsdWVzICovCisJUlRfVEFCTEVfQ09NUEFUPTI1MiwKKwlSVF9UQUJMRV9ERUZBVUxUPTI1MywKKwlSVF9UQUJMRV9NQUlOPTI1NCwKKwlSVF9UQUJMRV9MT0NBTD0yNTUsCisJUlRfVEFCTEVfTUFYPTB4RkZGRkZGRkYKK307CisKKworLyogUm91dGluZyBtZXNzYWdlIGF0dHJpYnV0ZXMgKi8KKworZW51bSBydGF0dHJfdHlwZV90IHsKKwlSVEFfVU5TUEVDLAorCVJUQV9EU1QsCisJUlRBX1NSQywKKwlSVEFfSUlGLAorCVJUQV9PSUYsCisJUlRBX0dBVEVXQVksCisJUlRBX1BSSU9SSVRZLAorCVJUQV9QUkVGU1JDLAorCVJUQV9NRVRSSUNTLAorCVJUQV9NVUxUSVBBVEgsCisJUlRBX1BST1RPSU5GTywgLyogbm8gbG9uZ2VyIHVzZWQgKi8KKwlSVEFfRkxPVywKKwlSVEFfQ0FDSEVJTkZPLAorCVJUQV9TRVNTSU9OLCAvKiBubyBsb25nZXIgdXNlZCAqLworCVJUQV9NUF9BTEdPLCAvKiBubyBsb25nZXIgdXNlZCAqLworCVJUQV9UQUJMRSwKKwlSVEFfTUFSSywKKwlSVEFfTUZDX1NUQVRTLCAvKiBub3QgdXNlZCAtIGJhY2twb3J0ZWQgZnJvbSB0aGUgZnV0dXJlICovCisJUlRBX1VJRCwKKwlSVEFfVklBLAorCVJUQV9ORVdEU1QsCisJUlRBX1BSRUYsCisJUlRBX0VOQ0FQX1RZUEUsCisJUlRBX0VOQ0FQLAorCVJUQV9FWFBJUkVTLAorCV9fUlRBX01BWAorfTsKKworI2RlZmluZSBSVEFfTUFYIChfX1JUQV9NQVggLSAxKQorCisjZGVmaW5lIFJUTV9SVEEocikgICgoc3RydWN0IHJ0YXR0ciopKCgoY2hhciopKHIpKSArIE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgcnRtc2cpKSkpCisjZGVmaW5lIFJUTV9QQVlMT0FEKG4pIE5MTVNHX1BBWUxPQUQobixzaXplb2Yoc3RydWN0IHJ0bXNnKSkKKworLyogUlRNX01VTFRJUEFUSCAtLS0gYXJyYXkgb2Ygc3RydWN0IHJ0bmV4dGhvcC4KKyAqCisgKiAic3RydWN0IHJ0bmV4dGhvcCIgZGVzY3JpYmVzIGFsbCBuZWNlc3NhcnkgbmV4dGhvcCBpbmZvcm1hdGlvbiwKKyAqIGkuZS4gcGFyYW1ldGVycyBvZiBwYXRoIHRvIGEgZGVzdGluYXRpb24gdmlhIHRoaXMgbmV4dGhvcC4KKyAqCisgKiBBdCB0aGUgbW9tZW50IGl0IGlzIGltcG9zc2libGUgdG8gc2V0IGRpZmZlcmVudCBwcmVmc3JjLCBtdHUsIHdpbmRvdworICogYW5kIHJ0dCBmb3IgZGlmZmVyZW50IHBhdGhzIGZyb20gbXVsdGlwYXRoLgorICovCisKK3N0cnVjdCBydG5leHRob3AgeworCXVuc2lnbmVkIHNob3J0CQlydG5oX2xlbjsKKwl1bnNpZ25lZCBjaGFyCQlydG5oX2ZsYWdzOworCXVuc2lnbmVkIGNoYXIJCXJ0bmhfaG9wczsKKwlpbnQJCQlydG5oX2lmaW5kZXg7Cit9OworCisvKiBydG5oX2ZsYWdzICovCisKKyNkZWZpbmUgUlROSF9GX0RFQUQJCTEJLyogTmV4dGhvcCBpcyBkZWFkICh1c2VkIGJ5IG11bHRpcGF0aCkJKi8KKyNkZWZpbmUgUlROSF9GX1BFUlZBU0lWRQkyCS8qIERvIHJlY3Vyc2l2ZSBnYXRld2F5IGxvb2t1cAkqLworI2RlZmluZSBSVE5IX0ZfT05MSU5LCQk0CS8qIEdhdGV3YXkgaXMgZm9yY2VkIG9uIGxpbmsJKi8KKyNkZWZpbmUgUlROSF9GX09GRkxPQUQJCTgJLyogb2ZmbG9hZGVkIHJvdXRlICovCisjZGVmaW5lIFJUTkhfRl9MSU5LRE9XTgkJMTYJLyogY2Fycmllci1kb3duIG9uIG5leHRob3AgKi8KKworI2RlZmluZSBSVE5IX0NPTVBBUkVfTUFTSwkoUlROSF9GX0RFQUQgfCBSVE5IX0ZfTElOS0RPV04pCisKKy8qIE1hY3JvcyB0byBoYW5kbGUgaGV4dGhvcHMgKi8KKworI2RlZmluZSBSVE5IX0FMSUdOVE8JNAorI2RlZmluZSBSVE5IX0FMSUdOKGxlbikgKCAoKGxlbikrUlROSF9BTElHTlRPLTEpICYgfihSVE5IX0FMSUdOVE8tMSkgKQorI2RlZmluZSBSVE5IX09LKHJ0bmgsbGVuKSAoKHJ0bmgpLT5ydG5oX2xlbiA+PSBzaXplb2Yoc3RydWN0IHJ0bmV4dGhvcCkgJiYgXAorCQkJICAgKChpbnQpKHJ0bmgpLT5ydG5oX2xlbikgPD0gKGxlbikpCisjZGVmaW5lIFJUTkhfTkVYVChydG5oKQkoKHN0cnVjdCBydG5leHRob3AqKSgoKGNoYXIqKShydG5oKSkgKyBSVE5IX0FMSUdOKChydG5oKS0+cnRuaF9sZW4pKSkKKyNkZWZpbmUgUlROSF9MRU5HVEgobGVuKSAoUlROSF9BTElHTihzaXplb2Yoc3RydWN0IHJ0bmV4dGhvcCkpICsgKGxlbikpCisjZGVmaW5lIFJUTkhfU1BBQ0UobGVuKQlSVE5IX0FMSUdOKFJUTkhfTEVOR1RIKGxlbikpCisjZGVmaW5lIFJUTkhfREFUQShydG5oKSAgICgoc3RydWN0IHJ0YXR0ciopKCgoY2hhciopKHJ0bmgpKSArIFJUTkhfTEVOR1RIKDApKSkKKworLyogUlRBX1ZJQSAqLworc3RydWN0IHJ0dmlhIHsKKwlfX2tlcm5lbF9zYV9mYW1pbHlfdAlydHZpYV9mYW1pbHk7CisJX191OAkJCXJ0dmlhX2FkZHJbMF07Cit9OworCisvKiBSVE1fQ0FDSEVJTkZPICovCisKK3N0cnVjdCBydGFfY2FjaGVpbmZvIHsKKwlfX3UzMglydGFfY2xudHJlZjsKKwlfX3UzMglydGFfbGFzdHVzZTsKKwlfX3MzMglydGFfZXhwaXJlczsKKwlfX3UzMglydGFfZXJyb3I7CisJX191MzIJcnRhX3VzZWQ7CisKKyNkZWZpbmUgUlRORVRMSU5LX0hBVkVfUEVFUklORk8gMQorCV9fdTMyCXJ0YV9pZDsKKwlfX3UzMglydGFfdHM7CisJX191MzIJcnRhX3RzYWdlOworfTsKKworLyogUlRNX01FVFJJQ1MgLS0tIGFycmF5IG9mIHN0cnVjdCBydGF0dHIgd2l0aCB0eXBlcyBvZiBSVEFYXyogKi8KKworZW51bSB7CisJUlRBWF9VTlNQRUMsCisjZGVmaW5lIFJUQVhfVU5TUEVDIFJUQVhfVU5TUEVDCisJUlRBWF9MT0NLLAorI2RlZmluZSBSVEFYX0xPQ0sgUlRBWF9MT0NLCisJUlRBWF9NVFUsCisjZGVmaW5lIFJUQVhfTVRVIFJUQVhfTVRVCisJUlRBWF9XSU5ET1csCisjZGVmaW5lIFJUQVhfV0lORE9XIFJUQVhfV0lORE9XCisJUlRBWF9SVFQsCisjZGVmaW5lIFJUQVhfUlRUIFJUQVhfUlRUCisJUlRBWF9SVFRWQVIsCisjZGVmaW5lIFJUQVhfUlRUVkFSIFJUQVhfUlRUVkFSCisJUlRBWF9TU1RIUkVTSCwKKyNkZWZpbmUgUlRBWF9TU1RIUkVTSCBSVEFYX1NTVEhSRVNICisJUlRBWF9DV05ELAorI2RlZmluZSBSVEFYX0NXTkQgUlRBWF9DV05ECisJUlRBWF9BRFZNU1MsCisjZGVmaW5lIFJUQVhfQURWTVNTIFJUQVhfQURWTVNTCisJUlRBWF9SRU9SREVSSU5HLAorI2RlZmluZSBSVEFYX1JFT1JERVJJTkcgUlRBWF9SRU9SREVSSU5HCisJUlRBWF9IT1BMSU1JVCwKKyNkZWZpbmUgUlRBWF9IT1BMSU1JVCBSVEFYX0hPUExJTUlUCisJUlRBWF9JTklUQ1dORCwKKyNkZWZpbmUgUlRBWF9JTklUQ1dORCBSVEFYX0lOSVRDV05ECisJUlRBWF9GRUFUVVJFUywKKyNkZWZpbmUgUlRBWF9GRUFUVVJFUyBSVEFYX0ZFQVRVUkVTCisJUlRBWF9SVE9fTUlOLAorI2RlZmluZSBSVEFYX1JUT19NSU4gUlRBWF9SVE9fTUlOCisJUlRBWF9JTklUUldORCwKKyNkZWZpbmUgUlRBWF9JTklUUldORCBSVEFYX0lOSVRSV05ECisJUlRBWF9RVUlDS0FDSywKKyNkZWZpbmUgUlRBWF9RVUlDS0FDSyBSVEFYX1FVSUNLQUNLCisJUlRBWF9DQ19BTEdPLAorI2RlZmluZSBSVEFYX0NDX0FMR08gUlRBWF9DQ19BTEdPCisJX19SVEFYX01BWAorfTsKKworI2RlZmluZSBSVEFYX01BWCAoX19SVEFYX01BWCAtIDEpCisKKyNkZWZpbmUgUlRBWF9GRUFUVVJFX0VDTgkoMSA8PCAwKQorI2RlZmluZSBSVEFYX0ZFQVRVUkVfU0FDSwkoMSA8PCAxKQorI2RlZmluZSBSVEFYX0ZFQVRVUkVfVElNRVNUQU1QCSgxIDw8IDIpCisjZGVmaW5lIFJUQVhfRkVBVFVSRV9BTExGUkFHCSgxIDw8IDMpCisKKyNkZWZpbmUgUlRBWF9GRUFUVVJFX01BU0sJKFJUQVhfRkVBVFVSRV9FQ04gfCBSVEFYX0ZFQVRVUkVfU0FDSyB8IFwKKwkJCQkgUlRBWF9GRUFUVVJFX1RJTUVTVEFNUCB8IFJUQVhfRkVBVFVSRV9BTExGUkFHKQorCitzdHJ1Y3QgcnRhX3Nlc3Npb24geworCV9fdTgJcHJvdG87CisJX191OAlwYWQxOworCV9fdTE2CXBhZDI7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX3UxNglzcG9ydDsKKwkJCV9fdTE2CWRwb3J0OworCQl9IHBvcnRzOworCisJCXN0cnVjdCB7CisJCQlfX3U4CXR5cGU7CisJCQlfX3U4CWNvZGU7CisJCQlfX3UxNglpZGVudDsKKwkJfSBpY21wdDsKKworCQlfX3UzMgkJc3BpOworCX0gdTsKK307CisKK3N0cnVjdCBydGFfbWZjX3N0YXRzIHsKKwlfX3U2NAltZmNzX3BhY2tldHM7CisJX191NjQJbWZjc19ieXRlczsKKwlfX3U2NAltZmNzX3dyb25nX2lmOworfTsKKworLyoqKioKKyAqCQlHZW5lcmFsIGZvcm0gb2YgYWRkcmVzcyBmYW1pbHkgZGVwZW5kZW50IG1lc3NhZ2UuCisgKioqKi8KKworc3RydWN0IHJ0Z2VubXNnIHsKKwl1bnNpZ25lZCBjaGFyCQlydGdlbl9mYW1pbHk7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlMaW5rIGxheWVyIHNwZWNpZmljIG1lc3NhZ2VzLgorICoqKiovCisKKy8qIHN0cnVjdCBpZmluZm9tc2cKKyAqIHBhc3NlcyBsaW5rIGxldmVsIHNwZWNpZmljIGluZm9ybWF0aW9uLCBub3QgZGVwZW5kZW50CisgKiBvbiBuZXR3b3JrIHByb3RvY29sLgorICovCisKK3N0cnVjdCBpZmluZm9tc2cgeworCXVuc2lnbmVkIGNoYXIJaWZpX2ZhbWlseTsKKwl1bnNpZ25lZCBjaGFyCV9faWZpX3BhZDsKKwl1bnNpZ25lZCBzaG9ydAlpZmlfdHlwZTsJCS8qIEFSUEhSRF8qICovCisJaW50CQlpZmlfaW5kZXg7CQkvKiBMaW5rIGluZGV4CSovCisJdW5zaWduZWQJaWZpX2ZsYWdzOwkJLyogSUZGXyogZmxhZ3MJKi8KKwl1bnNpZ25lZAlpZmlfY2hhbmdlOwkJLyogSUZGXyogY2hhbmdlIG1hc2sgKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCXByZWZpeCBpbmZvcm1hdGlvbiAKKyAqKioqLworCitzdHJ1Y3QgcHJlZml4bXNnIHsKKwl1bnNpZ25lZCBjaGFyCXByZWZpeF9mYW1pbHk7CisJdW5zaWduZWQgY2hhcglwcmVmaXhfcGFkMTsKKwl1bnNpZ25lZCBzaG9ydAlwcmVmaXhfcGFkMjsKKwlpbnQJCXByZWZpeF9pZmluZGV4OworCXVuc2lnbmVkIGNoYXIJcHJlZml4X3R5cGU7CisJdW5zaWduZWQgY2hhcglwcmVmaXhfbGVuOworCXVuc2lnbmVkIGNoYXIJcHJlZml4X2ZsYWdzOworCXVuc2lnbmVkIGNoYXIJcHJlZml4X3BhZDM7Cit9OworCitlbnVtIAoreworCVBSRUZJWF9VTlNQRUMsCisJUFJFRklYX0FERFJFU1MsCisJUFJFRklYX0NBQ0hFSU5GTywKKwlfX1BSRUZJWF9NQVgKK307CisKKyNkZWZpbmUgUFJFRklYX01BWAkoX19QUkVGSVhfTUFYIC0gMSkKKworc3RydWN0IHByZWZpeF9jYWNoZWluZm8geworCV9fdTMyCXByZWZlcnJlZF90aW1lOworCV9fdTMyCXZhbGlkX3RpbWU7Cit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCVRyYWZmaWMgY29udHJvbCBtZXNzYWdlcy4KKyAqKioqLworCitzdHJ1Y3QgdGNtc2cgeworCXVuc2lnbmVkIGNoYXIJdGNtX2ZhbWlseTsKKwl1bnNpZ25lZCBjaGFyCXRjbV9fcGFkMTsKKwl1bnNpZ25lZCBzaG9ydAl0Y21fX3BhZDI7CisJaW50CQl0Y21faWZpbmRleDsKKwlfX3UzMgkJdGNtX2hhbmRsZTsKKwlfX3UzMgkJdGNtX3BhcmVudDsKKwlfX3UzMgkJdGNtX2luZm87Cit9OworCitlbnVtIHsKKwlUQ0FfVU5TUEVDLAorCVRDQV9LSU5ELAorCVRDQV9PUFRJT05TLAorCVRDQV9TVEFUUywKKwlUQ0FfWFNUQVRTLAorCVRDQV9SQVRFLAorCVRDQV9GQ05ULAorCVRDQV9TVEFUUzIsCisJVENBX1NUQUIsCisJX19UQ0FfTUFYCit9OworCisjZGVmaW5lIFRDQV9NQVggKF9fVENBX01BWCAtIDEpCisKKyNkZWZpbmUgVENBX1JUQShyKSAgKChzdHJ1Y3QgcnRhdHRyKikoKChjaGFyKikocikpICsgTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCB0Y21zZykpKSkKKyNkZWZpbmUgVENBX1BBWUxPQUQobikgTkxNU0dfUEFZTE9BRChuLHNpemVvZihzdHJ1Y3QgdGNtc2cpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlOZWlnaGJvciBEaXNjb3ZlcnkgdXNlcmxhbmQgb3B0aW9ucworICoqKiovCisKK3N0cnVjdCBuZHVzZXJvcHRtc2cgeworCXVuc2lnbmVkIGNoYXIJbmR1c2Vyb3B0X2ZhbWlseTsKKwl1bnNpZ25lZCBjaGFyCW5kdXNlcm9wdF9wYWQxOworCXVuc2lnbmVkIHNob3J0CW5kdXNlcm9wdF9vcHRzX2xlbjsJLyogVG90YWwgbGVuZ3RoIG9mIG9wdGlvbnMgKi8KKwlpbnQJCW5kdXNlcm9wdF9pZmluZGV4OworCV9fdTgJCW5kdXNlcm9wdF9pY21wX3R5cGU7CisJX191OAkJbmR1c2Vyb3B0X2ljbXBfY29kZTsKKwl1bnNpZ25lZCBzaG9ydAluZHVzZXJvcHRfcGFkMjsKKwl1bnNpZ25lZCBpbnQJbmR1c2Vyb3B0X3BhZDM7CisJLyogRm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgTkQgb3B0aW9ucyAqLworfTsKKworZW51bSB7CisJTkRVU0VST1BUX1VOU1BFQywKKwlORFVTRVJPUFRfU1JDQUREUiwKKwlfX05EVVNFUk9QVF9NQVgKK307CisKKyNkZWZpbmUgTkRVU0VST1BUX01BWAkoX19ORFVTRVJPUFRfTUFYIC0gMSkKKworLyogUlRuZXRsaW5rIG11bHRpY2FzdCBncm91cHMgLSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgdXNlcnNwYWNlICovCisjZGVmaW5lIFJUTUdSUF9MSU5LCQkxCisjZGVmaW5lIFJUTUdSUF9OT1RJRlkJCTIKKyNkZWZpbmUgUlRNR1JQX05FSUdICQk0CisjZGVmaW5lIFJUTUdSUF9UQwkJOAorCisjZGVmaW5lIFJUTUdSUF9JUFY0X0lGQUREUgkweDEwCisjZGVmaW5lIFJUTUdSUF9JUFY0X01ST1VURQkweDIwCisjZGVmaW5lIFJUTUdSUF9JUFY0X1JPVVRFCTB4NDAKKyNkZWZpbmUgUlRNR1JQX0lQVjRfUlVMRQkweDgwCisKKyNkZWZpbmUgUlRNR1JQX0lQVjZfSUZBRERSCTB4MTAwCisjZGVmaW5lIFJUTUdSUF9JUFY2X01ST1VURQkweDIwMAorI2RlZmluZSBSVE1HUlBfSVBWNl9ST1VURQkweDQwMAorI2RlZmluZSBSVE1HUlBfSVBWNl9JRklORk8JMHg4MDAKKworI2RlZmluZSBSVE1HUlBfREVDbmV0X0lGQUREUiAgICAweDEwMDAKKyNkZWZpbmUgUlRNR1JQX0RFQ25ldF9ST1VURSAgICAgMHg0MDAwCisKKyNkZWZpbmUgUlRNR1JQX0lQVjZfUFJFRklYCTB4MjAwMDAKKworLyogUlRuZXRsaW5rIG11bHRpY2FzdCBncm91cHMgKi8KK2VudW0gcnRuZXRsaW5rX2dyb3VwcyB7CisJUlROTEdSUF9OT05FLAorI2RlZmluZSBSVE5MR1JQX05PTkUJCVJUTkxHUlBfTk9ORQorCVJUTkxHUlBfTElOSywKKyNkZWZpbmUgUlROTEdSUF9MSU5LCQlSVE5MR1JQX0xJTksKKwlSVE5MR1JQX05PVElGWSwKKyNkZWZpbmUgUlROTEdSUF9OT1RJRlkJCVJUTkxHUlBfTk9USUZZCisJUlROTEdSUF9ORUlHSCwKKyNkZWZpbmUgUlROTEdSUF9ORUlHSAkJUlROTEdSUF9ORUlHSAorCVJUTkxHUlBfVEMsCisjZGVmaW5lIFJUTkxHUlBfVEMJCVJUTkxHUlBfVEMKKwlSVE5MR1JQX0lQVjRfSUZBRERSLAorI2RlZmluZSBSVE5MR1JQX0lQVjRfSUZBRERSCVJUTkxHUlBfSVBWNF9JRkFERFIKKwlSVE5MR1JQX0lQVjRfTVJPVVRFLAorI2RlZmluZQlSVE5MR1JQX0lQVjRfTVJPVVRFCVJUTkxHUlBfSVBWNF9NUk9VVEUKKwlSVE5MR1JQX0lQVjRfUk9VVEUsCisjZGVmaW5lIFJUTkxHUlBfSVBWNF9ST1VURQlSVE5MR1JQX0lQVjRfUk9VVEUKKwlSVE5MR1JQX0lQVjRfUlVMRSwKKyNkZWZpbmUgUlROTEdSUF9JUFY0X1JVTEUJUlROTEdSUF9JUFY0X1JVTEUKKwlSVE5MR1JQX0lQVjZfSUZBRERSLAorI2RlZmluZSBSVE5MR1JQX0lQVjZfSUZBRERSCVJUTkxHUlBfSVBWNl9JRkFERFIKKwlSVE5MR1JQX0lQVjZfTVJPVVRFLAorI2RlZmluZSBSVE5MR1JQX0lQVjZfTVJPVVRFCVJUTkxHUlBfSVBWNl9NUk9VVEUKKwlSVE5MR1JQX0lQVjZfUk9VVEUsCisjZGVmaW5lIFJUTkxHUlBfSVBWNl9ST1VURQlSVE5MR1JQX0lQVjZfUk9VVEUKKwlSVE5MR1JQX0lQVjZfSUZJTkZPLAorI2RlZmluZSBSVE5MR1JQX0lQVjZfSUZJTkZPCVJUTkxHUlBfSVBWNl9JRklORk8KKwlSVE5MR1JQX0RFQ25ldF9JRkFERFIsCisjZGVmaW5lIFJUTkxHUlBfREVDbmV0X0lGQUREUglSVE5MR1JQX0RFQ25ldF9JRkFERFIKKwlSVE5MR1JQX05PUDIsCisJUlROTEdSUF9ERUNuZXRfUk9VVEUsCisjZGVmaW5lIFJUTkxHUlBfREVDbmV0X1JPVVRFCVJUTkxHUlBfREVDbmV0X1JPVVRFCisJUlROTEdSUF9ERUNuZXRfUlVMRSwKKyNkZWZpbmUgUlROTEdSUF9ERUNuZXRfUlVMRQlSVE5MR1JQX0RFQ25ldF9SVUxFCisJUlROTEdSUF9OT1A0LAorCVJUTkxHUlBfSVBWNl9QUkVGSVgsCisjZGVmaW5lIFJUTkxHUlBfSVBWNl9QUkVGSVgJUlROTEdSUF9JUFY2X1BSRUZJWAorCVJUTkxHUlBfSVBWNl9SVUxFLAorI2RlZmluZSBSVE5MR1JQX0lQVjZfUlVMRQlSVE5MR1JQX0lQVjZfUlVMRQorCVJUTkxHUlBfTkRfVVNFUk9QVCwKKyNkZWZpbmUgUlROTEdSUF9ORF9VU0VST1BUCVJUTkxHUlBfTkRfVVNFUk9QVAorCVJUTkxHUlBfUEhPTkVUX0lGQUREUiwKKyNkZWZpbmUgUlROTEdSUF9QSE9ORVRfSUZBRERSCVJUTkxHUlBfUEhPTkVUX0lGQUREUgorCVJUTkxHUlBfUEhPTkVUX1JPVVRFLAorI2RlZmluZSBSVE5MR1JQX1BIT05FVF9ST1VURQlSVE5MR1JQX1BIT05FVF9ST1VURQorCVJUTkxHUlBfRENCLAorI2RlZmluZSBSVE5MR1JQX0RDQgkJUlROTEdSUF9EQ0IKKwlSVE5MR1JQX0lQVjRfTkVUQ09ORiwKKyNkZWZpbmUgUlROTEdSUF9JUFY0X05FVENPTkYJUlROTEdSUF9JUFY0X05FVENPTkYKKwlSVE5MR1JQX0lQVjZfTkVUQ09ORiwKKyNkZWZpbmUgUlROTEdSUF9JUFY2X05FVENPTkYJUlROTEdSUF9JUFY2X05FVENPTkYKKwlSVE5MR1JQX01EQiwKKyNkZWZpbmUgUlROTEdSUF9NREIJCVJUTkxHUlBfTURCCisJUlROTEdSUF9NUExTX1JPVVRFLAorI2RlZmluZSBSVE5MR1JQX01QTFNfUk9VVEUJUlROTEdSUF9NUExTX1JPVVRFCisJUlROTEdSUF9OU0lELAorI2RlZmluZSBSVE5MR1JQX05TSUQJCVJUTkxHUlBfTlNJRAorCV9fUlROTEdSUF9NQVgKK307CisjZGVmaW5lIFJUTkxHUlBfTUFYCShfX1JUTkxHUlBfTUFYIC0gMSkKKworLyogVEMgYWN0aW9uIHBpZWNlICovCitzdHJ1Y3QgdGNhbXNnIHsKKwl1bnNpZ25lZCBjaGFyCXRjYV9mYW1pbHk7CisJdW5zaWduZWQgY2hhcgl0Y2FfX3BhZDE7CisJdW5zaWduZWQgc2hvcnQJdGNhX19wYWQyOworfTsKKyNkZWZpbmUgVEFfUlRBKHIpICAoKHN0cnVjdCBydGF0dHIqKSgoKGNoYXIqKShyKSkgKyBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IHRjYW1zZykpKSkKKyNkZWZpbmUgVEFfUEFZTE9BRChuKSBOTE1TR19QQVlMT0FEKG4sc2l6ZW9mKHN0cnVjdCB0Y2Ftc2cpKQorI2RlZmluZSBUQ0FfQUNUX1RBQiAxIC8qIGF0dHIgdHlwZSBtdXN0IGJlID49MSAqLwkKKyNkZWZpbmUgVENBQV9NQVggMQorCisvKiBOZXcgZXh0ZW5kZWQgaW5mbyBmaWx0ZXJzIGZvciBJRkxBX0VYVF9NQVNLICovCisjZGVmaW5lIFJURVhUX0ZJTFRFUl9WRgkJKDEgPDwgMCkKKyNkZWZpbmUgUlRFWFRfRklMVEVSX0JSVkxBTgkoMSA8PCAxKQorI2RlZmluZSBSVEVYVF9GSUxURVJfQlJWTEFOX0NPTVBSRVNTRUQJKDEgPDwgMikKKyNkZWZpbmUJUlRFWFRfRklMVEVSX1NLSVBfU1RBVFMJKDEgPDwgMykKKworLyogRW5kIG9mIGluZm9ybWF0aW9uIGV4cG9ydGVkIHRvIHVzZXIgbGV2ZWwgKi8KKworCisKKyNlbmRpZiAvKiBfX0xJTlVYX1JUTkVUTElOS19IICovCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3NvY2tfZGlhZy5oIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9zb2NrX2RpYWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWZjYjg5Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC9zb2NrX2RpYWcuaApAQCAtMCwwICsxLDM3IEBACisjaWZuZGVmIF9fU09DS19ESUFHX0hfXworI2RlZmluZSBfX1NPQ0tfRElBR19IX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgU09DS19ESUFHX0JZX0ZBTUlMWSAyMAorI2RlZmluZSBTT0NLX0RFU1RST1kgMjEKKworc3RydWN0IHNvY2tfZGlhZ19yZXEgeworCV9fdTgJc2RpYWdfZmFtaWx5OworCV9fdTgJc2RpYWdfcHJvdG9jb2w7Cit9OworCitlbnVtIHsKKwlTS19NRU1JTkZPX1JNRU1fQUxMT0MsCisJU0tfTUVNSU5GT19SQ1ZCVUYsCisJU0tfTUVNSU5GT19XTUVNX0FMTE9DLAorCVNLX01FTUlORk9fU05EQlVGLAorCVNLX01FTUlORk9fRldEX0FMTE9DLAorCVNLX01FTUlORk9fV01FTV9RVUVVRUQsCisJU0tfTUVNSU5GT19PUFRNRU0sCisJU0tfTUVNSU5GT19CQUNLTE9HLAorCisJU0tfTUVNSU5GT19WQVJTLAorfTsKKworZW51bSBza25ldGxpbmtfZ3JvdXBzIHsKKwlTS05MR1JQX05PTkUsCisJU0tOTEdSUF9JTkVUX1RDUF9ERVNUUk9ZLAorCVNLTkxHUlBfSU5FVF9VRFBfREVTVFJPWSwKKwlTS05MR1JQX0lORVQ2X1RDUF9ERVNUUk9ZLAorCVNLTkxHUlBfSU5FVDZfVURQX0RFU1RST1ksCisJX19TS05MR1JQX01BWCwKK307CisjZGVmaW5lIFNLTkxHUlBfTUFYCShfX1NLTkxHUlBfTUFYIC0gMSkKKworI2VuZGlmIC8qIF9fU09DS19ESUFHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saW51eC90Y19hY3QvdGNfYnBmLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19icGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2YxN2NjCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC90Y19hY3QvdGNfYnBmLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBKaXJpIFBpcmtvIDxqaXJpQHJlc251bGxpLnVzPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1RDX0JQRl9ICisjZGVmaW5lIF9fTElOVVhfVENfQlBGX0gKKworI2luY2x1ZGUgPGxpbnV4L3BrdF9jbHMuaD4KKworI2RlZmluZSBUQ0FfQUNUX0JQRiAxMworCitzdHJ1Y3QgdGNfYWN0X2JwZiB7CisJdGNfZ2VuOworfTsKKworZW51bSB7CisJVENBX0FDVF9CUEZfVU5TUEVDLAorCVRDQV9BQ1RfQlBGX1RNLAorCVRDQV9BQ1RfQlBGX1BBUk1TLAorCVRDQV9BQ1RfQlBGX09QU19MRU4sCisJVENBX0FDVF9CUEZfT1BTLAorCVRDQV9BQ1RfQlBGX0ZELAorCVRDQV9BQ1RfQlBGX05BTUUsCisJX19UQ0FfQUNUX0JQRl9NQVgsCit9OworI2RlZmluZSBUQ0FfQUNUX0JQRl9NQVggKF9fVENBX0FDVF9CUEZfTUFYIC0gMSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19jb25ubWFyay5oIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC90Y19hY3QvdGNfY29ubm1hcmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTRiMDk3Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC90Y19hY3QvdGNfY29ubm1hcmsuaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9fVUFQSV9UQ19DT05OTUFSS19ICisjZGVmaW5lIF9fVUFQSV9UQ19DT05OTUFSS19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BrdF9jbHMuaD4KKworI2RlZmluZSBUQ0FfQUNUX0NPTk5NQVJLIDE0CisKK3N0cnVjdCB0Y19jb25ubWFyayB7CisJdGNfZ2VuOworCV9fdTE2IHpvbmU7Cit9OworCitlbnVtIHsKKwlUQ0FfQ09OTk1BUktfVU5TUEVDLAorCVRDQV9DT05OTUFSS19QQVJNUywKKwlUQ0FfQ09OTk1BUktfVE0sCisJX19UQ0FfQ09OTk1BUktfTUFYCit9OworI2RlZmluZSBUQ0FfQ09OTk1BUktfTUFYIChfX1RDQV9DT05OTUFSS19NQVggLSAxKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX2NzdW0uaCBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX2NzdW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDQ3YzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC90Y19hY3QvdGNfY3N1bS5oCkBAIC0wLDAgKzEsMzIgQEAKKyNpZm5kZWYgX19MSU5VWF9UQ19DU1VNX0gKKyNkZWZpbmUgX19MSU5VWF9UQ19DU1VNX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPgorCisjZGVmaW5lIFRDQV9BQ1RfQ1NVTSAxNgorCitlbnVtIHsKKwlUQ0FfQ1NVTV9VTlNQRUMsCisJVENBX0NTVU1fUEFSTVMsCisJVENBX0NTVU1fVE0sCisJX19UQ0FfQ1NVTV9NQVgKK307CisjZGVmaW5lIFRDQV9DU1VNX01BWCAoX19UQ0FfQ1NVTV9NQVggLSAxKQorCitlbnVtIHsKKwlUQ0FfQ1NVTV9VUERBVEVfRkxBR19JUFY0SERSID0gMSwKKwlUQ0FfQ1NVTV9VUERBVEVfRkxBR19JQ01QICAgID0gMiwKKwlUQ0FfQ1NVTV9VUERBVEVfRkxBR19JR01QICAgID0gNCwKKwlUQ0FfQ1NVTV9VUERBVEVfRkxBR19UQ1AgICAgID0gOCwKKwlUQ0FfQ1NVTV9VUERBVEVfRkxBR19VRFAgICAgID0gMTYsCisJVENBX0NTVU1fVVBEQVRFX0ZMQUdfVURQTElURSA9IDMyCit9OworCitzdHJ1Y3QgdGNfY3N1bSB7CisJdGNfZ2VuOworCisJX191MzIgdXBkYXRlX2ZsYWdzOworfTsKKworI2VuZGlmIC8qIF9fTElOVVhfVENfQ1NVTV9IICovCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19kZWZhY3QuaCBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX2RlZmFjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZGRkYjQKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19kZWZhY3QuaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIF9fTElOVVhfVENfREVGX0gKKyNkZWZpbmUgX19MSU5VWF9UQ19ERUZfSAorCisjaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPgorCitzdHJ1Y3QgdGNfZGVmYWN0IHsKKwl0Y19nZW47Cit9OworCitlbnVtIHsKKwlUQ0FfREVGX1VOU1BFQywKKwlUQ0FfREVGX1RNLAorCVRDQV9ERUZfUEFSTVMsCisJVENBX0RFRl9EQVRBLAorCV9fVENBX0RFRl9NQVgKK307CisjZGVmaW5lIFRDQV9ERUZfTUFYIChfX1RDQV9ERUZfTUFYIC0gMSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19nYWN0LmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19nYWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdiZjk0ZQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX2dhY3QuaApAQCAtMCwwICsxLDMyIEBACisjaWZuZGVmIF9fTElOVVhfVENfR0FDVF9ICisjZGVmaW5lIF9fTElOVVhfVENfR0FDVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BrdF9jbHMuaD4KKworI2RlZmluZSBUQ0FfQUNUX0dBQ1QgNQorc3RydWN0IHRjX2dhY3QgeworCXRjX2dlbjsKKworfTsKKworc3RydWN0IHRjX2dhY3RfcCB7CisjZGVmaW5lIFBHQUNUX05PTkUgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUEdBQ1RfTkVUUkFORCAgICAgICAgICAgMQorI2RlZmluZSBQR0FDVF9ERVRFUk0gICAgICAgICAgICAyCisjZGVmaW5lIE1BWF9SQU5EICAgICAgICAgICAgICAgIChQR0FDVF9ERVRFUk0gKyAxICkKKwlfX3UxNiAgICAgICAgICAgICAgICAgcHR5cGU7CisJX191MTYgICAgICAgICAgICAgICAgIHB2YWw7CisJaW50ICAgICAgICAgICAgICAgICAgIHBhY3Rpb247Cit9OworIAorZW51bSB7CisJVENBX0dBQ1RfVU5TUEVDLAorCVRDQV9HQUNUX1RNLAorCVRDQV9HQUNUX1BBUk1TLAorCVRDQV9HQUNUX1BST0IsCisJX19UQ0FfR0FDVF9NQVgKK307CisjZGVmaW5lIFRDQV9HQUNUX01BWCAoX19UQ0FfR0FDVF9NQVggLSAxKQorIAorI2VuZGlmCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19pcHQuaCBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX2lwdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMGFhYWQKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19pcHQuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIF9fTElOVVhfVENfSVBUX0gKKyNkZWZpbmUgX19MSU5VWF9UQ19JUFRfSAorCisjaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPgorCisjZGVmaW5lIFRDQV9BQ1RfSVBUIDYKKyNkZWZpbmUgVENBX0FDVF9YVCAxMAorCitlbnVtIHsKKwlUQ0FfSVBUX1VOU1BFQywKKwlUQ0FfSVBUX1RBQkxFLAorCVRDQV9JUFRfSE9PSywKKwlUQ0FfSVBUX0lOREVYLAorCVRDQV9JUFRfQ05ULAorCVRDQV9JUFRfVE0sCisJVENBX0lQVF9UQVJHLAorCV9fVENBX0lQVF9NQVgKK307CisjZGVmaW5lIFRDQV9JUFRfTUFYIChfX1RDQV9JUFRfTUFYIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZW5kaWYKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX21pcnJlZC5oIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC90Y19hY3QvdGNfbWlycmVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU2MTc1MAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX21pcnJlZC5oCkBAIC0wLDAgKzEsMjcgQEAKKyNpZm5kZWYgX19MSU5VWF9UQ19NSVJfSAorI2RlZmluZSBfX0xJTlVYX1RDX01JUl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BrdF9jbHMuaD4KKworI2RlZmluZSBUQ0FfQUNUX01JUlJFRCA4CisjZGVmaW5lIFRDQV9FR1JFU1NfUkVESVIgMSAgLyogcGFja2V0IHJlZGlyZWN0IHRvIEVHUkVTUyovCisjZGVmaW5lIFRDQV9FR1JFU1NfTUlSUk9SIDIgLyogbWlycm9yIHBhY2tldCB0byBFR1JFU1MgKi8KKyNkZWZpbmUgVENBX0lOR1JFU1NfUkVESVIgMyAgLyogcGFja2V0IHJlZGlyZWN0IHRvIElOR1JFU1MqLworI2RlZmluZSBUQ0FfSU5HUkVTU19NSVJST1IgNCAvKiBtaXJyb3IgcGFja2V0IHRvIElOR1JFU1MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitzdHJ1Y3QgdGNfbWlycmVkIHsKKwl0Y19nZW47CisJaW50ICAgICAgICAgICAgICAgICAgICAgZWFjdGlvbjsgICAvKiBvbmUgb2YgSU4vRUdSRVNTX01JUlJPUi9SRURJUiAqLworCV9fdTMyICAgICAgICAgICAgICAgICAgIGlmaW5kZXg7ICAvKiBpZmluZGV4IG9mIGVncmVzcyBwb3J0ICovCit9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK2VudW0geworCVRDQV9NSVJSRURfVU5TUEVDLAorCVRDQV9NSVJSRURfVE0sCisJVENBX01JUlJFRF9QQVJNUywKKwlfX1RDQV9NSVJSRURfTUFYCit9OworI2RlZmluZSBUQ0FfTUlSUkVEX01BWCAoX19UQ0FfTUlSUkVEX01BWCAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2VuZGlmCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19uYXQuaCBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX25hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NjNhZWIKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19uYXQuaApAQCAtMCwwICsxLDI3IEBACisjaWZuZGVmIF9fTElOVVhfVENfTkFUX0gKKyNkZWZpbmUgX19MSU5VWF9UQ19OQVRfSAorCisjaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgVENBX0FDVF9OQVQgOQorCitlbnVtIHsKKwlUQ0FfTkFUX1VOU1BFQywKKwlUQ0FfTkFUX1BBUk1TLAorCVRDQV9OQVRfVE0sCisJX19UQ0FfTkFUX01BWAorfTsKKyNkZWZpbmUgVENBX05BVF9NQVggKF9fVENBX05BVF9NQVggLSAxKQorCisjZGVmaW5lIFRDQV9OQVRfRkxBR19FR1JFU1MgMQorCitzdHJ1Y3QgdGNfbmF0IHsKKwl0Y19nZW47CisJX19iZTMyIG9sZF9hZGRyOworCV9fYmUzMiBuZXdfYWRkcjsKKwlfX2JlMzIgbWFzazsKKwlfX3UzMiBmbGFnczsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saW51eC90Y19hY3QvdGNfcGVkaXQuaCBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX3BlZGl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE2Y2ZhYgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX3BlZGl0LmgKQEAgLTAsMCArMSwzNCBAQAorI2lmbmRlZiBfX0xJTlVYX1RDX1BFRF9ICisjZGVmaW5lIF9fTElOVVhfVENfUEVEX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPgorCisjZGVmaW5lIFRDQV9BQ1RfUEVESVQgNworCitlbnVtIHsKKwlUQ0FfUEVESVRfVU5TUEVDLAorCVRDQV9QRURJVF9UTSwKKwlUQ0FfUEVESVRfUEFSTVMsCisJX19UQ0FfUEVESVRfTUFYCit9OworI2RlZmluZSBUQ0FfUEVESVRfTUFYIChfX1RDQV9QRURJVF9NQVggLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK3N0cnVjdCB0Y19wZWRpdF9rZXkgeworCV9fdTMyICAgICAgICAgICBtYXNrOyAgLyogQU5EICovCisJX191MzIgICAgICAgICAgIHZhbDsgICAvKlhPUiAqLworCV9fdTMyICAgICAgICAgICBvZmY7ICAvKm9mZnNldCAqLworCV9fdTMyICAgICAgICAgICBhdDsKKwlfX3UzMiAgICAgICAgICAgb2ZmbWFzazsKKwlfX3UzMiAgICAgICAgICAgc2hpZnQ7Cit9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK3N0cnVjdCB0Y19wZWRpdF9zZWwgeworCXRjX2dlbjsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICBua2V5czsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICBmbGFnczsKKwlzdHJ1Y3QgdGNfcGVkaXRfa2V5ICAgICBrZXlzWzBdOworfTsKKyNkZWZpbmUgdGNfcGVkaXQgdGNfcGVkaXRfc2VsCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saW51eC90Y19hY3QvdGNfc2tiZWRpdC5oIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC90Y19hY3QvdGNfc2tiZWRpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMmU5MTAKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19za2JlZGl0LmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKKyAqIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgorICoKKyAqIEF1dGhvcjogQWxleGFuZGVyIER1eWNrIDxhbGV4YW5kZXIuaC5kdXlja0BpbnRlbC5jb20+CisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1RDX1NLQkVESVRfSAorI2RlZmluZSBfX0xJTlVYX1RDX1NLQkVESVRfSAorCisjaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPgorCisjZGVmaW5lIFRDQV9BQ1RfU0tCRURJVCAxMQorCisjZGVmaW5lIFNLQkVESVRfRl9QUklPUklUWQkJMHgxCisjZGVmaW5lIFNLQkVESVRfRl9RVUVVRV9NQVBQSU5HCQkweDIKKyNkZWZpbmUgU0tCRURJVF9GX01BUksJCQkweDQKKworc3RydWN0IHRjX3NrYmVkaXQgeworCXRjX2dlbjsKK307CisKK2VudW0geworCVRDQV9TS0JFRElUX1VOU1BFQywKKwlUQ0FfU0tCRURJVF9UTSwKKwlUQ0FfU0tCRURJVF9QQVJNUywKKwlUQ0FfU0tCRURJVF9QUklPUklUWSwKKwlUQ0FfU0tCRURJVF9RVUVVRV9NQVBQSU5HLAorCVRDQV9TS0JFRElUX01BUkssCisJX19UQ0FfU0tCRURJVF9NQVgKK307CisjZGVmaW5lIFRDQV9TS0JFRElUX01BWCAoX19UQ0FfU0tCRURJVF9NQVggLSAxKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX3ZsYW4uaCBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX3ZsYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2I4ZDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC90Y19hY3QvdGNfdmxhbi5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgSmlyaSBQaXJrbyA8amlyaUByZXNudWxsaS51cz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9UQ19WTEFOX0gKKyNkZWZpbmUgX19MSU5VWF9UQ19WTEFOX0gKKworI2luY2x1ZGUgPGxpbnV4L3BrdF9jbHMuaD4KKworI2RlZmluZSBUQ0FfQUNUX1ZMQU4gMTIKKworI2RlZmluZSBUQ0FfVkxBTl9BQ1RfUE9QCTEKKyNkZWZpbmUgVENBX1ZMQU5fQUNUX1BVU0gJMgorCitzdHJ1Y3QgdGNfdmxhbiB7CisJdGNfZ2VuOworCWludCB2X2FjdGlvbjsKK307CisKK2VudW0geworCVRDQV9WTEFOX1VOU1BFQywKKwlUQ0FfVkxBTl9UTSwKKwlUQ0FfVkxBTl9QQVJNUywKKwlUQ0FfVkxBTl9QVVNIX1ZMQU5fSUQsCisJVENBX1ZMQU5fUFVTSF9WTEFOX1BST1RPQ09MLAorCV9fVENBX1ZMQU5fTUFYLAorfTsKKyNkZWZpbmUgVENBX1ZMQU5fTUFYIChfX1RDQV9WTEFOX01BWCAtIDEpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saW51eC90Y19lbWF0Y2gvdGNfZW1fY21wLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3RjX2VtYXRjaC90Y19lbV9jbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzRiYjFiCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC90Y19lbWF0Y2gvdGNfZW1fY21wLmgKQEAgLTAsMCArMSwyNSBAQAorI2lmbmRlZiBfX0xJTlVYX1RDX0VNX0NNUF9ICisjZGVmaW5lIF9fTElOVVhfVENfRU1fQ01QX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPgorCitzdHJ1Y3QgdGNmX2VtX2NtcCB7CisJX191MzIJCXZhbDsKKwlfX3UzMgkJbWFzazsKKwlfX3UxNgkJb2ZmOworCV9fdTgJCWFsaWduOjQ7CisJX191OAkJZmxhZ3M6NDsKKwlfX3U4CQlsYXllcjo0OworCV9fdTgJCW9wbmQ6NDsKK307CisKK2VudW0geworCVRDRl9FTV9BTElHTl9VOCAgPSAxLAorCVRDRl9FTV9BTElHTl9VMTYgPSAyLAorCVRDRl9FTV9BTElHTl9VMzIgPSA0Cit9OworCisjZGVmaW5lIFRDRl9FTV9DTVBfVFJBTlMJMQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2luY2x1ZGUvbGludXgvdGNfZW1hdGNoL3RjX2VtX21ldGEuaCBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvdGNfZW1hdGNoL3RjX2VtX21ldGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTFmOGNlCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC90Y19lbWF0Y2gvdGNfZW1fbWV0YS5oCkBAIC0wLDAgKzEsOTIgQEAKKyNpZm5kZWYgX19MSU5VWF9UQ19FTV9NRVRBX0gKKyNkZWZpbmUgX19MSU5VWF9UQ19FTV9NRVRBX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPgorCitlbnVtIHsKKwlUQ0FfRU1fTUVUQV9VTlNQRUMsCisJVENBX0VNX01FVEFfSERSLAorCVRDQV9FTV9NRVRBX0xWQUxVRSwKKwlUQ0FfRU1fTUVUQV9SVkFMVUUsCisJX19UQ0FfRU1fTUVUQV9NQVgKK307CisjZGVmaW5lIFRDQV9FTV9NRVRBX01BWCAoX19UQ0FfRU1fTUVUQV9NQVggLSAxKQorCitzdHJ1Y3QgdGNmX21ldGFfdmFsIHsKKwlfX3UxNgkJCWtpbmQ7CisJX191OAkJCXNoaWZ0OworCV9fdTgJCQlvcDsKK307CisKKyNkZWZpbmUgVENGX01FVEFfVFlQRV9NQVNLCSgweGYgPDwgMTIpCisjZGVmaW5lIFRDRl9NRVRBX1RZUEUoa2luZCkJKCgoa2luZCkgJiBUQ0ZfTUVUQV9UWVBFX01BU0spID4+IDEyKQorI2RlZmluZSBUQ0ZfTUVUQV9JRF9NQVNLCTB4N2ZmCisjZGVmaW5lIFRDRl9NRVRBX0lEKGtpbmQpCSgoa2luZCkgJiBUQ0ZfTUVUQV9JRF9NQVNLKQorCitlbnVtIHsKKwlUQ0ZfTUVUQV9UWVBFX1ZBUiwKKwlUQ0ZfTUVUQV9UWVBFX0lOVCwKKwlfX1RDRl9NRVRBX1RZUEVfTUFYCit9OworI2RlZmluZSBUQ0ZfTUVUQV9UWVBFX01BWCAoX19UQ0ZfTUVUQV9UWVBFX01BWCAtIDEpCisKK2VudW0geworCVRDRl9NRVRBX0lEX1ZBTFVFLAorCVRDRl9NRVRBX0lEX1JBTkRPTSwKKwlUQ0ZfTUVUQV9JRF9MT0FEQVZHXzAsCisJVENGX01FVEFfSURfTE9BREFWR18xLAorCVRDRl9NRVRBX0lEX0xPQURBVkdfMiwKKwlUQ0ZfTUVUQV9JRF9ERVYsCisJVENGX01FVEFfSURfUFJJT1JJVFksCisJVENGX01FVEFfSURfUFJPVE9DT0wsCisJVENGX01FVEFfSURfUEtUVFlQRSwKKwlUQ0ZfTUVUQV9JRF9QS1RMRU4sCisJVENGX01FVEFfSURfREFUQUxFTiwKKwlUQ0ZfTUVUQV9JRF9NQUNMRU4sCisJVENGX01FVEFfSURfTkZNQVJLLAorCVRDRl9NRVRBX0lEX1RDSU5ERVgsCisJVENGX01FVEFfSURfUlRDTEFTU0lELAorCVRDRl9NRVRBX0lEX1JUSUlGLAorCVRDRl9NRVRBX0lEX1NLX0ZBTUlMWSwKKwlUQ0ZfTUVUQV9JRF9TS19TVEFURSwKKwlUQ0ZfTUVUQV9JRF9TS19SRVVTRSwKKwlUQ0ZfTUVUQV9JRF9TS19CT1VORF9JRiwKKwlUQ0ZfTUVUQV9JRF9TS19SRUZDTlQsCisJVENGX01FVEFfSURfU0tfU0hVVERPV04sCisJVENGX01FVEFfSURfU0tfUFJPVE8sCisJVENGX01FVEFfSURfU0tfVFlQRSwKKwlUQ0ZfTUVUQV9JRF9TS19SQ1ZCVUYsCisJVENGX01FVEFfSURfU0tfUk1FTV9BTExPQywKKwlUQ0ZfTUVUQV9JRF9TS19XTUVNX0FMTE9DLAorCVRDRl9NRVRBX0lEX1NLX09NRU1fQUxMT0MsCisJVENGX01FVEFfSURfU0tfV01FTV9RVUVVRUQsCisJVENGX01FVEFfSURfU0tfUkNWX1FMRU4sCisJVENGX01FVEFfSURfU0tfU05EX1FMRU4sCisgCVRDRl9NRVRBX0lEX1NLX0VSUl9RTEVOLAorCVRDRl9NRVRBX0lEX1NLX0ZPUldBUkRfQUxMT0NTLAorCVRDRl9NRVRBX0lEX1NLX1NOREJVRiwKKyAJVENGX01FVEFfSURfU0tfQUxMT0NTLAorCV9fVENGX01FVEFfSURfU0tfUk9VVEVfQ0FQUywJLyogdW5pbXBsZW1lbnRlZCBidXQgaW4gQUJJIGFscmVhZHkgKi8KKyAJVENGX01FVEFfSURfU0tfSEFTSCwKKyAJVENGX01FVEFfSURfU0tfTElOR0VSVElNRSwKKyAJVENGX01FVEFfSURfU0tfQUNLX0JBQ0tMT0csCisgCVRDRl9NRVRBX0lEX1NLX01BWF9BQ0tfQkFDS0xPRywKKyAJVENGX01FVEFfSURfU0tfUFJJTywKKyAJVENGX01FVEFfSURfU0tfUkNWTE9XQVQsCisgCVRDRl9NRVRBX0lEX1NLX1JDVlRJTUVPLAorIAlUQ0ZfTUVUQV9JRF9TS19TTkRUSU1FTywKKyAJVENGX01FVEFfSURfU0tfU0VORE1TR19PRkYsCisgCVRDRl9NRVRBX0lEX1NLX1dSSVRFX1BFTkRJTkcsCisJVENGX01FVEFfSURfVkxBTl9UQUcsCisJVENGX01FVEFfSURfUlhIQVNILAorCV9fVENGX01FVEFfSURfTUFYCit9OworI2RlZmluZSBUQ0ZfTUVUQV9JRF9NQVggKF9fVENGX01FVEFfSURfTUFYIC0gMSkKKworc3RydWN0IHRjZl9tZXRhX2hkciB7CisJc3RydWN0IHRjZl9tZXRhX3ZhbAlsZWZ0OworCXN0cnVjdCB0Y2ZfbWV0YV92YWwJcmlnaHQ7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2luY2x1ZGUvbGludXgvdGNfZW1hdGNoL3RjX2VtX25ieXRlLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3RjX2VtYXRjaC90Y19lbV9uYnl0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNzJjZmIKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3RjX2VtYXRjaC90Y19lbV9uYnl0ZS5oCkBAIC0wLDAgKzEsMTMgQEAKKyNpZm5kZWYgX19MSU5VWF9UQ19FTV9OQllURV9ICisjZGVmaW5lIF9fTElOVVhfVENfRU1fTkJZVEVfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wa3RfY2xzLmg+CisKK3N0cnVjdCB0Y2ZfZW1fbmJ5dGUgeworCV9fdTE2CQlvZmY7CisJX191MTYJCWxlbjoxMjsKKwlfX3U4CQlsYXllcjo0OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3RjX2VtYXRjaC90Y19lbV90ZXh0LmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3RjX2VtYXRjaC90Y19lbV90ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFhYzQwNAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvdGNfZW1hdGNoL3RjX2VtX3RleHQuaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIF9fTElOVVhfVENfRU1fVEVYVF9ICisjZGVmaW5lIF9fTElOVVhfVENfRU1fVEVYVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BrdF9jbHMuaD4KKworI2RlZmluZSBUQ19FTV9URVhUX0FMR09TSVoJMTYKKworc3RydWN0IHRjZl9lbV90ZXh0IHsKKwljaGFyCQlhbGdvW1RDX0VNX1RFWFRfQUxHT1NJWl07CisJX191MTYJCWZyb21fb2Zmc2V0OworCV9fdTE2CQl0b19vZmZzZXQ7CisJX191MTYJCXBhdHRlcm5fbGVuOworCV9fdTgJCWZyb21fbGF5ZXI6NDsKKwlfX3U4CQl0b19sYXllcjo0OworCV9fdTgJCXBhZDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saW51eC90Y3AuaCBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvdGNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU5YjRhNgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvdGNwLmgKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJRGVmaW5pdGlvbnMgZm9yIHRoZSBUQ1AgcHJvdG9jb2wuCisgKgorICogVmVyc2lvbjoJQCgjKXRjcC5oCTEuMC4yCTA0LzI4LzkzCisgKgorICogQXV0aG9yOglGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfTElOVVhfVENQX0gKKyNkZWZpbmUgX0xJTlVYX1RDUF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKworc3RydWN0IHRjcGhkciB7CisJX19iZTE2CXNvdXJjZTsKKwlfX2JlMTYJZGVzdDsKKwlfX2JlMzIJc2VxOworCV9fYmUzMglhY2tfc2VxOworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTE2CXJlczE6NCwKKwkJZG9mZjo0LAorCQlmaW46MSwKKwkJc3luOjEsCisJCXJzdDoxLAorCQlwc2g6MSwKKwkJYWNrOjEsCisJCXVyZzoxLAorCQllY2U6MSwKKwkJY3dyOjE7CisjZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwlfX3UxNglkb2ZmOjQsCisJCXJlczE6NCwKKwkJY3dyOjEsCisJCWVjZToxLAorCQl1cmc6MSwKKwkJYWNrOjEsCisJCXBzaDoxLAorCQlyc3Q6MSwKKwkJc3luOjEsCisJCWZpbjoxOworI2Vsc2UKKyNlcnJvcgkiQWRqdXN0IHlvdXIgPGFzbS9ieXRlb3JkZXIuaD4gZGVmaW5lcyIKKyNlbmRpZgkKKwlfX2JlMTYJd2luZG93OworCV9fc3VtMTYJY2hlY2s7CisJX19iZTE2CXVyZ19wdHI7Cit9OworCisvKgorICoJVGhlIHVuaW9uIGNhc3QgdXNlcyBhIGdjYyBleHRlbnNpb24gdG8gYXZvaWQgYWxpYXNpbmcgcHJvYmxlbXMKKyAqICAodW5pb24gaXMgY29tcGF0aWJsZSB0byBhbnkgb2YgaXRzIG1lbWJlcnMpCisgKiAgVGhpcyBtZWFucyB0aGlzIHBhcnQgb2YgdGhlIGNvZGUgaXMgLWZzdHJpY3QtYWxpYXNpbmcgc2FmZSBub3cuCisgKi8KK3VuaW9uIHRjcF93b3JkX2hkciB7IAorCXN0cnVjdCB0Y3BoZHIgaGRyOworCV9fYmUzMiAJCSAgd29yZHNbNV07Cit9OyAKKworI2RlZmluZSB0Y3BfZmxhZ193b3JkKHRwKSAoICgodW5pb24gdGNwX3dvcmRfaGRyICopKHRwKSktPndvcmRzIFszXSkgCisKK2VudW0geyAKKwlUQ1BfRkxBR19DV1IgPSBfX2NvbnN0YW50X2NwdV90b19iZTMyKDB4MDA4MDAwMDApLAorCVRDUF9GTEFHX0VDRSA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoMHgwMDQwMDAwMCksCisJVENQX0ZMQUdfVVJHID0gX19jb25zdGFudF9jcHVfdG9fYmUzMigweDAwMjAwMDAwKSwKKwlUQ1BfRkxBR19BQ0sgPSBfX2NvbnN0YW50X2NwdV90b19iZTMyKDB4MDAxMDAwMDApLAorCVRDUF9GTEFHX1BTSCA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoMHgwMDA4MDAwMCksCisJVENQX0ZMQUdfUlNUID0gX19jb25zdGFudF9jcHVfdG9fYmUzMigweDAwMDQwMDAwKSwKKwlUQ1BfRkxBR19TWU4gPSBfX2NvbnN0YW50X2NwdV90b19iZTMyKDB4MDAwMjAwMDApLAorCVRDUF9GTEFHX0ZJTiA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoMHgwMDAxMDAwMCksCisJVENQX1JFU0VSVkVEX0JJVFMgPSBfX2NvbnN0YW50X2NwdV90b19iZTMyKDB4MEYwMDAwMDApLAorCVRDUF9EQVRBX09GRlNFVCA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoMHhGMDAwMDAwMCkKK307IAorCisvKgorICogVENQIGdlbmVyYWwgY29uc3RhbnRzCisgKi8KKyNkZWZpbmUgVENQX01TU19ERUZBVUxUCQkgNTM2VQkvKiBJUHY0IChSRkMxMTIyLCBSRkMyNTgxKSAqLworI2RlZmluZSBUQ1BfTVNTX0RFU0lSRUQJCTEyMjBVCS8qIElQdjYgKHR1bm5lbGVkKSwgRUROUzAgKFJGQzMyMjYpICovCisKKy8qIFRDUCBzb2NrZXQgb3B0aW9ucyAqLworI2RlZmluZSBUQ1BfTk9ERUxBWQkJMQkvKiBUdXJuIG9mZiBOYWdsZSdzIGFsZ29yaXRobS4gKi8KKyNkZWZpbmUgVENQX01BWFNFRwkJMgkvKiBMaW1pdCBNU1MgKi8KKyNkZWZpbmUgVENQX0NPUksJCTMJLyogTmV2ZXIgc2VuZCBwYXJ0aWFsbHkgY29tcGxldGUgc2VnbWVudHMgKi8KKyNkZWZpbmUgVENQX0tFRVBJRExFCQk0CS8qIFN0YXJ0IGtlZXBsaXZlcyBhZnRlciB0aGlzIHBlcmlvZCAqLworI2RlZmluZSBUQ1BfS0VFUElOVFZMCQk1CS8qIEludGVydmFsIGJldHdlZW4ga2VlcGFsaXZlcyAqLworI2RlZmluZSBUQ1BfS0VFUENOVAkJNgkvKiBOdW1iZXIgb2Yga2VlcGFsaXZlcyBiZWZvcmUgZGVhdGggKi8KKyNkZWZpbmUgVENQX1NZTkNOVAkJNwkvKiBOdW1iZXIgb2YgU1lOIHJldHJhbnNtaXRzICovCisjZGVmaW5lIFRDUF9MSU5HRVIyCQk4CS8qIExpZmUgdGltZSBvZiBvcnBoYW5lZCBGSU4tV0FJVC0yIHN0YXRlICovCisjZGVmaW5lIFRDUF9ERUZFUl9BQ0NFUFQJOQkvKiBXYWtlIHVwIGxpc3RlbmVyIG9ubHkgd2hlbiBkYXRhIGFycml2ZSAqLworI2RlZmluZSBUQ1BfV0lORE9XX0NMQU1QCTEwCS8qIEJvdW5kIGFkdmVydGlzZWQgd2luZG93ICovCisjZGVmaW5lIFRDUF9JTkZPCQkxMQkvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbm5lY3Rpb24uICovCisjZGVmaW5lIFRDUF9RVUlDS0FDSwkJMTIJLyogQmxvY2svcmVlbmFibGUgcXVpY2sgYWNrcyAqLworI2RlZmluZSBUQ1BfQ09OR0VTVElPTgkJMTMJLyogQ29uZ2VzdGlvbiBjb250cm9sIGFsZ29yaXRobSAqLworI2RlZmluZSBUQ1BfTUQ1U0lHCQkxNAkvKiBUQ1AgTUQ1IFNpZ25hdHVyZSAoUkZDMjM4NSkgKi8KKyNkZWZpbmUgVENQX1RISU5fTElORUFSX1RJTUVPVVRTIDE2ICAgICAgLyogVXNlIGxpbmVhciB0aW1lb3V0cyBmb3IgdGhpbiBzdHJlYW1zKi8KKyNkZWZpbmUgVENQX1RISU5fRFVQQUNLICAgICAgICAgMTcgICAgICAvKiBGYXN0IHJldHJhbnMuIGFmdGVyIDEgZHVwYWNrICovCisjZGVmaW5lIFRDUF9VU0VSX1RJTUVPVVQJMTgJLyogSG93IGxvbmcgZm9yIGxvc3MgcmV0cnkgYmVmb3JlIHRpbWVvdXQgKi8KKyNkZWZpbmUgVENQX1JFUEFJUgkJMTkJLyogVENQIHNvY2sgaXMgdW5kZXIgcmVwYWlyIHJpZ2h0IG5vdyAqLworI2RlZmluZSBUQ1BfUkVQQUlSX1FVRVVFCTIwCisjZGVmaW5lIFRDUF9RVUVVRV9TRVEJCTIxCisjZGVmaW5lIFRDUF9SRVBBSVJfT1BUSU9OUwkyMgorI2RlZmluZSBUQ1BfRkFTVE9QRU4JCTIzCS8qIEVuYWJsZSBGYXN0T3BlbiBvbiBsaXN0ZW5lcnMgKi8KKyNkZWZpbmUgVENQX1RJTUVTVEFNUAkJMjQKKyNkZWZpbmUgVENQX05PVFNFTlRfTE9XQVQJMjUJLyogbGltaXQgbnVtYmVyIG9mIHVuc2VudCBieXRlcyBpbiB3cml0ZSBxdWV1ZSAqLworI2RlZmluZSBUQ1BfQ0NfSU5GTwkJMjYJLyogR2V0IENvbmdlc3Rpb24gQ29udHJvbCAob3B0aW9uYWwpIGluZm8gKi8KKyNkZWZpbmUgVENQX1NBVkVfU1lOCQkyNwkvKiBSZWNvcmQgU1lOIGhlYWRlcnMgZm9yIG5ldyBjb25uZWN0aW9ucyAqLworI2RlZmluZSBUQ1BfU0FWRURfU1lOCQkyOAkvKiBHZXQgU1lOIGhlYWRlcnMgcmVjb3JkZWQgZm9yIGNvbm5lY3Rpb24gKi8KKworc3RydWN0IHRjcF9yZXBhaXJfb3B0IHsKKwlfX3UzMglvcHRfY29kZTsKKwlfX3UzMglvcHRfdmFsOworfTsKKworZW51bSB7CisJVENQX05PX1FVRVVFLAorCVRDUF9SRUNWX1FVRVVFLAorCVRDUF9TRU5EX1FVRVVFLAorCVRDUF9RVUVVRVNfTlIsCit9OworCisvKiBmb3IgVENQX0lORk8gc29ja2V0IG9wdGlvbiAqLworI2RlZmluZSBUQ1BJX09QVF9USU1FU1RBTVBTCTEKKyNkZWZpbmUgVENQSV9PUFRfU0FDSwkJMgorI2RlZmluZSBUQ1BJX09QVF9XU0NBTEUJCTQKKyNkZWZpbmUgVENQSV9PUFRfRUNOCQk4IC8qIEVDTiB3YXMgbmVnb2NpYXRlZCBhdCBUQ1Agc2Vzc2lvbiBpbml0ICovCisjZGVmaW5lIFRDUElfT1BUX0VDTl9TRUVOCTE2IC8qIHdlIHJlY2VpdmVkIGF0IGxlYXN0IG9uZSBwYWNrZXQgd2l0aCBFQ1QgKi8KKyNkZWZpbmUgVENQSV9PUFRfU1lOX0RBVEEJMzIgLyogU1lOLUFDSyBhY2tlZCBkYXRhIGluIFNZTiBzZW50IG9yIHJjdmQgKi8KKworZW51bSB0Y3BfY2Ffc3RhdGUgeworCVRDUF9DQV9PcGVuID0gMCwKKyNkZWZpbmUgVENQRl9DQV9PcGVuCSgxPDxUQ1BfQ0FfT3BlbikKKwlUQ1BfQ0FfRGlzb3JkZXIgPSAxLAorI2RlZmluZSBUQ1BGX0NBX0Rpc29yZGVyICgxPDxUQ1BfQ0FfRGlzb3JkZXIpCisJVENQX0NBX0NXUiA9IDIsCisjZGVmaW5lIFRDUEZfQ0FfQ1dSCSgxPDxUQ1BfQ0FfQ1dSKQorCVRDUF9DQV9SZWNvdmVyeSA9IDMsCisjZGVmaW5lIFRDUEZfQ0FfUmVjb3ZlcnkgKDE8PFRDUF9DQV9SZWNvdmVyeSkKKwlUQ1BfQ0FfTG9zcyA9IDQKKyNkZWZpbmUgVENQRl9DQV9Mb3NzCSgxPDxUQ1BfQ0FfTG9zcykKK307CisKK3N0cnVjdCB0Y3BfaW5mbyB7CisJX191OAl0Y3BpX3N0YXRlOworCV9fdTgJdGNwaV9jYV9zdGF0ZTsKKwlfX3U4CXRjcGlfcmV0cmFuc21pdHM7CisJX191OAl0Y3BpX3Byb2JlczsKKwlfX3U4CXRjcGlfYmFja29mZjsKKwlfX3U4CXRjcGlfb3B0aW9uczsKKwlfX3U4CXRjcGlfc25kX3dzY2FsZSA6IDQsIHRjcGlfcmN2X3dzY2FsZSA6IDQ7CisKKwlfX3UzMgl0Y3BpX3J0bzsKKwlfX3UzMgl0Y3BpX2F0bzsKKwlfX3UzMgl0Y3BpX3NuZF9tc3M7CisJX191MzIJdGNwaV9yY3ZfbXNzOworCisJX191MzIJdGNwaV91bmFja2VkOworCV9fdTMyCXRjcGlfc2Fja2VkOworCV9fdTMyCXRjcGlfbG9zdDsKKwlfX3UzMgl0Y3BpX3JldHJhbnM7CisJX191MzIJdGNwaV9mYWNrZXRzOworCisJLyogVGltZXMuICovCisJX191MzIJdGNwaV9sYXN0X2RhdGFfc2VudDsKKwlfX3UzMgl0Y3BpX2xhc3RfYWNrX3NlbnQ7ICAgICAvKiBOb3QgcmVtZW1iZXJlZCwgc29ycnkuICovCisJX191MzIJdGNwaV9sYXN0X2RhdGFfcmVjdjsKKwlfX3UzMgl0Y3BpX2xhc3RfYWNrX3JlY3Y7CisKKwkvKiBNZXRyaWNzLiAqLworCV9fdTMyCXRjcGlfcG10dTsKKwlfX3UzMgl0Y3BpX3Jjdl9zc3RocmVzaDsKKwlfX3UzMgl0Y3BpX3J0dDsKKwlfX3UzMgl0Y3BpX3J0dHZhcjsKKwlfX3UzMgl0Y3BpX3NuZF9zc3RocmVzaDsKKwlfX3UzMgl0Y3BpX3NuZF9jd25kOworCV9fdTMyCXRjcGlfYWR2bXNzOworCV9fdTMyCXRjcGlfcmVvcmRlcmluZzsKKworCV9fdTMyCXRjcGlfcmN2X3J0dDsKKwlfX3UzMgl0Y3BpX3Jjdl9zcGFjZTsKKworCV9fdTMyCXRjcGlfdG90YWxfcmV0cmFuczsKKworCV9fdTY0CXRjcGlfcGFjaW5nX3JhdGU7CisJX191NjQJdGNwaV9tYXhfcGFjaW5nX3JhdGU7CisJX191NjQJdGNwaV9ieXRlc19hY2tlZDsgICAgLyogUkZDNDg5OCB0Y3BFU3RhdHNBcHBIQ1RocnVPY3RldHNBY2tlZCAqLworCV9fdTY0CXRjcGlfYnl0ZXNfcmVjZWl2ZWQ7IC8qIFJGQzQ4OTggdGNwRVN0YXRzQXBwSENUaHJ1T2N0ZXRzUmVjZWl2ZWQgKi8KKwlfX3UzMgl0Y3BpX3NlZ3Nfb3V0OwkgICAgIC8qIFJGQzQ4OTggdGNwRVN0YXRzUGVyZlNlZ3NPdXQgKi8KKwlfX3UzMgl0Y3BpX3NlZ3NfaW47CSAgICAgLyogUkZDNDg5OCB0Y3BFU3RhdHNQZXJmU2Vnc0luICovCit9OworCisvKiBmb3IgVENQX01ENVNJRyBzb2NrZXQgb3B0aW9uICovCisjZGVmaW5lIFRDUF9NRDVTSUdfTUFYS0VZTEVOCTgwCisKK3N0cnVjdCB0Y3BfbWQ1c2lnIHsKKwlzdHJ1Y3QgX19rZXJuZWxfc29ja2FkZHJfc3RvcmFnZSB0Y3BtX2FkZHI7CS8qIGFkZHJlc3MgYXNzb2NpYXRlZCAqLworCV9fdTE2CV9fdGNwbV9wYWQxOwkJCQkvKiB6ZXJvICovCisJX191MTYJdGNwbV9rZXlsZW47CQkJCS8qIGtleSBsZW5ndGggKi8KKwlfX3UzMglfX3RjcG1fcGFkMjsJCQkJLyogemVybyAqLworCV9fdTgJdGNwbV9rZXlbVENQX01ENVNJR19NQVhLRVlMRU5dOwkJLyoga2V5IChiaW5hcnkpICovCit9OworCisjZW5kaWYgLyogX0xJTlVYX1RDUF9IICovCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3RjcF9tZXRyaWNzLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3RjcF9tZXRyaWNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM1MzM5MgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvdGNwX21ldHJpY3MuaApAQCAtMCwwICsxLDU5IEBACisvKiB0Y3BfbWV0cmljcy5oIC0gVENQIE1ldHJpY3MgSW50ZXJmYWNlICovCisKKyNpZm5kZWYgX0xJTlVYX1RDUF9NRVRSSUNTX0gKKyNkZWZpbmUgX0xJTlVYX1RDUF9NRVRSSUNTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIE5FVExJTktfR0VORVJJQyByZWxhdGVkIGluZm8KKyAqLworI2RlZmluZSBUQ1BfTUVUUklDU19HRU5MX05BTUUJCSJ0Y3BfbWV0cmljcyIKKyNkZWZpbmUgVENQX01FVFJJQ1NfR0VOTF9WRVJTSU9OCTB4MQorCitlbnVtIHRjcF9tZXRyaWNfaW5kZXggeworCVRDUF9NRVRSSUNfUlRULAkJLyogaW4gbXMgdW5pdHMgKi8KKwlUQ1BfTUVUUklDX1JUVFZBUiwJLyogaW4gbXMgdW5pdHMgKi8KKwlUQ1BfTUVUUklDX1NTVEhSRVNILAorCVRDUF9NRVRSSUNfQ1dORCwKKwlUQ1BfTUVUUklDX1JFT1JERVJJTkcsCisKKwlUQ1BfTUVUUklDX1JUVF9VUywJLyogaW4gdXNlYyB1bml0cyAqLworCVRDUF9NRVRSSUNfUlRUVkFSX1VTLAkvKiBpbiB1c2VjIHVuaXRzICovCisKKwkvKiBBbHdheXMgbGFzdC4gICovCisJX19UQ1BfTUVUUklDX01BWCwKK307CisKKyNkZWZpbmUgVENQX01FVFJJQ19NQVgJKF9fVENQX01FVFJJQ19NQVggLSAxKQorCitlbnVtIHsKKwlUQ1BfTUVUUklDU19BVFRSX1VOU1BFQywKKwlUQ1BfTUVUUklDU19BVFRSX0FERFJfSVBWNCwJCS8qIHUzMiAqLworCVRDUF9NRVRSSUNTX0FUVFJfQUREUl9JUFY2LAkJLyogYmluYXJ5ICovCisJVENQX01FVFJJQ1NfQVRUUl9BR0UsCQkJLyogbXNlY3MgKi8KKwlUQ1BfTUVUUklDU19BVFRSX1RXX1RTVkFMLAkJLyogdTMyLCByYXcsIHJjdiB0c3ZhbCAqLworCVRDUF9NRVRSSUNTX0FUVFJfVFdfVFNfU1RBTVAsCQkvKiBzMzIsIHNlYyBhZ2UgKi8KKwlUQ1BfTUVUUklDU19BVFRSX1ZBTFMsCQkJLyogbmVzdGVkICsxLCB1MzIgKi8KKwlUQ1BfTUVUUklDU19BVFRSX0ZPUEVOX01TUywJCS8qIHUxNiAqLworCVRDUF9NRVRSSUNTX0FUVFJfRk9QRU5fU1lOX0RST1BTLAkvKiB1MTYsIGNvdW50IG9mIGRyb3BzICovCisJVENQX01FVFJJQ1NfQVRUUl9GT1BFTl9TWU5fRFJPUF9UUywJLyogbXNlY3MgYWdlICovCisJVENQX01FVFJJQ1NfQVRUUl9GT1BFTl9DT09LSUUsCQkvKiBiaW5hcnkgKi8KKwlUQ1BfTUVUUklDU19BVFRSX1NBRERSX0lQVjQsCQkvKiB1MzIgKi8KKwlUQ1BfTUVUUklDU19BVFRSX1NBRERSX0lQVjYsCQkvKiBiaW5hcnkgKi8KKworCV9fVENQX01FVFJJQ1NfQVRUUl9NQVgsCit9OworCisjZGVmaW5lIFRDUF9NRVRSSUNTX0FUVFJfTUFYCShfX1RDUF9NRVRSSUNTX0FUVFJfTUFYIC0gMSkKKworZW51bSB7CisJVENQX01FVFJJQ1NfQ01EX1VOU1BFQywKKwlUQ1BfTUVUUklDU19DTURfR0VULAorCVRDUF9NRVRSSUNTX0NNRF9ERUwsCisKKwlfX1RDUF9NRVRSSUNTX0NNRF9NQVgsCit9OworCisjZGVmaW5lIFRDUF9NRVRSSUNTX0NNRF9NQVgJKF9fVENQX01FVFJJQ1NfQ01EX01BWCAtIDEpCisKKyNlbmRpZiAvKiBfTElOVVhfVENQX01FVFJJQ1NfSCAqLwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9saW51eC90aXBjLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3RpcGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmQzYjYzCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC90aXBjLmgKQEAgLTAsMCArMSwyMzIgQEAKKy8qCisgKiBpbmNsdWRlL3VhcGkvbGludXgvdGlwYy5oOiBIZWFkZXIgZm9yIFRJUEMgc29ja2V0IGludGVyZmFjZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwLTIwMTEsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfTElOVVhfVElQQ19IXworI2RlZmluZSBfTElOVVhfVElQQ19IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisKKy8qCisgKiBUSVBDIGFkZHJlc3NpbmcgcHJpbWl0aXZlcworICovCisKK3N0cnVjdCB0aXBjX3BvcnRpZCB7CisJX191MzIgcmVmOworCV9fdTMyIG5vZGU7Cit9OworCitzdHJ1Y3QgdGlwY19uYW1lIHsKKwlfX3UzMiB0eXBlOworCV9fdTMyIGluc3RhbmNlOworfTsKKworc3RydWN0IHRpcGNfbmFtZV9zZXEgeworCV9fdTMyIHR5cGU7CisJX191MzIgbG93ZXI7CisJX191MzIgdXBwZXI7Cit9OworCitzdGF0aWMgX19pbmxpbmVfXyBfX3UzMiB0aXBjX2FkZHIodW5zaWduZWQgaW50IHpvbmUsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgY2x1c3RlciwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBub2RlKQoreworCXJldHVybiAoem9uZSA8PCAyNCkgfCAoY2x1c3RlciA8PCAxMikgfCBub2RlOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgdGlwY196b25lKF9fdTMyIGFkZHIpCit7CisJcmV0dXJuIGFkZHIgPj4gMjQ7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCB0aXBjX2NsdXN0ZXIoX191MzIgYWRkcikKK3sKKwlyZXR1cm4gKGFkZHIgPj4gMTIpICYgMHhmZmY7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCB0aXBjX25vZGUoX191MzIgYWRkcikKK3sKKwlyZXR1cm4gYWRkciAmIDB4ZmZmOworfQorCisvKgorICogQXBwbGljYXRpb24tYWNjZXNzaWJsZSBwb3J0IG5hbWUgdHlwZXMKKyAqLworCisjZGVmaW5lIFRJUENfQ0ZHX1NSVgkJMAkvKiBjb25maWd1cmF0aW9uIHNlcnZpY2UgbmFtZSB0eXBlICovCisjZGVmaW5lIFRJUENfVE9QX1NSVgkJMQkvKiB0b3BvbG9neSBzZXJ2aWNlIG5hbWUgdHlwZSAqLworI2RlZmluZSBUSVBDX0xJTktfU1RBVEUJCTIJLyogbGluayBzdGF0ZSBuYW1lIHR5cGUgKi8KKyNkZWZpbmUgVElQQ19SRVNFUlZFRF9UWVBFUwk2NAkvKiBsb3dlc3QgdXNlci1wdWJsaXNoYWJsZSBuYW1lIHR5cGUgKi8KKworLyoKKyAqIFB1YmxpY2F0aW9uIHNjb3BlcyB3aGVuIGJpbmRpbmcgcG9ydCBuYW1lcyBhbmQgcG9ydCBuYW1lIHNlcXVlbmNlcworICovCisKKyNkZWZpbmUgVElQQ19aT05FX1NDT1BFCQkxCisjZGVmaW5lIFRJUENfQ0xVU1RFUl9TQ09QRQkyCisjZGVmaW5lIFRJUENfTk9ERV9TQ09QRQkJMworCisvKgorICogTGltaXRpbmcgdmFsdWVzIGZvciBtZXNzYWdlcworICovCisKKyNkZWZpbmUgVElQQ19NQVhfVVNFUl9NU0dfU0laRQk2NjAwMFUKKworLyoKKyAqIE1lc3NhZ2UgaW1wb3J0YW5jZSBsZXZlbHMKKyAqLworCisjZGVmaW5lIFRJUENfTE9XX0lNUE9SVEFOQ0UJCTAKKyNkZWZpbmUgVElQQ19NRURJVU1fSU1QT1JUQU5DRQkJMQorI2RlZmluZSBUSVBDX0hJR0hfSU1QT1JUQU5DRQkJMgorI2RlZmluZSBUSVBDX0NSSVRJQ0FMX0lNUE9SVEFOQ0UJMworCisvKgorICogTXNnIHJlamVjdGlvbi9jb25uZWN0aW9uIHNodXRkb3duIHJlYXNvbnMKKyAqLworCisjZGVmaW5lIFRJUENfT0sJCQkwCisjZGVmaW5lIFRJUENfRVJSX05PX05BTUUJMQorI2RlZmluZSBUSVBDX0VSUl9OT19QT1JUCTIKKyNkZWZpbmUgVElQQ19FUlJfTk9fTk9ERQkzCisjZGVmaW5lIFRJUENfRVJSX09WRVJMT0FECTQKKyNkZWZpbmUgVElQQ19DT05OX1NIVVRET1dOCTUKKworLyoKKyAqIFRJUEMgdG9wb2xvZ3kgc3Vic2NyaXB0aW9uIHNlcnZpY2UgZGVmaW5pdGlvbnMKKyAqLworCisjZGVmaW5lIFRJUENfU1VCX1BPUlRTCQkweDAxCS8qIGZpbHRlciBmb3IgcG9ydCBhdmFpbGFiaWxpdHkgKi8KKyNkZWZpbmUgVElQQ19TVUJfU0VSVklDRQkweDAyCS8qIGZpbHRlciBmb3Igc2VydmljZSBhdmFpbGFiaWxpdHkgKi8KKyNkZWZpbmUgVElQQ19TVUJfQ0FOQ0VMCQkweDA0CS8qIGNhbmNlbCBhIHN1YnNjcmlwdGlvbiAqLworCisjZGVmaW5lIFRJUENfV0FJVF9GT1JFVkVSCSh+MCkJLyogdGltZW91dCBmb3IgcGVybWFuZW50IHN1YnNjcmlwdGlvbiAqLworCitzdHJ1Y3QgdGlwY19zdWJzY3IgeworCXN0cnVjdCB0aXBjX25hbWVfc2VxIHNlcTsJLyogbmFtZSBzZXF1ZW5jZSBvZiBpbnRlcmVzdCAqLworCV9fdTMyIHRpbWVvdXQ7CQkJLyogc3Vic2NyaXB0aW9uIGR1cmF0aW9uIChpbiBtcykgKi8KKwlfX3UzMiBmaWx0ZXI7CQkJLyogYml0bWFzayBvZiBmaWx0ZXIgb3B0aW9ucyAqLworCWNoYXIgdXNyX2hhbmRsZVs4XTsJCS8qIGF2YWlsYWJsZSBmb3Igc3Vic2NyaWJlciB1c2UgKi8KK307CisKKyNkZWZpbmUgVElQQ19QVUJMSVNIRUQJCTEJLyogcHVibGljYXRpb24gZXZlbnQgKi8KKyNkZWZpbmUgVElQQ19XSVRIRFJBV04JCTIJLyogd2l0aGRyYXcgZXZlbnQgKi8KKyNkZWZpbmUgVElQQ19TVUJTQ1JfVElNRU9VVAkzCS8qIHN1YnNjcmlwdGlvbiB0aW1lb3V0IGV2ZW50ICovCisKK3N0cnVjdCB0aXBjX2V2ZW50IHsKKwlfX3UzMiBldmVudDsJCQkvKiBldmVudCB0eXBlICovCisJX191MzIgZm91bmRfbG93ZXI7CQkvKiBtYXRjaGluZyBuYW1lIHNlcSBpbnN0YW5jZXMgKi8KKwlfX3UzMiBmb3VuZF91cHBlcjsJCS8qICAgICIgICAgICAiICAgICIgICAgICIgICAgICAqLworCXN0cnVjdCB0aXBjX3BvcnRpZCBwb3J0OwkvKiBhc3NvY2lhdGVkIHBvcnQgKi8KKwlzdHJ1Y3QgdGlwY19zdWJzY3IgczsJCS8qIGFzc29jaWF0ZWQgc3Vic2NyaXB0aW9uICovCit9OworCisvKgorICogU29ja2V0IEFQSQorICovCisKKyNpZm5kZWYgQUZfVElQQworI2RlZmluZSBBRl9USVBDCQkzMAorI2VuZGlmCisKKyNpZm5kZWYgUEZfVElQQworI2RlZmluZSBQRl9USVBDCQlBRl9USVBDCisjZW5kaWYKKworI2lmbmRlZiBTT0xfVElQQworI2RlZmluZSBTT0xfVElQQwkyNzEKKyNlbmRpZgorCisjZGVmaW5lIFRJUENfQUREUl9OQU1FU0VRCTEKKyNkZWZpbmUgVElQQ19BRERSX01DQVNUCQkxCisjZGVmaW5lIFRJUENfQUREUl9OQU1FCQkyCisjZGVmaW5lIFRJUENfQUREUl9JRAkJMworCitzdHJ1Y3Qgc29ja2FkZHJfdGlwYyB7CisJdW5zaWduZWQgc2hvcnQgZmFtaWx5OworCXVuc2lnbmVkIGNoYXIgIGFkZHJ0eXBlOworCXNpZ25lZCAgIGNoYXIgIHNjb3BlOworCXVuaW9uIHsKKwkJc3RydWN0IHRpcGNfcG9ydGlkIGlkOworCQlzdHJ1Y3QgdGlwY19uYW1lX3NlcSBuYW1lc2VxOworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHRpcGNfbmFtZSBuYW1lOworCQkJX191MzIgZG9tYWluOworCQl9IG5hbWU7CisJfSBhZGRyOworfTsKKworLyoKKyAqIEFuY2lsbGFyeSBkYXRhIG9iamVjdHMgc3VwcG9ydGVkIGJ5IHJlY3Ztc2coKQorICovCisKKyNkZWZpbmUgVElQQ19FUlJJTkZPCTEJLyogZXJyb3IgaW5mbyAqLworI2RlZmluZSBUSVBDX1JFVERBVEEJMgkvKiByZXR1cm5lZCBkYXRhICovCisjZGVmaW5lIFRJUENfREVTVE5BTUUJMwkvKiBkZXN0aW5hdGlvbiBuYW1lICovCisKKy8qCisgKiBUSVBDLXNwZWNpZmljIHNvY2tldCBvcHRpb24gdmFsdWVzCisgKi8KKworI2RlZmluZSBUSVBDX0lNUE9SVEFOQ0UJCTEyNwkvKiBEZWZhdWx0OiBUSVBDX0xPV19JTVBPUlRBTkNFICovCisjZGVmaW5lIFRJUENfU1JDX0RST1BQQUJMRQkxMjgJLyogRGVmYXVsdDogYmFzZWQgb24gc29ja2V0IHR5cGUgKi8KKyNkZWZpbmUgVElQQ19ERVNUX0RST1BQQUJMRQkxMjkJLyogRGVmYXVsdDogYmFzZWQgb24gc29ja2V0IHR5cGUgKi8KKyNkZWZpbmUgVElQQ19DT05OX1RJTUVPVVQJMTMwCS8qIERlZmF1bHQ6IDgwMDAgKG1zKSAgKi8KKyNkZWZpbmUgVElQQ19OT0RFX1JFQ1ZRX0RFUFRICTEzMQkvKiBEZWZhdWx0OiBub25lIChyZWFkIG9ubHkpICovCisjZGVmaW5lIFRJUENfU09DS19SRUNWUV9ERVBUSAkxMzIJLyogRGVmYXVsdDogbm9uZSAocmVhZCBvbmx5KSAqLworCisvKgorICogTWF4aW11bSBzaXplcyBvZiBUSVBDIGJlYXJlci1yZWxhdGVkIG5hbWVzIChpbmNsdWRpbmcgdGVybWluYXRpbmcgTlVMTCkKKyAqIFRoZSBzdHJpbmcgZm9ybWF0dGluZyBmb3IgZWFjaCBuYW1lIGVsZW1lbnQgaXM6CisgKiBtZWRpYTogbWVkaWEKKyAqIGludGVyZmFjZTogbWVkaWE6aW50ZXJmYWNlIG5hbWUKKyAqIGxpbms6IFouQy5OOmludGVyZmFjZS1aLkMuTjppbnRlcmZhY2UKKyAqCisgKi8KKworI2RlZmluZSBUSVBDX01BWF9NRURJQV9OQU1FCTE2CisjZGVmaW5lIFRJUENfTUFYX0lGX05BTUUJMTYKKyNkZWZpbmUgVElQQ19NQVhfQkVBUkVSX05BTUUJMzIKKyNkZWZpbmUgVElQQ19NQVhfTElOS19OQU1FCTYwCisKKyNkZWZpbmUgU0lPQ0dFVExJTktOQU1FCQlTSU9DUFJPVE9QUklWQVRFCisKK3N0cnVjdCB0aXBjX3Npb2NfbG5fcmVxIHsKKwlfX3UzMiBwZWVyOworCV9fdTMyIGJlYXJlcl9pZDsKKwljaGFyIGxpbmtuYW1lW1RJUENfTUFYX0xJTktfTkFNRV07Cit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3RpcGNfbmV0bGluay5oIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC90aXBjX25ldGxpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWViNjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC90aXBjX25ldGxpbmsuaApAQCAtMCwwICsxLDI1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgRXJpY3Nzb24gQUIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX0xJTlVYX1RJUENfTkVUTElOS19IXworI2RlZmluZSBfTElOVVhfVElQQ19ORVRMSU5LX0hfCisKKyNkZWZpbmUgVElQQ19HRU5MX1YyX05BTUUgICAgICAiVElQQ3YyIgorI2RlZmluZSBUSVBDX0dFTkxfVjJfVkVSU0lPTiAgIDB4MQorCisvKiBOZXRsaW5rIGNvbW1hbmRzICovCitlbnVtIHsKKwlUSVBDX05MX1VOU1BFQywKKwlUSVBDX05MX0xFR0FDWSwKKwlUSVBDX05MX0JFQVJFUl9ESVNBQkxFLAorCVRJUENfTkxfQkVBUkVSX0VOQUJMRSwKKwlUSVBDX05MX0JFQVJFUl9HRVQsCisJVElQQ19OTF9CRUFSRVJfU0VULAorCVRJUENfTkxfU09DS19HRVQsCisJVElQQ19OTF9QVUJMX0dFVCwKKwlUSVBDX05MX0xJTktfR0VULAorCVRJUENfTkxfTElOS19TRVQsCisJVElQQ19OTF9MSU5LX1JFU0VUX1NUQVRTLAorCVRJUENfTkxfTUVESUFfR0VULAorCVRJUENfTkxfTUVESUFfU0VULAorCVRJUENfTkxfTk9ERV9HRVQsCisJVElQQ19OTF9ORVRfR0VULAorCVRJUENfTkxfTkVUX1NFVCwKKwlUSVBDX05MX05BTUVfVEFCTEVfR0VULAorCVRJUENfTkxfUEVFUl9SRU1PVkUsCisKKwlfX1RJUENfTkxfQ01EX01BWCwKKwlUSVBDX05MX0NNRF9NQVggPSBfX1RJUENfTkxfQ01EX01BWCAtIDEKK307CisKKy8qIFRvcCBsZXZlbCBuZXRsaW5rIGF0dHJpYnV0ZXMgKi8KK2VudW0geworCVRJUENfTkxBX1VOU1BFQywKKwlUSVBDX05MQV9CRUFSRVIsCQkvKiBuZXN0ICovCisJVElQQ19OTEFfU09DSywJCQkvKiBuZXN0ICovCisJVElQQ19OTEFfUFVCTCwJCQkvKiBuZXN0ICovCisJVElQQ19OTEFfTElOSywJCQkvKiBuZXN0ICovCisJVElQQ19OTEFfTUVESUEsCQkJLyogbmVzdCAqLworCVRJUENfTkxBX05PREUsCQkJLyogbmVzdCAqLworCVRJUENfTkxBX05FVCwJCQkvKiBuZXN0ICovCisJVElQQ19OTEFfTkFNRV9UQUJMRSwJCS8qIG5lc3QgKi8KKworCV9fVElQQ19OTEFfTUFYLAorCVRJUENfTkxBX01BWCA9IF9fVElQQ19OTEFfTUFYIC0gMQorfTsKKworLyogQmVhcmVyIGluZm8gKi8KK2VudW0geworCVRJUENfTkxBX0JFQVJFUl9VTlNQRUMsCisJVElQQ19OTEFfQkVBUkVSX05BTUUsCQkvKiBzdHJpbmcgKi8KKwlUSVBDX05MQV9CRUFSRVJfUFJPUCwJCS8qIG5lc3QgKi8KKwlUSVBDX05MQV9CRUFSRVJfRE9NQUlOLAkJLyogdTMyICovCisJVElQQ19OTEFfQkVBUkVSX1VEUF9PUFRTLAkvKiBuZXN0ICovCisKKwlfX1RJUENfTkxBX0JFQVJFUl9NQVgsCisJVElQQ19OTEFfQkVBUkVSX01BWCA9IF9fVElQQ19OTEFfQkVBUkVSX01BWCAtIDEKK307CisKK2VudW0geworCVRJUENfTkxBX1VEUF9VTlNQRUMsCisJVElQQ19OTEFfVURQX0xPQ0FMLAkJLyogc29ja2FkZHJfc3RvcmFnZSAqLworCVRJUENfTkxBX1VEUF9SRU1PVEUsCQkvKiBzb2NrYWRkcl9zdG9yYWdlICovCisKKwlfX1RJUENfTkxBX1VEUF9NQVgsCisJVElQQ19OTEFfVURQX01BWCA9IF9fVElQQ19OTEFfVURQX01BWCAtIDEKK307CisvKiBTb2NrZXQgaW5mbyAqLworZW51bSB7CisJVElQQ19OTEFfU09DS19VTlNQRUMsCisJVElQQ19OTEFfU09DS19BRERSLAkJLyogdTMyICovCisJVElQQ19OTEFfU09DS19SRUYsCQkvKiB1MzIgKi8KKwlUSVBDX05MQV9TT0NLX0NPTiwJCS8qIG5lc3QgKi8KKwlUSVBDX05MQV9TT0NLX0hBU19QVUJMLAkJLyogZmxhZyAqLworCisJX19USVBDX05MQV9TT0NLX01BWCwKKwlUSVBDX05MQV9TT0NLX01BWCA9IF9fVElQQ19OTEFfU09DS19NQVggLSAxCit9OworCisvKiBMaW5rIGluZm8gKi8KK2VudW0geworCVRJUENfTkxBX0xJTktfVU5TUEVDLAorCVRJUENfTkxBX0xJTktfTkFNRSwJCS8qIHN0cmluZyAqLworCVRJUENfTkxBX0xJTktfREVTVCwJCS8qIHUzMiAqLworCVRJUENfTkxBX0xJTktfTVRVLAkJLyogdTMyICovCisJVElQQ19OTEFfTElOS19CUk9BRENBU1QsCS8qIGZsYWcgKi8KKwlUSVBDX05MQV9MSU5LX1VQLAkJLyogZmxhZyAqLworCVRJUENfTkxBX0xJTktfQUNUSVZFLAkJLyogZmxhZyAqLworCVRJUENfTkxBX0xJTktfUFJPUCwJCS8qIG5lc3QgKi8KKwlUSVBDX05MQV9MSU5LX1NUQVRTLAkJLyogbmVzdCAqLworCVRJUENfTkxBX0xJTktfUlgsCQkvKiB1MzIgKi8KKwlUSVBDX05MQV9MSU5LX1RYLAkJLyogdTMyICovCisKKwlfX1RJUENfTkxBX0xJTktfTUFYLAorCVRJUENfTkxBX0xJTktfTUFYID0gX19USVBDX05MQV9MSU5LX01BWCAtIDEKK307CisKKy8qIE1lZGlhIGluZm8gKi8KK2VudW0geworCVRJUENfTkxBX01FRElBX1VOU1BFQywKKwlUSVBDX05MQV9NRURJQV9OQU1FLAkJLyogc3RyaW5nICovCisJVElQQ19OTEFfTUVESUFfUFJPUCwJCS8qIG5lc3QgKi8KKworCV9fVElQQ19OTEFfTUVESUFfTUFYLAorCVRJUENfTkxBX01FRElBX01BWCA9IF9fVElQQ19OTEFfTUVESUFfTUFYIC0gMQorfTsKKworLyogTm9kZSBpbmZvICovCitlbnVtIHsKKwlUSVBDX05MQV9OT0RFX1VOU1BFQywKKwlUSVBDX05MQV9OT0RFX0FERFIsCQkvKiB1MzIgKi8KKwlUSVBDX05MQV9OT0RFX1VQLAkJLyogZmxhZyAqLworCisJX19USVBDX05MQV9OT0RFX01BWCwKKwlUSVBDX05MQV9OT0RFX01BWCA9IF9fVElQQ19OTEFfTk9ERV9NQVggLSAxCit9OworCisvKiBOZXQgaW5mbyAqLworZW51bSB7CisJVElQQ19OTEFfTkVUX1VOU1BFQywKKwlUSVBDX05MQV9ORVRfSUQsCQkvKiB1MzIgKi8KKwlUSVBDX05MQV9ORVRfQUREUiwJCS8qIHUzMiAqLworCisJX19USVBDX05MQV9ORVRfTUFYLAorCVRJUENfTkxBX05FVF9NQVggPSBfX1RJUENfTkxBX05FVF9NQVggLSAxCit9OworCisvKiBOYW1lIHRhYmxlIGluZm8gKi8KK2VudW0geworCVRJUENfTkxBX05BTUVfVEFCTEVfVU5TUEVDLAorCVRJUENfTkxBX05BTUVfVEFCTEVfUFVCTCwJLyogbmVzdCAqLworCisJX19USVBDX05MQV9OQU1FX1RBQkxFX01BWCwKKwlUSVBDX05MQV9OQU1FX1RBQkxFX01BWCA9IF9fVElQQ19OTEFfTkFNRV9UQUJMRV9NQVggLSAxCit9OworCisvKiBQdWJsaWNhdGlvbiBpbmZvICovCitlbnVtIHsKKwlUSVBDX05MQV9QVUJMX1VOU1BFQywKKworCVRJUENfTkxBX1BVQkxfVFlQRSwJCS8qIHUzMiAqLworCVRJUENfTkxBX1BVQkxfTE9XRVIsCQkvKiB1MzIgKi8KKwlUSVBDX05MQV9QVUJMX1VQUEVSLAkJLyogdTMyICovCisJVElQQ19OTEFfUFVCTF9TQ09QRSwJCS8qIHUzMiAqLworCVRJUENfTkxBX1BVQkxfTk9ERSwJCS8qIHUzMiAqLworCVRJUENfTkxBX1BVQkxfUkVGLAkJLyogdTMyICovCisJVElQQ19OTEFfUFVCTF9LRVksCQkvKiB1MzIgKi8KKworCV9fVElQQ19OTEFfUFVCTF9NQVgsCisJVElQQ19OTEFfUFVCTF9NQVggPSBfX1RJUENfTkxBX1BVQkxfTUFYIC0gMQorfTsKKworLyogTmVzdCwgY29ubmVjdGlvbiBpbmZvICovCitlbnVtIHsKKwlUSVBDX05MQV9DT05fVU5TUEVDLAorCisJVElQQ19OTEFfQ09OX0ZMQUcsCQkvKiBmbGFnICovCisJVElQQ19OTEFfQ09OX05PREUsCQkvKiB1MzIgKi8KKwlUSVBDX05MQV9DT05fU09DSywJCS8qIHUzMiAqLworCVRJUENfTkxBX0NPTl9UWVBFLAkJLyogdTMyICovCisJVElQQ19OTEFfQ09OX0lOU1QsCQkvKiB1MzIgKi8KKworCV9fVElQQ19OTEFfQ09OX01BWCwKKwlUSVBDX05MQV9DT05fTUFYID0gX19USVBDX05MQV9DT05fTUFYIC0gMQorfTsKKworLyogTmVzdCwgbGluayBwcm9wcmV0aWVzLiBWYWxpZCBmb3IgbGluaywgbWVkaWEgYW5kIGJlYXJlciAqLworZW51bSB7CisJVElQQ19OTEFfUFJPUF9VTlNQRUMsCisKKwlUSVBDX05MQV9QUk9QX1BSSU8sCQkvKiB1MzIgKi8KKwlUSVBDX05MQV9QUk9QX1RPTCwJCS8qIHUzMiAqLworCVRJUENfTkxBX1BST1BfV0lOLAkJLyogdTMyICovCisKKwlfX1RJUENfTkxBX1BST1BfTUFYLAorCVRJUENfTkxBX1BST1BfTUFYID0gX19USVBDX05MQV9QUk9QX01BWCAtIDEKK307CisKKy8qIE5lc3QsIHN0YXRpc3RpY3MgaW5mbyAqLworZW51bSB7CisJVElQQ19OTEFfU1RBVFNfVU5TUEVDLAorCisJVElQQ19OTEFfU1RBVFNfUlhfSU5GTywJCS8qIHUzMiAqLworCVRJUENfTkxBX1NUQVRTX1JYX0ZSQUdNRU5UUywJLyogdTMyICovCisJVElQQ19OTEFfU1RBVFNfUlhfRlJBR01FTlRFRCwJLyogdTMyICovCisJVElQQ19OTEFfU1RBVFNfUlhfQlVORExFUywJLyogdTMyICovCisJVElQQ19OTEFfU1RBVFNfUlhfQlVORExFRCwJLyogdTMyICovCisJVElQQ19OTEFfU1RBVFNfVFhfSU5GTywJCS8qIHUzMiAqLworCVRJUENfTkxBX1NUQVRTX1RYX0ZSQUdNRU5UUywJLyogdTMyICovCisJVElQQ19OTEFfU1RBVFNfVFhfRlJBR01FTlRFRCwJLyogdTMyICovCisJVElQQ19OTEFfU1RBVFNfVFhfQlVORExFUywJLyogdTMyICovCisJVElQQ19OTEFfU1RBVFNfVFhfQlVORExFRCwJLyogdTMyICovCisJVElQQ19OTEFfU1RBVFNfTVNHX1BST0ZfVE9ULAkvKiB1MzIgKi8KKwlUSVBDX05MQV9TVEFUU19NU0dfTEVOX0NOVCwJLyogdTMyICovCisJVElQQ19OTEFfU1RBVFNfTVNHX0xFTl9UT1QsCS8qIHUzMiAqLworCVRJUENfTkxBX1NUQVRTX01TR19MRU5fUDAsCS8qIHUzMiAqLworCVRJUENfTkxBX1NUQVRTX01TR19MRU5fUDEsCS8qIHUzMiAqLworCVRJUENfTkxBX1NUQVRTX01TR19MRU5fUDIsCS8qIHUzMiAqLworCVRJUENfTkxBX1NUQVRTX01TR19MRU5fUDMsCS8qIHUzMiAqLworCVRJUENfTkxBX1NUQVRTX01TR19MRU5fUDQsCS8qIHUzMiAqLworCVRJUENfTkxBX1NUQVRTX01TR19MRU5fUDUsCS8qIHUzMiAqLworCVRJUENfTkxBX1NUQVRTX01TR19MRU5fUDYsCS8qIHUzMiAqLworCVRJUENfTkxBX1NUQVRTX1JYX1NUQVRFUywJLyogdTMyICovCisJVElQQ19OTEFfU1RBVFNfUlhfUFJPQkVTLAkvKiB1MzIgKi8KKwlUSVBDX05MQV9TVEFUU19SWF9OQUNLUywJLyogdTMyICovCisJVElQQ19OTEFfU1RBVFNfUlhfREVGRVJSRUQsCS8qIHUzMiAqLworCVRJUENfTkxBX1NUQVRTX1RYX1NUQVRFUywJLyogdTMyICovCisJVElQQ19OTEFfU1RBVFNfVFhfUFJPQkVTLAkvKiB1MzIgKi8KKwlUSVBDX05MQV9TVEFUU19UWF9OQUNLUywJLyogdTMyICovCisJVElQQ19OTEFfU1RBVFNfVFhfQUNLUywJCS8qIHUzMiAqLworCVRJUENfTkxBX1NUQVRTX1JFVFJBTlNNSVRURUQsCS8qIHUzMiAqLworCVRJUENfTkxBX1NUQVRTX0RVUExJQ0FURVMsCS8qIHUzMiAqLworCVRJUENfTkxBX1NUQVRTX0xJTktfQ09OR1MsCS8qIHUzMiAqLworCVRJUENfTkxBX1NUQVRTX01BWF9RVUVVRSwJLyogdTMyICovCisJVElQQ19OTEFfU1RBVFNfQVZHX1FVRVVFLAkvKiB1MzIgKi8KKworCV9fVElQQ19OTEFfU1RBVFNfTUFYLAorCVRJUENfTkxBX1NUQVRTX01BWCA9IF9fVElQQ19OTEFfU1RBVFNfTUFYIC0gMQorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3VuaXhfZGlhZy5oIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC91bml4X2RpYWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWIwYjhkCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC91bml4X2RpYWcuaApAQCAtMCwwICsxLDU4IEBACisjaWZuZGVmIF9fVU5JWF9ESUFHX0hfXworI2RlZmluZSBfX1VOSVhfRElBR19IX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCB1bml4X2RpYWdfcmVxIHsKKwlfX3U4CXNkaWFnX2ZhbWlseTsKKwlfX3U4CXNkaWFnX3Byb3RvY29sOworCV9fdTE2CXBhZDsKKwlfX3UzMgl1ZGlhZ19zdGF0ZXM7CisJX191MzIJdWRpYWdfaW5vOworCV9fdTMyCXVkaWFnX3Nob3c7CisJX191MzIJdWRpYWdfY29va2llWzJdOworfTsKKworI2RlZmluZSBVRElBR19TSE9XX05BTUUJCTB4MDAwMDAwMDEJLyogc2hvdyBuYW1lIChub3QgcGF0aCkgKi8KKyNkZWZpbmUgVURJQUdfU0hPV19WRlMJCTB4MDAwMDAwMDIJLyogc2hvdyBWRlMgaW5vZGUgaW5mbyAqLworI2RlZmluZSBVRElBR19TSE9XX1BFRVIJCTB4MDAwMDAwMDQJLyogc2hvdyBwZWVyIHNvY2tldCBpbmZvICovCisjZGVmaW5lIFVESUFHX1NIT1dfSUNPTlMJMHgwMDAwMDAwOAkvKiBzaG93IHBlbmRpbmcgY29ubmVjdGlvbnMgKi8KKyNkZWZpbmUgVURJQUdfU0hPV19SUUxFTgkweDAwMDAwMDEwCS8qIHNob3cgc2tiIHJlY2VpdmUgcXVldWUgbGVuICovCisjZGVmaW5lIFVESUFHX1NIT1dfTUVNSU5GTwkweDAwMDAwMDIwCS8qIHNob3cgbWVtb3J5IGluZm8gb2YgYSBzb2NrZXQgKi8KKworc3RydWN0IHVuaXhfZGlhZ19tc2cgeworCV9fdTgJdWRpYWdfZmFtaWx5OworCV9fdTgJdWRpYWdfdHlwZTsKKwlfX3U4CXVkaWFnX3N0YXRlOworCV9fdTgJcGFkOworCisJX191MzIJdWRpYWdfaW5vOworCV9fdTMyCXVkaWFnX2Nvb2tpZVsyXTsKK307CisKK2VudW0geworCS8qIFVOSVhfRElBR19OT05FLCBzdGFuZGFyZCBubCBBUEkgcmVxdWlyZXMgdGhpcyBhdHRyaWJ1dGUhICAqLworCVVOSVhfRElBR19OQU1FLAorCVVOSVhfRElBR19WRlMsCisJVU5JWF9ESUFHX1BFRVIsCisJVU5JWF9ESUFHX0lDT05TLAorCVVOSVhfRElBR19SUUxFTiwKKwlVTklYX0RJQUdfTUVNSU5GTywKKwlVTklYX0RJQUdfU0hVVERPV04sCisKKwlfX1VOSVhfRElBR19NQVgsCit9OworCisjZGVmaW5lIFVOSVhfRElBR19NQVggKF9fVU5JWF9ESUFHX01BWCAtIDEpCisKK3N0cnVjdCB1bml4X2RpYWdfdmZzIHsKKwlfX3UzMgl1ZGlhZ192ZnNfaW5vOworCV9fdTMyCXVkaWFnX3Zmc19kZXY7Cit9OworCitzdHJ1Y3QgdW5peF9kaWFnX3JxbGVuIHsKKwlfX3UzMgl1ZGlhZ19ycXVldWU7CisJX191MzIJdWRpYWdfd3F1ZXVlOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3ZldGguaCBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgvdmV0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNTRjMWUKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pbmNsdWRlL2xpbnV4L3ZldGguaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9fTkVUX1ZFVEhfSF8KKyNkZWZpbmUgX19ORVRfVkVUSF9IXworCitlbnVtIHsKKwlWRVRIX0lORk9fVU5TUEVDLAorCVZFVEhfSU5GT19QRUVSLAorCisJX19WRVRIX0lORk9fTUFYCisjZGVmaW5lIFZFVEhfSU5GT19NQVgJKF9fVkVUSF9JTkZPX01BWCAtIDEpCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2luY2x1ZGUvbGludXgveGZybS5oIGIvaXByb3V0ZTIvaW5jbHVkZS9saW51eC94ZnJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhmNTQ1MQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvbGludXgveGZybS5oCkBAIC0wLDAgKzEsNTI2IEBACisjaWZuZGVmIF9MSU5VWF9YRlJNX0gKKyNkZWZpbmUgX0xJTlVYX1hGUk1fSAorCisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogQWxsIG9mIHRoZSBzdHJ1Y3R1cmVzIGluIHRoaXMgZmlsZSBtYXkgbm90IGNoYW5nZSBzaXplIGFzIHRoZXkgYXJlCisgKiBwYXNzZWQgaW50byB0aGUga2VybmVsIGZyb20gdXNlcnNwYWNlIHZpYSBuZXRsaW5rIHNvY2tldHMuCisgKi8KKworLyogU3RydWN0dXJlIHRvIGVuY2Fwc3VsYXRlIGFkZHJlc3Nlcy4gSSBkbyBub3Qgd2FudCB0byB1c2UKKyAqICJzdGFuZGFyZCIgc3RydWN0dXJlLiBNeSBhcG9sb2dpZXMuCisgKi8KK3R5cGVkZWYgdW5pb24geworCV9fYmUzMgkJYTQ7CisJX19iZTMyCQlhNls0XTsKKwlzdHJ1Y3QgaW42X2FkZHIJaW42OworfSB4ZnJtX2FkZHJlc3NfdDsKKworLyogSWRlbnQgb2YgYSBzcGVjaWZpYyB4ZnJtX3N0YXRlLiBJdCBpcyB1c2VkIG9uIGlucHV0IHRvIGxvb2t1cAorICogdGhlIHN0YXRlIGJ5IChzcGksZGFkZHIsYWgvZXNwKSBvciB0byBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dAorICogc3BpLCBwcm90b2NvbCBhbmQgdHVubmVsIGFkZHJlc3Mgb24gb3V0cHV0LgorICovCitzdHJ1Y3QgeGZybV9pZCB7CisJeGZybV9hZGRyZXNzX3QJZGFkZHI7CisJX19iZTMyCQlzcGk7CisJX191OAkJcHJvdG87Cit9OworCitzdHJ1Y3QgeGZybV9zZWNfY3R4IHsKKwlfX3U4CWN0eF9kb2k7CisJX191OAljdHhfYWxnOworCV9fdTE2CWN0eF9sZW47CisJX191MzIJY3R4X3NpZDsKKwljaGFyCWN0eF9zdHJbMF07Cit9OworCisvKiBTZWN1cml0eSBDb250ZXh0IERvbWFpbnMgb2YgSW50ZXJwcmV0YXRpb24gKi8KKyNkZWZpbmUgWEZSTV9TQ19ET0lfUkVTRVJWRUQgMAorI2RlZmluZSBYRlJNX1NDX0RPSV9MU00gMQorCisvKiBTZWN1cml0eSBDb250ZXh0IEFsZ29yaXRobXMgKi8KKyNkZWZpbmUgWEZSTV9TQ19BTEdfUkVTRVJWRUQgMAorI2RlZmluZSBYRlJNX1NDX0FMR19TRUxJTlVYIDEKKworLyogU2VsZWN0b3IsIHVzZWQgYXMgc2VsZWN0b3IgYm90aCBvbiBwb2xpY3kgcnVsZXMgKFNQRCkgYW5kIFNBcy4gKi8KKworc3RydWN0IHhmcm1fc2VsZWN0b3IgeworCXhmcm1fYWRkcmVzc190CWRhZGRyOworCXhmcm1fYWRkcmVzc190CXNhZGRyOworCV9fYmUxNglkcG9ydDsKKwlfX2JlMTYJZHBvcnRfbWFzazsKKwlfX2JlMTYJc3BvcnQ7CisJX19iZTE2CXNwb3J0X21hc2s7CisJX191MTYJZmFtaWx5OworCV9fdTgJcHJlZml4bGVuX2Q7CisJX191OAlwcmVmaXhsZW5fczsKKwlfX3U4CXByb3RvOworCWludAlpZmluZGV4OworCV9fa2VybmVsX3VpZDMyX3QJdXNlcjsKK307CisKKyNkZWZpbmUgWEZSTV9JTkYgKH4oX191NjQpMCkKKworc3RydWN0IHhmcm1fbGlmZXRpbWVfY2ZnIHsKKwlfX3U2NAlzb2Z0X2J5dGVfbGltaXQ7CisJX191NjQJaGFyZF9ieXRlX2xpbWl0OworCV9fdTY0CXNvZnRfcGFja2V0X2xpbWl0OworCV9fdTY0CWhhcmRfcGFja2V0X2xpbWl0OworCV9fdTY0CXNvZnRfYWRkX2V4cGlyZXNfc2Vjb25kczsKKwlfX3U2NAloYXJkX2FkZF9leHBpcmVzX3NlY29uZHM7CisJX191NjQJc29mdF91c2VfZXhwaXJlc19zZWNvbmRzOworCV9fdTY0CWhhcmRfdXNlX2V4cGlyZXNfc2Vjb25kczsKK307CisKK3N0cnVjdCB4ZnJtX2xpZmV0aW1lX2N1ciB7CisJX191NjQJYnl0ZXM7CisJX191NjQJcGFja2V0czsKKwlfX3U2NAlhZGRfdGltZTsKKwlfX3U2NAl1c2VfdGltZTsKK307CisKK3N0cnVjdCB4ZnJtX3JlcGxheV9zdGF0ZSB7CisJX191MzIJb3NlcTsKKwlfX3UzMglzZXE7CisJX191MzIJYml0bWFwOworfTsKKworI2RlZmluZSBYRlJNQV9SRVBMQVlfRVNOX01BWAk0MDk2CisKK3N0cnVjdCB4ZnJtX3JlcGxheV9zdGF0ZV9lc24geworCXVuc2lnbmVkIGludAlibXBfbGVuOworCV9fdTMyCQlvc2VxOworCV9fdTMyCQlzZXE7CisJX191MzIJCW9zZXFfaGk7CisJX191MzIJCXNlcV9oaTsKKwlfX3UzMgkJcmVwbGF5X3dpbmRvdzsKKwlfX3UzMgkJYm1wWzBdOworfTsKKworc3RydWN0IHhmcm1fYWxnbyB7CisJY2hhcgkJYWxnX25hbWVbNjRdOworCXVuc2lnbmVkIGludAlhbGdfa2V5X2xlbjsgICAgLyogaW4gYml0cyAqLworCWNoYXIJCWFsZ19rZXlbMF07Cit9OworCitzdHJ1Y3QgeGZybV9hbGdvX2F1dGggeworCWNoYXIJCWFsZ19uYW1lWzY0XTsKKwl1bnNpZ25lZCBpbnQJYWxnX2tleV9sZW47ICAgIC8qIGluIGJpdHMgKi8KKwl1bnNpZ25lZCBpbnQJYWxnX3RydW5jX2xlbjsgIC8qIGluIGJpdHMgKi8KKwljaGFyCQlhbGdfa2V5WzBdOworfTsKKworc3RydWN0IHhmcm1fYWxnb19hZWFkIHsKKwljaGFyCQlhbGdfbmFtZVs2NF07CisJdW5zaWduZWQgaW50CWFsZ19rZXlfbGVuOwkvKiBpbiBiaXRzICovCisJdW5zaWduZWQgaW50CWFsZ19pY3ZfbGVuOwkvKiBpbiBiaXRzICovCisJY2hhcgkJYWxnX2tleVswXTsKK307CisKK3N0cnVjdCB4ZnJtX3N0YXRzIHsKKwlfX3UzMglyZXBsYXlfd2luZG93OworCV9fdTMyCXJlcGxheTsKKwlfX3UzMglpbnRlZ3JpdHlfZmFpbGVkOworfTsKKworZW51bSB7CisJWEZSTV9QT0xJQ1lfVFlQRV9NQUlOCT0gMCwKKwlYRlJNX1BPTElDWV9UWVBFX1NVQgk9IDEsCisJWEZSTV9QT0xJQ1lfVFlQRV9NQVgJPSAyLAorCVhGUk1fUE9MSUNZX1RZUEVfQU5ZCT0gMjU1Cit9OworCitlbnVtIHsKKwlYRlJNX1BPTElDWV9JTgk9IDAsCisJWEZSTV9QT0xJQ1lfT1VUCT0gMSwKKwlYRlJNX1BPTElDWV9GV0QJPSAyLAorCVhGUk1fUE9MSUNZX01BU0sgPSAzLAorCVhGUk1fUE9MSUNZX01BWAk9IDMKK307CisKK2VudW0geworCVhGUk1fU0hBUkVfQU5ZLAkJLyogTm8gbGltaXRhdGlvbnMgKi8KKwlYRlJNX1NIQVJFX1NFU1NJT04sCS8qIEZvciB0aGlzIHNlc3Npb24gb25seSAqLworCVhGUk1fU0hBUkVfVVNFUiwJLyogRm9yIHRoaXMgdXNlciBvbmx5ICovCisJWEZSTV9TSEFSRV9VTklRVUUJLyogVXNlIG9uY2UgKi8KK307CisKKyNkZWZpbmUgWEZSTV9NT0RFX1RSQU5TUE9SVCAwCisjZGVmaW5lIFhGUk1fTU9ERV9UVU5ORUwgMQorI2RlZmluZSBYRlJNX01PREVfUk9VVEVPUFRJTUlaQVRJT04gMgorI2RlZmluZSBYRlJNX01PREVfSU5fVFJJR0dFUiAzCisjZGVmaW5lIFhGUk1fTU9ERV9CRUVUIDQKKyNkZWZpbmUgWEZSTV9NT0RFX01BWCA1CisKKy8qIE5ldGxpbmsgY29uZmlndXJhdGlvbiBtZXNzYWdlcy4gICovCitlbnVtIHsKKwlYRlJNX01TR19CQVNFID0gMHgxMCwKKworCVhGUk1fTVNHX05FV1NBID0gMHgxMCwKKyNkZWZpbmUgWEZSTV9NU0dfTkVXU0EgWEZSTV9NU0dfTkVXU0EKKwlYRlJNX01TR19ERUxTQSwKKyNkZWZpbmUgWEZSTV9NU0dfREVMU0EgWEZSTV9NU0dfREVMU0EKKwlYRlJNX01TR19HRVRTQSwKKyNkZWZpbmUgWEZSTV9NU0dfR0VUU0EgWEZSTV9NU0dfR0VUU0EKKworCVhGUk1fTVNHX05FV1BPTElDWSwKKyNkZWZpbmUgWEZSTV9NU0dfTkVXUE9MSUNZIFhGUk1fTVNHX05FV1BPTElDWQorCVhGUk1fTVNHX0RFTFBPTElDWSwKKyNkZWZpbmUgWEZSTV9NU0dfREVMUE9MSUNZIFhGUk1fTVNHX0RFTFBPTElDWQorCVhGUk1fTVNHX0dFVFBPTElDWSwKKyNkZWZpbmUgWEZSTV9NU0dfR0VUUE9MSUNZIFhGUk1fTVNHX0dFVFBPTElDWQorCisJWEZSTV9NU0dfQUxMT0NTUEksCisjZGVmaW5lIFhGUk1fTVNHX0FMTE9DU1BJIFhGUk1fTVNHX0FMTE9DU1BJCisJWEZSTV9NU0dfQUNRVUlSRSwKKyNkZWZpbmUgWEZSTV9NU0dfQUNRVUlSRSBYRlJNX01TR19BQ1FVSVJFCisJWEZSTV9NU0dfRVhQSVJFLAorI2RlZmluZSBYRlJNX01TR19FWFBJUkUgWEZSTV9NU0dfRVhQSVJFCisKKwlYRlJNX01TR19VUERQT0xJQ1ksCisjZGVmaW5lIFhGUk1fTVNHX1VQRFBPTElDWSBYRlJNX01TR19VUERQT0xJQ1kKKwlYRlJNX01TR19VUERTQSwKKyNkZWZpbmUgWEZSTV9NU0dfVVBEU0EgWEZSTV9NU0dfVVBEU0EKKworCVhGUk1fTVNHX1BPTEVYUElSRSwKKyNkZWZpbmUgWEZSTV9NU0dfUE9MRVhQSVJFIFhGUk1fTVNHX1BPTEVYUElSRQorCisJWEZSTV9NU0dfRkxVU0hTQSwKKyNkZWZpbmUgWEZSTV9NU0dfRkxVU0hTQSBYRlJNX01TR19GTFVTSFNBCisJWEZSTV9NU0dfRkxVU0hQT0xJQ1ksCisjZGVmaW5lIFhGUk1fTVNHX0ZMVVNIUE9MSUNZIFhGUk1fTVNHX0ZMVVNIUE9MSUNZCisKKwlYRlJNX01TR19ORVdBRSwKKyNkZWZpbmUgWEZSTV9NU0dfTkVXQUUgWEZSTV9NU0dfTkVXQUUKKwlYRlJNX01TR19HRVRBRSwKKyNkZWZpbmUgWEZSTV9NU0dfR0VUQUUgWEZSTV9NU0dfR0VUQUUKKworCVhGUk1fTVNHX1JFUE9SVCwKKyNkZWZpbmUgWEZSTV9NU0dfUkVQT1JUIFhGUk1fTVNHX1JFUE9SVAorCisJWEZSTV9NU0dfTUlHUkFURSwKKyNkZWZpbmUgWEZSTV9NU0dfTUlHUkFURSBYRlJNX01TR19NSUdSQVRFCisKKwlYRlJNX01TR19ORVdTQURJTkZPLAorI2RlZmluZSBYRlJNX01TR19ORVdTQURJTkZPIFhGUk1fTVNHX05FV1NBRElORk8KKwlYRlJNX01TR19HRVRTQURJTkZPLAorI2RlZmluZSBYRlJNX01TR19HRVRTQURJTkZPIFhGUk1fTVNHX0dFVFNBRElORk8KKworCVhGUk1fTVNHX05FV1NQRElORk8sCisjZGVmaW5lIFhGUk1fTVNHX05FV1NQRElORk8gWEZSTV9NU0dfTkVXU1BESU5GTworCVhGUk1fTVNHX0dFVFNQRElORk8sCisjZGVmaW5lIFhGUk1fTVNHX0dFVFNQRElORk8gWEZSTV9NU0dfR0VUU1BESU5GTworCisJWEZSTV9NU0dfTUFQUElORywKKyNkZWZpbmUgWEZSTV9NU0dfTUFQUElORyBYRlJNX01TR19NQVBQSU5HCisJX19YRlJNX01TR19NQVgKK307CisjZGVmaW5lIFhGUk1fTVNHX01BWCAoX19YRlJNX01TR19NQVggLSAxKQorCisjZGVmaW5lIFhGUk1fTlJfTVNHVFlQRVMgKFhGUk1fTVNHX01BWCArIDEgLSBYRlJNX01TR19CQVNFKQorCisvKgorICogR2VuZXJpYyBMU00gc2VjdXJpdHkgY29udGV4dCBmb3IgY29tdW5pY2F0aW5nIHRvIHVzZXIgc3BhY2UKKyAqIE5PVEU6IFNhbWUgZm9ybWF0IGFzIHNhZGJfeF9zZWNfY3R4CisgKi8KK3N0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCB7CisJX191MTYJCQlsZW47CisJX191MTYJCQlleHR0eXBlOworCV9fdTgJCQljdHhfYWxnOyAgLyogTFNNczogZS5nLiwgc2VsaW51eCA9PSAxICovCisJX191OAkJCWN0eF9kb2k7CisJX191MTYJCQljdHhfbGVuOworfTsKKworc3RydWN0IHhmcm1fdXNlcl90bXBsIHsKKwlzdHJ1Y3QgeGZybV9pZAkJaWQ7CisJX191MTYJCQlmYW1pbHk7CisJeGZybV9hZGRyZXNzX3QJCXNhZGRyOworCV9fdTMyCQkJcmVxaWQ7CisJX191OAkJCW1vZGU7CisJX191OAkJCXNoYXJlOworCV9fdTgJCQlvcHRpb25hbDsKKwlfX3UzMgkJCWFhbGdvczsKKwlfX3UzMgkJCWVhbGdvczsKKwlfX3UzMgkJCWNhbGdvczsKK307CisKK3N0cnVjdCB4ZnJtX2VuY2FwX3RtcGwgeworCV9fdTE2CQllbmNhcF90eXBlOworCV9fYmUxNgkJZW5jYXBfc3BvcnQ7CisJX19iZTE2CQllbmNhcF9kcG9ydDsKKwl4ZnJtX2FkZHJlc3NfdAllbmNhcF9vYTsKK307CisKKy8qIEFFVkVOVCBmbGFncyAgKi8KK2VudW0geGZybV9hZV9mdHlwZV90IHsKKwlYRlJNX0FFX1VOU1BFQywKKwlYRlJNX0FFX1JUSFI9MSwJLyogcmVwbGF5IHRocmVzaG9sZCovCisJWEZSTV9BRV9SVkFMPTIsIC8qIHJlcGxheSB2YWx1ZSAqLworCVhGUk1fQUVfTFZBTD00LCAvKiBsaWZldGltZSB2YWx1ZSAqLworCVhGUk1fQUVfRVRIUj04LCAvKiBleHBpcnkgdGltZXIgdGhyZXNob2xkICovCisJWEZSTV9BRV9DUj0xNiwgLyogRXZlbnQgY2F1c2UgaXMgcmVwbGF5IHVwZGF0ZSAqLworCVhGUk1fQUVfQ0U9MzIsIC8qIEV2ZW50IGNhdXNlIGlzIHRpbWVyIGV4cGlyeSAqLworCVhGUk1fQUVfQ1U9NjQsIC8qIEV2ZW50IGNhdXNlIGlzIHBvbGljeSB1cGRhdGUgKi8KKwlfX1hGUk1fQUVfTUFYCisKKyNkZWZpbmUgWEZSTV9BRV9NQVggKF9fWEZSTV9BRV9NQVggLSAxKQorfTsKKworc3RydWN0IHhmcm1fdXNlcnBvbGljeV90eXBlIHsKKwlfX3U4CQl0eXBlOworCV9fdTE2CQlyZXNlcnZlZDE7CisJX191OAkJcmVzZXJ2ZWQyOworfTsKKworLyogTmV0bGluayBtZXNzYWdlIGF0dHJpYnV0ZXMuICAqLworZW51bSB4ZnJtX2F0dHJfdHlwZV90IHsKKwlYRlJNQV9VTlNQRUMsCisJWEZSTUFfQUxHX0FVVEgsCQkvKiBzdHJ1Y3QgeGZybV9hbGdvICovCisJWEZSTUFfQUxHX0NSWVBULAkvKiBzdHJ1Y3QgeGZybV9hbGdvICovCisJWEZSTUFfQUxHX0NPTVAsCQkvKiBzdHJ1Y3QgeGZybV9hbGdvICovCisJWEZSTUFfRU5DQVAsCQkvKiBzdHJ1Y3QgeGZybV9hbGdvICsgc3RydWN0IHhmcm1fZW5jYXBfdG1wbCAqLworCVhGUk1BX1RNUEwsCQkvKiAxIG9yIG1vcmUgc3RydWN0IHhmcm1fdXNlcl90bXBsICovCisJWEZSTUFfU0EsCQkvKiBzdHJ1Y3QgeGZybV91c2Vyc2FfaW5mbyAgKi8KKwlYRlJNQV9QT0xJQ1ksCQkvKnN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfaW5mbyAqLworCVhGUk1BX1NFQ19DVFgsCQkvKiBzdHJ1Y3QgeGZybV9zZWNfY3R4ICovCisJWEZSTUFfTFRJTUVfVkFMLAorCVhGUk1BX1JFUExBWV9WQUwsCisJWEZSTUFfUkVQTEFZX1RIUkVTSCwKKwlYRlJNQV9FVElNRVJfVEhSRVNILAorCVhGUk1BX1NSQ0FERFIsCQkvKiB4ZnJtX2FkZHJlc3NfdCAqLworCVhGUk1BX0NPQUREUiwJCS8qIHhmcm1fYWRkcmVzc190ICovCisJWEZSTUFfTEFTVFVTRUQsCQkvKiB1bnNpZ25lZCBsb25nICAqLworCVhGUk1BX1BPTElDWV9UWVBFLAkvKiBzdHJ1Y3QgeGZybV91c2VycG9saWN5X3R5cGUgKi8KKwlYRlJNQV9NSUdSQVRFLAorCVhGUk1BX0FMR19BRUFELAkJLyogc3RydWN0IHhmcm1fYWxnb19hZWFkICovCisJWEZSTUFfS01BRERSRVNTLCAgICAgICAgLyogc3RydWN0IHhmcm1fdXNlcl9rbWFkZHJlc3MgKi8KKwlYRlJNQV9BTEdfQVVUSF9UUlVOQywJLyogc3RydWN0IHhmcm1fYWxnb19hdXRoICovCisJWEZSTUFfTUFSSywJCS8qIHN0cnVjdCB4ZnJtX21hcmsgKi8KKwlYRlJNQV9URkNQQUQsCQkvKiBfX3UzMiAqLworCVhGUk1BX1JFUExBWV9FU05fVkFMLAkvKiBzdHJ1Y3QgeGZybV9yZXBsYXlfZXNuICovCisJWEZSTUFfU0FfRVhUUkFfRkxBR1MsCS8qIF9fdTMyICovCisJWEZSTUFfUFJPVE8sCQkvKiBfX3U4ICovCisJWEZSTUFfQUREUkVTU19GSUxURVIsCS8qIHN0cnVjdCB4ZnJtX2FkZHJlc3NfZmlsdGVyICovCisJX19YRlJNQV9NQVgKKworI2RlZmluZSBYRlJNQV9NQVggKF9fWEZSTUFfTUFYIC0gMSkKK307CisKK3N0cnVjdCB4ZnJtX21hcmsgeworCV9fdTMyICAgICAgICAgICB2OyAvKiB2YWx1ZSAqLworCV9fdTMyICAgICAgICAgICBtOyAvKiBtYXNrICovCit9OworCitlbnVtIHhmcm1fc2FkYXR0cl90eXBlX3QgeworCVhGUk1BX1NBRF9VTlNQRUMsCisJWEZSTUFfU0FEX0NOVCwKKwlYRlJNQV9TQURfSElORk8sCisJX19YRlJNQV9TQURfTUFYCisKKyNkZWZpbmUgWEZSTUFfU0FEX01BWCAoX19YRlJNQV9TQURfTUFYIC0gMSkKK307CisKK3N0cnVjdCB4ZnJtdV9zYWRoaW5mbyB7CisJX191MzIgc2FkaGNudDsgLyogY3VycmVudCBoYXNoIGJrdHMgKi8KKwlfX3UzMiBzYWRobWNudDsgLyogbWF4IGFsbG93ZWQgaGFzaCBia3RzICovCit9OworCitlbnVtIHhmcm1fc3BkYXR0cl90eXBlX3QgeworCVhGUk1BX1NQRF9VTlNQRUMsCisJWEZSTUFfU1BEX0lORk8sCisJWEZSTUFfU1BEX0hJTkZPLAorCVhGUk1BX1NQRF9JUFY0X0hUSFJFU0gsCisJWEZSTUFfU1BEX0lQVjZfSFRIUkVTSCwKKwlfX1hGUk1BX1NQRF9NQVgKKworI2RlZmluZSBYRlJNQV9TUERfTUFYIChfX1hGUk1BX1NQRF9NQVggLSAxKQorfTsKKworc3RydWN0IHhmcm11X3NwZGluZm8geworCV9fdTMyIGluY250OworCV9fdTMyIG91dGNudDsKKwlfX3UzMiBmd2RjbnQ7CisJX191MzIgaW5zY250OworCV9fdTMyIG91dHNjbnQ7CisJX191MzIgZndkc2NudDsKK307CisKK3N0cnVjdCB4ZnJtdV9zcGRoaW5mbyB7CisJX191MzIgc3BkaGNudDsKKwlfX3UzMiBzcGRobWNudDsKK307CisKK3N0cnVjdCB4ZnJtdV9zcGRodGhyZXNoIHsKKwlfX3U4IGxiaXRzOworCV9fdTggcmJpdHM7Cit9OworCitzdHJ1Y3QgeGZybV91c2Vyc2FfaW5mbyB7CisJc3RydWN0IHhmcm1fc2VsZWN0b3IJCXNlbDsKKwlzdHJ1Y3QgeGZybV9pZAkJCWlkOworCXhmcm1fYWRkcmVzc190CQkJc2FkZHI7CisJc3RydWN0IHhmcm1fbGlmZXRpbWVfY2ZnCWxmdDsKKwlzdHJ1Y3QgeGZybV9saWZldGltZV9jdXIJY3VybGZ0OworCXN0cnVjdCB4ZnJtX3N0YXRzCQlzdGF0czsKKwlfX3UzMgkJCQlzZXE7CisJX191MzIJCQkJcmVxaWQ7CisJX191MTYJCQkJZmFtaWx5OworCV9fdTgJCQkJbW9kZTsJCS8qIFhGUk1fTU9ERV94eHggKi8KKwlfX3U4CQkJCXJlcGxheV93aW5kb3c7CisJX191OAkJCQlmbGFnczsKKyNkZWZpbmUgWEZSTV9TVEFURV9OT0VDTgkxCisjZGVmaW5lIFhGUk1fU1RBVEVfREVDQVBfRFNDUAkyCisjZGVmaW5lIFhGUk1fU1RBVEVfTk9QTVRVRElTQwk0CisjZGVmaW5lIFhGUk1fU1RBVEVfV0lMRFJFQ1YJOAorI2RlZmluZSBYRlJNX1NUQVRFX0lDTVAJCTE2CisjZGVmaW5lIFhGUk1fU1RBVEVfQUZfVU5TUEVDCTMyCisjZGVmaW5lIFhGUk1fU1RBVEVfQUxJR040CTY0CisjZGVmaW5lIFhGUk1fU1RBVEVfRVNOCQkxMjgKK307CisKKyNkZWZpbmUgWEZSTV9TQV9YRkxBR19ET05UX0VOQ0FQX0RTQ1AJMQorCitzdHJ1Y3QgeGZybV91c2Vyc2FfaWQgeworCXhmcm1fYWRkcmVzc190CQkJZGFkZHI7CisJX19iZTMyCQkJCXNwaTsKKwlfX3UxNgkJCQlmYW1pbHk7CisJX191OAkJCQlwcm90bzsKK307CisKK3N0cnVjdCB4ZnJtX2FldmVudF9pZCB7CisJc3RydWN0IHhmcm1fdXNlcnNhX2lkCQlzYV9pZDsKKwl4ZnJtX2FkZHJlc3NfdAkJCXNhZGRyOworCV9fdTMyCQkJCWZsYWdzOworCV9fdTMyCQkJCXJlcWlkOworfTsKKworc3RydWN0IHhmcm1fdXNlcnNwaV9pbmZvIHsKKwlzdHJ1Y3QgeGZybV91c2Vyc2FfaW5mbwkJaW5mbzsKKwlfX3UzMgkJCQltaW47CisJX191MzIJCQkJbWF4OworfTsKKworc3RydWN0IHhmcm1fdXNlcnBvbGljeV9pbmZvIHsKKwlzdHJ1Y3QgeGZybV9zZWxlY3RvcgkJc2VsOworCXN0cnVjdCB4ZnJtX2xpZmV0aW1lX2NmZwlsZnQ7CisJc3RydWN0IHhmcm1fbGlmZXRpbWVfY3VyCWN1cmxmdDsKKwlfX3UzMgkJCQlwcmlvcml0eTsKKwlfX3UzMgkJCQlpbmRleDsKKwlfX3U4CQkJCWRpcjsKKwlfX3U4CQkJCWFjdGlvbjsKKyNkZWZpbmUgWEZSTV9QT0xJQ1lfQUxMT1cJMAorI2RlZmluZSBYRlJNX1BPTElDWV9CTE9DSwkxCisJX191OAkJCQlmbGFnczsKKyNkZWZpbmUgWEZSTV9QT0xJQ1lfTE9DQUxPSwkxCS8qIEFsbG93IHVzZXIgdG8gb3ZlcnJpZGUgZ2xvYmFsIHBvbGljeSAqLworCS8qIEF1dG9tYXRpY2FsbHkgZXhwYW5kIHNlbGVjdG9yIHRvIGluY2x1ZGUgbWF0Y2hpbmcgSUNNUCBwYXlsb2Fkcy4gKi8KKyNkZWZpbmUgWEZSTV9QT0xJQ1lfSUNNUAkyCisJX191OAkJCQlzaGFyZTsKK307CisKK3N0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfaWQgeworCXN0cnVjdCB4ZnJtX3NlbGVjdG9yCQlzZWw7CisJX191MzIJCQkJaW5kZXg7CisJX191OAkJCQlkaXI7Cit9OworCitzdHJ1Y3QgeGZybV91c2VyX2FjcXVpcmUgeworCXN0cnVjdCB4ZnJtX2lkCQkJaWQ7CisJeGZybV9hZGRyZXNzX3QJCQlzYWRkcjsKKwlzdHJ1Y3QgeGZybV9zZWxlY3RvcgkJc2VsOworCXN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfaW5mbwlwb2xpY3k7CisJX191MzIJCQkJYWFsZ29zOworCV9fdTMyCQkJCWVhbGdvczsKKwlfX3UzMgkJCQljYWxnb3M7CisJX191MzIJCQkJc2VxOworfTsKKworc3RydWN0IHhmcm1fdXNlcl9leHBpcmUgeworCXN0cnVjdCB4ZnJtX3VzZXJzYV9pbmZvCQlzdGF0ZTsKKwlfX3U4CQkJCWhhcmQ7Cit9OworCitzdHJ1Y3QgeGZybV91c2VyX3BvbGV4cGlyZSB7CisJc3RydWN0IHhmcm1fdXNlcnBvbGljeV9pbmZvCXBvbDsKKwlfX3U4CQkJCWhhcmQ7Cit9OworCitzdHJ1Y3QgeGZybV91c2Vyc2FfZmx1c2ggeworCV9fdTgJCQkJcHJvdG87Cit9OworCitzdHJ1Y3QgeGZybV91c2VyX3JlcG9ydCB7CisJX191OAkJCQlwcm90bzsKKwlzdHJ1Y3QgeGZybV9zZWxlY3RvcgkJc2VsOworfTsKKworLyogVXNlZCBieSBNSUdSQVRFIHRvIHBhc3MgYWRkcmVzc2VzIElLRSBzaG91bGQgdXNlIHRvIHBlcmZvcm0KKyAqIFNBIG5lZ290aWF0aW9uIHdpdGggdGhlIHBlZXIgKi8KK3N0cnVjdCB4ZnJtX3VzZXJfa21hZGRyZXNzIHsKKwl4ZnJtX2FkZHJlc3NfdCAgICAgICAgICAgICAgICAgIGxvY2FsOworCXhmcm1fYWRkcmVzc190ICAgICAgICAgICAgICAgICAgcmVtb3RlOworCV9fdTMyCQkJCXJlc2VydmVkOworCV9fdTE2CQkJCWZhbWlseTsKK307CisKK3N0cnVjdCB4ZnJtX3VzZXJfbWlncmF0ZSB7CisJeGZybV9hZGRyZXNzX3QJCQlvbGRfZGFkZHI7CisJeGZybV9hZGRyZXNzX3QJCQlvbGRfc2FkZHI7CisJeGZybV9hZGRyZXNzX3QJCQluZXdfZGFkZHI7CisJeGZybV9hZGRyZXNzX3QJCQluZXdfc2FkZHI7CisJX191OAkJCQlwcm90bzsKKwlfX3U4CQkJCW1vZGU7CisJX191MTYJCQkJcmVzZXJ2ZWQ7CisJX191MzIJCQkJcmVxaWQ7CisJX191MTYJCQkJb2xkX2ZhbWlseTsKKwlfX3UxNgkJCQluZXdfZmFtaWx5OworfTsKKworc3RydWN0IHhmcm1fdXNlcl9tYXBwaW5nIHsKKwlzdHJ1Y3QgeGZybV91c2Vyc2FfaWQJCWlkOworCV9fdTMyCQkJCXJlcWlkOworCXhmcm1fYWRkcmVzc190CQkJb2xkX3NhZGRyOworCXhmcm1fYWRkcmVzc190CQkJbmV3X3NhZGRyOworCV9fYmUxNgkJCQlvbGRfc3BvcnQ7CisJX19iZTE2CQkJCW5ld19zcG9ydDsKK307CisKK3N0cnVjdCB4ZnJtX2FkZHJlc3NfZmlsdGVyIHsKKwl4ZnJtX2FkZHJlc3NfdAkJCXNhZGRyOworCXhmcm1fYWRkcmVzc190CQkJZGFkZHI7CisJX191MTYJCQkJZmFtaWx5OworCV9fdTgJCQkJc3BsZW47CisJX191OAkJCQlkcGxlbjsKK307CisKKy8qIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciB1c2Vyc3BhY2UgKi8KKyNkZWZpbmUgWEZSTUdSUF9BQ1FVSVJFCQkxCisjZGVmaW5lIFhGUk1HUlBfRVhQSVJFCQkyCisjZGVmaW5lIFhGUk1HUlBfU0EJCTQKKyNkZWZpbmUgWEZSTUdSUF9QT0xJQ1kJCTgKKyNkZWZpbmUgWEZSTUdSUF9SRVBPUlQJCTB4MjAKKworZW51bSB4ZnJtX25sZ3JvdXBzIHsKKwlYRlJNTkxHUlBfTk9ORSwKKyNkZWZpbmUgWEZSTU5MR1JQX05PTkUJCVhGUk1OTEdSUF9OT05FCisJWEZSTU5MR1JQX0FDUVVJUkUsCisjZGVmaW5lIFhGUk1OTEdSUF9BQ1FVSVJFCVhGUk1OTEdSUF9BQ1FVSVJFCisJWEZSTU5MR1JQX0VYUElSRSwKKyNkZWZpbmUgWEZSTU5MR1JQX0VYUElSRQlYRlJNTkxHUlBfRVhQSVJFCisJWEZSTU5MR1JQX1NBLAorI2RlZmluZSBYRlJNTkxHUlBfU0EJCVhGUk1OTEdSUF9TQQorCVhGUk1OTEdSUF9QT0xJQ1ksCisjZGVmaW5lIFhGUk1OTEdSUF9QT0xJQ1kJWEZSTU5MR1JQX1BPTElDWQorCVhGUk1OTEdSUF9BRVZFTlRTLAorI2RlZmluZSBYRlJNTkxHUlBfQUVWRU5UUwlYRlJNTkxHUlBfQUVWRU5UUworCVhGUk1OTEdSUF9SRVBPUlQsCisjZGVmaW5lIFhGUk1OTEdSUF9SRVBPUlQJWEZSTU5MR1JQX1JFUE9SVAorCVhGUk1OTEdSUF9NSUdSQVRFLAorI2RlZmluZSBYRlJNTkxHUlBfTUlHUkFURQlYRlJNTkxHUlBfTUlHUkFURQorCVhGUk1OTEdSUF9NQVBQSU5HLAorI2RlZmluZSBYRlJNTkxHUlBfTUFQUElORwlYRlJNTkxHUlBfTUFQUElORworCV9fWEZSTU5MR1JQX01BWAorfTsKKyNkZWZpbmUgWEZSTU5MR1JQX01BWAkoX19YRlJNTkxHUlBfTUFYIC0gMSkKKworI2VuZGlmIC8qIF9MSU5VWF9YRlJNX0ggKi8KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2luY2x1ZGUvbGxfbWFwLmggYi9pcHJvdXRlMi9pbmNsdWRlL2xsX21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OWJmYzMKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pbmNsdWRlL2xsX21hcC5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgX19MTF9NQVBfSF9fCisjZGVmaW5lIF9fTExfTUFQX0hfXyAxCisKK2ludCBsbF9yZW1lbWJlcl9pbmRleChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobywKKwkJICAgICAgc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcpOworCit2b2lkIGxsX2luaXRfbWFwKHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoKTsKK3Vuc2lnbmVkIGxsX25hbWVfdG9faW5kZXgoY29uc3QgY2hhciAqbmFtZSk7Citjb25zdCBjaGFyICpsbF9pbmRleF90b19uYW1lKHVuc2lnbmVkIGlkeCk7Citjb25zdCBjaGFyICpsbF9pZHhfbjJhKHVuc2lnbmVkIGlkeCwgY2hhciAqYnVmKTsKK2ludCBsbF9pbmRleF90b190eXBlKHVuc2lnbmVkIGlkeCk7CitpbnQgbGxfaW5kZXhfdG9fZmxhZ3ModW5zaWduZWQgaWR4KTsKK3Vuc2lnbmVkIG5hbWVoYXNoKGNvbnN0IGNoYXIgKnN0cik7CisKKyNlbmRpZiAvKiBfX0xMX01BUF9IX18gKi8KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2luY2x1ZGUvbmFtZXMuaCBiL2lwcm91dGUyL2luY2x1ZGUvbmFtZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmVkNTgxCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9uYW1lcy5oCkBAIC0wLDAgKzEsMjYgQEAKKyNpZm5kZWYgREJfTkFNRVNfSF8KKyNkZWZpbmUgREJfTkFNRVNfSF8gMQorCisjZGVmaW5lIElETkFNRV9NQVggMjU2CisKK3N0cnVjdCBkYl9lbnRyeSB7CisJc3RydWN0IGRiX2VudHJ5ICpuZXh0OworCXVuc2lnbmVkIGludCBpZDsKKwljaGFyICpuYW1lOworfTsKKworc3RydWN0IGRiX25hbWVzIHsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwlzdHJ1Y3QgZGJfZW50cnkgKmNhY2hlZDsKKwlzdHJ1Y3QgZGJfZW50cnkgKipoYXNoOworCWludCBtYXg7Cit9OworCitzdHJ1Y3QgZGJfbmFtZXMgKmRiX25hbWVzX2FsbG9jKHZvaWQpOworaW50IGRiX25hbWVzX2xvYWQoc3RydWN0IGRiX25hbWVzICpkYiwgY29uc3QgY2hhciAqcGF0aCk7Cit2b2lkIGRiX25hbWVzX2ZyZWUoc3RydWN0IGRiX25hbWVzICpkYik7CisKK2NoYXIgKmlkX3RvX25hbWUoc3RydWN0IGRiX25hbWVzICpkYiwgaW50IGlkLCBjaGFyICpuYW1lKTsKK2ludCBuYW1lX3RvX2lkKHN0cnVjdCBkYl9uYW1lcyAqZGIsIGludCAqaWQsIGNvbnN0IGNoYXIgKm5hbWUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2luY2x1ZGUvbmFtZXNwYWNlLmggYi9pcHJvdXRlMi9pbmNsdWRlL25hbWVzcGFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMzI0YjIKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pbmNsdWRlL25hbWVzcGFjZS5oCkBAIC0wLDAgKzEsNTUgQEAKKyNpZm5kZWYgX19OQU1FU1BBQ0VfSF9fCisjZGVmaW5lIF9fTkFNRVNQQUNFX0hfXyAxCisKKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPHN5cy9tb3VudC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2RlZmluZSBORVROU19SVU5fRElSICIvdmFyL3J1bi9uZXRucyIKKyNkZWZpbmUgTkVUTlNfRVRDX0RJUiAiL2V0Yy9uZXRucyIKKworI2lmbmRlZiBDTE9ORV9ORVdORVQKKyNkZWZpbmUgQ0xPTkVfTkVXTkVUIDB4NDAwMDAwMDAJLyogTmV3IG5ldHdvcmsgbmFtZXNwYWNlIChsbywgZGV2aWNlLCBuYW1lcyBzb2NrZXRzLCBldGMpICovCisjZW5kaWYKKworI2lmbmRlZiBNTlRfREVUQUNICisjZGVmaW5lIE1OVF9ERVRBQ0gJMHgwMDAwMDAwMgkvKiBKdXN0IGRldGFjaCBmcm9tIHRoZSB0cmVlICovCisjZW5kaWYgLyogTU5UX0RFVEFDSCAqLworCisvKiBzeXMvbW91bnQuaCBtYXkgYmUgb3V0IHRvbyBvbGQgdG8gaGF2ZSB0aGVzZSAqLworI2lmbmRlZiBNU19SRUMKKyNkZWZpbmUgTVNfUkVDCQkxNjM4NAorI2VuZGlmCisKKyNpZm5kZWYgTVNfU0xBVkUKKyNkZWZpbmUgTVNfU0xBVkUJKDEgPDwgMTkpCisjZW5kaWYKKworI2lmbmRlZiBNU19TSEFSRUQKKyNkZWZpbmUgTVNfU0hBUkVECSgxIDw8IDIwKQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TRVROUworc3RhdGljIGlubGluZSBpbnQgc2V0bnMoaW50IGZkLCBpbnQgbnN0eXBlKQoreworI2lmZGVmIF9fTlJfc2V0bnMKKwlyZXR1cm4gc3lzY2FsbChfX05SX3NldG5zLCBmZCwgbnN0eXBlKTsKKyNlbHNlCisJZXJybm8gPSBFTk9TWVM7CisJcmV0dXJuIC0xOworI2VuZGlmCit9CisjZW5kaWYgLyogSEFWRV9TRVROUyAqLworCitpbnQgbmV0bnNfc3dpdGNoKGNoYXIgKm5ldG5zKTsKK2ludCBuZXRuc19nZXRfZmQoY29uc3QgY2hhciAqbmV0bnMpOworaW50IG5ldG5zX2ZvcmVhY2goaW50ICgqZnVuYykoY2hhciAqbnNuYW1lLCB2b2lkICphcmcpLCB2b2lkICphcmcpOworCitzdHJ1Y3QgbmV0bnNfZnVuYyB7CisJaW50ICgqZnVuYykoY2hhciAqbnNuYW1lLCB2b2lkICphcmcpOworCXZvaWQgKmFyZzsKK307CisKKyNlbmRpZiAvKiBfX05BTUVTUEFDRV9IX18gKi8KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2luY2x1ZGUvbmV0aW5ldC90Y3AuaCBiL2lwcm91dGUyL2luY2x1ZGUvbmV0aW5ldC90Y3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjg5MGExCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9uZXRpbmV0L3RjcC5oCkBAIC0wLDAgKzEsMjMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXRjcC5oCTguMSAoQmVya2VsZXkpIDYvMTAvOTMKKyAqLworCisjaWZuZGVmIF9ORVRJTkVUX1RDUF9ICisjZGVmaW5lIF9ORVRJTkVUX1RDUF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qCisgKiBVc2VyLXNldHRhYmxlIG9wdGlvbnMgKHVzZWQgd2l0aCBzZXRzb2Nrb3B0KS4KKyAqLworI2RlZmluZQlUQ1BfTk9ERUxBWQkgMQkvKiBEb24ndCBkZWxheSBzZW5kIHRvIGNvYWxlc2NlIHBhY2tldHMgICovCisjZGVmaW5lCVRDUF9NQVhTRUcJIDIJLyogU2V0IG1heGltdW0gc2VnbWVudCBzaXplICAqLworI2RlZmluZSBUQ1BfQ09SSwkgMwkvKiBDb250cm9sIHNlbmRpbmcgb2YgcGFydGlhbCBmcmFtZXMgICovCisjZGVmaW5lIFRDUF9LRUVQSURMRQkgNAkvKiBTdGFydCBrZWVwbGl2ZXMgYWZ0ZXIgdGhpcyBwZXJpb2QgKi8KKyNkZWZpbmUgVENQX0tFRVBJTlRWTAkgNQkvKiBJbnRlcnZhbCBiZXR3ZWVuIGtlZXBhbGl2ZXMgKi8KKyNkZWZpbmUgVENQX0tFRVBDTlQJIDYJLyogTnVtYmVyIG9mIGtlZXBhbGl2ZXMgYmVmb3JlIGRlYXRoICovCisjZGVmaW5lIFRDUF9TWU5DTlQJIDcJLyogTnVtYmVyIG9mIFNZTiByZXRyYW5zbWl0cyAqLworI2RlZmluZSBUQ1BfTElOR0VSMgkgOAkvKiBMaWZlIHRpbWUgb2Ygb3JwaGFuZWQgRklOLVdBSVQtMiBzdGF0ZSAqLworI2RlZmluZSBUQ1BfREVGRVJfQUNDRVBUIDkJLyogV2FrZSB1cCBsaXN0ZW5lciBvbmx5IHdoZW4gZGF0YSBhcnJpdmUgKi8KKyNkZWZpbmUgVENQX1dJTkRPV19DTEFNUCAxMAkvKiBCb3VuZCBhZHZlcnRpc2VkIHdpbmRvdyAqLworI2RlZmluZSBUQ1BfSU5GTwkgMTEJLyogSW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjb25uZWN0aW9uLiAqLworI2RlZmluZQlUQ1BfUVVJQ0tBQ0sJIDEyCS8qIEJvY2svcmVlbmFibGUgcXVpY2sgQUNLcy4gICovCisjZGVmaW5lIFRDUF9DT05HRVNUSU9OCSAxMwkvKiBDb25nZXN0aW9uIGNvbnRyb2wgYWxnb3JpdGhtLiAgKi8KKworI2lmZGVmIF9fVVNFX01JU0MKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyMgaWZkZWYgX19GQVZPUl9CU0QKK3R5cGVkZWYJdV9pbnQzMl90IHRjcF9zZXE7CisvKgorICogVENQIGhlYWRlci4KKyAqIFBlciBSRkMgNzkzLCBTZXB0ZW1iZXIsIDE5ODEuCisgKi8KK3N0cnVjdCB0Y3BoZHIKKyAgeworICAgIHVfaW50MTZfdCB0aF9zcG9ydDsJCS8qIHNvdXJjZSBwb3J0ICovCisgICAgdV9pbnQxNl90IHRoX2Rwb3J0OwkJLyogZGVzdGluYXRpb24gcG9ydCAqLworICAgIHRjcF9zZXEgdGhfc2VxOwkJLyogc2VxdWVuY2UgbnVtYmVyICovCisgICAgdGNwX3NlcSB0aF9hY2s7CQkvKiBhY2tub3dsZWRnZW1lbnQgbnVtYmVyICovCisjICBpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisgICAgdV9pbnQ4X3QgdGhfeDI6NDsJCS8qICh1bnVzZWQpICovCisgICAgdV9pbnQ4X3QgdGhfb2ZmOjQ7CQkvKiBkYXRhIG9mZnNldCAqLworIyAgZW5kaWYKKyMgIGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyAgICB1X2ludDhfdCB0aF9vZmY6NDsJCS8qIGRhdGEgb2Zmc2V0ICovCisgICAgdV9pbnQ4X3QgdGhfeDI6NDsJCS8qICh1bnVzZWQpICovCisjICBlbmRpZgorICAgIHVfaW50OF90IHRoX2ZsYWdzOworIyAgZGVmaW5lIFRIX0ZJTgkweDAxCisjICBkZWZpbmUgVEhfU1lOCTB4MDIKKyMgIGRlZmluZSBUSF9SU1QJMHgwNAorIyAgZGVmaW5lIFRIX1BVU0gJMHgwOAorIyAgZGVmaW5lIFRIX0FDSwkweDEwCisjICBkZWZpbmUgVEhfVVJHCTB4MjAKKyAgICB1X2ludDE2X3QgdGhfd2luOwkJLyogd2luZG93ICovCisgICAgdV9pbnQxNl90IHRoX3N1bTsJCS8qIGNoZWNrc3VtICovCisgICAgdV9pbnQxNl90IHRoX3VycDsJCS8qIHVyZ2VudCBwb2ludGVyICovCit9OworCisjIGVsc2UgLyogIV9fRkFWT1JfQlNEICovCitzdHJ1Y3QgdGNwaGRyCisgIHsKKyAgICB1X2ludDE2X3Qgc291cmNlOworICAgIHVfaW50MTZfdCBkZXN0OworICAgIHVfaW50MzJfdCBzZXE7CisgICAgdV9pbnQzMl90IGFja19zZXE7CisjICBpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisgICAgdV9pbnQxNl90IHJlczE6NDsKKyAgICB1X2ludDE2X3QgZG9mZjo0OworICAgIHVfaW50MTZfdCBmaW46MTsKKyAgICB1X2ludDE2X3Qgc3luOjE7CisgICAgdV9pbnQxNl90IHJzdDoxOworICAgIHVfaW50MTZfdCBwc2g6MTsKKyAgICB1X2ludDE2X3QgYWNrOjE7CisgICAgdV9pbnQxNl90IHVyZzoxOworICAgIHVfaW50MTZfdCByZXMyOjI7CisjICBlbGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyAgICB1X2ludDE2X3QgZG9mZjo0OworICAgIHVfaW50MTZfdCByZXMxOjQ7CisgICAgdV9pbnQxNl90IHJlczI6MjsKKyAgICB1X2ludDE2X3QgdXJnOjE7CisgICAgdV9pbnQxNl90IGFjazoxOworICAgIHVfaW50MTZfdCBwc2g6MTsKKyAgICB1X2ludDE2X3QgcnN0OjE7CisgICAgdV9pbnQxNl90IHN5bjoxOworICAgIHVfaW50MTZfdCBmaW46MTsKKyMgIGVsc2UKKyMgICBlcnJvciAiQWRqdXN0IHlvdXIgPGJpdHMvZW5kaWFuLmg+IGRlZmluZXMiCisjICBlbmRpZgorICAgIHVfaW50MTZfdCB3aW5kb3c7CisgICAgdV9pbnQxNl90IGNoZWNrOworICAgIHVfaW50MTZfdCB1cmdfcHRyOworfTsKKyMgZW5kaWYgLyogX19GQVZPUl9CU0QgKi8KKworZW51bQoreworICBUQ1BfRVNUQUJMSVNIRUQgPSAxLAorICBUQ1BfU1lOX1NFTlQsCisgIFRDUF9TWU5fUkVDViwKKyAgVENQX0ZJTl9XQUlUMSwKKyAgVENQX0ZJTl9XQUlUMiwKKyAgVENQX1RJTUVfV0FJVCwKKyAgVENQX0NMT1NFLAorICBUQ1BfQ0xPU0VfV0FJVCwKKyAgVENQX0xBU1RfQUNLLAorICBUQ1BfTElTVEVOLAorICBUQ1BfQ0xPU0lORyAgIC8qIG5vdyBhIHZhbGlkIHN0YXRlICovCit9OworCisjIGRlZmluZSBUQ1BPUFRfRU9MCQkwCisjIGRlZmluZSBUQ1BPUFRfTk9QCQkxCisjIGRlZmluZSBUQ1BPUFRfTUFYU0VHCQkyCisjIGRlZmluZSBUQ1BPTEVOX01BWFNFRwkJNAorIyBkZWZpbmUgVENQT1BUX1dJTkRPVwkJMworIyBkZWZpbmUgVENQT0xFTl9XSU5ET1cJCTMKKyMgZGVmaW5lIFRDUE9QVF9TQUNLX1BFUk1JVFRFRAk0CQkvKiBFeHBlcmltZW50YWwgKi8KKyMgZGVmaW5lIFRDUE9MRU5fU0FDS19QRVJNSVRURUQJMgorIyBkZWZpbmUgVENQT1BUX1NBQ0sJCTUJCS8qIEV4cGVyaW1lbnRhbCAqLworIyBkZWZpbmUgVENQT1BUX1RJTUVTVEFNUAk4CisjIGRlZmluZSBUQ1BPTEVOX1RJTUVTVEFNUAkxMAorIyBkZWZpbmUgVENQT0xFTl9UU1RBTVBfQVBQQQkoVENQT0xFTl9USU1FU1RBTVArMikgLyogYXBwZW5kaXggQSAqLworCisjIGRlZmluZSBUQ1BPUFRfVFNUQU1QX0hEUglcCisgICAgKFRDUE9QVF9OT1A8PDI0fFRDUE9QVF9OT1A8PDE2fFRDUE9QVF9USU1FU1RBTVA8PDh8VENQT0xFTl9USU1FU1RBTVApCisKKy8qCisgKiBEZWZhdWx0IG1heGltdW0gc2VnbWVudCBzaXplIGZvciBUQ1AuCisgKiBXaXRoIGFuIElQIE1TUyBvZiA1NzYsIHRoaXMgaXMgNTM2LAorICogYnV0IDUxMiBpcyBwcm9iYWJseSBtb3JlIGNvbnZlbmllbnQuCisgKiBUaGlzIHNob3VsZCBiZSBkZWZpbmVkIGFzIE1JTig1MTIsIElQX01TUyAtIHNpemVvZiAoc3RydWN0IHRjcGlwaGRyKSkuCisgKi8KKyMgZGVmaW5lIFRDUF9NU1MJNTEyCisKKyMgZGVmaW5lIFRDUF9NQVhXSU4JNjU1MzUJLyogbGFyZ2VzdCB2YWx1ZSBmb3IgKHVuc2NhbGVkKSB3aW5kb3cgKi8KKworIyBkZWZpbmUgVENQX01BWF9XSU5TSElGVAkxNAkvKiBtYXhpbXVtIHdpbmRvdyBzaGlmdCAqLworCisjIGRlZmluZSBTT0xfVENQCQk2CS8qIFRDUCBsZXZlbCAqLworCisKKyMgZGVmaW5lIFRDUElfT1BUX1RJTUVTVEFNUFMJMQorIyBkZWZpbmUgVENQSV9PUFRfU0FDSwkJMgorIyBkZWZpbmUgVENQSV9PUFRfV1NDQUxFCTQKKyMgZGVmaW5lIFRDUElfT1BUX0VDTgkJOAorIyBkZWZpbmUgVENQSV9PUFRfRUNOX1NFRU4JMTYKKworLyogVmFsdWVzIGZvciB0Y3BpX3N0YXRlLiAgKi8KK2VudW0gdGNwX2NhX3N0YXRlCit7CisgIFRDUF9DQV9PcGVuID0gMCwKKyAgVENQX0NBX0Rpc29yZGVyID0gMSwKKyAgVENQX0NBX0NXUiA9IDIsCisgIFRDUF9DQV9SZWNvdmVyeSA9IDMsCisgIFRDUF9DQV9Mb3NzID0gNAorfTsKKworc3RydWN0IHRjcF9pbmZvCit7CisgIHVfaW50OF90CXRjcGlfc3RhdGU7CisgIHVfaW50OF90CXRjcGlfY2Ffc3RhdGU7CisgIHVfaW50OF90CXRjcGlfcmV0cmFuc21pdHM7CisgIHVfaW50OF90CXRjcGlfcHJvYmVzOworICB1X2ludDhfdAl0Y3BpX2JhY2tvZmY7CisgIHVfaW50OF90CXRjcGlfb3B0aW9uczsKKyAgdV9pbnQ4X3QJdGNwaV9zbmRfd3NjYWxlIDogNCwgdGNwaV9yY3Zfd3NjYWxlIDogNDsKKworICB1X2ludDMyX3QJdGNwaV9ydG87CisgIHVfaW50MzJfdAl0Y3BpX2F0bzsKKyAgdV9pbnQzMl90CXRjcGlfc25kX21zczsKKyAgdV9pbnQzMl90CXRjcGlfcmN2X21zczsKKworICB1X2ludDMyX3QJdGNwaV91bmFja2VkOworICB1X2ludDMyX3QJdGNwaV9zYWNrZWQ7CisgIHVfaW50MzJfdAl0Y3BpX2xvc3Q7CisgIHVfaW50MzJfdAl0Y3BpX3JldHJhbnM7CisgIHVfaW50MzJfdAl0Y3BpX2ZhY2tldHM7CisKKyAgLyogVGltZXMuICovCisgIHVfaW50MzJfdAl0Y3BpX2xhc3RfZGF0YV9zZW50OworICB1X2ludDMyX3QJdGNwaV9sYXN0X2Fja19zZW50OwkvKiBOb3QgcmVtZW1iZXJlZCwgc29ycnkuICAqLworICB1X2ludDMyX3QJdGNwaV9sYXN0X2RhdGFfcmVjdjsKKyAgdV9pbnQzMl90CXRjcGlfbGFzdF9hY2tfcmVjdjsKKworICAvKiBNZXRyaWNzLiAqLworICB1X2ludDMyX3QJdGNwaV9wbXR1OworICB1X2ludDMyX3QJdGNwaV9yY3Zfc3N0aHJlc2g7CisgIHVfaW50MzJfdAl0Y3BpX3J0dDsKKyAgdV9pbnQzMl90CXRjcGlfcnR0dmFyOworICB1X2ludDMyX3QJdGNwaV9zbmRfc3N0aHJlc2g7CisgIHVfaW50MzJfdAl0Y3BpX3NuZF9jd25kOworICB1X2ludDMyX3QJdGNwaV9hZHZtc3M7CisgIHVfaW50MzJfdAl0Y3BpX3Jlb3JkZXJpbmc7CisgIHVfaW50MzJfdAl0Y3BpX3Jjdl9ydHQ7CisgIHVfaW50MzJfdAl0Y3BpX3Jjdl9zcGFjZTsKKyAgdV9pbnQzMl90CXRjcGlfdG90YWxfcmV0cmFuczsKKworfTsKKworI2VuZGlmIC8qIE1pc2MuICAqLworCisjZW5kaWYgLyogbmV0aW5ldC90Y3AuaCAqLwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9ydF9uYW1lcy5oIGIvaXByb3V0ZTIvaW5jbHVkZS9ydF9uYW1lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMWJlMDYKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pbmNsdWRlL3J0X25hbWVzLmgKQEAgLTAsMCArMSwzNSBAQAorI2lmbmRlZiBSVF9OQU1FU19IXworI2RlZmluZSBSVF9OQU1FU19IXyAxCisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworY29uc3QgY2hhciAqcnRubF9ydHByb3RfbjJhKGludCBpZCwgY2hhciAqYnVmLCBpbnQgbGVuKTsKK2NvbnN0IGNoYXIgKnJ0bmxfcnRzY29wZV9uMmEoaW50IGlkLCBjaGFyICpidWYsIGludCBsZW4pOworY29uc3QgY2hhciAqcnRubF9ydHRhYmxlX24yYShfX3UzMiBpZCwgY2hhciAqYnVmLCBpbnQgbGVuKTsKK2NvbnN0IGNoYXIgKnJ0bmxfcnRyZWFsbV9uMmEoaW50IGlkLCBjaGFyICpidWYsIGludCBsZW4pOworY29uc3QgY2hhciAqcnRubF9kc2ZpZWxkX24yYShpbnQgaWQsIGNoYXIgKmJ1ZiwgaW50IGxlbik7Citjb25zdCBjaGFyICpydG5sX2dyb3VwX24yYShpbnQgaWQsIGNoYXIgKmJ1ZiwgaW50IGxlbik7CisKK2ludCBydG5sX3J0cHJvdF9hMm4oX191MzIgKmlkLCBjb25zdCBjaGFyICphcmcpOworaW50IHJ0bmxfcnRzY29wZV9hMm4oX191MzIgKmlkLCBjb25zdCBjaGFyICphcmcpOworaW50IHJ0bmxfcnR0YWJsZV9hMm4oX191MzIgKmlkLCBjb25zdCBjaGFyICphcmcpOworaW50IHJ0bmxfcnRyZWFsbV9hMm4oX191MzIgKmlkLCBjb25zdCBjaGFyICphcmcpOworaW50IHJ0bmxfZHNmaWVsZF9hMm4oX191MzIgKmlkLCBjb25zdCBjaGFyICphcmcpOworaW50IHJ0bmxfZ3JvdXBfYTJuKGludCAqaWQsIGNvbnN0IGNoYXIgKmFyZyk7CisKK2NvbnN0IGNoYXIgKmluZXRfcHJvdG9fbjJhKGludCBwcm90bywgY2hhciAqYnVmLCBpbnQgbGVuKTsKK2ludCBpbmV0X3Byb3RvX2Eybihjb25zdCBjaGFyICpidWYpOworCisKK2NvbnN0IGNoYXIgKiBsbF90eXBlX24yYShpbnQgdHlwZSwgY2hhciAqYnVmLCBpbnQgbGVuKTsKK2NvbnN0IGNoYXIgKmxsX2FkZHJfbjJhKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsIGludCBhbGVuLAorCQkJaW50IHR5cGUsIGNoYXIgKmJ1ZiwgaW50IGJsZW4pOworaW50IGxsX2FkZHJfYTJuKGNoYXIgKmxsYWRkciwgaW50IGxlbiwgY29uc3QgY2hhciAqYXJnKTsKKworY29uc3QgY2hhciAqIGxsX3Byb3RvX24yYSh1bnNpZ25lZCBzaG9ydCBpZCwgY2hhciAqYnVmLCBpbnQgbGVuKTsKK2ludCBsbF9wcm90b19hMm4odW5zaWduZWQgc2hvcnQgKmlkLCBjb25zdCBjaGFyICpidWYpOworCitjb25zdCBjaGFyICpubF9wcm90b19uMmEoaW50IGlkLCBjaGFyICpidWYsIGludCBsZW4pOworaW50IG5sX3Byb3RvX2EybihfX3UzMiAqaWQsIGNvbnN0IGNoYXIgKmFyZyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS9ydG1fbWFwLmggYi9pcHJvdXRlMi9pbmNsdWRlL3J0bV9tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmU1ODg1Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS9ydG1fbWFwLmgKQEAgLTAsMCArMSw5IEBACisjaWZuZGVmIF9fUlRNX01BUF9IX18KKyNkZWZpbmUgX19SVE1fTUFQX0hfXyAxCisKK2NoYXIgKnJ0bmxfcnRudHlwZV9uMmEoaW50IGlkLCBjaGFyICpidWYsIGludCBsZW4pOworaW50IHJ0bmxfcnRudHlwZV9hMm4oaW50ICppZCwgY2hhciAqYXJnKTsKKworaW50IGdldF9ydF9yZWFsbXNfb3JfcmF3KF9fdTMyICpyZWFsbXMsIGNoYXIgKmFyZyk7CisKKyNlbmRpZiAvKiBfX1JUTV9NQVBfSF9fICovCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL3V0aWxzLmggYi9pcHJvdXRlMi9pbmNsdWRlL3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMxMGY0ZQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUvdXRpbHMuaApAQCAtMCwwICsxLDIyNCBAQAorI2lmbmRlZiBfX1VUSUxTX0hfXworI2RlZmluZSBfX1VUSUxTX0hfXyAxCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxyZXNvbHYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKyNpbmNsdWRlICJsaWJuZXRsaW5rLmgiCisjaW5jbHVkZSAibGxfbWFwLmgiCisjaW5jbHVkZSAicnRtX21hcC5oIgorCitleHRlcm4gaW50IHByZWZlcnJlZF9mYW1pbHk7CitleHRlcm4gaW50IGh1bWFuX3JlYWRhYmxlOworZXh0ZXJuIGludCB1c2VfaWVjOworZXh0ZXJuIGludCBzaG93X3N0YXRzOworZXh0ZXJuIGludCBzaG93X2RldGFpbHM7CitleHRlcm4gaW50IHNob3dfcmF3OworZXh0ZXJuIGludCByZXNvbHZlX2hvc3RzOworZXh0ZXJuIGludCBvbmVsaW5lOworZXh0ZXJuIGludCBicmllZjsKK2V4dGVybiBpbnQgdGltZXN0YW1wOworZXh0ZXJuIGludCB0aW1lc3RhbXBfc2hvcnQ7CitleHRlcm4gY29uc3QgY2hhciAqIF9TTF87CitleHRlcm4gaW50IG1heF9mbHVzaF9sb29wczsKK2V4dGVybiBpbnQgYmF0Y2hfbW9kZTsKK2V4dGVybiBib29sIGRvX2FsbDsKKworI2lmbmRlZiBJUFBST1RPX0VTUAorI2RlZmluZSBJUFBST1RPX0VTUAk1MAorI2VuZGlmCisjaWZuZGVmIElQUFJPVE9fQUgKKyNkZWZpbmUgSVBQUk9UT19BSAk1MQorI2VuZGlmCisjaWZuZGVmIElQUFJPVE9fQ09NUAorI2RlZmluZSBJUFBST1RPX0NPTVAJMTA4CisjZW5kaWYKKyNpZm5kZWYgSVBTRUNfUFJPVE9fQU5ZCisjZGVmaW5lIElQU0VDX1BST1RPX0FOWQkyNTUKKyNlbmRpZgorCisjaWZuZGVmIENPTkZESVIKKyNkZWZpbmUgQ09ORkRJUgkJIi9ldGMvaXByb3V0ZTIiCisjZW5kaWYKKworI2RlZmluZSBTUFJJTlRfQlNJWkUgNjQKKyNkZWZpbmUgU1BSSU5UX0JVRih4KQljaGFyIHhbU1BSSU5UX0JTSVpFXQorCit2b2lkIGluY29tcGxldGVfY29tbWFuZCh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworCisjZGVmaW5lIE5FWFRfQVJHKCkgZG8geyBhcmd2Kys7IGlmICgtLWFyZ2MgPD0gMCkgaW5jb21wbGV0ZV9jb21tYW5kKCk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgTkVYVF9BUkdfT0soKSAoYXJnYyAtIDEgPiAwKQorI2RlZmluZSBORVhUX0FSR19GV0QoKSBkbyB7IGFyZ3YrKzsgYXJnYy0tOyB9IHdoaWxlKDApCisjZGVmaW5lIFBSRVZfQVJHKCkgZG8geyBhcmd2LS07IGFyZ2MrKzsgfSB3aGlsZSgwKQorCit0eXBlZGVmIHN0cnVjdAoreworCV9fdTE2IGZsYWdzOworCV9fdTE2IGJ5dGVsZW47CisJX19zMTYgYml0bGVuOworCS8qIFRoZXNlIG5leHQgdHdvIGZpZWxkcyBtYXRjaCBydHZpYSAqLworCV9fdTE2IGZhbWlseTsKKwlfX3UzMiBkYXRhWzhdOworfSBpbmV0X3ByZWZpeDsKKworI2RlZmluZSBQUkVGSVhMRU5fU1BFQ0lGSUVEIDEKKworI2RlZmluZSBETl9NQVhBRERMIDIwCisjaWZuZGVmIEFGX0RFQ25ldAorI2RlZmluZSBBRl9ERUNuZXQgMTIKKyNlbmRpZgorCitzdHJ1Y3QgZG5fbmFkZHIKK3sKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgICAgICAgICAgYV9sZW47CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYV9hZGRyW0ROX01BWEFERExdOworfTsKKworI2RlZmluZSBJUFhfTk9ERV9MRU4gNgorCitzdHJ1Y3QgaXB4X2FkZHIgeworCXVfaW50MzJfdCBpcHhfbmV0OworCXVfaW50OF90ICBpcHhfbm9kZVtJUFhfTk9ERV9MRU5dOworfTsKKworI2lmbmRlZiBBRl9NUExTCisjIGRlZmluZSBBRl9NUExTIDI4CisjZW5kaWYKKworLyogTWF4aW11bSBudW1iZXIgb2YgbGFiZWxzIHRoZSBtcGxzIGhlbHBlcnMgc3VwcG9ydCAqLworI2RlZmluZSBNUExTX01BWF9MQUJFTFMgOAorCitfX3UzMiBnZXRfYWRkcjMyKGNvbnN0IGNoYXIgKm5hbWUpOworaW50IGdldF9hZGRyXzEoaW5ldF9wcmVmaXggKmRzdCwgY29uc3QgY2hhciAqYXJnLCBpbnQgZmFtaWx5KTsKK2ludCBnZXRfcHJlZml4XzEoaW5ldF9wcmVmaXggKmRzdCwgY2hhciAqYXJnLCBpbnQgZmFtaWx5KTsKK2ludCBnZXRfYWRkcihpbmV0X3ByZWZpeCAqZHN0LCBjb25zdCBjaGFyICphcmcsIGludCBmYW1pbHkpOworaW50IGdldF9wcmVmaXgoaW5ldF9wcmVmaXggKmRzdCwgY2hhciAqYXJnLCBpbnQgZmFtaWx5KTsKK2ludCBtYXNrMmJpdHMoX191MzIgbmV0bWFzayk7CitpbnQgZ2V0X2FkZHJfaWxhKF9fdTY0ICp2YWwsIGNvbnN0IGNoYXIgKmFyZyk7CisKK2ludCBnZXRfaW50ZWdlcihpbnQgKnZhbCwgY29uc3QgY2hhciAqYXJnLCBpbnQgYmFzZSk7CitpbnQgZ2V0X3Vuc2lnbmVkKHVuc2lnbmVkICp2YWwsIGNvbnN0IGNoYXIgKmFyZywgaW50IGJhc2UpOworaW50IGdldF90aW1lX3J0dCh1bnNpZ25lZCAqdmFsLCBjb25zdCBjaGFyICphcmcsIGludCAqcmF3KTsKKyNkZWZpbmUgZ2V0X2J5dGUgZ2V0X3U4CisjZGVmaW5lIGdldF91c2hvcnQgZ2V0X3UxNgorI2RlZmluZSBnZXRfc2hvcnQgZ2V0X3MxNgoraW50IGdldF91NjQoX191NjQgKnZhbCwgY29uc3QgY2hhciAqYXJnLCBpbnQgYmFzZSk7CitpbnQgZ2V0X3UzMihfX3UzMiAqdmFsLCBjb25zdCBjaGFyICphcmcsIGludCBiYXNlKTsKK2ludCBnZXRfczMyKF9fczMyICp2YWwsIGNvbnN0IGNoYXIgKmFyZywgaW50IGJhc2UpOworaW50IGdldF91MTYoX191MTYgKnZhbCwgY29uc3QgY2hhciAqYXJnLCBpbnQgYmFzZSk7CitpbnQgZ2V0X3MxNihfX3MxNiAqdmFsLCBjb25zdCBjaGFyICphcmcsIGludCBiYXNlKTsKK2ludCBnZXRfdTgoX191OCAqdmFsLCBjb25zdCBjaGFyICphcmcsIGludCBiYXNlKTsKK2ludCBnZXRfczgoX19zOCAqdmFsLCBjb25zdCBjaGFyICphcmcsIGludCBiYXNlKTsKK2ludCBnZXRfYWRkcjY0KF9fdTY0ICphcCwgY29uc3QgY2hhciAqY3ApOworCitjaGFyKiBoZXhzdHJpbmdfbjJhKGNvbnN0IF9fdTggKnN0ciwgaW50IGxlbiwgY2hhciAqYnVmLCBpbnQgYmxlbik7CitfX3U4KiBoZXhzdHJpbmdfYTJuKGNvbnN0IGNoYXIgKnN0ciwgX191OCAqYnVmLCBpbnQgYmxlbik7CisjZGVmaW5lIEFERFI2NF9CVUZfU0laRSBzaXplb2YoInh4eHg6eHh4eDp4eHh4Onh4eHgiKQoraW50IGFkZHI2NF9uMmEoX191NjQgYWRkciwgY2hhciAqYnVmZiwgc2l6ZV90IGxlbik7CisKK2ludCBhZl9iaXRfbGVuKGludCBhZik7CitpbnQgYWZfYnl0ZV9sZW4oaW50IGFmKTsKKworY29uc3QgY2hhciAqZm9ybWF0X2hvc3QoaW50IGFmLCBpbnQgbGVuLCBjb25zdCB2b2lkICphZGRyLAorCQkJICAgICAgIGNoYXIgKmJ1ZiwgaW50IGJ1Zmxlbik7Citjb25zdCBjaGFyICpydF9hZGRyX24yYShpbnQgYWYsIGludCBsZW4sIGNvbnN0IHZvaWQgKmFkZHIsCisJCQkgICAgICAgY2hhciAqYnVmLCBpbnQgYnVmbGVuKTsKKworaW50IHJlYWRfZmFtaWx5KGNvbnN0IGNoYXIgKm5hbWUpOworY29uc3QgY2hhciAqZmFtaWx5X25hbWUoaW50IGZhbWlseSk7CisKK3ZvaWQgbWlzc2FyZyhjb25zdCBjaGFyICopIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7Cit2b2lkIGludmFyZyhjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKK3ZvaWQgZHVwYXJnKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOwordm9pZCBkdXBhcmcyKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworaW50IG1hdGNoZXMoY29uc3QgY2hhciAqYXJnLCBjb25zdCBjaGFyICpwYXR0ZXJuKTsKK2ludCBpbmV0X2FkZHJfbWF0Y2goY29uc3QgaW5ldF9wcmVmaXggKmEsIGNvbnN0IGluZXRfcHJlZml4ICpiLCBpbnQgYml0cyk7CisKK2NvbnN0IGNoYXIgKmRuZXRfbnRvcChpbnQgYWYsIGNvbnN0IHZvaWQgKmFkZHIsIGNoYXIgKnN0ciwgc2l6ZV90IGxlbik7CitpbnQgZG5ldF9wdG9uKGludCBhZiwgY29uc3QgY2hhciAqc3JjLCB2b2lkICphZGRyKTsKKworY29uc3QgY2hhciAqaXB4X250b3AoaW50IGFmLCBjb25zdCB2b2lkICphZGRyLCBjaGFyICpzdHIsIHNpemVfdCBsZW4pOworaW50IGlweF9wdG9uKGludCBhZiwgY29uc3QgY2hhciAqc3JjLCB2b2lkICphZGRyKTsKKworY29uc3QgY2hhciAqbXBsc19udG9wKGludCBhZiwgY29uc3Qgdm9pZCAqYWRkciwgY2hhciAqc3RyLCBzaXplX3QgbGVuKTsKK2ludCBtcGxzX3B0b24oaW50IGFmLCBjb25zdCBjaGFyICpzcmMsIHZvaWQgKmFkZHIpOworCitleHRlcm4gaW50IF9faXByb3V0ZTJfaHpfaW50ZXJuYWw7CitpbnQgX19nZXRfaHoodm9pZCk7CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBnZXRfaHoodm9pZCkKK3sKKwlpZiAoX19pcHJvdXRlMl9oel9pbnRlcm5hbCA9PSAwKQorCQlfX2lwcm91dGUyX2h6X2ludGVybmFsID0gX19nZXRfaHooKTsKKwlyZXR1cm4gX19pcHJvdXRlMl9oel9pbnRlcm5hbDsKK30KKworZXh0ZXJuIGludCBfX2lwcm91dGUyX3VzZXJfaHpfaW50ZXJuYWw7CitpbnQgX19nZXRfdXNlcl9oeih2b2lkKTsKKworc3RhdGljIF9faW5saW5lX18gaW50IGdldF91c2VyX2h6KHZvaWQpCit7CisJaWYgKF9faXByb3V0ZTJfdXNlcl9oel9pbnRlcm5hbCA9PSAwKQorCQlfX2lwcm91dGUyX3VzZXJfaHpfaW50ZXJuYWwgPSBfX2dldF91c2VyX2h6KCk7CisJcmV0dXJuIF9faXByb3V0ZTJfdXNlcl9oel9pbnRlcm5hbDsKK30KKworc3RhdGljIGlubGluZSBfX3UzMiBubF9tZ3JwKF9fdTMyIGdyb3VwKQoreworCWlmIChncm91cCA+IDMxICkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzZSBzZXRzb2Nrb3B0IGZvciB0aGlzIGdyb3VwICVkXG4iLCBncm91cCk7CisJCWV4aXQoLTEpOworCX0KKwlyZXR1cm4gZ3JvdXAgPyAoMSA8PCAoZ3JvdXAgLSAxKSkgOiAwOworfQorCisKK2ludCBwcmludF90aW1lc3RhbXAoRklMRSAqZnApOwordm9pZCBwcmludF9ubG1zZ190aW1lc3RhbXAoRklMRSAqZnAsIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbik7CisKKyNkZWZpbmUgQVJSQVlfU0laRSh4KSAoc2l6ZW9mKHgpIC8gc2l6ZW9mKCh4KVswXSkpCisKKyNkZWZpbmUgQlVJTERfQlVHX09OKGNvbmQpICgodm9pZClzaXplb2YoY2hhclsxIC0gMiAqICEhKGNvbmQpXSkpCisKKyNpZm5kZWYgb2Zmc2V0b2YKKyMgZGVmaW5lIG9mZnNldG9mKHR5cGUsIG1lbWJlcikgKChzaXplX3QpICYoKHR5cGUgKikwKS0+bWVtYmVyKQorI2VuZGlmCisKKyNpZm5kZWYgbWluCisjIGRlZmluZSBtaW4oeCwgeSkgKHsJCQlcCisJdHlwZW9mKHgpIF9taW4xID0gKHgpOwkJXAorCXR5cGVvZih5KSBfbWluMiA9ICh5KTsJCVwKKwkodm9pZCkgKCZfbWluMSA9PSAmX21pbjIpOwlcCisJX21pbjEgPCBfbWluMiA/IF9taW4xIDogX21pbjI7IH0pCisjZW5kaWYKKworI2lmbmRlZiBfX2NoZWNrX2Zvcm1hdF9zdHJpbmcKKyMgZGVmaW5lIF9fY2hlY2tfZm9ybWF0X3N0cmluZyhwb3Nfc3RyLCBwb3NfYXJncykgXAorCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgKHBvc19zdHIpLCAocG9zX2FyZ3MpKSkpCisjZW5kaWYKKworI2RlZmluZSBfdGV4dGlmeSh4KQkjeAorI2RlZmluZSB0ZXh0aWZ5KHgpCV90ZXh0aWZ5KHgpCisKKyNkZWZpbmUgaHRvbmxsKHgpICgoMT09aHRvbmwoMSkpID8gKHgpIDogKCh1aW50NjRfdClodG9ubCgoeCkgJiAweEZGRkZGRkZGKSA8PCAzMikgfCBodG9ubCgoeCkgPj4gMzIpKQorI2RlZmluZSBudG9obGwoeCkgKCgxPT1udG9obCgxKSkgPyAoeCkgOiAoKHVpbnQ2NF90KW50b2hsKCh4KSAmIDB4RkZGRkZGRkYpIDw8IDMyKSB8IG50b2hsKCh4KSA+PiAzMikpCisKK2V4dGVybiBpbnQgY21kbGluZW5vOworc3NpemVfdCBnZXRjbWRsaW5lKGNoYXIgKipsaW5lLCBzaXplX3QgKmxlbiwgRklMRSAqaW4pOworaW50IG1ha2VhcmdzKGNoYXIgKmxpbmUsIGNoYXIgKmFyZ3ZbXSwgaW50IG1heGFyZ3MpOworaW50IGluZXRfZ2V0X2FkZHIoY29uc3QgY2hhciAqc3JjLCBfX3UzMiAqZHN0LCBzdHJ1Y3QgaW42X2FkZHIgKmRzdDYpOworCitzdHJ1Y3QgaXBsaW5rX3JlcTsKK2ludCBpcGxpbmtfcGFyc2UoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3QgaXBsaW5rX3JlcSAqcmVxLAorCQljaGFyICoqbmFtZSwgY2hhciAqKnR5cGUsIGNoYXIgKipsaW5rLCBjaGFyICoqZGV2LAorCQlpbnQgKmdyb3VwLCBpbnQgKmluZGV4KTsKKworaW50IGRvX2VhY2hfbmV0bnMoaW50ICgqZnVuYykoY2hhciAqbnNuYW1lLCB2b2lkICphcmcpLCB2b2lkICphcmcsCisJCWJvb2wgc2hvd19sYWJlbCk7CisKK2NoYXIgKmludF90b19zdHIoaW50IHZhbCwgY2hhciAqYnVmKTsKKworI2VuZGlmIC8qIF9fVVRJTFNfSF9fICovCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pbmNsdWRlL3h0LWludGVybmFsLmggYi9pcHJvdXRlMi9pbmNsdWRlL3h0LWludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhlYTY3ZAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2luY2x1ZGUveHQtaW50ZXJuYWwuaApAQCAtMCwwICsxLDY2IEBACisjaWZuZGVmIF9YVEFCTEVTX0lOVEVSTkFMX0gKKyNkZWZpbmUgX1hUQUJMRVNfSU5URVJOQUxfSCAxCisKKyNpZm5kZWYgWFRfTElCX0RJUgorIwlkZWZpbmUgWFRfTElCX0RJUiAiL2xpYi94dGFibGVzIgorI2VuZGlmCisKKy8qIHByb3RvY29sIGZhbWlseSBkZXBlbmRlbnQgaW5mb3JtYXRpb25zICovCitzdHJ1Y3QgYWZpbmZvIHsKKwkvKiBwcm90b2NvbCBmYW1pbHkgKi8KKwlpbnQgZmFtaWx5OworCisJLyogcHJlZml4IG9mIGxpYnJhcnkgbmFtZSAoZXggImxpYmlwdF8iICovCisJY2hhciAqbGlicHJlZml4OworCisJLyogdXNlZCBieSBzZXRzb2Nrb3B0IChleCBJUFBST1RPX0lQICovCisJaW50IGlwcHJvdG87CisKKwkvKiBrZXJuZWwgbW9kdWxlIChleCAiaXBfdGFibGVzIiAqLworCWNoYXIgKmttb2Q7CisKKwkvKiBvcHRuYW1lIHRvIGNoZWNrIHJldmlzaW9uIHN1cHBvcnQgb2YgbWF0Y2ggKi8KKwlpbnQgc29fcmV2X21hdGNoOworCisJLyogb3B0bmFtZSB0byBjaGVjayByZXZpc2lvbiBzdXBwb3J0IG9mIG1hdGNoICovCisJaW50IHNvX3Jldl90YXJnZXQ7Cit9OworCitlbnVtIHh0X3RyeWxvYWQgeworCURPTlRfTE9BRCwKKwlEVVJJTkdfTE9BRCwKKwlUUllfTE9BRCwKKwlMT0FEX01VU1RfU1VDQ0VFRAorfTsKKworc3RydWN0IHh0YWJsZXNfcnVsZV9tYXRjaCB7CisJc3RydWN0IHh0YWJsZXNfcnVsZV9tYXRjaCAqbmV4dDsKKwlzdHJ1Y3QgeHRhYmxlc19tYXRjaCAqbWF0Y2g7CisJLyogTXVsdGlwbGUgbWF0Y2hlcyBvZiB0aGUgc2FtZSB0eXBlOiB0aGUgb25lcyBiZWZvcmUKKwkgICB0aGUgY3VycmVudCBvbmUgYXJlIGNvbXBsZXRlZCBmcm9tIHBhcnNpbmcgcG9pbnQgb2YgdmlldyAqLworCXVuc2lnbmVkIGludCBjb21wbGV0ZWQ7Cit9OworCitleHRlcm4gY2hhciAqbGliX2RpcjsKKworZXh0ZXJuIHZvaWQgKmZ3X2NhbGxvYyhzaXplX3QgY291bnQsIHNpemVfdCBzaXplKTsKK2V4dGVybiB2b2lkICpmd19tYWxsb2Moc2l6ZV90IHNpemUpOworCitleHRlcm4gY29uc3QgY2hhciAqbW9kcHJvYmVfcHJvZ3JhbTsKK2V4dGVybiBpbnQgeHRhYmxlc19pbnNtb2QoY29uc3QgY2hhciAqbW9kbmFtZSwgY29uc3QgY2hhciAqbW9kcHJvYmUsIGludCBxdWlldCk7CitleHRlcm4gaW50IGxvYWRfeHRhYmxlc19rbyhjb25zdCBjaGFyICptb2Rwcm9iZSwgaW50IHF1aWV0KTsKKworLyogVGhpcyBpcyBkZWNsZWFyZWQgaW4gaXBbNl10YWJsZXMuYyAqLworZXh0ZXJuIHN0cnVjdCBhZmluZm8gYWZpbmZvOworCisvKiBLZWVwaW5nIHRyYWNrIG9mIGV4dGVybmFsIG1hdGNoZXMgYW5kIHRhcmdldHM6IGxpbmtlZCBsaXN0cy4gICovCitleHRlcm4gc3RydWN0IHh0YWJsZXNfbWF0Y2ggKnh0YWJsZXNfbWF0Y2hlczsKK2V4dGVybiBzdHJ1Y3QgeHRhYmxlc190YXJnZXQgKnh0YWJsZXNfdGFyZ2V0czsKKworZXh0ZXJuIHN0cnVjdCB4dGFibGVzX21hdGNoICpmaW5kX21hdGNoKGNvbnN0IGNoYXIgKm5hbWUsIGVudW0geHRfdHJ5bG9hZCwKKwkJCQkJc3RydWN0IHh0YWJsZXNfcnVsZV9tYXRjaCAqKm1hdGNoKTsKK2V4dGVybiBzdHJ1Y3QgeHRhYmxlc190YXJnZXQgKmZpbmRfdGFyZ2V0KGNvbnN0IGNoYXIgKm5hbWUsIGVudW0geHRfdHJ5bG9hZCk7CisKK2V4dGVybiB2b2lkIF9pbml0KHZvaWQpOworCisjZW5kaWYgLyogX1hUQUJMRVNfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaW5jbHVkZS94dGFibGVzLmggYi9pcHJvdXRlMi9pbmNsdWRlL3h0YWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzhhZTBkCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaW5jbHVkZS94dGFibGVzLmgKQEAgLTAsMCArMSw1NjcgQEAKKyNpZm5kZWYgX1hUQUJMRVNfSAorI2RlZmluZSBfWFRBQkxFU19ICisKKy8qCisgKiBDaGFuZ2luZyBhbnkgc3RydWN0cy9mdW5jdGlvbnMgbWF5IGluY3VyIGEgbmVlZGVkIGNoYW5nZQorICogaW4gbGlieHRhYmxlc192Y3VycmVudC92YWdlIHRvby4KKyAqLworCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPiAvKiBQRl8qICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorCisjaWZuZGVmIElQUFJPVE9fU0NUUAorI2RlZmluZSBJUFBST1RPX1NDVFAgMTMyCisjZW5kaWYKKyNpZm5kZWYgSVBQUk9UT19EQ0NQCisjZGVmaW5lIElQUFJPVE9fRENDUCAzMworI2VuZGlmCisjaWZuZGVmIElQUFJPVE9fTUgKKyMJZGVmaW5lIElQUFJPVE9fTUggMTM1CisjZW5kaWYKKyNpZm5kZWYgSVBQUk9UT19VRFBMSVRFCisjZGVmaW5lIElQUFJPVE9fVURQTElURQkxMzYKKyNlbmRpZgorCisjaW5jbHVkZSA8eHRhYmxlcy12ZXJzaW9uLmg+CisKK3N0cnVjdCBpbl9hZGRyOworCisvKgorICogLnNpemUgaXMgaGVyZSBzbyB0aGF0IHRoZXJlIGlzIGEgc29tZXdoYXQgcmVhc29uYWJsZSBjaGVjaworICogYWdhaW5zdCB0aGUgY2hvc2VuIC50eXBlLgorICovCisjZGVmaW5lIFhUT1BUX1BPSU5URVIoc3R5cGUsIG1lbWJlcikgXAorCS5wdHJvZmYgPSBvZmZzZXRvZihzdHlwZSwgbWVtYmVyKSwgXAorCS5zaXplID0gc2l6ZW9mKCgoc3R5cGUgKilOVUxMKS0+bWVtYmVyKQorI2RlZmluZSBYVE9QVF9UQUJMRUVORCB7Lm5hbWUgPSBOVUxMfQorCisvKioKKyAqIFNlbGVjdCB0aGUgZm9ybWF0IHRoZSBpbnB1dCBoYXMgdG8gY29uZm9ybSB0bywgYXMgd2VsbCBhcyB0aGUgdGFyZ2V0IHR5cGUKKyAqIChhcmVhIHBvaW50ZWQgdG8gd2l0aCBYVE9QVF9QT0lOVEVSKS4gTm90ZSB0aGF0IHRoZSBzdG9yaW5nIGlzIG5vdCBhbHdheXMKKyAqIHVuaWZvcm0uIEBjYi0+dmFsIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYXMgbXVjaCBhcyB0aGVyZSBpcyBzcGFjZSwgaS5lLgorICogZXhhY3RseSAyIGl0ZW1zIGZvciByYW5nZXMsIGJ1dCB0aGUgdGFyZ2V0IGFyZWEgY2FuIHJlY2VpdmUgbW9yZSB2YWx1ZXMKKyAqIChlLmcuIGluIGNhc2Ugb2YgcmFuZ2VzKSwgb3IgbGVzcyB2YWx1ZXMgKGUuZy4gJVhUVFlQRV9IT1NUTUFTSykuCisgKgorICogJVhUVFlQRV9OT05FOglvcHRpb24gdGFrZXMgbm8gYXJndW1lbnQKKyAqICVYVFRZUEVfVUlOVCo6CXN0YW5kYXJkIGludGVnZXIKKyAqICVYVFRZUEVfVUlOVCpSQzoJY29sb24tc2VwYXJhdGVkIHJhbmdlIG9mIHN0YW5kYXJkIGludGVnZXJzCisgKiAlWFRUWVBFX0RPVUJMRToJZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBudW1iZXIKKyAqICVYVFRZUEVfU1RSSU5HOglhcmJpdHJhcnkgc3RyaW5nCisgKiAlWFRUWVBFX1RPU01BU0s6CTgtYml0IFRPUyB2YWx1ZSB3aXRoIG9wdGlvbmFsIG1hc2sKKyAqICVYVFRZUEVfTUFSS01BU0szMjoJMzItYml0IG1hcmsgd2l0aCBvcHRpb25hbCBtYXNrCisgKiAlWFRUWVBFX1NZU0xPR0xFVkVMOglzeXNsb2cgbGV2ZWwgYnkgbmFtZSBvciBudW1iZXIKKyAqICVYVFRZUEVfSE9TVDoJb25lIGhvc3Qgb3IgYWRkcmVzcyAocHRyOiB1bmlvbiBuZl9pbmV0X2FkZHIpCisgKiAlWFRUWVBFX0hPU1RNQVNLOglvbmUgaG9zdCBvciBhZGRyZXNzLCB3aXRoIGFuIG9wdGlvbmFsIHByZWZpeCBsZW5ndGgKKyAqIAkJCShwdHI6IHVuaW9uIG5mX2luZXRfYWRkcjsgb25seSBob3N0IHBvcnRpb24gaXMgc3RvcmVkKQorICogJVhUVFlQRV9QUk9UT0NPTDoJcHJvdG9jb2wgbnVtYmVyL25hbWUgZnJvbSAvZXRjL3Byb3RvY29scyAocHRyOiB1aW50OF90KQorICogJVhUVFlQRV9QT1JUOgkxNi1iaXQgcG9ydCBuYW1lIG9yIG51bWJlciAoc3VwcG9ydHMgJVhUT1BUX05CTykKKyAqICVYVFRZUEVfUE9SVFJDOgljb2xvbi1zZXBhcmF0ZWQgcG9ydCByYW5nZSAobmFtZXMgYWNjZXB0YWJsZSksCisgKiAJCQkoc3VwcG9ydHMgJVhUT1BUX05CTykKKyAqICVYVFRZUEVfUExFTjoJcHJlZml4IGxlbmd0aAorICogJVhUVFlQRV9QTEVOTUFTSzoJcHJlZml4IGxlbmd0aCAocHRyOiB1bmlvbiBuZl9pbmV0X2FkZHIpCisgKiAlWFRUWVBFX0VUSEVSTUFDOglFdGhlcm5ldCBNQUMgYWRkcmVzcyBpbiBoZXggZm9ybQorICovCitlbnVtIHh0X29wdGlvbl90eXBlIHsKKwlYVFRZUEVfTk9ORSwKKwlYVFRZUEVfVUlOVDgsCisJWFRUWVBFX1VJTlQxNiwKKwlYVFRZUEVfVUlOVDMyLAorCVhUVFlQRV9VSU5UNjQsCisJWFRUWVBFX1VJTlQ4UkMsCisJWFRUWVBFX1VJTlQxNlJDLAorCVhUVFlQRV9VSU5UMzJSQywKKwlYVFRZUEVfVUlOVDY0UkMsCisJWFRUWVBFX0RPVUJMRSwKKwlYVFRZUEVfU1RSSU5HLAorCVhUVFlQRV9UT1NNQVNLLAorCVhUVFlQRV9NQVJLTUFTSzMyLAorCVhUVFlQRV9TWVNMT0dMRVZFTCwKKwlYVFRZUEVfSE9TVCwKKwlYVFRZUEVfSE9TVE1BU0ssCisJWFRUWVBFX1BST1RPQ09MLAorCVhUVFlQRV9QT1JULAorCVhUVFlQRV9QT1JUUkMsCisJWFRUWVBFX1BMRU4sCisJWFRUWVBFX1BMRU5NQVNLLAorCVhUVFlQRV9FVEhFUk1BQywKK307CisKKy8qKgorICogJVhUT1BUX0lOVkVSVDoJb3B0aW9uIGlzIGludmVydGlibGUgKHVzYWJsZSB3aXRoICEpCisgKiAlWFRPUFRfTUFORDoJCW9wdGlvbiBpcyBtYW5kYXRvcnkKKyAqICVYVE9QVF9NVUxUSToJb3B0aW9uIG1heSBiZSBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMKKyAqICVYVE9QVF9QVVQ6CQlzdG9yZSB2YWx1ZSBpbnRvIG1lbW9yeSBhdCBAcHRyb2ZmCisgKiAlWFRPUFRfTkJPOgkJc3RvcmUgdmFsdWUgaW4gbmV0d29yay1ieXRlIG9yZGVyCisgKiAJCQkob25seSBjZXJ0YWluIFhUVFlQRXMgcmVjb2duaXplIHRoaXMpCisgKi8KK2VudW0geHRfb3B0aW9uX2ZsYWdzIHsKKwlYVE9QVF9JTlZFUlQgPSAxIDw8IDAsCisJWFRPUFRfTUFORCAgID0gMSA8PCAxLAorCVhUT1BUX01VTFRJICA9IDEgPDwgMiwKKwlYVE9QVF9QVVQgICAgPSAxIDw8IDMsCisJWFRPUFRfTkJPICAgID0gMSA8PCA0LAorfTsKKworLyoqCisgKiBAbmFtZToJbmFtZSBvZiBvcHRpb24KKyAqIEB0eXBlOgl0eXBlIG9mIGlucHV0IGFuZCB2YWxpZGF0aW9uIG1ldGhvZCwgc2VlICVYVFRZUEVfKgorICogQGlkOgkJdW5pcXVlIG51bWJlciAod2l0aGluIGV4dGVuc2lvbikgZm9yIG9wdGlvbiwgMC0zMQorICogQGV4Y2w6CWJpdG1hc2sgb2YgZmxhZ3MgdGhhdCBjYW5ub3QgYmUgdXNlZCB3aXRoIHRoaXMgb3B0aW9uCisgKiBAYWxzbzoJYml0bWFzayBvZiBmbGFncyB0aGF0IG11c3QgYmUgdXNlZCB3aXRoIHRoaXMgb3B0aW9uCisgKiBAZmxhZ3M6CWJpdG1hc2sgb2Ygb3B0aW9uIGZsYWdzLCBzZWUgJVhUT1BUXyoKKyAqIEBwdHJvZmY6CW9mZnNldCBpbnRvIHByaXZhdGUgc3RydWN0dXJlIGZvciBtZW1iZXIKKyAqIEBzaXplOglzaXplIG9mIHRoZSBpdGVtIHBvaW50ZWQgdG8gYnkgQHB0cm9mZjsgdGhpcyBpcyBhIHNhZmVndWFyZAorICogQG1pbjoJbG93ZXN0IGFsbG93ZWQgdmFsdWUgKGZvciBzaW5ndWxhciBpbnRlZ3JhbCB0eXBlcykKKyAqIEBtYXg6CWhpZ2hlc3QgYWxsb3dlZCB2YWx1ZSAoZm9yIHNpbmd1bGFyIGludGVncmFsIHR5cGVzKQorICovCitzdHJ1Y3QgeHRfb3B0aW9uX2VudHJ5IHsKKwljb25zdCBjaGFyICpuYW1lOworCWVudW0geHRfb3B0aW9uX3R5cGUgdHlwZTsKKwl1bnNpZ25lZCBpbnQgaWQsIGV4Y2wsIGFsc28sIGZsYWdzOworCXVuc2lnbmVkIGludCBwdHJvZmY7CisJc2l6ZV90IHNpemU7CisJdW5zaWduZWQgaW50IG1pbiwgbWF4OworfTsKKworLyoqCisgKiBAYXJnOglpbnB1dCBmcm9tIGNvbW1hbmQgbGluZQorICogQGV4dF9uYW1lOgluYW1lIG9mIGV4dGVuc2lvbiBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkCisgKiBAZW50cnk6CWN1cnJlbnQgb3B0aW9uIGJlaW5nIHByb2Nlc3NlZAorICogQGRhdGE6CXBlci1leHRlbnNpb24ga2VybmVsIGRhdGEgYmxvY2sKKyAqIEB4ZmxhZ3M6CW9wdGlvbnMgb2YgdGhlIGV4dGVuc2lvbiB0aGF0IGhhdmUgYmVlbiB1c2VkCisgKiBAaW52ZXJ0Ogl3aGV0aGVyIG9wdGlvbiB3YXMgdXNlZCB3aXRoICEKKyAqIEBudmFsczoJbnVtYmVyIG9mIHJlc3VsdHMgaW4gdVhYX211bHRpCisgKiBAdmFsOglwYXJzZWQgcmVzdWx0CisgKiBAdWRhdGE6CXBlci1leHRlbnNpb24gcHJpdmF0ZSBzY3JhdGNoIGFyZWEKKyAqIAkJKGNmLiB4dGFibGVzX3ttYXRjaCx0YXJnZXR9LT51ZGF0YV9zaXplKQorICovCitzdHJ1Y3QgeHRfb3B0aW9uX2NhbGwgeworCWNvbnN0IGNoYXIgKmFyZywgKmV4dF9uYW1lOworCWNvbnN0IHN0cnVjdCB4dF9vcHRpb25fZW50cnkgKmVudHJ5OworCXZvaWQgKmRhdGE7CisJdW5zaWduZWQgaW50IHhmbGFnczsKKwlib29sIGludmVydDsKKwl1aW50OF90IG52YWxzOworCXVuaW9uIHsKKwkJdWludDhfdCB1OCwgdThfcmFuZ2VbMl0sIHN5c2xvZ19sZXZlbCwgcHJvdG9jb2w7CisJCXVpbnQxNl90IHUxNiwgdTE2X3JhbmdlWzJdLCBwb3J0LCBwb3J0X3JhbmdlWzJdOworCQl1aW50MzJfdCB1MzIsIHUzMl9yYW5nZVsyXTsKKwkJdWludDY0X3QgdTY0LCB1NjRfcmFuZ2VbMl07CisJCWRvdWJsZSBkYmw7CisJCXN0cnVjdCB7CisJCQl1bmlvbiBuZl9pbmV0X2FkZHIgaGFkZHIsIGhtYXNrOworCQkJdWludDhfdCBobGVuOworCQl9OworCQlzdHJ1Y3QgeworCQkJdWludDhfdCB0b3NfdmFsdWUsIHRvc19tYXNrOworCQl9OworCQlzdHJ1Y3QgeworCQkJdWludDMyX3QgbWFyaywgbWFzazsKKwkJfTsKKwkJdWludDhfdCBldGhlcm1hY1s2XTsKKwl9IHZhbDsKKwkvKiBXaXNoZWQgZm9yIGEgd29ybGQgd2hlcmUgdGhlIG9uZXMgYmVsb3cgd2VyZSBnb25lOiAqLworCXVuaW9uIHsKKwkJc3RydWN0IHh0X2VudHJ5X21hdGNoICoqbWF0Y2g7CisJCXN0cnVjdCB4dF9lbnRyeV90YXJnZXQgKip0YXJnZXQ7CisJfTsKKwl2b2lkICp4dF9lbnRyeTsKKwl2b2lkICp1ZGF0YTsKK307CisKKy8qKgorICogQGV4dF9uYW1lOgluYW1lIG9mIGV4dGVuc2lvbiBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkCisgKiBAZGF0YToJcGVyLWV4dGVuc2lvbiAoa2VybmVsKSBkYXRhIGJsb2NrCisgKiBAdWRhdGE6CXBlci1leHRlbnNpb24gcHJpdmF0ZSBzY3JhdGNoIGFyZWEKKyAqIAkJKGNmLiB4dGFibGVzX3ttYXRjaCx0YXJnZXR9LT51ZGF0YV9zaXplKQorICogQHhmbGFnczoJb3B0aW9ucyBvZiB0aGUgZXh0ZW5zaW9uIHRoYXQgaGF2ZSBiZWVuIHVzZWQKKyAqLworc3RydWN0IHh0X2ZjaGVja19jYWxsIHsKKwljb25zdCBjaGFyICpleHRfbmFtZTsKKwl2b2lkICpkYXRhLCAqdWRhdGE7CisJdW5zaWduZWQgaW50IHhmbGFnczsKK307CisKKy8qKgorICogQSAibGluZWFyIi9saW5rZWQtbGlzdCBiYXNlZCBuYW1lPC0+aWQgbWFwLCBmb3IgZmlsZXMgc2ltaWxhciB0bworICogL2V0Yy9pcHJvdXRlMi8uCisgKi8KK3N0cnVjdCB4dGFibGVzX2xtYXAgeworCWNoYXIgKm5hbWU7CisJaW50IGlkOworCXN0cnVjdCB4dGFibGVzX2xtYXAgKm5leHQ7Cit9OworCitlbnVtIHh0YWJsZXNfZXh0X2ZsYWdzIHsKKwlYVEFCTEVTX0VYVF9BTElBUyA9IDEgPDwgMCwKK307CisKKy8qIEluY2x1ZGUgZmlsZSBmb3IgYWRkaXRpb25zOiBuZXcgbWF0Y2hlcyBhbmQgdGFyZ2V0cy4gKi8KK3N0cnVjdCB4dGFibGVzX21hdGNoCit7CisJLyoKKwkgKiBBQkkvQVBJIHZlcnNpb24gdGhpcyBtb2R1bGUgcmVxdWlyZXMuIE11c3QgYmUgZmlyc3QgbWVtYmVyLAorCSAqIGFzIHRoZSByZXN0IG9mIHRoaXMgc3RydWN0IG1heSBiZSBzdWJqZWN0IHRvIEFCSSBjaGFuZ2VzLgorCSAqLworCWNvbnN0IGNoYXIgKnZlcnNpb247CisKKwlzdHJ1Y3QgeHRhYmxlc19tYXRjaCAqbmV4dDsKKworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqcmVhbF9uYW1lOworCisJLyogUmV2aXNpb24gb2YgbWF0Y2ggKDAgYnkgZGVmYXVsdCkuICovCisJdWludDhfdCByZXZpc2lvbjsKKworCS8qIEV4dGVuc2lvbiBmbGFncyAqLworCXVpbnQ4X3QgZXh0X2ZsYWdzOworCisJdWludDE2X3QgZmFtaWx5OworCisJLyogU2l6ZSBvZiBtYXRjaCBkYXRhLiAqLworCXNpemVfdCBzaXplOworCisJLyogU2l6ZSBvZiBtYXRjaCBkYXRhIHJlbGV2YW50IGZvciB1c2Vyc3BhY2UgY29tcGFyaXNvbiBwdXJwb3NlcyAqLworCXNpemVfdCB1c2Vyc3BhY2VzaXplOworCisJLyogRnVuY3Rpb24gd2hpY2ggcHJpbnRzIG91dCB1c2FnZSBtZXNzYWdlLiAqLworCXZvaWQgKCpoZWxwKSh2b2lkKTsKKworCS8qIEluaXRpYWxpemUgdGhlIG1hdGNoLiAqLworCXZvaWQgKCppbml0KShzdHJ1Y3QgeHRfZW50cnlfbWF0Y2ggKm0pOworCisJLyogRnVuY3Rpb24gd2hpY2ggcGFyc2VzIGNvbW1hbmQgb3B0aW9uczsgcmV0dXJucyB0cnVlIGlmIGl0CisgICAgICAgICAgIGF0ZSBhbiBvcHRpb24gKi8KKwkvKiBlbnRyeSBpcyBzdHJ1Y3QgaXB0X2VudHJ5IGZvciBleGFtcGxlICovCisJaW50ICgqcGFyc2UpKGludCBjLCBjaGFyICoqYXJndiwgaW50IGludmVydCwgdW5zaWduZWQgaW50ICpmbGFncywKKwkJICAgICBjb25zdCB2b2lkICplbnRyeSwKKwkJICAgICBzdHJ1Y3QgeHRfZW50cnlfbWF0Y2ggKiptYXRjaCk7CisKKwkvKiBGaW5hbCBjaGVjazsgZXhpdCBpZiBub3Qgb2suICovCisJdm9pZCAoKmZpbmFsX2NoZWNrKSh1bnNpZ25lZCBpbnQgZmxhZ3MpOworCisJLyogUHJpbnRzIG91dCB0aGUgbWF0Y2ggaWZmIG5vbi1OVUxMOiBwdXQgc3BhY2UgYXQgZW5kICovCisJLyogaXAgaXMgc3RydWN0IGlwdF9pcCAqIGZvciBleGFtcGxlICovCisJdm9pZCAoKnByaW50KShjb25zdCB2b2lkICppcCwKKwkJICAgICAgY29uc3Qgc3RydWN0IHh0X2VudHJ5X21hdGNoICptYXRjaCwgaW50IG51bWVyaWMpOworCisJLyogU2F2ZXMgdGhlIG1hdGNoIGluZm8gaW4gcGFyc2FibGUgZm9ybSB0byBzdGRvdXQuICovCisJLyogaXAgaXMgc3RydWN0IGlwdF9pcCAqIGZvciBleGFtcGxlICovCisJdm9pZCAoKnNhdmUpKGNvbnN0IHZvaWQgKmlwLCBjb25zdCBzdHJ1Y3QgeHRfZW50cnlfbWF0Y2ggKm1hdGNoKTsKKworCS8qIFByaW50IG1hdGNoIG5hbWUgb3IgYWxpYXMgKi8KKwljb25zdCBjaGFyICooKmFsaWFzKShjb25zdCBzdHJ1Y3QgeHRfZW50cnlfbWF0Y2ggKm1hdGNoKTsKKworCS8qIFBvaW50ZXIgdG8gbGlzdCBvZiBleHRyYSBjb21tYW5kLWxpbmUgb3B0aW9ucyAqLworCWNvbnN0IHN0cnVjdCBvcHRpb24gKmV4dHJhX29wdHM7CisKKwkvKiBOZXcgcGFyc2VyICovCisJdm9pZCAoKng2X3BhcnNlKShzdHJ1Y3QgeHRfb3B0aW9uX2NhbGwgKik7CisJdm9pZCAoKng2X2ZjaGVjaykoc3RydWN0IHh0X2ZjaGVja19jYWxsICopOworCWNvbnN0IHN0cnVjdCB4dF9vcHRpb25fZW50cnkgKng2X29wdGlvbnM7CisKKwkvKiBTaXplIG9mIHBlci1leHRlbnNpb24gaW5zdGFuY2UgZXh0cmEgImdsb2JhbCIgc2NyYXRjaCBzcGFjZSAqLworCXNpemVfdCB1ZGF0YV9zaXplOworCisJLyogSWdub3JlIHRoZXNlIG1lbiBiZWhpbmQgdGhlIGN1cnRhaW46ICovCisJdm9pZCAqdWRhdGE7CisJdW5zaWduZWQgaW50IG9wdGlvbl9vZmZzZXQ7CisJc3RydWN0IHh0X2VudHJ5X21hdGNoICptOworCXVuc2lnbmVkIGludCBtZmxhZ3M7CisJdW5zaWduZWQgaW50IGxvYWRlZDsgLyogc2ltdWxhdGUgbG9hZGluZyBzbyBvcHRpb25zIGFyZSBtZXJnZWQgcHJvcGVybHkgKi8KK307CisKK3N0cnVjdCB4dGFibGVzX3RhcmdldAoreworCS8qCisJICogQUJJL0FQSSB2ZXJzaW9uIHRoaXMgbW9kdWxlIHJlcXVpcmVzLiBNdXN0IGJlIGZpcnN0IG1lbWJlciwKKwkgKiBhcyB0aGUgcmVzdCBvZiB0aGlzIHN0cnVjdCBtYXkgYmUgc3ViamVjdCB0byBBQkkgY2hhbmdlcy4KKwkgKi8KKwljb25zdCBjaGFyICp2ZXJzaW9uOworCisJc3RydWN0IHh0YWJsZXNfdGFyZ2V0ICpuZXh0OworCisKKwljb25zdCBjaGFyICpuYW1lOworCisJLyogUmVhbCB0YXJnZXQgYmVoaW5kIHRoaXMsIGlmIGFueS4gKi8KKwljb25zdCBjaGFyICpyZWFsX25hbWU7CisKKwkvKiBSZXZpc2lvbiBvZiB0YXJnZXQgKDAgYnkgZGVmYXVsdCkuICovCisJdWludDhfdCByZXZpc2lvbjsKKworCS8qIEV4dGVuc2lvbiBmbGFncyAqLworCXVpbnQ4X3QgZXh0X2ZsYWdzOworCisJdWludDE2X3QgZmFtaWx5OworCisKKwkvKiBTaXplIG9mIHRhcmdldCBkYXRhLiAqLworCXNpemVfdCBzaXplOworCisJLyogU2l6ZSBvZiB0YXJnZXQgZGF0YSByZWxldmFudCBmb3IgdXNlcnNwYWNlIGNvbXBhcmlzb24gcHVycG9zZXMgKi8KKwlzaXplX3QgdXNlcnNwYWNlc2l6ZTsKKworCS8qIEZ1bmN0aW9uIHdoaWNoIHByaW50cyBvdXQgdXNhZ2UgbWVzc2FnZS4gKi8KKwl2b2lkICgqaGVscCkodm9pZCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSB0YXJnZXQuICovCisJdm9pZCAoKmluaXQpKHN0cnVjdCB4dF9lbnRyeV90YXJnZXQgKnQpOworCisJLyogRnVuY3Rpb24gd2hpY2ggcGFyc2VzIGNvbW1hbmQgb3B0aW9uczsgcmV0dXJucyB0cnVlIGlmIGl0CisgICAgICAgICAgIGF0ZSBhbiBvcHRpb24gKi8KKwkvKiBlbnRyeSBpcyBzdHJ1Y3QgaXB0X2VudHJ5IGZvciBleGFtcGxlICovCisJaW50ICgqcGFyc2UpKGludCBjLCBjaGFyICoqYXJndiwgaW50IGludmVydCwgdW5zaWduZWQgaW50ICpmbGFncywKKwkJICAgICBjb25zdCB2b2lkICplbnRyeSwKKwkJICAgICBzdHJ1Y3QgeHRfZW50cnlfdGFyZ2V0ICoqdGFyZ2V0aW5mbyk7CisKKwkvKiBGaW5hbCBjaGVjazsgZXhpdCBpZiBub3Qgb2suICovCisJdm9pZCAoKmZpbmFsX2NoZWNrKSh1bnNpZ25lZCBpbnQgZmxhZ3MpOworCisJLyogUHJpbnRzIG91dCB0aGUgdGFyZ2V0IGlmZiBub24tTlVMTDogcHV0IHNwYWNlIGF0IGVuZCAqLworCXZvaWQgKCpwcmludCkoY29uc3Qgdm9pZCAqaXAsCisJCSAgICAgIGNvbnN0IHN0cnVjdCB4dF9lbnRyeV90YXJnZXQgKnRhcmdldCwgaW50IG51bWVyaWMpOworCisJLyogU2F2ZXMgdGhlIHRhcmdpbmZvIGluIHBhcnNhYmxlIGZvcm0gdG8gc3Rkb3V0LiAqLworCXZvaWQgKCpzYXZlKShjb25zdCB2b2lkICppcCwKKwkJICAgICBjb25zdCBzdHJ1Y3QgeHRfZW50cnlfdGFyZ2V0ICp0YXJnZXQpOworCisJLyogUHJpbnQgdGFyZ2V0IG5hbWUgb3IgYWxpYXMgKi8KKwljb25zdCBjaGFyICooKmFsaWFzKShjb25zdCBzdHJ1Y3QgeHRfZW50cnlfdGFyZ2V0ICp0YXJnZXQpOworCisJLyogUG9pbnRlciB0byBsaXN0IG9mIGV4dHJhIGNvbW1hbmQtbGluZSBvcHRpb25zICovCisJY29uc3Qgc3RydWN0IG9wdGlvbiAqZXh0cmFfb3B0czsKKworCS8qIE5ldyBwYXJzZXIgKi8KKwl2b2lkICgqeDZfcGFyc2UpKHN0cnVjdCB4dF9vcHRpb25fY2FsbCAqKTsKKwl2b2lkICgqeDZfZmNoZWNrKShzdHJ1Y3QgeHRfZmNoZWNrX2NhbGwgKik7CisJY29uc3Qgc3RydWN0IHh0X29wdGlvbl9lbnRyeSAqeDZfb3B0aW9uczsKKworCXNpemVfdCB1ZGF0YV9zaXplOworCisJLyogSWdub3JlIHRoZXNlIG1lbiBiZWhpbmQgdGhlIGN1cnRhaW46ICovCisJdm9pZCAqdWRhdGE7CisJdW5zaWduZWQgaW50IG9wdGlvbl9vZmZzZXQ7CisJc3RydWN0IHh0X2VudHJ5X3RhcmdldCAqdDsKKwl1bnNpZ25lZCBpbnQgdGZsYWdzOworCXVuc2lnbmVkIGludCB1c2VkOworCXVuc2lnbmVkIGludCBsb2FkZWQ7IC8qIHNpbXVsYXRlIGxvYWRpbmcgc28gb3B0aW9ucyBhcmUgbWVyZ2VkIHByb3Blcmx5ICovCit9OworCitzdHJ1Y3QgeHRhYmxlc19ydWxlX21hdGNoIHsKKwlzdHJ1Y3QgeHRhYmxlc19ydWxlX21hdGNoICpuZXh0OworCXN0cnVjdCB4dGFibGVzX21hdGNoICptYXRjaDsKKwkvKiBNdWx0aXBsZSBtYXRjaGVzIG9mIHRoZSBzYW1lIHR5cGU6IHRoZSBvbmVzIGJlZm9yZQorCSAgIHRoZSBjdXJyZW50IG9uZSBhcmUgY29tcGxldGVkIGZyb20gcGFyc2luZyBwb2ludCBvZiB2aWV3ICovCisJYm9vbCBjb21wbGV0ZWQ7Cit9OworCisvKioKKyAqIHN0cnVjdCB4dGFibGVzX3Bwcm90IC0KKyAqCisgKiBBIGZldyBoYXJkY29kZWQgcHJvdG9jb2xzIGZvciAnYWxsJyBhbmQgaW4gY2FzZSB0aGUgdXNlciBoYXMgbm8KKyAqIC9ldGMvcHJvdG9jb2xzLgorICovCitzdHJ1Y3QgeHRhYmxlc19wcHJvdCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1aW50OF90IG51bTsKK307CisKK2VudW0geHRhYmxlc190cnlsb2FkIHsKKwlYVEZfRE9OVF9MT0FELAorCVhURl9EVVJJTkdfTE9BRCwKKwlYVEZfVFJZX0xPQUQsCisJWFRGX0xPQURfTVVTVF9TVUNDRUVELAorfTsKKworZW51bSB4dGFibGVzX2V4aXR0eXBlIHsKKwlPVEhFUl9QUk9CTEVNID0gMSwKKwlQQVJBTUVURVJfUFJPQkxFTSwKKwlWRVJTSU9OX1BST0JMRU0sCisJUkVTT1VSQ0VfUFJPQkxFTSwKKwlYVEZfT05MWV9PTkNFLAorCVhURl9OT19JTlZFUlQsCisJWFRGX0JBRF9WQUxVRSwKKwlYVEZfT05FX0FDVElPTiwKK307CisKK3N0cnVjdCB4dGFibGVzX2dsb2JhbHMKK3sKKwl1bnNpZ25lZCBpbnQgb3B0aW9uX29mZnNldDsKKwljb25zdCBjaGFyICpwcm9ncmFtX25hbWUsICpwcm9ncmFtX3ZlcnNpb247CisJc3RydWN0IG9wdGlvbiAqb3JpZ19vcHRzOworCXN0cnVjdCBvcHRpb24gKm9wdHM7CisJdm9pZCAoKmV4aXRfZXJyKShlbnVtIHh0YWJsZXNfZXhpdHR5cGUgc3RhdHVzLCBjb25zdCBjaGFyICptc2csIC4uLikgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4sIGZvcm1hdChwcmludGYsMiwzKSkpOworCWludCAoKmNvbXBhdF9yZXYpKGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQ4X3QgcmV2LCBpbnQgb3B0KTsKK307CisKKyNkZWZpbmUgWFRfR0VUT1BUX1RBQkxFRU5EIHsubmFtZSA9IE5VTEwsIC5oYXNfYXJnID0gZmFsc2V9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworZXh0ZXJuIGNvbnN0IGNoYXIgKnh0YWJsZXNfbW9kcHJvYmVfcHJvZ3JhbTsKK2V4dGVybiBzdHJ1Y3QgeHRhYmxlc19tYXRjaCAqeHRhYmxlc19tYXRjaGVzOworZXh0ZXJuIHN0cnVjdCB4dGFibGVzX3RhcmdldCAqeHRhYmxlc190YXJnZXRzOworCitleHRlcm4gdm9pZCB4dGFibGVzX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCB4dGFibGVzX3NldF9uZnByb3RvKHVpbnQ4X3QpOworZXh0ZXJuIHZvaWQgKnh0YWJsZXNfY2FsbG9jKHNpemVfdCwgc2l6ZV90KTsKK2V4dGVybiB2b2lkICp4dGFibGVzX21hbGxvYyhzaXplX3QpOworZXh0ZXJuIHZvaWQgKnh0YWJsZXNfcmVhbGxvYyh2b2lkICosIHNpemVfdCk7CisKK2V4dGVybiBpbnQgeHRhYmxlc19pbnNtb2QoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGJvb2wpOworZXh0ZXJuIGludCB4dGFibGVzX2xvYWRfa28oY29uc3QgY2hhciAqLCBib29sKTsKK2V4dGVybiBpbnQgeHRhYmxlc19zZXRfcGFyYW1zKHN0cnVjdCB4dGFibGVzX2dsb2JhbHMgKnh0cCk7CitleHRlcm4gdm9pZCB4dGFibGVzX2ZyZWVfb3B0cyhpbnQgcmVzZXRfb2Zmc2V0KTsKK2V4dGVybiBzdHJ1Y3Qgb3B0aW9uICp4dGFibGVzX21lcmdlX29wdGlvbnMoc3RydWN0IG9wdGlvbiAqb3JpZ29wdHMsCisJc3RydWN0IG9wdGlvbiAqb2xkb3B0cywgY29uc3Qgc3RydWN0IG9wdGlvbiAqbmV3b3B0cywKKwl1bnNpZ25lZCBpbnQgKm9wdGlvbl9vZmZzZXQpOworCitleHRlcm4gaW50IHh0YWJsZXNfaW5pdF9hbGwoc3RydWN0IHh0YWJsZXNfZ2xvYmFscyAqeHRwLCB1aW50OF90IG5mcHJvdG8pOworZXh0ZXJuIHN0cnVjdCB4dGFibGVzX21hdGNoICp4dGFibGVzX2ZpbmRfbWF0Y2goY29uc3QgY2hhciAqbmFtZSwKKwllbnVtIHh0YWJsZXNfdHJ5bG9hZCwgc3RydWN0IHh0YWJsZXNfcnVsZV9tYXRjaCAqKm1hdGNoKTsKK2V4dGVybiBzdHJ1Y3QgeHRhYmxlc190YXJnZXQgKnh0YWJsZXNfZmluZF90YXJnZXQoY29uc3QgY2hhciAqbmFtZSwKKwllbnVtIHh0YWJsZXNfdHJ5bG9hZCk7CitleHRlcm4gaW50IHh0YWJsZXNfY29tcGF0aWJsZV9yZXZpc2lvbihjb25zdCBjaGFyICpuYW1lLCB1aW50OF90IHJldmlzaW9uLAorCQkJCSAgICAgICBpbnQgb3B0KTsKKworZXh0ZXJuIHZvaWQgeHRhYmxlc19ydWxlX21hdGNoZXNfZnJlZShzdHJ1Y3QgeHRhYmxlc19ydWxlX21hdGNoICoqbWF0Y2hlcyk7CisKKy8qIFlvdXIgc2hhcmVkIGxpYnJhcnkgc2hvdWxkIGNhbGwgb25lIG9mIHRoZXNlLiAqLworZXh0ZXJuIHZvaWQgeHRhYmxlc19yZWdpc3Rlcl9tYXRjaChzdHJ1Y3QgeHRhYmxlc19tYXRjaCAqbWUpOworZXh0ZXJuIHZvaWQgeHRhYmxlc19yZWdpc3Rlcl9tYXRjaGVzKHN0cnVjdCB4dGFibGVzX21hdGNoICosIHVuc2lnbmVkIGludCk7CitleHRlcm4gdm9pZCB4dGFibGVzX3JlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgeHRhYmxlc190YXJnZXQgKm1lKTsKK2V4dGVybiB2b2lkIHh0YWJsZXNfcmVnaXN0ZXJfdGFyZ2V0cyhzdHJ1Y3QgeHRhYmxlc190YXJnZXQgKiwgdW5zaWduZWQgaW50KTsKKworZXh0ZXJuIGJvb2wgeHRhYmxlc19zdHJ0b3VsKGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgdWludG1heF90ICosCisJdWludG1heF90LCB1aW50bWF4X3QpOworZXh0ZXJuIGJvb2wgeHRhYmxlc19zdHJ0b3VpKGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgdW5zaWduZWQgaW50ICosCisJdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIGludCB4dGFibGVzX3NlcnZpY2VfdG9fcG9ydChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpwcm90byk7CitleHRlcm4gdWludDE2X3QgeHRhYmxlc19wYXJzZV9wb3J0KGNvbnN0IGNoYXIgKnBvcnQsIGNvbnN0IGNoYXIgKnByb3RvKTsKK2V4dGVybiB2b2lkCit4dGFibGVzX3BhcnNlX2ludGVyZmFjZShjb25zdCBjaGFyICphcmcsIGNoYXIgKnZpYW5hbWUsIHVuc2lnbmVkIGNoYXIgKm1hc2spOworCisvKiB0aGlzIGlzIGEgc3BlY2lhbCA2NGJpdCBkYXRhIHR5cGUgdGhhdCBpcyA4LWJ5dGUgYWxpZ25lZCAqLworI2RlZmluZSBhbGlnbmVkX3U2NCB1aW50NjRfdCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSkKKworZXh0ZXJuIHN0cnVjdCB4dGFibGVzX2dsb2JhbHMgKnh0X3BhcmFtczsKKyNkZWZpbmUgeHRhYmxlc19lcnJvciAoeHRfcGFyYW1zLT5leGl0X2VycikKKworZXh0ZXJuIHZvaWQgeHRhYmxlc19wYXJhbV9hY3QodW5zaWduZWQgaW50LCBjb25zdCBjaGFyICosIC4uLik7CisKK2V4dGVybiBjb25zdCBjaGFyICp4dGFibGVzX2lwYWRkcl90b19udW1lcmljKGNvbnN0IHN0cnVjdCBpbl9hZGRyICopOworZXh0ZXJuIGNvbnN0IGNoYXIgKnh0YWJsZXNfaXBhZGRyX3RvX2FueW5hbWUoY29uc3Qgc3RydWN0IGluX2FkZHIgKik7CitleHRlcm4gY29uc3QgY2hhciAqeHRhYmxlc19pcG1hc2tfdG9fbnVtZXJpYyhjb25zdCBzdHJ1Y3QgaW5fYWRkciAqKTsKK2V4dGVybiBzdHJ1Y3QgaW5fYWRkciAqeHRhYmxlc19udW1lcmljX3RvX2lwYWRkcihjb25zdCBjaGFyICopOworZXh0ZXJuIHN0cnVjdCBpbl9hZGRyICp4dGFibGVzX251bWVyaWNfdG9faXBtYXNrKGNvbnN0IGNoYXIgKik7CitleHRlcm4gaW50IHh0YWJsZXNfaXBtYXNrX3RvX2NpZHIoY29uc3Qgc3RydWN0IGluX2FkZHIgKik7CitleHRlcm4gdm9pZCB4dGFibGVzX2lwcGFyc2VfYW55KGNvbnN0IGNoYXIgKiwgc3RydWN0IGluX2FkZHIgKiosCisJc3RydWN0IGluX2FkZHIgKiwgdW5zaWduZWQgaW50ICopOworZXh0ZXJuIHZvaWQgeHRhYmxlc19pcHBhcnNlX211bHRpcGxlKGNvbnN0IGNoYXIgKiwgc3RydWN0IGluX2FkZHIgKiosCisJc3RydWN0IGluX2FkZHIgKiosIHVuc2lnbmVkIGludCAqKTsKKworZXh0ZXJuIHN0cnVjdCBpbjZfYWRkciAqeHRhYmxlc19udW1lcmljX3RvX2lwNmFkZHIoY29uc3QgY2hhciAqKTsKK2V4dGVybiBjb25zdCBjaGFyICp4dGFibGVzX2lwNmFkZHJfdG9fbnVtZXJpYyhjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKik7CitleHRlcm4gY29uc3QgY2hhciAqeHRhYmxlc19pcDZhZGRyX3RvX2FueW5hbWUoY29uc3Qgc3RydWN0IGluNl9hZGRyICopOworZXh0ZXJuIGNvbnN0IGNoYXIgKnh0YWJsZXNfaXA2bWFza190b19udW1lcmljKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqKTsKK2V4dGVybiBpbnQgeHRhYmxlc19pcDZtYXNrX3RvX2NpZHIoY29uc3Qgc3RydWN0IGluNl9hZGRyICopOworZXh0ZXJuIHZvaWQgeHRhYmxlc19pcDZwYXJzZV9hbnkoY29uc3QgY2hhciAqLCBzdHJ1Y3QgaW42X2FkZHIgKiosCisJc3RydWN0IGluNl9hZGRyICosIHVuc2lnbmVkIGludCAqKTsKK2V4dGVybiB2b2lkIHh0YWJsZXNfaXA2cGFyc2VfbXVsdGlwbGUoY29uc3QgY2hhciAqLCBzdHJ1Y3QgaW42X2FkZHIgKiosCisJc3RydWN0IGluNl9hZGRyICoqLCB1bnNpZ25lZCBpbnQgKik7CisKKy8qKgorICogUHJpbnQgdGhlIHNwZWNpZmllZCB2YWx1ZSB0byBzdGFuZGFyZCBvdXRwdXQsIHF1b3RpbmcgZGFuZ2Vyb3VzCisgKiBjaGFyYWN0ZXJzIGlmIHJlcXVpcmVkLgorICovCitleHRlcm4gdm9pZCB4dGFibGVzX3NhdmVfc3RyaW5nKGNvbnN0IGNoYXIgKnZhbHVlKTsKKworI2RlZmluZSBGTVRfTlVNRVJJQwkJMHgwMDAxCisjZGVmaW5lIEZNVF9OT0NPVU5UUwkJMHgwMDAyCisjZGVmaW5lIEZNVF9LSUxPTUVHQUdJR0EJMHgwMDA0CisjZGVmaW5lIEZNVF9PUFRJT05TCQkweDAwMDgKKyNkZWZpbmUgRk1UX05PVEFCTEUJCTB4MDAxMAorI2RlZmluZSBGTVRfTk9UQVJHRVQJCTB4MDAyMAorI2RlZmluZSBGTVRfVklBCQkJMHgwMDQwCisjZGVmaW5lIEZNVF9OT05FV0xJTkUJCTB4MDA4MAorI2RlZmluZSBGTVRfTElORU5VTUJFUlMJCTB4MDEwMAorCisjZGVmaW5lIEZNVF9QUklOVF9SVUxFIChGTVRfTk9DT1VOVFMgfCBGTVRfT1BUSU9OUyB8IEZNVF9WSUEgXAorICAgICAgICAgICAgICAgICAgICAgICAgfCBGTVRfTlVNRVJJQyB8IEZNVF9OT1RBQkxFKQorI2RlZmluZSBGTVQodGFiLG5vdGFiKSAoKGZvcm1hdCkgJiBGTVRfTk9UQUJMRSA/IChub3RhYikgOiAodGFiKSkKKworZXh0ZXJuIHZvaWQgeHRhYmxlc19wcmludF9udW0odWludDY0X3QgbnVtYmVyLCB1bnNpZ25lZCBpbnQgZm9ybWF0KTsKKworI2lmIGRlZmluZWQoQUxMX0lOQ0xVU0lWRSkgfHwgZGVmaW5lZChOT19TSEFSRURfTElCUykKKyMJaWZkZWYgX0lOSVQKKyMJCXVuZGVmIF9pbml0CisjCQlkZWZpbmUgX2luaXQgX0lOSVQKKyMJZW5kaWYKKwlleHRlcm4gdm9pZCBpbml0X2V4dGVuc2lvbnModm9pZCk7CisJZXh0ZXJuIHZvaWQgaW5pdF9leHRlbnNpb25zNCh2b2lkKTsKKwlleHRlcm4gdm9pZCBpbml0X2V4dGVuc2lvbnM2KHZvaWQpOworI2Vsc2UKKyMJZGVmaW5lIF9pbml0IF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkgX0lOSVQKKyNlbmRpZgorCitleHRlcm4gY29uc3Qgc3RydWN0IHh0YWJsZXNfcHByb3QgeHRhYmxlc19jaGFpbl9wcm90b3NbXTsKK2V4dGVybiB1aW50MTZfdCB4dGFibGVzX3BhcnNlX3Byb3RvY29sKGNvbnN0IGNoYXIgKnMpOworCisvKiBrZXJuZWwgcmV2aXNpb24gaGFuZGxpbmcgKi8KK2V4dGVybiBpbnQga2VybmVsX3ZlcnNpb247CitleHRlcm4gdm9pZCBnZXRfa2VybmVsX3ZlcnNpb24odm9pZCk7CisjZGVmaW5lIExJTlVYX1ZFUlNJT04oeCx5LHopCSgweDEwMDAwKih4KSArIDB4MTAwKih5KSArIHopCisjZGVmaW5lIExJTlVYX1ZFUlNJT05fTUFKT1IoeCkJKCgoeCk+PjE2KSAmIDB4RkYpCisjZGVmaW5lIExJTlVYX1ZFUlNJT05fTUlOT1IoeCkJKCgoeCk+PiA4KSAmIDB4RkYpCisjZGVmaW5lIExJTlVYX1ZFUlNJT05fUEFUQ0goeCkJKCAoeCkgICAgICAmIDB4RkYpCisKKy8qIHh0b3B0aW9ucy5jICovCitleHRlcm4gdm9pZCB4dGFibGVzX29wdGlvbl9tZXRhdmFsaWRhdGUoY29uc3QgY2hhciAqLAorCQkJCQljb25zdCBzdHJ1Y3QgeHRfb3B0aW9uX2VudHJ5ICopOworZXh0ZXJuIHN0cnVjdCBvcHRpb24gKnh0YWJsZXNfb3B0aW9uc194ZnJtKHN0cnVjdCBvcHRpb24gKiwgc3RydWN0IG9wdGlvbiAqLAorCQkJCQkgICBjb25zdCBzdHJ1Y3QgeHRfb3B0aW9uX2VudHJ5ICosCisJCQkJCSAgIHVuc2lnbmVkIGludCAqKTsKK2V4dGVybiB2b2lkIHh0YWJsZXNfb3B0aW9uX3BhcnNlKHN0cnVjdCB4dF9vcHRpb25fY2FsbCAqKTsKK2V4dGVybiB2b2lkIHh0YWJsZXNfb3B0aW9uX3RwY2FsbCh1bnNpZ25lZCBpbnQsIGNoYXIgKiosIGJvb2wsCisJCQkJICBzdHJ1Y3QgeHRhYmxlc190YXJnZXQgKiwgdm9pZCAqKTsKK2V4dGVybiB2b2lkIHh0YWJsZXNfb3B0aW9uX21wY2FsbCh1bnNpZ25lZCBpbnQsIGNoYXIgKiosIGJvb2wsCisJCQkJICBzdHJ1Y3QgeHRhYmxlc19tYXRjaCAqLCB2b2lkICopOworZXh0ZXJuIHZvaWQgeHRhYmxlc19vcHRpb25fdGZjYWxsKHN0cnVjdCB4dGFibGVzX3RhcmdldCAqKTsKK2V4dGVybiB2b2lkIHh0YWJsZXNfb3B0aW9uX21mY2FsbChzdHJ1Y3QgeHRhYmxlc19tYXRjaCAqKTsKK2V4dGVybiB2b2lkIHh0YWJsZXNfb3B0aW9uc19mY2hlY2soY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsCisJCQkJICAgY29uc3Qgc3RydWN0IHh0X29wdGlvbl9lbnRyeSAqKTsKKworZXh0ZXJuIHN0cnVjdCB4dGFibGVzX2xtYXAgKnh0YWJsZXNfbG1hcF9pbml0KGNvbnN0IGNoYXIgKik7CitleHRlcm4gdm9pZCB4dGFibGVzX2xtYXBfZnJlZShzdHJ1Y3QgeHRhYmxlc19sbWFwICopOworZXh0ZXJuIGludCB4dGFibGVzX2xtYXBfbmFtZTJpZChjb25zdCBzdHJ1Y3QgeHRhYmxlc19sbWFwICosIGNvbnN0IGNoYXIgKik7CitleHRlcm4gY29uc3QgY2hhciAqeHRhYmxlc19sbWFwX2lkMm5hbWUoY29uc3Qgc3RydWN0IHh0YWJsZXNfbG1hcCAqLCBpbnQpOworCisjaWZkZWYgWFRBQkxFU19JTlRFUk5BTAorCisvKiBTaGlwcGVkIG1vZHVsZXMgcmVseSBvbiB0aGlzLi4uICovCisKKyMJaWZuZGVmIEFSUkFZX1NJWkUKKyMJCWRlZmluZSBBUlJBWV9TSVpFKHgpIChzaXplb2YoeCkgLyBzaXplb2YoKih4KSkpCisjCWVuZGlmCisKK2V4dGVybiB2b2lkIF9pbml0KHZvaWQpOworCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGV4dGVybiAiQyIgKi8KKyNlbmRpZgorCisjZW5kaWYgLyogX1hUQUJMRVNfSCAqLwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaXAvQW5kcm9pZC5tayBiL2lwcm91dGUyL2lwL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM0NWJjNwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2lwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzOCBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX1NSQ19GSUxFUyA6PSBpcC5jIGlwYWRkcmVzcy5jIGlwYWRkcmxhYmVsLmMgaXByb3V0ZS5jIGlwcnVsZS5jIGlwbmV0bnMuYyBcCisgICAgICAgIHJ0bV9tYXAuYyBpcHR1bm5lbC5jIGlwNnR1bm5lbC5jIHR1bm5lbC5jIGlwbmVpZ2guYyBpcG50YWJsZS5jIGlwbGluay5jIFwKKyAgICAgICAgaXBtYWRkci5jIGlwbW9uaXRvci5jIGlwbXJvdXRlLmMgaXBwcmVmaXguYyBpcHR1bnRhcC5jIFwKKyAgICAgICAgaXB4ZnJtLmMgeGZybV9zdGF0ZS5jIHhmcm1fcG9saWN5LmMgeGZybV9tb25pdG9yLmMgXAorICAgICAgICBpcGxpbmtfdmxhbi5jIGxpbmtfdmV0aC5jIGxpbmtfZ3JlLmMgaXBsaW5rX2Nhbi5jIFwKKyAgICAgICAgaXBsaW5rX21hY3ZsYW4uYyBpcGwydHAuYyBcCisgICAgICAgIGlwZm91LmMgaXB0b2tlbi5jIHRjcF9tZXRyaWNzLmMgaXBuZXRjb25mLmMgXAorICAgICAgICBpcHJvdXRlX2x3dHVubmVsLmMKKworTE9DQUxfTU9EVUxFIDo9IGlwCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYyBsaWJtIGxpYmRsCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliaXByb3V0ZXV0aWwgbGlibmV0bGluaworCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvLi4vaW5jbHVkZQorCitMT0NBTF9DRkxBR1MgOj0gXAorICAgIC1PMiAtZyBcCisgICAgLVcgLVdhbGwgXAorICAgIC1Xbm8taW1wbGljaXQtZnVuY3Rpb24tZGVjbGFyYXRpb24gXAorICAgIC1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgXAorICAgIC1Xbm8tcG9pbnRlci1hcml0aCBcCisgICAgLVduby1zaWduLWNvbXBhcmUgXAorICAgIC1Xbm8tdW51c2VkLXBhcmFtZXRlciBcCisgICAgLVdlcnJvciBcCisgICAgLURfR05VX1NPVVJDRSBcCisgICAgLURIQVZFX1NFVE5TIFwKKworTE9DQUxfTERGTEFHUyA6PSAtV2wsLWV4cG9ydC1keW5hbWljIC1XbCwtLW5vLWdjLXNlY3Rpb25zCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pcC9NT0RVTEVfTElDRU5TRV9HUEwgYi9pcHJvdXRlMi9pcC9NT0RVTEVfTElDRU5TRV9HUEwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2lwL01PRFVMRV9MSUNFTlNFX0dQTApkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaXAvTWFrZWZpbGUgYi9pcHJvdXRlMi9pcC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2QyOTg3Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaXAvTWFrZWZpbGUKQEAgLTAsMCArMSw1MyBAQAorSVBPQko9aXAubyBpcGFkZHJlc3MubyBpcGFkZHJsYWJlbC5vIGlwcm91dGUubyBpcHJ1bGUubyBpcG5ldG5zLm8gXAorICAgIHJ0bV9tYXAubyBpcHR1bm5lbC5vIGlwNnR1bm5lbC5vIHR1bm5lbC5vIGlwbmVpZ2gubyBpcG50YWJsZS5vIGlwbGluay5vIFwKKyAgICBpcG1hZGRyLm8gaXBtb25pdG9yLm8gaXBtcm91dGUubyBpcHByZWZpeC5vIGlwdHVudGFwLm8gaXB0b2tlbi5vIFwKKyAgICBpcHhmcm0ubyB4ZnJtX3N0YXRlLm8geGZybV9wb2xpY3kubyB4ZnJtX21vbml0b3IubyBcCisgICAgaXBsaW5rX3ZsYW4ubyBsaW5rX3ZldGgubyBsaW5rX2dyZS5vIGlwbGlua19jYW4ubyBcCisgICAgaXBsaW5rX21hY3ZsYW4ubyBpcGwydHAubyBsaW5rX3Z0aS5vIGxpbmtfdnRpNi5vIFwKKyAgICBpcGxpbmtfdnhsYW4ubyB0Y3BfbWV0cmljcy5vIGlwbGlua19pcG9pYi5vIGlwbmV0Y29uZi5vIGxpbmtfaXA2dG5sLm8gXAorICAgIGxpbmtfaXB0bmwubyBsaW5rX2dyZTYubyBpcGxpbmtfYm9uZC5vIGlwbGlua19ib25kX3NsYXZlLm8gaXBsaW5rX2hzci5vIFwKKyAgICBpcGxpbmtfYnJpZGdlLm8gaXBsaW5rX2JyaWRnZV9zbGF2ZS5vIGlwZm91Lm8gaXBsaW5rX2lwdmxhbi5vIFwKKyAgICBpcGxpbmtfZ2VuZXZlLm8gaXBsaW5rX3ZyZi5vIGlwcm91dGVfbHd0dW5uZWwubworCitSVE1PTk9CSj1ydG1vbi5vCisKK2luY2x1ZGUgLi4vQ29uZmlnCisKK2lmZXEgKCQoSVBfQ09ORklHX1NFVE5TKSx5KQorCUNGTEFHUyArPSAtREhBVkVfU0VUTlMKK2VuZGlmCisKK0FMTE9CSj0kKElQT0JKKSAkKFJUTU9OT0JKKQorU0NSSVBUUz1pZmNmZyBydHByIHJvdXRlbCByb3V0ZWYKK1RBUkdFVFM9aXAgcnRtb24KKworYWxsOiAkKFRBUkdFVFMpICQoU0NSSVBUUykKKworaXA6ICQoSVBPQkopICQoTElCTkVUTElOSykKKworcnRtb246ICQoUlRNT05PQkopCisKK2luc3RhbGw6IGFsbAorCWluc3RhbGwgLW0gMDc1NSAkKFRBUkdFVFMpICQoREVTVERJUikkKFNCSU5ESVIpCisJaW5zdGFsbCAtbSAwNzU1ICQoU0NSSVBUUykgJChERVNURElSKSQoU0JJTkRJUikKKworY2xlYW46CisJcm0gLWYgJChBTExPQkopICQoVEFSR0VUUykKKworU0hBUkVEX0xJQlMgPz0geQoraWZlcSAoJChTSEFSRURfTElCUykseSkKKworTERMSUJTICs9IC1sZGwKK0xERkxBR1MgKz0gLVdsLC1leHBvcnQtZHluYW1pYworCitlbHNlCisKK2lwOiBzdGF0aWMtc3ltcy5vCitzdGF0aWMtc3ltcy5vOiBzdGF0aWMtc3ltcy5oCitzdGF0aWMtc3ltcy5oOiAkKHdpbGRjYXJkICouYykKKwlmaWxlcz0iJF4iIDsgXAorCWZvciBzIGluIGBncmVwIC1CIDMgJ1w8ZGxzeW0nICQkZmlsZXMgfCBzZWQgLW4gJy9zbnByaW50Zi97czouKiJcKFteIl0qXCkiLio6XDE6O3M6JXM6OjtwfSdgIDsgZG8gXAorCQlzZWQgLW4gJy8nJCRzJ1teIF0qID0ve3M6LiogXChbXiBdKickJHMnW14gXSpcKSAuKjpleHRlcm4gY2hhciBcMVtdIF9fYXR0cmlidXRlX18oKHdlYWspKTsgaWYgKCFzdHJjbXAoc3ltLCAiXDEiKSkgcmV0dXJuIFwxOzo7cH0nICQkZmlsZXMgOyBcCisJZG9uZSA+ICRACisKK2VuZGlmCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pcC9OT1RJQ0UgYi9pcHJvdXRlMi9pcC9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkxMjEwOQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2lwL05PVElDRQpAQCAtMCwwICsxLDM0MCBAQAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKKyBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgICAgICAgICAgICAgICAgICAgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKKwkJCSAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCitzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcworR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KK3VzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKK3RoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bworeW91ciBwcm9ncmFtcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAoraWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCithbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCitUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQorZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKK2dyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoreW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKK3NvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKK3JpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCisoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAorZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KKworICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgordGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKK3NvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQord2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KK3RoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCithdXRob3JzJyByZXB1dGF0aW9ucy4KKworICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQorcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQorcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQorcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55CitwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LgorDAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKK2Egbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCit1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCityZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKK21lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Cit0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAorZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKK2xhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KK3RoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCitBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQoraXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCitXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KKworICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKK3NvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQorY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQorY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQorbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OworYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCit5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KKyAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKKyAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAorICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKKyAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCisgICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgorICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQorICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQorICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKKyAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcworICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0CisgICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgorICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQorDAorVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQord2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKK3VuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgorU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisgICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQorICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucworICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKKyAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgorICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKKyAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KKyAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgorICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCisgICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKKyAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCisgICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCisKK1RoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCitjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQorYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCitjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCitzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKK2FueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Citmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQorb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKK2l0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KKworSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZworYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAorYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCitkaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisMCisgIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAorb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCit2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCitIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgordGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKK3BhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCit0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KK3RoaXMgTGljZW5zZS4KKworICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCithbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCithcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgorY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisMCisgIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKK21heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwordGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZworY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCit0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucworb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCitiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KK2FkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQorbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKK3RoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24uCisKKyAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgordG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKK21ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCitvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCitvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCitGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KK09USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKK1BST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECitPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUworVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQorUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCitSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCitSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAorSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCitPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECitUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKK1lPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCitQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorCSAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0CitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KKworICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAordG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKK3RoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcword2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKKworICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgeWVhciBuYW1lIG9mIGF1dGhvcgorICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KKyAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0CisgICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKK3BhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKK2JlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQorbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCituZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQorICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KKworICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKKyAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKworVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCitwcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQorY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCitsaWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaXAvaWZjZmcgYi9pcHJvdXRlMi9pcC9pZmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODNkOWRmCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaXAvaWZjZmcKQEAgLTAsMCArMSwxNDkgQEAKKyMhIC9iaW4vYmFzaAorCitDaGVja0ZvcndhcmRpbmcgKCkgeworICBsb2NhbCBzYmFzZSBmd2QKKyAgc2Jhc2U9L3Byb2Mvc3lzL25ldC9pcHY0L2NvbmYKKyAgZndkPTAKKyAgaWYgWyAtZCAkc2Jhc2UgXTsgdGhlbgorICAgIGZvciBkaXIgaW4gJHNiYXNlLyovZm9yd2FyZGluZzsgZG8KKyAgICAgIGZ3ZD0kWyRmd2QgKyBgY2F0ICRkaXJgXQorICAgIGRvbmUKKyAgZWxzZQorICAgIGZ3ZD0yCisgIGZpCisgIHJldHVybiAkZndkCit9CisKK1Jlc3RhcnRSRElTQyAoKSB7CisgIGtpbGxhbGwgLUhVUCByZGlzYyB8fCByZGlzYyAtZnMKK30KKworQUJDTWFza0xlbiAoKSB7CisgIGxvY2FsIGNsYXNzOworCisgIGNsYXNzPSR7MSUlLip9CisgIGlmIFsgIiQxIiA9ICIiIC1vICRjbGFzcyAtZXEgMCAtbyAkY2xhc3MgLWdlIDIyNCBdOyB0aGVuIHJldHVybiAwCisgIGVsaWYgWyAkY2xhc3MgLWdlIDIyNCBdOyB0aGVuIHJldHVybiAwCisgIGVsaWYgWyAkY2xhc3MgLWdlIDE5MiBdOyB0aGVuIHJldHVybiAyNAorICBlbGlmIFsgJGNsYXNzIC1nZSAxMjggXTsgdGhlbiByZXR1cm4gMTYKKyAgZWxzZSByZXR1cm4gODsgZmkKK30KKworbGFiZWw9ImxhYmVsICQxIgorbGRldj0iJDEiCitkZXY9JHsxJToqfQoraWYgWyAiJGRldiIgPSAiIiAtbyAiJDEiID0gImhlbHAiIF07IHRoZW4KKyAgZWNobyAiVXNhZ2U6IGlmY2ZnIERFViBbW2FkZHxkZWwgW0FERFJbL0xFTl1dIFtQRUVSXSB8IHN0b3BdIiAxPiYyCisgIGVjaG8gIiAgICAgICBhZGQgLSBhZGQgbmV3IGFkZHJlc3MiIDE+JjIKKyAgZWNobyAiICAgICAgIGRlbCAtIGRlbGV0ZSBhZGRyZXNzIiAxPiYyCisgIGVjaG8gIiAgICAgICBzdG9wIC0gY29tcGxldGVseSBkaXNhYmxlIElQIiAxPiYyCisgIGV4aXQgMQorZmkKK3NoaWZ0CisKK0NoZWNrRm9yd2FyZGluZworZndkPSQ/CitpZiBbICRmd2QgLW5lIDAgXTsgdGhlbgorICBlY2hvICJGb3J3YXJkaW5nIGlzIE9OIG9yIGl0cyBzdGF0ZSBpcyB1bmtub3duICgkZndkKS4gT0ssIE5vIFJESVNDLiIgMT4mMgorZmkKKworCitkZWxldGluZz0wCitjYXNlICIkMSIgaW4KK2FkZCkgc2hpZnQgOzsKK3N0b3ApCisgIGlmIFsgIiRsZGV2IiAhPSAiJGRldiIgXTsgdGhlbgorICAgIGVjaG8gIkNhbm5vdCBzdG9wIGFsaWFzICRsZGV2IiAxPiYyCisgICAgZXhpdCAxOworICBmaQorICBpcCAtNCBhZGRyIGZsdXNoIGRldiAkZGV2ICRsYWJlbCB8fCBleGl0IDEKKyAgaWYgWyAkZndkIC1lcSAwIF07IHRoZW4gUmVzdGFydFJESVNDOyBmaQorICBleGl0IDAgOzsKK2RlbCopCisgIGRlbGV0aW5nPTE7IHNoaWZ0IDs7CisqKQorZXNhYworCitpcGFkZHI9CitwZnhsZW49CitpZiBbICIkMSIgIT0gIiIgXTsgdGhlbgorICBpcGFkZHI9JHsxJS8qfQorICBpZiBbICIkMSIgIT0gIiRpcGFkZHIiIF07IHRoZW4KKyAgICBwZnhsZW49JHsxIyovfQorICBmaQorICBpZiBbICIkaXBhZGRyIiA9ICIiIF07IHRoZW4KKyAgICBlY2hvICIkMSBpcyBiYWQgSVAgYWRkcmVzcy4iIDE+JjIKKyAgICBleGl0IDEKKyAgZmkKK2ZpCitzaGlmdAorCitwZWVyPSQxCitpZiBbICIkcGVlciIgIT0gIiIgXTsgdGhlbgorICBpZiBbICIkcGZ4bGVuIiAhPSAiIiAtYSAiJHBmeGxlbiIgIT0gIjMyIiBdOyB0aGVuCisgICAgZWNobyAiUGVlciBhZGRyZXNzIHdpdGggbm9uLXRyaXZpYWwgbmV0bWFzay4iIDE+JjIKKyAgICBleGl0IDEKKyAgZmkKKyAgcGZ4PSIkaXBhZGRyIHBlZXIgJHBlZXIiCitlbHNlCisgIGlmIFsgIiRpcGFkZHIiID0gIiIgXTsgdGhlbgorICAgIGVjaG8gIk1pc3NpbmcgSVAgYWRkcmVzcyBhcmd1bWVudC4iIDE+JjIKKyAgICBleGl0IDEKKyAgZmkKKyAgaWYgWyAiJHBmeGxlbiIgPSAiIiBdOyB0aGVuCisgICAgQUJDTWFza0xlbiAkaXBhZGRyCisgICAgcGZ4bGVuPSQ/CisgIGZpCisgIHBmeD0iJGlwYWRkci8kcGZ4bGVuIgorZmkKKworaWYgWyAiJGxkZXYiID0gIiRkZXYiIC1hICIkaXBhZGRyIiAhPSAiIiBdOyB0aGVuCisgIGxhYmVsPQorZmkKKworaWYgWyAkZGVsZXRpbmcgLW5lIDAgXTsgdGhlbgorICBpcCBhZGRyIGRlbCAkcGZ4IGRldiAkZGV2ICRsYWJlbCB8fCBleGl0IDEKKyAgaWYgWyAkZndkIC1lcSAwIF07IHRoZW4gUmVzdGFydFJESVNDOyBmaQorICBleGl0IDAKK2ZpCisKKworaWYgISBpcCBsaW5rIHNldCB1cCBkZXYgJGRldiA7IHRoZW4KKyAgZWNobyAiRXJyb3I6IGNhbm5vdCBlbmFibGUgaW50ZXJmYWNlICRkZXYuIiAxPiYyCisgIGV4aXQgMQorZmkKK2lmIFsgIiRpcGFkZHIiID0gIiIgXTsgdGhlbiBleGl0IDA7IGZpCisKK2lmICEgYXJwaW5nIC1xIC1jIDIgLXcgMyAtRCAtSSAkZGV2ICRpcGFkZHIgOyB0aGVuCisgIGVjaG8gIkVycm9yOiBzb21lIGhvc3QgYWxyZWFkeSB1c2VzIGFkZHJlc3MgJGlwYWRkciBvbiAkZGV2LiIgMT4mMgorICBleGl0IDEKK2ZpCisKK2lmICEgaXAgYWRkcmVzcyBhZGQgJHBmeCBicmQgKyBkZXYgJGRldiAkbGFiZWw7IHRoZW4KKyAgZWNobyAiRXJyb3I6IGZhaWxlZCB0byBhZGQgJHBmeCBvbiAkZGV2LiIgMT4mMgorICBleGl0IDEKK2ZpCisKK2FycGluZyAtcSAtQSAtYyAxIC1JICRkZXYgJGlwYWRkcgorbm9hcnA9JD8KKyggc2xlZXAgMiA7CisgIGFycGluZyAtcSAtVSAtYyAxIC1JICRkZXYgJGlwYWRkciApID4mIC9kZXYvbnVsbCA8L2Rldi9udWxsICYKKworaXAgcm91dGUgYWRkIHVucmVhY2hhYmxlIDIyNC4wLjAuMC8yNCA+JiAvZGV2L251bGwKK2lwIHJvdXRlIGFkZCB1bnJlYWNoYWJsZSAyNTUuMjU1LjI1NS4yNTUgPiYgL2Rldi9udWxsCitpZiBbIGBpcCBsaW5rIGxzICRkZXYgfCBncmVwIC1jIE1VTFRJQ0FTVGAgLWdlIDEgXTsgdGhlbgorICBpcCByb3V0ZSBhZGQgMjI0LjAuMC4wLzQgZGV2ICRkZXYgc2NvcGUgZ2xvYmFsID4mIC9kZXYvbnVsbAorZmkKKworaWYgWyAkZndkIC1lcSAwIF07IHRoZW4KKyAgaWYgWyAkbm9hcnAgLWVxIDAgXTsgdGhlbgorICAgIGlwIHJvIGFwcGVuZCBkZWZhdWx0IGRldiAkZGV2IG1ldHJpYyAzMDAwMCBzY29wZSBnbG9iYWwKKyAgZWxpZiBbICIkcGVlciIgIT0gIiIgXTsgdGhlbgorICAgIGlmIHBpbmcgLXEgLWMgMiAtdyA0ICRwZWVyIDsgdGhlbgorICAgICAgaXAgcm8gYXBwZW5kIGRlZmF1bHQgdmlhICRwZWVyIGRldiAkZGV2IG1ldHJpYyAzMDAwMQorICAgIGZpCisgIGZpCisgIFJlc3RhcnRSRElTQworZmkKKworZXhpdCAwCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pcC9pcC5jIGIvaXByb3V0ZTIvaXAvaXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTYyMTAwCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaXAvaXAuYwpAQCAtMCwwICsxLDMxMiBAQAorLyoKKyAqIGlwLmMJCSJpcCIgdXRpbGl0eSBmcm9udGVuZC4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJTTkFQU0hPVC5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiaXBfY29tbW9uLmgiCisjaW5jbHVkZSAibmFtZXNwYWNlLmgiCisjaW5jbHVkZSAiY29sb3IuaCIKKworaW50IHByZWZlcnJlZF9mYW1pbHkgPSBBRl9VTlNQRUM7CitpbnQgaHVtYW5fcmVhZGFibGU7CitpbnQgdXNlX2llYzsKK2ludCBzaG93X3N0YXRzOworaW50IHNob3dfZGV0YWlsczsKK2ludCByZXNvbHZlX2hvc3RzOworaW50IG9uZWxpbmU7CitpbnQgYnJpZWY7CitpbnQgdGltZXN0YW1wOworY29uc3QgY2hhciAqX1NMXzsKK2ludCBmb3JjZTsKK2ludCBtYXhfZmx1c2hfbG9vcHMgPSAxMDsKK2ludCBiYXRjaF9tb2RlOworYm9vbCBkb19hbGw7CisKK3N0cnVjdCBydG5sX2hhbmRsZSBydGggPSB7IC5mZCA9IC0xIH07CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsCisiVXNhZ2U6IGlwIFsgT1BUSU9OUyBdIE9CSkVDVCB7IENPTU1BTkQgfCBoZWxwIH1cbiIKKyIgICAgICAgaXAgWyAtZm9yY2UgXSAtYmF0Y2ggZmlsZW5hbWVcbiIKKyJ3aGVyZSAgT0JKRUNUIDo9IHsgbGluayB8IGFkZHJlc3MgfCBhZGRybGFiZWwgfCByb3V0ZSB8IHJ1bGUgfCBuZWlnaGJvciB8IG50YWJsZSB8XG4iCisiICAgICAgICAgICAgICAgICAgIHR1bm5lbCB8IHR1bnRhcCB8IG1hZGRyZXNzIHwgbXJvdXRlIHwgbXJ1bGUgfCBtb25pdG9yIHwgeGZybSB8XG4iCisiICAgICAgICAgICAgICAgICAgIG5ldG5zIHwgbDJ0cCB8IGZvdSB8IHRjcF9tZXRyaWNzIHwgdG9rZW4gfCBuZXRjb25mIH1cbiIKKyIgICAgICAgT1BUSU9OUyA6PSB7IC1WW2Vyc2lvbl0gfCAtc1t0YXRpc3RpY3NdIHwgLWRbZXRhaWxzXSB8IC1yW2Vzb2x2ZV0gfFxuIgorIiAgICAgICAgICAgICAgICAgICAgLWhbdW1hbi1yZWFkYWJsZV0gfCAtaWVjIHxcbiIKKyIgICAgICAgICAgICAgICAgICAgIC1mW2FtaWx5XSB7IGluZXQgfCBpbmV0NiB8IGlweCB8IGRuZXQgfCBtcGxzIHwgYnJpZGdlIHwgbGluayB9IHxcbiIKKyIgICAgICAgICAgICAgICAgICAgIC00IHwgLTYgfCAtSSB8IC1EIHwgLUIgfCAtMCB8XG4iCisiICAgICAgICAgICAgICAgICAgICAtbFtvb3BzXSB7IG1heGltdW0tYWRkci1mbHVzaC1hdHRlbXB0cyB9IHwgLWJyW2llZl0gfFxuIgorIiAgICAgICAgICAgICAgICAgICAgLW9bbmVsaW5lXSB8IC10W2ltZXN0YW1wXSB8IC10c1tob3J0XSB8IC1iW2F0Y2hdIFtmaWxlbmFtZV0gfFxuIgorIiAgICAgICAgICAgICAgICAgICAgLXJjW3ZidWZdIFtzaXplXSB8IC1uW2V0bnNdIG5hbWUgfCAtYVtsbF0gfMKgLWNbb2xvcl19XG4iKTsKKwlleGl0KC0xKTsKK30KKworc3RhdGljIGludCBkb19oZWxwKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwl1c2FnZSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNtZCB7CisJY29uc3QgY2hhciAqY21kOworCWludCAoKmZ1bmMpKGludCBhcmdjLCBjaGFyICoqYXJndik7Cit9IGNtZHNbXSA9IHsKKwl7ICJhZGRyZXNzIiwJZG9faXBhZGRyIH0sCisJeyAiYWRkcmxhYmVsIiwJZG9faXBhZGRybGFiZWwgfSwKKwl7ICJtYWRkcmVzcyIsCWRvX211bHRpYWRkciB9LAorCXsgInJvdXRlIiwJZG9faXByb3V0ZSB9LAorCXsgInJ1bGUiLAlkb19pcHJ1bGUgfSwKKwl7ICJuZWlnaGJvciIsCWRvX2lwbmVpZ2ggfSwKKwl7ICJuZWlnaGJvdXIiLAlkb19pcG5laWdoIH0sCisJeyAibnRhYmxlIiwJZG9faXBudGFibGUgfSwKKwl7ICJudGJsIiwJZG9faXBudGFibGUgfSwKKwl7ICJsaW5rIiwJZG9faXBsaW5rIH0sCisJeyAibDJ0cCIsCWRvX2lwbDJ0cCB9LAorCXsgImZvdSIsCWRvX2lwZm91IH0sCisJeyAidHVubmVsIiwJZG9faXB0dW5uZWwgfSwKKwl7ICJ0dW5sIiwJZG9faXB0dW5uZWwgfSwKKwl7ICJ0dW50YXAiLAlkb19pcHR1bnRhcCB9LAorCXsgInRhcCIsCWRvX2lwdHVudGFwIH0sCisJeyAidG9rZW4iLAlkb19pcHRva2VuIH0sCisJeyAidGNwbWV0cmljcyIsCWRvX3RjcF9tZXRyaWNzIH0sCisJeyAidGNwX21ldHJpY3MiLCBkb190Y3BfbWV0cmljcyB9LAorCXsgIm1vbml0b3IiLAlkb19pcG1vbml0b3IgfSwKKwl7ICJ4ZnJtIiwJZG9feGZybSB9LAorCXsgIm1yb3V0ZSIsCWRvX211bHRpcm91dGUgfSwKKwl7ICJtcnVsZSIsCWRvX211bHRpcnVsZSB9LAorCXsgIm5ldG5zIiwJZG9fbmV0bnMgfSwKKwl7ICJuZXRjb25mIiwJZG9faXBuZXRjb25mIH0sCisJeyAiaGVscCIsCWRvX2hlbHAgfSwKKwl7IDAgfQorfTsKKworc3RhdGljIGludCBkb19jbWQoY29uc3QgY2hhciAqYXJndjAsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljb25zdCBzdHJ1Y3QgY21kICpjOworCisJZm9yIChjID0gY21kczsgYy0+Y21kOyArK2MpIHsKKwkJaWYgKG1hdGNoZXMoYXJndjAsIGMtPmNtZCkgPT0gMCkKKwkJCXJldHVybiAtKGMtPmZ1bmMoYXJnYy0xLCBhcmd2KzEpKTsKKwl9CisKKwlmcHJpbnRmKHN0ZGVyciwgIk9iamVjdCBcIiVzXCIgaXMgdW5rbm93biwgdHJ5IFwiaXAgaGVscFwiLlxuIiwgYXJndjApOworCXJldHVybiBFWElUX0ZBSUxVUkU7Cit9CisKKyNpZm5kZWYgQU5EUk9JRAorc3RhdGljIGludCBiYXRjaChjb25zdCBjaGFyICpuYW1lKQoreworCWNoYXIgKmxpbmUgPSBOVUxMOworCXNpemVfdCBsZW4gPSAwOworCWludCByZXQgPSBFWElUX1NVQ0NFU1M7CisJaW50IG9yaWdfZmFtaWx5ID0gcHJlZmVycmVkX2ZhbWlseTsKKworCWJhdGNoX21vZGUgPSAxOworCisJaWYgKG5hbWUgJiYgc3RyY21wKG5hbWUsICItIikgIT0gMCkgeworCQlpZiAoZnJlb3BlbihuYW1lLCAiciIsIHN0ZGluKSA9PSBOVUxMKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiQ2Fubm90IG9wZW4gZmlsZSBcIiVzXCIgZm9yIHJlYWRpbmc6ICVzXG4iLAorCQkJCW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCQl9CisJfQorCisJaWYgKHJ0bmxfb3BlbigmcnRoLCAwKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgb3BlbiBydG5ldGxpbmtcbiIpOworCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCX0KKworCWNtZGxpbmVubyA9IDA7CisJd2hpbGUgKGdldGNtZGxpbmUoJmxpbmUsICZsZW4sIHN0ZGluKSAhPSAtMSkgeworCQljaGFyICpsYXJndlsxMDBdOworCQlpbnQgbGFyZ2M7CisKKwkJcHJlZmVycmVkX2ZhbWlseSA9IG9yaWdfZmFtaWx5OworCisJCWxhcmdjID0gbWFrZWFyZ3MobGluZSwgbGFyZ3YsIDEwMCk7CisJCWlmIChsYXJnYyA9PSAwKQorCQkJY29udGludWU7CS8qIGJsYW5rIGxpbmUgKi8KKworCQlpZiAoZG9fY21kKGxhcmd2WzBdLCBsYXJnYywgbGFyZ3YpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNvbW1hbmQgZmFpbGVkICVzOiVkXG4iLAorCQkJCW5hbWUsIGNtZGxpbmVubyk7CisJCQlyZXQgPSBFWElUX0ZBSUxVUkU7CisJCQlpZiAoIWZvcmNlKQorCQkJCWJyZWFrOworCQl9CisJfQorCWlmIChsaW5lKQorCQlmcmVlKGxpbmUpOworCisJcnRubF9jbG9zZSgmcnRoKTsKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKmJhc2VuYW1lOworI2lmbmRlZiBBTkRST0lECisJY2hhciAqYmF0Y2hfZmlsZSA9IE5VTEw7CisjZW5kaWYKKworCWJhc2VuYW1lID0gc3RycmNocihhcmd2WzBdLCAnLycpOworCWlmIChiYXNlbmFtZSA9PSBOVUxMKQorCQliYXNlbmFtZSA9IGFyZ3ZbMF07CisJZWxzZQorCQliYXNlbmFtZSsrOworCisJd2hpbGUgKGFyZ2MgPiAxKSB7CisJCWNoYXIgKm9wdCA9IGFyZ3ZbMV07CisKKwkJaWYgKHN0cmNtcChvcHQsICItLSIpID09IDApIHsKKwkJCWFyZ2MtLTsgYXJndisrOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKG9wdFswXSAhPSAnLScpCisJCQlicmVhazsKKwkJaWYgKG9wdFsxXSA9PSAnLScpCisJCQlvcHQrKzsKKwkJaWYgKG1hdGNoZXMob3B0LCAiLWxvb3BzIikgPT0gMCkgeworCQkJYXJnYy0tOworCQkJYXJndisrOworCQkJaWYgKGFyZ2MgPD0gMSkKKwkJCQl1c2FnZSgpOworCQkJbWF4X2ZsdXNoX2xvb3BzID0gYXRvaShhcmd2WzFdKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKG9wdCwgIi1mYW1pbHkiKSA9PSAwKSB7CisJCQlhcmdjLS07CisJCQlhcmd2Kys7CisJCQlpZiAoYXJnYyA8PSAxKQorCQkJCXVzYWdlKCk7CisJCQlpZiAoc3RyY21wKGFyZ3ZbMV0sICJoZWxwIikgPT0gMCkKKwkJCQl1c2FnZSgpOworCQkJZWxzZQorCQkJCXByZWZlcnJlZF9mYW1pbHkgPSByZWFkX2ZhbWlseShhcmd2WzFdKTsKKwkJCWlmIChwcmVmZXJyZWRfZmFtaWx5ID09IEFGX1VOU1BFQykKKwkJCQlpbnZhcmcoImludmFsaWQgcHJvdG9jb2wgZmFtaWx5IiwgYXJndlsxXSk7CisJCX0gZWxzZSBpZiAoc3RyY21wKG9wdCwgIi00IikgPT0gMCkgeworCQkJcHJlZmVycmVkX2ZhbWlseSA9IEFGX0lORVQ7CisJCX0gZWxzZSBpZiAoc3RyY21wKG9wdCwgIi02IikgPT0gMCkgeworCQkJcHJlZmVycmVkX2ZhbWlseSA9IEFGX0lORVQ2OworCQl9IGVsc2UgaWYgKHN0cmNtcChvcHQsICItMCIpID09IDApIHsKKwkJCXByZWZlcnJlZF9mYW1pbHkgPSBBRl9QQUNLRVQ7CisJCX0gZWxzZSBpZiAoc3RyY21wKG9wdCwgIi1JIikgPT0gMCkgeworCQkJcHJlZmVycmVkX2ZhbWlseSA9IEFGX0lQWDsKKwkJfSBlbHNlIGlmIChzdHJjbXAob3B0LCAiLUQiKSA9PSAwKSB7CisJCQlwcmVmZXJyZWRfZmFtaWx5ID0gQUZfREVDbmV0OworCQl9IGVsc2UgaWYgKHN0cmNtcChvcHQsICItTSIpID09IDApIHsKKwkJCXByZWZlcnJlZF9mYW1pbHkgPSBBRl9NUExTOworCQl9IGVsc2UgaWYgKHN0cmNtcChvcHQsICItQiIpID09IDApIHsKKwkJCXByZWZlcnJlZF9mYW1pbHkgPSBBRl9CUklER0U7CisJCX0gZWxzZSBpZiAobWF0Y2hlcyhvcHQsICItaHVtYW4iKSA9PSAwIHx8CisJCQkgICBtYXRjaGVzKG9wdCwgIi1odW1hbi1yZWFkYWJsZSIpID09IDApIHsKKwkJCSsraHVtYW5fcmVhZGFibGU7CisJCX0gZWxzZSBpZiAobWF0Y2hlcyhvcHQsICItaWVjIikgPT0gMCkgeworCQkJKyt1c2VfaWVjOworCQl9IGVsc2UgaWYgKG1hdGNoZXMob3B0LCAiLXN0YXRzIikgPT0gMCB8fAorCQkJICAgbWF0Y2hlcyhvcHQsICItc3RhdGlzdGljcyIpID09IDApIHsKKwkJCSsrc2hvd19zdGF0czsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKG9wdCwgIi1kZXRhaWxzIikgPT0gMCkgeworCQkJKytzaG93X2RldGFpbHM7CisJCX0gZWxzZSBpZiAobWF0Y2hlcyhvcHQsICItcmVzb2x2ZSIpID09IDApIHsKKwkJCSsrcmVzb2x2ZV9ob3N0czsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKG9wdCwgIi1vbmVsaW5lIikgPT0gMCkgeworCQkJKytvbmVsaW5lOworCQl9IGVsc2UgaWYgKG1hdGNoZXMob3B0LCAiLXRpbWVzdGFtcCIpID09IDApIHsKKwkJCSsrdGltZXN0YW1wOworCQl9IGVsc2UgaWYgKG1hdGNoZXMob3B0LCAiLXRzaG9ydCIpID09IDApIHsKKwkJCSsrdGltZXN0YW1wOworCQkJKyt0aW1lc3RhbXBfc2hvcnQ7CisjaWYgMAorCQl9IGVsc2UgaWYgKG1hdGNoZXMob3B0LCAiLW51bWVyaWMiKSA9PSAwKSB7CisJCQlydG5sX25hbWVzX251bWVyaWMrKzsKKyNlbmRpZgorCQl9IGVsc2UgaWYgKG1hdGNoZXMob3B0LCAiLVZlcnNpb24iKSA9PSAwKSB7CisJCQlwcmludGYoImlwIHV0aWxpdHksIGlwcm91dGUyLXNzJXNcbiIsIFNOQVBTSE9UKTsKKwkJCWV4aXQoMCk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcyhvcHQsICItZm9yY2UiKSA9PSAwKSB7CisJCQkrK2ZvcmNlOworI2lmbmRlZiBBTkRST0lECisJCX0gZWxzZSBpZiAobWF0Y2hlcyhvcHQsICItYmF0Y2giKSA9PSAwKSB7CisJCQlhcmdjLS07CisJCQlhcmd2Kys7CisJCQlpZiAoYXJnYyA8PSAxKQorCQkJCXVzYWdlKCk7CisJCQliYXRjaF9maWxlID0gYXJndlsxXTsKKyNlbmRpZgorCQl9IGVsc2UgaWYgKG1hdGNoZXMob3B0LCAiLWJyaWVmIikgPT0gMCkgeworCQkJKyticmllZjsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKG9wdCwgIi1yY3ZidWYiKSA9PSAwKSB7CisJCQl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCQkJYXJnYy0tOworCQkJYXJndisrOworCQkJaWYgKGFyZ2MgPD0gMSkKKwkJCQl1c2FnZSgpOworCQkJaWYgKGdldF91bnNpZ25lZCgmc2l6ZSwgYXJndlsxXSwgMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgcmN2YnVmIHNpemUgJyVzJ1xuIiwKKwkJCQkJYXJndlsxXSk7CisJCQkJZXhpdCgtMSk7CisJCQl9CisJCQlyY3ZidWYgPSBzaXplOworCQl9IGVsc2UgaWYgKG1hdGNoZXMob3B0LCAiLWNvbG9yIikgPT0gMCkgeworCQkJZW5hYmxlX2NvbG9yKCk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcyhvcHQsICItaGVscCIpID09IDApIHsKKwkJCXVzYWdlKCk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcyhvcHQsICItbmV0bnMiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKG5ldG5zX3N3aXRjaChhcmd2WzFdKSkKKwkJCQlleGl0KC0xKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKG9wdCwgIi1hbGwiKSA9PSAwKSB7CisJCQlkb19hbGwgPSB0cnVlOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIk9wdGlvbiBcIiVzXCIgaXMgdW5rbm93biwgdHJ5IFwiaXAgLWhlbHBcIi5cbiIsCisJCQkJb3B0KTsKKwkJCWV4aXQoLTEpOworCQl9CisJCWFyZ2MtLTsJYXJndisrOworCX0KKworCV9TTF8gPSBvbmVsaW5lID8gIlxcIiA6ICJcbiI7CisKKyNpZm5kZWYgQU5EUk9JRAorCWlmIChiYXRjaF9maWxlKQorCQlyZXR1cm4gYmF0Y2goYmF0Y2hfZmlsZSk7CisjZW5kaWYKKworCWlmIChydG5sX29wZW4oJnJ0aCwgMCkgPCAwKQorCQlleGl0KDEpOworCisJaWYgKHN0cmxlbihiYXNlbmFtZSkgPiAyKQorCQlyZXR1cm4gZG9fY21kKGJhc2VuYW1lKzIsIGFyZ2MsIGFyZ3YpOworCisJaWYgKGFyZ2MgPiAxKQorCQlyZXR1cm4gZG9fY21kKGFyZ3ZbMV0sIGFyZ2MtMSwgYXJndisxKTsKKworCXJ0bmxfY2xvc2UoJnJ0aCk7CisJdXNhZ2UoKTsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2lwL2lwNnR1bm5lbC5jIGIvaXByb3V0ZTIvaXAvaXA2dHVubmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EzY2QwNAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2lwL2lwNnR1bm5lbC5jCkBAIC0wLDAgKzEsNDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKTIwMDYgVVNBR0kvV0lERSBQcm9qZWN0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcz4uCisgKi8KKy8qCisgKiBBdXRob3I6CisgKglNYXNhaGlkZSBOQUtBTVVSQSBAVVNBR0kKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3R1bm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwNl90dW5uZWwuaD4KKworI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAidHVubmVsLmgiCisjaW5jbHVkZSAiaXBfY29tbW9uLmgiCisKKyNkZWZpbmUgSVA2X0ZMT1dJTkZPX1RDTEFTUwlodG9ubCgweDBGRjAwMDAwKQorI2RlZmluZSBJUDZfRkxPV0lORk9fRkxPV0xBQkVMCWh0b25sKDB4MDAwRkZGRkYpCisKKyNkZWZpbmUgREVGQVVMVF9UTkxfSE9QX0xJTUlUCSg2NCkKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBpcCAtZiBpbmV0NiB0dW5uZWwgeyBhZGQgfCBjaGFuZ2UgfCBkZWwgfCBzaG93IH0gWyBOQU1FIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgIFsgbW9kZSB7IGlwNmlwNiB8IGlwaXA2IHwgaXA2Z3JlIHwgdnRpNiB8IGFueSB9IF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgIFsgcmVtb3RlIEFERFIgbG9jYWwgQUREUiBdIFsgZGV2IFBIWVNfREVWIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgIFsgZW5jYXBsaW1pdCBFTElNIF1cbiIpOworCWZwcmludGYoc3RkZXJyICwiICAgICAgICAgIFsgaG9wbGltaXQgVFRMIF0gWyB0Y2xhc3MgVENMQVNTIF0gWyBmbG93bGFiZWwgRkxPV0xBQkVMIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgIFsgZHNjcCBpbmhlcml0IF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgIFsgW2l8b11zZXEgXSBbIFtpfG9da2V5IEtFWSBdIFsgW2l8b11jc3VtIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIldoZXJlOiBOQU1FICAgICAgOj0gU1RSSU5HXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBBRERSICAgICAgOj0gSVBWNl9BRERSRVNTXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBFTElNICAgICAgOj0geyBub25lIHwgMC4uMjU1IH0oZGVmYXVsdD0lZClcbiIsCisJCUlQVjZfREVGQVVMVF9UTkxfRU5DQVBfTElNSVQpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgIFRUTCAgICAgICA6PSAwLi4yNTUgKGRlZmF1bHQ9JWQpXG4iLAorCQlERUZBVUxUX1ROTF9IT1BfTElNSVQpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgIFRDTEFTUyAgICA6PSB7IDB4MC4uMHhmZiB8IGluaGVyaXQgfVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgRkxPV0xBQkVMIDo9IHsgMHgwLi4weGZmZmZmIHwgaW5oZXJpdCB9XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBLRVkgICAgICAgOj0geyBET1RURURfUVVBRCB8IE5VTUJFUiB9XG4iKTsKKwlleGl0KC0xKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfdHVubmVsKHN0cnVjdCBpcDZfdG5sX3Bhcm0yICpwKQoreworCWNoYXIgczFbMTAyNF07CisJY2hhciBzMlsxMDI0XTsKKworCS8qIERvIG5vdCB1c2UgZm9ybWF0X2hvc3QoKSBmb3IgbG9jYWwgYWRkciwKKwkgKiBzeW1ib2xpYyBuYW1lIHdpbGwgbm90IGJlIHVzZWZ1bC4KKwkgKi8KKwlwcmludGYoIiVzOiAlcy9pcHY2IHJlbW90ZSAlcyBsb2NhbCAlcyIsCisJICAgICAgIHAtPm5hbWUsCisJICAgICAgIHRubF9zdHJwcm90byhwLT5wcm90byksCisJICAgICAgIGZvcm1hdF9ob3N0KEFGX0lORVQ2LCAxNiwgJnAtPnJhZGRyLCBzMSwgc2l6ZW9mKHMxKSksCisJICAgICAgIHJ0X2FkZHJfbjJhKEFGX0lORVQ2LCAxNiwgJnAtPmxhZGRyLCBzMiwgc2l6ZW9mKHMyKSkpOworCWlmIChwLT5saW5rKSB7CisJCWNvbnN0IGNoYXIgKm4gPSBsbF9pbmRleF90b19uYW1lKHAtPmxpbmspOworCQlpZiAobikKKwkJCXByaW50ZigiIGRldiAlcyIsIG4pOworCX0KKworCWlmIChwLT5mbGFncyAmIElQNl9UTkxfRl9JR05fRU5DQVBfTElNSVQpCisJCXByaW50ZigiIGVuY2FwbGltaXQgbm9uZSIpOworCWVsc2UKKwkJcHJpbnRmKCIgZW5jYXBsaW1pdCAldSIsIHAtPmVuY2FwX2xpbWl0KTsKKworCXByaW50ZigiIGhvcGxpbWl0ICV1IiwgcC0+aG9wX2xpbWl0KTsKKworCWlmIChwLT5mbGFncyAmIElQNl9UTkxfRl9VU0VfT1JJR19UQ0xBU1MpCisJCXByaW50ZigiIHRjbGFzcyBpbmhlcml0Iik7CisJZWxzZSB7CisJCV9fdTMyIHZhbCA9IG50b2hsKHAtPmZsb3dpbmZvICYgSVA2X0ZMT1dJTkZPX1RDTEFTUyk7CisJCXByaW50ZigiIHRjbGFzcyAweCUwMngiLCAoX191OCkodmFsID4+IDIwKSk7CisJfQorCisJaWYgKHAtPmZsYWdzICYgSVA2X1ROTF9GX1VTRV9PUklHX0ZMT1dMQUJFTCkKKwkJcHJpbnRmKCIgZmxvd2xhYmVsIGluaGVyaXQiKTsKKwllbHNlCisJCXByaW50ZigiIGZsb3dsYWJlbCAweCUwNXgiLCBudG9obChwLT5mbG93aW5mbyAmIElQNl9GTE9XSU5GT19GTE9XTEFCRUwpKTsKKworCXByaW50ZigiIChmbG93aW5mbyAweCUwOHgpIiwgbnRvaGwocC0+Zmxvd2luZm8pKTsKKworCWlmIChwLT5mbGFncyAmIElQNl9UTkxfRl9SQ1ZfRFNDUF9DT1BZKQorCQlwcmludGYoIiBkc2NwIGluaGVyaXQiKTsKKworCWlmIChwLT5wcm90byA9PSBJUFBST1RPX0dSRSkgeworCQlpZiAoKHAtPmlfZmxhZ3MgJiBHUkVfS0VZKSAmJiAocC0+b19mbGFncyAmIEdSRV9LRVkpICYmIHAtPm9fa2V5ID09IHAtPmlfa2V5KQorCQkJcHJpbnRmKCIga2V5ICV1IiwgbnRvaGwocC0+aV9rZXkpKTsKKwkJZWxzZSBpZiAoKHAtPmlfZmxhZ3MgfCBwLT5vX2ZsYWdzKSAmIEdSRV9LRVkpIHsKKwkJCWlmIChwLT5pX2ZsYWdzICYgR1JFX0tFWSkKKwkJCQlwcmludGYoIiBpa2V5ICV1IiwgbnRvaGwocC0+aV9rZXkpKTsKKwkJCWlmIChwLT5vX2ZsYWdzICYgR1JFX0tFWSkKKwkJCQlwcmludGYoIiBva2V5ICV1IiwgbnRvaGwocC0+b19rZXkpKTsKKwkJfQorCisJCWlmIChwLT5pX2ZsYWdzICYgR1JFX1NFUSkKKwkJCXByaW50ZigiJXMgIERyb3AgcGFja2V0cyBvdXQgb2Ygc2VxdWVuY2UuIiwgX1NMXyk7CisJCWlmIChwLT5pX2ZsYWdzICYgR1JFX0NTVU0pCisJCQlwcmludGYoIiVzICBDaGVja3N1bSBpbiByZWNlaXZlZCBwYWNrZXQgaXMgcmVxdWlyZWQuIiwgX1NMXyk7CisJCWlmIChwLT5vX2ZsYWdzICYgR1JFX1NFUSkKKwkJCXByaW50ZigiJXMgIFNlcXVlbmNlIHBhY2tldHMgb24gb3V0cHV0LiIsIF9TTF8pOworCQlpZiAocC0+b19mbGFncyAmIEdSRV9DU1VNKQorCQkJcHJpbnRmKCIlcyAgQ2hlY2tzdW0gb3V0cHV0IHBhY2tldHMuIiwgX1NMXyk7CisJfQorfQorCitzdGF0aWMgaW50IHBhcnNlX2FyZ3MoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBpbnQgY21kLCBzdHJ1Y3QgaXA2X3RubF9wYXJtMiAqcCkKK3sKKwlpbnQgY291bnQgPSAwOworCWNoYXIgbWVkaXVtW0lGTkFNU0laXTsKKworCW1lbXNldChtZWRpdW0sIDAsIHNpemVvZihtZWRpdW0pKTsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAoc3RyY21wKCphcmd2LCAibW9kZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoc3RyY21wKCphcmd2LCAiaXB2Ni9pcHY2IikgPT0gMCB8fAorCQkJICAgIHN0cmNtcCgqYXJndiwgImlwNmlwNiIpID09IDApCisJCQkJcC0+cHJvdG8gPSBJUFBST1RPX0lQVjY7CisJCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJ2dGk2IikgPT0gMCkgeworCQkJCXAtPnByb3RvID0gSVBQUk9UT19JUFY2OworCQkJCXAtPmlfZmxhZ3MgfD0gVlRJX0lTVlRJOworCQkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJpcC9pcHY2IikgPT0gMCB8fAorCQkJCSBzdHJjbXAoKmFyZ3YsICJpcHY0L2lwdjYiKSA9PSAwIHx8CisJCQkJIHN0cmNtcCgqYXJndiwgImlwaXA2IikgPT0gMCB8fAorCQkJCSBzdHJjbXAoKmFyZ3YsICJpcDRpcDYiKSA9PSAwKQorCQkJCXAtPnByb3RvID0gSVBQUk9UT19JUElQOworCQkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaXA2Z3JlIikgPT0gMCB8fAorCQkJCSBzdHJjbXAoKmFyZ3YsICJncmUvaXB2NiIpID09IDApCisJCQkJcC0+cHJvdG8gPSBJUFBST1RPX0dSRTsKKwkJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImFueS9pcHY2IikgPT0gMCB8fAorCQkJCSBzdHJjbXAoKmFyZ3YsICJhbnkiKSA9PSAwKQorCQkJCXAtPnByb3RvID0gMDsKKwkJCWVsc2UgeworCQkJCWZwcmludGYoc3RkZXJyLCJVbmtub3duIHR1bm5lbCBtb2RlIFwiJXNcIlxuIiwgKmFyZ3YpOworCQkJCWV4aXQoLTEpOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInJlbW90ZSIpID09IDApIHsKKwkJCWluZXRfcHJlZml4IHJhZGRyOworCQkJTkVYVF9BUkcoKTsKKwkJCWdldF9wcmVmaXgoJnJhZGRyLCAqYXJndiwgcHJlZmVycmVkX2ZhbWlseSk7CisJCQlpZiAocmFkZHIuZmFtaWx5ID09IEFGX1VOU1BFQykKKwkJCQlpbnZhcmcoIlwicmVtb3RlXCIgYWRkcmVzcyBmYW1pbHkgaXMgQUZfVU5TUEVDIiwgKmFyZ3YpOworCQkJbWVtY3B5KCZwLT5yYWRkciwgJnJhZGRyLmRhdGEsIHNpemVvZihwLT5yYWRkcikpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImxvY2FsIikgPT0gMCkgeworCQkJaW5ldF9wcmVmaXggbGFkZHI7CisJCQlORVhUX0FSRygpOworCQkJZ2V0X3ByZWZpeCgmbGFkZHIsICphcmd2LCBwcmVmZXJyZWRfZmFtaWx5KTsKKwkJCWlmIChsYWRkci5mYW1pbHkgPT0gQUZfVU5TUEVDKQorCQkJCWludmFyZygiXCJsb2NhbFwiIGFkZHJlc3MgZmFtaWx5IGlzIEFGX1VOU1BFQyIsICphcmd2KTsKKwkJCW1lbWNweSgmcC0+bGFkZHIsICZsYWRkci5kYXRhLCBzaXplb2YocC0+bGFkZHIpKTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJkZXYiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJc3RybmNweShtZWRpdW0sICphcmd2LCBJRk5BTVNJWiAtIDEpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImVuY2FwbGltaXQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHN0cmNtcCgqYXJndiwgIm5vbmUiKSA9PSAwKSB7CisJCQkJcC0+ZmxhZ3MgfD0gSVA2X1ROTF9GX0lHTl9FTkNBUF9MSU1JVDsKKwkJCX0gZWxzZSB7CisJCQkJX191OCB1dmFsOworCQkJCWlmIChnZXRfdTgoJnV2YWwsICphcmd2LCAwKSA8IC0xKQorCQkJCQlpbnZhcmcoImludmFsaWQgRUxJTSIsICphcmd2KTsKKwkJCQlwLT5lbmNhcF9saW1pdCA9IHV2YWw7CisJCQkJcC0+ZmxhZ3MgJj0gfklQNl9UTkxfRl9JR05fRU5DQVBfTElNSVQ7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaG9wbGltaXQiKSA9PSAwIHx8CisJCQkgICBzdHJjbXAoKmFyZ3YsICJ0dGwiKSA9PSAwIHx8CisJCQkgICBzdHJjbXAoKmFyZ3YsICJobGltIikgPT0gMCkgeworCQkJX191OCB1dmFsOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTgoJnV2YWwsICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoImludmFsaWQgVFRMIiwgKmFyZ3YpOworCQkJcC0+aG9wX2xpbWl0ID0gdXZhbDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJ0Y2xhc3MiKSA9PSAwIHx8CisJCQkgICBzdHJjbXAoKmFyZ3YsICJ0YyIpID09IDAgfHwKKwkJCSAgIHN0cmNtcCgqYXJndiwgInRvcyIpID09IDAgfHwKKwkJCSAgIG1hdGNoZXMoKmFyZ3YsICJkc2ZpZWxkIikgPT0gMCkgeworCQkJX191OCB1dmFsOworCQkJTkVYVF9BUkcoKTsKKwkJCXAtPmZsb3dpbmZvICY9IH5JUDZfRkxPV0lORk9fVENMQVNTOworCQkJaWYgKHN0cmNtcCgqYXJndiwgImluaGVyaXQiKSA9PSAwKQorCQkJCXAtPmZsYWdzIHw9IElQNl9UTkxfRl9VU0VfT1JJR19UQ0xBU1M7CisJCQllbHNlIHsKKwkJCQlpZiAoZ2V0X3U4KCZ1dmFsLCAqYXJndiwgMTYpKQorCQkJCQlpbnZhcmcoImludmFsaWQgVENsYXNzIiwgKmFyZ3YpOworCQkJCXAtPmZsb3dpbmZvIHw9IGh0b25sKChfX3UzMil1dmFsIDw8IDIwKSAmIElQNl9GTE9XSU5GT19UQ0xBU1M7CisJCQkJcC0+ZmxhZ3MgJj0gfklQNl9UTkxfRl9VU0VfT1JJR19UQ0xBU1M7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZmxvd2xhYmVsIikgPT0gMCB8fAorCQkJICAgc3RyY21wKCphcmd2LCAiZmwiKSA9PSAwKSB7CisJCQlfX3UzMiB1dmFsOworCQkJTkVYVF9BUkcoKTsKKwkJCXAtPmZsb3dpbmZvICY9IH5JUDZfRkxPV0lORk9fRkxPV0xBQkVMOworCQkJaWYgKHN0cmNtcCgqYXJndiwgImluaGVyaXQiKSA9PSAwKQorCQkJCXAtPmZsYWdzIHw9IElQNl9UTkxfRl9VU0VfT1JJR19GTE9XTEFCRUw7CisJCQllbHNlIHsKKwkJCQlpZiAoZ2V0X3UzMigmdXZhbCwgKmFyZ3YsIDE2KSkKKwkJCQkJaW52YXJnKCJpbnZhbGlkIEZsb3dsYWJlbCIsICphcmd2KTsKKwkJCQlpZiAodXZhbCA+IDB4RkZGRkYpCisJCQkJCWludmFyZygiaW52YWxpZCBGbG93bGFiZWwiLCAqYXJndik7CisJCQkJcC0+Zmxvd2luZm8gfD0gaHRvbmwodXZhbCkgJiBJUDZfRkxPV0lORk9fRkxPV0xBQkVMOworCQkJCXAtPmZsYWdzICY9IH5JUDZfVE5MX0ZfVVNFX09SSUdfRkxPV0xBQkVMOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImRzY3AiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHN0cmNtcCgqYXJndiwgImluaGVyaXQiKSAhPSAwKQorCQkJCWludmFyZygibm90IGluaGVyaXQiLCAqYXJndik7CisJCQlwLT5mbGFncyB8PSBJUDZfVE5MX0ZfUkNWX0RTQ1BfQ09QWTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJrZXkiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJcC0+aV9mbGFncyB8PSBHUkVfS0VZOworCQkJcC0+b19mbGFncyB8PSBHUkVfS0VZOworCQkJcC0+aV9rZXkgPSBwLT5vX2tleSA9IHRubF9wYXJzZV9rZXkoImtleSIsICphcmd2KTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJpa2V5IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCXAtPmlfZmxhZ3MgfD0gR1JFX0tFWTsKKwkJCXAtPmlfa2V5ID0gdG5sX3BhcnNlX2tleSgiaWtleSIsICphcmd2KTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJva2V5IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCXAtPm9fZmxhZ3MgfD0gR1JFX0tFWTsKKwkJCXAtPm9fa2V5ID0gdG5sX3BhcnNlX2tleSgib2tleSIsICphcmd2KTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJzZXEiKSA9PSAwKSB7CisJCQlwLT5pX2ZsYWdzIHw9IEdSRV9TRVE7CisJCQlwLT5vX2ZsYWdzIHw9IEdSRV9TRVE7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaXNlcSIpID09IDApIHsKKwkJCXAtPmlfZmxhZ3MgfD0gR1JFX1NFUTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJvc2VxIikgPT0gMCkgeworCQkJcC0+b19mbGFncyB8PSBHUkVfU0VROworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImNzdW0iKSA9PSAwKSB7CisJCQlwLT5pX2ZsYWdzIHw9IEdSRV9DU1VNOworCQkJcC0+b19mbGFncyB8PSBHUkVfQ1NVTTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJpY3N1bSIpID09IDApIHsKKwkJCXAtPmlfZmxhZ3MgfD0gR1JFX0NTVU07CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAib2NzdW0iKSA9PSAwKSB7CisJCQlwLT5vX2ZsYWdzIHw9IEdSRV9DU1VNOworCQl9IGVsc2UgeworCQkJaWYgKHN0cmNtcCgqYXJndiwgIm5hbWUiKSA9PSAwKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKQorCQkJCXVzYWdlKCk7CisJCQlpZiAocC0+bmFtZVswXSkKKwkJCQlkdXBhcmcyKCJuYW1lIiwgKmFyZ3YpOworCQkJc3RybmNweShwLT5uYW1lLCAqYXJndiwgSUZOQU1TSVogLSAxKTsKKwkJCWlmIChjbWQgPT0gU0lPQ0NIR1RVTk5FTCAmJiBjb3VudCA9PSAwKSB7CisJCQkJc3RydWN0IGlwNl90bmxfcGFybTIgb2xkX3A7CisJCQkJbWVtc2V0KCZvbGRfcCwgMCwgc2l6ZW9mKG9sZF9wKSk7CisJCQkJaWYgKHRubF9nZXRfaW9jdGwoKmFyZ3YsICZvbGRfcCkpCisJCQkJCXJldHVybiAtMTsKKwkJCQkqcCA9IG9sZF9wOworCQkJfQorCQl9CisJCWNvdW50Kys7CisJCWFyZ2MtLTsgYXJndisrOworCX0KKwlpZiAobWVkaXVtWzBdKSB7CisJCXAtPmxpbmsgPSBsbF9uYW1lX3RvX2luZGV4KG1lZGl1bSk7CisJCWlmIChwLT5saW5rID09IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IGZpbmQgZGV2aWNlIFwiJXNcIlxuIiwgbWVkaXVtKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXA2X3RubF9wYXJtX2luaXQoc3RydWN0IGlwNl90bmxfcGFybTIgKnAsIGludCBhcHBseV9kZWZhdWx0KQoreworCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKKwlwLT5wcm90byA9IElQUFJPVE9fSVBWNjsKKwlpZiAoYXBwbHlfZGVmYXVsdCkgeworCQlwLT5ob3BfbGltaXQgPSBERUZBVUxUX1ROTF9IT1BfTElNSVQ7CisJCXAtPmVuY2FwX2xpbWl0ID0gSVBWNl9ERUZBVUxUX1ROTF9FTkNBUF9MSU1JVDsKKwl9Cit9CisKKy8qCisgKiBAcDE6IHVzZXIgc3BlY2lmaWVkIHBhcmFtZXRlcgorICogQHAyOiBkYXRhYmFzZSBlbnRyeQorICovCitzdGF0aWMgaW50IGlwNl90bmxfcGFybV9tYXRjaChjb25zdCBzdHJ1Y3QgaXA2X3RubF9wYXJtMiAqcDEsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgaXA2X3RubF9wYXJtMiAqcDIpCit7CisJcmV0dXJuICgoIXAxLT5saW5rIHx8IHAxLT5saW5rID09IHAyLT5saW5rKSAmJgorCQkoIXAxLT5uYW1lWzBdIHx8IHN0cmNtcChwMS0+bmFtZSwgcDItPm5hbWUpID09IDApICYmCisJCShtZW1jbXAoJnAxLT5sYWRkciwgJmluNmFkZHJfYW55LCBzaXplb2YocDEtPmxhZGRyKSkgPT0gMCB8fAorCQkgbWVtY21wKCZwMS0+bGFkZHIsICZwMi0+bGFkZHIsIHNpemVvZihwMS0+bGFkZHIpKSA9PSAwKSAmJgorCQkobWVtY21wKCZwMS0+cmFkZHIsICZpbjZhZGRyX2FueSwgc2l6ZW9mKHAxLT5yYWRkcikpID09IDAgfHwKKwkJIG1lbWNtcCgmcDEtPnJhZGRyLCAmcDItPnJhZGRyLCBzaXplb2YocDEtPnJhZGRyKSkgPT0gMCkgJiYKKwkJKCFwMS0+cHJvdG8gfHwgIXAyLT5wcm90byB8fCBwMS0+cHJvdG8gPT0gcDItPnByb3RvKSAmJgorCQkoIXAxLT5lbmNhcF9saW1pdCB8fCBwMS0+ZW5jYXBfbGltaXQgPT0gcDItPmVuY2FwX2xpbWl0KSAmJgorCQkoIXAxLT5ob3BfbGltaXQgfHwgcDEtPmhvcF9saW1pdCA9PSBwMi0+aG9wX2xpbWl0KSAmJgorCQkoIShwMS0+Zmxvd2luZm8gJiBJUDZfRkxPV0lORk9fVENMQVNTKSB8fAorCQkgISgocDEtPmZsb3dpbmZvIF4gcDItPmZsb3dpbmZvKSAmIElQNl9GTE9XSU5GT19UQ0xBU1MpKSAmJgorCQkoIShwMS0+Zmxvd2luZm8gJiBJUDZfRkxPV0lORk9fRkxPV0xBQkVMKSB8fAorCQkgISgocDEtPmZsb3dpbmZvIF4gcDItPmZsb3dpbmZvKSAmIElQNl9GTE9XSU5GT19GTE9XTEFCRUwpKSAmJgorCQkoIXAxLT5mbGFncyB8fCAocDEtPmZsYWdzICYgcDItPmZsYWdzKSkpOworfQorCitzdGF0aWMgaW50IGRvX3R1bm5lbHNfbGlzdChzdHJ1Y3QgaXA2X3RubF9wYXJtMiAqcCkKK3sKKwljaGFyIGJ1Zls1MTJdOworCWludCBlcnIgPSAtMTsKKwlGSUxFICpmcCA9IGZvcGVuKCIvcHJvYy9uZXQvZGV2IiwgInIiKTsKKwlpZiAoZnAgPT0gTlVMTCkgeworCQlwZXJyb3IoImZvcGVuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBza2lwIHR3byBsaW5lcyBhdCB0aGUgYmVnZW5uaW5nIG9mIHRoZSBmaWxlICovCisJaWYgKCFmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkgfHwKKwkgICAgIWZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIi9wcm9jL25ldC9kZXYgcmVhZCBlcnJvclxuIik7CisJCWdvdG8gZW5kOworCX0KKworCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkgIT0gTlVMTCkgeworCQljaGFyIG5hbWVbSUZOQU1TSVpdOworCQlpbnQgaW5kZXgsIHR5cGU7CisJCXN0cnVjdCBpcDZfdG5sX3Bhcm0yIHAxOworCQljaGFyICpwdHI7CisKKwkJYnVmW3NpemVvZihidWYpIC0gMV0gPSAnXDAnOworCQlpZiAoKHB0ciA9IHN0cmNocihidWYsICc6JykpID09IE5VTEwgfHwKKwkJICAgICgqcHRyKysgPSAwLCBzc2NhbmYoYnVmLCAiJXMiLCBuYW1lKSAhPSAxKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJXcm9uZyBmb3JtYXQgZm9yIC9wcm9jL25ldC9kZXYuIEdpdmluZyB1cC5cbiIpOworCQkJZ290byBlbmQ7CisJCX0KKwkJaWYgKHAtPm5hbWVbMF0gJiYgc3RyY21wKHAtPm5hbWUsIG5hbWUpKQorCQkJY29udGludWU7CisJCWluZGV4ID0gbGxfbmFtZV90b19pbmRleChuYW1lKTsKKwkJaWYgKGluZGV4ID09IDApCisJCQljb250aW51ZTsKKwkJdHlwZSA9IGxsX2luZGV4X3RvX3R5cGUoaW5kZXgpOworCQlpZiAodHlwZSA9PSAtMSkgeworCQkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gZ2V0IHR5cGUgb2YgXCIlc1wiXG4iLCBuYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICh0eXBlICE9IEFSUEhSRF9UVU5ORUw2ICYmIHR5cGUgIT0gQVJQSFJEX0lQNkdSRSkKKwkJCWNvbnRpbnVlOworCQltZW1zZXQoJnAxLCAwLCBzaXplb2YocDEpKTsKKwkJaXA2X3RubF9wYXJtX2luaXQoJnAxLCAwKTsKKwkJaWYgKHR5cGUgPT0gQVJQSFJEX0lQNkdSRSkKKwkJCXAxLnByb3RvID0gSVBQUk9UT19HUkU7CisJCXN0cmNweShwMS5uYW1lLCBuYW1lKTsKKwkJcDEubGluayA9IGxsX25hbWVfdG9faW5kZXgocDEubmFtZSk7CisJCWlmIChwMS5saW5rID09IDApCisJCQljb250aW51ZTsKKwkJaWYgKHRubF9nZXRfaW9jdGwocDEubmFtZSwgJnAxKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIWlwNl90bmxfcGFybV9tYXRjaChwLCAmcDEpKQorCQkJY29udGludWU7CisJCXByaW50X3R1bm5lbCgmcDEpOworCQlpZiAoc2hvd19zdGF0cykKKwkJCXRubF9wcmludF9zdGF0cyhwdHIpOworCQlwcmludGYoIlxuIik7CisJfQorCWVyciA9IDA7CisgZW5kOgorCWZjbG9zZShmcCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBkb19zaG93KGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICAgICAgc3RydWN0IGlwNl90bmxfcGFybTIgcDsKKworCWxsX2luaXRfbWFwKCZydGgpOworCWlwNl90bmxfcGFybV9pbml0KCZwLCAwKTsKKwlwLnByb3RvID0gMDsgIC8qIGRlZmF1bHQgdG8gYW55ICovCisKKyAgICAgICAgaWYgKHBhcnNlX2FyZ3MoYXJnYywgYXJndiwgU0lPQ0dFVFRVTk5FTCwgJnApIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKwlpZiAoIXAubmFtZVswXSB8fCBzaG93X3N0YXRzKQorCQlkb190dW5uZWxzX2xpc3QoJnApOworCWVsc2UgeworCQlpZiAodG5sX2dldF9pb2N0bChwLm5hbWUsICZwKSkKKwkJCXJldHVybiAtMTsKKwkJcHJpbnRfdHVubmVsKCZwKTsKKwkJcHJpbnRmKCJcbiIpOworCX0KKworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19hZGQoaW50IGNtZCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBpcDZfdG5sX3Bhcm0yIHA7CisJY29uc3QgY2hhciAqYmFzZWRldiA9ICJpcDZ0bmwwIjsKKworCWlwNl90bmxfcGFybV9pbml0KCZwLCAxKTsKKworCWlmIChwYXJzZV9hcmdzKGFyZ2MsIGFyZ3YsIGNtZCwgJnApIDwgMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKHAucHJvdG8gPT0gSVBQUk9UT19HUkUpCisJCWJhc2VkZXYgPSAiaXA2Z3JlMCI7CisJZWxzZSBpZiAocC5pX2ZsYWdzICYgVlRJX0lTVlRJKQorCQliYXNlZGV2ID0gImlwNl92dGkwIjsKKworCXJldHVybiB0bmxfYWRkX2lvY3RsKGNtZCwgYmFzZWRldiwgcC5uYW1lLCAmcCk7Cit9CisKK3N0YXRpYyBpbnQgZG9fZGVsKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgaXA2X3RubF9wYXJtMiBwOworCWNvbnN0IGNoYXIgKmJhc2VkZXYgPSAiaXA2dG5sMCI7CisKKwlpcDZfdG5sX3Bhcm1faW5pdCgmcCwgMSk7CisKKwlpZiAocGFyc2VfYXJncyhhcmdjLCBhcmd2LCBTSU9DREVMVFVOTkVMLCAmcCkgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAocC5wcm90byA9PSBJUFBST1RPX0dSRSkKKwkJYmFzZWRldiA9ICJpcDZncmUwIjsKKwllbHNlIGlmIChwLmlfZmxhZ3MgJiBWVElfSVNWVEkpCisJCWJhc2VkZXYgPSAiaXA2X3Z0aTAiOworCisJcmV0dXJuIHRubF9kZWxfaW9jdGwoYmFzZWRldiwgcC5uYW1lLCAmcCk7Cit9CisKK2ludCBkb19pcDZ0dW5uZWwoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN3aXRjaCAocHJlZmVycmVkX2ZhbWlseSkgeworCWNhc2UgQUZfVU5TUEVDOgorCQlwcmVmZXJyZWRfZmFtaWx5ID0gQUZfSU5FVDY7CisJCWJyZWFrOworCWNhc2UgQUZfSU5FVDY6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZwcmludGYoc3RkZXJyLCAiVW5zdXBwb3J0ZWQgcHJvdG9jb2wgZmFtaWx5OiAlZFxuIiwgcHJlZmVycmVkX2ZhbWlseSk7CisJCWV4aXQoLTEpOworCX0KKworCWlmIChhcmdjID4gMCkgeworCQlpZiAobWF0Y2hlcygqYXJndiwgImFkZCIpID09IDApCisJCQlyZXR1cm4gZG9fYWRkKFNJT0NBRERUVU5ORUwsIGFyZ2MgLSAxLCBhcmd2ICsgMSk7CisJCWlmIChtYXRjaGVzKCphcmd2LCAiY2hhbmdlIikgPT0gMCkKKwkJCXJldHVybiBkb19hZGQoU0lPQ0NIR1RVTk5FTCwgYXJnYyAtIDEsIGFyZ3YgKyAxKTsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJkZWxldGUiKSA9PSAwKQorCQkJcmV0dXJuIGRvX2RlbChhcmdjIC0gMSwgYXJndiArIDEpOworCQlpZiAobWF0Y2hlcygqYXJndiwgInNob3ciKSA9PSAwIHx8CisJCSAgICBtYXRjaGVzKCphcmd2LCAibHN0IikgPT0gMCB8fAorCQkgICAgbWF0Y2hlcygqYXJndiwgImxpc3QiKSA9PSAwKQorCQkJcmV0dXJuIGRvX3Nob3coYXJnYyAtIDEsIGFyZ3YgKyAxKTsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkKKwkJCXVzYWdlKCk7CisJfSBlbHNlCisJCXJldHVybiBkb19zaG93KDAsIE5VTEwpOworCisJZnByaW50ZihzdGRlcnIsICJDb21tYW5kIFwiJXNcIiBpcyB1bmtub3duLCB0cnkgXCJpcCAtZiBpbmV0NiB0dW5uZWwgaGVscFwiLlxuIiwgKmFyZ3YpOworCWV4aXQoLTEpOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaXAvaXBfY29tbW9uLmggYi9pcHJvdXRlMi9pcC9pcF9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTg0NmRmCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaXAvaXBfY29tbW9uLmgKQEAgLTAsMCArMSw5MiBAQAoraW50IGdldF9vcGVyc3RhdGUoY29uc3QgY2hhciAqbmFtZSk7CitpbnQgcHJpbnRfbGlua2luZm8oY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8sCisJCSAgIHN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqYXJnKTsKK2ludCBwcmludF9saW5raW5mb19icmllZihjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobywKKwkJCSBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZyk7CitpbnQgcHJpbnRfYWRkcmluZm8oY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8sCisJCSAgIHN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqYXJnKTsKK2ludCBwcmludF9hZGRybGFiZWwoY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8sCisJCSAgICBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZyk7CitpbnQgcHJpbnRfbmVpZ2goY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8sCisJICAgICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZyk7CitpbnQgaXBhZGRyX2xpc3RfbGluayhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOwordm9pZCBpcGFkZHJfZ2V0X3ZmX3JhdGUoaW50LCBpbnQgKiwgaW50ICosIGludCk7Cit2b2lkIGlwbGlua191c2FnZSh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworCit2b2lkIGlwcm91dGVfcmVzZXRfZmlsdGVyKGludCBpZmluZGV4KTsKK3ZvaWQgaXBtcm91dGVfcmVzZXRfZmlsdGVyKGludCBpZmluZGV4KTsKK3ZvaWQgaXBhZGRyX3Jlc2V0X2ZpbHRlcihpbnQgb25lbGluZSwgaW50IGlmaW5kZXgpOwordm9pZCBpcG5laWdoX3Jlc2V0X2ZpbHRlcihpbnQgaWZpbmRleCk7Cit2b2lkIGlwbmV0Y29uZl9yZXNldF9maWx0ZXIoaW50IGlmaW5kZXgpOworCitpbnQgcHJpbnRfcm91dGUoY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8sCisJCXN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqYXJnKTsKK2ludCBwcmludF9tcm91dGUoY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8sCisJCSBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZyk7CitpbnQgcHJpbnRfcHJlZml4KGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLAorCQkgc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcpOworaW50IHByaW50X3J1bGUoY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8sCisJICAgICAgIHN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqYXJnKTsKK2ludCBwcmludF9uZXRjb25mKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLAorCQkgIHN0cnVjdCBydG5sX2N0cmxfZGF0YSAqY3RybCwKKwkJICBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZyk7Cit2b2lkIG5ldG5zX21hcF9pbml0KHZvaWQpOworaW50IHByaW50X25zaWQoY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8sCisJICAgICAgIHN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqYXJnKTsKK2ludCBkb19pcGFkZHIoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKK2ludCBkb19pcGFkZHJsYWJlbChpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworaW50IGRvX2lwcm91dGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKK2ludCBkb19pcHJ1bGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKK2ludCBkb19pcG5laWdoKGludCBhcmdjLCBjaGFyICoqYXJndik7CitpbnQgZG9faXBudGFibGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKK2ludCBkb19pcHR1bm5lbChpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworaW50IGRvX2lwNnR1bm5lbChpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworaW50IGRvX2lwdHVudGFwKGludCBhcmdjLCBjaGFyICoqYXJndik7CitpbnQgZG9faXBsaW5rKGludCBhcmdjLCBjaGFyICoqYXJndik7CitpbnQgZG9faXBtb25pdG9yKGludCBhcmdjLCBjaGFyICoqYXJndik7CitpbnQgZG9fbXVsdGlhZGRyKGludCBhcmdjLCBjaGFyICoqYXJndik7CitpbnQgZG9fbXVsdGlyb3V0ZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworaW50IGRvX211bHRpcnVsZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworaW50IGRvX25ldG5zKGludCBhcmdjLCBjaGFyICoqYXJndik7CitpbnQgZG9feGZybShpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworaW50IGRvX2lwbDJ0cChpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworaW50IGRvX2lwZm91KGludCBhcmdjLCBjaGFyICoqYXJndik7CitpbnQgZG9fdGNwX21ldHJpY3MoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKK2ludCBkb19pcG5ldGNvbmYoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKK2ludCBkb19pcHRva2VuKGludCBhcmdjLCBjaGFyICoqYXJndik7CitpbnQgaXBsaW5rX2dldCh1bnNpZ25lZCBpbnQgZmxhZ3MsIGNoYXIgKm5hbWUsIF9fdTMyIGZpbHRfbWFzayk7CisKK3N0YXRpYyBpbmxpbmUgaW50IHJ0bV9nZXRfdGFibGUoc3RydWN0IHJ0bXNnICpyLCBzdHJ1Y3QgcnRhdHRyICoqdGIpCit7CisJX191MzIgdGFibGUgPSByLT5ydG1fdGFibGU7CisJaWYgKHRiW1JUQV9UQUJMRV0pCisJCXRhYmxlID0gcnRhX2dldGF0dHJfdTMyKHRiW1JUQV9UQUJMRV0pOworCXJldHVybiB0YWJsZTsKK30KKworZXh0ZXJuIHN0cnVjdCBydG5sX2hhbmRsZSBydGg7CisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisKK3N0cnVjdCBsaW5rX3V0aWwKK3sKKwlzdHJ1Y3QgbGlua191dGlsCSpuZXh0OworCWNvbnN0IGNoYXIJCSppZDsKKwlpbnQJCQltYXhhdHRyOworCWludAkJCSgqcGFyc2Vfb3B0KShzdHJ1Y3QgbGlua191dGlsICosIGludCwgY2hhciAqKiwKKwkJCQkJICAgICBzdHJ1Y3Qgbmxtc2doZHIgKik7CisJdm9pZAkJCSgqcHJpbnRfb3B0KShzdHJ1Y3QgbGlua191dGlsICosIEZJTEUgKiwKKwkJCQkJICAgICBzdHJ1Y3QgcnRhdHRyICpbXSk7CisJdm9pZAkJCSgqcHJpbnRfeHN0YXRzKShzdHJ1Y3QgbGlua191dGlsICosIEZJTEUgKiwKKwkJCQkJICAgICBzdHJ1Y3QgcnRhdHRyICopOworCXZvaWQJCQkoKnByaW50X2hlbHApKHN0cnVjdCBsaW5rX3V0aWwgKiwgaW50LCBjaGFyICoqLAorCQkJCQkgICAgIEZJTEUgKik7CisJYm9vbAkJCXNsYXZlOworfTsKKworc3RydWN0IGxpbmtfdXRpbCAqZ2V0X2xpbmtfa2luZChjb25zdCBjaGFyICpraW5kKTsKK3N0cnVjdCBsaW5rX3V0aWwgKmdldF9saW5rX3NsYXZlX2tpbmQoY29uc3QgY2hhciAqc2xhdmVfa2luZCk7CisKKyNpZm5kZWYJSU5GSU5JVFlfTElGRV9USU1FCisjZGVmaW5lICAgICBJTkZJTklUWV9MSUZFX1RJTUUgICAgICAweEZGRkZGRkZGVQorI2VuZGlmCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pcC9pcGFkZHJlc3MuYyBiL2lwcm91dGUyL2lwL2lwYWRkcmVzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMjU0ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pcC9pcGFkZHJlc3MuYwpAQCAtMCwwICsxLDE5OTcgQEAKKy8qCisgKiBpcGFkZHJlc3MuYwkJImlwIGFkZHJlc3MiLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvbmV0X25hbWVzcGFjZS5oPgorCisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgImxsX21hcC5oIgorI2luY2x1ZGUgImlwX2NvbW1vbi5oIgorI2luY2x1ZGUgImNvbG9yLmgiCisKK2VudW0geworCUlQQUREX0xJU1QsCisJSVBBRERfRkxVU0gsCisJSVBBRERfU0FWRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QKK3sKKwlpbnQgaWZpbmRleDsKKwlpbnQgZmFtaWx5OworCWludCBvbmVsaW5lOworCWludCBzaG93cXVldWU7CisJaW5ldF9wcmVmaXggcGZ4OworCWludCBzY29wZSwgc2NvcGVtYXNrOworCWludCBmbGFncywgZmxhZ21hc2s7CisJaW50IHVwOworCWNoYXIgKmxhYmVsOworCWludCBmbHVzaGVkOworCWNoYXIgKmZsdXNoYjsKKwlpbnQgZmx1c2hwOworCWludCBmbHVzaGU7CisJaW50IGdyb3VwOworCWludCBtYXN0ZXI7CisJY2hhciAqa2luZDsKK30gZmlsdGVyOworCitzdGF0aWMgaW50IGRvX2xpbms7CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisJaWYgKGRvX2xpbmspIHsKKwkJaXBsaW5rX3VzYWdlKCk7CisJfQorCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGlwIGFkZHJlc3Mge2FkZHxjaGFuZ2V8cmVwbGFjZX0gSUZBRERSIGRldiBJRk5BTUUgWyBMSUZFVElNRSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgQ09ORkZMQUctTElTVCBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBpcCBhZGRyZXNzIGRlbCBJRkFERFIgZGV2IElGTkFNRSBbbW5ndG1wYWRkcl1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgIGlwIGFkZHJlc3Mge3Nob3d8c2F2ZXxmbHVzaH0gWyBkZXYgSUZOQU1FIF0gWyBzY29wZSBTQ09QRS1JRCBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIHRvIFBSRUZJWCBdIFsgRkxBRy1MSVNUIF0gWyBsYWJlbCBMQUJFTCBdIFt1cF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgIGlwIGFkZHJlc3Mge3Nob3dkdW1wfHJlc3RvcmV9XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIklGQUREUiA6PSBQUkVGSVggfCBBRERSIHBlZXIgUFJFRklYXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICBbIGJyb2FkY2FzdCBBRERSIF0gWyBhbnljYXN0IEFERFIgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgWyBsYWJlbCBJRk5BTUUgXSBbIHNjb3BlIFNDT1BFLUlEIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiU0NPUEUtSUQgOj0gWyBob3N0IHwgbGluayB8IGdsb2JhbCB8IE5VTUJFUiBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIkZMQUctTElTVCA6PSBbIEZMQUctTElTVCBdIEZMQUdcbiIpOworCWZwcmludGYoc3RkZXJyLCAiRkxBRyAgOj0gWyBwZXJtYW5lbnQgfCBkeW5hbWljIHwgc2Vjb25kYXJ5IHwgcHJpbWFyeSB8XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgWy1ddGVudGF0aXZlIHwgWy1dZGVwcmVjYXRlZCB8IFstXWRhZGZhaWxlZCB8IHRlbXBvcmFyeSB8XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgQ09ORkZMQUctTElTVCBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIkNPTkZGTEFHLUxJU1QgOj0gWyBDT05GRkxBRy1MSVNUIF0gQ09ORkZMQUdcbiIpOworCWZwcmludGYoc3RkZXJyLCAiQ09ORkZMQUcgIDo9IFsgaG9tZSB8IG5vZGFkIHwgbW5ndG1wYWRkciB8IG5vcHJlZml4cm91dGUgfCBhdXRvam9pbiBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIkxJRkVUSU1FIDo9IFsgdmFsaWRfbGZ0IExGVCBdIFsgcHJlZmVycmVkX2xmdCBMRlQgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICJMRlQgOj0gZm9yZXZlciB8IFNFQ09ORFNcbiIpOworCisJZXhpdCgtMSk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2xpbmtfZmxhZ3MoRklMRSAqZnAsIHVuc2lnbmVkIGZsYWdzLCB1bnNpZ25lZCBtZG93bikKK3sKKwlmcHJpbnRmKGZwLCAiPCIpOworCWlmIChmbGFncyAmIElGRl9VUCAmJiAhKGZsYWdzICYgSUZGX1JVTk5JTkcpKQorCQlmcHJpbnRmKGZwLCAiTk8tQ0FSUklFUiVzIiwgZmxhZ3MgPyAiLCIgOiAiIik7CisJZmxhZ3MgJj0gfklGRl9SVU5OSU5HOworI2RlZmluZSBfUEYoZikgaWYgKGZsYWdzJklGRl8jI2YpIHsgXAorCQkgIGZsYWdzICY9IH5JRkZfIyNmIDsgXAorCQkgIGZwcmludGYoZnAsICNmICIlcyIsIGZsYWdzID8gIiwiIDogIiIpOyB9CisJX1BGKExPT1BCQUNLKTsKKwlfUEYoQlJPQURDQVNUKTsKKwlfUEYoUE9JTlRPUE9JTlQpOworCV9QRihNVUxUSUNBU1QpOworCV9QRihOT0FSUCk7CisJX1BGKEFMTE1VTFRJKTsKKwlfUEYoUFJPTUlTQyk7CisJX1BGKE1BU1RFUik7CisJX1BGKFNMQVZFKTsKKwlfUEYoREVCVUcpOworCV9QRihEWU5BTUlDKTsKKwlfUEYoQVVUT01FRElBKTsKKwlfUEYoUE9SVFNFTCk7CisJX1BGKE5PVFJBSUxFUlMpOworCV9QRihVUCk7CisJX1BGKExPV0VSX1VQKTsKKwlfUEYoRE9STUFOVCk7CisJX1BGKEVDSE8pOworI3VuZGVmIF9QRgorCWlmIChmbGFncykKKwkJZnByaW50ZihmcCwgIiV4IiwgZmxhZ3MpOworCWlmIChtZG93bikKKwkJZnByaW50ZihmcCwgIixNLURPV04iKTsKKwlmcHJpbnRmKGZwLCAiPiAiKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKm9wZXJfc3RhdGVzW10gPSB7CisJIlVOS05PV04iLCAiTk9UUFJFU0VOVCIsICJET1dOIiwgIkxPV0VSTEFZRVJET1dOIiwKKwkiVEVTVElORyIsICJET1JNQU5UIiwJICJVUCIKK307CisKK3N0YXRpYyB2b2lkIHByaW50X29wZXJzdGF0ZShGSUxFICpmLCBfX3U4IHN0YXRlKQoreworCWlmIChzdGF0ZSA+PSBzaXplb2Yob3Blcl9zdGF0ZXMpL3NpemVvZihvcGVyX3N0YXRlc1swXSkpCisJCWZwcmludGYoZiwgInN0YXRlICUjeCAiLCBzdGF0ZSk7CisJZWxzZSB7CisJCWlmIChicmllZikgeworCQkJaWYgKHN0cmNtcChvcGVyX3N0YXRlc1tzdGF0ZV0sICJVUCIpID09IDApCisJCQkJY29sb3JfZnByaW50ZihmLCBDT0xPUl9PUEVSU1RBVEVfVVAsICIlLTE0cyAiLCBvcGVyX3N0YXRlc1tzdGF0ZV0pOworCQkJZWxzZSBpZiAoc3RyY21wKG9wZXJfc3RhdGVzW3N0YXRlXSwgIkRPV04iKSA9PSAwKQorCQkJCWNvbG9yX2ZwcmludGYoZiwgQ09MT1JfT1BFUlNUQVRFX0RPV04sICIlLTE0cyAiLCBvcGVyX3N0YXRlc1tzdGF0ZV0pOworCQkJZWxzZQorCQkJCWZwcmludGYoZiwgIiUtMTRzICIsIG9wZXJfc3RhdGVzW3N0YXRlXSk7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKGYsICJzdGF0ZSAiKTsKKwkJCWlmIChzdHJjbXAob3Blcl9zdGF0ZXNbc3RhdGVdLCAiVVAiKSA9PSAwKQorCQkJCWNvbG9yX2ZwcmludGYoZiwgQ09MT1JfT1BFUlNUQVRFX1VQLCAiJXMgIiwgb3Blcl9zdGF0ZXNbc3RhdGVdKTsKKwkJCWVsc2UgaWYgKHN0cmNtcChvcGVyX3N0YXRlc1tzdGF0ZV0sICJET1dOIikgPT0gMCkKKwkJCQljb2xvcl9mcHJpbnRmKGYsIENPTE9SX09QRVJTVEFURV9ET1dOLCAiJXMgIiwgb3Blcl9zdGF0ZXNbc3RhdGVdKTsKKwkJCWVsc2UKKwkJCQlmcHJpbnRmKGYsICIlcyAiLCBvcGVyX3N0YXRlc1tzdGF0ZV0pOworCQl9CisJfQorfQorCitpbnQgZ2V0X29wZXJzdGF0ZShjb25zdCBjaGFyICpuYW1lKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihvcGVyX3N0YXRlcykvc2l6ZW9mKG9wZXJfc3RhdGVzWzBdKTsgaSsrKQorCQlpZiAoc3RyY2FzZWNtcChuYW1lLCBvcGVyX3N0YXRlc1tpXSkgPT0gMCkKKwkJCXJldHVybiBpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfcXVldWVsZW4oRklMRSAqZiwgc3RydWN0IHJ0YXR0ciAqdGJbSUZMQV9NQVggKyAxXSkKK3sKKwlpbnQgcWxlbjsKKworCWlmICh0YltJRkxBX1RYUUxFTl0pCisJCXFsZW4gPSAqKGludCAqKVJUQV9EQVRBKHRiW0lGTEFfVFhRTEVOXSk7CisJZWxzZSB7CisJCXN0cnVjdCBpZnJlcSBpZnI7CisJCWludCBzID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKworCQlpZiAocyA8IDApCisJCQlyZXR1cm47CisKKwkJbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKKwkJc3RyY3B5KGlmci5pZnJfbmFtZSwgcnRhX2dldGF0dHJfc3RyKHRiW0lGTEFfSUZOQU1FXSkpOworCQlpZiAoaW9jdGwocywgU0lPQ0dJRlRYUUxFTiwgJmlmcikgPCAwKSB7CisJCQlmcHJpbnRmKGYsICJpb2N0bChTSU9DR0lGVFhRTEVOKSBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQkJY2xvc2Uocyk7CisJCQlyZXR1cm47CisJCX0KKwkJY2xvc2Uocyk7CisJCXFsZW4gPSBpZnIuaWZyX3FsZW47CisJfQorCWlmIChxbGVuKQorCQlmcHJpbnRmKGYsICJxbGVuICVkIiwgcWxlbik7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpsaW5rX21vZGVzW10gPSB7CisJIkRFRkFVTFQiLCAiRE9STUFOVCIKK307CisKK3N0YXRpYyB2b2lkIHByaW50X2xpbmttb2RlKEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKnRiKQoreworCXVuc2lnbmVkIGludCBtb2RlID0gcnRhX2dldGF0dHJfdTgodGIpOworCisJaWYgKG1vZGUgPj0gc2l6ZW9mKGxpbmtfbW9kZXMpIC8gc2l6ZW9mKGxpbmtfbW9kZXNbMF0pKQorCQlmcHJpbnRmKGYsICJtb2RlICVkICIsIG1vZGUpOworCWVsc2UKKwkJZnByaW50ZihmLCAibW9kZSAlcyAiLCBsaW5rX21vZGVzW21vZGVdKTsKK30KKworc3RhdGljIGNoYXIgKnBhcnNlX2xpbmtfa2luZChzdHJ1Y3QgcnRhdHRyICp0YikKK3sKKwlzdHJ1Y3QgcnRhdHRyICpsaW5raW5mb1tJRkxBX0lORk9fTUFYKzFdOworCisJcGFyc2VfcnRhdHRyX25lc3RlZChsaW5raW5mbywgSUZMQV9JTkZPX01BWCwgdGIpOworCisJaWYgKGxpbmtpbmZvW0lGTEFfSU5GT19LSU5EXSkKKwkJcmV0dXJuIFJUQV9EQVRBKGxpbmtpbmZvW0lGTEFfSU5GT19LSU5EXSk7CisKKwlyZXR1cm4gIiI7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2xpbmt0eXBlKEZJTEUgKmZwLCBzdHJ1Y3QgcnRhdHRyICp0YikKK3sKKwlzdHJ1Y3QgcnRhdHRyICpsaW5raW5mb1tJRkxBX0lORk9fTUFYKzFdOworCXN0cnVjdCBsaW5rX3V0aWwgKmx1OworCXN0cnVjdCBsaW5rX3V0aWwgKnNsYXZlX2x1OworCWNoYXIgKmtpbmQ7CisJY2hhciAqc2xhdmVfa2luZDsKKworCXBhcnNlX3J0YXR0cl9uZXN0ZWQobGlua2luZm8sIElGTEFfSU5GT19NQVgsIHRiKTsKKworCWlmIChsaW5raW5mb1tJRkxBX0lORk9fS0lORF0pIHsKKwkJa2luZCA9IFJUQV9EQVRBKGxpbmtpbmZvW0lGTEFfSU5GT19LSU5EXSk7CisKKwkJZnByaW50ZihmcCwgIiVzIiwgX1NMXyk7CisJCWZwcmludGYoZnAsICIgICAgJXMgIiwga2luZCk7CisKKwkJbHUgPSBnZXRfbGlua19raW5kKGtpbmQpOworCQlpZiAobHUgJiYgbHUtPnByaW50X29wdCkgeworCQkJc3RydWN0IHJ0YXR0ciAqYXR0cltsdS0+bWF4YXR0cisxXSwgKipkYXRhID0gTlVMTDsKKworCQkJaWYgKGxpbmtpbmZvW0lGTEFfSU5GT19EQVRBXSkgeworCQkJCXBhcnNlX3J0YXR0cl9uZXN0ZWQoYXR0ciwgbHUtPm1heGF0dHIsCisJCQkJCQkgICAgbGlua2luZm9bSUZMQV9JTkZPX0RBVEFdKTsKKwkJCQlkYXRhID0gYXR0cjsKKwkJCX0KKwkJCWx1LT5wcmludF9vcHQobHUsIGZwLCBkYXRhKTsKKworCQkJaWYgKGxpbmtpbmZvW0lGTEFfSU5GT19YU1RBVFNdICYmIHNob3dfc3RhdHMgJiYKKwkJCSAgICBsdS0+cHJpbnRfeHN0YXRzKQorCQkJCWx1LT5wcmludF94c3RhdHMobHUsIGZwLCBsaW5raW5mb1tJRkxBX0lORk9fWFNUQVRTXSk7CisJCX0KKwl9CisKKwlpZiAobGlua2luZm9bSUZMQV9JTkZPX1NMQVZFX0tJTkRdKSB7CisJCXNsYXZlX2tpbmQgPSBSVEFfREFUQShsaW5raW5mb1tJRkxBX0lORk9fU0xBVkVfS0lORF0pOworCisJCWZwcmludGYoZnAsICIlcyIsIF9TTF8pOworCQlmcHJpbnRmKGZwLCAiICAgICVzX3NsYXZlICIsIHNsYXZlX2tpbmQpOworCisJCXNsYXZlX2x1ID0gZ2V0X2xpbmtfc2xhdmVfa2luZChzbGF2ZV9raW5kKTsKKwkJaWYgKHNsYXZlX2x1ICYmIHNsYXZlX2x1LT5wcmludF9vcHQpIHsKKwkJCXN0cnVjdCBydGF0dHIgKmF0dHJbc2xhdmVfbHUtPm1heGF0dHIrMV0sICoqZGF0YSA9IE5VTEw7CisKKwkJCWlmIChsaW5raW5mb1tJRkxBX0lORk9fU0xBVkVfREFUQV0pIHsKKwkJCQlwYXJzZV9ydGF0dHJfbmVzdGVkKGF0dHIsIHNsYXZlX2x1LT5tYXhhdHRyLAorCQkJCQkJICAgIGxpbmtpbmZvW0lGTEFfSU5GT19TTEFWRV9EQVRBXSk7CisJCQkJZGF0YSA9IGF0dHI7CisJCQl9CisJCQlzbGF2ZV9sdS0+cHJpbnRfb3B0KHNsYXZlX2x1LCBmcCwgZGF0YSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2FmX3NwZWMoRklMRSAqZnAsIHN0cnVjdCBydGF0dHIgKmFmX3NwZWNfYXR0cikKK3sKKwlzdHJ1Y3QgcnRhdHRyICppbmV0Nl9hdHRyOworCXN0cnVjdCBydGF0dHIgKnRiW0lGTEFfSU5FVDZfTUFYICsgMV07CisKKwlpbmV0Nl9hdHRyID0gcGFyc2VfcnRhdHRyX29uZV9uZXN0ZWQoQUZfSU5FVDYsIGFmX3NwZWNfYXR0cik7CisJaWYgKCFpbmV0Nl9hdHRyKQorCQlyZXR1cm47CisKKwlwYXJzZV9ydGF0dHJfbmVzdGVkKHRiLCBJRkxBX0lORVQ2X01BWCwgaW5ldDZfYXR0cik7CisKKwlpZiAodGJbSUZMQV9JTkVUNl9BRERSX0dFTl9NT0RFXSkgeworCQlfX3U4IG1vZGUgPSBydGFfZ2V0YXR0cl91OCh0YltJRkxBX0lORVQ2X0FERFJfR0VOX01PREVdKTsKKwkJc3dpdGNoIChtb2RlKSB7CisJCWNhc2UgSU42X0FERFJfR0VOX01PREVfRVVJNjQ6CisJCQlmcHJpbnRmKGZwLCAiYWRkcmdlbm1vZGUgZXVpNjQgIik7CisJCQlicmVhazsKKwkJY2FzZSBJTjZfQUREUl9HRU5fTU9ERV9OT05FOgorCQkJZnByaW50ZihmcCwgImFkZHJnZW5tb2RlIG5vbmUgIik7CisJCQlicmVhazsKKwkJY2FzZSBJTjZfQUREUl9HRU5fTU9ERV9TVEFCTEVfUFJJVkFDWToKKwkJCWZwcmludGYoZnAsICJhZGRyZ2VubW9kZSBzdGFibGVfc2VjcmV0ICIpOworCQkJYnJlYWs7CisJCWNhc2UgSU42X0FERFJfR0VOX01PREVfUkFORE9NOgorCQkJZnByaW50ZihmcCwgImFkZHJnZW5tb2RlIHJhbmRvbSAiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZnByaW50ZihmcCwgImFkZHJnZW5tb2RlICUjLjJoaHggIiwgbW9kZSk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcHJpbnRfdmZfc3RhdHM2NChGSUxFICpmcCwgc3RydWN0IHJ0YXR0ciAqdmZzdGF0cyk7CisKK3N0YXRpYyB2b2lkIHByaW50X3ZmaW5mbyhGSUxFICpmcCwgc3RydWN0IHJ0YXR0ciAqdmZpbmZvKQoreworCXN0cnVjdCBpZmxhX3ZmX21hYyAqdmZfbWFjOworCXN0cnVjdCBpZmxhX3ZmX3ZsYW4gKnZmX3ZsYW47CisJc3RydWN0IGlmbGFfdmZfdHhfcmF0ZSAqdmZfdHhfcmF0ZTsKKwlzdHJ1Y3QgaWZsYV92Zl9zcG9vZmNoayAqdmZfc3Bvb2ZjaGs7CisJc3RydWN0IGlmbGFfdmZfbGlua19zdGF0ZSAqdmZfbGlua3N0YXRlOworCXN0cnVjdCBydGF0dHIgKnZmW0lGTEFfVkZfTUFYICsgMV0gPSB7fTsKKwlzdHJ1Y3QgcnRhdHRyICp0bXA7CisJU1BSSU5UX0JVRihiMSk7CisKKwlpZiAodmZpbmZvLT5ydGFfdHlwZSAhPSBJRkxBX1ZGX0lORk8pIHsKKwkJZnByaW50ZihzdGRlcnIsICJCVUc6IHJ0YSB0eXBlIGlzICVkXG4iLCB2ZmluZm8tPnJ0YV90eXBlKTsKKwkJcmV0dXJuOworCX0KKworCXBhcnNlX3J0YXR0cl9uZXN0ZWQodmYsIElGTEFfVkZfTUFYLCB2ZmluZm8pOworCisJdmZfbWFjID0gUlRBX0RBVEEodmZbSUZMQV9WRl9NQUNdKTsKKwl2Zl92bGFuID0gUlRBX0RBVEEodmZbSUZMQV9WRl9WTEFOXSk7CisJdmZfdHhfcmF0ZSA9IFJUQV9EQVRBKHZmW0lGTEFfVkZfVFhfUkFURV0pOworCisJLyogQ2hlY2sgaWYgdGhlIHNwb29mIGNoZWNraW5nIHZmIGluZm8gdHlwZSBpcyBzdXBwb3J0ZWQgYnkKKwkgKiB0aGlzIGtlcm5lbC4KKwkgKi8KKwl0bXAgPSAoc3RydWN0IHJ0YXR0ciAqKSgoY2hhciAqKXZmW0lGTEFfVkZfVFhfUkFURV0gKworCQkJdmZbSUZMQV9WRl9UWF9SQVRFXS0+cnRhX2xlbik7CisKKwlpZiAodG1wLT5ydGFfdHlwZSAhPSBJRkxBX1ZGX1NQT09GQ0hLKQorCQl2Zl9zcG9vZmNoayA9IE5VTEw7CisJZWxzZQorCQl2Zl9zcG9vZmNoayA9IFJUQV9EQVRBKHZmW0lGTEFfVkZfU1BPT0ZDSEtdKTsKKworCWlmICh2Zl9zcG9vZmNoaykgeworCQkvKiBDaGVjayBpZiB0aGUgbGluayBzdGF0ZSB2ZiBpbmZvIHR5cGUgaXMgc3VwcG9ydGVkIGJ5CisJCSAqIHRoaXMga2VybmVsLgorCQkgKi8KKwkJdG1wID0gKHN0cnVjdCBydGF0dHIgKikoKGNoYXIgKil2ZltJRkxBX1ZGX1NQT09GQ0hLXSArCisJCQkJdmZbSUZMQV9WRl9TUE9PRkNIS10tPnJ0YV9sZW4pOworCisJCWlmICh0bXAtPnJ0YV90eXBlICE9IElGTEFfVkZfTElOS19TVEFURSkKKwkJCXZmX2xpbmtzdGF0ZSA9IE5VTEw7CisJCWVsc2UKKwkJCXZmX2xpbmtzdGF0ZSA9IFJUQV9EQVRBKHZmW0lGTEFfVkZfTElOS19TVEFURV0pOworCX0gZWxzZQorCQl2Zl9saW5rc3RhdGUgPSBOVUxMOworCisJZnByaW50ZihmcCwgIiVzICAgIHZmICVkIE1BQyAlcyIsIF9TTF8sIHZmX21hYy0+dmYsCisJCWxsX2FkZHJfbjJhKCh1bnNpZ25lZCBjaGFyICopJnZmX21hYy0+bWFjLAorCQlFVEhfQUxFTiwgMCwgYjEsIHNpemVvZihiMSkpKTsKKwlpZiAodmZfdmxhbi0+dmxhbikKKwkJZnByaW50ZihmcCwgIiwgdmxhbiAlZCIsIHZmX3ZsYW4tPnZsYW4pOworCWlmICh2Zl92bGFuLT5xb3MpCisJCWZwcmludGYoZnAsICIsIHFvcyAlZCIsIHZmX3ZsYW4tPnFvcyk7CisJaWYgKHZmX3R4X3JhdGUtPnJhdGUpCisJCWZwcmludGYoZnAsICIsIHR4IHJhdGUgJWQgKE1icHMpIiwgdmZfdHhfcmF0ZS0+cmF0ZSk7CisKKwlpZiAodmZbSUZMQV9WRl9SQVRFXSkgeworCQlzdHJ1Y3QgaWZsYV92Zl9yYXRlICp2Zl9yYXRlID0gUlRBX0RBVEEodmZbSUZMQV9WRl9SQVRFXSk7CisKKwkJaWYgKHZmX3JhdGUtPm1heF90eF9yYXRlKQorCQkJZnByaW50ZihmcCwgIiwgbWF4X3R4X3JhdGUgJWRNYnBzIiwgdmZfcmF0ZS0+bWF4X3R4X3JhdGUpOworCQlpZiAodmZfcmF0ZS0+bWluX3R4X3JhdGUpCisJCQlmcHJpbnRmKGZwLCAiLCBtaW5fdHhfcmF0ZSAlZE1icHMiLCB2Zl9yYXRlLT5taW5fdHhfcmF0ZSk7CisJfQorCisJaWYgKHZmX3Nwb29mY2hrICYmIHZmX3Nwb29mY2hrLT5zZXR0aW5nICE9IC0xKSB7CisJCWlmICh2Zl9zcG9vZmNoay0+c2V0dGluZykKKwkJCWZwcmludGYoZnAsICIsIHNwb29mIGNoZWNraW5nIG9uIik7CisJCWVsc2UKKwkJCWZwcmludGYoZnAsICIsIHNwb29mIGNoZWNraW5nIG9mZiIpOworCX0KKwlpZiAodmZfbGlua3N0YXRlKSB7CisJCWlmICh2Zl9saW5rc3RhdGUtPmxpbmtfc3RhdGUgPT0gSUZMQV9WRl9MSU5LX1NUQVRFX0FVVE8pCisJCQlmcHJpbnRmKGZwLCAiLCBsaW5rLXN0YXRlIGF1dG8iKTsKKwkJZWxzZSBpZiAodmZfbGlua3N0YXRlLT5saW5rX3N0YXRlID09IElGTEFfVkZfTElOS19TVEFURV9FTkFCTEUpCisJCQlmcHJpbnRmKGZwLCAiLCBsaW5rLXN0YXRlIGVuYWJsZSIpOworCQllbHNlCisJCQlmcHJpbnRmKGZwLCAiLCBsaW5rLXN0YXRlIGRpc2FibGUiKTsKKwl9CisJaWYgKHZmW0lGTEFfVkZfU1RBVFNdICYmIHNob3dfc3RhdHMpCisJCXByaW50X3ZmX3N0YXRzNjQoZnAsIHZmW0lGTEFfVkZfU1RBVFNdKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfbnVtKEZJTEUgKmZwLCB1bnNpZ25lZCB3aWR0aCwgdWludDY0X3QgY291bnQpCit7CisJY29uc3QgY2hhciAqcHJlZml4ID0gImtNR1RQRSI7CisJY29uc3QgdW5zaWduZWQgaW50IGJhc2UgPSB1c2VfaWVjID8gMTAyNCA6IDEwMDA7CisJdWludDY0X3QgcG93aSA9IDE7CisJdWludDE2X3QgcG93aiA9IDE7CisJdWludDhfdCBwcmVjaXNpb24gPSAyOworCWNoYXIgYnVmWzY0XTsKKworCWlmICghaHVtYW5fcmVhZGFibGUgfHwgY291bnQgPCBiYXNlKSB7CisJCWZwcmludGYoZnAsICIlLSoiUFJJdTY0IiAiLCB3aWR0aCwgY291bnQpOworCQlyZXR1cm47CisJfQorCisJLyogaW5jcmVhc2UgdmFsdWUgYnkgYSBmYWN0b3Igb2YgMTAwMC8xMDI0IGFuZCBwcmludAorCSAqIGlmIHJlc3VsdCBpcyBzb21ldGhpbmcgYSBodW1hbiBjYW4gcmVhZCAqLworCWZvcig7OykgeworCQlwb3dpICo9IGJhc2U7CisJCWlmIChjb3VudCAvIGJhc2UgPCBwb3dpKQorCQkJYnJlYWs7CisKKwkJaWYgKCFwcmVmaXhbMV0pCisJCQlicmVhazsKKwkJKytwcmVmaXg7CisJfQorCisJLyogdHJ5IHRvIGd1ZXNzIGEgZ29vZCBudW1iZXIgb2YgZGlnaXRzIGZvciBwcmVjaXNpb24gKi8KKwlmb3IgKDsgcHJlY2lzaW9uID4gMDsgcHJlY2lzaW9uLS0pIHsKKwkJcG93aiAqPSAxMDsKKwkJaWYgKGNvdW50IC8gcG93aSA8IHBvd2opCisJCQlicmVhazsKKwl9CisKKwlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJS4qZiVjJXMiLCBwcmVjaXNpb24sCisJCShkb3VibGUpIGNvdW50IC8gcG93aSwgKnByZWZpeCwgdXNlX2llYyA/ICJpIiA6ICIiKTsKKworCWZwcmludGYoZnAsICIlLSpzICIsIHdpZHRoLCBidWYpOworfQorCitzdGF0aWMgdm9pZCBwcmludF92Zl9zdGF0czY0KEZJTEUgKmZwLCBzdHJ1Y3QgcnRhdHRyICp2ZnN0YXRzKQoreworCXN0cnVjdCBydGF0dHIgKnZmW0lGTEFfVkZfU1RBVFNfTUFYICsgMV0gPSB7fTsKKworCWlmICh2ZnN0YXRzLT5ydGFfdHlwZSAhPSBJRkxBX1ZGX1NUQVRTKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQlVHOiBydGEgdHlwZSBpcyAlZFxuIiwgdmZzdGF0cy0+cnRhX3R5cGUpOworCQlyZXR1cm47CisJfQorCisJcGFyc2VfcnRhdHRyX25lc3RlZCh2ZiwgSUZMQV9WRl9NQVgsIHZmc3RhdHMpOworCisJLyogUlggc3RhdHMgKi8KKwlmcHJpbnRmKGZwLCAiJXMiLCBfU0xfKTsKKwlmcHJpbnRmKGZwLCAiICAgIFJYOiBieXRlcyAgcGFja2V0cyAgbWNhc3QgICBiY2FzdCAlcyIsIF9TTF8pOworCWZwcmludGYoZnAsICIgICAgIik7CisKKwlwcmludF9udW0oZnAsIDEwLCAqKF9fdTY0ICopUlRBX0RBVEEodmZbSUZMQV9WRl9TVEFUU19SWF9CWVRFU10pKTsKKwlwcmludF9udW0oZnAsIDgsICooX191NjQgKilSVEFfREFUQSh2ZltJRkxBX1ZGX1NUQVRTX1JYX1BBQ0tFVFNdKSk7CisJcHJpbnRfbnVtKGZwLCA3LCAqKF9fdTY0ICopUlRBX0RBVEEodmZbSUZMQV9WRl9TVEFUU19NVUxUSUNBU1RdKSk7CisJcHJpbnRfbnVtKGZwLCA3LCAqKF9fdTY0ICopUlRBX0RBVEEodmZbSUZMQV9WRl9TVEFUU19CUk9BRENBU1RdKSk7CisKKwkvKiBUWCBzdGF0cyAqLworCWZwcmludGYoZnAsICIlcyIsIF9TTF8pOworCWZwcmludGYoZnAsICIgICAgVFg6IGJ5dGVzICBwYWNrZXRzICVzIiwgX1NMXyk7CisJZnByaW50ZihmcCwgIiAgICAiKTsKKworCXByaW50X251bShmcCwgMTAsICooX191NjQgKilSVEFfREFUQSh2ZltJRkxBX1ZGX1NUQVRTX1RYX0JZVEVTXSkpOworCXByaW50X251bShmcCwgOCwgKihfX3U2NCAqKVJUQV9EQVRBKHZmW0lGTEFfVkZfU1RBVFNfVFhfUEFDS0VUU10pKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfbGlua19zdGF0czY0KEZJTEUgKmZwLCBjb25zdCBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJ0YXR0ciAqY2Fycmllcl9jaGFuZ2VzKQoreworCS8qIFJYIHN0YXRzICovCisJZnByaW50ZihmcCwgIiAgICBSWDogYnl0ZXMgIHBhY2tldHMgIGVycm9ycyAgZHJvcHBlZCBvdmVycnVuIG1jYXN0ICAgJXMlcyIsCisJCXMtPnJ4X2NvbXByZXNzZWQgPyAiY29tcHJlc3NlZCIgOiAiIiwgX1NMXyk7CisKKwlmcHJpbnRmKGZwLCAiICAgICIpOworCXByaW50X251bShmcCwgMTAsIHMtPnJ4X2J5dGVzKTsKKwlwcmludF9udW0oZnAsIDgsIHMtPnJ4X3BhY2tldHMpOworCXByaW50X251bShmcCwgNywgcy0+cnhfZXJyb3JzKTsKKwlwcmludF9udW0oZnAsIDcsIHMtPnJ4X2Ryb3BwZWQpOworCXByaW50X251bShmcCwgNywgcy0+cnhfb3Zlcl9lcnJvcnMpOworCXByaW50X251bShmcCwgNywgcy0+bXVsdGljYXN0KTsKKwlpZiAocy0+cnhfY29tcHJlc3NlZCkKKwkJcHJpbnRfbnVtKGZwLCA3LCBzLT5yeF9jb21wcmVzc2VkKTsKKworCS8qIFJYIGVycm9yIHN0YXRzICovCisJaWYgKHNob3dfc3RhdHMgPiAxKSB7CisJCWZwcmludGYoZnAsICIlcyIsIF9TTF8pOworCQlmcHJpbnRmKGZwLCAiICAgIFJYIGVycm9yczogbGVuZ3RoICAgY3JjICAgICBmcmFtZSAgIGZpZm8gICAgbWlzc2VkJXMiLCBfU0xfKTsKKworCQlmcHJpbnRmKGZwLCAiICAgICAgICAgICAgICAgIik7CisJCXByaW50X251bShmcCwgOCwgcy0+cnhfbGVuZ3RoX2Vycm9ycyk7CisJCXByaW50X251bShmcCwgNywgcy0+cnhfY3JjX2Vycm9ycyk7CisJCXByaW50X251bShmcCwgNywgcy0+cnhfZnJhbWVfZXJyb3JzKTsKKwkJcHJpbnRfbnVtKGZwLCA3LCBzLT5yeF9maWZvX2Vycm9ycyk7CisJCXByaW50X251bShmcCwgNywgcy0+cnhfbWlzc2VkX2Vycm9ycyk7CisJfQorCWZwcmludGYoZnAsICIlcyIsIF9TTF8pOworCisJLyogVFggc3RhdHMgKi8KKwlmcHJpbnRmKGZwLCAiICAgIFRYOiBieXRlcyAgcGFja2V0cyAgZXJyb3JzICBkcm9wcGVkIGNhcnJpZXIgY29sbHNucyAlcyVzIiwKKwkJcy0+dHhfY29tcHJlc3NlZCA/ICJjb21wcmVzc2VkIiA6ICIiLCBfU0xfKTsKKworCisJZnByaW50ZihmcCwgIiAgICAiKTsKKwlwcmludF9udW0oZnAsIDEwLCBzLT50eF9ieXRlcyk7CisJcHJpbnRfbnVtKGZwLCA4LCBzLT50eF9wYWNrZXRzKTsKKwlwcmludF9udW0oZnAsIDcsIHMtPnR4X2Vycm9ycyk7CisJcHJpbnRfbnVtKGZwLCA3LCBzLT50eF9kcm9wcGVkKTsKKwlwcmludF9udW0oZnAsIDcsIHMtPnR4X2NhcnJpZXJfZXJyb3JzKTsKKwlwcmludF9udW0oZnAsIDcsIHMtPmNvbGxpc2lvbnMpOworCWlmIChzLT50eF9jb21wcmVzc2VkKQorCQlwcmludF9udW0oZnAsIDcsIHMtPnR4X2NvbXByZXNzZWQpOworCisJLyogVFggZXJyb3Igc3RhdHMgKi8KKwlpZiAoc2hvd19zdGF0cyA+IDEpIHsKKwkJZnByaW50ZihmcCwgIiVzIiwgX1NMXyk7CisJCWZwcmludGYoZnAsICIgICAgVFggZXJyb3JzOiBhYm9ydGVkICBmaWZvICAgd2luZG93IGhlYXJ0YmVhdCIpOworICAgICAgICAgICAgICAgIGlmIChjYXJyaWVyX2NoYW5nZXMpCisJCQlmcHJpbnRmKGZwLCAiIHRyYW5zbnMiKTsKKwkJZnByaW50ZihmcCwgIiVzIiwgX1NMXyk7CisKKwkJZnByaW50ZihmcCwgIiAgICAgICAgICAgICAgICIpOworCQlwcmludF9udW0oZnAsIDgsIHMtPnR4X2Fib3J0ZWRfZXJyb3JzKTsKKwkJcHJpbnRfbnVtKGZwLCA3LCBzLT50eF9maWZvX2Vycm9ycyk7CisJCXByaW50X251bShmcCwgNywgcy0+dHhfd2luZG93X2Vycm9ycyk7CisJCXByaW50X251bShmcCwgNywgcy0+dHhfaGVhcnRiZWF0X2Vycm9ycyk7CisJCWlmIChjYXJyaWVyX2NoYW5nZXMpCisJCQlwcmludF9udW0oZnAsIDcsICoodWludDMyX3QqKVJUQV9EQVRBKGNhcnJpZXJfY2hhbmdlcykpOworCX0KK30KKworc3RhdGljIHZvaWQgcHJpbnRfbGlua19zdGF0czMyKEZJTEUgKmZwLCBjb25zdCBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzICpzLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBydGF0dHIgKmNhcnJpZXJfY2hhbmdlcykKK3sKKwkvKiBSWCBzdGF0cyAqLworCWZwcmludGYoZnAsICIgICAgUlg6IGJ5dGVzICBwYWNrZXRzICBlcnJvcnMgIGRyb3BwZWQgb3ZlcnJ1biBtY2FzdCAgICVzJXMiLAorCQlzLT5yeF9jb21wcmVzc2VkID8gImNvbXByZXNzZWQiIDogIiIsIF9TTF8pOworCisKKwlmcHJpbnRmKGZwLCAiICAgICIpOworCXByaW50X251bShmcCwgMTAsIHMtPnJ4X2J5dGVzKTsKKwlwcmludF9udW0oZnAsIDgsIHMtPnJ4X3BhY2tldHMpOworCXByaW50X251bShmcCwgNywgcy0+cnhfZXJyb3JzKTsKKwlwcmludF9udW0oZnAsIDcsIHMtPnJ4X2Ryb3BwZWQpOworCXByaW50X251bShmcCwgNywgcy0+cnhfb3Zlcl9lcnJvcnMpOworCXByaW50X251bShmcCwgNywgcy0+bXVsdGljYXN0KTsKKwlpZiAocy0+cnhfY29tcHJlc3NlZCkKKwkJcHJpbnRfbnVtKGZwLCA3LCBzLT5yeF9jb21wcmVzc2VkKTsKKworCS8qIFJYIGVycm9yIHN0YXRzICovCisJaWYgKHNob3dfc3RhdHMgPiAxKSB7CisJCWZwcmludGYoZnAsICIlcyIsIF9TTF8pOworCQlmcHJpbnRmKGZwLCAiICAgIFJYIGVycm9yczogbGVuZ3RoICAgY3JjICAgICBmcmFtZSAgIGZpZm8gICAgbWlzc2VkJXMiLCBfU0xfKTsKKwkJZnByaW50ZihmcCwgIiAgICAgICAgICAgICAgICIpOworCQlwcmludF9udW0oZnAsIDgsIHMtPnJ4X2xlbmd0aF9lcnJvcnMpOworCQlwcmludF9udW0oZnAsIDcsIHMtPnJ4X2NyY19lcnJvcnMpOworCQlwcmludF9udW0oZnAsIDcsIHMtPnJ4X2ZyYW1lX2Vycm9ycyk7CisJCXByaW50X251bShmcCwgNywgcy0+cnhfZmlmb19lcnJvcnMpOworCQlwcmludF9udW0oZnAsIDcsIHMtPnJ4X21pc3NlZF9lcnJvcnMpOworCX0KKwlmcHJpbnRmKGZwLCAiJXMiLCBfU0xfKTsKKworCS8qIFRYIHN0YXRzICovCisJZnByaW50ZihmcCwgIiAgICBUWDogYnl0ZXMgIHBhY2tldHMgIGVycm9ycyAgZHJvcHBlZCBjYXJyaWVyIGNvbGxzbnMgJXMlcyIsCisJCXMtPnR4X2NvbXByZXNzZWQgPyAiY29tcHJlc3NlZCIgOiAiIiwgX1NMXyk7CisKKwlmcHJpbnRmKGZwLCAiICAgICIpOworCXByaW50X251bShmcCwgMTAsIHMtPnR4X2J5dGVzKTsKKwlwcmludF9udW0oZnAsIDgsIHMtPnR4X3BhY2tldHMpOworCXByaW50X251bShmcCwgNywgcy0+dHhfZXJyb3JzKTsKKwlwcmludF9udW0oZnAsIDcsIHMtPnR4X2Ryb3BwZWQpOworCXByaW50X251bShmcCwgNywgcy0+dHhfY2Fycmllcl9lcnJvcnMpOworCXByaW50X251bShmcCwgNywgcy0+Y29sbGlzaW9ucyk7CisJaWYgKHMtPnR4X2NvbXByZXNzZWQpCisJCXByaW50X251bShmcCwgNywgcy0+dHhfY29tcHJlc3NlZCk7CisKKwkvKiBUWCBlcnJvciBzdGF0cyAqLworCWlmIChzaG93X3N0YXRzID4gMSkgeworCQlmcHJpbnRmKGZwLCAiJXMiLCBfU0xfKTsKKwkJZnByaW50ZihmcCwgIiAgICBUWCBlcnJvcnM6IGFib3J0ZWQgIGZpZm8gICB3aW5kb3cgaGVhcnRiZWF0Iik7CisgICAgICAgICAgICAgICAgaWYgKGNhcnJpZXJfY2hhbmdlcykKKwkJCWZwcmludGYoZnAsICIgdHJhbnNucyIpOworCQlmcHJpbnRmKGZwLCAiJXMiLCBfU0xfKTsKKworCQlmcHJpbnRmKGZwLCAiICAgICAgICAgICAgICAgIik7CisJCXByaW50X251bShmcCwgOCwgcy0+dHhfYWJvcnRlZF9lcnJvcnMpOworCQlwcmludF9udW0oZnAsIDcsIHMtPnR4X2ZpZm9fZXJyb3JzKTsKKwkJcHJpbnRfbnVtKGZwLCA3LCBzLT50eF93aW5kb3dfZXJyb3JzKTsKKwkJcHJpbnRfbnVtKGZwLCA3LCBzLT50eF9oZWFydGJlYXRfZXJyb3JzKTsKKwkJaWYgKGNhcnJpZXJfY2hhbmdlcykKKwkJCXByaW50X251bShmcCwgNywgKih1aW50MzJfdCopUlRBX0RBVEEoY2Fycmllcl9jaGFuZ2VzKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX3ByaW50X2xpbmtfc3RhdHMoRklMRSAqZnAsIHN0cnVjdCBydGF0dHIgKip0YikKK3sKKwlpZiAodGJbSUZMQV9TVEFUUzY0XSkKKwkJcHJpbnRfbGlua19zdGF0czY0KGZwLCBSVEFfREFUQSh0YltJRkxBX1NUQVRTNjRdKSwKKwkJCQkJdGJbSUZMQV9DQVJSSUVSX0NIQU5HRVNdKTsKKwllbHNlIGlmICh0YltJRkxBX1NUQVRTXSkKKwkJcHJpbnRfbGlua19zdGF0czMyKGZwLCBSVEFfREFUQSh0YltJRkxBX1NUQVRTXSksCisJCQkJCXRiW0lGTEFfQ0FSUklFUl9DSEFOR0VTXSk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2xpbmtfc3RhdHMoRklMRSAqZnAsIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlzdHJ1Y3QgaWZpbmZvbXNnICppZmkgPSBOTE1TR19EQVRBKG4pOworCXN0cnVjdCBydGF0dHIgKiB0YltJRkxBX01BWCsxXTsKKworCXBhcnNlX3J0YXR0cih0YiwgSUZMQV9NQVgsIElGTEFfUlRBKGlmaSksCisJCSAgICAgbi0+bmxtc2dfbGVuIC0gTkxNU0dfTEVOR1RIKHNpemVvZigqaWZpKSkpOworCV9fcHJpbnRfbGlua19zdGF0cyhmcCwgdGIpOworCWZwcmludGYoZnAsICIlcyIsIF9TTF8pOworfQorCitpbnQgcHJpbnRfbGlua2luZm9fYnJpZWYoY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8sCisJCQkJc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcpCit7CisJRklMRSAqZnAgPSAoRklMRSopYXJnOworCXN0cnVjdCBpZmluZm9tc2cgKmlmaSA9IE5MTVNHX0RBVEEobik7CisJc3RydWN0IHJ0YXR0ciAqIHRiW0lGTEFfTUFYKzFdOworCWludCBsZW4gPSBuLT5ubG1zZ19sZW47CisJY2hhciAqbmFtZTsKKwljaGFyIGJ1ZlszMl0gPSB7IDAsIH07CisJdW5zaWduZWQgbV9mbGFnID0gMDsKKworCWlmIChuLT5ubG1zZ190eXBlICE9IFJUTV9ORVdMSU5LICYmIG4tPm5sbXNnX3R5cGUgIT0gUlRNX0RFTExJTkspCisJCXJldHVybiAtMTsKKworCWxlbiAtPSBOTE1TR19MRU5HVEgoc2l6ZW9mKCppZmkpKTsKKwlpZiAobGVuIDwgMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGZpbHRlci5pZmluZGV4ICYmIGlmaS0+aWZpX2luZGV4ICE9IGZpbHRlci5pZmluZGV4KQorCQlyZXR1cm4gLTE7CisJaWYgKGZpbHRlci51cCAmJiAhKGlmaS0+aWZpX2ZsYWdzJklGRl9VUCkpCisJCXJldHVybiAtMTsKKworCXBhcnNlX3J0YXR0cih0YiwgSUZMQV9NQVgsIElGTEFfUlRBKGlmaSksIGxlbik7CisJaWYgKHRiW0lGTEFfSUZOQU1FXSA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQlVHOiBkZXZpY2Ugd2l0aCBpZmluZGV4ICVkIGhhcyBuaWwgaWZuYW1lXG4iLCBpZmktPmlmaV9pbmRleCk7CisJfQorCWlmIChmaWx0ZXIubGFiZWwgJiYKKwkgICAgKCFmaWx0ZXIuZmFtaWx5IHx8IGZpbHRlci5mYW1pbHkgPT0gQUZfUEFDS0VUKSAmJgorCSAgICBmbm1hdGNoKGZpbHRlci5sYWJlbCwgUlRBX0RBVEEodGJbSUZMQV9JRk5BTUVdKSwgMCkpCisJCXJldHVybiAtMTsKKworCWlmICh0YltJRkxBX0dST1VQXSkgeworCQlpbnQgZ3JvdXAgPSAqKGludCopUlRBX0RBVEEodGJbSUZMQV9HUk9VUF0pOworCQlpZiAoZmlsdGVyLmdyb3VwICE9IC0xICYmIGdyb3VwICE9IGZpbHRlci5ncm91cCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlpZiAodGJbSUZMQV9NQVNURVJdKSB7CisJCWludCBtYXN0ZXIgPSAqKGludCopUlRBX0RBVEEodGJbSUZMQV9NQVNURVJdKTsKKwkJaWYgKGZpbHRlci5tYXN0ZXIgPiAwICYmIG1hc3RlciAhPSBmaWx0ZXIubWFzdGVyKQorCQkJcmV0dXJuIC0xOworCX0KKwllbHNlIGlmIChmaWx0ZXIubWFzdGVyID4gMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGZpbHRlci5raW5kKSB7CisJCWlmICh0YltJRkxBX0xJTktJTkZPXSkgeworCQkJY2hhciAqa2luZCA9IHBhcnNlX2xpbmtfa2luZCh0YltJRkxBX0xJTktJTkZPXSk7CisKKwkJCWlmIChzdHJjbXAoa2luZCwgZmlsdGVyLmtpbmQpKQorCQkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWlmIChuLT5ubG1zZ190eXBlID09IFJUTV9ERUxMSU5LKQorCQlmcHJpbnRmKGZwLCAiRGVsZXRlZCAiKTsKKworCW5hbWUgPSAoY2hhciAqKSh0YltJRkxBX0lGTkFNRV0gPyBydGFfZ2V0YXR0cl9zdHIodGJbSUZMQV9JRk5BTUVdKSA6ICI8bmlsPiIpOworCisJaWYgKHRiW0lGTEFfTElOS10pIHsKKwkJU1BSSU5UX0JVRihiMSk7CisJCWludCBpZmxpbmsgPSAqKGludCopUlRBX0RBVEEodGJbSUZMQV9MSU5LXSk7CisJCWlmIChpZmxpbmsgPT0gMCkKKwkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlc0BOT05FIiwgbmFtZSk7CisJCWVsc2UgeworCQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKwkJCQkgIiVzQCVzIiwgbmFtZSwgbGxfaWR4X24yYShpZmxpbmssIGIxKSk7CisJCQltX2ZsYWcgPSBsbF9pbmRleF90b19mbGFncyhpZmxpbmspOworCQkJbV9mbGFnID0gIShtX2ZsYWcgJiBJRkZfVVApOworCQl9CisJfSBlbHNlCisJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcyIsIG5hbWUpOworCisJZnByaW50ZihmcCwgIiUtMTZzICIsIGJ1Zik7CisKKwlpZiAodGJbSUZMQV9PUEVSU1RBVEVdKQorCQlwcmludF9vcGVyc3RhdGUoZnAsIHJ0YV9nZXRhdHRyX3U4KHRiW0lGTEFfT1BFUlNUQVRFXSkpOworCisJaWYgKGZpbHRlci5mYW1pbHkgPT0gQUZfUEFDS0VUKSB7CisJCVNQUklOVF9CVUYoYjEpOworCQlpZiAodGJbSUZMQV9BRERSRVNTXSkgeworCQkJY29sb3JfZnByaW50ZihmcCwgQ09MT1JfTUFDLCAiJXMgIiwKKwkJCQkJbGxfYWRkcl9uMmEoUlRBX0RBVEEodGJbSUZMQV9BRERSRVNTXSksCisJCQkJCQlSVEFfUEFZTE9BRCh0YltJRkxBX0FERFJFU1NdKSwKKwkJCQkJCWlmaS0+aWZpX3R5cGUsCisJCQkJCQliMSwgc2l6ZW9mKGIxKSkpOworCQl9CisJfQorCisJaWYgKGZpbHRlci5mYW1pbHkgPT0gQUZfUEFDS0VUKQorCQlwcmludF9saW5rX2ZsYWdzKGZwLCBpZmktPmlmaV9mbGFncywgbV9mbGFnKTsKKworCWlmIChmaWx0ZXIuZmFtaWx5ID09IEFGX1BBQ0tFVCkKKwkJZnByaW50ZihmcCwgIlxuIik7CisJZmZsdXNoKGZwKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHByaW50X2xpbmtpbmZvKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLAorCQkgICBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZykKK3sKKwlGSUxFICpmcCA9IChGSUxFKilhcmc7CisJc3RydWN0IGlmaW5mb21zZyAqaWZpID0gTkxNU0dfREFUQShuKTsKKwlzdHJ1Y3QgcnRhdHRyICogdGJbSUZMQV9NQVgrMV07CisJaW50IGxlbiA9IG4tPm5sbXNnX2xlbjsKKwl1bnNpZ25lZCBtX2ZsYWcgPSAwOworCisJaWYgKG4tPm5sbXNnX3R5cGUgIT0gUlRNX05FV0xJTksgJiYgbi0+bmxtc2dfdHlwZSAhPSBSVE1fREVMTElOSykKKwkJcmV0dXJuIDA7CisKKwlsZW4gLT0gTkxNU0dfTEVOR1RIKHNpemVvZigqaWZpKSk7CisJaWYgKGxlbiA8IDApCisJCXJldHVybiAtMTsKKworCWlmIChmaWx0ZXIuaWZpbmRleCAmJiBpZmktPmlmaV9pbmRleCAhPSBmaWx0ZXIuaWZpbmRleCkKKwkJcmV0dXJuIDA7CisJaWYgKGZpbHRlci51cCAmJiAhKGlmaS0+aWZpX2ZsYWdzJklGRl9VUCkpCisJCXJldHVybiAwOworCisJcGFyc2VfcnRhdHRyKHRiLCBJRkxBX01BWCwgSUZMQV9SVEEoaWZpKSwgbGVuKTsKKwlpZiAodGJbSUZMQV9JRk5BTUVdID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJCVUc6IGRldmljZSB3aXRoIGlmaW5kZXggJWQgaGFzIG5pbCBpZm5hbWVcbiIsIGlmaS0+aWZpX2luZGV4KTsKKwl9CisJaWYgKGZpbHRlci5sYWJlbCAmJgorCSAgICAoIWZpbHRlci5mYW1pbHkgfHwgZmlsdGVyLmZhbWlseSA9PSBBRl9QQUNLRVQpICYmCisJICAgIGZubWF0Y2goZmlsdGVyLmxhYmVsLCBSVEFfREFUQSh0YltJRkxBX0lGTkFNRV0pLCAwKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAodGJbSUZMQV9HUk9VUF0pIHsKKwkJaW50IGdyb3VwID0gKihpbnQqKVJUQV9EQVRBKHRiW0lGTEFfR1JPVVBdKTsKKwkJaWYgKGZpbHRlci5ncm91cCAhPSAtMSAmJiBncm91cCAhPSBmaWx0ZXIuZ3JvdXApCisJCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHRiW0lGTEFfTUFTVEVSXSkgeworCQlpbnQgbWFzdGVyID0gKihpbnQqKVJUQV9EQVRBKHRiW0lGTEFfTUFTVEVSXSk7CisJCWlmIChmaWx0ZXIubWFzdGVyID4gMCAmJiBtYXN0ZXIgIT0gZmlsdGVyLm1hc3RlcikKKwkJCXJldHVybiAtMTsKKwl9CisJZWxzZSBpZiAoZmlsdGVyLm1hc3RlciA+IDApCisJCXJldHVybiAtMTsKKworCWlmIChmaWx0ZXIua2luZCkgeworCQlpZiAodGJbSUZMQV9MSU5LSU5GT10pIHsKKwkJCWNoYXIgKmtpbmQgPSBwYXJzZV9saW5rX2tpbmQodGJbSUZMQV9MSU5LSU5GT10pOworCisJCQlpZiAoc3RyY21wKGtpbmQsIGZpbHRlci5raW5kKSkKKwkJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlpZiAobi0+bmxtc2dfdHlwZSA9PSBSVE1fREVMTElOSykKKwkJZnByaW50ZihmcCwgIkRlbGV0ZWQgIik7CisKKwlmcHJpbnRmKGZwLCAiJWQ6ICIsIGlmaS0+aWZpX2luZGV4KTsKKwljb2xvcl9mcHJpbnRmKGZwLCBDT0xPUl9JRk5BTUUsICIlcyIsCisJCXRiW0lGTEFfSUZOQU1FXSA/IHJ0YV9nZXRhdHRyX3N0cih0YltJRkxBX0lGTkFNRV0pIDogIjxuaWw+Iik7CisKKwlpZiAodGJbSUZMQV9MSU5LXSkgeworCQlTUFJJTlRfQlVGKGIxKTsKKwkJaW50IGlmbGluayA9ICooaW50KilSVEFfREFUQSh0YltJRkxBX0xJTktdKTsKKwkJaWYgKGlmbGluayA9PSAwKQorCQkJZnByaW50ZihmcCwgIkBOT05FOiAiKTsKKwkJZWxzZSB7CisJCQlpZiAodGJbSUZMQV9MSU5LX05FVE5TSURdKQorCQkJCWZwcmludGYoZnAsICJAaWYlZDogIiwgaWZsaW5rKTsKKwkJCWVsc2UgeworCQkJCWZwcmludGYoZnAsICJAJXM6ICIsIGxsX2lkeF9uMmEoaWZsaW5rLCBiMSkpOworCQkJCW1fZmxhZyA9IGxsX2luZGV4X3RvX2ZsYWdzKGlmbGluayk7CisJCQkJbV9mbGFnID0gIShtX2ZsYWcgJiBJRkZfVVApOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJZnByaW50ZihmcCwgIjogIik7CisJfQorCXByaW50X2xpbmtfZmxhZ3MoZnAsIGlmaS0+aWZpX2ZsYWdzLCBtX2ZsYWcpOworCisJaWYgKHRiW0lGTEFfTVRVXSkKKwkJZnByaW50ZihmcCwgIm10dSAldSAiLCAqKGludCopUlRBX0RBVEEodGJbSUZMQV9NVFVdKSk7CisJaWYgKHRiW0lGTEFfUURJU0NdKQorCQlmcHJpbnRmKGZwLCAicWRpc2MgJXMgIiwgcnRhX2dldGF0dHJfc3RyKHRiW0lGTEFfUURJU0NdKSk7CisJaWYgKHRiW0lGTEFfTUFTVEVSXSkgeworCQlTUFJJTlRfQlVGKGIxKTsKKwkJZnByaW50ZihmcCwgIm1hc3RlciAlcyAiLCBsbF9pZHhfbjJhKCooaW50KilSVEFfREFUQSh0YltJRkxBX01BU1RFUl0pLCBiMSkpOworCX0KKworCWlmICh0YltJRkxBX1BIWVNfUE9SVF9JRF0pIHsKKwkJU1BSSU5UX0JVRihiMSk7CisJCWZwcmludGYoZnAsICJwb3J0aWQgJXMgIiwKKwkJCWhleHN0cmluZ19uMmEoUlRBX0RBVEEodGJbSUZMQV9QSFlTX1BPUlRfSURdKSwKKwkJCQkgICAgICBSVEFfUEFZTE9BRCh0YltJRkxBX1BIWVNfUE9SVF9JRF0pLAorCQkJCSAgICAgIGIxLCBzaXplb2YoYjEpKSk7CisJfQorCisJaWYgKHRiW0lGTEFfUEhZU19TV0lUQ0hfSURdKSB7CisJCVNQUklOVF9CVUYoYjEpOworCQlmcHJpbnRmKGZwLCAic3dpdGNoaWQgJXMgIiwKKwkJCWhleHN0cmluZ19uMmEoUlRBX0RBVEEodGJbSUZMQV9QSFlTX1NXSVRDSF9JRF0pLAorCQkJCSAgICAgIFJUQV9QQVlMT0FEKHRiW0lGTEFfUEhZU19TV0lUQ0hfSURdKSwKKwkJCQkgICAgICBiMSwgc2l6ZW9mKGIxKSkpOworCX0KKworCWlmICh0YltJRkxBX09QRVJTVEFURV0pCisJCXByaW50X29wZXJzdGF0ZShmcCwgcnRhX2dldGF0dHJfdTgodGJbSUZMQV9PUEVSU1RBVEVdKSk7CisKKwlpZiAoZG9fbGluayAmJiB0YltJRkxBX0xJTktNT0RFXSkKKwkJcHJpbnRfbGlua21vZGUoZnAsIHRiW0lGTEFfTElOS01PREVdKTsKKworCWlmICh0YltJRkxBX0dST1VQXSkgeworCQlTUFJJTlRfQlVGKGIxKTsKKwkJaW50IGdyb3VwID0gKihpbnQqKVJUQV9EQVRBKHRiW0lGTEFfR1JPVVBdKTsKKwkJZnByaW50ZihmcCwgImdyb3VwICVzICIsIHJ0bmxfZ3JvdXBfbjJhKGdyb3VwLCBiMSwgc2l6ZW9mKGIxKSkpOworCX0KKworCWlmIChmaWx0ZXIuc2hvd3F1ZXVlKQorCQlwcmludF9xdWV1ZWxlbihmcCwgdGIpOworCisJaWYgKCFmaWx0ZXIuZmFtaWx5IHx8IGZpbHRlci5mYW1pbHkgPT0gQUZfUEFDS0VUIHx8IHNob3dfZGV0YWlscykgeworCQlTUFJJTlRfQlVGKGIxKTsKKwkJZnByaW50ZihmcCwgIiVzIiwgX1NMXyk7CisJCWZwcmludGYoZnAsICIgICAgbGluay8lcyAiLCBsbF90eXBlX24yYShpZmktPmlmaV90eXBlLCBiMSwgc2l6ZW9mKGIxKSkpOworCisJCWlmICh0YltJRkxBX0FERFJFU1NdKSB7CisJCQljb2xvcl9mcHJpbnRmKGZwLCBDT0xPUl9NQUMsICIlcyIsCisJCQkJCWxsX2FkZHJfbjJhKFJUQV9EQVRBKHRiW0lGTEFfQUREUkVTU10pLAorCQkJCQkJUlRBX1BBWUxPQUQodGJbSUZMQV9BRERSRVNTXSksCisJCQkJCQlpZmktPmlmaV90eXBlLAorCQkJCQkJYjEsIHNpemVvZihiMSkpKTsKKwkJfQorCQlpZiAodGJbSUZMQV9CUk9BRENBU1RdKSB7CisJCQlpZiAoaWZpLT5pZmlfZmxhZ3MmSUZGX1BPSU5UT1BPSU5UKQorCQkJCWZwcmludGYoZnAsICIgcGVlciAiKTsKKwkJCWVsc2UKKwkJCQlmcHJpbnRmKGZwLCAiIGJyZCAiKTsKKwkJCWZwcmludGYoZnAsICIlcyIsIGxsX2FkZHJfbjJhKFJUQV9EQVRBKHRiW0lGTEFfQlJPQURDQVNUXSksCisJCQkJCQkgICAgICBSVEFfUEFZTE9BRCh0YltJRkxBX0JST0FEQ0FTVF0pLAorCQkJCQkJICAgICAgaWZpLT5pZmlfdHlwZSwKKwkJCQkJCSAgICAgIGIxLCBzaXplb2YoYjEpKSk7CisJCX0KKwl9CisKKwlpZiAodGJbSUZMQV9MSU5LX05FVE5TSURdKSB7CisJCWludCBpZCA9ICooaW50KilSVEFfREFUQSh0YltJRkxBX0xJTktfTkVUTlNJRF0pOworCisJCWlmIChpZCA+PSAwKQorCQkJZnByaW50ZihmcCwgIiBsaW5rLW5ldG5zaWQgJWQiLCBpZCk7CisJCWVsc2UKKwkJCWZwcmludGYoZnAsICIgbGluay1uZXRuc2lkIHVua25vd24iKTsKKwl9CisKKwlpZiAodGJbSUZMQV9QUk9UT19ET1dOXSkgeworCQlpZiAocnRhX2dldGF0dHJfdTgodGJbSUZMQV9QUk9UT19ET1dOXSkpCisJCQlmcHJpbnRmKGZwLCAiIHByb3RvZG93biBvbiAiKTsKKwl9CisKKwlpZiAodGJbSUZMQV9QUk9NSVNDVUlUWV0gJiYgc2hvd19kZXRhaWxzKQorCQlmcHJpbnRmKGZwLCAiIHByb21pc2N1aXR5ICV1ICIsCisJCQkqKGludCopUlRBX0RBVEEodGJbSUZMQV9QUk9NSVNDVUlUWV0pKTsKKworCWlmICh0YltJRkxBX0xJTktJTkZPXSAmJiBzaG93X2RldGFpbHMpCisJCXByaW50X2xpbmt0eXBlKGZwLCB0YltJRkxBX0xJTktJTkZPXSk7CisKKwlpZiAoZG9fbGluayAmJiB0YltJRkxBX0FGX1NQRUNdICYmIHNob3dfZGV0YWlscykKKwkJcHJpbnRfYWZfc3BlYyhmcCwgdGJbSUZMQV9BRl9TUEVDXSk7CisKKwlpZiAoKGRvX2xpbmsgfHwgc2hvd19kZXRhaWxzKSAmJiB0YltJRkxBX0lGQUxJQVNdKSB7CisJCWZwcmludGYoZnAsICIlcyAgICBhbGlhcyAlcyIsIF9TTF8sCisJCQlydGFfZ2V0YXR0cl9zdHIodGJbSUZMQV9JRkFMSUFTXSkpOworCX0KKworCWlmIChkb19saW5rICYmIHNob3dfc3RhdHMpIHsKKwkJZnByaW50ZihmcCwgIiVzIiwgX1NMXyk7CisJCV9fcHJpbnRfbGlua19zdGF0cyhmcCwgdGIpOworCX0KKworCWlmICgoZG9fbGluayB8fCBzaG93X2RldGFpbHMpICYmIHRiW0lGTEFfVkZJTkZPX0xJU1RdICYmIHRiW0lGTEFfTlVNX1ZGXSkgeworCQlzdHJ1Y3QgcnRhdHRyICppLCAqdmZsaXN0ID0gdGJbSUZMQV9WRklORk9fTElTVF07CisJCWludCByZW0gPSBSVEFfUEFZTE9BRCh2Zmxpc3QpOworCQlmb3IgKGkgPSBSVEFfREFUQSh2Zmxpc3QpOyBSVEFfT0soaSwgcmVtKTsgaSA9IFJUQV9ORVhUKGksIHJlbSkpCisJCQlwcmludF92ZmluZm8oZnAsIGkpOworCX0KKworCWZwcmludGYoZnAsICJcbiIpOworCWZmbHVzaChmcCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZmx1c2hfdXBkYXRlKHZvaWQpCit7CisKKwkvKgorCSAqIE5vdGUgdGhhdCB0aGUga2VybmVsIG1heSBkZWxldGUgbXVsdGlwbGUgYWRkcmVzc2VzIGZvciBvbmUKKwkgKiBkZWxldGUgcmVxdWVzdCAoZS5nLiBpZiBpcHY0IGFkZHJlc3MgcHJvbW90aW9uIGlzIGRpc2FibGVkKS4KKwkgKiBTaW5jZSBhIGZsdXNoIG9wZXJhdGlvbiBpcyByZWFsbHkgYSBzZXJpZXMgb2YgZGVsZXRlIHJlcXVlc3RzCisJICogaXRzIHBvc3NpYmxlIHRoYXQgd2UgbWF5IHJlcXVlc3QgYW4gYWRkcmVzcyBkZWxldGUgdGhhdCBoYXMKKwkgKiBhbHJlYWR5IGJlZW4gZG9uZSBieSB0aGUga2VybmVsLiBUaGVyZWZvcmUsIGlnbm9yZSBFQUREUk5PVEFWQUlMCisJICogZXJyb3JzIHJldHVybmVkIGZyb20gYSBmbHVzaCByZXF1ZXN0CisJICovCisJaWYgKChydG5sX3NlbmRfY2hlY2soJnJ0aCwgZmlsdGVyLmZsdXNoYiwgZmlsdGVyLmZsdXNocCkgPCAwKSAmJgorCSAgICAoZXJybm8gIT0gRUFERFJOT1RBVkFJTCkpIHsKKwkJcGVycm9yKCJGYWlsZWQgdG8gc2VuZCBmbHVzaCByZXF1ZXN0Iik7CisJCXJldHVybiAtMTsKKwl9CisJZmlsdGVyLmZsdXNocCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2xpZmV0aW1lKHVuc2lnbmVkIGludCAqbGlmZXRpbWUsIGNoYXIgKmFyZ3YpCit7CisJaWYgKHN0cmNtcChhcmd2LCAiZm9yZXZlciIpID09IDApCisJCSpsaWZldGltZSA9IElORklOSVRZX0xJRkVfVElNRTsKKwllbHNlIGlmIChnZXRfdTMyKGxpZmV0aW1lLCBhcmd2LCAwKSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X2lmYV9mbGFncyhzdHJ1Y3QgaWZhZGRybXNnICppZmEsCisJCQkJICBzdHJ1Y3QgcnRhdHRyICppZmFfZmxhZ3NfYXR0cikKK3sKKwlyZXR1cm4gaWZhX2ZsYWdzX2F0dHIgPyBydGFfZ2V0YXR0cl91MzIoaWZhX2ZsYWdzX2F0dHIpIDoKKwkJCQlpZmEtPmlmYV9mbGFnczsKK30KKworaW50IHByaW50X2FkZHJpbmZvKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sCisJCSAgIHZvaWQgKmFyZykKK3sKKwlGSUxFICpmcCA9IGFyZzsKKwlzdHJ1Y3QgaWZhZGRybXNnICppZmEgPSBOTE1TR19EQVRBKG4pOworCWludCBsZW4gPSBuLT5ubG1zZ19sZW47CisJaW50IGRlcHJlY2F0ZWQgPSAwOworCS8qIFVzZSBsb2NhbCBjb3B5IG9mIGlmYV9mbGFncyB0byBub3QgaW50ZXJmZXJlIHdpdGggZmlsdGVyaW5nIGNvZGUgKi8KKwl1bnNpZ25lZCBpbnQgaWZhX2ZsYWdzOworCXN0cnVjdCBydGF0dHIgKiBydGFfdGJbSUZBX01BWCsxXTsKKwljaGFyIGFidWZbMjU2XTsKKwlTUFJJTlRfQlVGKGIxKTsKKworCWlmIChuLT5ubG1zZ190eXBlICE9IFJUTV9ORVdBRERSICYmIG4tPm5sbXNnX3R5cGUgIT0gUlRNX0RFTEFERFIpCisJCXJldHVybiAwOworCWxlbiAtPSBOTE1TR19MRU5HVEgoc2l6ZW9mKCppZmEpKTsKKwlpZiAobGVuIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkJVRzogd3Jvbmcgbmxtc2cgbGVuICVkXG4iLCBsZW4pOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGZpbHRlci5mbHVzaGIgJiYgbi0+bmxtc2dfdHlwZSAhPSBSVE1fTkVXQUREUikKKwkJcmV0dXJuIDA7CisKKwlwYXJzZV9ydGF0dHIocnRhX3RiLCBJRkFfTUFYLCBJRkFfUlRBKGlmYSksCisJCSAgICAgbi0+bmxtc2dfbGVuIC0gTkxNU0dfTEVOR1RIKHNpemVvZigqaWZhKSkpOworCisJaWZhX2ZsYWdzID0gZ2V0X2lmYV9mbGFncyhpZmEsIHJ0YV90YltJRkFfRkxBR1NdKTsKKworCWlmICghcnRhX3RiW0lGQV9MT0NBTF0pCisJCXJ0YV90YltJRkFfTE9DQUxdID0gcnRhX3RiW0lGQV9BRERSRVNTXTsKKwlpZiAoIXJ0YV90YltJRkFfQUREUkVTU10pCisJCXJ0YV90YltJRkFfQUREUkVTU10gPSBydGFfdGJbSUZBX0xPQ0FMXTsKKworCWlmIChmaWx0ZXIuaWZpbmRleCAmJiBmaWx0ZXIuaWZpbmRleCAhPSBpZmEtPmlmYV9pbmRleCkKKwkJcmV0dXJuIDA7CisJaWYgKChmaWx0ZXIuc2NvcGVeaWZhLT5pZmFfc2NvcGUpJmZpbHRlci5zY29wZW1hc2spCisJCXJldHVybiAwOworCWlmICgoZmlsdGVyLmZsYWdzIF4gaWZhX2ZsYWdzKSAmIGZpbHRlci5mbGFnbWFzaykKKwkJcmV0dXJuIDA7CisJaWYgKGZpbHRlci5sYWJlbCkgeworCQlTUFJJTlRfQlVGKGIxKTsKKwkJY29uc3QgY2hhciAqbGFiZWw7CisJCWlmIChydGFfdGJbSUZBX0xBQkVMXSkKKwkJCWxhYmVsID0gUlRBX0RBVEEocnRhX3RiW0lGQV9MQUJFTF0pOworCQllbHNlCisJCQlsYWJlbCA9IGxsX2lkeF9uMmEoaWZhLT5pZmFfaW5kZXgsIGIxKTsKKwkJaWYgKGZubWF0Y2goZmlsdGVyLmxhYmVsLCBsYWJlbCwgMCkgIT0gMCkKKwkJCXJldHVybiAwOworCX0KKwlpZiAoZmlsdGVyLnBmeC5mYW1pbHkpIHsKKwkJaWYgKHJ0YV90YltJRkFfTE9DQUxdKSB7CisJCQlpbmV0X3ByZWZpeCBkc3Q7CisJCQltZW1zZXQoJmRzdCwgMCwgc2l6ZW9mKGRzdCkpOworCQkJZHN0LmZhbWlseSA9IGlmYS0+aWZhX2ZhbWlseTsKKwkJCW1lbWNweSgmZHN0LmRhdGEsIFJUQV9EQVRBKHJ0YV90YltJRkFfTE9DQUxdKSwgUlRBX1BBWUxPQUQocnRhX3RiW0lGQV9MT0NBTF0pKTsKKwkJCWlmIChpbmV0X2FkZHJfbWF0Y2goJmRzdCwgJmZpbHRlci5wZngsIGZpbHRlci5wZnguYml0bGVuKSkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmIChmaWx0ZXIuZmFtaWx5ICYmIGZpbHRlci5mYW1pbHkgIT0gaWZhLT5pZmFfZmFtaWx5KQorCQlyZXR1cm4gMDsKKworCWlmIChmaWx0ZXIuZmx1c2hiKSB7CisJCXN0cnVjdCBubG1zZ2hkciAqZm47CisJCWlmIChOTE1TR19BTElHTihmaWx0ZXIuZmx1c2hwKSArIG4tPm5sbXNnX2xlbiA+IGZpbHRlci5mbHVzaGUpIHsKKwkJCWlmIChmbHVzaF91cGRhdGUoKSkKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwkJZm4gPSAoc3RydWN0IG5sbXNnaGRyKikoZmlsdGVyLmZsdXNoYiArIE5MTVNHX0FMSUdOKGZpbHRlci5mbHVzaHApKTsKKwkJbWVtY3B5KGZuLCBuLCBuLT5ubG1zZ19sZW4pOworCQlmbi0+bmxtc2dfdHlwZSA9IFJUTV9ERUxBRERSOworCQlmbi0+bmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUOworCQlmbi0+bmxtc2dfc2VxID0gKytydGguc2VxOworCQlmaWx0ZXIuZmx1c2hwID0gKCgoY2hhciopZm4pICsgbi0+bmxtc2dfbGVuKSAtIGZpbHRlci5mbHVzaGI7CisJCWZpbHRlci5mbHVzaGVkKys7CisJCWlmIChzaG93X3N0YXRzIDwgMikKKwkJCXJldHVybiAwOworCX0KKworCWlmIChuLT5ubG1zZ190eXBlID09IFJUTV9ERUxBRERSKQorCQlmcHJpbnRmKGZwLCAiRGVsZXRlZCAiKTsKKworCWlmICghYnJpZWYpIHsKKwkJaWYgKGZpbHRlci5vbmVsaW5lIHx8IGZpbHRlci5mbHVzaGIpCisJCQlmcHJpbnRmKGZwLCAiJXU6ICVzIiwgaWZhLT5pZmFfaW5kZXgsIGxsX2luZGV4X3RvX25hbWUoaWZhLT5pZmFfaW5kZXgpKTsKKwkJaWYgKGlmYS0+aWZhX2ZhbWlseSA9PSBBRl9JTkVUKQorCQkJZnByaW50ZihmcCwgIiAgICBpbmV0ICIpOworCQllbHNlIGlmIChpZmEtPmlmYV9mYW1pbHkgPT0gQUZfSU5FVDYpCisJCQlmcHJpbnRmKGZwLCAiICAgIGluZXQ2ICIpOworCQllbHNlIGlmIChpZmEtPmlmYV9mYW1pbHkgPT0gQUZfREVDbmV0KQorCQkJZnByaW50ZihmcCwgIiAgICBkbmV0ICIpOworCQllbHNlIGlmIChpZmEtPmlmYV9mYW1pbHkgPT0gQUZfSVBYKQorCQkJZnByaW50ZihmcCwgIiAgICAgaXB4ICIpOworCQllbHNlCisJCQlmcHJpbnRmKGZwLCAiICAgIGZhbWlseSAlZCAiLCBpZmEtPmlmYV9mYW1pbHkpOworCX0KKworCWlmIChydGFfdGJbSUZBX0xPQ0FMXSkgeworCQlpZiAoaWZhLT5pZmFfZmFtaWx5ID09IEFGX0lORVQpCisJCQljb2xvcl9mcHJpbnRmKGZwLCBDT0xPUl9JTkVULCAiJXMiLCBmb3JtYXRfaG9zdChpZmEtPmlmYV9mYW1pbHksCisJCQkJCQlSVEFfUEFZTE9BRChydGFfdGJbSUZBX0xPQ0FMXSksCisJCQkJCQlSVEFfREFUQShydGFfdGJbSUZBX0xPQ0FMXSksCisJCQkJCQlhYnVmLCBzaXplb2YoYWJ1ZikpKTsKKwkJZWxzZSBpZiAoaWZhLT5pZmFfZmFtaWx5ID09IEFGX0lORVQ2KQorCQkJY29sb3JfZnByaW50ZihmcCwgQ09MT1JfSU5FVDYsICIlcyIsIGZvcm1hdF9ob3N0KGlmYS0+aWZhX2ZhbWlseSwKKwkJCQkJCVJUQV9QQVlMT0FEKHJ0YV90YltJRkFfTE9DQUxdKSwKKwkJCQkJCVJUQV9EQVRBKHJ0YV90YltJRkFfTE9DQUxdKSwKKwkJCQkJCWFidWYsIHNpemVvZihhYnVmKSkpOworCQllbHNlCisJCQlmcHJpbnRmKGZwLCAiJXMiLCBmb3JtYXRfaG9zdChpZmEtPmlmYV9mYW1pbHksCisJCQkJCQlSVEFfUEFZTE9BRChydGFfdGJbSUZBX0xPQ0FMXSksCisJCQkJCQlSVEFfREFUQShydGFfdGJbSUZBX0xPQ0FMXSksCisJCQkJCQlhYnVmLCBzaXplb2YoYWJ1ZikpKTsKKworCQlpZiAocnRhX3RiW0lGQV9BRERSRVNTXSA9PSBOVUxMIHx8CisJCSAgICBtZW1jbXAoUlRBX0RBVEEocnRhX3RiW0lGQV9BRERSRVNTXSksIFJUQV9EQVRBKHJ0YV90YltJRkFfTE9DQUxdKSwKKwkJCSAgIGlmYS0+aWZhX2ZhbWlseSA9PSBBRl9JTkVUID8gNCA6IDE2KSA9PSAwKSB7CisJCQlmcHJpbnRmKGZwLCAiLyVkICIsIGlmYS0+aWZhX3ByZWZpeGxlbik7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKGZwLCAiIHBlZXIgJXMvJWQgIiwKKwkJCQlmb3JtYXRfaG9zdChpZmEtPmlmYV9mYW1pbHksCisJCQkJCSAgICBSVEFfUEFZTE9BRChydGFfdGJbSUZBX0FERFJFU1NdKSwKKwkJCQkJICAgIFJUQV9EQVRBKHJ0YV90YltJRkFfQUREUkVTU10pLAorCQkJCQkgICAgYWJ1Ziwgc2l6ZW9mKGFidWYpKSwKKwkJCQlpZmEtPmlmYV9wcmVmaXhsZW4pOworCQl9CisJfQorCisJaWYgKGJyaWVmKQorCQlnb3RvIGJyaWVmX2V4aXQ7CisKKwlpZiAocnRhX3RiW0lGQV9CUk9BRENBU1RdKSB7CisJCWZwcmludGYoZnAsICJicmQgJXMgIiwKKwkJCWZvcm1hdF9ob3N0KGlmYS0+aWZhX2ZhbWlseSwKKwkJCQkgICAgUlRBX1BBWUxPQUQocnRhX3RiW0lGQV9CUk9BRENBU1RdKSwKKwkJCQkgICAgUlRBX0RBVEEocnRhX3RiW0lGQV9CUk9BRENBU1RdKSwKKwkJCQkgICAgYWJ1Ziwgc2l6ZW9mKGFidWYpKSk7CisJfQorCWlmIChydGFfdGJbSUZBX0FOWUNBU1RdKSB7CisJCWZwcmludGYoZnAsICJhbnkgJXMgIiwKKwkJCWZvcm1hdF9ob3N0KGlmYS0+aWZhX2ZhbWlseSwKKwkJCQkgICAgUlRBX1BBWUxPQUQocnRhX3RiW0lGQV9BTllDQVNUXSksCisJCQkJICAgIFJUQV9EQVRBKHJ0YV90YltJRkFfQU5ZQ0FTVF0pLAorCQkJCSAgICBhYnVmLCBzaXplb2YoYWJ1ZikpKTsKKwl9CisJZnByaW50ZihmcCwgInNjb3BlICVzICIsIHJ0bmxfcnRzY29wZV9uMmEoaWZhLT5pZmFfc2NvcGUsIGIxLCBzaXplb2YoYjEpKSk7CisJaWYgKGlmYV9mbGFncyAmIElGQV9GX1NFQ09OREFSWSkgeworCQlpZmFfZmxhZ3MgJj0gfklGQV9GX1NFQ09OREFSWTsKKwkJaWYgKGlmYS0+aWZhX2ZhbWlseSA9PSBBRl9JTkVUNikKKwkJCWZwcmludGYoZnAsICJ0ZW1wb3JhcnkgIik7CisJCWVsc2UKKwkJCWZwcmludGYoZnAsICJzZWNvbmRhcnkgIik7CisJfQorCWlmIChpZmFfZmxhZ3MgJiBJRkFfRl9URU5UQVRJVkUpIHsKKwkJaWZhX2ZsYWdzICY9IH5JRkFfRl9URU5UQVRJVkU7CisJCWZwcmludGYoZnAsICJ0ZW50YXRpdmUgIik7CisJfQorCWlmIChpZmFfZmxhZ3MgJiBJRkFfRl9ERVBSRUNBVEVEKSB7CisJCWlmYV9mbGFncyAmPSB+SUZBX0ZfREVQUkVDQVRFRDsKKwkJZGVwcmVjYXRlZCA9IDE7CisJCWZwcmludGYoZnAsICJkZXByZWNhdGVkICIpOworCX0KKwlpZiAoaWZhX2ZsYWdzICYgSUZBX0ZfSE9NRUFERFJFU1MpIHsKKwkJaWZhX2ZsYWdzICY9IH5JRkFfRl9IT01FQUREUkVTUzsKKwkJZnByaW50ZihmcCwgImhvbWUgIik7CisJfQorCWlmIChpZmFfZmxhZ3MgJiBJRkFfRl9OT0RBRCkgeworCQlpZmFfZmxhZ3MgJj0gfklGQV9GX05PREFEOworCQlmcHJpbnRmKGZwLCAibm9kYWQgIik7CisJfQorCWlmIChpZmFfZmxhZ3MgJiBJRkFfRl9NQU5BR0VURU1QQUREUikgeworCQlpZmFfZmxhZ3MgJj0gfklGQV9GX01BTkFHRVRFTVBBRERSOworCQlmcHJpbnRmKGZwLCAibW5ndG1wYWRkciAiKTsKKwl9CisJaWYgKGlmYV9mbGFncyAmIElGQV9GX05PUFJFRklYUk9VVEUpIHsKKwkJaWZhX2ZsYWdzICY9IH5JRkFfRl9OT1BSRUZJWFJPVVRFOworCQlmcHJpbnRmKGZwLCAibm9wcmVmaXhyb3V0ZSAiKTsKKwl9CisJaWYgKGlmYV9mbGFncyAmIElGQV9GX01DQVVUT0pPSU4pIHsKKwkJaWZhX2ZsYWdzICY9IH5JRkFfRl9NQ0FVVE9KT0lOOworCQlmcHJpbnRmKGZwLCAiYXV0b2pvaW4gIik7CisJfQorCWlmICghKGlmYV9mbGFncyAmIElGQV9GX1BFUk1BTkVOVCkpIHsKKwkJZnByaW50ZihmcCwgImR5bmFtaWMgIik7CisJfSBlbHNlCisJCWlmYV9mbGFncyAmPSB+SUZBX0ZfUEVSTUFORU5UOworCWlmIChpZmFfZmxhZ3MgJiBJRkFfRl9EQURGQUlMRUQpIHsKKwkJaWZhX2ZsYWdzICY9IH5JRkFfRl9EQURGQUlMRUQ7CisJCWZwcmludGYoZnAsICJkYWRmYWlsZWQgIik7CisJfQorCWlmIChpZmFfZmxhZ3MpCisJCWZwcmludGYoZnAsICJmbGFncyAlMDJ4ICIsIGlmYV9mbGFncyk7CisJaWYgKHJ0YV90YltJRkFfTEFCRUxdKQorCQlmcHJpbnRmKGZwLCAiJXMiLCBydGFfZ2V0YXR0cl9zdHIocnRhX3RiW0lGQV9MQUJFTF0pKTsKKwlpZiAocnRhX3RiW0lGQV9DQUNIRUlORk9dKSB7CisJCXN0cnVjdCBpZmFfY2FjaGVpbmZvICpjaSA9IFJUQV9EQVRBKHJ0YV90YltJRkFfQ0FDSEVJTkZPXSk7CisJCWZwcmludGYoZnAsICIlcyIsIF9TTF8pOworCQlmcHJpbnRmKGZwLCAiICAgICAgIHZhbGlkX2xmdCAiKTsKKwkJaWYgKGNpLT5pZmFfdmFsaWQgPT0gSU5GSU5JVFlfTElGRV9USU1FKQorCQkJZnByaW50ZihmcCwgImZvcmV2ZXIiKTsKKwkJZWxzZQorCQkJZnByaW50ZihmcCwgIiV1c2VjIiwgY2ktPmlmYV92YWxpZCk7CisJCWZwcmludGYoZnAsICIgcHJlZmVycmVkX2xmdCAiKTsKKwkJaWYgKGNpLT5pZmFfcHJlZmVyZWQgPT0gSU5GSU5JVFlfTElGRV9USU1FKQorCQkJZnByaW50ZihmcCwgImZvcmV2ZXIiKTsKKwkJZWxzZSB7CisJCQlpZiAoZGVwcmVjYXRlZCkKKwkJCQlmcHJpbnRmKGZwLCAiJWRzZWMiLCBjaS0+aWZhX3ByZWZlcmVkKTsKKwkJCWVsc2UKKwkJCQlmcHJpbnRmKGZwLCAiJXVzZWMiLCBjaS0+aWZhX3ByZWZlcmVkKTsKKwkJfQorCX0KKwlmcHJpbnRmKGZwLCAiXG4iKTsKK2JyaWVmX2V4aXQ6CisJZmZsdXNoKGZwKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IG5sbXNnX2xpc3QKK3sKKwlzdHJ1Y3Qgbmxtc2dfbGlzdCAqbmV4dDsKKwlzdHJ1Y3Qgbmxtc2doZHIJICBoOworfTsKKworc3RydWN0IG5sbXNnX2NoYWluCit7CisJc3RydWN0IG5sbXNnX2xpc3QgKmhlYWQ7CisJc3RydWN0IG5sbXNnX2xpc3QgKnRhaWw7Cit9OworCitzdGF0aWMgaW50IHByaW50X3NlbGVjdGVkX2FkZHJpbmZvKHN0cnVjdCBpZmluZm9tc2cgKmlmaSwKKwkJCQkgICBzdHJ1Y3Qgbmxtc2dfbGlzdCAqYWluZm8sIEZJTEUgKmZwKQoreworCWZvciAoIDthaW5mbyA7ICBhaW5mbyA9IGFpbmZvLT5uZXh0KSB7CisJCXN0cnVjdCBubG1zZ2hkciAqbiA9ICZhaW5mby0+aDsKKwkJc3RydWN0IGlmYWRkcm1zZyAqaWZhID0gTkxNU0dfREFUQShuKTsKKworCQlpZiAobi0+bmxtc2dfdHlwZSAhPSBSVE1fTkVXQUREUikKKwkJCWNvbnRpbnVlOworCisJCWlmIChuLT5ubG1zZ19sZW4gPCBOTE1TR19MRU5HVEgoc2l6ZW9mKGlmYSkpKQorCQkJcmV0dXJuIC0xOworCisJCWlmIChpZmEtPmlmYV9pbmRleCAhPSBpZmktPmlmaV9pbmRleCB8fAorCQkgICAgKGZpbHRlci5mYW1pbHkgJiYgZmlsdGVyLmZhbWlseSAhPSBpZmEtPmlmYV9mYW1pbHkpKQorCQkJY29udGludWU7CisKKwkJaWYgKGZpbHRlci51cCAmJiAhKGlmaS0+aWZpX2ZsYWdzJklGRl9VUCkpCisJCQljb250aW51ZTsKKworCQlwcmludF9hZGRyaW5mbyhOVUxMLCBuLCBmcCk7CisJfQorCWlmIChicmllZikgeworCQlmcHJpbnRmKGZwLCAiXG4iKTsKKwkJZmZsdXNoKGZwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBzdG9yZV9ubG1zZyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobywgc3RydWN0IG5sbXNnaGRyICpuLAorCQkgICAgICAgdm9pZCAqYXJnKQoreworCXN0cnVjdCBubG1zZ19jaGFpbiAqbGNoYWluID0gKHN0cnVjdCBubG1zZ19jaGFpbiAqKWFyZzsKKwlzdHJ1Y3Qgbmxtc2dfbGlzdCAqaDsKKworCWggPSBtYWxsb2Mobi0+bmxtc2dfbGVuK3NpemVvZih2b2lkKikpOworCWlmIChoID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCW1lbWNweSgmaC0+aCwgbiwgbi0+bmxtc2dfbGVuKTsKKwloLT5uZXh0ID0gTlVMTDsKKworCWlmIChsY2hhaW4tPnRhaWwpCisJCWxjaGFpbi0+dGFpbC0+bmV4dCA9IGg7CisJZWxzZQorCQlsY2hhaW4tPmhlYWQgPSBoOworCWxjaGFpbi0+dGFpbCA9IGg7CisKKwlsbF9yZW1lbWJlcl9pbmRleCh3aG8sIG4sIE5VTEwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgX191MzIgaXBhZGRfZHVtcF9tYWdpYyA9IDB4NDczNjEyMjI7CisKK3N0YXRpYyBpbnQgaXBhZGRfc2F2ZV9wcmVwKHZvaWQpCit7CisJaW50IHJldDsKKworCWlmIChpc2F0dHkoU1RET1VUX0ZJTEVOTykpIHsKKwkJZnByaW50ZihzdGRlcnIsICJOb3Qgc2VuZGluZyBhIGJpbmFyeSBzdHJlYW0gdG8gc3Rkb3V0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldCA9IHdyaXRlKFNURE9VVF9GSUxFTk8sICZpcGFkZF9kdW1wX21hZ2ljLCBzaXplb2YoaXBhZGRfZHVtcF9tYWdpYykpOworCWlmIChyZXQgIT0gc2l6ZW9mKGlwYWRkX2R1bXBfbWFnaWMpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ2FuJ3Qgd3JpdGUgbWFnaWMgdG8gZHVtcCBmaWxlXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwYWRkX2R1bXBfY2hlY2tfbWFnaWModm9pZCkKK3sKKwlpbnQgcmV0OworCV9fdTMyIG1hZ2ljID0gMDsKKworCWlmIChpc2F0dHkoU1RESU5fRklMRU5PKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNhbid0IHJlc3RvcmUgYWRkcmVzcyBkdW1wIGZyb20gYSB0ZXJtaW5hbFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXQgPSBmcmVhZCgmbWFnaWMsIHNpemVvZihtYWdpYyksIDEsIHN0ZGluKTsKKwlpZiAobWFnaWMgIT0gaXBhZGRfZHVtcF9tYWdpYykgeworCQlmcHJpbnRmKHN0ZGVyciwgIk1hZ2ljIG1pc21hdGNoICglZCBlbGVtcywgJXggbWFnaWMpXG4iLCByZXQsIG1hZ2ljKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhdmVfbmxtc2coY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8sIHN0cnVjdCBubG1zZ2hkciAqbiwKKwkJICAgICAgIHZvaWQgKmFyZykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gd3JpdGUoU1RET1VUX0ZJTEVOTywgbiwgbi0+bmxtc2dfbGVuKTsKKwlpZiAoKHJldCA+IDApICYmIChyZXQgIT0gbi0+bmxtc2dfbGVuKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlNob3J0IHdyaXRlIHdoaWxlIHNhdmluZyBubG1zZ1xuIik7CisJCXJldCA9IC1FSU87CisJfQorCisJcmV0dXJuIHJldCA9PSBuLT5ubG1zZ19sZW4gPyAwIDogcmV0OworfQorCitzdGF0aWMgaW50IHNob3dfaGFuZGxlcihjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKm5sLAorCQkJc3RydWN0IHJ0bmxfY3RybF9kYXRhICpjdHJsLAorCQkJc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcpCit7CisJc3RydWN0IGlmYWRkcm1zZyAqaWZhID0gTkxNU0dfREFUQShuKTsKKworCXByaW50ZigiaWYlZDpcbiIsIGlmYS0+aWZhX2luZGV4KTsKKwlwcmludF9hZGRyaW5mbyhOVUxMLCBuLCBzdGRvdXQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwYWRkcl9zaG93ZHVtcCh2b2lkKQoreworCWlmIChpcGFkZF9kdW1wX2NoZWNrX21hZ2ljKCkpCisJCWV4aXQoLTEpOworCisJZXhpdChydG5sX2Zyb21fZmlsZShzdGRpbiwgJnNob3dfaGFuZGxlciwgTlVMTCkpOworfQorCitzdGF0aWMgaW50IHJlc3RvcmVfaGFuZGxlcihjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKm5sLAorCQkJICAgc3RydWN0IHJ0bmxfY3RybF9kYXRhICpjdHJsLAorCQkJICAgc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcpCit7CisJaW50IHJldDsKKworCW4tPm5sbXNnX2ZsYWdzIHw9IE5MTV9GX1JFUVVFU1QgfCBOTE1fRl9DUkVBVEUgfCBOTE1fRl9BQ0s7CisKKwlsbF9pbml0X21hcCgmcnRoKTsKKworCXJldCA9IHJ0bmxfdGFsaygmcnRoLCBuLCBuLCBzaXplb2YoKm4pKTsKKwlpZiAoKHJldCA8IDApICYmIChlcnJubyA9PSBFRVhJU1QpKQorCQlyZXQgPSAwOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpcGFkZHJfcmVzdG9yZSh2b2lkKQoreworCWlmIChpcGFkZF9kdW1wX2NoZWNrX21hZ2ljKCkpCisJCWV4aXQoLTEpOworCisJZXhpdChydG5sX2Zyb21fZmlsZShzdGRpbiwgJnJlc3RvcmVfaGFuZGxlciwgTlVMTCkpOworfQorCitzdGF0aWMgdm9pZCBmcmVlX25sbXNnX2NoYWluKHN0cnVjdCBubG1zZ19jaGFpbiAqaW5mbykKK3sKKwlzdHJ1Y3Qgbmxtc2dfbGlzdCAqbCwgKm47CisKKwlmb3IgKGwgPSBpbmZvLT5oZWFkOyBsOyBsID0gbikgeworCQluID0gbC0+bmV4dDsKKwkJZnJlZShsKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlwYWRkcl9maWx0ZXIoc3RydWN0IG5sbXNnX2NoYWluICpsaW5mbywgc3RydWN0IG5sbXNnX2NoYWluICphaW5mbykKK3sKKwlzdHJ1Y3Qgbmxtc2dfbGlzdCAqbCwgKipscDsKKworCWxwID0gJmxpbmZvLT5oZWFkOworCXdoaWxlICggKGwgPSAqbHApICE9IE5VTEwpIHsKKwkJaW50IG9rID0gMDsKKwkJaW50IG1pc3NpbmdfbmV0X2FkZHJlc3MgPSAxOworCQlzdHJ1Y3QgaWZpbmZvbXNnICppZmkgPSBOTE1TR19EQVRBKCZsLT5oKTsKKwkJc3RydWN0IG5sbXNnX2xpc3QgKmE7CisKKwkJZm9yIChhID0gYWluZm8tPmhlYWQ7IGE7IGEgPSBhLT5uZXh0KSB7CisJCQlzdHJ1Y3Qgbmxtc2doZHIgKm4gPSAmYS0+aDsKKwkJCXN0cnVjdCBpZmFkZHJtc2cgKmlmYSA9IE5MTVNHX0RBVEEobik7CisJCQlzdHJ1Y3QgcnRhdHRyICp0YltJRkFfTUFYICsgMV07CisJCQl1bnNpZ25lZCBpbnQgaWZhX2ZsYWdzOworCisJCQlpZiAoaWZhLT5pZmFfaW5kZXggIT0gaWZpLT5pZmlfaW5kZXgpCisJCQkJY29udGludWU7CisJCQltaXNzaW5nX25ldF9hZGRyZXNzID0gMDsKKwkJCWlmIChmaWx0ZXIuZmFtaWx5ICYmIGZpbHRlci5mYW1pbHkgIT0gaWZhLT5pZmFfZmFtaWx5KQorCQkJCWNvbnRpbnVlOworCQkJaWYgKChmaWx0ZXIuc2NvcGVeaWZhLT5pZmFfc2NvcGUpJmZpbHRlci5zY29wZW1hc2spCisJCQkJY29udGludWU7CisKKwkJCXBhcnNlX3J0YXR0cih0YiwgSUZBX01BWCwgSUZBX1JUQShpZmEpLCBJRkFfUEFZTE9BRChuKSk7CisJCQlpZmFfZmxhZ3MgPSBnZXRfaWZhX2ZsYWdzKGlmYSwgdGJbSUZBX0ZMQUdTXSk7CisKKwkJCWlmICgoZmlsdGVyLmZsYWdzIF4gaWZhX2ZsYWdzKSAmIGZpbHRlci5mbGFnbWFzaykKKwkJCQljb250aW51ZTsKKwkJCWlmIChmaWx0ZXIucGZ4LmZhbWlseSB8fCBmaWx0ZXIubGFiZWwpIHsKKwkJCQlpZiAoIXRiW0lGQV9MT0NBTF0pCisJCQkJCXRiW0lGQV9MT0NBTF0gPSB0YltJRkFfQUREUkVTU107CisKKwkJCQlpZiAoZmlsdGVyLnBmeC5mYW1pbHkgJiYgdGJbSUZBX0xPQ0FMXSkgeworCQkJCQlpbmV0X3ByZWZpeCBkc3Q7CisJCQkJCW1lbXNldCgmZHN0LCAwLCBzaXplb2YoZHN0KSk7CisJCQkJCWRzdC5mYW1pbHkgPSBpZmEtPmlmYV9mYW1pbHk7CisJCQkJCW1lbWNweSgmZHN0LmRhdGEsIFJUQV9EQVRBKHRiW0lGQV9MT0NBTF0pLCBSVEFfUEFZTE9BRCh0YltJRkFfTE9DQUxdKSk7CisJCQkJCWlmIChpbmV0X2FkZHJfbWF0Y2goJmRzdCwgJmZpbHRlci5wZngsIGZpbHRlci5wZnguYml0bGVuKSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpZiAoZmlsdGVyLmxhYmVsKSB7CisJCQkJCVNQUklOVF9CVUYoYjEpOworCQkJCQljb25zdCBjaGFyICpsYWJlbDsKKwkJCQkJaWYgKHRiW0lGQV9MQUJFTF0pCisJCQkJCQlsYWJlbCA9IFJUQV9EQVRBKHRiW0lGQV9MQUJFTF0pOworCQkJCQllbHNlCisJCQkJCQlsYWJlbCA9IGxsX2lkeF9uMmEoaWZhLT5pZmFfaW5kZXgsIGIxKTsKKwkJCQkJaWYgKGZubWF0Y2goZmlsdGVyLmxhYmVsLCBsYWJlbCwgMCkgIT0gMCkKKwkJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKworCQkJb2sgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKG1pc3NpbmdfbmV0X2FkZHJlc3MgJiYKKwkJICAgIChmaWx0ZXIuZmFtaWx5ID09IEFGX1VOU1BFQyB8fCBmaWx0ZXIuZmFtaWx5ID09IEFGX1BBQ0tFVCkpCisJCQlvayA9IDE7CisJCWlmICghb2spIHsKKwkJCSpscCA9IGwtPm5leHQ7CisJCQlmcmVlKGwpOworCQl9IGVsc2UKKwkJCWxwID0gJmwtPm5leHQ7CisJfQorfQorCitzdGF0aWMgaW50IGlwYWRkcl9mbHVzaCh2b2lkKQoreworCWludCByb3VuZCA9IDA7CisJY2hhciBmbHVzaGJbNDA5Ni01MTJdOworCisJZmlsdGVyLmZsdXNoYiA9IGZsdXNoYjsKKwlmaWx0ZXIuZmx1c2hwID0gMDsKKwlmaWx0ZXIuZmx1c2hlID0gc2l6ZW9mKGZsdXNoYik7CisKKwl3aGlsZSAoKG1heF9mbHVzaF9sb29wcyA9PSAwKSB8fCAocm91bmQgPCBtYXhfZmx1c2hfbG9vcHMpKSB7CisJCWlmIChydG5sX3dpbGRkdW1wX3JlcXVlc3QoJnJ0aCwgZmlsdGVyLmZhbWlseSwgUlRNX0dFVEFERFIpIDwgMCkgeworCQkJcGVycm9yKCJDYW5ub3Qgc2VuZCBkdW1wIHJlcXVlc3QiKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJZmlsdGVyLmZsdXNoZWQgPSAwOworCQlpZiAocnRubF9kdW1wX2ZpbHRlcl9uYygmcnRoLCBwcmludF9hZGRyaW5mbywKKwkJCQkJc3Rkb3V0LCBOTE1fRl9EVU1QX0lOVFIpIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJGbHVzaCB0ZXJtaW5hdGVkXG4iKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJaWYgKGZpbHRlci5mbHVzaGVkID09IDApIHsKKyBmbHVzaF9kb25lOgorCQkJaWYgKHNob3dfc3RhdHMpIHsKKwkJCQlpZiAocm91bmQgPT0gMCkKKwkJCQkJcHJpbnRmKCJOb3RoaW5nIHRvIGZsdXNoLlxuIik7CisJCQkJZWxzZQorCQkJCQlwcmludGYoIioqKiBGbHVzaCBpcyBjb21wbGV0ZSBhZnRlciAlZCByb3VuZCVzICoqKlxuIiwgcm91bmQsIHJvdW5kPjE/InMiOiIiKTsKKwkJCX0KKwkJCWZmbHVzaChzdGRvdXQpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcm91bmQrKzsKKwkJaWYgKGZsdXNoX3VwZGF0ZSgpIDwgMCkKKwkJCXJldHVybiAxOworCisJCWlmIChzaG93X3N0YXRzKSB7CisJCQlwcmludGYoIlxuKioqIFJvdW5kICVkLCBkZWxldGluZyAlZCBhZGRyZXNzZXMgKioqXG4iLCByb3VuZCwgZmlsdGVyLmZsdXNoZWQpOworCQkJZmZsdXNoKHN0ZG91dCk7CisJCX0KKworCQkvKiBJZiB3ZSBhcmUgZmx1c2hpbmcsIGFuZCBzcGVjaWZ5aW5nIHByaW1hcnksIHRoZW4gd2UKKwkJICogd2FudCB0byBmbHVzaCBvbmx5IGEgc2luZ2xlIHJvdW5kLiAgT3RoZXJ3aXNlLCB3ZSdsbAorCQkgKiBzdGFydCBmbHVzaGluZyBzZWNvbmRhcmllcyB0aGF0IHdlcmUgcHJvbW90ZWQgdG8KKwkJICogcHJpbWFyaWVzLgorCQkgKi8KKwkJaWYgKCEoZmlsdGVyLmZsYWdzICYgSUZBX0ZfU0VDT05EQVJZKSAmJiAoZmlsdGVyLmZsYWdtYXNrICYgSUZBX0ZfU0VDT05EQVJZKSkKKwkJCWdvdG8gZmx1c2hfZG9uZTsKKwl9CisJZnByaW50ZihzdGRlcnIsICIqKiogRmx1c2ggcmVtYWlucyBpbmNvbXBsZXRlIGFmdGVyICVkIHJvdW5kcy4gKioqXG4iLCBtYXhfZmx1c2hfbG9vcHMpOworCWZmbHVzaChzdGRlcnIpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGlwYWRkcl9saXN0X2ZsdXNoX29yX3NhdmUoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBpbnQgYWN0aW9uKQoreworCXN0cnVjdCBubG1zZ19jaGFpbiBsaW5mbyA9IHsgTlVMTCwgTlVMTH07CisJc3RydWN0IG5sbXNnX2NoYWluIGFpbmZvID0geyBOVUxMLCBOVUxMfTsKKwlzdHJ1Y3Qgbmxtc2dfbGlzdCAqbDsKKwljaGFyICpmaWx0ZXJfZGV2ID0gTlVMTDsKKwlpbnQgbm9fbGluayA9IDA7CisKKwlpcGFkZHJfcmVzZXRfZmlsdGVyKG9uZWxpbmUsIDApOworCWZpbHRlci5zaG93cXVldWUgPSAxOworCWZpbHRlci5mYW1pbHkgPSBwcmVmZXJyZWRfZmFtaWx5OworCWZpbHRlci5ncm91cCA9IC0xOworCisJaWYgKGFjdGlvbiA9PSBJUEFERF9GTFVTSCkgeworCQlpZiAoYXJnYyA8PSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkZsdXNoIHJlcXVpcmVzIGFyZ3VtZW50cy5cbiIpOworCisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKGZpbHRlci5mYW1pbHkgPT0gQUZfUEFDS0VUKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBmbHVzaCBsaW5rIGFkZHJlc3Nlcy5cbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChzdHJjbXAoKmFyZ3YsICJ0byIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlnZXRfcHJlZml4KCZmaWx0ZXIucGZ4LCAqYXJndiwgZmlsdGVyLmZhbWlseSk7CisJCQlpZiAoZmlsdGVyLmZhbWlseSA9PSBBRl9VTlNQRUMpCisJCQkJZmlsdGVyLmZhbWlseSA9IGZpbHRlci5wZnguZmFtaWx5OworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInNjb3BlIikgPT0gMCkgeworCQkJdW5zaWduZWQgc2NvcGUgPSAwOworCQkJTkVYVF9BUkcoKTsKKwkJCWZpbHRlci5zY29wZW1hc2sgPSAtMTsKKwkJCWlmIChydG5sX3J0c2NvcGVfYTJuKCZzY29wZSwgKmFyZ3YpKSB7CisJCQkJaWYgKHN0cmNtcCgqYXJndiwgImFsbCIpICE9IDApCisJCQkJCWludmFyZygiaW52YWxpZCBcInNjb3BlXCJcbiIsICphcmd2KTsKKwkJCQlzY29wZSA9IFJUX1NDT1BFX05PV0hFUkU7CisJCQkJZmlsdGVyLnNjb3BlbWFzayA9IDA7CisJCQl9CisJCQlmaWx0ZXIuc2NvcGUgPSBzY29wZTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJ1cCIpID09IDApIHsKKwkJCWZpbHRlci51cCA9IDE7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZHluYW1pYyIpID09IDApIHsKKwkJCWZpbHRlci5mbGFncyAmPSB+SUZBX0ZfUEVSTUFORU5UOworCQkJZmlsdGVyLmZsYWdtYXNrIHw9IElGQV9GX1BFUk1BTkVOVDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJwZXJtYW5lbnQiKSA9PSAwKSB7CisJCQlmaWx0ZXIuZmxhZ3MgfD0gSUZBX0ZfUEVSTUFORU5UOworCQkJZmlsdGVyLmZsYWdtYXNrIHw9IElGQV9GX1BFUk1BTkVOVDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJzZWNvbmRhcnkiKSA9PSAwIHx8CisJCQkgICBzdHJjbXAoKmFyZ3YsICJ0ZW1wb3JhcnkiKSA9PSAwKSB7CisJCQlmaWx0ZXIuZmxhZ3MgfD0gSUZBX0ZfU0VDT05EQVJZOworCQkJZmlsdGVyLmZsYWdtYXNrIHw9IElGQV9GX1NFQ09OREFSWTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJwcmltYXJ5IikgPT0gMCkgeworCQkJZmlsdGVyLmZsYWdzICY9IH5JRkFfRl9TRUNPTkRBUlk7CisJCQlmaWx0ZXIuZmxhZ21hc2sgfD0gSUZBX0ZfU0VDT05EQVJZOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInRlbnRhdGl2ZSIpID09IDApIHsKKwkJCWZpbHRlci5mbGFncyB8PSBJRkFfRl9URU5UQVRJVkU7CisJCQlmaWx0ZXIuZmxhZ21hc2sgfD0gSUZBX0ZfVEVOVEFUSVZFOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi10ZW50YXRpdmUiKSA9PSAwKSB7CisJCQlmaWx0ZXIuZmxhZ3MgJj0gfklGQV9GX1RFTlRBVElWRTsKKwkJCWZpbHRlci5mbGFnbWFzayB8PSBJRkFfRl9URU5UQVRJVkU7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZGVwcmVjYXRlZCIpID09IDApIHsKKwkJCWZpbHRlci5mbGFncyB8PSBJRkFfRl9ERVBSRUNBVEVEOworCQkJZmlsdGVyLmZsYWdtYXNrIHw9IElGQV9GX0RFUFJFQ0FURUQ7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLWRlcHJlY2F0ZWQiKSA9PSAwKSB7CisJCQlmaWx0ZXIuZmxhZ3MgJj0gfklGQV9GX0RFUFJFQ0FURUQ7CisJCQlmaWx0ZXIuZmxhZ21hc2sgfD0gSUZBX0ZfREVQUkVDQVRFRDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJob21lIikgPT0gMCkgeworCQkJZmlsdGVyLmZsYWdzIHw9IElGQV9GX0hPTUVBRERSRVNTOworCQkJZmlsdGVyLmZsYWdtYXNrIHw9IElGQV9GX0hPTUVBRERSRVNTOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm5vZGFkIikgPT0gMCkgeworCQkJZmlsdGVyLmZsYWdzIHw9IElGQV9GX05PREFEOworCQkJZmlsdGVyLmZsYWdtYXNrIHw9IElGQV9GX05PREFEOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm1uZ3RtcGFkZHIiKSA9PSAwKSB7CisJCQlmaWx0ZXIuZmxhZ3MgfD0gSUZBX0ZfTUFOQUdFVEVNUEFERFI7CisJCQlmaWx0ZXIuZmxhZ21hc2sgfD0gSUZBX0ZfTUFOQUdFVEVNUEFERFI7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibm9wcmVmaXhyb3V0ZSIpID09IDApIHsKKwkJCWZpbHRlci5mbGFncyB8PSBJRkFfRl9OT1BSRUZJWFJPVVRFOworCQkJZmlsdGVyLmZsYWdtYXNrIHw9IElGQV9GX05PUFJFRklYUk9VVEU7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiYXV0b2pvaW4iKSA9PSAwKSB7CisJCQlmaWx0ZXIuZmxhZ3MgfD0gSUZBX0ZfTUNBVVRPSk9JTjsKKwkJCWZpbHRlci5mbGFnbWFzayB8PSBJRkFfRl9NQ0FVVE9KT0lOOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImRhZGZhaWxlZCIpID09IDApIHsKKwkJCWZpbHRlci5mbGFncyB8PSBJRkFfRl9EQURGQUlMRUQ7CisJCQlmaWx0ZXIuZmxhZ21hc2sgfD0gSUZBX0ZfREFERkFJTEVEOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1kYWRmYWlsZWQiKSA9PSAwKSB7CisJCQlmaWx0ZXIuZmxhZ3MgJj0gfklGQV9GX0RBREZBSUxFRDsKKwkJCWZpbHRlci5mbGFnbWFzayB8PSBJRkFfRl9EQURGQUlMRUQ7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibGFiZWwiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJZmlsdGVyLmxhYmVsID0gKmFyZ3Y7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZ3JvdXAiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHJ0bmxfZ3JvdXBfYTJuKCZmaWx0ZXIuZ3JvdXAsICphcmd2KSkKKwkJCQlpbnZhcmcoIkludmFsaWQgXCJncm91cFwiIHZhbHVlXG4iLCAqYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibWFzdGVyIikgPT0gMCkgeworCQkJaW50IGlmaW5kZXg7CisJCQlORVhUX0FSRygpOworCQkJaWZpbmRleCA9IGxsX25hbWVfdG9faW5kZXgoKmFyZ3YpOworCQkJaWYgKCFpZmluZGV4KQorCQkJCWludmFyZygiRGV2aWNlIGRvZXMgbm90IGV4aXN0XG4iLCAqYXJndik7CisJCQlmaWx0ZXIubWFzdGVyID0gaWZpbmRleDsKKwkJfSBlbHNlIGlmIChkb19saW5rICYmIHN0cmNtcCgqYXJndiwgInR5cGUiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJZmlsdGVyLmtpbmQgPSAqYXJndjsKKwkJfSBlbHNlIHsKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJkZXYiKSA9PSAwKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCX0KKwkJCWVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkKKwkJCQl1c2FnZSgpOworCQkJaWYgKGZpbHRlcl9kZXYpCisJCQkJZHVwYXJnMigiZGV2IiwgKmFyZ3YpOworCQkJZmlsdGVyX2RldiA9ICphcmd2OworCQl9CisJCWFyZ3YrKzsgYXJnYy0tOworCX0KKworCWlmIChmaWx0ZXJfZGV2KSB7CisJCWZpbHRlci5pZmluZGV4ID0gbGxfbmFtZV90b19pbmRleChmaWx0ZXJfZGV2KTsKKwkJaWYgKGZpbHRlci5pZmluZGV4IDw9IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiRGV2aWNlIFwiJXNcIiBkb2VzIG5vdCBleGlzdC5cbiIsIGZpbHRlcl9kZXYpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJaWYgKGFjdGlvbiA9PSBJUEFERF9GTFVTSCkKKwkJcmV0dXJuIGlwYWRkcl9mbHVzaCgpOworCisJaWYgKGFjdGlvbiA9PSBJUEFERF9TQVZFKSB7CisJCWlmIChpcGFkZF9zYXZlX3ByZXAoKSkKKwkJCWV4aXQoMSk7CisKKwkJaWYgKHJ0bmxfd2lsZGR1bXBfcmVxdWVzdCgmcnRoLCBwcmVmZXJyZWRfZmFtaWx5LCBSVE1fR0VUQUREUikgPCAwKSB7CisJCQlwZXJyb3IoIkNhbm5vdCBzZW5kIGR1bXAgcmVxdWVzdCIpOworCQkJZXhpdCgxKTsKKwkJfQorCisJCWlmIChydG5sX2R1bXBfZmlsdGVyKCZydGgsIHNhdmVfbmxtc2csIHN0ZG91dCkgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlNhdmUgdGVybWluYXRlZFxuIik7CisJCQlleGl0KDEpOworCQl9CisKKwkJZXhpdCgwKTsKKwl9CisKKwkvKgorCSAqIElmIG9ubHkgZmlsdGVyX2RldiBwcmVzZW50IGFuZCBub25lIG9mIHRoZSBvdGhlcgorCSAqIGxpbmsgZmlsdGVycyBhcmUgcHJlc2VudCwgdXNlIFJUTV9HRVRMSU5LIHRvIGdldAorCSAqIHRoZSBsaW5rIGRldmljZQorCSAqLworCWlmIChmaWx0ZXJfZGV2ICYmIGZpbHRlci5ncm91cCA9PSAtMSAmJiBkb19saW5rID09IDEpIHsKKwkJaWYgKGlwbGlua19nZXQoMCwgZmlsdGVyX2RldiwgUlRFWFRfRklMVEVSX1ZGKSA8IDApIHsKKwkJCXBlcnJvcigiQ2Fubm90IHNlbmQgbGluayBnZXQgcmVxdWVzdCIpOworCQkJZXhpdCgxKTsKKwkJfQorCQlleGl0KDApOworCX0KKworCWlmIChydG5sX3dpbGRkdW1wX3JlcXVlc3QoJnJ0aCwgcHJlZmVycmVkX2ZhbWlseSwgUlRNX0dFVExJTkspIDwgMCkgeworCQlwZXJyb3IoIkNhbm5vdCBzZW5kIGR1bXAgcmVxdWVzdCIpOworCQlleGl0KDEpOworCX0KKworCWlmIChydG5sX2R1bXBfZmlsdGVyKCZydGgsIHN0b3JlX25sbXNnLCAmbGluZm8pIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkR1bXAgdGVybWluYXRlZFxuIik7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKGZpbHRlci5mYW1pbHkgIT0gQUZfUEFDS0VUKSB7CisJCWlmIChmaWx0ZXIub25lbGluZSkKKwkJCW5vX2xpbmsgPSAxOworCisJCWlmIChydG5sX3dpbGRkdW1wX3JlcXVlc3QoJnJ0aCwgZmlsdGVyLmZhbWlseSwgUlRNX0dFVEFERFIpIDwgMCkgeworCQkJcGVycm9yKCJDYW5ub3Qgc2VuZCBkdW1wIHJlcXVlc3QiKTsKKwkJCWV4aXQoMSk7CisJCX0KKworCQlpZiAocnRubF9kdW1wX2ZpbHRlcigmcnRoLCBzdG9yZV9ubG1zZywgJmFpbmZvKSA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiRHVtcCB0ZXJtaW5hdGVkXG4iKTsKKwkJCWV4aXQoMSk7CisJCX0KKworCQlpcGFkZHJfZmlsdGVyKCZsaW5mbywgJmFpbmZvKTsKKwl9CisKKwlmb3IgKGwgPSBsaW5mby5oZWFkOyBsOyBsID0gbC0+bmV4dCkgeworCQlpbnQgcmVzID0gMDsKKwkJc3RydWN0IGlmaW5mb21zZyAqaWZpID0gTkxNU0dfREFUQSgmbC0+aCk7CisKKwkJaWYgKGJyaWVmKSB7CisJCQlpZiAocHJpbnRfbGlua2luZm9fYnJpZWYoTlVMTCwgJmwtPmgsIHN0ZG91dCkgPT0gMCkKKwkJCQlpZiAoZmlsdGVyLmZhbWlseSAhPSBBRl9QQUNLRVQpCisJCQkJCXByaW50X3NlbGVjdGVkX2FkZHJpbmZvKGlmaSwKKwkJCQkJCQkJYWluZm8uaGVhZCwKKwkJCQkJCQkJc3Rkb3V0KTsKKwkJfSBlbHNlIGlmIChub19saW5rIHx8CisJCQkgKHJlcyA9IHByaW50X2xpbmtpbmZvKE5VTEwsICZsLT5oLCBzdGRvdXQpKSA+PSAwKSB7CisJCQlpZiAoZmlsdGVyLmZhbWlseSAhPSBBRl9QQUNLRVQpCisJCQkJcHJpbnRfc2VsZWN0ZWRfYWRkcmluZm8oaWZpLAorCQkJCQkJCWFpbmZvLmhlYWQsIHN0ZG91dCk7CisJCQlpZiAocmVzID4gMCAmJiAhZG9fbGluayAmJiBzaG93X3N0YXRzKQorCQkJCXByaW50X2xpbmtfc3RhdHMoc3Rkb3V0LCAmbC0+aCk7CisJCX0KKwl9CisJZmZsdXNoKHN0ZG91dCk7CisKKwlmcmVlX25sbXNnX2NoYWluKCZhaW5mbyk7CisJZnJlZV9ubG1zZ19jaGFpbigmbGluZm8pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitpcGFkZHJfbG9vcF9lYWNoX3ZmKHN0cnVjdCBydGF0dHIgKnRiW10sIGludCB2Zm51bSwgaW50ICptaW4sIGludCAqbWF4KQoreworCXN0cnVjdCBydGF0dHIgKnZmbGlzdCA9IHRiW0lGTEFfVkZJTkZPX0xJU1RdOworCXN0cnVjdCBydGF0dHIgKmksICp2ZltJRkxBX1ZGX01BWCsxXTsKKwlzdHJ1Y3QgaWZsYV92Zl9yYXRlICp2Zl9yYXRlOworCWludCByZW07CisKKwlyZW0gPSBSVEFfUEFZTE9BRCh2Zmxpc3QpOworCisJZm9yIChpID0gUlRBX0RBVEEodmZsaXN0KTsgUlRBX09LKGksIHJlbSk7IGkgPSBSVEFfTkVYVChpLCByZW0pKSB7CisJCXBhcnNlX3J0YXR0cl9uZXN0ZWQodmYsIElGTEFfVkZfTUFYLCBpKTsKKwkJdmZfcmF0ZSA9IFJUQV9EQVRBKHZmW0lGTEFfVkZfUkFURV0pOworCQlpZiAodmZfcmF0ZS0+dmYgPT0gdmZudW0pIHsKKwkJCSptaW4gPSB2Zl9yYXRlLT5taW5fdHhfcmF0ZTsKKwkJCSptYXggPSB2Zl9yYXRlLT5tYXhfdHhfcmF0ZTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBmaW5kIFZGICVkXG4iLCB2Zm51bSk7CisJZXhpdCgxKTsKK30KKwordm9pZCBpcGFkZHJfZ2V0X3ZmX3JhdGUoaW50IHZmbnVtLCBpbnQgKm1pbiwgaW50ICptYXgsIGludCBpZHgpCit7CisJc3RydWN0IG5sbXNnX2NoYWluIGxpbmZvID0geyBOVUxMLCBOVUxMfTsKKwlzdHJ1Y3QgcnRhdHRyICp0YltJRkxBX01BWCsxXTsKKwlzdHJ1Y3QgaWZpbmZvbXNnICppZmk7CisJc3RydWN0IG5sbXNnX2xpc3QgKmw7CisJc3RydWN0IG5sbXNnaGRyICpuOworCWludCBsZW47CisKKwlpZiAocnRubF93aWxkZHVtcF9yZXF1ZXN0KCZydGgsIEFGX1VOU1BFQywgUlRNX0dFVExJTkspIDwgMCkgeworCQlwZXJyb3IoIkNhbm5vdCBzZW5kIGR1bXAgcmVxdWVzdCIpOworCQlleGl0KDEpOworCX0KKwlpZiAocnRubF9kdW1wX2ZpbHRlcigmcnRoLCBzdG9yZV9ubG1zZywgJmxpbmZvKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJEdW1wIHRlcm1pbmF0ZWRcbiIpOworCQlleGl0KDEpOworCX0KKwlmb3IgKGwgPSBsaW5mby5oZWFkOyBsOyBsID0gbC0+bmV4dCkgeworCQluID0gJmwtPmg7CisJCWlmaSA9IE5MTVNHX0RBVEEobik7CisKKwkJbGVuID0gbi0+bmxtc2dfbGVuIC0gTkxNU0dfTEVOR1RIKHNpemVvZigqaWZpKSk7CisJCWlmIChsZW4gPCAwIHx8IChpZHggJiYgaWR4ICE9IGlmaS0+aWZpX2luZGV4KSkKKwkJCWNvbnRpbnVlOworCisJCXBhcnNlX3J0YXR0cih0YiwgSUZMQV9NQVgsIElGTEFfUlRBKGlmaSksIGxlbik7CisKKwkJaWYgKCh0YltJRkxBX1ZGSU5GT19MSVNUXSAmJiB0YltJRkxBX05VTV9WRl0pKSB7CisJCQlpcGFkZHJfbG9vcF9lYWNoX3ZmKHRiLCB2Zm51bSwgbWluLCBtYXgpOworCQkJcmV0dXJuOworCQl9CisJfQorfQorCitpbnQgaXBhZGRyX2xpc3RfbGluayhpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJcHJlZmVycmVkX2ZhbWlseSA9IEFGX1BBQ0tFVDsKKwlkb19saW5rID0gMTsKKwlyZXR1cm4gaXBhZGRyX2xpc3RfZmx1c2hfb3Jfc2F2ZShhcmdjLCBhcmd2LCBJUEFERF9MSVNUKTsKK30KKwordm9pZCBpcGFkZHJfcmVzZXRfZmlsdGVyKGludCBvbmVsaW5lLCBpbnQgaWZpbmRleCkKK3sKKwltZW1zZXQoJmZpbHRlciwgMCwgc2l6ZW9mKGZpbHRlcikpOworCWZpbHRlci5vbmVsaW5lID0gb25lbGluZTsKKwlmaWx0ZXIuaWZpbmRleCA9IGlmaW5kZXg7Cit9CisKK3N0YXRpYyBpbnQgZGVmYXVsdF9zY29wZShpbmV0X3ByZWZpeCAqbGNsKQoreworCWlmIChsY2wtPmZhbWlseSA9PSBBRl9JTkVUKSB7CisJCWlmIChsY2wtPmJ5dGVsZW4gPj0gMSAmJiAqKF9fdTgqKSZsY2wtPmRhdGEgPT0gMTI3KQorCQkJcmV0dXJuIFJUX1NDT1BFX0hPU1Q7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgYm9vbCBpcGFkZHJfaXNfbXVsdGljYXN0KGluZXRfcHJlZml4ICphKQoreworCWlmIChhLT5mYW1pbHkgPT0gQUZfSU5FVCkKKwkJcmV0dXJuIElOX01VTFRJQ0FTVChudG9obChhLT5kYXRhWzBdKSk7CisJZWxzZSBpZiAoYS0+ZmFtaWx5ID09IEFGX0lORVQ2KQorCQlyZXR1cm4gSU42X0lTX0FERFJfTVVMVElDQVNUKGEtPmRhdGEpOworCWVsc2UKKwkJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50IGlwYWRkcl9tb2RpZnkoaW50IGNtZCwgaW50IGZsYWdzLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyCW47CisJCXN0cnVjdCBpZmFkZHJtc2cJaWZhOworCQljaGFyCQkJYnVmWzI1Nl07CisJfSByZXE7CisJY2hhciAgKmQgPSBOVUxMOworCWNoYXIgICpsID0gTlVMTDsKKwljaGFyICAqbGNsX2FyZyA9IE5VTEw7CisJY2hhciAgKnZhbGlkX2xmdHAgPSBOVUxMOworCWNoYXIgICpwcmVmZXJyZWRfbGZ0cCA9IE5VTEw7CisJaW5ldF9wcmVmaXggbGNsOworCWluZXRfcHJlZml4IHBlZXI7CisJaW50IGxvY2FsX2xlbiA9IDA7CisJaW50IHBlZXJfbGVuID0gMDsKKwlpbnQgYnJkX2xlbiA9IDA7CisJaW50IGFueV9sZW4gPSAwOworCWludCBzY29wZWQgPSAwOworCV9fdTMyIHByZWZlcnJlZF9sZnQgPSBJTkZJTklUWV9MSUZFX1RJTUU7CisJX191MzIgdmFsaWRfbGZ0ID0gSU5GSU5JVFlfTElGRV9USU1FOworCXN0cnVjdCBpZmFfY2FjaGVpbmZvIGNpbmZvOworCXVuc2lnbmVkIGludCBpZmFfZmxhZ3MgPSAwOworCisJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKworCXJlcS5uLm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IGlmYWRkcm1zZykpOworCXJlcS5uLm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVCB8IGZsYWdzOworCXJlcS5uLm5sbXNnX3R5cGUgPSBjbWQ7CisJcmVxLmlmYS5pZmFfZmFtaWx5ID0gcHJlZmVycmVkX2ZhbWlseTsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAoc3RyY21wKCphcmd2LCAicGVlciIpID09IDAgfHwKKwkJICAgIHN0cmNtcCgqYXJndiwgInJlbW90ZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisKKwkJCWlmIChwZWVyX2xlbikKKwkJCQlkdXBhcmcoInBlZXIiLCAqYXJndik7CisJCQlnZXRfcHJlZml4KCZwZWVyLCAqYXJndiwgcmVxLmlmYS5pZmFfZmFtaWx5KTsKKwkJCXBlZXJfbGVuID0gcGVlci5ieXRlbGVuOworCQkJaWYgKHJlcS5pZmEuaWZhX2ZhbWlseSA9PSBBRl9VTlNQRUMpCisJCQkJcmVxLmlmYS5pZmFfZmFtaWx5ID0gcGVlci5mYW1pbHk7CisJCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgSUZBX0FERFJFU1MsICZwZWVyLmRhdGEsIHBlZXIuYnl0ZWxlbik7CisJCQlyZXEuaWZhLmlmYV9wcmVmaXhsZW4gPSBwZWVyLmJpdGxlbjsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiYnJvYWRjYXN0IikgPT0gMCB8fAorCQkJICAgc3RyY21wKCphcmd2LCAiYnJkIikgPT0gMCkgeworCQkJaW5ldF9wcmVmaXggYWRkcjsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoYnJkX2xlbikKKwkJCQlkdXBhcmcoImJyb2FkY2FzdCIsICphcmd2KTsKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICIrIikgPT0gMCkKKwkJCQlicmRfbGVuID0gLTE7CisJCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItIikgPT0gMCkKKwkJCQlicmRfbGVuID0gLTI7CisJCQllbHNlIHsKKwkJCQlnZXRfYWRkcigmYWRkciwgKmFyZ3YsIHJlcS5pZmEuaWZhX2ZhbWlseSk7CisJCQkJaWYgKHJlcS5pZmEuaWZhX2ZhbWlseSA9PSBBRl9VTlNQRUMpCisJCQkJCXJlcS5pZmEuaWZhX2ZhbWlseSA9IGFkZHIuZmFtaWx5OworCQkJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBJRkFfQlJPQURDQVNULCAmYWRkci5kYXRhLCBhZGRyLmJ5dGVsZW4pOworCQkJCWJyZF9sZW4gPSBhZGRyLmJ5dGVsZW47CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiYW55Y2FzdCIpID09IDApIHsKKwkJCWluZXRfcHJlZml4IGFkZHI7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGFueV9sZW4pCisJCQkJZHVwYXJnKCJhbnljYXN0IiwgKmFyZ3YpOworCQkJZ2V0X2FkZHIoJmFkZHIsICphcmd2LCByZXEuaWZhLmlmYV9mYW1pbHkpOworCQkJaWYgKHJlcS5pZmEuaWZhX2ZhbWlseSA9PSBBRl9VTlNQRUMpCisJCQkJcmVxLmlmYS5pZmFfZmFtaWx5ID0gYWRkci5mYW1pbHk7CisJCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgSUZBX0FOWUNBU1QsICZhZGRyLmRhdGEsIGFkZHIuYnl0ZWxlbik7CisJCQlhbnlfbGVuID0gYWRkci5ieXRlbGVuOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInNjb3BlIikgPT0gMCkgeworCQkJdW5zaWduZWQgc2NvcGUgPSAwOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChydG5sX3J0c2NvcGVfYTJuKCZzY29wZSwgKmFyZ3YpKQorCQkJCWludmFyZygiaW52YWxpZCBzY29wZSB2YWx1ZS4iLCAqYXJndik7CisJCQlyZXEuaWZhLmlmYV9zY29wZSA9IHNjb3BlOworCQkJc2NvcGVkID0gMTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJkZXYiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJZCA9ICphcmd2OworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImxhYmVsIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWwgPSAqYXJndjsKKwkJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBJRkFfTEFCRUwsIGwsIHN0cmxlbihsKSsxKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAidmFsaWRfbGZ0IikgPT0gMCkgeworCQkJaWYgKHZhbGlkX2xmdHApCisJCQkJZHVwYXJnKCJ2YWxpZF9sZnQiLCAqYXJndik7CisJCQlORVhUX0FSRygpOworCQkJdmFsaWRfbGZ0cCA9ICphcmd2OworCQkJaWYgKHNldF9saWZldGltZSgmdmFsaWRfbGZ0LCAqYXJndikpCisJCQkJaW52YXJnKCJ2YWxpZF9sZnQgdmFsdWUiLCAqYXJndik7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInByZWZlcnJlZF9sZnQiKSA9PSAwKSB7CisJCQlpZiAocHJlZmVycmVkX2xmdHApCisJCQkJZHVwYXJnKCJwcmVmZXJyZWRfbGZ0IiwgKmFyZ3YpOworCQkJTkVYVF9BUkcoKTsKKwkJCXByZWZlcnJlZF9sZnRwID0gKmFyZ3Y7CisJCQlpZiAoc2V0X2xpZmV0aW1lKCZwcmVmZXJyZWRfbGZ0LCAqYXJndikpCisJCQkJaW52YXJnKCJwcmVmZXJyZWRfbGZ0IHZhbHVlIiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImhvbWUiKSA9PSAwKSB7CisJCQlpZmFfZmxhZ3MgfD0gSUZBX0ZfSE9NRUFERFJFU1M7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibm9kYWQiKSA9PSAwKSB7CisJCQlpZmFfZmxhZ3MgfD0gSUZBX0ZfTk9EQUQ7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibW5ndG1wYWRkciIpID09IDApIHsKKwkJCWlmYV9mbGFncyB8PSBJRkFfRl9NQU5BR0VURU1QQUREUjsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJub3ByZWZpeHJvdXRlIikgPT0gMCkgeworCQkJaWZhX2ZsYWdzIHw9IElGQV9GX05PUFJFRklYUk9VVEU7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiYXV0b2pvaW4iKSA9PSAwKSB7CisJCQlpZmFfZmxhZ3MgfD0gSUZBX0ZfTUNBVVRPSk9JTjsKKwkJfSBlbHNlIHsKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJsb2NhbCIpID09IDApIHsKKwkJCQlORVhUX0FSRygpOworCQkJfQorCQkJaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkKKwkJCQl1c2FnZSgpOworCQkJaWYgKGxvY2FsX2xlbikKKwkJCQlkdXBhcmcyKCJsb2NhbCIsICphcmd2KTsKKwkJCWxjbF9hcmcgPSAqYXJndjsKKwkJCWdldF9wcmVmaXgoJmxjbCwgKmFyZ3YsIHJlcS5pZmEuaWZhX2ZhbWlseSk7CisJCQlpZiAocmVxLmlmYS5pZmFfZmFtaWx5ID09IEFGX1VOU1BFQykKKwkJCQlyZXEuaWZhLmlmYV9mYW1pbHkgPSBsY2wuZmFtaWx5OworCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIElGQV9MT0NBTCwgJmxjbC5kYXRhLCBsY2wuYnl0ZWxlbik7CisJCQlsb2NhbF9sZW4gPSBsY2wuYnl0ZWxlbjsKKwkJfQorCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisJaWYgKGlmYV9mbGFncyA8PSAweGZmKQorCQlyZXEuaWZhLmlmYV9mbGFncyA9IGlmYV9mbGFnczsKKwllbHNlCisJCWFkZGF0dHIzMigmcmVxLm4sIHNpemVvZihyZXEpLCBJRkFfRkxBR1MsIGlmYV9mbGFncyk7CisKKwlpZiAoZCA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm90IGVub3VnaCBpbmZvcm1hdGlvbjogXCJkZXZcIiBhcmd1bWVudCBpcyByZXF1aXJlZC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChsICYmIG1hdGNoZXMoZCwgbCkgIT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlwiZGV2XCIgKCVzKSBtdXN0IG1hdGNoIFwibGFiZWxcIiAoJXMpLlxuIiwgZCwgbCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAocGVlcl9sZW4gPT0gMCAmJiBsb2NhbF9sZW4pIHsKKwkJaWYgKGNtZCA9PSBSVE1fREVMQUREUiAmJiBsY2wuZmFtaWx5ID09IEFGX0lORVQgJiYgIShsY2wuZmxhZ3MgJiBQUkVGSVhMRU5fU1BFQ0lGSUVEKSkgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkgICAgIldhcm5pbmc6IEV4ZWN1dGluZyB3aWxkY2FyZCBkZWxldGlvbiB0byBzdGF5IGNvbXBhdGlibGUgd2l0aCBvbGQgc2NyaXB0cy5cbiIgXAorCQkJICAgICIgICAgICAgICBFeHBsaWNpdGx5IHNwZWNpZnkgdGhlIHByZWZpeCBsZW5ndGggKCVzLyVkKSB0byBhdm9pZCB0aGlzIHdhcm5pbmcuXG4iIFwKKwkJCSAgICAiICAgICAgICAgVGhpcyBzcGVjaWFsIGJlaGF2aW91ciBpcyBsaWtlbHkgdG8gZGlzYXBwZWFyIGluIGZ1cnRoZXIgcmVsZWFzZXMsXG4iIFwKKwkJCSAgICAiICAgICAgICAgZml4IHlvdXIgc2NyaXB0cyFcbiIsIGxjbF9hcmcsIGxvY2FsX2xlbio4KTsKKwkJfSBlbHNlIHsKKwkJCXBlZXIgPSBsY2w7CisJCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgSUZBX0FERFJFU1MsICZsY2wuZGF0YSwgbGNsLmJ5dGVsZW4pOworCQl9CisJfQorCWlmIChyZXEuaWZhLmlmYV9wcmVmaXhsZW4gPT0gMCkKKwkJcmVxLmlmYS5pZmFfcHJlZml4bGVuID0gbGNsLmJpdGxlbjsKKworCWlmIChicmRfbGVuIDwgMCAmJiBjbWQgIT0gUlRNX0RFTEFERFIpIHsKKwkJaW5ldF9wcmVmaXggYnJkOworCQlpbnQgaTsKKwkJaWYgKHJlcS5pZmEuaWZhX2ZhbWlseSAhPSBBRl9JTkVUKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkJyb2FkY2FzdCBjYW4gYmUgc2V0IG9ubHkgZm9yIElQdjQgYWRkcmVzc2VzXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlicmQgPSBwZWVyOworCQlpZiAoYnJkLmJpdGxlbiA8PSAzMCkgeworCQkJZm9yIChpID0gMzE7IGkgPj0gYnJkLmJpdGxlbjsgaS0tKSB7CisJCQkJaWYgKGJyZF9sZW4gPT0gLTEpCisJCQkJCWJyZC5kYXRhWzBdIHw9IGh0b25sKDE8PCgzMS1pKSk7CisJCQkJZWxzZQorCQkJCQlicmQuZGF0YVswXSAmPSB+aHRvbmwoMTw8KDMxLWkpKTsKKwkJCX0KKwkJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBJRkFfQlJPQURDQVNULCAmYnJkLmRhdGEsIGJyZC5ieXRlbGVuKTsKKwkJCWJyZF9sZW4gPSBicmQuYnl0ZWxlbjsKKwkJfQorCX0KKwlpZiAoIXNjb3BlZCAmJiBjbWQgIT0gUlRNX0RFTEFERFIpCisJCXJlcS5pZmEuaWZhX3Njb3BlID0gZGVmYXVsdF9zY29wZSgmbGNsKTsKKworCWlmICgocmVxLmlmYS5pZmFfaW5kZXggPSBsbF9uYW1lX3RvX2luZGV4KGQpKSA9PSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IGZpbmQgZGV2aWNlIFwiJXNcIlxuIiwgZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAodmFsaWRfbGZ0cCB8fCBwcmVmZXJyZWRfbGZ0cCkgeworCQlpZiAoIXZhbGlkX2xmdCkgeworCQkJZnByaW50ZihzdGRlcnIsICJ2YWxpZF9sZnQgaXMgemVyb1xuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKHZhbGlkX2xmdCA8IHByZWZlcnJlZF9sZnQpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAicHJlZmVycmVkX2xmdCBpcyBncmVhdGVyIHRoYW4gdmFsaWRfbGZ0XG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCW1lbXNldCgmY2luZm8sIDAsIHNpemVvZihjaW5mbykpOworCQljaW5mby5pZmFfcHJlZmVyZWQgPSBwcmVmZXJyZWRfbGZ0OworCQljaW5mby5pZmFfdmFsaWQgPSB2YWxpZF9sZnQ7CisJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBJRkFfQ0FDSEVJTkZPLCAmY2luZm8sCisJCQkgIHNpemVvZihjaW5mbykpOworCX0KKworCWlmICgoaWZhX2ZsYWdzICYgSUZBX0ZfTUNBVVRPSk9JTikgJiYgIWlwYWRkcl9pc19tdWx0aWNhc3QoJmxjbCkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJhdXRvam9pbiBuZWVkcyBtdWx0aWNhc3QgYWRkcmVzc1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAocnRubF90YWxrKCZydGgsICZyZXEubiwgTlVMTCwgMCkgPCAwKQorCQlyZXR1cm4gLTI7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRvX2lwYWRkcihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaWYgKGFyZ2MgPCAxKQorCQlyZXR1cm4gaXBhZGRyX2xpc3RfZmx1c2hfb3Jfc2F2ZSgwLCBOVUxMLCBJUEFERF9MSVNUKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgImFkZCIpID09IDApCisJCXJldHVybiBpcGFkZHJfbW9kaWZ5KFJUTV9ORVdBRERSLCBOTE1fRl9DUkVBVEV8TkxNX0ZfRVhDTCwgYXJnYy0xLCBhcmd2KzEpOworCWlmIChtYXRjaGVzKCphcmd2LCAiY2hhbmdlIikgPT0gMCB8fAorCQlzdHJjbXAoKmFyZ3YsICJjaGciKSA9PSAwKQorCQlyZXR1cm4gaXBhZGRyX21vZGlmeShSVE1fTkVXQUREUiwgTkxNX0ZfUkVQTEFDRSwgYXJnYy0xLCBhcmd2KzEpOworCWlmIChtYXRjaGVzKCphcmd2LCAicmVwbGFjZSIpID09IDApCisJCXJldHVybiBpcGFkZHJfbW9kaWZ5KFJUTV9ORVdBRERSLCBOTE1fRl9DUkVBVEV8TkxNX0ZfUkVQTEFDRSwgYXJnYy0xLCBhcmd2KzEpOworCWlmIChtYXRjaGVzKCphcmd2LCAiZGVsZXRlIikgPT0gMCkKKwkJcmV0dXJuIGlwYWRkcl9tb2RpZnkoUlRNX0RFTEFERFIsIDAsIGFyZ2MtMSwgYXJndisxKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgImxpc3QiKSA9PSAwIHx8IG1hdGNoZXMoKmFyZ3YsICJzaG93IikgPT0gMAorCSAgICB8fCBtYXRjaGVzKCphcmd2LCAibHN0IikgPT0gMCkKKwkJcmV0dXJuIGlwYWRkcl9saXN0X2ZsdXNoX29yX3NhdmUoYXJnYy0xLCBhcmd2KzEsIElQQUREX0xJU1QpOworCWlmIChtYXRjaGVzKCphcmd2LCAiZmx1c2giKSA9PSAwKQorCQlyZXR1cm4gaXBhZGRyX2xpc3RfZmx1c2hfb3Jfc2F2ZShhcmdjLTEsIGFyZ3YrMSwgSVBBRERfRkxVU0gpOworCWlmIChtYXRjaGVzKCphcmd2LCAic2F2ZSIpID09IDApCisJCXJldHVybiBpcGFkZHJfbGlzdF9mbHVzaF9vcl9zYXZlKGFyZ2MtMSwgYXJndisxLCBJUEFERF9TQVZFKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgInNob3dkdW1wIikgPT0gMCkKKwkJcmV0dXJuIGlwYWRkcl9zaG93ZHVtcCgpOworCWlmIChtYXRjaGVzKCphcmd2LCAicmVzdG9yZSIpID09IDApCisJCXJldHVybiBpcGFkZHJfcmVzdG9yZSgpOworCWlmIChtYXRjaGVzKCphcmd2LCAiaGVscCIpID09IDApCisJCXVzYWdlKCk7CisJZnByaW50ZihzdGRlcnIsICJDb21tYW5kIFwiJXNcIiBpcyB1bmtub3duLCB0cnkgXCJpcCBhZGRyZXNzIGhlbHBcIi5cbiIsICphcmd2KTsKKwlleGl0KC0xKTsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2lwL2lwYWRkcmxhYmVsLmMgYi9pcHJvdXRlMi9pcC9pcGFkZHJsYWJlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMWJjMjYKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pcC9pcGFkZHJsYWJlbC5jCkBAIC0wLDAgKzEsMjY1IEBACisvKgorICogaXBhZGRybGFiZWwuYwkiaXAgYWRkcmxhYmVsIgorICoKKyAqIENvcHlyaWdodCAoQykyMDA3IFVTQUdJL1dJREUgUHJvamVjdAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXM+LgorICoKKyAqCisgKiBCYXNlZCBvbiBpcHJ1bGUuYy4KKyAqCisgKiBBdXRob3JzOglZT1NISUZVSkkgSGlkZWFraSA8eW9zaGZ1amlAbGludXgtaXB2Ni5vcmc+CisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hZGRybGFiZWwuaD4KKworI2luY2x1ZGUgInJ0X25hbWVzLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJpcF9jb21tb24uaCIKKworI2RlZmluZSBJRkFMX1JUQShyKQkoKHN0cnVjdCBydGF0dHIqKSgoKGNoYXIqKShyKSkgKyBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IGlmYWRkcmxibG1zZykpKSkKKyNkZWZpbmUgSUZBTF9QQVlMT0FEKG4pCU5MTVNHX1BBWUxPQUQobixzaXplb2Yoc3RydWN0IGlmYWRkcmxibG1zZykpCisKK2V4dGVybiBzdHJ1Y3QgcnRubF9oYW5kbGUgcnRoOworCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGlwIGFkZHJsYWJlbCBbIGxpc3QgfCBhZGQgfCBkZWwgfCBmbHVzaCBdIHByZWZpeCBQUkVGSVggWyBkZXYgREVWIF0gWyBsYWJlbCBMQUJFTCBdXG4iKTsKKwlleGl0KC0xKTsKK30KKworaW50IHByaW50X2FkZHJsYWJlbChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobywgc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcpCit7CisJRklMRSAqZnAgPSAoRklMRSopYXJnOworCXN0cnVjdCBpZmFkZHJsYmxtc2cgKmlmYWwgPSBOTE1TR19EQVRBKG4pOworCWludCBsZW4gPSBuLT5ubG1zZ19sZW47CisJc3RydWN0IHJ0YXR0ciAqdGJbSUZBTF9NQVgrMV07CisJY2hhciBhYnVmWzI1Nl07CisKKwlpZiAobi0+bmxtc2dfdHlwZSAhPSBSVE1fTkVXQUREUkxBQkVMICYmIG4tPm5sbXNnX3R5cGUgIT0gUlRNX0RFTEFERFJMQUJFTCkKKwkJcmV0dXJuIDA7CisKKwlsZW4gLT0gTkxNU0dfTEVOR1RIKHNpemVvZigqaWZhbCkpOworCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gLTE7CisKKwlwYXJzZV9ydGF0dHIodGIsIElGQUxfTUFYLCBJRkFMX1JUQShpZmFsKSwgbGVuKTsKKworCWlmIChuLT5ubG1zZ190eXBlID09IFJUTV9ERUxBRERSTEFCRUwpCisJCWZwcmludGYoZnAsICJEZWxldGVkICIpOworCisJaWYgKHRiW0lGQUxfQUREUkVTU10pIHsKKwkJZnByaW50ZihmcCwgInByZWZpeCAlcy8ldSAiLAorCQkJZm9ybWF0X2hvc3QoaWZhbC0+aWZhbF9mYW1pbHksCisJCQkJICAgIFJUQV9QQVlMT0FEKHRiW0lGQUxfQUREUkVTU10pLAorCQkJCSAgICBSVEFfREFUQSh0YltJRkFMX0FERFJFU1NdKSwKKwkJCQkgICAgYWJ1Ziwgc2l6ZW9mKGFidWYpKSwKKwkJCWlmYWwtPmlmYWxfcHJlZml4bGVuKTsKKwl9CisKKwlpZiAoaWZhbC0+aWZhbF9pbmRleCkKKwkJZnByaW50ZihmcCwgImRldiAlcyAiLCBsbF9pbmRleF90b19uYW1lKGlmYWwtPmlmYWxfaW5kZXgpKTsKKworCWlmICh0YltJRkFMX0xBQkVMXSAmJiBSVEFfUEFZTE9BRCh0YltJRkFMX0xBQkVMXSkgPT0gc2l6ZW9mKHVpbnQzMl90KSkgeworCQl1aW50MzJfdCBsYWJlbDsKKwkJbWVtY3B5KCZsYWJlbCwgUlRBX0RBVEEodGJbSUZBTF9MQUJFTF0pLCBzaXplb2YobGFiZWwpKTsKKwkJZnByaW50ZihmcCwgImxhYmVsICV1ICIsIGxhYmVsKTsKKwl9CisKKwlmcHJpbnRmKGZwLCAiXG4iKTsKKwlmZmx1c2goZnApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwYWRkcmxhYmVsX2xpc3QoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBhZiA9IHByZWZlcnJlZF9mYW1pbHk7CisKKwlpZiAoYWYgPT0gQUZfVU5TUEVDKQorCQlhZiA9IEFGX0lORVQ2OworCisJaWYgKGFyZ2MgPiAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiXCJpcCBhZGRybGFiZWwgc2hvd1wiIGRvZXMgbm90IHRha2UgYW55IGFyZ3VtZW50cy5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHJ0bmxfd2lsZGR1bXBfcmVxdWVzdCgmcnRoLCBhZiwgUlRNX0dFVEFERFJMQUJFTCkgPCAwKSB7CisJCXBlcnJvcigiQ2Fubm90IHNlbmQgZHVtcCByZXF1ZXN0Iik7CisJCXJldHVybiAxOworCX0KKworCWlmIChydG5sX2R1bXBfZmlsdGVyKCZydGgsIHByaW50X2FkZHJsYWJlbCwgc3Rkb3V0KSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJEdW1wIHRlcm1pbmF0ZWRcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGlwYWRkcmxhYmVsX21vZGlmeShpbnQgY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyCW47CisJCXN0cnVjdCBpZmFkZHJsYmxtc2cJaWZhbDsKKwkJY2hhciAgCQkJYnVmWzEwMjRdOworCX0gcmVxOworCisJaW5ldF9wcmVmaXggcHJlZml4OworCXVpbnQzMl90IGxhYmVsID0gMHhmZmZmZmZmZlVMOworCWNoYXIgKnAgPSBOVUxMOworCWNoYXIgKmwgPSBOVUxMOworCisJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKwltZW1zZXQoJnByZWZpeCwgMCwgc2l6ZW9mKHByZWZpeCkpOworCisJcmVxLm4ubmxtc2dfdHlwZSA9IGNtZDsKKwlyZXEubi5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBpZmFkZHJsYmxtc2cpKTsKKwlyZXEubi5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1Q7CisJcmVxLmlmYWwuaWZhbF9mYW1pbHkgPSBwcmVmZXJyZWRfZmFtaWx5OworCXJlcS5pZmFsLmlmYWxfcHJlZml4bGVuID0gMDsKKwlyZXEuaWZhbC5pZmFsX2luZGV4ID0gMDsKKworCWlmIChjbWQgPT0gUlRNX05FV0FERFJMQUJFTCkgeworCQlyZXEubi5ubG1zZ19mbGFncyB8PSBOTE1fRl9DUkVBVEV8TkxNX0ZfRVhDTDsKKwl9CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgInByZWZpeCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlwID0gKmFyZ3Y7CisJCQlnZXRfcHJlZml4KCZwcmVmaXgsICphcmd2LCBwcmVmZXJyZWRfZmFtaWx5KTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJkZXYiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKChyZXEuaWZhbC5pZmFsX2luZGV4ID0gbGxfbmFtZV90b19pbmRleCgqYXJndikpID09IDApCisJCQkJaW52YXJnKCJkZXYgaXMgaW52YWxpZFxuIiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImxhYmVsIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWwgPSAqYXJndjsKKwkJCWlmIChnZXRfdTMyKCZsYWJlbCwgKmFyZ3YsIDApIHx8IGxhYmVsID09IDB4ZmZmZmZmZmZVTCkKKwkJCQlpbnZhcmcoImxhYmVsIGlzIGludmFsaWRcbiIsICphcmd2KTsKKwkJfQorCQlhcmdjLS07CisJCWFyZ3YrKzsKKwl9CisJaWYgKHAgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vdCBlbm91Z2ggaW5mb3JtYXRpb246IFwicHJlZml4XCIgYXJndW1lbnQgaXMgcmVxdWlyZWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAobCA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm90IGVub3VnaCBpbmZvcm1hdGlvbjogXCJsYWJlbFwiIGFyZ3VtZW50IGlzIHJlcXVpcmVkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJYWRkYXR0cjMyKCZyZXEubiwgc2l6ZW9mKHJlcSksIElGQUxfTEFCRUwsIGxhYmVsKTsKKwlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgSUZBTF9BRERSRVNTLCAmcHJlZml4LmRhdGEsIHByZWZpeC5ieXRlbGVuKTsKKwlyZXEuaWZhbC5pZmFsX3ByZWZpeGxlbiA9IHByZWZpeC5iaXRsZW47CisKKwlpZiAocmVxLmlmYWwuaWZhbF9mYW1pbHkgPT0gQUZfVU5TUEVDKQorCQlyZXEuaWZhbC5pZmFsX2ZhbWlseSA9IEFGX0lORVQ2OworCisJaWYgKHJ0bmxfdGFsaygmcnRoLCAmcmVxLm4sIE5VTEwsIDApIDwgMCkKKwkJcmV0dXJuIC0yOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBmbHVzaF9hZGRybGFiZWwoY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8sIHN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBydG5sX2hhbmRsZSBydGgyOworCXN0cnVjdCBydG1zZyAqciA9IE5MTVNHX0RBVEEobik7CisJaW50IGxlbiA9IG4tPm5sbXNnX2xlbjsKKwlzdHJ1Y3QgcnRhdHRyICogdGJbSUZBTF9NQVgrMV07CisKKwlsZW4gLT0gTkxNU0dfTEVOR1RIKHNpemVvZigqcikpOworCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gLTE7CisKKwlwYXJzZV9ydGF0dHIodGIsIElGQUxfTUFYLCBSVE1fUlRBKHIpLCBsZW4pOworCisJaWYgKHRiW0lGQUxfQUREUkVTU10pIHsKKwkJbi0+bmxtc2dfdHlwZSA9IFJUTV9ERUxBRERSTEFCRUw7CisJCW4tPm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVDsKKworCQlpZiAocnRubF9vcGVuKCZydGgyLCAwKSA8IDApCisJCQlyZXR1cm4gLTE7CisKKwkJaWYgKHJ0bmxfdGFsaygmcnRoMiwgbiwgTlVMTCwgMCkgPCAwKQorCQkJcmV0dXJuIC0yOworCisJCXJ0bmxfY2xvc2UoJnJ0aDIpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwYWRkcmxhYmVsX2ZsdXNoKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgYWYgPSBwcmVmZXJyZWRfZmFtaWx5OworCisJaWYgKGFmID09IEFGX1VOU1BFQykKKwkJYWYgPSBBRl9JTkVUNjsKKworCWlmIChhcmdjID4gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlwiaXAgYWRkcmxhYmVsIGZsdXNoXCIgZG9lcyBub3QgYWxsb3cgZXh0cmEgYXJndW1lbnRzXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChydG5sX3dpbGRkdW1wX3JlcXVlc3QoJnJ0aCwgYWYsIFJUTV9HRVRBRERSTEFCRUwpIDwgMCkgeworCQlwZXJyb3IoIkNhbm5vdCBzZW5kIGR1bXAgcmVxdWVzdCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHJ0bmxfZHVtcF9maWx0ZXIoJnJ0aCwgZmx1c2hfYWRkcmxhYmVsLCBOVUxMKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJGbHVzaCB0ZXJtaW5hdGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgZG9faXBhZGRybGFiZWwoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWlmIChhcmdjIDwgMSkgeworCQlyZXR1cm4gaXBhZGRybGFiZWxfbGlzdCgwLCBOVUxMKTsKKwl9IGVsc2UgaWYgKG1hdGNoZXMoYXJndlswXSwgImxpc3QiKSA9PSAwIHx8CisJCSAgIG1hdGNoZXMoYXJndlswXSwgImxzdCIpID09IDAgfHwKKwkJICAgbWF0Y2hlcyhhcmd2WzBdLCAic2hvdyIpID09IDApIHsKKwkJcmV0dXJuIGlwYWRkcmxhYmVsX2xpc3QoYXJnYy0xLCBhcmd2KzEpOworCX0gZWxzZSBpZiAobWF0Y2hlcyhhcmd2WzBdLCAiYWRkIikgPT0gMCkgeworCQlyZXR1cm4gaXBhZGRybGFiZWxfbW9kaWZ5KFJUTV9ORVdBRERSTEFCRUwsIGFyZ2MtMSwgYXJndisxKTsKKwl9IGVsc2UgaWYgKG1hdGNoZXMoYXJndlswXSwgImRlbGV0ZSIpID09IDApIHsKKwkJcmV0dXJuIGlwYWRkcmxhYmVsX21vZGlmeShSVE1fREVMQUREUkxBQkVMLCBhcmdjLTEsIGFyZ3YrMSk7CisJfSBlbHNlIGlmIChtYXRjaGVzKGFyZ3ZbMF0sICJmbHVzaCIpID09IDApIHsKKwkJcmV0dXJuIGlwYWRkcmxhYmVsX2ZsdXNoKGFyZ2MtMSwgYXJndisxKTsKKwl9IGVsc2UgaWYgKG1hdGNoZXMoYXJndlswXSwgImhlbHAiKSA9PSAwKQorCQl1c2FnZSgpOworCisJZnByaW50ZihzdGRlcnIsICJDb21tYW5kIFwiJXNcIiBpcyB1bmtub3duLCB0cnkgXCJpcCBhZGRybGFiZWwgaGVscFwiLlxuIiwgKmFyZ3YpOworCWV4aXQoLTEpOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaXAvaXBmb3UuYyBiL2lwcm91dGUyL2lwL2lwZm91LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE4NmIxOAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2lwL2lwZm91LmMKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBpcGZvdS5jCUZPVSAoZm9vIG92ZXIgVURQKSBzdXBwb3J0CisgKgorICogICAgICAgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgICAgICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICAgICAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAgICAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJVG9tIEhlcmJlcnQgPHRoZXJiZXJ0QGdvb2dsZS5jb20+CisgKi8KKworI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9mb3UuaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSAibGliZ2VubC5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiaXBfY29tbW9uLmgiCisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogaXAgZm91IGFkZCBwb3J0IFBPUlQgeyBpcHByb3RvIFBST1RPICB8IGd1ZSB9XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBpcCBmb3UgZGVsIHBvcnQgUE9SVFxuIik7CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworCWZwcmludGYoc3RkZXJyLCAiV2hlcmU6IFBST1RPIHsgaXBwcm90by1uYW1lIHwgMS4uMjU1IH1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgIFBPUlQgeyAxLi42NTUzNSB9XG4iKTsKKworCWV4aXQoLTEpOworfQorCisvKiBuZXRsaW5rIHNvY2tldCAqLworc3RhdGljIHN0cnVjdCBydG5sX2hhbmRsZSBnZW5sX3J0aCA9IHsgLmZkID0gLTEgfTsKK3N0YXRpYyBpbnQgZ2VubF9mYW1pbHkgPSAtMTsKKworI2RlZmluZSBGT1VfUkVRVUVTVChfcmVxLCBfYnVmc2l6LCBfY21kLCBfZmxhZ3MpCVwKKwlHRU5MX1JFUVVFU1QoX3JlcSwgX2J1ZnNpeiwgZ2VubF9mYW1pbHksIDAsCVwKKwkJICAgICBGT1VfR0VOTF9WRVJTSU9OLCBfY21kLCBfZmxhZ3MpCisKK3N0YXRpYyBpbnQgZm91X3BhcnNlX29wdChpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBubG1zZ2hkciAqbiwKKwkJCSBib29sIGFkZGluZykKK3sKKwlfX3UxNiBwb3J0OworCWludCBwb3J0X3NldCA9IDA7CisJX191OCBpcHByb3RvLCB0eXBlOworCWJvb2wgZ3VlX3NldCA9IGZhbHNlOworCWludCBpcHByb3RvX3NldCA9IDA7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKCFtYXRjaGVzKCphcmd2LCAicG9ydCIpKSB7CisJCQlORVhUX0FSRygpOworCisJCQlpZiAoZ2V0X3UxNigmcG9ydCwgKmFyZ3YsIDApIHx8IHBvcnQgPT0gMCkKKwkJCQlpbnZhcmcoImludmFsaWQgcG9ydCIsICphcmd2KTsKKwkJCXBvcnQgPSBodG9ucyhwb3J0KTsKKwkJCXBvcnRfc2V0ID0gMTsKKwkJfSBlbHNlIGlmICghbWF0Y2hlcygqYXJndiwgImlwcHJvdG8iKSkgeworCQkJc3RydWN0IHByb3RvZW50ICpzZXJ2cHRyOworCisJCQlORVhUX0FSRygpOworCisJCQlzZXJ2cHRyID0gZ2V0cHJvdG9ieW5hbWUoKmFyZ3YpOworCQkJaWYgKHNlcnZwdHIpCisJCQkJaXBwcm90byA9IHNlcnZwdHItPnBfcHJvdG87CisJCQllbHNlIGlmIChnZXRfdTgoJmlwcHJvdG8sICphcmd2LCAwKSB8fCBpcHByb3RvID09IDApCisJCQkJaW52YXJnKCJpbnZhbGlkIGlwcHJvdG8iLCAqYXJndik7CisJCQlpcHByb3RvX3NldCA9IDE7CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJndWUiKSkgeworCQkJZ3VlX3NldCA9IHRydWU7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImZvdTogdW5rbm93biBjb21tYW5kIFwiJXNcIj9cbiIsICphcmd2KTsKKwkJCXVzYWdlKCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYXJnYy0tLCBhcmd2Kys7CisJfQorCisJaWYgKCFwb3J0X3NldCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImZvdTogbWlzc2luZyBwb3J0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICghaXBwcm90b19zZXQgJiYgIWd1ZV9zZXQgJiYgYWRkaW5nKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZm91OiBtdXN0IHNldCBpcHByb3RvIG9yIGd1ZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoaXBwcm90b19zZXQgJiYgZ3VlX3NldCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImZvdTogY2Fubm90IHNldCBpcHByb3RvIGFuZCBndWVcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJdHlwZSA9IGd1ZV9zZXQgPyBGT1VfRU5DQVBfR1VFIDogRk9VX0VOQ0FQX0RJUkVDVDsKKworCWFkZGF0dHIxNihuLCAxMDI0LCBGT1VfQVRUUl9QT1JULCBwb3J0KTsKKwlhZGRhdHRyOChuLCAxMDI0LCBGT1VfQVRUUl9UWVBFLCB0eXBlKTsKKworCWlmIChpcHByb3RvX3NldCkKKwkJYWRkYXR0cjgobiwgMTAyNCwgRk9VX0FUVFJfSVBQUk9UTywgaXBwcm90byk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19hZGQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCUZPVV9SRVFVRVNUKHJlcSwgMTAyNCwgRk9VX0NNRF9BREQsIE5MTV9GX1JFUVVFU1QpOworCisJZm91X3BhcnNlX29wdChhcmdjLCBhcmd2LCAmcmVxLm4sIHRydWUpOworCisJaWYgKHJ0bmxfdGFsaygmZ2VubF9ydGgsICZyZXEubiwgTlVMTCwgMCkgPCAwKQorCQlyZXR1cm4gLTI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19kZWwoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCUZPVV9SRVFVRVNUKHJlcSwgMTAyNCwgRk9VX0NNRF9ERUwsIE5MTV9GX1JFUVVFU1QpOworCisJZm91X3BhcnNlX29wdChhcmdjLCBhcmd2LCAmcmVxLm4sIGZhbHNlKTsKKworCWlmIChydG5sX3RhbGsoJmdlbmxfcnRoLCAmcmVxLm4sIE5VTEwsIDApIDwgMCkKKwkJcmV0dXJuIC0yOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkb19pcGZvdShpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaWYgKGdlbmxfZmFtaWx5IDwgMCkgeworCQlpZiAocnRubF9vcGVuX2J5cHJvdG8oJmdlbmxfcnRoLCAwLCBORVRMSU5LX0dFTkVSSUMpIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgb3BlbiBnZW5lcmljIG5ldGxpbmsgc29ja2V0XG4iKTsKKwkJCWV4aXQoMSk7CisJCX0KKworCQlnZW5sX2ZhbWlseSA9IGdlbmxfcmVzb2x2ZV9mYW1pbHkoJmdlbmxfcnRoLCBGT1VfR0VOTF9OQU1FKTsKKwkJaWYgKGdlbmxfZmFtaWx5IDwgMCkKKwkJCWV4aXQoMSk7CisJfQorCisJaWYgKGFyZ2MgPCAxKQorCQl1c2FnZSgpOworCisJaWYgKG1hdGNoZXMoKmFyZ3YsICJhZGQiKSA9PSAwKQorCQlyZXR1cm4gZG9fYWRkKGFyZ2MtMSwgYXJndisxKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgImRlbGV0ZSIpID09IDApCisJCXJldHVybiBkb19kZWwoYXJnYy0xLCBhcmd2KzEpOworCWlmIChtYXRjaGVzKCphcmd2LCAiaGVscCIpID09IDApCisJCXVzYWdlKCk7CisKKwlmcHJpbnRmKHN0ZGVyciwgIkNvbW1hbmQgXCIlc1wiIGlzIHVua25vd24sIHRyeSBcImlwIGZvdSBoZWxwXCIuXG4iLCAqYXJndik7CisJZXhpdCgtMSk7Cit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pcC9pcGwydHAuYyBiL2lwcm91dGUyL2lwL2lwbDJ0cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNTA4ODAKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pcC9pcGwydHAuYwpAQCAtMCwwICsxLDc1MCBAQAorLyoKKyAqIGlwbDJ0cC5jCSAgICAgICAiaXAgbDJ0cCIKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBPcmlnaW5hbCBBdXRob3I6CUphbWVzIENoYXBtYW4gPGpjaGFwbWFuQGthdGFsaXguY29tPgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisKKyNpbmNsdWRlIDxsaW51eC9nZW5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9sMnRwLmg+CisjaW5jbHVkZSAibGliZ2VubC5oIgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJpcF9jb21tb24uaCIKKworZW51bSB7CisJTDJUUF9BREQsCisJTDJUUF9DSEcsCisJTDJUUF9ERUwsCisJTDJUUF9HRVQKK307CisKK3N0cnVjdCBsMnRwX3Bhcm0geworCXVpbnQzMl90IHR1bm5lbF9pZDsKKwl1aW50MzJfdCBwZWVyX3R1bm5lbF9pZDsKKwl1aW50MzJfdCBzZXNzaW9uX2lkOworCXVpbnQzMl90IHBlZXJfc2Vzc2lvbl9pZDsKKwl1aW50MzJfdCBvZmZzZXQ7CisJdWludDMyX3QgcGVlcl9vZmZzZXQ7CisJZW51bSBsMnRwX2VuY2FwX3R5cGUgZW5jYXA7CisJdWludDE2X3QgbG9jYWxfdWRwX3BvcnQ7CisJdWludDE2X3QgcGVlcl91ZHBfcG9ydDsKKwlpbnQgY29va2llX2xlbjsKKwl1aW50OF90IGNvb2tpZVs4XTsKKwlpbnQgcGVlcl9jb29raWVfbGVuOworCXVpbnQ4X3QgcGVlcl9jb29raWVbOF07CisJaW5ldF9wcmVmaXggbG9jYWxfaXA7CisJaW5ldF9wcmVmaXggcGVlcl9pcDsKKworCXVpbnQxNl90IHB3X3R5cGU7CisJdWludDE2X3QgbXR1OworCWludCB1ZHBfY3N1bToxOworCWludCByZWN2X3NlcToxOworCWludCBzZW5kX3NlcToxOworCWludCBsbnNfbW9kZToxOworCWludCBkYXRhX3NlcToyOworCWludCB0dW5uZWw6MTsKKwlpbnQgc2Vzc2lvbjoxOworCWludCByZW9yZGVyX3RpbWVvdXQ7CisJY29uc3QgY2hhciAqaWZuYW1lOworCXVpbnQ4X3QgbDJzcGVjX3R5cGU7CisJdWludDhfdCBsMnNwZWNfbGVuOworfTsKKworc3RydWN0IGwydHBfc3RhdHMgeworCXVpbnQ2NF90IGRhdGFfcnhfcGFja2V0czsKKwl1aW50NjRfdCBkYXRhX3J4X2J5dGVzOworCXVpbnQ2NF90IGRhdGFfcnhfZXJyb3JzOworCXVpbnQ2NF90IGRhdGFfcnhfb29zX3BhY2tldHM7CisJdWludDY0X3QgZGF0YV9yeF9vb3NfZGlzY2FyZHM7CisJdWludDY0X3QgZGF0YV90eF9wYWNrZXRzOworCXVpbnQ2NF90IGRhdGFfdHhfYnl0ZXM7CisJdWludDY0X3QgZGF0YV90eF9lcnJvcnM7Cit9OworCitzdHJ1Y3QgbDJ0cF9kYXRhIHsKKwlzdHJ1Y3QgbDJ0cF9wYXJtIGNvbmZpZzsKKwlzdHJ1Y3QgbDJ0cF9zdGF0cyBzdGF0czsKK307CisKKy8qIG5ldGxpbmsgc29ja2V0ICovCitzdGF0aWMgc3RydWN0IHJ0bmxfaGFuZGxlIGdlbmxfcnRoOworc3RhdGljIGludCBnZW5sX2ZhbWlseSA9IC0xOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5ldGxpbmsgYWN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGNyZWF0ZV90dW5uZWwoc3RydWN0IGwydHBfcGFybSAqcCkKK3sKKwl1aW50MzJfdCBsb2NhbF9hdHRyID0gTDJUUF9BVFRSX0lQX1NBRERSOworCXVpbnQzMl90IHBlZXJfYXR0ciA9IEwyVFBfQVRUUl9JUF9EQUREUjsKKworCUdFTkxfUkVRVUVTVChyZXEsIDEwMjQsIGdlbmxfZmFtaWx5LCAwLCBMMlRQX0dFTkxfVkVSU0lPTiwKKwkJICAgICBMMlRQX0NNRF9UVU5ORUxfQ1JFQVRFLCBOTE1fRl9SRVFVRVNUIHwgTkxNX0ZfQUNLKTsKKworCWFkZGF0dHIzMigmcmVxLm4sIDEwMjQsIEwyVFBfQVRUUl9DT05OX0lELCBwLT50dW5uZWxfaWQpOworCWFkZGF0dHIzMigmcmVxLm4sIDEwMjQsIEwyVFBfQVRUUl9QRUVSX0NPTk5fSUQsIHAtPnBlZXJfdHVubmVsX2lkKTsKKwlhZGRhdHRyOCgmcmVxLm4sIDEwMjQsIEwyVFBfQVRUUl9QUk9UT19WRVJTSU9OLCAzKTsKKwlhZGRhdHRyMTYoJnJlcS5uLCAxMDI0LCBMMlRQX0FUVFJfRU5DQVBfVFlQRSwgcC0+ZW5jYXApOworCisJaWYgKHAtPmxvY2FsX2lwLmZhbWlseSA9PSBBRl9JTkVUNikKKwkJbG9jYWxfYXR0ciA9IEwyVFBfQVRUUl9JUDZfU0FERFI7CisJYWRkYXR0cl9sKCZyZXEubiwgMTAyNCwgbG9jYWxfYXR0ciwgJnAtPmxvY2FsX2lwLmRhdGEsIHAtPmxvY2FsX2lwLmJ5dGVsZW4pOworCisJaWYgKHAtPnBlZXJfaXAuZmFtaWx5ID09IEFGX0lORVQ2KQorCQlwZWVyX2F0dHIgPSBMMlRQX0FUVFJfSVA2X0RBRERSOworCWFkZGF0dHJfbCgmcmVxLm4sIDEwMjQsIHBlZXJfYXR0ciwgJnAtPnBlZXJfaXAuZGF0YSwgcC0+cGVlcl9pcC5ieXRlbGVuKTsKKworCWlmIChwLT5lbmNhcCA9PSBMMlRQX0VOQ0FQVFlQRV9VRFApIHsKKwkJYWRkYXR0cjE2KCZyZXEubiwgMTAyNCwgTDJUUF9BVFRSX1VEUF9TUE9SVCwgcC0+bG9jYWxfdWRwX3BvcnQpOworCQlhZGRhdHRyMTYoJnJlcS5uLCAxMDI0LCBMMlRQX0FUVFJfVURQX0RQT1JULCBwLT5wZWVyX3VkcF9wb3J0KTsKKwl9CisKKwlpZiAocnRubF90YWxrKCZnZW5sX3J0aCwgJnJlcS5uLCBOVUxMLCAwKSA8IDApCisJCXJldHVybiAtMjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlbGV0ZV90dW5uZWwoc3RydWN0IGwydHBfcGFybSAqcCkKK3sKKwlHRU5MX1JFUVVFU1QocmVxLCAxMjgsIGdlbmxfZmFtaWx5LCAwLCBMMlRQX0dFTkxfVkVSU0lPTiwKKwkJICAgICBMMlRQX0NNRF9UVU5ORUxfREVMRVRFLCBOTE1fRl9SRVFVRVNUIHwgTkxNX0ZfQUNLKTsKKworCWFkZGF0dHIzMigmcmVxLm4sIDEyOCwgTDJUUF9BVFRSX0NPTk5fSUQsIHAtPnR1bm5lbF9pZCk7CisKKwlpZiAocnRubF90YWxrKCZnZW5sX3J0aCwgJnJlcS5uLCBOVUxMLCAwKSA8IDApCisJCXJldHVybiAtMjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNyZWF0ZV9zZXNzaW9uKHN0cnVjdCBsMnRwX3Bhcm0gKnApCit7CisJR0VOTF9SRVFVRVNUKHJlcSwgMTAyNCwgZ2VubF9mYW1pbHksIDAsIEwyVFBfR0VOTF9WRVJTSU9OLAorCQkgICAgIEwyVFBfQ01EX1NFU1NJT05fQ1JFQVRFLCBOTE1fRl9SRVFVRVNUIHwgTkxNX0ZfQUNLKTsKKworCWFkZGF0dHIzMigmcmVxLm4sIDEwMjQsIEwyVFBfQVRUUl9DT05OX0lELCBwLT50dW5uZWxfaWQpOworCWFkZGF0dHIzMigmcmVxLm4sIDEwMjQsIEwyVFBfQVRUUl9QRUVSX0NPTk5fSUQsIHAtPnBlZXJfdHVubmVsX2lkKTsKKwlhZGRhdHRyMzIoJnJlcS5uLCAxMDI0LCBMMlRQX0FUVFJfU0VTU0lPTl9JRCwgcC0+c2Vzc2lvbl9pZCk7CisJYWRkYXR0cjMyKCZyZXEubiwgMTAyNCwgTDJUUF9BVFRSX1BFRVJfU0VTU0lPTl9JRCwgcC0+cGVlcl9zZXNzaW9uX2lkKTsKKwlhZGRhdHRyMTYoJnJlcS5uLCAxMDI0LCBMMlRQX0FUVFJfUFdfVFlQRSwgcC0+cHdfdHlwZSk7CisJYWRkYXR0cjgoJnJlcS5uLCAxMDI0LCBMMlRQX0FUVFJfTDJTUEVDX1RZUEUsIHAtPmwyc3BlY190eXBlKTsKKwlhZGRhdHRyOCgmcmVxLm4sIDEwMjQsIEwyVFBfQVRUUl9MMlNQRUNfTEVOLCBwLT5sMnNwZWNfbGVuKTsKKworCWlmIChwLT5tdHUpCQlhZGRhdHRyMTYoJnJlcS5uLCAxMDI0LCBMMlRQX0FUVFJfTVRVLCBwLT5tdHUpOworCWlmIChwLT5yZWN2X3NlcSkJYWRkYXR0cigmcmVxLm4sIDEwMjQsIEwyVFBfQVRUUl9SRUNWX1NFUSk7CisJaWYgKHAtPnNlbmRfc2VxKQlhZGRhdHRyKCZyZXEubiwgMTAyNCwgTDJUUF9BVFRSX1NFTkRfU0VRKTsKKwlpZiAocC0+bG5zX21vZGUpCWFkZGF0dHIoJnJlcS5uLCAxMDI0LCBMMlRQX0FUVFJfTE5TX01PREUpOworCWlmIChwLT5kYXRhX3NlcSkJYWRkYXR0cjgoJnJlcS5uLCAxMDI0LCBMMlRQX0FUVFJfREFUQV9TRVEsIHAtPmRhdGFfc2VxKTsKKwlpZiAocC0+cmVvcmRlcl90aW1lb3V0KSBhZGRhdHRyNjQoJnJlcS5uLCAxMDI0LCBMMlRQX0FUVFJfUkVDVl9USU1FT1VULAorCQkJCQkgIHAtPnJlb3JkZXJfdGltZW91dCk7CisJaWYgKHAtPm9mZnNldCkJCWFkZGF0dHIxNigmcmVxLm4sIDEwMjQsIEwyVFBfQVRUUl9PRkZTRVQsIHAtPm9mZnNldCk7CisJaWYgKHAtPmNvb2tpZV9sZW4pCWFkZGF0dHJfbCgmcmVxLm4sIDEwMjQsIEwyVFBfQVRUUl9DT09LSUUsCisJCQkJCSAgcC0+Y29va2llLCBwLT5jb29raWVfbGVuKTsKKwlpZiAocC0+cGVlcl9jb29raWVfbGVuKSBhZGRhdHRyX2woJnJlcS5uLCAxMDI0LCBMMlRQX0FUVFJfUEVFUl9DT09LSUUsCisJCQkJCSAgcC0+cGVlcl9jb29raWUsICBwLT5wZWVyX2Nvb2tpZV9sZW4pOworCWlmIChwLT5pZm5hbWUgJiYgcC0+aWZuYW1lWzBdKQorCQlhZGRhdHRyc3RyeigmcmVxLm4sIDEwMjQsIEwyVFBfQVRUUl9JRk5BTUUsIHAtPmlmbmFtZSk7CisKKwlpZiAocnRubF90YWxrKCZnZW5sX3J0aCwgJnJlcS5uLCBOVUxMLCAwKSA8IDApCisJCXJldHVybiAtMjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlbGV0ZV9zZXNzaW9uKHN0cnVjdCBsMnRwX3Bhcm0gKnApCit7CisJR0VOTF9SRVFVRVNUKHJlcSwgMTAyNCwgZ2VubF9mYW1pbHksIDAsIEwyVFBfR0VOTF9WRVJTSU9OLAorCQkgICAgIEwyVFBfQ01EX1NFU1NJT05fREVMRVRFLCBOTE1fRl9SRVFVRVNUIHwgTkxNX0ZfQUNLKTsKKworCWFkZGF0dHIzMigmcmVxLm4sIDEwMjQsIEwyVFBfQVRUUl9DT05OX0lELCBwLT50dW5uZWxfaWQpOworCWFkZGF0dHIzMigmcmVxLm4sIDEwMjQsIEwyVFBfQVRUUl9TRVNTSU9OX0lELCBwLT5zZXNzaW9uX2lkKTsKKwlpZiAocnRubF90YWxrKCZnZW5sX3J0aCwgJnJlcS5uLCBOVUxMLCAwKSA8IDApCisJCXJldHVybiAtMjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcmludF9jb29raWUoY2hhciAqbmFtZSwgY29uc3QgdWludDhfdCAqY29va2llLCBpbnQgbGVuKQoreworCXByaW50ZigiICAlcyAlMDJ4JTAyeCUwMnglMDJ4IiwgbmFtZSwKKwkgICAgICAgY29va2llWzBdLCBjb29raWVbMV0sCisJICAgICAgIGNvb2tpZVsyXSwgY29va2llWzNdKTsKKwlpZiAobGVuID09IDgpCisJCXByaW50ZigiJTAyeCUwMnglMDJ4JTAyeCIsCisJCSAgICAgICBjb29raWVbNF0sIGNvb2tpZVs1XSwKKwkJICAgICAgIGNvb2tpZVs2XSwgY29va2llWzddKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfdHVubmVsKGNvbnN0IHN0cnVjdCBsMnRwX2RhdGEgKmRhdGEpCit7CisJY29uc3Qgc3RydWN0IGwydHBfcGFybSAqcCA9ICZkYXRhLT5jb25maWc7CisJY2hhciBidWZbSU5FVDZfQUREUlNUUkxFTl07CisKKwlwcmludGYoIlR1bm5lbCAldSwgZW5jYXAgJXNcbiIsCisJICAgICAgIHAtPnR1bm5lbF9pZCwKKwkgICAgICAgcC0+ZW5jYXAgPT0gTDJUUF9FTkNBUFRZUEVfVURQID8gIlVEUCIgOgorCSAgICAgICBwLT5lbmNhcCA9PSBMMlRQX0VOQ0FQVFlQRV9JUCA/ICJJUCIgOiAiPz8iKTsKKwlwcmludGYoIiAgRnJvbSAlcyAiLCBpbmV0X250b3AocC0+bG9jYWxfaXAuZmFtaWx5LCBwLT5sb2NhbF9pcC5kYXRhLCBidWYsIHNpemVvZihidWYpKSk7CisJcHJpbnRmKCJ0byAlc1xuIiwgaW5ldF9udG9wKHAtPnBlZXJfaXAuZmFtaWx5LCBwLT5wZWVyX2lwLmRhdGEsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKTsKKwlwcmludGYoIiAgUGVlciB0dW5uZWwgJXVcbiIsCisJICAgICAgIHAtPnBlZXJfdHVubmVsX2lkKTsKKworCWlmIChwLT5lbmNhcCA9PSBMMlRQX0VOQ0FQVFlQRV9VRFApCisJCXByaW50ZigiICBVRFAgc291cmNlIC8gZGVzdCBwb3J0czogJWh1LyVodVxuIiwKKwkJICAgICAgIHAtPmxvY2FsX3VkcF9wb3J0LCBwLT5wZWVyX3VkcF9wb3J0KTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfc2Vzc2lvbihzdHJ1Y3QgbDJ0cF9kYXRhICpkYXRhKQoreworCXN0cnVjdCBsMnRwX3Bhcm0gKnAgPSAmZGF0YS0+Y29uZmlnOworCisJcHJpbnRmKCJTZXNzaW9uICV1IGluIHR1bm5lbCAldVxuIiwKKwkgICAgICAgcC0+c2Vzc2lvbl9pZCwgcC0+dHVubmVsX2lkKTsKKwlwcmludGYoIiAgUGVlciBzZXNzaW9uICV1LCB0dW5uZWwgJXVcbiIsCisJICAgICAgIHAtPnBlZXJfc2Vzc2lvbl9pZCwgcC0+cGVlcl90dW5uZWxfaWQpOworCisJaWYgKHAtPmlmbmFtZSAhPSBOVUxMKSB7CisJCXByaW50ZigiICBpbnRlcmZhY2UgbmFtZTogJXNcbiIsIHAtPmlmbmFtZSk7CisJfQorCXByaW50ZigiICBvZmZzZXQgJXUsIHBlZXIgb2Zmc2V0ICV1XG4iLAorCSAgICAgICBwLT5vZmZzZXQsIHAtPnBlZXJfb2Zmc2V0KTsKKwlpZiAocC0+Y29va2llX2xlbiA+IDApCisJCXByaW50X2Nvb2tpZSgiY29va2llIiwgcC0+Y29va2llLCBwLT5jb29raWVfbGVuKTsKKwlpZiAocC0+cGVlcl9jb29raWVfbGVuID4gMCkKKwkJcHJpbnRfY29va2llKCJwZWVyIGNvb2tpZSIsIHAtPnBlZXJfY29va2llLCBwLT5wZWVyX2Nvb2tpZV9sZW4pOworCisJaWYgKHAtPnJlb3JkZXJfdGltZW91dCAhPSAwKQorCQlwcmludGYoIiAgcmVvcmRlciB0aW1lb3V0OiAldVxuIiwgcC0+cmVvcmRlcl90aW1lb3V0KTsKKwllbHNlCisJCXByaW50ZigiXG4iKTsKK30KKworc3RhdGljIGludCBnZXRfcmVzcG9uc2Uoc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcpCit7CisJc3RydWN0IGdlbmxtc2doZHIgKmdoZHI7CisJc3RydWN0IGwydHBfZGF0YSAqZGF0YSA9IGFyZzsKKwlzdHJ1Y3QgbDJ0cF9wYXJtICpwID0gJmRhdGEtPmNvbmZpZzsKKwlzdHJ1Y3QgcnRhdHRyICphdHRyc1tMMlRQX0FUVFJfTUFYICsgMV07CisJc3RydWN0IHJ0YXR0ciAqbmxhX3N0YXRzOworCWludCBsZW47CisKKwkvKiBWYWxpZGF0ZSBtZXNzYWdlIGFuZCBwYXJzZSBhdHRyaWJ1dGVzICovCisJaWYgKG4tPm5sbXNnX3R5cGUgPT0gTkxNU0dfRVJST1IpCisJCXJldHVybiAtRUJBRE1TRzsKKworCWdoZHIgPSBOTE1TR19EQVRBKG4pOworCWxlbiA9IG4tPm5sbXNnX2xlbiAtIE5MTVNHX0xFTkdUSChzaXplb2YoKmdoZHIpKTsKKwlpZiAobGVuIDwgMCkKKwkJcmV0dXJuIC0xOworCisJcGFyc2VfcnRhdHRyKGF0dHJzLCBMMlRQX0FUVFJfTUFYLCAodm9pZCAqKWdoZHIgKyBHRU5MX0hEUkxFTiwgbGVuKTsKKworCWlmIChhdHRyc1tMMlRQX0FUVFJfUFdfVFlQRV0pCisJCXAtPnB3X3R5cGUgPSBydGFfZ2V0YXR0cl91MTYoYXR0cnNbTDJUUF9BVFRSX1BXX1RZUEVdKTsKKwlpZiAoYXR0cnNbTDJUUF9BVFRSX0VOQ0FQX1RZUEVdKQorCQlwLT5lbmNhcCA9IHJ0YV9nZXRhdHRyX3UxNihhdHRyc1tMMlRQX0FUVFJfRU5DQVBfVFlQRV0pOworCWlmIChhdHRyc1tMMlRQX0FUVFJfT0ZGU0VUXSkKKwkJcC0+b2Zmc2V0ID0gcnRhX2dldGF0dHJfdTE2KGF0dHJzW0wyVFBfQVRUUl9PRkZTRVRdKTsKKwlpZiAoYXR0cnNbTDJUUF9BVFRSX0RBVEFfU0VRXSkKKwkJcC0+ZGF0YV9zZXEgPSBydGFfZ2V0YXR0cl91MTYoYXR0cnNbTDJUUF9BVFRSX0RBVEFfU0VRXSk7CisJaWYgKGF0dHJzW0wyVFBfQVRUUl9DT05OX0lEXSkKKwkJcC0+dHVubmVsX2lkID0gcnRhX2dldGF0dHJfdTMyKGF0dHJzW0wyVFBfQVRUUl9DT05OX0lEXSk7CisJaWYgKGF0dHJzW0wyVFBfQVRUUl9QRUVSX0NPTk5fSURdKQorCQlwLT5wZWVyX3R1bm5lbF9pZCA9IHJ0YV9nZXRhdHRyX3UzMihhdHRyc1tMMlRQX0FUVFJfUEVFUl9DT05OX0lEXSk7CisJaWYgKGF0dHJzW0wyVFBfQVRUUl9TRVNTSU9OX0lEXSkKKwkJcC0+c2Vzc2lvbl9pZCA9IHJ0YV9nZXRhdHRyX3UzMihhdHRyc1tMMlRQX0FUVFJfU0VTU0lPTl9JRF0pOworCWlmIChhdHRyc1tMMlRQX0FUVFJfUEVFUl9TRVNTSU9OX0lEXSkKKwkJcC0+cGVlcl9zZXNzaW9uX2lkID0gcnRhX2dldGF0dHJfdTMyKGF0dHJzW0wyVFBfQVRUUl9QRUVSX1NFU1NJT05fSURdKTsKKwlpZiAoYXR0cnNbTDJUUF9BVFRSX0wyU1BFQ19UWVBFXSkKKwkJcC0+bDJzcGVjX3R5cGUgPSBydGFfZ2V0YXR0cl91OChhdHRyc1tMMlRQX0FUVFJfTDJTUEVDX1RZUEVdKTsKKwlpZiAoYXR0cnNbTDJUUF9BVFRSX0wyU1BFQ19MRU5dKQorCQlwLT5sMnNwZWNfbGVuID0gcnRhX2dldGF0dHJfdTgoYXR0cnNbTDJUUF9BVFRSX0wyU1BFQ19MRU5dKTsKKworCXAtPnVkcF9jc3VtID0gISFhdHRyc1tMMlRQX0FUVFJfVURQX0NTVU1dOworCWlmIChhdHRyc1tMMlRQX0FUVFJfQ09PS0lFXSkKKwkJbWVtY3B5KHAtPmNvb2tpZSwgUlRBX0RBVEEoYXR0cnNbTDJUUF9BVFRSX0NPT0tJRV0pLAorCQkgICAgICAgcC0+Y29va2llX2xlbiA9IFJUQV9QQVlMT0FEKGF0dHJzW0wyVFBfQVRUUl9DT09LSUVdKSk7CisKKwlpZiAoYXR0cnNbTDJUUF9BVFRSX1BFRVJfQ09PS0lFXSkKKwkJbWVtY3B5KHAtPnBlZXJfY29va2llLCBSVEFfREFUQShhdHRyc1tMMlRQX0FUVFJfUEVFUl9DT09LSUVdKSwKKwkJICAgICAgIHAtPnBlZXJfY29va2llX2xlbiA9IFJUQV9QQVlMT0FEKGF0dHJzW0wyVFBfQVRUUl9QRUVSX0NPT0tJRV0pKTsKKworCXAtPnJlY3Zfc2VxID0gISFhdHRyc1tMMlRQX0FUVFJfUkVDVl9TRVFdOworCXAtPnNlbmRfc2VxID0gISFhdHRyc1tMMlRQX0FUVFJfU0VORF9TRVFdOworCisJaWYgKGF0dHJzW0wyVFBfQVRUUl9SRUNWX1RJTUVPVVRdKQorCQlwLT5yZW9yZGVyX3RpbWVvdXQgPSBydGFfZ2V0YXR0cl91NjQoYXR0cnNbTDJUUF9BVFRSX1JFQ1ZfVElNRU9VVF0pOworCWlmIChhdHRyc1tMMlRQX0FUVFJfSVBfU0FERFJdKSB7CisJCXAtPmxvY2FsX2lwLmZhbWlseSA9IEFGX0lORVQ7CisJCXAtPmxvY2FsX2lwLmRhdGFbMF0gPSBydGFfZ2V0YXR0cl91MzIoYXR0cnNbTDJUUF9BVFRSX0lQX1NBRERSXSk7CisJCXAtPmxvY2FsX2lwLmJ5dGVsZW4gPSA0OworCQlwLT5sb2NhbF9pcC5iaXRsZW4gPSAtMTsKKwl9CisJaWYgKGF0dHJzW0wyVFBfQVRUUl9JUF9EQUREUl0pIHsKKwkJcC0+cGVlcl9pcC5mYW1pbHkgPSBBRl9JTkVUOworCQlwLT5wZWVyX2lwLmRhdGFbMF0gPSBydGFfZ2V0YXR0cl91MzIoYXR0cnNbTDJUUF9BVFRSX0lQX0RBRERSXSk7CisJCXAtPnBlZXJfaXAuYnl0ZWxlbiA9IDQ7CisJCXAtPnBlZXJfaXAuYml0bGVuID0gLTE7CisJfQorCWlmIChhdHRyc1tMMlRQX0FUVFJfSVA2X1NBRERSXSkgeworCQlwLT5sb2NhbF9pcC5mYW1pbHkgPSBBRl9JTkVUNjsKKwkJbWVtY3B5KCZwLT5sb2NhbF9pcC5kYXRhLCBSVEFfREFUQShhdHRyc1tMMlRQX0FUVFJfSVA2X1NBRERSXSksCisJCQlwLT5sb2NhbF9pcC5ieXRlbGVuID0gMTYpOworCQlwLT5sb2NhbF9pcC5iaXRsZW4gPSAtMTsKKwl9CisJaWYgKGF0dHJzW0wyVFBfQVRUUl9JUDZfREFERFJdKSB7CisJCXAtPnBlZXJfaXAuZmFtaWx5ID0gQUZfSU5FVDY7CisJCW1lbWNweSgmcC0+cGVlcl9pcC5kYXRhLCBSVEFfREFUQShhdHRyc1tMMlRQX0FUVFJfSVA2X0RBRERSXSksCisJCQlwLT5wZWVyX2lwLmJ5dGVsZW4gPSAxNik7CisJCXAtPnBlZXJfaXAuYml0bGVuID0gLTE7CisJfQorCWlmIChhdHRyc1tMMlRQX0FUVFJfVURQX1NQT1JUXSkKKwkJcC0+bG9jYWxfdWRwX3BvcnQgPSBydGFfZ2V0YXR0cl91MTYoYXR0cnNbTDJUUF9BVFRSX1VEUF9TUE9SVF0pOworCWlmIChhdHRyc1tMMlRQX0FUVFJfVURQX0RQT1JUXSkKKwkJcC0+cGVlcl91ZHBfcG9ydCA9IHJ0YV9nZXRhdHRyX3UxNihhdHRyc1tMMlRQX0FUVFJfVURQX0RQT1JUXSk7CisJaWYgKGF0dHJzW0wyVFBfQVRUUl9NVFVdKQorCQlwLT5tdHUgPSBydGFfZ2V0YXR0cl91MTYoYXR0cnNbTDJUUF9BVFRSX01UVV0pOworCWlmIChhdHRyc1tMMlRQX0FUVFJfSUZOQU1FXSkKKwkJcC0+aWZuYW1lID0gcnRhX2dldGF0dHJfc3RyKGF0dHJzW0wyVFBfQVRUUl9JRk5BTUVdKTsKKworCW5sYV9zdGF0cyA9IGF0dHJzW0wyVFBfQVRUUl9TVEFUU107CisJaWYgKG5sYV9zdGF0cykgeworCQlzdHJ1Y3QgcnRhdHRyICp0YltMMlRQX0FUVFJfU1RBVFNfTUFYICsgMV07CisKKwkJcGFyc2VfcnRhdHRyX25lc3RlZCh0YiwgTDJUUF9BVFRSX1NUQVRTX01BWCwgbmxhX3N0YXRzKTsKKworCQlpZiAodGJbTDJUUF9BVFRSX1RYX1BBQ0tFVFNdKQorCQkJZGF0YS0+c3RhdHMuZGF0YV90eF9wYWNrZXRzID0gcnRhX2dldGF0dHJfdTY0KHRiW0wyVFBfQVRUUl9UWF9QQUNLRVRTXSk7CisJCWlmICh0YltMMlRQX0FUVFJfVFhfQllURVNdKQorCQkJZGF0YS0+c3RhdHMuZGF0YV90eF9ieXRlcyA9IHJ0YV9nZXRhdHRyX3U2NCh0YltMMlRQX0FUVFJfVFhfQllURVNdKTsKKwkJaWYgKHRiW0wyVFBfQVRUUl9UWF9FUlJPUlNdKQorCQkJZGF0YS0+c3RhdHMuZGF0YV90eF9lcnJvcnMgPSBydGFfZ2V0YXR0cl91NjQodGJbTDJUUF9BVFRSX1RYX0VSUk9SU10pOworCQlpZiAodGJbTDJUUF9BVFRSX1JYX1BBQ0tFVFNdKQorCQkJZGF0YS0+c3RhdHMuZGF0YV9yeF9wYWNrZXRzID0gcnRhX2dldGF0dHJfdTY0KHRiW0wyVFBfQVRUUl9SWF9QQUNLRVRTXSk7CisJCWlmICh0YltMMlRQX0FUVFJfUlhfQllURVNdKQorCQkJZGF0YS0+c3RhdHMuZGF0YV9yeF9ieXRlcyA9IHJ0YV9nZXRhdHRyX3U2NCh0YltMMlRQX0FUVFJfUlhfQllURVNdKTsKKwkJaWYgKHRiW0wyVFBfQVRUUl9SWF9FUlJPUlNdKQorCQkJZGF0YS0+c3RhdHMuZGF0YV9yeF9lcnJvcnMgPSBydGFfZ2V0YXR0cl91NjQodGJbTDJUUF9BVFRSX1JYX0VSUk9SU10pOworCQlpZiAodGJbTDJUUF9BVFRSX1JYX1NFUV9ESVNDQVJEU10pCisJCQlkYXRhLT5zdGF0cy5kYXRhX3J4X29vc19kaXNjYXJkcyA9IHJ0YV9nZXRhdHRyX3U2NCh0YltMMlRQX0FUVFJfUlhfU0VRX0RJU0NBUkRTXSk7CisJCWlmICh0YltMMlRQX0FUVFJfUlhfT09TX1BBQ0tFVFNdKQorCQkJZGF0YS0+c3RhdHMuZGF0YV9yeF9vb3NfcGFja2V0cyA9IHJ0YV9nZXRhdHRyX3U2NCh0YltMMlRQX0FUVFJfUlhfT09TX1BBQ0tFVFNdKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXNzaW9uX25sbXNnKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZykKK3sKKwlpbnQgcmV0ID0gZ2V0X3Jlc3BvbnNlKG4sIGFyZyk7CisKKwlpZiAocmV0ID09IDApCisJCXByaW50X3Nlc3Npb24oYXJnKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3Nlc3Npb24oc3RydWN0IGwydHBfZGF0YSAqcCkKK3sKKwlHRU5MX1JFUVVFU1QocmVxLCAxMjgsIGdlbmxfZmFtaWx5LCAwLCBMMlRQX0dFTkxfVkVSU0lPTiwKKwkJICAgICBMMlRQX0NNRF9TRVNTSU9OX0dFVCwKKwkJICAgICBOTE1fRl9ST09UIHwgTkxNX0ZfTUFUQ0ggfCBOTE1fRl9SRVFVRVNUKTsKKworCXJlcS5uLm5sbXNnX3NlcSA9IGdlbmxfcnRoLmR1bXAgPSArK2dlbmxfcnRoLnNlcTsKKworCWlmIChwLT5jb25maWcudHVubmVsX2lkICYmIHAtPmNvbmZpZy5zZXNzaW9uX2lkKSB7CisJCWFkZGF0dHIzMigmcmVxLm4sIDEyOCwgTDJUUF9BVFRSX0NPTk5fSUQsIHAtPmNvbmZpZy50dW5uZWxfaWQpOworCQlhZGRhdHRyMzIoJnJlcS5uLCAxMjgsIEwyVFBfQVRUUl9TRVNTSU9OX0lELCBwLT5jb25maWcuc2Vzc2lvbl9pZCk7CisJfQorCisJaWYgKHJ0bmxfc2VuZCgmZ2VubF9ydGgsICZyZXEsIHJlcS5uLm5sbXNnX2xlbikgPCAwKQorCQlyZXR1cm4gLTI7CisKKwlpZiAocnRubF9kdW1wX2ZpbHRlcigmZ2VubF9ydGgsIHNlc3Npb25fbmxtc2csIHApIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkR1bXAgdGVybWluYXRlZFxuIik7CisJCWV4aXQoMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHVubmVsX25sbXNnKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZykKK3sKKwlpbnQgcmV0ID0gZ2V0X3Jlc3BvbnNlKG4sIGFyZyk7CisKKwlpZiAocmV0ID09IDApCisJCXByaW50X3R1bm5lbChhcmcpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnZXRfdHVubmVsKHN0cnVjdCBsMnRwX2RhdGEgKnApCit7CisJR0VOTF9SRVFVRVNUKHJlcSwgMTAyNCwgZ2VubF9mYW1pbHksIDAsIEwyVFBfR0VOTF9WRVJTSU9OLAorCQkgICAgIEwyVFBfQ01EX1RVTk5FTF9HRVQsCisJCSAgICAgTkxNX0ZfUk9PVCB8IE5MTV9GX01BVENIIHwgTkxNX0ZfUkVRVUVTVCk7CisKKwlyZXEubi5ubG1zZ19zZXEgPSBnZW5sX3J0aC5kdW1wID0gKytnZW5sX3J0aC5zZXE7CisKKwlpZiAocC0+Y29uZmlnLnR1bm5lbF9pZCkKKwkJYWRkYXR0cjMyKCZyZXEubiwgMTAyNCwgTDJUUF9BVFRSX0NPTk5fSUQsIHAtPmNvbmZpZy50dW5uZWxfaWQpOworCisJaWYgKHJ0bmxfc2VuZCgmZ2VubF9ydGgsICZyZXEsIHJlcS5uLm5sbXNnX2xlbikgPCAwKQorCQlyZXR1cm4gLTI7CisKKwlpZiAocnRubF9kdW1wX2ZpbHRlcigmZ2VubF9ydGgsIHR1bm5lbF9ubG1zZywgcCkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRHVtcCB0ZXJtaW5hdGVkXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb21tYW5kIHBhcnNlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGhleChjaGFyIGNoKQoreworCWlmICgoY2ggPj0gJ2EnKSAmJiAoY2ggPD0gJ2YnKSkKKwkJcmV0dXJuIGNoIC0gJ2EnICsgMTA7CisJaWYgKChjaCA+PSAnMCcpICYmIChjaCA8PSAnOScpKQorCQlyZXR1cm4gY2ggLSAnMCc7CisJaWYgKChjaCA+PSAnQScpICYmIChjaCA8PSAnRicpKQorCQlyZXR1cm4gY2ggLSAnQScgKyAxMDsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgaGV4Mm1lbShjb25zdCBjaGFyICpidWYsIHVpbnQ4X3QgKm1lbSwgaW50IGNvdW50KQoreworCWludCBpLCBqOworCWludCBjOworCisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBjb3VudDsgaSsrLCBqICs9IDIpIHsKKwkJYyA9IGhleChidWZbal0pOworCQlpZiAoYyA8IDApCisJCQlnb3RvIGVycjsKKworCQltZW1baV0gPSBjIDw8IDQ7CisKKwkJYyA9IGhleChidWZbaiArIDFdKTsKKwkJaWYgKGMgPCAwKQorCQkJZ290byBlcnI7CisKKwkJbWVtW2ldIHw9IGM7CisJfQorCisJcmV0dXJuIDA7CisKK2VycjoKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogaXAgbDJ0cCBhZGQgdHVubmVsXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICByZW1vdGUgQUREUiBsb2NhbCBBRERSXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICB0dW5uZWxfaWQgSUQgcGVlcl90dW5uZWxfaWQgSURcbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgIFsgZW5jYXAgeyBpcCB8IHVkcCB9IF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgIFsgdWRwX3Nwb3J0IFBPUlQgXSBbIHVkcF9kcG9ydCBQT1JUIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGlwIGwydHAgYWRkIHNlc3Npb24gWyBuYW1lIE5BTUUgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgdHVubmVsX2lkIElEXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICBzZXNzaW9uX2lkIElEIHBlZXJfc2Vzc2lvbl9pZCBJRFxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgWyBjb29raWUgSEVYU1RSIF0gWyBwZWVyX2Nvb2tpZSBIRVhTVFIgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgWyBvZmZzZXQgT0ZGU0VUIF0gWyBwZWVyX29mZnNldCBPRkZTRVQgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgWyBsMnNwZWNfdHlwZSBMMlNQRUMgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgaXAgbDJ0cCBkZWwgdHVubmVsIHR1bm5lbF9pZCBJRFxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgaXAgbDJ0cCBkZWwgc2Vzc2lvbiB0dW5uZWxfaWQgSUQgc2Vzc2lvbl9pZCBJRFxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgaXAgbDJ0cCBzaG93IHR1bm5lbCBbIHR1bm5lbF9pZCBJRCBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBpcCBsMnRwIHNob3cgc2Vzc2lvbiBbIHR1bm5lbF9pZCBJRCBdIFsgc2Vzc2lvbl9pZCBJRCBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJZnByaW50ZihzdGRlcnIsICJXaGVyZTogTkFNRSAgIDo9IFNUUklOR1xuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgQUREUiAgIDo9IHsgSVBfQUREUkVTUyB8IGFueSB9XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBQT1JUICAgOj0geyAwLi42NTUzNSB9XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBJRCAgICAgOj0geyAxLi40Mjk0OTY3Mjk1IH1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgIEhFWFNUUiA6PSB7IDggb3IgMTYgaGV4IGRpZ2l0cyAoNCAvIDggYnl0ZXMpIH1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgIEwyU1BFQyA6PSB7IG5vbmUgfCBkZWZhdWx0IH1cbiIpOworCWV4aXQoLTEpOworfQorCitzdGF0aWMgaW50IHBhcnNlX2FyZ3MoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBpbnQgY21kLCBzdHJ1Y3QgbDJ0cF9wYXJtICpwKQoreworCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKKworCWlmIChhcmdjID09IDApCisJCXVzYWdlKCk7CisKKwkvKiBEZWZhdWx0cyAqLworCXAtPmwyc3BlY190eXBlID0gTDJUUF9MMlNQRUNUWVBFX0RFRkFVTFQ7CisJcC0+bDJzcGVjX2xlbiA9IDQ7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgImVuY2FwIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJpcCIpID09IDApIHsKKwkJCQlwLT5lbmNhcCA9IEwyVFBfRU5DQVBUWVBFX0lQOworCQkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJ1ZHAiKSA9PSAwKSB7CisJCQkJcC0+ZW5jYXAgPSBMMlRQX0VOQ0FQVFlQRV9VRFA7CisJCQl9IGVsc2UgeworCQkJCWZwcmludGYoc3RkZXJyLCAiVW5rbm93biB0dW5uZWwgZW5jYXBzdWxhdGlvbiBcIiVzXCJcbiIsICphcmd2KTsKKwkJCQlleGl0KC0xKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJuYW1lIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCXAtPmlmbmFtZSA9ICphcmd2OworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInJlbW90ZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X2FkZHIoJnAtPnBlZXJfaXAsICphcmd2LCBBRl9VTlNQRUMpKQorCQkJCWludmFyZygiaW52YWxpZCByZW1vdGUgYWRkcmVzc1xuIiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImxvY2FsIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfYWRkcigmcC0+bG9jYWxfaXAsICphcmd2LCBBRl9VTlNQRUMpKQorCQkJCWludmFyZygiaW52YWxpZCBsb2NhbCBhZGRyZXNzXG4iLCAqYXJndik7CisJCX0gZWxzZSBpZiAoKHN0cmNtcCgqYXJndiwgInR1bm5lbF9pZCIpID09IDApIHx8CisJCQkgICAoc3RyY21wKCphcmd2LCAidGlkIikgPT0gMCkpIHsKKwkJCV9fdTMyIHV2YWw7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJnV2YWwsICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoImludmFsaWQgSURcbiIsICphcmd2KTsKKwkJCXAtPnR1bm5lbF9pZCA9IHV2YWw7CisJCX0gZWxzZSBpZiAoKHN0cmNtcCgqYXJndiwgInBlZXJfdHVubmVsX2lkIikgPT0gMCkgfHwKKwkJCSAgIChzdHJjbXAoKmFyZ3YsICJwdGlkIikgPT0gMCkpIHsKKwkJCV9fdTMyIHV2YWw7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJnV2YWwsICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoImludmFsaWQgSURcbiIsICphcmd2KTsKKwkJCXAtPnBlZXJfdHVubmVsX2lkID0gdXZhbDsKKwkJfSBlbHNlIGlmICgoc3RyY21wKCphcmd2LCAic2Vzc2lvbl9pZCIpID09IDApIHx8CisJCQkgICAoc3RyY21wKCphcmd2LCAic2lkIikgPT0gMCkpIHsKKwkJCV9fdTMyIHV2YWw7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJnV2YWwsICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoImludmFsaWQgSURcbiIsICphcmd2KTsKKwkJCXAtPnNlc3Npb25faWQgPSB1dmFsOworCQl9IGVsc2UgaWYgKChzdHJjbXAoKmFyZ3YsICJwZWVyX3Nlc3Npb25faWQiKSA9PSAwKSB8fAorCQkJICAgKHN0cmNtcCgqYXJndiwgInBzaWQiKSA9PSAwKSkgeworCQkJX191MzIgdXZhbDsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmdXZhbCwgKmFyZ3YsIDApKQorCQkJCWludmFyZygiaW52YWxpZCBJRFxuIiwgKmFyZ3YpOworCQkJcC0+cGVlcl9zZXNzaW9uX2lkID0gdXZhbDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJ1ZHBfc3BvcnQiKSA9PSAwKSB7CisJCQlfX3UxNiB1dmFsOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTE2KCZ1dmFsLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJpbnZhbGlkIHBvcnRcbiIsICphcmd2KTsKKwkJCXAtPmxvY2FsX3VkcF9wb3J0ID0gdXZhbDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJ1ZHBfZHBvcnQiKSA9PSAwKSB7CisJCQlfX3UxNiB1dmFsOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTE2KCZ1dmFsLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJpbnZhbGlkIHBvcnRcbiIsICphcmd2KTsKKwkJCXAtPnBlZXJfdWRwX3BvcnQgPSB1dmFsOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm9mZnNldCIpID09IDApIHsKKwkJCV9fdTggdXZhbDsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3U4KCZ1dmFsLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJpbnZhbGlkIG9mZnNldFxuIiwgKmFyZ3YpOworCQkJcC0+b2Zmc2V0ID0gdXZhbDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJwZWVyX29mZnNldCIpID09IDApIHsKKwkJCV9fdTggdXZhbDsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3U4KCZ1dmFsLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJpbnZhbGlkIG9mZnNldFxuIiwgKmFyZ3YpOworCQkJcC0+cGVlcl9vZmZzZXQgPSB1dmFsOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImNvb2tpZSIpID09IDApIHsKKwkJCWludCBzbGVuOworCQkJTkVYVF9BUkcoKTsKKwkJCXNsZW4gPSBzdHJsZW4oKmFyZ3YpOworCQkJaWYgKChzbGVuICE9IDgpICYmIChzbGVuICE9IDE2KSkKKwkJCQlpbnZhcmcoImNvb2tpZSBtdXN0IGJlIGVpdGhlciA4IG9yIDE2IGhleCBkaWdpdHNcbiIsICphcmd2KTsKKworCQkJcC0+Y29va2llX2xlbiA9IHNsZW4gLyAyOworCQkJaWYgKGhleDJtZW0oKmFyZ3YsIHAtPmNvb2tpZSwgcC0+Y29va2llX2xlbikgPCAwKQorCQkJCWludmFyZygiY29va2llIG11c3QgYmUgYSBoZXggc3RyaW5nXG4iLCAqYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAicGVlcl9jb29raWUiKSA9PSAwKSB7CisJCQlpbnQgc2xlbjsKKwkJCU5FWFRfQVJHKCk7CisJCQlzbGVuID0gc3RybGVuKCphcmd2KTsKKwkJCWlmICgoc2xlbiAhPSA4KSAmJiAoc2xlbiAhPSAxNikpCisJCQkJaW52YXJnKCJjb29raWUgbXVzdCBiZSBlaXRoZXIgOCBvciAxNiBoZXggZGlnaXRzXG4iLCAqYXJndik7CisKKwkJCXAtPnBlZXJfY29va2llX2xlbiA9IHNsZW4gLyAyOworCQkJaWYgKGhleDJtZW0oKmFyZ3YsIHAtPnBlZXJfY29va2llLCBwLT5wZWVyX2Nvb2tpZV9sZW4pIDwgMCkKKwkJCQlpbnZhcmcoImNvb2tpZSBtdXN0IGJlIGEgaGV4IHN0cmluZ1xuIiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImwyc3BlY190eXBlIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChzdHJjYXNlY21wKCphcmd2LCAiZGVmYXVsdCIpID09IDApIHsKKwkJCQlwLT5sMnNwZWNfdHlwZSA9IEwyVFBfTDJTUEVDVFlQRV9ERUZBVUxUOworCQkJCXAtPmwyc3BlY19sZW4gPSA0OworCQkJfSBlbHNlIGlmIChzdHJjYXNlY21wKCphcmd2LCAibm9uZSIpID09IDApIHsKKwkJCQlwLT5sMnNwZWNfdHlwZSA9IEwyVFBfTDJTUEVDVFlQRV9OT05FOworCQkJCXAtPmwyc3BlY19sZW4gPSAwOworCQkJfSBlbHNlIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gbGF5ZXIyc3BlY2lmaWMgaGVhZGVyIHR5cGUgXCIlc1wiXG4iLCAqYXJndik7CisJCQkJZXhpdCgtMSk7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAidHVubmVsIikgPT0gMCkgeworCQkJcC0+dHVubmVsID0gMTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJzZXNzaW9uIikgPT0gMCkgeworCQkJcC0+c2Vzc2lvbiA9IDE7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKSB7CisJCQl1c2FnZSgpOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJVbmtub3duIGNvbW1hbmQ6ICVzXG4iLCAqYXJndik7CisJCQl1c2FnZSgpOworCQl9CisKKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBkb19hZGQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBsMnRwX3Bhcm0gcDsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChwYXJzZV9hcmdzKGFyZ2MsIGFyZ3YsIEwyVFBfQURELCAmcCkgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoIXAudHVubmVsICYmICFwLnNlc3Npb24pCisJCW1pc3NhcmcoInR1bm5lbCBvciBzZXNzaW9uIik7CisKKwlpZiAocC50dW5uZWxfaWQgPT0gMCkKKwkJbWlzc2FyZygidHVubmVsX2lkIik7CisKKwkvKiBzZXNzaW9uX2lkIGFuZCBwZWVyX3Nlc3Npb25faWQgbXVzdCBiZSBwcm92aWRlZCBmb3Igc2Vzc2lvbnMgKi8KKwlpZiAoKHAuc2Vzc2lvbikgJiYgKHAucGVlcl9zZXNzaW9uX2lkID09IDApKQorCQltaXNzYXJnKCJwZWVyX3Nlc3Npb25faWQiKTsKKwlpZiAoKHAuc2Vzc2lvbikgJiYgKHAuc2Vzc2lvbl9pZCA9PSAwKSkKKwkJbWlzc2FyZygic2Vzc2lvbl9pZCIpOworCisJLyogcGVlcl90dW5uZWxfaWQgaXMgbmVlZGVkIGZvciB0dW5uZWxzICovCisJaWYgKChwLnR1bm5lbCkgJiYgKHAucGVlcl90dW5uZWxfaWQgPT0gMCkpCisJCW1pc3NhcmcoInBlZXJfdHVubmVsX2lkIik7CisKKwlpZiAocC50dW5uZWwpIHsKKwkJaWYgKHAubG9jYWxfaXAuZmFtaWx5ID09IEFGX1VOU1BFQykKKwkJCW1pc3NhcmcoImxvY2FsIik7CisKKwkJaWYgKHAucGVlcl9pcC5mYW1pbHkgPT0gQUZfVU5TUEVDKQorCQkJbWlzc2FyZygicmVtb3RlIik7CisKKwkJaWYgKHAuZW5jYXAgPT0gTDJUUF9FTkNBUFRZUEVfVURQKSB7CisJCQlpZiAocC5sb2NhbF91ZHBfcG9ydCA9PSAwKQorCQkJCW1pc3NhcmcoInVkcF9zcG9ydCIpOworCQkJaWYgKHAucGVlcl91ZHBfcG9ydCA9PSAwKQorCQkJCW1pc3NhcmcoInVkcF9kcG9ydCIpOworCQl9CisKKwkJcmV0ID0gY3JlYXRlX3R1bm5lbCgmcCk7CisJfQorCisJaWYgKHAuc2Vzc2lvbikgeworCQkvKiBPbmx5IGV0aGVybmV0IHBzZXVkb3dpcmVzIHN1cHBvcnRlZCAqLworCQlwLnB3X3R5cGUgPSBMMlRQX1BXVFlQRV9FVEg7CisKKwkJcmV0ID0gY3JlYXRlX3Nlc3Npb24oJnApOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZG9fZGVsKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgbDJ0cF9wYXJtIHA7CisKKwlpZiAocGFyc2VfYXJncyhhcmdjLCBhcmd2LCBMMlRQX0RFTCwgJnApIDwgMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKCFwLnR1bm5lbCAmJiAhcC5zZXNzaW9uKQorCQltaXNzYXJnKCJ0dW5uZWwgb3Igc2Vzc2lvbiIpOworCisJaWYgKChwLnR1bm5lbCkgJiYgKHAudHVubmVsX2lkID09IDApKQorCQltaXNzYXJnKCJ0dW5uZWxfaWQiKTsKKwlpZiAoKHAuc2Vzc2lvbikgJiYgKHAuc2Vzc2lvbl9pZCA9PSAwKSkKKwkJbWlzc2FyZygic2Vzc2lvbl9pZCIpOworCisJaWYgKHAuc2Vzc2lvbl9pZCkKKwkJcmV0dXJuIGRlbGV0ZV9zZXNzaW9uKCZwKTsKKwllbHNlCisJCXJldHVybiBkZWxldGVfdHVubmVsKCZwKTsKKworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBkb19zaG93KGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgbDJ0cF9kYXRhIGRhdGE7CisJc3RydWN0IGwydHBfcGFybSAqcCA9ICZkYXRhLmNvbmZpZzsKKworCWlmIChwYXJzZV9hcmdzKGFyZ2MsIGFyZ3YsIEwyVFBfR0VULCBwKSA8IDApCisJCXJldHVybiAtMTsKKworCWlmICghcC0+dHVubmVsICYmICFwLT5zZXNzaW9uKQorCQltaXNzYXJnKCJ0dW5uZWwgb3Igc2Vzc2lvbiIpOworCisJaWYgKHAtPnNlc3Npb24pCisJCWdldF9zZXNzaW9uKCZkYXRhKTsKKwllbHNlCisJCWdldF90dW5uZWwoJmRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkb19pcGwydHAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWlmIChnZW5sX2ZhbWlseSA8IDApIHsKKwkJaWYgKHJ0bmxfb3Blbl9ieXByb3RvKCZnZW5sX3J0aCwgMCwgTkVUTElOS19HRU5FUklDKSA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9wZW4gZ2VuZXJpYyBuZXRsaW5rIHNvY2tldFxuIik7CisJCQlleGl0KDEpOworCQl9CisKKwkJZ2VubF9mYW1pbHkgPSBnZW5sX3Jlc29sdmVfZmFtaWx5KCZnZW5sX3J0aCwgTDJUUF9HRU5MX05BTUUpOworCQlpZiAoZ2VubF9mYW1pbHkgPCAwKQorCQkJZXhpdCgxKTsKKwl9CisKKwlpZiAoYXJnYyA8IDEpCisJCXVzYWdlKCk7CisKKwlpZiAobWF0Y2hlcygqYXJndiwgImFkZCIpID09IDApCisJCXJldHVybiBkb19hZGQoYXJnYy0xLCBhcmd2KzEpOworCWlmIChtYXRjaGVzKCphcmd2LCAiZGVsZXRlIikgPT0gMCkKKwkJcmV0dXJuIGRvX2RlbChhcmdjLTEsIGFyZ3YrMSk7CisJaWYgKG1hdGNoZXMoKmFyZ3YsICJzaG93IikgPT0gMCB8fAorCSAgICBtYXRjaGVzKCphcmd2LCAibHN0IikgPT0gMCB8fAorCSAgICBtYXRjaGVzKCphcmd2LCAibGlzdCIpID09IDApCisJCXJldHVybiBkb19zaG93KGFyZ2MtMSwgYXJndisxKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKQorCQl1c2FnZSgpOworCisJZnByaW50ZihzdGRlcnIsICJDb21tYW5kIFwiJXNcIiBpcyB1bmtub3duLCB0cnkgXCJpcCBsMnRwIGhlbHBcIi5cbiIsICphcmd2KTsKKwlleGl0KC0xKTsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2lwL2lwbGluay5jIGIvaXByb3V0ZTIvaXAvaXBsaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFiOWQ2MQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2lwL2lwbGluay5jCkBAIC0wLDAgKzEsMTI3MiBAQAorLyoKKyAqIGlwbGluay5jCQkiaXAgbGluayIuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9wYWNrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworI2luY2x1ZGUgInJ0X25hbWVzLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJpcF9jb21tb24uaCIKKyNpbmNsdWRlICJuYW1lc3BhY2UuaCIKKworI2RlZmluZSBJUExJTktfSU9DVExfQ09NUEFUCTEKKyNpZm5kZWYgTElCRElSCisjZGVmaW5lIExJQkRJUiAiL3Vzci9saWIiCisjZW5kaWYKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKK3N0YXRpYyBpbnQgaXBsaW5rX2hhdmVfbmV3bGluayh2b2lkKTsKKwordm9pZCBpcGxpbmtfdXNhZ2Uodm9pZCkKK3sKKwlpZiAoaXBsaW5rX2hhdmVfbmV3bGluaygpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGlwIGxpbmsgYWRkIFtsaW5rIERFVl0gWyBuYW1lIF0gTkFNRVxuIik7CisJCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgICAgIFsgdHhxdWV1ZWxlbiBQQUNLRVRTIF1cbiIpOworCQlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICAgICBbIGFkZHJlc3MgTExBRERSIF1cbiIpOworCQlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICAgICBbIGJyb2FkY2FzdCBMTEFERFIgXVxuIik7CisJCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgICAgIFsgbXR1IE1UVSBdIFtpbmRleCBJRFggXVxuIik7CisJCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgICAgIFsgbnVtdHhxdWV1ZXMgUVVFVUVfQ09VTlQgXVxuIik7CisJCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgICAgIFsgbnVtcnhxdWV1ZXMgUVVFVUVfQ09VTlQgXVxuIik7CisJCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgICAgIHR5cGUgVFlQRSBbIEFSR1MgXVxuIik7CisJCWZwcmludGYoc3RkZXJyLCAiICAgICAgIGlwIGxpbmsgZGVsZXRlIHsgREVWSUNFIHwgZGV2IERFVklDRSB8IGdyb3VwIERFVkdST1VQIH0gdHlwZSBUWVBFIFsgQVJHUyBdXG4iKTsKKwkJZnByaW50ZihzdGRlcnIsICJcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBpcCBsaW5rIHNldCB7IERFVklDRSB8IGRldiBERVZJQ0UgfCBncm91cCBERVZHUk9VUCB9IFsgeyB1cCB8IGRvd24gfSBdXG4iKTsKKwl9IGVsc2UKKwkJZnByaW50ZihzdGRlcnIsICJVc2FnZTogaXAgbGluayBzZXQgREVWSUNFIFsgeyB1cCB8IGRvd24gfSBdXG4iKTsKKworCWZwcmludGYoc3RkZXJyLCAiCSAgICAgICAgICAgICAgICAgIFsgYXJwIHsgb24gfCBvZmYgfSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIgkgICAgICAgICAgICAgICAgICBbIGR5bmFtaWMgeyBvbiB8IG9mZiB9IF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiCSAgICAgICAgICAgICAgICAgIFsgbXVsdGljYXN0IHsgb24gfCBvZmYgfSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIgkgICAgICAgICAgICAgICAgICBbIGFsbG11bHRpY2FzdCB7IG9uIHwgb2ZmIH0gXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIJICAgICAgICAgICAgICAgICAgWyBwcm9taXNjIHsgb24gfCBvZmYgfSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIgkgICAgICAgICAgICAgICAgICBbIHRyYWlsZXJzIHsgb24gfCBvZmYgfSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIgkgICAgICAgICAgICAgICAgICBbIHR4cXVldWVsZW4gUEFDS0VUUyBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIgkgICAgICAgICAgICAgICAgICBbIG5hbWUgTkVXTkFNRSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIgkgICAgICAgICAgICAgICAgICBbIGFkZHJlc3MgTExBRERSIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiCSAgICAgICAgICAgICAgICAgIFsgYnJvYWRjYXN0IExMQUREUiBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIgkgICAgICAgICAgICAgICAgICBbIG10dSBNVFUgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIJICAgICAgICAgICAgICAgICAgWyBuZXRucyBQSUQgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIJICAgICAgICAgICAgICAgICAgWyBuZXRucyBOQU1FIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiCSAgICAgICAgICAgICAgICAgIFsgbGluay1uZXRuc2lkIElEIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiCQkJICBbIGFsaWFzIE5BTUUgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIJICAgICAgICAgICAgICAgICAgWyB2ZiBOVU0gWyBtYWMgTExBRERSIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiCQkJCSAgIFsgdmxhbiBWTEFOSUQgWyBxb3MgVkxBTi1RT1MgXSBdXG4iKTsKKworCWZwcmludGYoc3RkZXJyLCAiCQkJCSAgIFsgcmF0ZSBUWFJBVEUgXSBdXG4iKTsKKworCWZwcmludGYoc3RkZXJyLCAiCQkJCSAgIFsgc3Bvb2ZjaGsgeyBvbiB8IG9mZn0gXSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIgkJCQkgICBbIHF1ZXJ5X3JzcyB7IG9uIHwgb2ZmfSBdIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiCQkJCSAgIFsgc3RhdGUgeyBhdXRvIHwgZW5hYmxlIHwgZGlzYWJsZX0gXSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIgkJCSAgWyBtYXN0ZXIgREVWSUNFIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiCQkJICBbIG5vbWFzdGVyIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiCQkJICBbIGFkZHJnZW5tb2RlIHsgZXVpNjQgfCBub25lIHwgc3RhYmxlX3NlY3JldCB8IHJhbmRvbSB9IF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiCSAgICAgICAgICAgICAgICAgIFsgcHJvdG9kb3duIHsgb24gfCBvZmYgfSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBpcCBsaW5rIHNob3cgWyBERVZJQ0UgfCBncm91cCBHUk9VUCBdIFt1cF0gW21hc3RlciBERVZdIFt0eXBlIFRZUEVdXG4iKTsKKworCWlmIChpcGxpbmtfaGF2ZV9uZXdsaW5rKCkpIHsKKwkJZnByaW50ZihzdGRlcnIsICIgICAgICAgaXAgbGluayBoZWxwIFsgVFlQRSBdXG4iKTsKKwkJZnByaW50ZihzdGRlcnIsICJcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwgIlRZUEUgOj0geyB2bGFuIHwgdmV0aCB8IHZjYW4gfCBkdW1teSB8IGlmYiB8IG1hY3ZsYW4gfCBtYWN2dGFwIHxcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICBicmlkZ2UgfCBib25kIHwgaXBvaWIgfCBpcDZ0bmwgfCBpcGlwIHwgc2l0IHwgdnhsYW4gfFxuIik7CisJCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgIGdyZSB8IGdyZXRhcCB8IGlwNmdyZSB8IGlwNmdyZXRhcCB8IHZ0aSB8IG5sbW9uIHxcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICBib25kX3NsYXZlIHwgaXB2bGFuIHwgZ2VuZXZlIHwgYnJpZGdlX3NsYXZlIHwgdnJmIH1cbiIpOworCX0KKwlleGl0KC0xKTsKK30KKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlpcGxpbmtfdXNhZ2UoKTsKK30KKworc3RhdGljIGludCBvbl9vZmYoY29uc3QgY2hhciAqbXNnLCBjb25zdCBjaGFyICpyZWFsdmFsKQoreworCWZwcmludGYoc3RkZXJyLAorCQkiRXJyb3I6IGFyZ3VtZW50IG9mIFwiJXNcIiBtdXN0IGJlIFwib25cIiBvciBcIm9mZlwiLCBub3QgXCIlc1wiXG4iLAorCQltc2csIHJlYWx2YWwpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgKkJPRFk7CQkvKiBjYWNoZWQgZGxvcGVuKE5VTEwpIGhhbmRsZSAqLworc3RhdGljIHN0cnVjdCBsaW5rX3V0aWwgKmxpbmt1dGlsX2xpc3Q7CisKK3N0YXRpYyBzdHJ1Y3QgbGlua191dGlsICpfX2dldF9saW5rX2tpbmQoY29uc3QgY2hhciAqaWQsIGJvb2wgc2xhdmUpCit7CisJdm9pZCAqZGxoOworCWNoYXIgYnVmWzI1Nl07CisJc3RydWN0IGxpbmtfdXRpbCAqbDsKKworCWZvciAobCA9IGxpbmt1dGlsX2xpc3Q7IGw7IGwgPSBsLT5uZXh0KQorCQlpZiAoc3RyY21wKGwtPmlkLCBpZCkgPT0gMCAmJgorCQkgICAgbC0+c2xhdmUgPT0gc2xhdmUpCisJCQlyZXR1cm4gbDsKKworCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIExJQkRJUiAiL2lwL2xpbmtfJXMuc28iLCBpZCk7CisJZGxoID0gZGxvcGVuKGJ1ZiwgUlRMRF9MQVpZKTsKKwlpZiAoZGxoID09IE5VTEwpIHsKKwkJLyogbG9vayBpbiBjdXJyZW50IGJpbmFyeSwgb25seSBvcGVuIG9uY2UgKi8KKwkJZGxoID0gQk9EWTsKKwkJaWYgKGRsaCA9PSBOVUxMKSB7CisJCQlkbGggPSBCT0RZID0gZGxvcGVuKE5VTEwsIFJUTERfTEFaWSk7CisJCQlpZiAoZGxoID09IE5VTEwpCisJCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKKwlpZiAoc2xhdmUpCisJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlc19zbGF2ZV9saW5rX3V0aWwiLCBpZCk7CisJZWxzZQorCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXNfbGlua191dGlsIiwgaWQpOworCWwgPSBkbHN5bShkbGgsIGJ1Zik7CisJaWYgKGwgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlsLT5uZXh0ID0gbGlua3V0aWxfbGlzdDsKKwlsaW5rdXRpbF9saXN0ID0gbDsKKwlyZXR1cm4gbDsKK30KKworc3RydWN0IGxpbmtfdXRpbCAqZ2V0X2xpbmtfa2luZChjb25zdCBjaGFyICppZCkKK3sKKwlyZXR1cm4gX19nZXRfbGlua19raW5kKGlkLCBmYWxzZSk7Cit9CisKK3N0cnVjdCBsaW5rX3V0aWwgKmdldF9saW5rX3NsYXZlX2tpbmQoY29uc3QgY2hhciAqaWQpCit7CisJcmV0dXJuIF9fZ2V0X2xpbmtfa2luZChpZCwgdHJ1ZSk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2xpbmtfbW9kZShjb25zdCBjaGFyICptb2RlKQoreworCWlmIChzdHJjYXNlY21wKG1vZGUsICJkZWZhdWx0IikgPT0gMCkKKwkJcmV0dXJuIElGX0xJTktfTU9ERV9ERUZBVUxUOworCWlmIChzdHJjYXNlY21wKG1vZGUsICJkb3JtYW50IikgPT0gMCkKKwkJcmV0dXJuIElGX0xJTktfTU9ERV9ET1JNQU5UOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBnZXRfYWRkcl9nZW5fbW9kZShjb25zdCBjaGFyICptb2RlKQoreworCWlmIChzdHJjYXNlY21wKG1vZGUsICJldWk2NCIpID09IDApCisJCXJldHVybiBJTjZfQUREUl9HRU5fTU9ERV9FVUk2NDsKKwlpZiAoc3RyY2FzZWNtcChtb2RlLCAibm9uZSIpID09IDApCisJCXJldHVybiBJTjZfQUREUl9HRU5fTU9ERV9OT05FOworCWlmIChzdHJjYXNlY21wKG1vZGUsICJzdGFibGVfc2VjcmV0IikgPT0gMCkKKwkJcmV0dXJuIElONl9BRERSX0dFTl9NT0RFX1NUQUJMRV9QUklWQUNZOworCWlmIChzdHJjYXNlY21wKG1vZGUsICJyYW5kb20iKSA9PSAwKQorCQlyZXR1cm4gSU42X0FERFJfR0VOX01PREVfUkFORE9NOworCXJldHVybiAtMTsKK30KKworI2lmIElQTElOS19JT0NUTF9DT01QQVQKK3N0YXRpYyBpbnQgaGF2ZV9ydG5sX25ld2xpbmsgPSAtMTsKKworc3RhdGljIGludCBhY2NlcHRfbXNnKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLAorCQkgICAgICBzdHJ1Y3QgcnRubF9jdHJsX2RhdGEgKmN0cmwsCisJCSAgICAgIHN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBubG1zZ2VyciAqZXJyID0gKHN0cnVjdCBubG1zZ2VyciAqKU5MTVNHX0RBVEEobik7CisKKwlpZiAobi0+bmxtc2dfdHlwZSA9PSBOTE1TR19FUlJPUiAmJgorCSAgICAoZXJyLT5lcnJvciA9PSAtRU9QTk9UU1VQUCB8fCBlcnItPmVycm9yID09IC1FSU5WQUwpKQorCQloYXZlX3J0bmxfbmV3bGluayA9IDA7CisJZWxzZQorCQloYXZlX3J0bmxfbmV3bGluayA9IDE7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGlwbGlua19oYXZlX25ld2xpbmsodm9pZCkKK3sKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgbmxtc2doZHIJCW47CisJCXN0cnVjdCBpZmluZm9tc2cJaTsKKwkJY2hhcgkJCWJ1ZlsxMDI0XTsKKwl9IHJlcTsKKworCWlmIChoYXZlX3J0bmxfbmV3bGluayA8IDApIHsKKwkJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKworCQlyZXEubi5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBpZmluZm9tc2cpKTsKKwkJcmVxLm4ubmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUfE5MTV9GX0FDSzsKKwkJcmVxLm4ubmxtc2dfdHlwZSA9IFJUTV9ORVdMSU5LOworCQlyZXEuaS5pZmlfZmFtaWx5ID0gQUZfVU5TUEVDOworCisJCWlmIChydG5sX3NlbmQoJnJ0aCwgJnJlcS5uLCByZXEubi5ubG1zZ19sZW4pIDwgMCkgeworCQkJcGVycm9yKCJyZXF1ZXN0IHNlbmQgZmFpbGVkIik7CisJCQlleGl0KDEpOworCQl9CisJCXJ0bmxfbGlzdGVuKCZydGgsIGFjY2VwdF9tc2csIE5VTEwpOworCX0KKwlyZXR1cm4gaGF2ZV9ydG5sX25ld2xpbms7Cit9CisjZWxzZSAvKiBJUExJTktfSU9DVExfQ09NUEFUICovCitzdGF0aWMgaW50IGlwbGlua19oYXZlX25ld2xpbmsodm9pZCkKK3sKKwlyZXR1cm4gMTsKK30KKyNlbmRpZiAvKiAhIElQTElOS19JT0NUTF9DT01QQVQgKi8KKworc3RydWN0IGlwbGlua19yZXEgeworCXN0cnVjdCBubG1zZ2hkcgkJbjsKKwlzdHJ1Y3QgaWZpbmZvbXNnCWk7CisJY2hhcgkJCWJ1ZlsxMDI0XTsKK307CisKK3N0YXRpYyBpbnQgaXBsaW5rX3BhcnNlX3ZmKGludCB2ZiwgaW50ICphcmdjcCwgY2hhciAqKiphcmd2cCwKKwkJCSAgIHN0cnVjdCBpcGxpbmtfcmVxICpyZXEsIGludCBkZXZfaW5kZXgpCit7CisJY2hhciBuZXdfcmF0ZV9hcGkgPSAwLCBjb3VudCA9IDAsIG92ZXJyaWRlX2xlZ2FjeV9yYXRlID0gMDsKKwlzdHJ1Y3QgaWZsYV92Zl9yYXRlIHRpdnQ7CisJaW50IGxlbiwgYXJnYyA9ICphcmdjcDsKKwljaGFyICoqYXJndiA9ICphcmd2cDsKKwlzdHJ1Y3QgcnRhdHRyICp2ZmluZm87CisKKwl0aXZ0Lm1pbl90eF9yYXRlID0gLTE7CisJdGl2dC5tYXhfdHhfcmF0ZSA9IC0xOworCisJdmZpbmZvID0gYWRkYXR0cl9uZXN0KCZyZXEtPm4sIHNpemVvZigqcmVxKSwgSUZMQV9WRl9JTkZPKTsKKworCXdoaWxlIChORVhUX0FSR19PSygpKSB7CisJCU5FWFRfQVJHKCk7CisJCWNvdW50Kys7CisJCWlmICghbWF0Y2hlcygqYXJndiwgIm1heF90eF9yYXRlIikpIHsKKwkJCS8qIG5ldyBBUEkgaW4gdXNlICovCisJCQluZXdfcmF0ZV9hcGkgPSAxOworCQkJLyogb3ZlcnJpZGUgbGVnYWN5IHJhdGUgKi8KKwkJCW92ZXJyaWRlX2xlZ2FjeV9yYXRlID0gMTsKKwkJfSBlbHNlIGlmICghbWF0Y2hlcygqYXJndiwgIm1pbl90eF9yYXRlIikpIHsKKwkJCS8qIG5ldyBBUEkgaW4gdXNlICovCisJCQluZXdfcmF0ZV9hcGkgPSAxOworCQl9CisJfQorCisJd2hpbGUgKGNvdW50LS0pIHsKKwkJLyogcmV3aW5kIGFyZyAqLworCQlQUkVWX0FSRygpOworCX0KKworCXdoaWxlIChORVhUX0FSR19PSygpKSB7CisJCU5FWFRfQVJHKCk7CisJCWlmIChtYXRjaGVzKCphcmd2LCAibWFjIikgPT0gMCkgeworCQkJc3RydWN0IGlmbGFfdmZfbWFjIGl2bTsKKworCQkJTkVYVF9BUkcoKTsKKwkJCWl2bS52ZiA9IHZmOworCQkJbGVuID0gbGxfYWRkcl9hMm4oKGNoYXIgKilpdm0ubWFjLCAzMiwgKmFyZ3YpOworCQkJaWYgKGxlbiA8IDApCisJCQkJcmV0dXJuIC0xOworCQkJYWRkYXR0cl9sKCZyZXEtPm4sIHNpemVvZigqcmVxKSwgSUZMQV9WRl9NQUMsICZpdm0sIHNpemVvZihpdm0pKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAidmxhbiIpID09IDApIHsKKwkJCXN0cnVjdCBpZmxhX3ZmX3ZsYW4gaXZ2OworCisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91bnNpZ25lZCgmaXZ2LnZsYW4sICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoIkludmFsaWQgXCJ2bGFuXCIgdmFsdWVcbiIsICphcmd2KTsKKworCQkJaXZ2LnZmID0gdmY7CisJCQlpdnYucW9zID0gMDsKKwkJCWlmIChORVhUX0FSR19PSygpKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCQlpZiAobWF0Y2hlcygqYXJndiwgInFvcyIpID09IDApIHsKKwkJCQkJTkVYVF9BUkcoKTsKKwkJCQkJaWYgKGdldF91bnNpZ25lZCgmaXZ2LnFvcywgKmFyZ3YsIDApKQorCQkJCQkJaW52YXJnKCJJbnZhbGlkIFwicW9zXCIgdmFsdWVcbiIsICphcmd2KTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiByZXdpbmQgYXJnICovCisJCQkJCVBSRVZfQVJHKCk7CisJCQkJfQorCQkJfQorCQkJYWRkYXR0cl9sKCZyZXEtPm4sIHNpemVvZigqcmVxKSwgSUZMQV9WRl9WTEFOLCAmaXZ2LCBzaXplb2YoaXZ2KSk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInJhdGUiKSA9PSAwKSB7CisJCQlzdHJ1Y3QgaWZsYV92Zl90eF9yYXRlIGl2dDsKKworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdW5zaWduZWQoJml2dC5yYXRlLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJJbnZhbGlkIFwicmF0ZVwiIHZhbHVlXG4iLCAqYXJndik7CisKKwkJCWl2dC52ZiA9IHZmOworCQkJaWYgKCFuZXdfcmF0ZV9hcGkpCisJCQkJYWRkYXR0cl9sKCZyZXEtPm4sIHNpemVvZigqcmVxKSwKKwkJCQkJICBJRkxBX1ZGX1RYX1JBVEUsICZpdnQsIHNpemVvZihpdnQpKTsKKwkJCWVsc2UgaWYgKCFvdmVycmlkZV9sZWdhY3lfcmF0ZSkKKwkJCQl0aXZ0Lm1heF90eF9yYXRlID0gaXZ0LnJhdGU7CisKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAibWF4X3R4X3JhdGUiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91bnNpZ25lZCgmdGl2dC5tYXhfdHhfcmF0ZSwgKmFyZ3YsIDApKQorCQkJCWludmFyZygiSW52YWxpZCBcIm1heCB0eCByYXRlXCIgdmFsdWVcbiIsCisJCQkJICAgICAgICphcmd2KTsKKwkJCXRpdnQudmYgPSB2ZjsKKworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJtaW5fdHhfcmF0ZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3Vuc2lnbmVkKCZ0aXZ0Lm1pbl90eF9yYXRlLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJJbnZhbGlkIFwibWluIHR4IHJhdGVcIiB2YWx1ZVxuIiwKKwkJCQkgICAgICAgKmFyZ3YpOworCQkJdGl2dC52ZiA9IHZmOworCisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInNwb29mY2hrIikgPT0gMCkgeworCQkJc3RydWN0IGlmbGFfdmZfc3Bvb2ZjaGsgaXZzOworCisJCQlORVhUX0FSRygpOworCQkJaWYgKG1hdGNoZXMoKmFyZ3YsICJvbiIpID09IDApCisJCQkJaXZzLnNldHRpbmcgPSAxOworCQkJZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgIm9mZiIpID09IDApCisJCQkJaXZzLnNldHRpbmcgPSAwOworCQkJZWxzZQorCQkJCXJldHVybiBvbl9vZmYoInNwb29mY2hrIiwgKmFyZ3YpOworCQkJaXZzLnZmID0gdmY7CisJCQlhZGRhdHRyX2woJnJlcS0+biwgc2l6ZW9mKCpyZXEpLCBJRkxBX1ZGX1NQT09GQ0hLLCAmaXZzLCBzaXplb2YoaXZzKSk7CisKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAicXVlcnlfcnNzIikgPT0gMCkgeworCQkJc3RydWN0IGlmbGFfdmZfcnNzX3F1ZXJ5X2VuIGl2czsKKworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChtYXRjaGVzKCphcmd2LCAib24iKSA9PSAwKQorCQkJCWl2cy5zZXR0aW5nID0gMTsKKwkJCWVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJvZmYiKSA9PSAwKQorCQkJCWl2cy5zZXR0aW5nID0gMDsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gb25fb2ZmKCJxdWVyeV9yc3MiLCAqYXJndik7CisJCQlpdnMudmYgPSB2ZjsKKwkJCWFkZGF0dHJfbCgmcmVxLT5uLCBzaXplb2YoKnJlcSksIElGTEFfVkZfUlNTX1FVRVJZX0VOLCAmaXZzLCBzaXplb2YoaXZzKSk7CisKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAic3RhdGUiKSA9PSAwKSB7CisJCQlzdHJ1Y3QgaWZsYV92Zl9saW5rX3N0YXRlIGl2bDsKKworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChtYXRjaGVzKCphcmd2LCAiYXV0byIpID09IDApCisJCQkJaXZsLmxpbmtfc3RhdGUgPSBJRkxBX1ZGX0xJTktfU1RBVEVfQVVUTzsKKwkJCWVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJlbmFibGUiKSA9PSAwKQorCQkJCWl2bC5saW5rX3N0YXRlID0gSUZMQV9WRl9MSU5LX1NUQVRFX0VOQUJMRTsKKwkJCWVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJkaXNhYmxlIikgPT0gMCkKKwkJCQlpdmwubGlua19zdGF0ZSA9IElGTEFfVkZfTElOS19TVEFURV9ESVNBQkxFOworCQkJZWxzZQorCQkJCWludmFyZygiSW52YWxpZCBcInN0YXRlXCIgdmFsdWVcbiIsICphcmd2KTsKKwkJCWl2bC52ZiA9IHZmOworCQkJYWRkYXR0cl9sKCZyZXEtPm4sIHNpemVvZigqcmVxKSwgSUZMQV9WRl9MSU5LX1NUQVRFLCAmaXZsLCBzaXplb2YoaXZsKSk7CisJCX0gZWxzZSB7CisJCQkvKiByZXdpbmQgYXJnICovCisJCQlQUkVWX0FSRygpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAobmV3X3JhdGVfYXBpKSB7CisJCWludCB0bWluLCB0bWF4OworCisJCWlmICh0aXZ0Lm1pbl90eF9yYXRlID09IC0xIHx8IHRpdnQubWF4X3R4X3JhdGUgPT0gLTEpIHsKKwkJCWlwYWRkcl9nZXRfdmZfcmF0ZSh0aXZ0LnZmLCAmdG1pbiwgJnRtYXgsIGRldl9pbmRleCk7CisJCQlpZiAodGl2dC5taW5fdHhfcmF0ZSA9PSAtMSkKKwkJCQl0aXZ0Lm1pbl90eF9yYXRlID0gdG1pbjsKKwkJCWlmICh0aXZ0Lm1heF90eF9yYXRlID09IC0xKQorCQkJCXRpdnQubWF4X3R4X3JhdGUgPSB0bWF4OworCQl9CisJCWFkZGF0dHJfbCgmcmVxLT5uLCBzaXplb2YoKnJlcSksIElGTEFfVkZfUkFURSwgJnRpdnQsCisJCQkgIHNpemVvZih0aXZ0KSk7CisJfQorCisJaWYgKGFyZ2MgPT0gKmFyZ2NwKQorCQlpbmNvbXBsZXRlX2NvbW1hbmQoKTsKKworCWFkZGF0dHJfbmVzdF9lbmQoJnJlcS0+biwgdmZpbmZvKTsKKworCSphcmdjcCA9IGFyZ2M7CisJKmFyZ3ZwID0gYXJndjsKKwlyZXR1cm4gMDsKK30KKworaW50IGlwbGlua19wYXJzZShpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBpcGxpbmtfcmVxICpyZXEsCisJCSBjaGFyICoqbmFtZSwgY2hhciAqKnR5cGUsIGNoYXIgKipsaW5rLCBjaGFyICoqZGV2LAorCQkgaW50ICpncm91cCwgaW50ICppbmRleCkKK3sKKwlpbnQgcmV0LCBsZW47CisJY2hhciBhYnVmWzMyXTsKKwlpbnQgcWxlbiA9IC0xOworCWludCBtdHUgPSAtMTsKKwlpbnQgbmV0bnMgPSAtMTsKKwlpbnQgdmYgPSAtMTsKKwlpbnQgbnVtdHhxdWV1ZXMgPSAtMTsKKwlpbnQgbnVtcnhxdWV1ZXMgPSAtMTsKKwlpbnQgZGV2X2luZGV4ID0gMDsKKwlpbnQgbGlua19uZXRuc2lkID0gLTE7CisKKwkqZ3JvdXAgPSAtMTsKKwlyZXQgPSBhcmdjOworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChzdHJjbXAoKmFyZ3YsICJ1cCIpID09IDApIHsKKwkJCXJlcS0+aS5pZmlfY2hhbmdlIHw9IElGRl9VUDsKKwkJCXJlcS0+aS5pZmlfZmxhZ3MgfD0gSUZGX1VQOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImRvd24iKSA9PSAwKSB7CisJCQlyZXEtPmkuaWZpX2NoYW5nZSB8PSBJRkZfVVA7CisJCQlyZXEtPmkuaWZpX2ZsYWdzICY9IH5JRkZfVVA7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibmFtZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQkqbmFtZSA9ICphcmd2OworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImluZGV4IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCSppbmRleCA9IGF0b2koKmFyZ3YpOworCQkJaWYgKCppbmRleCA8IDApCisJCQkJaW52YXJnKCJJbnZhbGlkIFwiaW5kZXhcIiB2YWx1ZSIsICphcmd2KTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAibGluayIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQkqbGluayA9ICphcmd2OworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJhZGRyZXNzIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWxlbiA9IGxsX2FkZHJfYTJuKGFidWYsIHNpemVvZihhYnVmKSwgKmFyZ3YpOworCQkJaWYgKGxlbiA8IDApCisJCQkJcmV0dXJuIC0xOworCQkJYWRkYXR0cl9sKCZyZXEtPm4sIHNpemVvZigqcmVxKSwgSUZMQV9BRERSRVNTLCBhYnVmLCBsZW4pOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJicm9hZGNhc3QiKSA9PSAwIHx8CisJCQkgICBzdHJjbXAoKmFyZ3YsICJicmQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJbGVuID0gbGxfYWRkcl9hMm4oYWJ1Ziwgc2l6ZW9mKGFidWYpLCAqYXJndik7CisJCQlpZiAobGVuIDwgMCkKKwkJCQlyZXR1cm4gLTE7CisJCQlhZGRhdHRyX2woJnJlcS0+biwgc2l6ZW9mKCpyZXEpLCBJRkxBX0JST0FEQ0FTVCwgYWJ1ZiwgbGVuKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAidHhxdWV1ZWxlbiIpID09IDAgfHwKKwkJCSAgIHN0cmNtcCgqYXJndiwgInFsZW4iKSA9PSAwIHx8CisJCQkgICBtYXRjaGVzKCphcmd2LCAidHhxbGVuIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChxbGVuICE9IC0xKQorCQkJCWR1cGFyZygidHhxdWV1ZWxlbiIsICphcmd2KTsKKwkJCWlmIChnZXRfaW50ZWdlcigmcWxlbiwgICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoIkludmFsaWQgXCJ0eHF1ZXVlbGVuXCIgdmFsdWVcbiIsICphcmd2KTsKKwkJCWFkZGF0dHJfbCgmcmVxLT5uLCBzaXplb2YoKnJlcSksIElGTEFfVFhRTEVOLCAmcWxlbiwgNCk7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibXR1IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChtdHUgIT0gLTEpCisJCQkJZHVwYXJnKCJtdHUiLCAqYXJndik7CisJCQlpZiAoZ2V0X2ludGVnZXIoJm10dSwgKmFyZ3YsIDApKQorCQkJCWludmFyZygiSW52YWxpZCBcIm10dVwiIHZhbHVlXG4iLCAqYXJndik7CisJCQlhZGRhdHRyX2woJnJlcS0+biwgc2l6ZW9mKCpyZXEpLCBJRkxBX01UVSwgJm10dSwgNCk7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibmV0bnMiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKG5ldG5zICE9IC0xKQorCQkJCWR1cGFyZygibmV0bnMiLCAqYXJndik7CisJCQluZXRucyA9IG5ldG5zX2dldF9mZCgqYXJndik7CisJCQlpZiAobmV0bnMgPj0gMCkKKwkJCQlhZGRhdHRyX2woJnJlcS0+biwgc2l6ZW9mKCpyZXEpLCBJRkxBX05FVF9OU19GRCwgJm5ldG5zLCA0KTsKKwkJCWVsc2UgaWYgKGdldF9pbnRlZ2VyKCZuZXRucywgKmFyZ3YsIDApID09IDApCisJCQkJYWRkYXR0cl9sKCZyZXEtPm4sIHNpemVvZigqcmVxKSwgSUZMQV9ORVRfTlNfUElELCAmbmV0bnMsIDQpOworCQkJZWxzZQorCQkJCWludmFyZygiSW52YWxpZCBcIm5ldG5zXCIgdmFsdWVcbiIsICphcmd2KTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJtdWx0aWNhc3QiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJcmVxLT5pLmlmaV9jaGFuZ2UgfD0gSUZGX01VTFRJQ0FTVDsKKworCQkJaWYgKHN0cmNtcCgqYXJndiwgIm9uIikgPT0gMCkKKwkJCQlyZXEtPmkuaWZpX2ZsYWdzIHw9IElGRl9NVUxUSUNBU1Q7CisJCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJvZmYiKSA9PSAwKQorCQkJCXJlcS0+aS5pZmlfZmxhZ3MgJj0gfklGRl9NVUxUSUNBU1Q7CisJCQllbHNlCisJCQkJcmV0dXJuIG9uX29mZigibXVsdGljYXN0IiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImFsbG11bHRpY2FzdCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlyZXEtPmkuaWZpX2NoYW5nZSB8PSBJRkZfQUxMTVVMVEk7CisKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJvbiIpID09IDApCisJCQkJcmVxLT5pLmlmaV9mbGFncyB8PSBJRkZfQUxMTVVMVEk7CisJCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJvZmYiKSA9PSAwKQorCQkJCXJlcS0+aS5pZmlfZmxhZ3MgJj0gfklGRl9BTExNVUxUSTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gb25fb2ZmKCJhbGxtdWx0aWNhc3QiLCAqYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAicHJvbWlzYyIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlyZXEtPmkuaWZpX2NoYW5nZSB8PSBJRkZfUFJPTUlTQzsKKworCQkJaWYgKHN0cmNtcCgqYXJndiwgIm9uIikgPT0gMCkKKwkJCQlyZXEtPmkuaWZpX2ZsYWdzIHw9IElGRl9QUk9NSVNDOworCQkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCAib2ZmIikgPT0gMCkKKwkJCQlyZXEtPmkuaWZpX2ZsYWdzICY9IH5JRkZfUFJPTUlTQzsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gb25fb2ZmKCJwcm9taXNjIiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInRyYWlsZXJzIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCXJlcS0+aS5pZmlfY2hhbmdlIHw9IElGRl9OT1RSQUlMRVJTOworCisJCQlpZiAoc3RyY21wKCphcmd2LCAib2ZmIikgPT0gMCkKKwkJCQlyZXEtPmkuaWZpX2ZsYWdzIHw9IElGRl9OT1RSQUlMRVJTOworCQkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCAib24iKSA9PSAwKQorCQkJCXJlcS0+aS5pZmlfZmxhZ3MgJj0gfklGRl9OT1RSQUlMRVJTOworCQkJZWxzZQorCQkJCXJldHVybiBvbl9vZmYoInRyYWlsZXJzIiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImFycCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlyZXEtPmkuaWZpX2NoYW5nZSB8PSBJRkZfTk9BUlA7CisKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJvbiIpID09IDApCisJCQkJcmVxLT5pLmlmaV9mbGFncyAmPSB+SUZGX05PQVJQOworCQkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCAib2ZmIikgPT0gMCkKKwkJCQlyZXEtPmkuaWZpX2ZsYWdzIHw9IElGRl9OT0FSUDsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gb25fb2ZmKCJhcnAiLCAqYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAidmYiKSA9PSAwKSB7CisJCQlzdHJ1Y3QgcnRhdHRyICp2Zmxpc3Q7CisKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X2ludGVnZXIoJnZmLCAgKmFyZ3YsIDApKQorCQkJCWludmFyZygiSW52YWxpZCBcInZmXCIgdmFsdWVcbiIsICphcmd2KTsKKworCQkJdmZsaXN0ID0gYWRkYXR0cl9uZXN0KCZyZXEtPm4sIHNpemVvZigqcmVxKSwKKwkJCQkJICAgICAgSUZMQV9WRklORk9fTElTVCk7CisJCQlpZiAoZGV2X2luZGV4ID09IDApCisJCQkJbWlzc2FyZygiZGV2Iik7CisKKwkJCWxlbiA9IGlwbGlua19wYXJzZV92Zih2ZiwgJmFyZ2MsICZhcmd2LCByZXEsIGRldl9pbmRleCk7CisJCQlpZiAobGVuIDwgMCkKKwkJCQlyZXR1cm4gLTE7CisJCQlhZGRhdHRyX25lc3RfZW5kKCZyZXEtPm4sIHZmbGlzdCk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgIm1hc3RlciIpID09IDApIHsKKwkJCWludCBpZmluZGV4OworCisJCQlORVhUX0FSRygpOworCQkJaWZpbmRleCA9IGxsX25hbWVfdG9faW5kZXgoKmFyZ3YpOworCQkJaWYgKCFpZmluZGV4KQorCQkJCWludmFyZygiRGV2aWNlIGRvZXMgbm90IGV4aXN0XG4iLCAqYXJndik7CisJCQlhZGRhdHRyX2woJnJlcS0+biwgc2l6ZW9mKCpyZXEpLCBJRkxBX01BU1RFUiwKKwkJCQkgICZpZmluZGV4LCA0KTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAibm9tYXN0ZXIiKSA9PSAwKSB7CisJCQlpbnQgaWZpbmRleCA9IDA7CisKKwkJCWFkZGF0dHJfbCgmcmVxLT5uLCBzaXplb2YoKnJlcSksIElGTEFfTUFTVEVSLAorCQkJCSAgJmlmaW5kZXgsIDQpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJkeW5hbWljIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCXJlcS0+aS5pZmlfY2hhbmdlIHw9IElGRl9EWU5BTUlDOworCisJCQlpZiAoc3RyY21wKCphcmd2LCAib24iKSA9PSAwKQorCQkJCXJlcS0+aS5pZmlfZmxhZ3MgfD0gSUZGX0RZTkFNSUM7CisJCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJvZmYiKSA9PSAwKQorCQkJCXJlcS0+aS5pZmlfZmxhZ3MgJj0gfklGRl9EWU5BTUlDOworCQkJZWxzZQorCQkJCXJldHVybiBvbl9vZmYoImR5bmFtaWMiLCAqYXJndik7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInR5cGUiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJKnR5cGUgPSAqYXJndjsKKwkJCWFyZ2MtLTsgYXJndisrOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImFsaWFzIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWFkZGF0dHJfbCgmcmVxLT5uLCBzaXplb2YoKnJlcSksIElGTEFfSUZBTElBUywKKwkJCQkgICphcmd2LCBzdHJsZW4oKmFyZ3YpKTsKKwkJCWFyZ2MtLTsgYXJndisrOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZ3JvdXAiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKCpncm91cCAhPSAtMSkKKwkJCQlkdXBhcmcoImdyb3VwIiwgKmFyZ3YpOworCQkJaWYgKHJ0bmxfZ3JvdXBfYTJuKGdyb3VwLCAqYXJndikpCisJCQkJaW52YXJnKCJJbnZhbGlkIFwiZ3JvdXBcIiB2YWx1ZVxuIiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm1vZGUiKSA9PSAwKSB7CisJCQlpbnQgbW9kZTsKKworCQkJTkVYVF9BUkcoKTsKKwkJCW1vZGUgPSBnZXRfbGlua19tb2RlKCphcmd2KTsKKwkJCWlmIChtb2RlIDwgMCkKKwkJCQlpbnZhcmcoIkludmFsaWQgbGluayBtb2RlXG4iLCAqYXJndik7CisJCQlhZGRhdHRyOCgmcmVxLT5uLCBzaXplb2YoKnJlcSksIElGTEFfTElOS01PREUsIG1vZGUpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInN0YXRlIikgPT0gMCkgeworCQkJaW50IHN0YXRlOworCisJCQlORVhUX0FSRygpOworCQkJc3RhdGUgPSBnZXRfb3BlcnN0YXRlKCphcmd2KTsKKwkJCWlmIChzdGF0ZSA8IDApCisJCQkJaW52YXJnKCJJbnZhbGlkIG9wZXJzdGF0ZVxuIiwgKmFyZ3YpOworCisJCQlhZGRhdHRyOCgmcmVxLT5uLCBzaXplb2YoKnJlcSksIElGTEFfT1BFUlNUQVRFLCBzdGF0ZSk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgIm51bXR4cXVldWVzIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChudW10eHF1ZXVlcyAhPSAtMSkKKwkJCQlkdXBhcmcoIm51bXR4cXVldWVzIiwgKmFyZ3YpOworCQkJaWYgKGdldF9pbnRlZ2VyKCZudW10eHF1ZXVlcywgKmFyZ3YsIDApKQorCQkJCWludmFyZygiSW52YWxpZCBcIm51bXR4cXVldWVzXCIgdmFsdWVcbiIsICphcmd2KTsKKwkJCWFkZGF0dHJfbCgmcmVxLT5uLCBzaXplb2YoKnJlcSksIElGTEFfTlVNX1RYX1FVRVVFUywKKwkJCQkgICZudW10eHF1ZXVlcywgNCk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgIm51bXJ4cXVldWVzIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChudW1yeHF1ZXVlcyAhPSAtMSkKKwkJCQlkdXBhcmcoIm51bXJ4cXVldWVzIiwgKmFyZ3YpOworCQkJaWYgKGdldF9pbnRlZ2VyKCZudW1yeHF1ZXVlcywgKmFyZ3YsIDApKQorCQkJCWludmFyZygiSW52YWxpZCBcIm51bXJ4cXVldWVzXCIgdmFsdWVcbiIsICphcmd2KTsKKwkJCWFkZGF0dHJfbCgmcmVxLT5uLCBzaXplb2YoKnJlcSksIElGTEFfTlVNX1JYX1FVRVVFUywKKwkJCQkgICZudW1yeHF1ZXVlcywgNCk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImFkZHJnZW5tb2RlIikgPT0gMCkgeworCQkJc3RydWN0IHJ0YXR0ciAqYWZzLCAqYWZzNjsKKwkJCWludCBtb2RlOworCisJCQlORVhUX0FSRygpOworCQkJbW9kZSA9IGdldF9hZGRyX2dlbl9tb2RlKCphcmd2KTsKKwkJCWlmIChtb2RlIDwgMCkKKwkJCQlpbnZhcmcoIkludmFsaWQgYWRkcmVzcyBnZW5lcmF0aW9uIG1vZGVcbiIsICphcmd2KTsKKwkJCWFmcyA9IGFkZGF0dHJfbmVzdCgmcmVxLT5uLCBzaXplb2YoKnJlcSksIElGTEFfQUZfU1BFQyk7CisJCQlhZnM2ID0gYWRkYXR0cl9uZXN0KCZyZXEtPm4sIHNpemVvZigqcmVxKSwgQUZfSU5FVDYpOworCQkJYWRkYXR0cjgoJnJlcS0+biwgc2l6ZW9mKCpyZXEpLCBJRkxBX0lORVQ2X0FERFJfR0VOX01PREUsIG1vZGUpOworCQkJYWRkYXR0cl9uZXN0X2VuZCgmcmVxLT5uLCBhZnM2KTsKKwkJCWFkZGF0dHJfbmVzdF9lbmQoJnJlcS0+biwgYWZzKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAibGluay1uZXRuc2lkIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChsaW5rX25ldG5zaWQgIT0gLTEpCisJCQkJZHVwYXJnKCJsaW5rLW5ldG5zaWQiLCAqYXJndik7CisJCQlpZiAoZ2V0X2ludGVnZXIoJmxpbmtfbmV0bnNpZCwgKmFyZ3YsIDApKQorCQkJCWludmFyZygiSW52YWxpZCBcImxpbmstbmV0bnNpZFwiIHZhbHVlXG4iLCAqYXJndik7CisJCQlhZGRhdHRyMzIoJnJlcS0+biwgc2l6ZW9mKCpyZXEpLCBJRkxBX0xJTktfTkVUTlNJRCwKKwkJCQkgIGxpbmtfbmV0bnNpZCk7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAicHJvdG9kb3duIikgPT0gMCkgeworCQkJdW5zaWduZWQgaW50IHByb3RvX2Rvd247CisKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoc3RyY21wKCphcmd2LCAib24iKSA9PSAwKQorCQkJCXByb3RvX2Rvd24gPSAxOworCQkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCAib2ZmIikgPT0gMCkKKwkJCQlwcm90b19kb3duID0gMDsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gb25fb2ZmKCJwcm90b2Rvd24iLCAqYXJndik7CisJCQlhZGRhdHRyOCgmcmVxLT5uLCBzaXplb2YoKnJlcSksIElGTEFfUFJPVE9fRE9XTiwKKwkJCQkgcHJvdG9fZG93bik7CisJCX0gZWxzZSB7CisJCQlpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKQorCQkJCXVzYWdlKCk7CisKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJkZXYiKSA9PSAwKQorCQkJCU5FWFRfQVJHKCk7CisJCQlpZiAoKmRldikKKwkJCQlkdXBhcmcyKCJkZXYiLCAqYXJndik7CisJCQkqZGV2ID0gKmFyZ3Y7CisJCQlkZXZfaW5kZXggPSBsbF9uYW1lX3RvX2luZGV4KCpkZXYpOworCQl9CisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCXJldHVybiByZXQgLSBhcmdjOworfQorCitzdGF0aWMgaW50IGlwbGlua19tb2RpZnkoaW50IGNtZCwgdW5zaWduZWQgaW50IGZsYWdzLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGxlbjsKKwljaGFyICpkZXYgPSBOVUxMOworCWNoYXIgKm5hbWUgPSBOVUxMOworCWNoYXIgKmxpbmsgPSBOVUxMOworCWNoYXIgKnR5cGUgPSBOVUxMOworCWludCBpbmRleCA9IC0xOworCWludCBncm91cDsKKwlzdHJ1Y3QgbGlua191dGlsICpsdSA9IE5VTEw7CisJc3RydWN0IGlwbGlua19yZXEgcmVxOworCWludCByZXQ7CisKKwltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCisJcmVxLm4ubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgaWZpbmZvbXNnKSk7CisJcmVxLm4ubmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUfGZsYWdzOworCXJlcS5uLm5sbXNnX3R5cGUgPSBjbWQ7CisJcmVxLmkuaWZpX2ZhbWlseSA9IHByZWZlcnJlZF9mYW1pbHk7CisKKwlyZXQgPSBpcGxpbmtfcGFyc2UoYXJnYywgYXJndiwgJnJlcSwgJm5hbWUsICZ0eXBlLCAmbGluaywgJmRldiwgJmdyb3VwLCAmaW5kZXgpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJYXJnYyAtPSByZXQ7CisJYXJndiArPSByZXQ7CisKKwlpZiAoZ3JvdXAgIT0gLTEpIHsKKwkJaWYgKGRldikKKwkJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBJRkxBX0dST1VQLAorCQkJCQkmZ3JvdXAsIHNpemVvZihncm91cCkpOworCQllbHNlIHsKKwkJCWlmIChhcmdjKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJHYXJiYWdlIGluc3RlYWQgb2YgYXJndW1lbnRzICIKKwkJCQkJCSJcIiVzIC4uLlwiLiBUcnkgXCJpcCBsaW5rICIKKwkJCQkJCSJoZWxwXCIuXG4iLCAqYXJndik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKGZsYWdzICYgTkxNX0ZfQ1JFQVRFKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJncm91cCBjYW5ub3QgYmUgdXNlZCB3aGVuICIKKwkJCQkJCSJjcmVhdGluZyBkZXZpY2VzLlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCisJCQlyZXEuaS5pZmlfaW5kZXggPSAwOworCQkJYWRkYXR0cjMyKCZyZXEubiwgc2l6ZW9mKHJlcSksIElGTEFfR1JPVVAsIGdyb3VwKTsKKwkJCWlmIChydG5sX3RhbGsoJnJ0aCwgJnJlcS5uLCBOVUxMLCAwKSA8IDApCisJCQkJcmV0dXJuIC0yOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAoIShmbGFncyAmIE5MTV9GX0NSRUFURSkpIHsKKwkJaWYgKCFkZXYpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiTm90IGVub3VnaCBpbmZvcm1hdGlvbjogXCJkZXZcIiAiCisJCQkJCSJhcmd1bWVudCBpcyByZXF1aXJlZC5cbiIpOworCQkJZXhpdCgtMSk7CisJCX0KKwkJaWYgKGNtZCA9PSBSVE1fTkVXTElOSyAmJiBpbmRleCAhPSAtMSkgeworCQkJZnByaW50ZihzdGRlcnIsICJpbmRleCBjYW4gYmUgdXNlZCBvbmx5IHdoZW4gIgorCQkJCQkiY3JlYXRpbmcgZGV2aWNlcy5cbiIpOworCQkJZXhpdCgtMSk7CisJCX0KKworCQlyZXEuaS5pZmlfaW5kZXggPSBsbF9uYW1lX3RvX2luZGV4KGRldik7CisJCWlmIChyZXEuaS5pZmlfaW5kZXggPT0gMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJDYW5ub3QgZmluZCBkZXZpY2UgXCIlc1wiXG4iLCBkZXYpOworCQkJcmV0dXJuIC0xOworCQl9CisJfSBlbHNlIHsKKwkJLyogQWxsb3cgImlwIGxpbmsgYWRkIGRldiIgYW5kICJpcCBsaW5rIGFkZCBuYW1lIiAqLworCQlpZiAoIW5hbWUpCisJCQluYW1lID0gZGV2OworCisJCWlmIChsaW5rKSB7CisJCQlpbnQgaWZpbmRleDsKKworCQkJaWZpbmRleCA9IGxsX25hbWVfdG9faW5kZXgobGluayk7CisJCQlpZiAoaWZpbmRleCA9PSAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJDYW5ub3QgZmluZCBkZXZpY2UgXCIlc1wiXG4iLAorCQkJCQlsaW5rKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgSUZMQV9MSU5LLCAmaWZpbmRleCwgNCk7CisJCX0KKworCQlpZiAoaW5kZXggPT0gLTEpCisJCQlyZXEuaS5pZmlfaW5kZXggPSAwOworCQllbHNlCisJCQlyZXEuaS5pZmlfaW5kZXggPSBpbmRleDsKKwl9CisKKwlpZiAobmFtZSkgeworCQlsZW4gPSBzdHJsZW4obmFtZSkgKyAxOworCQlpZiAobGVuID09IDEpCisJCQlpbnZhcmcoIlwiXCIgaXMgbm90IGEgdmFsaWQgZGV2aWNlIGlkZW50aWZpZXJcbiIsICJuYW1lIik7CisJCWlmIChsZW4gPiBJRk5BTVNJWikKKwkJCWludmFyZygiXCJuYW1lXCIgdG9vIGxvbmdcbiIsIG5hbWUpOworCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgSUZMQV9JRk5BTUUsIG5hbWUsIGxlbik7CisJfQorCisJaWYgKHR5cGUpIHsKKwkJc3RydWN0IHJ0YXR0ciAqbGlua2luZm87CisJCWNoYXIgc2xhdmVidWZbMTI4XSwgKnVsaW5lcCA9IHN0cmNocih0eXBlLCAnXycpOworCQlpbnQgaWZsYXR5cGU7CisKKwkJbGlua2luZm8gPSBhZGRhdHRyX25lc3QoJnJlcS5uLCBzaXplb2YocmVxKSwgSUZMQV9MSU5LSU5GTyk7CisJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBJRkxBX0lORk9fS0lORCwgdHlwZSwKKwkJCSBzdHJsZW4odHlwZSkpOworCisJCWlmICh1bGluZXAgJiYgIXN0cmNtcCh1bGluZXAsICJfc2xhdmUiKSkgeworCQkJc3RybmNweShzbGF2ZWJ1ZiwgdHlwZSwgc2l6ZW9mKHNsYXZlYnVmKSk7CisJCQlzbGF2ZWJ1ZltzaXplb2Yoc2xhdmVidWYpIC0gMV0gPSAnXDAnOworCQkJdWxpbmVwID0gc3RyY2hyKHNsYXZlYnVmLCAnXycpOworCQkJLyogY2hlY2sgaW4gY2FzZSBpdCB3YXMgYWZ0ZXIgc2l6ZW9mKHNsYXZlYnVmKSAtIDEqLworCQkJaWYgKHVsaW5lcCkKKwkJCQkqdWxpbmVwID0gJ1wwJzsKKwkJCWx1ID0gZ2V0X2xpbmtfc2xhdmVfa2luZChzbGF2ZWJ1Zik7CisJCQlpZmxhdHlwZSA9IElGTEFfSU5GT19TTEFWRV9EQVRBOworCQl9IGVsc2UgeworCQkJbHUgPSBnZXRfbGlua19raW5kKHR5cGUpOworCQkJaWZsYXR5cGUgPSBJRkxBX0lORk9fREFUQTsKKwkJfQorCQlpZiAobHUgJiYgYXJnYykgeworCQkJc3RydWN0IHJ0YXR0ciAqZGF0YSA9IGFkZGF0dHJfbmVzdCgmcmVxLm4sIHNpemVvZihyZXEpLCBpZmxhdHlwZSk7CisKKwkJCWlmIChsdS0+cGFyc2Vfb3B0ICYmCisJCQkgICAgbHUtPnBhcnNlX29wdChsdSwgYXJnYywgYXJndiwgJnJlcS5uKSkKKwkJCQlyZXR1cm4gLTE7CisKKwkJCWFkZGF0dHJfbmVzdF9lbmQoJnJlcS5uLCBkYXRhKTsKKwkJfSBlbHNlIGlmIChhcmdjKSB7CisJCQlpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKQorCQkJCXVzYWdlKCk7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkdhcmJhZ2UgaW5zdGVhZCBvZiBhcmd1bWVudHMgXCIlcyAuLi5cIi4gIgorCQkJCQkiVHJ5IFwiaXAgbGluayBoZWxwXCIuXG4iLCAqYXJndik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYWRkYXR0cl9uZXN0X2VuZCgmcmVxLm4sIGxpbmtpbmZvKTsKKwl9IGVsc2UgaWYgKGZsYWdzICYgTkxNX0ZfQ1JFQVRFKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm90IGVub3VnaCBpbmZvcm1hdGlvbjogXCJ0eXBlXCIgYXJndW1lbnQgIgorCQkJCSJpcyByZXF1aXJlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAocnRubF90YWxrKCZydGgsICZyZXEubiwgTlVMTCwgMCkgPCAwKQorCQlyZXR1cm4gLTI7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGlwbGlua19nZXQodW5zaWduZWQgaW50IGZsYWdzLCBjaGFyICpuYW1lLCBfX3UzMiBmaWx0X21hc2spCit7CisJaW50IGxlbjsKKwlzdHJ1Y3QgaXBsaW5rX3JlcSByZXE7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyIG47CisJCWNoYXIgYnVmWzE2Mzg0XTsKKwl9IGFuc3dlcjsKKworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisKKwlyZXEubi5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBpZmluZm9tc2cpKTsKKwlyZXEubi5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1R8ZmxhZ3M7CisJcmVxLm4ubmxtc2dfdHlwZSA9IFJUTV9HRVRMSU5LOworCXJlcS5pLmlmaV9mYW1pbHkgPSBwcmVmZXJyZWRfZmFtaWx5OworCisJaWYgKG5hbWUpIHsKKwkJbGVuID0gc3RybGVuKG5hbWUpICsgMTsKKwkJaWYgKGxlbiA9PSAxKQorCQkJaW52YXJnKCJcIlwiIGlzIG5vdCBhIHZhbGlkIGRldmljZSBpZGVudGlmaWVyXG4iLAorCQkJCSAgICJuYW1lIik7CisJCWlmIChsZW4gPiBJRk5BTVNJWikKKwkJCWludmFyZygiXCJuYW1lXCIgdG9vIGxvbmdcbiIsIG5hbWUpOworCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgSUZMQV9JRk5BTUUsIG5hbWUsIGxlbik7CisJfQorCWFkZGF0dHIzMigmcmVxLm4sIHNpemVvZihyZXEpLCBJRkxBX0VYVF9NQVNLLCBmaWx0X21hc2spOworCisJaWYgKHJ0bmxfdGFsaygmcnRoLCAmcmVxLm4sICZhbnN3ZXIubiwgc2l6ZW9mKGFuc3dlcikpIDwgMCkKKwkJcmV0dXJuIC0yOworCisJaWYgKGJyaWVmKQorCQlwcmludF9saW5raW5mb19icmllZihOVUxMLCAmYW5zd2VyLm4sIHN0ZG91dCk7CisJZWxzZQorCQlwcmludF9saW5raW5mbyhOVUxMLCAmYW5zd2VyLm4sIHN0ZG91dCk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmIElQTElOS19JT0NUTF9DT01QQVQKK3N0YXRpYyBpbnQgZ2V0X2N0bF9mZCh2b2lkKQoreworCWludCBzX2Vycm5vOworCWludCBmZDsKKworCWZkID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCWlmIChmZCA+PSAwKQorCQlyZXR1cm4gZmQ7CisJc19lcnJubyA9IGVycm5vOworCWZkID0gc29ja2V0KFBGX1BBQ0tFVCwgU09DS19ER1JBTSwgMCk7CisJaWYgKGZkID49IDApCisJCXJldHVybiBmZDsKKwlmZCA9IHNvY2tldChQRl9JTkVUNiwgU09DS19ER1JBTSwgMCk7CisJaWYgKGZkID49IDApCisJCXJldHVybiBmZDsKKwllcnJubyA9IHNfZXJybm87CisJcGVycm9yKCJDYW5ub3QgY3JlYXRlIGNvbnRyb2wgc29ja2V0Iik7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGRvX2NoZmxhZ3MoY29uc3QgY2hhciAqZGV2LCBfX3UzMiBmbGFncywgX191MzIgbWFzaykKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWludCBmZDsKKwlpbnQgZXJyOworCisJc3RybmNweShpZnIuaWZyX25hbWUsIGRldiwgSUZOQU1TSVopOworCWZkID0gZ2V0X2N0bF9mZCgpOworCWlmIChmZCA8IDApCisJCXJldHVybiAtMTsKKwllcnIgPSBpb2N0bChmZCwgU0lPQ0dJRkZMQUdTLCAmaWZyKTsKKwlpZiAoZXJyKSB7CisJCXBlcnJvcigiU0lPQ0dJRkZMQUdTIik7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoKGlmci5pZnJfZmxhZ3NeZmxhZ3MpJm1hc2spIHsKKwkJaWZyLmlmcl9mbGFncyAmPSB+bWFzazsKKwkJaWZyLmlmcl9mbGFncyB8PSBtYXNrJmZsYWdzOworCQllcnIgPSBpb2N0bChmZCwgU0lPQ1NJRkZMQUdTLCAmaWZyKTsKKwkJaWYgKGVycikKKwkJCXBlcnJvcigiU0lPQ1NJRkZMQUdTIik7CisJfQorCWNsb3NlKGZkKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGRvX2NoYW5nZW5hbWUoY29uc3QgY2hhciAqZGV2LCBjb25zdCBjaGFyICpuZXdkZXYpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlpbnQgZmQ7CisJaW50IGVycjsKKworCXN0cm5jcHkoaWZyLmlmcl9uYW1lLCBkZXYsIElGTkFNU0laKTsKKwlzdHJuY3B5KGlmci5pZnJfbmV3bmFtZSwgbmV3ZGV2LCBJRk5BTVNJWik7CisJZmQgPSBnZXRfY3RsX2ZkKCk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC0xOworCWVyciA9IGlvY3RsKGZkLCBTSU9DU0lGTkFNRSwgJmlmcik7CisJaWYgKGVycikgeworCQlwZXJyb3IoIlNJT0NTSUZOQU1FIik7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIC0xOworCX0KKwljbG9zZShmZCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzZXRfcWxlbihjb25zdCBjaGFyICpkZXYsIGludCBxbGVuKQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisJaW50IHM7CisKKwlzID0gZ2V0X2N0bF9mZCgpOworCWlmIChzIDwgMCkKKwkJcmV0dXJuIC0xOworCisJbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKKwlzdHJuY3B5KGlmci5pZnJfbmFtZSwgZGV2LCBJRk5BTVNJWik7CisJaWZyLmlmcl9xbGVuID0gcWxlbjsKKwlpZiAoaW9jdGwocywgU0lPQ1NJRlRYUUxFTiwgJmlmcikgPCAwKSB7CisJCXBlcnJvcigiU0lPQ1NJRlhRTEVOIik7CisJCWNsb3NlKHMpOworCQlyZXR1cm4gLTE7CisJfQorCWNsb3NlKHMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X210dShjb25zdCBjaGFyICpkZXYsIGludCBtdHUpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlpbnQgczsKKworCXMgPSBnZXRfY3RsX2ZkKCk7CisJaWYgKHMgPCAwKQorCQlyZXR1cm4gLTE7CisKKwltZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOworCXN0cm5jcHkoaWZyLmlmcl9uYW1lLCBkZXYsIElGTkFNU0laKTsKKwlpZnIuaWZyX210dSA9IG10dTsKKwlpZiAoaW9jdGwocywgU0lPQ1NJRk1UVSwgJmlmcikgPCAwKSB7CisJCXBlcnJvcigiU0lPQ1NJRk1UVSIpOworCQljbG9zZShzKTsKKwkJcmV0dXJuIC0xOworCX0KKwljbG9zZShzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9hZGRyZXNzKGNvbnN0IGNoYXIgKmRldiwgaW50ICpodHlwZSkKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCXN0cnVjdCBzb2NrYWRkcl9sbCBtZTsKKwlzb2NrbGVuX3QgYWxlbjsKKwlpbnQgczsKKworCXMgPSBzb2NrZXQoUEZfUEFDS0VULCBTT0NLX0RHUkFNLCAwKTsKKwlpZiAocyA8IDApIHsKKwkJcGVycm9yKCJzb2NrZXQoUEZfUEFDS0VUKSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKKwlzdHJuY3B5KGlmci5pZnJfbmFtZSwgZGV2LCBJRk5BTVNJWik7CisJaWYgKGlvY3RsKHMsIFNJT0NHSUZJTkRFWCwgJmlmcikgPCAwKSB7CisJCXBlcnJvcigiU0lPQ0dJRklOREVYIik7CisJCWNsb3NlKHMpOworCQlyZXR1cm4gLTE7CisJfQorCisJbWVtc2V0KCZtZSwgMCwgc2l6ZW9mKG1lKSk7CisJbWUuc2xsX2ZhbWlseSA9IEFGX1BBQ0tFVDsKKwltZS5zbGxfaWZpbmRleCA9IGlmci5pZnJfaWZpbmRleDsKKwltZS5zbGxfcHJvdG9jb2wgPSBodG9ucyhFVEhfUF9MT09QKTsKKwlpZiAoYmluZChzLCAoc3RydWN0IHNvY2thZGRyICopJm1lLCBzaXplb2YobWUpKSA9PSAtMSkgeworCQlwZXJyb3IoImJpbmQiKTsKKwkJY2xvc2Uocyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlhbGVuID0gc2l6ZW9mKG1lKTsKKwlpZiAoZ2V0c29ja25hbWUocywgKHN0cnVjdCBzb2NrYWRkciAqKSZtZSwgJmFsZW4pID09IC0xKSB7CisJCXBlcnJvcigiZ2V0c29ja25hbWUiKTsKKwkJY2xvc2Uocyk7CisJCXJldHVybiAtMTsKKwl9CisJY2xvc2Uocyk7CisJKmh0eXBlID0gbWUuc2xsX2hhdHlwZTsKKwlyZXR1cm4gbWUuc2xsX2hhbGVuOworfQorCitzdGF0aWMgaW50IHBhcnNlX2FkZHJlc3MoY29uc3QgY2hhciAqZGV2LCBpbnQgaGF0eXBlLCBpbnQgaGFsZW4sCisJCWNoYXIgKmxsYSwgc3RydWN0IGlmcmVxICppZnIpCit7CisJaW50IGFsZW47CisKKwltZW1zZXQoaWZyLCAwLCBzaXplb2YoKmlmcikpOworCXN0cm5jcHkoaWZyLT5pZnJfbmFtZSwgZGV2LCBJRk5BTVNJWik7CisJaWZyLT5pZnJfaHdhZGRyLnNhX2ZhbWlseSA9IGhhdHlwZTsKKwlhbGVuID0gbGxfYWRkcl9hMm4oaWZyLT5pZnJfaHdhZGRyLnNhX2RhdGEsIDE0LCBsbGEpOworCWlmIChhbGVuIDwgMCkKKwkJcmV0dXJuIC0xOworCWlmIChhbGVuICE9IGhhbGVuKSB7CisJCWZwcmludGYoc3RkZXJyLCAiV3JvbmcgYWRkcmVzcyAoJXMpIGxlbmd0aDogZXhwZWN0ZWQgJWQgYnl0ZXNcbiIsIGxsYSwgaGFsZW4pOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldF9hZGRyZXNzKHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgYnJkKQoreworCWludCBzOworCisJcyA9IGdldF9jdGxfZmQoKTsKKwlpZiAocyA8IDApCisJCXJldHVybiAtMTsKKwlpZiAoaW9jdGwocywgYnJkP1NJT0NTSUZIV0JST0FEQ0FTVDpTSU9DU0lGSFdBRERSLCBpZnIpIDwgMCkgeworCQlwZXJyb3IoYnJkPyJTSU9DU0lGSFdCUk9BRENBU1QiOiJTSU9DU0lGSFdBRERSIik7CisJCWNsb3NlKHMpOworCQlyZXR1cm4gLTE7CisJfQorCWNsb3NlKHMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvX3NldChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqZGV2ID0gTlVMTDsKKwlfX3UzMiBtYXNrID0gMDsKKwlfX3UzMiBmbGFncyA9IDA7CisJaW50IHFsZW4gPSAtMTsKKwlpbnQgbXR1ID0gLTE7CisJY2hhciAqbmV3YWRkciA9IE5VTEw7CisJY2hhciAqbmV3YnJkID0gTlVMTDsKKwlzdHJ1Y3QgaWZyZXEgaWZyMCwgaWZyMTsKKwljaGFyICpuZXduYW1lID0gTlVMTDsKKwlpbnQgaHR5cGUsIGhhbGVuOworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChzdHJjbXAoKmFyZ3YsICJ1cCIpID09IDApIHsKKwkJCW1hc2sgfD0gSUZGX1VQOworCQkJZmxhZ3MgfD0gSUZGX1VQOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImRvd24iKSA9PSAwKSB7CisJCQltYXNrIHw9IElGRl9VUDsKKwkJCWZsYWdzICY9IH5JRkZfVVA7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibmFtZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQluZXduYW1lID0gKmFyZ3Y7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImFkZHJlc3MiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJbmV3YWRkciA9ICphcmd2OworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJicm9hZGNhc3QiKSA9PSAwIHx8CisJCQkgICBzdHJjbXAoKmFyZ3YsICJicmQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJbmV3YnJkID0gKmFyZ3Y7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInR4cXVldWVsZW4iKSA9PSAwIHx8CisJCQkgICBzdHJjbXAoKmFyZ3YsICJxbGVuIikgPT0gMCB8fAorCQkJICAgbWF0Y2hlcygqYXJndiwgInR4cWxlbiIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocWxlbiAhPSAtMSkKKwkJCQlkdXBhcmcoInR4cXVldWVsZW4iLCAqYXJndik7CisJCQlpZiAoZ2V0X2ludGVnZXIoJnFsZW4sICAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJJbnZhbGlkIFwidHhxdWV1ZWxlblwiIHZhbHVlXG4iLCAqYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibXR1IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChtdHUgIT0gLTEpCisJCQkJZHVwYXJnKCJtdHUiLCAqYXJndik7CisJCQlpZiAoZ2V0X2ludGVnZXIoJm10dSwgKmFyZ3YsIDApKQorCQkJCWludmFyZygiSW52YWxpZCBcIm10dVwiIHZhbHVlXG4iLCAqYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibXVsdGljYXN0IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCW1hc2sgfD0gSUZGX01VTFRJQ0FTVDsKKworCQkJaWYgKHN0cmNtcCgqYXJndiwgIm9uIikgPT0gMCkKKwkJCQlmbGFncyB8PSBJRkZfTVVMVElDQVNUOworCQkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCAib2ZmIikgPT0gMCkKKwkJCQlmbGFncyAmPSB+SUZGX01VTFRJQ0FTVDsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gb25fb2ZmKCJtdWx0aWNhc3QiLCAqYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiYWxsbXVsdGljYXN0IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCW1hc2sgfD0gSUZGX0FMTE1VTFRJOworCisJCQlpZiAoc3RyY21wKCphcmd2LCAib24iKSA9PSAwKQorCQkJCWZsYWdzIHw9IElGRl9BTExNVUxUSTsKKwkJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm9mZiIpID09IDApCisJCQkJZmxhZ3MgJj0gfklGRl9BTExNVUxUSTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gb25fb2ZmKCJhbGxtdWx0aWNhc3QiLCAqYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAicHJvbWlzYyIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQltYXNrIHw9IElGRl9QUk9NSVNDOworCisJCQlpZiAoc3RyY21wKCphcmd2LCAib24iKSA9PSAwKQorCQkJCWZsYWdzIHw9IElGRl9QUk9NSVNDOworCQkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCAib2ZmIikgPT0gMCkKKwkJCQlmbGFncyAmPSB+SUZGX1BST01JU0M7CisJCQllbHNlCisJCQkJcmV0dXJuIG9uX29mZigicHJvbWlzYyIsICphcmd2KTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJ0cmFpbGVycyIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQltYXNrIHw9IElGRl9OT1RSQUlMRVJTOworCisJCQlpZiAoc3RyY21wKCphcmd2LCAib2ZmIikgPT0gMCkKKwkJCQlmbGFncyB8PSBJRkZfTk9UUkFJTEVSUzsKKwkJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm9uIikgPT0gMCkKKwkJCQlmbGFncyAmPSB+SUZGX05PVFJBSUxFUlM7CisJCQllbHNlCisJCQkJcmV0dXJuIG9uX29mZigidHJhaWxlcnMiLCAqYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiYXJwIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCW1hc2sgfD0gSUZGX05PQVJQOworCisJCQlpZiAoc3RyY21wKCphcmd2LCAib24iKSA9PSAwKQorCQkJCWZsYWdzICY9IH5JRkZfTk9BUlA7CisJCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJvZmYiKSA9PSAwKQorCQkJCWZsYWdzIHw9IElGRl9OT0FSUDsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gb25fb2ZmKCJhcnAiLCAqYXJndik7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImR5bmFtaWMiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJbWFzayB8PSBJRkZfRFlOQU1JQzsKKworCQkJaWYgKHN0cmNtcCgqYXJndiwgIm9uIikgPT0gMCkKKwkJCQlmbGFncyB8PSBJRkZfRFlOQU1JQzsKKwkJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm9mZiIpID09IDApCisJCQkJZmxhZ3MgJj0gfklGRl9EWU5BTUlDOworCQkJZWxzZQorCQkJCXJldHVybiBvbl9vZmYoImR5bmFtaWMiLCAqYXJndik7CisJCX0gZWxzZSB7CisJCQlpZiAoc3RyY21wKCphcmd2LCAiZGV2IikgPT0gMCkKKwkJCQlORVhUX0FSRygpOworCQkJZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKQorCQkJCXVzYWdlKCk7CisKKwkJCWlmIChkZXYpCisJCQkJZHVwYXJnMigiZGV2IiwgKmFyZ3YpOworCQkJZGV2ID0gKmFyZ3Y7CisJCX0KKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJaWYgKCFkZXYpIHsKKwkJZnByaW50ZihzdGRlcnIsICJOb3QgZW5vdWdoIG9mIGluZm9ybWF0aW9uOiBcImRldlwiIGFyZ3VtZW50IGlzIHJlcXVpcmVkLlxuIik7CisJCWV4aXQoLTEpOworCX0KKworCWlmIChuZXdhZGRyIHx8IG5ld2JyZCkgeworCQloYWxlbiA9IGdldF9hZGRyZXNzKGRldiwgJmh0eXBlKTsKKwkJaWYgKGhhbGVuIDwgMCkKKwkJCXJldHVybiAtMTsKKwkJaWYgKG5ld2FkZHIpIHsKKwkJCWlmIChwYXJzZV9hZGRyZXNzKGRldiwgaHR5cGUsIGhhbGVuLCBuZXdhZGRyLCAmaWZyMCkgPCAwKQorCQkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAobmV3YnJkKSB7CisJCQlpZiAocGFyc2VfYWRkcmVzcyhkZXYsIGh0eXBlLCBoYWxlbiwgbmV3YnJkLCAmaWZyMSkgPCAwKQorCQkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWlmIChuZXduYW1lICYmIHN0cmNtcChkZXYsIG5ld25hbWUpKSB7CisJCWlmIChzdHJsZW4obmV3bmFtZSkgPT0gMCkKKwkJCWludmFyZygiXCJcIiBpcyBub3QgYSB2YWxpZCBkZXZpY2UgaWRlbnRpZmllclxuIiwgIm5hbWUiKTsKKwkJaWYgKGRvX2NoYW5nZW5hbWUoZGV2LCBuZXduYW1lKSA8IDApCisJCQlyZXR1cm4gLTE7CisJCWRldiA9IG5ld25hbWU7CisJfQorCWlmIChxbGVuICE9IC0xKSB7CisJCWlmIChzZXRfcWxlbihkZXYsIHFsZW4pIDwgMCkKKwkJCXJldHVybiAtMTsKKwl9CisJaWYgKG10dSAhPSAtMSkgeworCQlpZiAoc2V0X210dShkZXYsIG10dSkgPCAwKQorCQkJcmV0dXJuIC0xOworCX0KKwlpZiAobmV3YWRkciB8fCBuZXdicmQpIHsKKwkJaWYgKG5ld2JyZCkgeworCQkJaWYgKHNldF9hZGRyZXNzKCZpZnIxLCAxKSA8IDApCisJCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChuZXdhZGRyKSB7CisJCQlpZiAoc2V0X2FkZHJlc3MoJmlmcjAsIDApIDwgMCkKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJaWYgKG1hc2spCisJCXJldHVybiBkb19jaGZsYWdzKGRldiwgZmxhZ3MsIG1hc2spOworCXJldHVybiAwOworfQorI2VuZGlmIC8qIElQTElOS19JT0NUTF9DT01QQVQgKi8KKworc3RhdGljIHZvaWQgZG9faGVscChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGxpbmtfdXRpbCAqbHUgPSBOVUxMOworCisJaWYgKGFyZ2MgPD0gMCkgeworCQl1c2FnZSgpOworCQlyZXR1cm47CisJfQorCisJbHUgPSBnZXRfbGlua19raW5kKCphcmd2KTsKKwlpZiAobHUgJiYgbHUtPnByaW50X2hlbHApCisJCWx1LT5wcmludF9oZWxwKGx1LCBhcmdjLTEsIGFyZ3YrMSwgc3Rkb3V0KTsKKwllbHNlCisJCXVzYWdlKCk7Cit9CisKK2ludCBkb19pcGxpbmsoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWlmIChhcmdjIDwgMSkKKwkJcmV0dXJuIGlwYWRkcl9saXN0X2xpbmsoMCwgTlVMTCk7CisKKwlpZiAoaXBsaW5rX2hhdmVfbmV3bGluaygpKSB7CisJCWlmIChtYXRjaGVzKCphcmd2LCAiYWRkIikgPT0gMCkKKwkJCXJldHVybiBpcGxpbmtfbW9kaWZ5KFJUTV9ORVdMSU5LLAorCQkJCQkgICAgIE5MTV9GX0NSRUFURXxOTE1fRl9FWENMLAorCQkJCQkgICAgIGFyZ2MtMSwgYXJndisxKTsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJzZXQiKSA9PSAwIHx8CisJCSAgICBtYXRjaGVzKCphcmd2LCAiY2hhbmdlIikgPT0gMCkKKwkJCXJldHVybiBpcGxpbmtfbW9kaWZ5KFJUTV9ORVdMSU5LLCAwLAorCQkJCQkgICAgIGFyZ2MtMSwgYXJndisxKTsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJyZXBsYWNlIikgPT0gMCkKKwkJCXJldHVybiBpcGxpbmtfbW9kaWZ5KFJUTV9ORVdMSU5LLAorCQkJCQkgICAgIE5MTV9GX0NSRUFURXxOTE1fRl9SRVBMQUNFLAorCQkJCQkgICAgIGFyZ2MtMSwgYXJndisxKTsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJkZWxldGUiKSA9PSAwKQorCQkJcmV0dXJuIGlwbGlua19tb2RpZnkoUlRNX0RFTExJTkssIDAsCisJCQkJCSAgICAgYXJnYy0xLCBhcmd2KzEpOworCX0gZWxzZSB7CisjaWYgSVBMSU5LX0lPQ1RMX0NPTVBBVAorCQlpZiAobWF0Y2hlcygqYXJndiwgInNldCIpID09IDApCisJCQlyZXR1cm4gZG9fc2V0KGFyZ2MtMSwgYXJndisxKTsKKyNlbmRpZgorCX0KKworCWlmIChtYXRjaGVzKCphcmd2LCAic2hvdyIpID09IDAgfHwKKwkgICAgbWF0Y2hlcygqYXJndiwgImxzdCIpID09IDAgfHwKKwkgICAgbWF0Y2hlcygqYXJndiwgImxpc3QiKSA9PSAwKQorCQlyZXR1cm4gaXBhZGRyX2xpc3RfbGluayhhcmdjLTEsIGFyZ3YrMSk7CisKKwlpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKSB7CisJCWRvX2hlbHAoYXJnYy0xLCBhcmd2KzEpOworCQlyZXR1cm4gMDsKKwl9CisKKwlmcHJpbnRmKHN0ZGVyciwgIkNvbW1hbmQgXCIlc1wiIGlzIHVua25vd24sIHRyeSBcImlwIGxpbmsgaGVscFwiLlxuIiwKKwkJKmFyZ3YpOworCWV4aXQoLTEpOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaXAvaXBsaW5rX2JvbmQuYyBiL2lwcm91dGUyL2lwL2lwbGlua19ib25kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IyZjA0NQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2lwL2lwbGlua19ib25kLmMKQEAgLTAsMCArMSw1ODMgQEAKKy8qCisgKiBpcGxpbmtfYm9uZC5jCUJvbmRpbmcgZGV2aWNlIHN1cHBvcnQKKyAqCisgKiAgICAgICAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICAgICAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgICAgICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgICAgICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOiAgICAgSmlyaSBQaXJrbyA8amlyaUByZXNudWxsaS51cz4KKyAqICAgICAgICAgICAgICBTY290dCBGZWxkbWFuIDxzZmVsZG1hQGN1bXVsdXNuZXR3b3Jrcy5jb20+CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaWZfbGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisKKyNpbmNsdWRlICJydF9uYW1lcy5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiaXBfY29tbW9uLmgiCisKKyNkZWZpbmUgQk9ORF9NQVhfQVJQX1RBUkdFVFMgICAgMTYKKworc3RhdGljIGNvbnN0IGNoYXIgKm1vZGVfdGJsW10gPSB7CisJImJhbGFuY2UtcnIiLAorCSJhY3RpdmUtYmFja3VwIiwKKwkiYmFsYW5jZS14b3IiLAorCSJicm9hZGNhc3QiLAorCSI4MDIuM2FkIiwKKwkiYmFsYW5jZS10bGIiLAorCSJiYWxhbmNlLWFsYiIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICphcnBfdmFsaWRhdGVfdGJsW10gPSB7CisJIm5vbmUiLAorCSJhY3RpdmUiLAorCSJiYWNrdXAiLAorCSJhbGwiLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqYXJwX2FsbF90YXJnZXRzX3RibFtdID0geworCSJhbnkiLAorCSJhbGwiLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqcHJpbWFyeV9yZXNlbGVjdF90YmxbXSA9IHsKKwkiYWx3YXlzIiwKKwkiYmV0dGVyIiwKKwkiZmFpbHVyZSIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpmYWlsX292ZXJfbWFjX3RibFtdID0geworCSJub25lIiwKKwkiYWN0aXZlIiwKKwkiZm9sbG93IiwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnhtaXRfaGFzaF9wb2xpY3lfdGJsW10gPSB7CisJImxheWVyMiIsCisJImxheWVyMys0IiwKKwkibGF5ZXIyKzMiLAorCSJlbmNhcDIrMyIsCisJImVuY2FwMys0IiwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmxhY3BfcmF0ZV90YmxbXSA9IHsKKwkic2xvdyIsCisJImZhc3QiLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqYWRfc2VsZWN0X3RibFtdID0geworCSJzdGFibGUiLAorCSJiYW5kd2lkdGgiLAorCSJjb3VudCIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfbmFtZShjb25zdCBjaGFyICoqdGJsLCBpbnQgaW5kZXgpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyB0YmxbaV07IGkrKykKKwkJaWYgKGkgPT0gaW5kZXgpCisJCQlyZXR1cm4gdGJsW2ldOworCisJcmV0dXJuICJVTktOT1dOIjsKK30KKworc3RhdGljIGludCBnZXRfaW5kZXgoY29uc3QgY2hhciAqKnRibCwgY2hhciAqbmFtZSkKK3sKKwlpbnQgaSwgaW5kZXg7CisKKwkvKiBjaGVjayBmb3IgaW50ZWdlciBpbmRleCBwYXNzZWQgaW4gaW5zdGVhZCBvZiBuYW1lICovCisJaWYgKGdldF9pbnRlZ2VyKCZpbmRleCwgbmFtZSwgMTApID09IDApCisJCWZvciAoaSA9IDA7IHRibFtpXTsgaSsrKQorCQkJaWYgKGkgPT0gaW5kZXgpCisJCQkJcmV0dXJuIGk7CisKKwlmb3IgKGkgPSAwOyB0YmxbaV07IGkrKykKKwkJaWYgKHN0cmNtcCh0YmxbaV0sIG5hbWUpID09IDApCisJCQlyZXR1cm4gaTsKKworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfZXhwbGFpbihGSUxFICpmKQoreworCWZwcmludGYoZiwKKwkJIlVzYWdlOiAuLi4gYm9uZCBbIG1vZGUgQk9ORE1PREUgXSBbIGFjdGl2ZV9zbGF2ZSBTTEFWRV9ERVYgXVxuIgorCQkiICAgICAgICAgICAgICAgIFsgY2xlYXJfYWN0aXZlX3NsYXZlIF0gWyBtaWltb24gTUlJTU9OIF1cbiIKKwkJIiAgICAgICAgICAgICAgICBbIHVwZGVsYXkgVVBERUxBWSBdIFsgZG93bmRlbGF5IERPV05ERUxBWSBdXG4iCisJCSIgICAgICAgICAgICAgICAgWyB1c2VfY2FycmllciBVU0VfQ0FSUklFUiBdXG4iCisJCSIgICAgICAgICAgICAgICAgWyBhcnBfaW50ZXJ2YWwgQVJQX0lOVEVSVkFMIF1cbiIKKwkJIiAgICAgICAgICAgICAgICBbIGFycF92YWxpZGF0ZSBBUlBfVkFMSURBVEUgXVxuIgorCQkiICAgICAgICAgICAgICAgIFsgYXJwX2FsbF90YXJnZXRzIEFSUF9BTExfVEFSR0VUUyBdXG4iCisJCSIgICAgICAgICAgICAgICAgWyBhcnBfaXBfdGFyZ2V0IFsgQVJQX0lQX1RBUkdFVCwgLi4uIF0gXVxuIgorCQkiICAgICAgICAgICAgICAgIFsgcHJpbWFyeSBTTEFWRV9ERVYgXVxuIgorCQkiICAgICAgICAgICAgICAgIFsgcHJpbWFyeV9yZXNlbGVjdCBQUklNQVJZX1JFU0VMRUNUIF1cbiIKKwkJIiAgICAgICAgICAgICAgICBbIGZhaWxfb3Zlcl9tYWMgRkFJTF9PVkVSX01BQyBdXG4iCisJCSIgICAgICAgICAgICAgICAgWyB4bWl0X2hhc2hfcG9saWN5IFhNSVRfSEFTSF9QT0xJQ1kgXVxuIgorCQkiICAgICAgICAgICAgICAgIFsgcmVzZW5kX2lnbXAgUkVTRU5EX0lHTVAgXVxuIgorCQkiICAgICAgICAgICAgICAgIFsgbnVtX2dyYXRfYXJwfG51bV91bnNvbF9uYSBOVU1fR1JBVF9BUlB8TlVNX1VOU09MX05BIF1cbiIKKwkJIiAgICAgICAgICAgICAgICBbIGFsbF9zbGF2ZXNfYWN0aXZlIEFMTF9TTEFWRVNfQUNUSVZFIF1cbiIKKwkJIiAgICAgICAgICAgICAgICBbIG1pbl9saW5rcyBNSU5fTElOS1MgXVxuIgorCQkiICAgICAgICAgICAgICAgIFsgbHBfaW50ZXJ2YWwgTFBfSU5URVJWQUwgXVxuIgorCQkiICAgICAgICAgICAgICAgIFsgcGFja2V0c19wZXJfc2xhdmUgUEFDS0VUU19QRVJfU0xBVkUgXVxuIgorCQkiCQkgWyB0bGJfZHluYW1pY19sYiBUTEJfRFlOQU1JQ19MQiBdXG4iCisJCSIgICAgICAgICAgICAgICAgWyBsYWNwX3JhdGUgTEFDUF9SQVRFIF1cbiIKKwkJIiAgICAgICAgICAgICAgICBbIGFkX3NlbGVjdCBBRF9TRUxFQ1QgXVxuIgorCQkiICAgICAgICAgICAgICAgIFsgYWRfdXNlcl9wb3J0X2tleSBQT1JUS0VZIF1cbiIKKwkJIiAgICAgICAgICAgICAgICBbIGFkX2FjdG9yX3N5c19wcmlvIFNZU1BSSU8gXVxuIgorCQkiICAgICAgICAgICAgICAgIFsgYWRfYWN0b3Jfc3lzdGVtIExMQUREUiBdXG4iCisJCSJcbiIKKwkJIkJPTkRNT0RFIDo9IGJhbGFuY2UtcnJ8YWN0aXZlLWJhY2t1cHxiYWxhbmNlLXhvcnxicm9hZGNhc3R8ODAyLjNhZHxiYWxhbmNlLXRsYnxiYWxhbmNlLWFsYlxuIgorCQkiQVJQX1ZBTElEQVRFIDo9IG5vbmV8YWN0aXZlfGJhY2t1cHxhbGxcbiIKKwkJIkFSUF9BTExfVEFSR0VUUyA6PSBhbnl8YWxsXG4iCisJCSJQUklNQVJZX1JFU0VMRUNUIDo9IGFsd2F5c3xiZXR0ZXJ8ZmFpbHVyZVxuIgorCQkiRkFJTF9PVkVSX01BQyA6PSBub25lfGFjdGl2ZXxmb2xsb3dcbiIKKwkJIlhNSVRfSEFTSF9QT0xJQ1kgOj0gbGF5ZXIyfGxheWVyMiszfGxheWVyMys0fGVuY2FwMiszfGVuY2FwMys0XG4iCisJCSJMQUNQX1JBVEUgOj0gc2xvd3xmYXN0XG4iCisJCSJBRF9TRUxFQ1QgOj0gc3RhYmxlfGJhbmR3aWR0aHxjb3VudFxuIgorCSk7Cit9CisKK3N0YXRpYyB2b2lkIGV4cGxhaW4odm9pZCkKK3sKKwlwcmludF9leHBsYWluKHN0ZGVycik7Cit9CisKK3N0YXRpYyBpbnQgYm9uZF9wYXJzZV9vcHQoc3RydWN0IGxpbmtfdXRpbCAqbHUsIGludCBhcmdjLCBjaGFyICoqYXJndiwKKwkJCSAgc3RydWN0IG5sbXNnaGRyICpuKQoreworCV9fdTggbW9kZSwgdXNlX2NhcnJpZXIsIHByaW1hcnlfcmVzZWxlY3QsIGZhaWxfb3Zlcl9tYWM7CisJX191OCB4bWl0X2hhc2hfcG9saWN5LCBudW1fcGVlcl9ub3RpZiwgYWxsX3NsYXZlc19hY3RpdmU7CisJX191OCBsYWNwX3JhdGUsIGFkX3NlbGVjdCwgdGxiX2R5bmFtaWNfbGI7CisJX191MTYgYWRfdXNlcl9wb3J0X2tleSwgYWRfYWN0b3Jfc3lzX3ByaW87CisJX191MzIgbWlpbW9uLCB1cGRlbGF5LCBkb3duZGVsYXksIGFycF9pbnRlcnZhbCwgYXJwX3ZhbGlkYXRlOworCV9fdTMyIGFycF9hbGxfdGFyZ2V0cywgcmVzZW5kX2lnbXAsIG1pbl9saW5rcywgbHBfaW50ZXJ2YWw7CisJX191MzIgcGFja2V0c19wZXJfc2xhdmU7CisJdW5zaWduZWQgaWZpbmRleDsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAobWF0Y2hlcygqYXJndiwgIm1vZGUiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9pbmRleChtb2RlX3RibCwgKmFyZ3YpIDwgMCkKKwkJCQlpbnZhcmcoImludmFsaWQgbW9kZSIsICphcmd2KTsKKwkJCW1vZGUgPSBnZXRfaW5kZXgobW9kZV90YmwsICphcmd2KTsKKwkJCWFkZGF0dHI4KG4sIDEwMjQsIElGTEFfQk9ORF9NT0RFLCBtb2RlKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiYWN0aXZlX3NsYXZlIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmaW5kZXggPSBpZl9uYW1ldG9pbmRleCgqYXJndik7CisJCQlpZiAoIWlmaW5kZXgpCisJCQkJcmV0dXJuIC0xOworCQkJYWRkYXR0cjMyKG4sIDEwMjQsIElGTEFfQk9ORF9BQ1RJVkVfU0xBVkUsIGlmaW5kZXgpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJjbGVhcl9hY3RpdmVfc2xhdmUiKSA9PSAwKSB7CisJCQlhZGRhdHRyMzIobiwgMTAyNCwgSUZMQV9CT05EX0FDVElWRV9TTEFWRSwgMCk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgIm1paW1vbiIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmbWlpbW9uLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJpbnZhbGlkIG1paW1vbiIsICphcmd2KTsKKwkJCWFkZGF0dHIzMihuLCAxMDI0LCBJRkxBX0JPTkRfTUlJTU9OLCBtaWltb24pOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJ1cGRlbGF5IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTMyKCZ1cGRlbGF5LCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJpbnZhbGlkIHVwZGVsYXkiLCAqYXJndik7CisJCQlhZGRhdHRyMzIobiwgMTAyNCwgSUZMQV9CT05EX1VQREVMQVksIHVwZGVsYXkpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJkb3duZGVsYXkiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJmRvd25kZWxheSwgKmFyZ3YsIDApKQorCQkJCWludmFyZygiaW52YWxpZCBkb3duZGVsYXkiLCAqYXJndik7CisJCQlhZGRhdHRyMzIobiwgMTAyNCwgSUZMQV9CT05EX0RPV05ERUxBWSwgZG93bmRlbGF5KTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAidXNlX2NhcnJpZXIiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91OCgmdXNlX2NhcnJpZXIsICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoImludmFsaWQgdXNlX2NhcnJpZXIiLCAqYXJndik7CisJCQlhZGRhdHRyOChuLCAxMDI0LCBJRkxBX0JPTkRfVVNFX0NBUlJJRVIsIHVzZV9jYXJyaWVyKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiYXJwX2ludGVydmFsIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTMyKCZhcnBfaW50ZXJ2YWwsICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoImludmFsaWQgYXJwX2ludGVydmFsIiwgKmFyZ3YpOworCQkJYWRkYXR0cjMyKG4sIDEwMjQsIElGTEFfQk9ORF9BUlBfSU5URVJWQUwsIGFycF9pbnRlcnZhbCk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImFycF9pcF90YXJnZXQiKSA9PSAwKSB7CisJCQlzdHJ1Y3QgcnRhdHRyICogbmVzdCA9IGFkZGF0dHJfbmVzdChuLCAxMDI0LAorCQkJCUlGTEFfQk9ORF9BUlBfSVBfVEFSR0VUKTsKKwkJCWlmIChORVhUX0FSR19PSygpKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCQljaGFyICp0YXJnZXRzID0gc3RyZHVwYSgqYXJndik7CisJCQkJY2hhciAqdGFyZ2V0ID0gc3RydG9rKHRhcmdldHMsICIsIik7CisJCQkJaW50IGk7CisKKwkJCQlmb3IoaSA9IDA7IHRhcmdldCAmJiBpIDwgQk9ORF9NQVhfQVJQX1RBUkdFVFM7IGkrKykgeworCQkJCQlfX3UzMiBhZGRyID0gZ2V0X2FkZHIzMih0YXJnZXQpOworCQkJCQlhZGRhdHRyMzIobiwgMTAyNCwgaSwgYWRkcik7CisJCQkJCXRhcmdldCA9IHN0cnRvayhOVUxMLCAiLCIpOworCQkJCX0KKwkJCQlhZGRhdHRyX25lc3RfZW5kKG4sIG5lc3QpOworCQkJfQorCQkJYWRkYXR0cl9uZXN0X2VuZChuLCBuZXN0KTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiYXJwX3ZhbGlkYXRlIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfaW5kZXgoYXJwX3ZhbGlkYXRlX3RibCwgKmFyZ3YpIDwgMCkKKwkJCQlpbnZhcmcoImludmFsaWQgYXJwX3ZhbGlkYXRlIiwgKmFyZ3YpOworCQkJYXJwX3ZhbGlkYXRlID0gZ2V0X2luZGV4KGFycF92YWxpZGF0ZV90YmwsICphcmd2KTsKKwkJCWFkZGF0dHIzMihuLCAxMDI0LCBJRkxBX0JPTkRfQVJQX1ZBTElEQVRFLCBhcnBfdmFsaWRhdGUpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJhcnBfYWxsX3RhcmdldHMiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9pbmRleChhcnBfYWxsX3RhcmdldHNfdGJsLCAqYXJndikgPCAwKQorCQkJCWludmFyZygiaW52YWxpZCBhcnBfYWxsX3RhcmdldHMiLCAqYXJndik7CisJCQlhcnBfYWxsX3RhcmdldHMgPSBnZXRfaW5kZXgoYXJwX2FsbF90YXJnZXRzX3RibCwgKmFyZ3YpOworCQkJYWRkYXR0cjMyKG4sIDEwMjQsIElGTEFfQk9ORF9BUlBfQUxMX1RBUkdFVFMsIGFycF9hbGxfdGFyZ2V0cyk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInByaW1hcnkiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWZpbmRleCA9IGlmX25hbWV0b2luZGV4KCphcmd2KTsKKwkJCWlmICghaWZpbmRleCkKKwkJCQlyZXR1cm4gLTE7CisJCQlhZGRhdHRyMzIobiwgMTAyNCwgSUZMQV9CT05EX1BSSU1BUlksIGlmaW5kZXgpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJwcmltYXJ5X3Jlc2VsZWN0IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfaW5kZXgocHJpbWFyeV9yZXNlbGVjdF90YmwsICphcmd2KSA8IDApCisJCQkJaW52YXJnKCJpbnZhbGlkIHByaW1hcnlfcmVzZWxlY3QiLCAqYXJndik7CisJCQlwcmltYXJ5X3Jlc2VsZWN0ID0gZ2V0X2luZGV4KHByaW1hcnlfcmVzZWxlY3RfdGJsLCAqYXJndik7CisJCQlhZGRhdHRyOChuLCAxMDI0LCBJRkxBX0JPTkRfUFJJTUFSWV9SRVNFTEVDVCwKKwkJCQkgcHJpbWFyeV9yZXNlbGVjdCk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImZhaWxfb3Zlcl9tYWMiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9pbmRleChmYWlsX292ZXJfbWFjX3RibCwgKmFyZ3YpIDwgMCkKKwkJCQlpbnZhcmcoImludmFsaWQgZmFpbF9vdmVyX21hYyIsICphcmd2KTsKKwkJCWZhaWxfb3Zlcl9tYWMgPSBnZXRfaW5kZXgoZmFpbF9vdmVyX21hY190YmwsICphcmd2KTsKKwkJCWFkZGF0dHI4KG4sIDEwMjQsIElGTEFfQk9ORF9GQUlMX09WRVJfTUFDLAorCQkJCSBmYWlsX292ZXJfbWFjKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAieG1pdF9oYXNoX3BvbGljeSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X2luZGV4KHhtaXRfaGFzaF9wb2xpY3lfdGJsLCAqYXJndikgPCAwKQorCQkJCWludmFyZygiaW52YWxpZCB4bWl0X2hhc2hfcG9saWN5IiwgKmFyZ3YpOworCisJCQl4bWl0X2hhc2hfcG9saWN5ID0gZ2V0X2luZGV4KHhtaXRfaGFzaF9wb2xpY3lfdGJsLCAqYXJndik7CisJCQlhZGRhdHRyOChuLCAxMDI0LCBJRkxBX0JPTkRfWE1JVF9IQVNIX1BPTElDWSwKKwkJCQkgeG1pdF9oYXNoX3BvbGljeSk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInJlc2VuZF9pZ21wIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTMyKCZyZXNlbmRfaWdtcCwgKmFyZ3YsIDApKQorCQkJCWludmFyZygiaW52YWxpZCByZXNlbmRfaWdtcCIsICphcmd2KTsKKworCQkJYWRkYXR0cjMyKG4sIDEwMjQsIElGTEFfQk9ORF9SRVNFTkRfSUdNUCwgcmVzZW5kX2lnbXApOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJudW1fZ3JhdF9hcnAiKSA9PSAwIHx8CisJCQkgICBtYXRjaGVzKCphcmd2LCAibnVtX3Vuc29sX25hIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTgoJm51bV9wZWVyX25vdGlmLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJpbnZhbGlkIG51bV9ncmF0X2FycHxudW1fdW5zb2xfbmEiLAorCQkJCSAgICAgICAqYXJndik7CisKKwkJCWFkZGF0dHI4KG4sIDEwMjQsIElGTEFfQk9ORF9OVU1fUEVFUl9OT1RJRiwKKwkJCQkgbnVtX3BlZXJfbm90aWYpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJhbGxfc2xhdmVzX2FjdGl2ZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3U4KCZhbGxfc2xhdmVzX2FjdGl2ZSwgKmFyZ3YsIDApKQorCQkJCWludmFyZygiaW52YWxpZCBhbGxfc2xhdmVzX2FjdGl2ZSIsICphcmd2KTsKKworCQkJYWRkYXR0cjgobiwgMTAyNCwgSUZMQV9CT05EX0FMTF9TTEFWRVNfQUNUSVZFLAorCQkJCSBhbGxfc2xhdmVzX2FjdGl2ZSk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgIm1pbl9saW5rcyIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmbWluX2xpbmtzLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJpbnZhbGlkIG1pbl9saW5rcyIsICphcmd2KTsKKworCQkJYWRkYXR0cjMyKG4sIDEwMjQsIElGTEFfQk9ORF9NSU5fTElOS1MsIG1pbl9saW5rcyk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImxwX2ludGVydmFsIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTMyKCZscF9pbnRlcnZhbCwgKmFyZ3YsIDApKQorCQkJCWludmFyZygiaW52YWxpZCBscF9pbnRlcnZhbCIsICphcmd2KTsKKworCQkJYWRkYXR0cjMyKG4sIDEwMjQsIElGTEFfQk9ORF9MUF9JTlRFUlZBTCwgbHBfaW50ZXJ2YWwpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJwYWNrZXRzX3Blcl9zbGF2ZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmcGFja2V0c19wZXJfc2xhdmUsICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoImludmFsaWQgcGFja2V0c19wZXJfc2xhdmUiLCAqYXJndik7CisKKwkJCWFkZGF0dHIzMihuLCAxMDI0LCBJRkxBX0JPTkRfUEFDS0VUU19QRVJfU0xBVkUsCisJCQkJICBwYWNrZXRzX3Blcl9zbGF2ZSk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImxhY3BfcmF0ZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X2luZGV4KGxhY3BfcmF0ZV90YmwsICphcmd2KSA8IDApCisJCQkJaW52YXJnKCJpbnZhbGlkIGxhY3BfcmF0ZSIsICphcmd2KTsKKworCQkJbGFjcF9yYXRlID0gZ2V0X2luZGV4KGxhY3BfcmF0ZV90YmwsICphcmd2KTsKKwkJCWFkZGF0dHI4KG4sIDEwMjQsIElGTEFfQk9ORF9BRF9MQUNQX1JBVEUsIGxhY3BfcmF0ZSk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImFkX3NlbGVjdCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X2luZGV4KGFkX3NlbGVjdF90YmwsICphcmd2KSA8IDApCisJCQkJaW52YXJnKCJpbnZhbGlkIGFkX3NlbGVjdCIsICphcmd2KTsKKworCQkJYWRfc2VsZWN0ID0gZ2V0X2luZGV4KGFkX3NlbGVjdF90YmwsICphcmd2KTsKKwkJCWFkZGF0dHI4KG4sIDEwMjQsIElGTEFfQk9ORF9BRF9TRUxFQ1QsIGFkX3NlbGVjdCk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImFkX3VzZXJfcG9ydF9rZXkiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MTYoJmFkX3VzZXJfcG9ydF9rZXksICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoImludmFsaWQgYWRfdXNlcl9wb3J0X2tleSIsICphcmd2KTsKKworCQkJYWRkYXR0cjE2KG4sIDEwMjQsIElGTEFfQk9ORF9BRF9VU0VSX1BPUlRfS0VZLAorCQkJCSAgYWRfdXNlcl9wb3J0X2tleSk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImFkX2FjdG9yX3N5c19wcmlvIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTE2KCZhZF9hY3Rvcl9zeXNfcHJpbywgKmFyZ3YsIDApKQorCQkJCWludmFyZygiaW52YWxpZCBhZF9hY3Rvcl9zeXNfcHJpbyIsICphcmd2KTsKKworCQkJYWRkYXR0cjE2KG4sIDEwMjQsIElGTEFfQk9ORF9BRF9BQ1RPUl9TWVNfUFJJTywKKwkJCQkgIGFkX2FjdG9yX3N5c19wcmlvKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiYWRfYWN0b3Jfc3lzdGVtIikgPT0gMCkgeworCQkJaW50IGxlbjsKKwkJCWNoYXIgYWJ1ZlszMl07CisKKwkJCU5FWFRfQVJHKCk7CisJCQlsZW4gPSBsbF9hZGRyX2EybihhYnVmLCBzaXplb2YoYWJ1ZiksICphcmd2KTsKKwkJCWlmIChsZW4gPCAwKQorCQkJCXJldHVybiAtMTsKKwkJCWFkZGF0dHJfbChuLCAxMDI0LCBJRkxBX0JPTkRfQURfQUNUT1JfU1lTVEVNLAorCQkJCSAgYWJ1ZiwgbGVuKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAidGxiX2R5bmFtaWNfbGIiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91OCgmdGxiX2R5bmFtaWNfbGIsICphcmd2LCAwKSkgeworCQkJCWludmFyZygiaW52YWxpZCB0bGJfZHluYW1pY19sYiIsICphcmd2KTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlhZGRhdHRyOChuLCAxMDI0LCBJRkxBX0JPTkRfVExCX0RZTkFNSUNfTEIsCisJCQkJIHRsYl9keW5hbWljX2xiKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiaGVscCIpID09IDApIHsKKwkJCWV4cGxhaW4oKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiYm9uZDogdW5rbm93biBjb21tYW5kIFwiJXNcIj9cbiIsICphcmd2KTsKKwkJCWV4cGxhaW4oKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlhcmdjLS0sIGFyZ3YrKzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYm9uZF9wcmludF9vcHQoc3RydWN0IGxpbmtfdXRpbCAqbHUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKnRiW10pCit7CisJdW5zaWduZWQgaWZpbmRleDsKKworCWlmICghdGIpCisJCXJldHVybjsKKworCWlmICh0YltJRkxBX0JPTkRfTU9ERV0pIHsKKwkJY29uc3QgY2hhciAqbW9kZSA9IGdldF9uYW1lKG1vZGVfdGJsLAorCQkJcnRhX2dldGF0dHJfdTgodGJbSUZMQV9CT05EX01PREVdKSk7CisJCWZwcmludGYoZiwgIm1vZGUgJXMgIiwgbW9kZSk7CisJfQorCisJaWYgKHRiW0lGTEFfQk9ORF9BQ1RJVkVfU0xBVkVdICYmCisJICAgIChpZmluZGV4ID0gcnRhX2dldGF0dHJfdTMyKHRiW0lGTEFfQk9ORF9BQ1RJVkVfU0xBVkVdKSkpIHsKKwkJY2hhciBidWZbSUZOQU1TSVpdOworCQljb25zdCBjaGFyICpuID0gaWZfaW5kZXh0b25hbWUoaWZpbmRleCwgYnVmKTsKKworCQlpZiAobikKKwkJCWZwcmludGYoZiwgImFjdGl2ZV9zbGF2ZSAlcyAiLCBuKTsKKwkJZWxzZQorCQkJZnByaW50ZihmLCAiYWN0aXZlX3NsYXZlICV1ICIsIGlmaW5kZXgpOworCX0KKworCWlmICh0YltJRkxBX0JPTkRfTUlJTU9OXSkKKwkJZnByaW50ZihmLCAibWlpbW9uICV1ICIsIHJ0YV9nZXRhdHRyX3UzMih0YltJRkxBX0JPTkRfTUlJTU9OXSkpOworCisJaWYgKHRiW0lGTEFfQk9ORF9VUERFTEFZXSkKKwkJZnByaW50ZihmLCAidXBkZWxheSAldSAiLCBydGFfZ2V0YXR0cl91MzIodGJbSUZMQV9CT05EX1VQREVMQVldKSk7CisKKwlpZiAodGJbSUZMQV9CT05EX0RPV05ERUxBWV0pCisJCWZwcmludGYoZiwgImRvd25kZWxheSAldSAiLAorCQkJcnRhX2dldGF0dHJfdTMyKHRiW0lGTEFfQk9ORF9ET1dOREVMQVldKSk7CisKKwlpZiAodGJbSUZMQV9CT05EX1VTRV9DQVJSSUVSXSkKKwkJZnByaW50ZihmLCAidXNlX2NhcnJpZXIgJXUgIiwKKwkJCXJ0YV9nZXRhdHRyX3U4KHRiW0lGTEFfQk9ORF9VU0VfQ0FSUklFUl0pKTsKKworCWlmICh0YltJRkxBX0JPTkRfQVJQX0lOVEVSVkFMXSkKKwkJZnByaW50ZihmLCAiYXJwX2ludGVydmFsICV1ICIsCisJCQlydGFfZ2V0YXR0cl91MzIodGJbSUZMQV9CT05EX0FSUF9JTlRFUlZBTF0pKTsKKworCWlmICh0YltJRkxBX0JPTkRfQVJQX0lQX1RBUkdFVF0pIHsKKwkJc3RydWN0IHJ0YXR0ciAqaXB0YltCT05EX01BWF9BUlBfVEFSR0VUUyArIDFdOworCQljaGFyIGJ1ZltJTkVUX0FERFJTVFJMRU5dOworCQlpbnQgaTsKKworCQlwYXJzZV9ydGF0dHJfbmVzdGVkKGlwdGIsIEJPTkRfTUFYX0FSUF9UQVJHRVRTLAorCQkJdGJbSUZMQV9CT05EX0FSUF9JUF9UQVJHRVRdKTsKKworCQlpZiAoaXB0YlswXSkKKwkJCWZwcmludGYoZiwgImFycF9pcF90YXJnZXQgIik7CisKKwkJZm9yIChpID0gMDsgaSA8IEJPTkRfTUFYX0FSUF9UQVJHRVRTOyBpKyspIHsKKwkJCWlmIChpcHRiW2ldKQorCQkJCWZwcmludGYoZiwgIiVzIiwKKwkJCQkJcnRfYWRkcl9uMmEoQUZfSU5FVCwKKwkJCQkJCSAgICBSVEFfUEFZTE9BRChpcHRiW2ldKSwKKwkJCQkJCSAgICBSVEFfREFUQShpcHRiW2ldKSwKKwkJCQkJCSAgICBidWYsCisJCQkJCQkgICAgSU5FVF9BRERSU1RSTEVOKSk7CisJCQlpZiAoaSA8IEJPTkRfTUFYX0FSUF9UQVJHRVRTLTEgJiYgaXB0YltpKzFdKQorCQkJCWZwcmludGYoZiwgIiwiKTsKKwkJfQorCisJCWlmIChpcHRiWzBdKQorCQkJZnByaW50ZihmLCAiICIpOworCX0KKworCWlmICh0YltJRkxBX0JPTkRfQVJQX1ZBTElEQVRFXSkgeworCQljb25zdCBjaGFyICphcnBfdmFsaWRhdGUgPSBnZXRfbmFtZShhcnBfdmFsaWRhdGVfdGJsLAorCQkJcnRhX2dldGF0dHJfdTMyKHRiW0lGTEFfQk9ORF9BUlBfVkFMSURBVEVdKSk7CisJCWZwcmludGYoZiwgImFycF92YWxpZGF0ZSAlcyAiLCBhcnBfdmFsaWRhdGUpOworCX0KKworCWlmICh0YltJRkxBX0JPTkRfQVJQX0FMTF9UQVJHRVRTXSkgeworCQljb25zdCBjaGFyICphcnBfYWxsX3RhcmdldHMgPSBnZXRfbmFtZShhcnBfYWxsX3RhcmdldHNfdGJsLAorCQkJcnRhX2dldGF0dHJfdTMyKHRiW0lGTEFfQk9ORF9BUlBfQUxMX1RBUkdFVFNdKSk7CisJCWZwcmludGYoZiwgImFycF9hbGxfdGFyZ2V0cyAlcyAiLCBhcnBfYWxsX3RhcmdldHMpOworCX0KKworCWlmICh0YltJRkxBX0JPTkRfUFJJTUFSWV0gJiYKKwkgICAgKGlmaW5kZXggPSBydGFfZ2V0YXR0cl91MzIodGJbSUZMQV9CT05EX1BSSU1BUlldKSkpIHsKKwkJY2hhciBidWZbSUZOQU1TSVpdOworCQljb25zdCBjaGFyICpuID0gaWZfaW5kZXh0b25hbWUoaWZpbmRleCwgYnVmKTsKKworCQlpZiAobikKKwkJCWZwcmludGYoZiwgInByaW1hcnkgJXMgIiwgbik7CisJCWVsc2UKKwkJCWZwcmludGYoZiwgInByaW1hcnkgJXUgIiwgaWZpbmRleCk7CisJfQorCisJaWYgKHRiW0lGTEFfQk9ORF9QUklNQVJZX1JFU0VMRUNUXSkgeworCQljb25zdCBjaGFyICpwcmltYXJ5X3Jlc2VsZWN0ID0gZ2V0X25hbWUocHJpbWFyeV9yZXNlbGVjdF90YmwsCisJCQlydGFfZ2V0YXR0cl91OCh0YltJRkxBX0JPTkRfUFJJTUFSWV9SRVNFTEVDVF0pKTsKKwkJZnByaW50ZihmLCAicHJpbWFyeV9yZXNlbGVjdCAlcyAiLCBwcmltYXJ5X3Jlc2VsZWN0KTsKKwl9CisKKwlpZiAodGJbSUZMQV9CT05EX0ZBSUxfT1ZFUl9NQUNdKSB7CisJCWNvbnN0IGNoYXIgKmZhaWxfb3Zlcl9tYWMgPSBnZXRfbmFtZShmYWlsX292ZXJfbWFjX3RibCwKKwkJCXJ0YV9nZXRhdHRyX3U4KHRiW0lGTEFfQk9ORF9GQUlMX09WRVJfTUFDXSkpOworCQlmcHJpbnRmKGYsICJmYWlsX292ZXJfbWFjICVzICIsIGZhaWxfb3Zlcl9tYWMpOworCX0KKworCWlmICh0YltJRkxBX0JPTkRfWE1JVF9IQVNIX1BPTElDWV0pIHsKKwkJY29uc3QgY2hhciAqeG1pdF9oYXNoX3BvbGljeSA9IGdldF9uYW1lKHhtaXRfaGFzaF9wb2xpY3lfdGJsLAorCQkJcnRhX2dldGF0dHJfdTgodGJbSUZMQV9CT05EX1hNSVRfSEFTSF9QT0xJQ1ldKSk7CisJCWZwcmludGYoZiwgInhtaXRfaGFzaF9wb2xpY3kgJXMgIiwgeG1pdF9oYXNoX3BvbGljeSk7CisJfQorCisJaWYgKHRiW0lGTEFfQk9ORF9SRVNFTkRfSUdNUF0pCisJCWZwcmludGYoZiwgInJlc2VuZF9pZ21wICV1ICIsCisJCQlydGFfZ2V0YXR0cl91MzIodGJbSUZMQV9CT05EX1JFU0VORF9JR01QXSkpOworCisJaWYgKHRiW0lGTEFfQk9ORF9OVU1fUEVFUl9OT1RJRl0pCisJCWZwcmludGYoZiwgIm51bV9ncmF0X2FycCAldSAiLAorCQkJcnRhX2dldGF0dHJfdTgodGJbSUZMQV9CT05EX05VTV9QRUVSX05PVElGXSkpOworCisJaWYgKHRiW0lGTEFfQk9ORF9BTExfU0xBVkVTX0FDVElWRV0pCisJCWZwcmludGYoZiwgImFsbF9zbGF2ZXNfYWN0aXZlICV1ICIsCisJCQlydGFfZ2V0YXR0cl91OCh0YltJRkxBX0JPTkRfQUxMX1NMQVZFU19BQ1RJVkVdKSk7CisKKwlpZiAodGJbSUZMQV9CT05EX01JTl9MSU5LU10pCisJCWZwcmludGYoZiwgIm1pbl9saW5rcyAldSAiLAorCQkJcnRhX2dldGF0dHJfdTMyKHRiW0lGTEFfQk9ORF9NSU5fTElOS1NdKSk7CisKKwlpZiAodGJbSUZMQV9CT05EX0xQX0lOVEVSVkFMXSkKKwkJZnByaW50ZihmLCAibHBfaW50ZXJ2YWwgJXUgIiwKKwkJCXJ0YV9nZXRhdHRyX3UzMih0YltJRkxBX0JPTkRfTFBfSU5URVJWQUxdKSk7CisKKwlpZiAodGJbSUZMQV9CT05EX1BBQ0tFVFNfUEVSX1NMQVZFXSkKKwkJZnByaW50ZihmLCAicGFja2V0c19wZXJfc2xhdmUgJXUgIiwKKwkJCXJ0YV9nZXRhdHRyX3UzMih0YltJRkxBX0JPTkRfUEFDS0VUU19QRVJfU0xBVkVdKSk7CisKKwlpZiAodGJbSUZMQV9CT05EX0FEX0xBQ1BfUkFURV0pIHsKKwkJY29uc3QgY2hhciAqbGFjcF9yYXRlID0gZ2V0X25hbWUobGFjcF9yYXRlX3RibCwKKwkJCXJ0YV9nZXRhdHRyX3U4KHRiW0lGTEFfQk9ORF9BRF9MQUNQX1JBVEVdKSk7CisJCWZwcmludGYoZiwgImxhY3BfcmF0ZSAlcyAiLCBsYWNwX3JhdGUpOworCX0KKworCWlmICh0YltJRkxBX0JPTkRfQURfU0VMRUNUXSkgeworCQljb25zdCBjaGFyICphZF9zZWxlY3QgPSBnZXRfbmFtZShhZF9zZWxlY3RfdGJsLAorCQkJcnRhX2dldGF0dHJfdTgodGJbSUZMQV9CT05EX0FEX1NFTEVDVF0pKTsKKwkJZnByaW50ZihmLCAiYWRfc2VsZWN0ICVzICIsIGFkX3NlbGVjdCk7CisJfQorCisJaWYgKHRiW0lGTEFfQk9ORF9BRF9JTkZPXSkgeworCQlzdHJ1Y3QgcnRhdHRyICphZHRiW0lGTEFfQk9ORF9BRF9JTkZPX01BWCArIDFdOworCisJCXBhcnNlX3J0YXR0cl9uZXN0ZWQoYWR0YiwgSUZMQV9CT05EX0FEX0lORk9fTUFYLAorCQkJdGJbSUZMQV9CT05EX0FEX0lORk9dKTsKKworCQlpZiAoYWR0YltJRkxBX0JPTkRfQURfSU5GT19BR0dSRUdBVE9SXSkKKwkJCWZwcmludGYoZiwgImFkX2FnZ3JlZ2F0b3IgJWQgIiwKKwkJCSAgcnRhX2dldGF0dHJfdTE2KGFkdGJbSUZMQV9CT05EX0FEX0lORk9fQUdHUkVHQVRPUl0pKTsKKworCQlpZiAoYWR0YltJRkxBX0JPTkRfQURfSU5GT19OVU1fUE9SVFNdKQorCQkJZnByaW50ZihmLCAiYWRfbnVtX3BvcnRzICVkICIsCisJCQkgIHJ0YV9nZXRhdHRyX3UxNihhZHRiW0lGTEFfQk9ORF9BRF9JTkZPX05VTV9QT1JUU10pKTsKKworCQlpZiAoYWR0YltJRkxBX0JPTkRfQURfSU5GT19BQ1RPUl9LRVldKQorCQkJZnByaW50ZihmLCAiYWRfYWN0b3Jfa2V5ICVkICIsCisJCQkgIHJ0YV9nZXRhdHRyX3UxNihhZHRiW0lGTEFfQk9ORF9BRF9JTkZPX0FDVE9SX0tFWV0pKTsKKworCQlpZiAoYWR0YltJRkxBX0JPTkRfQURfSU5GT19QQVJUTkVSX0tFWV0pCisJCQlmcHJpbnRmKGYsICJhZF9wYXJ0bmVyX2tleSAlZCAiLAorCQkJICBydGFfZ2V0YXR0cl91MTYoYWR0YltJRkxBX0JPTkRfQURfSU5GT19QQVJUTkVSX0tFWV0pKTsKKworCQlpZiAoYWR0YltJRkxBX0JPTkRfQURfSU5GT19QQVJUTkVSX01BQ10pIHsKKwkJCXVuc2lnbmVkIGNoYXIgKnAgPQorCQkJCVJUQV9EQVRBKGFkdGJbSUZMQV9CT05EX0FEX0lORk9fUEFSVE5FUl9NQUNdKTsKKwkJCVNQUklOVF9CVUYoYik7CisJCQlmcHJpbnRmKGYsICJhZF9wYXJ0bmVyX21hYyAlcyAiLAorCQkJCWxsX2FkZHJfbjJhKHAsIEVUSF9BTEVOLCAwLCBiLCBzaXplb2YoYikpKTsKKwkJfQorCX0KKworCWlmICh0YltJRkxBX0JPTkRfQURfQUNUT1JfU1lTX1BSSU9dKSB7CisJCWZwcmludGYoZiwgImFkX2FjdG9yX3N5c19wcmlvICV1ICIsCisJCQlydGFfZ2V0YXR0cl91MTYodGJbSUZMQV9CT05EX0FEX0FDVE9SX1NZU19QUklPXSkpOworCX0KKworCWlmICh0YltJRkxBX0JPTkRfQURfVVNFUl9QT1JUX0tFWV0pIHsKKwkJZnByaW50ZihmLCAiYWRfdXNlcl9wb3J0X2tleSAldSAiLAorCQkJcnRhX2dldGF0dHJfdTE2KHRiW0lGTEFfQk9ORF9BRF9VU0VSX1BPUlRfS0VZXSkpOworCX0KKworCWlmICh0YltJRkxBX0JPTkRfQURfQUNUT1JfU1lTVEVNXSkgeworCQkvKiBXZSBhc3N1bWUgdGhlIGwyIGFkZHJlc3MgaXMgYW4gRXRoZXJuZXQgTUFDIGFkZHJlc3MgKi8KKwkJU1BSSU5UX0JVRihiMSk7CisJCWZwcmludGYoZiwgImFkX2FjdG9yX3N5c3RlbSAlcyAiLAorCQkJbGxfYWRkcl9uMmEoUlRBX0RBVEEodGJbSUZMQV9CT05EX0FEX0FDVE9SX1NZU1RFTV0pLAorCQkJCSAgICBSVEFfUEFZTE9BRCh0YltJRkxBX0JPTkRfQURfQUNUT1JfU1lTVEVNXSksCisJCQkJICAgIDEgLypBUlBIRFJfRVRIRVIqLywgYjEsIHNpemVvZihiMSkpKTsKKwl9CisKKwlpZiAodGJbSUZMQV9CT05EX1RMQl9EWU5BTUlDX0xCXSkgeworCQlmcHJpbnRmKGYsICJ0bGJfZHluYW1pY19sYiAldSAiLAorCQkJcnRhX2dldGF0dHJfdTgodGJbSUZMQV9CT05EX1RMQl9EWU5BTUlDX0xCXSkpOworCX0KK30KKworc3RhdGljIHZvaWQgYm9uZF9wcmludF9oZWxwKHN0cnVjdCBsaW5rX3V0aWwgKmx1LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCisJRklMRSAqZikKK3sKKwlwcmludF9leHBsYWluKGYpOworfQorCitzdHJ1Y3QgbGlua191dGlsIGJvbmRfbGlua191dGlsID0geworCS5pZAkJPSAiYm9uZCIsCisJLm1heGF0dHIJPSBJRkxBX0JPTkRfTUFYLAorCS5wYXJzZV9vcHQJPSBib25kX3BhcnNlX29wdCwKKwkucHJpbnRfb3B0CT0gYm9uZF9wcmludF9vcHQsCisJLnByaW50X2hlbHAJPSBib25kX3ByaW50X2hlbHAsCit9OwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaXAvaXBsaW5rX2JvbmRfc2xhdmUuYyBiL2lwcm91dGUyL2lwL2lwbGlua19ib25kX3NsYXZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI1NjliMQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2lwL2lwbGlua19ib25kX3NsYXZlLmMKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBpcGxpbmtfYm9uZF9zbGF2ZS5jCUJvbmRpbmcgc2xhdmUgZGV2aWNlIHN1cHBvcnQKKyAqCisgKiAgICAgICAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICAgICAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgICAgICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgICAgICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOiAgICAgSmlyaSBQaXJrbyA8amlyaUByZXNudWxsaS51cz4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfYm9uZGluZy5oPgorCisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgImlwX2NvbW1vbi5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqc2xhdmVfc3RhdGVzW10gPSB7CisJW0JPTkRfU1RBVEVfQUNUSVZFXSA9ICJBQ1RJVkUiLAorCVtCT05EX1NUQVRFX0JBQ0tVUF0gPSAiQkFDS1VQIiwKK307CisKK3N0YXRpYyB2b2lkIHByaW50X3NsYXZlX3N0YXRlKEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKnRiKQoreworCXVuc2lnbmVkIGludCBzdGF0ZSA9IHJ0YV9nZXRhdHRyX3U4KHRiKTsKKworCWlmIChzdGF0ZSA+PSBzaXplb2Yoc2xhdmVfc3RhdGVzKSAvIHNpemVvZihzbGF2ZV9zdGF0ZXNbMF0pKQorCQlmcHJpbnRmKGYsICJzdGF0ZSAlZCAiLCBzdGF0ZSk7CisJZWxzZQorCQlmcHJpbnRmKGYsICJzdGF0ZSAlcyAiLCBzbGF2ZV9zdGF0ZXNbc3RhdGVdKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnNsYXZlX21paV9zdGF0dXNbXSA9IHsKKwlbQk9ORF9MSU5LX1VQXSA9ICJVUCIsCisJW0JPTkRfTElOS19GQUlMXSA9ICJHT0lOR19ET1dOIiwKKwlbQk9ORF9MSU5LX0RPV05dID0gIkRPV04iLAorCVtCT05EX0xJTktfQkFDS10gPSAiR09JTkdfQkFDSyIsCit9OworCitzdGF0aWMgdm9pZCBwcmludF9zbGF2ZV9taWlfc3RhdHVzKEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKnRiKQoreworCXVuc2lnbmVkIGludCBzdGF0dXMgPSBydGFfZ2V0YXR0cl91OCh0Yik7CisKKwlpZiAoc3RhdHVzID49IHNpemVvZihzbGF2ZV9taWlfc3RhdHVzKSAvIHNpemVvZihzbGF2ZV9taWlfc3RhdHVzWzBdKSkKKwkJZnByaW50ZihmLCAibWlpX3N0YXR1cyAlZCAiLCBzdGF0dXMpOworCWVsc2UKKwkJZnByaW50ZihmLCAibWlpX3N0YXR1cyAlcyAiLCBzbGF2ZV9taWlfc3RhdHVzW3N0YXR1c10pOworfQorCitzdGF0aWMgdm9pZCBib25kX3NsYXZlX3ByaW50X29wdChzdHJ1Y3QgbGlua191dGlsICpsdSwgRklMRSAqZiwgc3RydWN0IHJ0YXR0ciAqdGJbXSkKK3sKKwlTUFJJTlRfQlVGKGIxKTsKKwlpZiAoIXRiKQorCQlyZXR1cm47CisKKwlpZiAodGJbSUZMQV9CT05EX1NMQVZFX1NUQVRFXSkKKwkJcHJpbnRfc2xhdmVfc3RhdGUoZiwgdGJbSUZMQV9CT05EX1NMQVZFX1NUQVRFXSk7CisKKwlpZiAodGJbSUZMQV9CT05EX1NMQVZFX01JSV9TVEFUVVNdKQorCQlwcmludF9zbGF2ZV9taWlfc3RhdHVzKGYsIHRiW0lGTEFfQk9ORF9TTEFWRV9NSUlfU1RBVFVTXSk7CisKKwlpZiAodGJbSUZMQV9CT05EX1NMQVZFX0xJTktfRkFJTFVSRV9DT1VOVF0pCisJCWZwcmludGYoZiwgImxpbmtfZmFpbHVyZV9jb3VudCAlZCAiLAorCQkJcnRhX2dldGF0dHJfdTMyKHRiW0lGTEFfQk9ORF9TTEFWRV9MSU5LX0ZBSUxVUkVfQ09VTlRdKSk7CisKKwlpZiAodGJbSUZMQV9CT05EX1NMQVZFX1BFUk1fSFdBRERSXSkKKwkJZnByaW50ZihmLCAicGVybV9od2FkZHIgJXMgIiwKKwkJCWxsX2FkZHJfbjJhKFJUQV9EQVRBKHRiW0lGTEFfQk9ORF9TTEFWRV9QRVJNX0hXQUREUl0pLAorCQkJCSAgICBSVEFfUEFZTE9BRCh0YltJRkxBX0JPTkRfU0xBVkVfUEVSTV9IV0FERFJdKSwKKwkJCQkgICAgMCwgYjEsIHNpemVvZihiMSkpKTsKKworCWlmICh0YltJRkxBX0JPTkRfU0xBVkVfUVVFVUVfSURdKQorCQlmcHJpbnRmKGYsICJxdWV1ZV9pZCAlZCAiLAorCQkJcnRhX2dldGF0dHJfdTE2KHRiW0lGTEFfQk9ORF9TTEFWRV9RVUVVRV9JRF0pKTsKKworCWlmICh0YltJRkxBX0JPTkRfU0xBVkVfQURfQUdHUkVHQVRPUl9JRF0pCisJCWZwcmludGYoZiwgImFkX2FnZ3JlZ2F0b3JfaWQgJWQgIiwKKwkJCXJ0YV9nZXRhdHRyX3UxNih0YltJRkxBX0JPTkRfU0xBVkVfQURfQUdHUkVHQVRPUl9JRF0pKTsKKworCWlmICh0YltJRkxBX0JPTkRfU0xBVkVfQURfQUNUT1JfT1BFUl9QT1JUX1NUQVRFXSkKKwkJZnByaW50ZihmLCAiYWRfYWN0b3Jfb3Blcl9wb3J0X3N0YXRlICVkXG4iLAorCQkJcnRhX2dldGF0dHJfdTgodGJbSUZMQV9CT05EX1NMQVZFX0FEX0FDVE9SX09QRVJfUE9SVF9TVEFURV0pKTsKKworCWlmICh0YltJRkxBX0JPTkRfU0xBVkVfQURfUEFSVE5FUl9PUEVSX1BPUlRfU1RBVEVdKQorCQlmcHJpbnRmKGYsICJhZF9wYXJ0bmVyX29wZXJfcG9ydF9zdGF0ZSAlZFxuIiwKKwkJCXJ0YV9nZXRhdHRyX3UxNih0YltJRkxBX0JPTkRfU0xBVkVfQURfUEFSVE5FUl9PUEVSX1BPUlRfU1RBVEVdKSk7Cit9CisKK3N0YXRpYyBpbnQgYm9uZF9zbGF2ZV9wYXJzZV9vcHQoc3RydWN0IGxpbmtfdXRpbCAqbHUsIGludCBhcmdjLCBjaGFyICoqYXJndiwKKwkJCQlzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJX191MTYgcXVldWVfaWQ7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJxdWV1ZV9pZCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UxNigmcXVldWVfaWQsICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoInF1ZXVlX2lkIGlzIGludmFsaWQiLCAqYXJndik7CisJCQlhZGRhdHRyMTYobiwgMTAyNCwgSUZMQV9CT05EX1NMQVZFX1FVRVVFX0lELCBxdWV1ZV9pZCk7CisJCX0KKwkJYXJnYy0tLCBhcmd2Kys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBsaW5rX3V0aWwgYm9uZF9zbGF2ZV9saW5rX3V0aWwgPSB7CisJLmlkCQk9ICJib25kIiwKKwkubWF4YXR0cgk9IElGTEFfQk9ORF9TTEFWRV9NQVgsCisJLnByaW50X29wdAk9IGJvbmRfc2xhdmVfcHJpbnRfb3B0LAorCS5wYXJzZV9vcHQJPSBib25kX3NsYXZlX3BhcnNlX29wdCwKKwkuc2xhdmUJCT0gdHJ1ZSwKK307CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pcC9pcGxpbmtfYnJpZGdlLmMgYi9pcHJvdXRlMi9pcC9pcGxpbmtfYnJpZGdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA4MDQwOQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2lwL2lwbGlua19icmlkZ2UuYwpAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIGlwbGlua19icmlkZ2UuYwlCcmlkZ2UgZGV2aWNlIHN1cHBvcnQKKyAqCisgKiAgICAgICAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICAgICAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgICAgICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgICAgICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOiAgICAgSmlyaSBQaXJrbyA8amlyaUByZXNudWxsaS51cz4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9saW5rLmg+CisKKyNpbmNsdWRlICJydF9uYW1lcy5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiaXBfY29tbW9uLmgiCisKK3N0YXRpYyB2b2lkIHByaW50X2V4cGxhaW4oRklMRSAqZikKK3sKKwlmcHJpbnRmKGYsCisJCSJVc2FnZTogLi4uIGJyaWRnZSBbIGZvcndhcmRfZGVsYXkgRk9SV0FSRF9ERUxBWSBdXG4iCisJCSIgICAgICAgICAgICAgICAgICBbIGhlbGxvX3RpbWUgSEVMTE9fVElNRSBdXG4iCisJCSIgICAgICAgICAgICAgICAgICBbIG1heF9hZ2UgTUFYX0FHRSBdXG4iCisJCSIgICAgICAgICAgICAgICAgICBbIGFnZWluZ190aW1lIEFHRUlOR19USU1FIF1cbiIKKwkJIiAgICAgICAgICAgICAgICAgIFsgc3RwX3N0YXRlIFNUUF9TVEFURSBdXG4iCisJCSIgICAgICAgICAgICAgICAgICBbIHByaW9yaXR5IFBSSU9SSVRZIF1cbiIKKwkJIiAgICAgICAgICAgICAgICAgIFsgdmxhbl9maWx0ZXJpbmcgVkxBTl9GSUxURVJJTkcgXVxuIgorCQkiICAgICAgICAgICAgICAgICAgWyB2bGFuX3Byb3RvY29sIFZMQU5fUFJPVE9DT0wgXVxuIgorCQkiXG4iCisJCSJXaGVyZTogVkxBTl9QUk9UT0NPTCA6PSB7IDgwMi4xUSB8IDgwMi4xYWQgfVxuIgorCSk7Cit9CisKK3N0YXRpYyB2b2lkIGV4cGxhaW4odm9pZCkKK3sKKwlwcmludF9leHBsYWluKHN0ZGVycik7Cit9CisKK3N0YXRpYyBpbnQgYnJpZGdlX3BhcnNlX29wdChzdHJ1Y3QgbGlua191dGlsICpsdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCQkJICAgIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlfX3UzMiB2YWw7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJmb3J3YXJkX2RlbGF5IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTMyKCZ2YWwsICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoImludmFsaWQgZm9yd2FyZF9kZWxheSIsICphcmd2KTsKKworCQkJYWRkYXR0cjMyKG4sIDEwMjQsIElGTEFfQlJfRk9SV0FSRF9ERUxBWSwgdmFsKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiaGVsbG9fdGltZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmdmFsLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJpbnZhbGlkIGhlbGxvX3RpbWUiLCAqYXJndik7CisKKwkJCWFkZGF0dHIzMihuLCAxMDI0LCBJRkxBX0JSX0hFTExPX1RJTUUsIHZhbCk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgIm1heF9hZ2UiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJnZhbCwgKmFyZ3YsIDApKQorCQkJCWludmFyZygiaW52YWxpZCBtYXhfYWdlIiwgKmFyZ3YpOworCisJCQlhZGRhdHRyMzIobiwgMTAyNCwgSUZMQV9CUl9NQVhfQUdFLCB2YWwpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJhZ2VpbmdfdGltZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmdmFsLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJpbnZhbGlkIGFnZWluZ190aW1lIiwgKmFyZ3YpOworCisJCQlhZGRhdHRyMzIobiwgMTAyNCwgSUZMQV9CUl9BR0VJTkdfVElNRSwgdmFsKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAic3RwX3N0YXRlIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTMyKCZ2YWwsICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoImludmFsaWQgc3RwX3N0YXRlIiwgKmFyZ3YpOworCisJCQlhZGRhdHRyMzIobiwgMTAyNCwgSUZMQV9CUl9TVFBfU1RBVEUsIHZhbCk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInByaW9yaXR5IikgPT0gMCkgeworCQkJX191MTYgcHJpbzsKKworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTE2KCZwcmlvLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJpbnZhbGlkIHByaW9yaXR5IiwgKmFyZ3YpOworCisJCQlhZGRhdHRyMTYobiwgMTAyNCwgSUZMQV9CUl9QUklPUklUWSwgcHJpbyk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInZsYW5fZmlsdGVyaW5nIikgPT0gMCkgeworCQkJX191OCB2bGFuX2ZpbHRlcjsKKworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTgoJnZsYW5fZmlsdGVyLCAqYXJndiwgMCkpIHsKKwkJCQlpbnZhcmcoImludmFsaWQgdmxhbl9maWx0ZXJpbmciLCAqYXJndik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYWRkYXR0cjgobiwgMTAyNCwgSUZMQV9CUl9WTEFOX0ZJTFRFUklORywgdmxhbl9maWx0ZXIpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJ2bGFuX3Byb3RvY29sIikgPT0gMCkgeworCQkJX191MTYgdmxhbl9wcm90bzsKKworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChsbF9wcm90b19hMm4oJnZsYW5fcHJvdG8sICphcmd2KSkgeworCQkJCWludmFyZygiaW52YWxpZCB2bGFuX3Byb3RvY29sIiwgKmFyZ3YpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWFkZGF0dHIxNihuLCAxMDI0LCBJRkxBX0JSX1ZMQU5fUFJPVE9DT0wsIHZsYW5fcHJvdG8pOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJicmlkZ2U6IHVua25vd24gY29tbWFuZCBcIiVzXCI/XG4iLCAqYXJndik7CisJCQlleHBsYWluKCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYXJnYy0tLCBhcmd2Kys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJyaWRnZV9wcmludF9vcHQoc3RydWN0IGxpbmtfdXRpbCAqbHUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKnRiW10pCit7CisJaWYgKCF0YikKKwkJcmV0dXJuOworCisJaWYgKHRiW0lGTEFfQlJfRk9SV0FSRF9ERUxBWV0pCisJCWZwcmludGYoZiwgImZvcndhcmRfZGVsYXkgJXUgIiwKKwkJCXJ0YV9nZXRhdHRyX3UzMih0YltJRkxBX0JSX0ZPUldBUkRfREVMQVldKSk7CisKKwlpZiAodGJbSUZMQV9CUl9IRUxMT19USU1FXSkKKwkJZnByaW50ZihmLCAiaGVsbG9fdGltZSAldSAiLAorCQkJcnRhX2dldGF0dHJfdTMyKHRiW0lGTEFfQlJfSEVMTE9fVElNRV0pKTsKKworCWlmICh0YltJRkxBX0JSX01BWF9BR0VdKQorCQlmcHJpbnRmKGYsICJtYXhfYWdlICV1ICIsCisJCQlydGFfZ2V0YXR0cl91MzIodGJbSUZMQV9CUl9NQVhfQUdFXSkpOworCisJaWYgKHRiW0lGTEFfQlJfQUdFSU5HX1RJTUVdKQorCQlmcHJpbnRmKGYsICJhZ2VpbmdfdGltZSAldSAiLAorCQkJcnRhX2dldGF0dHJfdTMyKHRiW0lGTEFfQlJfQUdFSU5HX1RJTUVdKSk7CisKKwlpZiAodGJbSUZMQV9CUl9TVFBfU1RBVEVdKQorCQlmcHJpbnRmKGYsICJzdHBfc3RhdGUgJXUgIiwKKwkJCXJ0YV9nZXRhdHRyX3UzMih0YltJRkxBX0JSX1NUUF9TVEFURV0pKTsKKworCWlmICh0YltJRkxBX0JSX1BSSU9SSVRZXSkKKwkJZnByaW50ZihmLCAicHJpb3JpdHkgJXUgIiwKKwkJCXJ0YV9nZXRhdHRyX3UxNih0YltJRkxBX0JSX1BSSU9SSVRZXSkpOworCisJaWYgKHRiW0lGTEFfQlJfVkxBTl9GSUxURVJJTkddKQorCQlmcHJpbnRmKGYsICJ2bGFuX2ZpbHRlcmluZyAldSAiLAorCQkJcnRhX2dldGF0dHJfdTgodGJbSUZMQV9CUl9WTEFOX0ZJTFRFUklOR10pKTsKKworCWlmICh0YltJRkxBX0JSX1ZMQU5fUFJPVE9DT0xdKSB7CisJCVNQUklOVF9CVUYoYjEpOworCisJCWZwcmludGYoZiwgInZsYW5fcHJvdG9jb2wgJXMgIiwKKwkJCWxsX3Byb3RvX24yYShydGFfZ2V0YXR0cl91MTYodGJbSUZMQV9CUl9WTEFOX1BST1RPQ09MXSksCisJCQkJICAgICBiMSwgc2l6ZW9mKGIxKSkpOworCX0KK30KKworc3RhdGljIHZvaWQgYnJpZGdlX3ByaW50X2hlbHAoc3RydWN0IGxpbmtfdXRpbCAqbHUsIGludCBhcmdjLCBjaGFyICoqYXJndiwKKwkJRklMRSAqZikKK3sKKwlwcmludF9leHBsYWluKGYpOworfQorCitzdHJ1Y3QgbGlua191dGlsIGJyaWRnZV9saW5rX3V0aWwgPSB7CisJLmlkCQk9ICJicmlkZ2UiLAorCS5tYXhhdHRyCT0gSUZMQV9CUl9NQVgsCisJLnBhcnNlX29wdAk9IGJyaWRnZV9wYXJzZV9vcHQsCisJLnByaW50X29wdAk9IGJyaWRnZV9wcmludF9vcHQsCisJLnByaW50X2hlbHAgICAgID0gYnJpZGdlX3ByaW50X2hlbHAsCit9OwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaXAvaXBsaW5rX2JyaWRnZV9zbGF2ZS5jIGIvaXByb3V0ZTIvaXAvaXBsaW5rX2JyaWRnZV9zbGF2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OTM4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pcC9pcGxpbmtfYnJpZGdlX3NsYXZlLmMKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBpcGxpbmtfYnJpZGdlX3NsYXZlLmMJQnJpZGdlIHNsYXZlIGRldmljZSBzdXBwb3J0CisgKgorICogICAgICAgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgICAgICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICAgICAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAgICAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczogICAgIEppcmkgUGlya28gPGppcmlAcmVzbnVsbGkudXM+CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9saW5rLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYnJpZGdlLmg+CisKKyNpbmNsdWRlICJydF9uYW1lcy5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiaXBfY29tbW9uLmgiCisKK3N0YXRpYyB2b2lkIHByaW50X2V4cGxhaW4oRklMRSAqZikKK3sKKwlmcHJpbnRmKGYsCisJCSJVc2FnZTogLi4uIGJyaWRnZV9zbGF2ZSBbIHN0YXRlIFNUQVRFIF0gWyBwcmlvcml0eSBQUklPIF0gW2Nvc3QgQ09TVCBdXG4iCisJCSIgICAgICAgICAgICAgICAgICAgICAgICBbIGd1YXJkIHtvbiB8IG9mZn0gXVxuIgorCQkiICAgICAgICAgICAgICAgICAgICAgICAgWyBoYWlycGluIHtvbiB8IG9mZn0gXSBcbiIKKwkJIiAgICAgICAgICAgICAgICAgICAgICAgIFsgZmFzdGxlYXZlIHtvbiB8IG9mZn0gXVxuIgorCQkiICAgICAgICAgICAgICAgICAgICAgICAgWyByb290X2Jsb2NrIHtvbiB8IG9mZn0gXVxuIgorCQkiICAgICAgICAgICAgICAgICAgICAgICAgWyBsZWFybmluZyB7b24gfCBvZmZ9IF1cbiIKKwkJIiAgICAgICAgICAgICAgICAgICAgICAgIFsgZmxvb2Qge29uIHwgb2ZmfSBdXG4iCisJKTsKK30KKworc3RhdGljIHZvaWQgZXhwbGFpbih2b2lkKQoreworCXByaW50X2V4cGxhaW4oc3RkZXJyKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnBvcnRfc3RhdGVzW10gPSB7CisJW0JSX1NUQVRFX0RJU0FCTEVEXSA9ICJkaXNhYmxlZCIsCisJW0JSX1NUQVRFX0xJU1RFTklOR10gPSAibGlzdGVuaW5nIiwKKwlbQlJfU1RBVEVfTEVBUk5JTkddID0gImxlYXJuaW5nIiwKKwlbQlJfU1RBVEVfRk9SV0FSRElOR10gPSAiZm9yd2FyZGluZyIsCisJW0JSX1NUQVRFX0JMT0NLSU5HXSA9ICJibG9ja2luZyIsCit9OworCitzdGF0aWMgdm9pZCBwcmludF9wb3J0c3RhdGUoRklMRSAqZiwgX191OCBzdGF0ZSkKK3sKKwlpZiAoc3RhdGUgPD0gQlJfU1RBVEVfQkxPQ0tJTkcpCisJCWZwcmludGYoZiwgInN0YXRlICVzICIsIHBvcnRfc3RhdGVzW3N0YXRlXSk7CisJZWxzZQorCQlmcHJpbnRmKGYsICJzdGF0ZSAoJWQpICIsIHN0YXRlKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfb25vZmYoRklMRSAqZiwgY2hhciAqZmxhZywgX191OCB2YWwpCit7CisJZnByaW50ZihmLCAiJXMgJXMgIiwgZmxhZywgdmFsID8gIm9uIiA6ICJvZmYiKTsKK30KKworc3RhdGljIHZvaWQgYnJpZGdlX3NsYXZlX3ByaW50X29wdChzdHJ1Y3QgbGlua191dGlsICpsdSwgRklMRSAqZiwKKwkJCQkgICBzdHJ1Y3QgcnRhdHRyICp0YltdKQoreworCWlmICghdGIpCisJCXJldHVybjsKKworCWlmICh0YltJRkxBX0JSUE9SVF9TVEFURV0pCisJCXByaW50X3BvcnRzdGF0ZShmLCBydGFfZ2V0YXR0cl91OCh0YltJRkxBX0JSUE9SVF9TVEFURV0pKTsKKworCWlmICh0YltJRkxBX0JSUE9SVF9QUklPUklUWV0pCisJCWZwcmludGYoZiwgInByaW9yaXR5ICVkICIsCisJCQlydGFfZ2V0YXR0cl91MTYodGJbSUZMQV9CUlBPUlRfUFJJT1JJVFldKSk7CisKKwlpZiAodGJbSUZMQV9CUlBPUlRfQ09TVF0pCisJCWZwcmludGYoZiwgImNvc3QgJWQgIiwKKwkJCXJ0YV9nZXRhdHRyX3UzMih0YltJRkxBX0JSUE9SVF9DT1NUXSkpOworCisJaWYgKHRiW0lGTEFfQlJQT1JUX01PREVdKQorCQlwcmludF9vbm9mZihmLCAiaGFpcnBpbiIsCisJCQkgICAgcnRhX2dldGF0dHJfdTgodGJbSUZMQV9CUlBPUlRfTU9ERV0pKTsKKworCWlmICh0YltJRkxBX0JSUE9SVF9HVUFSRF0pCisJCXByaW50X29ub2ZmKGYsICJndWFyZCIsCisJCQkgICAgcnRhX2dldGF0dHJfdTgodGJbSUZMQV9CUlBPUlRfR1VBUkRdKSk7CisKKwlpZiAodGJbSUZMQV9CUlBPUlRfUFJPVEVDVF0pCisJCXByaW50X29ub2ZmKGYsICJyb290X2Jsb2NrIiwKKwkJCSAgICBydGFfZ2V0YXR0cl91OCh0YltJRkxBX0JSUE9SVF9QUk9URUNUXSkpOworCisJaWYgKHRiW0lGTEFfQlJQT1JUX0ZBU1RfTEVBVkVdKQorCQlwcmludF9vbm9mZihmLCAiZmFzdGxlYXZlIiwKKwkJCSAgICBydGFfZ2V0YXR0cl91OCh0YltJRkxBX0JSUE9SVF9GQVNUX0xFQVZFXSkpOworCisJaWYgKHRiW0lGTEFfQlJQT1JUX0xFQVJOSU5HXSkKKwkJcHJpbnRfb25vZmYoZiwgImxlYXJuaW5nIiwKKwkJCXJ0YV9nZXRhdHRyX3U4KHRiW0lGTEFfQlJQT1JUX0xFQVJOSU5HXSkpOworCisJaWYgKHRiW0lGTEFfQlJQT1JUX1VOSUNBU1RfRkxPT0RdKQorCQlwcmludF9vbm9mZihmLCAiZmxvb2QiLAorCQkJcnRhX2dldGF0dHJfdTgodGJbSUZMQV9CUlBPUlRfVU5JQ0FTVF9GTE9PRF0pKTsKK30KKworc3RhdGljIHZvaWQgYnJpZGdlX3NsYXZlX3BhcnNlX29uX29mZihjaGFyICphcmdfbmFtZSwgY2hhciAqYXJnX3ZhbCwKKwkJCQkgICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm4sIGludCB0eXBlKQoreworCV9fdTggdmFsOworCisJaWYgKHN0cmNtcChhcmdfdmFsLCAib24iKSA9PSAwKQorCQl2YWwgPSAxOworCWVsc2UgaWYgKHN0cmNtcChhcmdfdmFsLCAib2ZmIikgPT0gMCkKKwkJdmFsID0gMDsKKwllbHNlCisJCWludmFyZygic2hvdWxkIGJlIFwib25cIiBvciBcIm9mZlwiIiwgYXJnX25hbWUpOworCisJYWRkYXR0cjgobiwgMTAyNCwgdHlwZSwgdmFsKTsKK30KKworc3RhdGljIGludCBicmlkZ2Vfc2xhdmVfcGFyc2Vfb3B0KHN0cnVjdCBsaW5rX3V0aWwgKmx1LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCisJCQkJICBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJX191OCBzdGF0ZTsKKwlfX3UxNiBwcmlvcml0eTsKKwlfX3UzMiBjb3N0OworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChtYXRjaGVzKCphcmd2LCAic3RhdGUiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91OCgmc3RhdGUsICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoInN0YXRlIGlzIGludmFsaWQiLCAqYXJndik7CisJCQlhZGRhdHRyOChuLCAxMDI0LCBJRkxBX0JSUE9SVF9TVEFURSwgc3RhdGUpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJwcmlvcml0eSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UxNigmcHJpb3JpdHksICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoInByaW9yaXR5IGlzIGludmFsaWQiLCAqYXJndik7CisJCQlhZGRhdHRyMTYobiwgMTAyNCwgSUZMQV9CUlBPUlRfUFJJT1JJVFksIHByaW9yaXR5KTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiY29zdCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmY29zdCwgKmFyZ3YsIDApKQorCQkJCWludmFyZygiY29zdCBpcyBpbnZhbGlkIiwgKmFyZ3YpOworCQkJYWRkYXR0cjMyKG4sIDEwMjQsIElGTEFfQlJQT1JUX0NPU1QsIGNvc3QpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJoYWlycGluIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWJyaWRnZV9zbGF2ZV9wYXJzZV9vbl9vZmYoImhhaXJwaW4iLCAqYXJndiwgbiwKKwkJCQkJCSAgSUZMQV9CUlBPUlRfTU9ERSk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImd1YXJkIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWJyaWRnZV9zbGF2ZV9wYXJzZV9vbl9vZmYoImd1YXJkIiwgKmFyZ3YsIG4sCisJCQkJCQkgIElGTEFfQlJQT1JUX0dVQVJEKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAicm9vdF9ibG9jayIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlicmlkZ2Vfc2xhdmVfcGFyc2Vfb25fb2ZmKCJyb290X2Jsb2NrIiwgKmFyZ3YsIG4sCisJCQkJCQkgIElGTEFfQlJQT1JUX1BST1RFQ1QpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJmYXN0bGVhdmUiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJYnJpZGdlX3NsYXZlX3BhcnNlX29uX29mZigiZmFzdGxlYXZlIiwgKmFyZ3YsIG4sCisJCQkJCQkgIElGTEFfQlJQT1JUX0ZBU1RfTEVBVkUpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJsZWFybmluZyIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlicmlkZ2Vfc2xhdmVfcGFyc2Vfb25fb2ZmKCJsZWFybmluZyIsICphcmd2LCBuLAorCQkJCQkJICBJRkxBX0JSUE9SVF9MRUFSTklORyk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImZsb29kIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWJyaWRnZV9zbGF2ZV9wYXJzZV9vbl9vZmYoImZsb29kIiwgKmFyZ3YsIG4sCisJCQkJCQkgIElGTEFfQlJQT1JUX1VOSUNBU1RfRkxPT0QpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJicmlkZ2Vfc2xhdmU6IHVua25vd24gb3B0aW9uIFwiJXNcIj9cbiIsCisJCQkJKmFyZ3YpOworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWFyZ2MtLSwgYXJndisrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBicmlkZ2Vfc2xhdmVfcHJpbnRfaGVscChzdHJ1Y3QgbGlua191dGlsICpsdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCQlGSUxFICpmKQoreworCXByaW50X2V4cGxhaW4oZik7Cit9CisKK3N0cnVjdCBsaW5rX3V0aWwgYnJpZGdlX3NsYXZlX2xpbmtfdXRpbCA9IHsKKwkuaWQJCT0gImJyaWRnZSIsCisJLm1heGF0dHIJPSBJRkxBX0JSUE9SVF9NQVgsCisJLnByaW50X29wdAk9IGJyaWRnZV9zbGF2ZV9wcmludF9vcHQsCisJLnBhcnNlX29wdAk9IGJyaWRnZV9zbGF2ZV9wYXJzZV9vcHQsCisJLnByaW50X2hlbHAgICAgID0gYnJpZGdlX3NsYXZlX3ByaW50X2hlbHAsCisJLnNsYXZlCQk9IHRydWUsCit9OwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaXAvaXBsaW5rX2Nhbi5jIGIvaXByb3V0ZTIvaXAvaXBsaW5rX2Nhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYjA4OWQKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pcC9pcGxpbmtfY2FuLmMKQEAgLTAsMCArMSwzNzcgQEAKKy8qCisgKiBpcGxpbmtfY2FuLmMJQ0FOIGRldmljZSBzdXBwb3J0CisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJV29sZmdhbmcgR3JhbmRlZ2dlciA8d2dAZ3JhbmRlZ2dlci5jb20+CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxsaW51eC9jYW4vbmV0bGluay5oPgorCisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgImlwX2NvbW1vbi5oIgorCitzdGF0aWMgdm9pZCBwcmludF91c2FnZShGSUxFICpmKQoreworCWZwcmludGYoZiwKKwkJIlVzYWdlOiBpcCBsaW5rIHNldCBERVZJQ0UgdHlwZSBjYW5cbiIKKwkJIlx0WyBiaXRyYXRlIEJJVFJBVEUgWyBzYW1wbGUtcG9pbnQgU0FNUExFLVBPSU5UXSBdIHwgXG4iCisJCSJcdFsgdHEgVFEgcHJvcC1zZWcgUFJPUF9TRUcgcGhhc2Utc2VnMSBQSEFTRS1TRUcxXG4gIgorCQkiXHQgIHBoYXNlLXNlZzIgUEhBU0UtU0VHMiBbIHNqdyBTSlcgXSBdXG4iCisJCSJcbiIKKwkJIlx0WyBkYml0cmF0ZSBCSVRSQVRFIFsgZHNhbXBsZS1wb2ludCBTQU1QTEUtUE9JTlRdIF0gfCBcbiIKKwkJIlx0WyBkdHEgVFEgZHByb3Atc2VnIFBST1BfU0VHIGRwaGFzZS1zZWcxIFBIQVNFLVNFRzFcbiAiCisJCSJcdCAgZHBoYXNlLXNlZzIgUEhBU0UtU0VHMiBbIGRzancgU0pXIF0gXVxuIgorCQkiXG4iCisJCSJcdFsgbG9vcGJhY2sgeyBvbiB8IG9mZiB9IF1cbiIKKwkJIlx0WyBsaXN0ZW4tb25seSB7IG9uIHwgb2ZmIH0gXVxuIgorCQkiXHRbIHRyaXBsZS1zYW1wbGluZyB7IG9uIHwgb2ZmIH0gXVxuIgorCQkiXHRbIG9uZS1zaG90IHsgb24gfCBvZmYgfSBdXG4iCisJCSJcdFsgYmVyci1yZXBvcnRpbmcgeyBvbiB8IG9mZiB9IF1cbiIKKwkJIlx0WyBmZCB7IG9uIHwgb2ZmIH0gXVxuIgorCQkiXHRbIGZkLW5vbi1pc28geyBvbiB8IG9mZiB9IF1cbiIKKwkJIlx0WyBwcmVzdW1lLWFjayB7IG9uIHwgb2ZmIH0gXVxuIgorCQkiXG4iCisJCSJcdFsgcmVzdGFydC1tcyBUSU1FLU1TIF1cbiIKKwkJIlx0WyByZXN0YXJ0IF1cbiIKKwkJIlxuIgorCQkiXHRXaGVyZTogQklUUkFURQk6PSB7IDEuLjEwMDAwMDAgfVxuIgorCQkiXHQJICBTQU1QTEUtUE9JTlQJOj0geyAwLjAwMC4uMC45OTkgfVxuIgorCQkiXHQJICBUUQkJOj0geyBOVU1CRVIgfVxuIgorCQkiXHQJICBQUk9QLVNFRwk6PSB7IDEuLjggfVxuIgorCQkiXHQJICBQSEFTRS1TRUcxCTo9IHsgMS4uOCB9XG4iCisJCSJcdAkgIFBIQVNFLVNFRzIJOj0geyAxLi44IH1cbiIKKwkJIlx0CSAgU0pXCQk6PSB7IDEuLjQgfVxuIgorCQkiXHQJICBSRVNUQVJULU1TCTo9IHsgMCB8IE5VTUJFUiB9XG4iCisJCSk7Cit9CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisJcHJpbnRfdXNhZ2Uoc3RkZXJyKTsKK30KKworc3RhdGljIGludCBnZXRfZmxvYXQoZmxvYXQgKnZhbCwgY29uc3QgY2hhciAqYXJnKQoreworCWZsb2F0IHJlczsKKwljaGFyICpwdHI7CisKKwlpZiAoIWFyZyB8fCAhKmFyZykKKwkJcmV0dXJuIC0xOworCXJlcyA9IHN0cnRvZihhcmcsICZwdHIpOworCWlmICghcHRyIHx8IHB0ciA9PSBhcmcgfHwgKnB0cikKKwkJcmV0dXJuIC0xOworCSp2YWwgPSByZXM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9jdHJsbW9kZShjaGFyKiBuYW1lLCBjaGFyICphcmcsCisJCQkgc3RydWN0IGNhbl9jdHJsbW9kZSAqY20sIF9fdTMyIGZsYWdzKQoreworCWlmIChzdHJjbXAoYXJnLCAib24iKSA9PSAwKSB7CisJCWNtLT5mbGFncyB8PSBmbGFnczsKKwl9IGVsc2UgaWYgKHN0cmNtcChhcmcsICJvZmYiKSAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIkVycm9yOiBhcmd1bWVudCBvZiBcIiVzXCIgbXVzdCBiZSBcIm9uXCIgb3IgXCJvZmZcIiwgbm90IFwiJXNcIlxuIiwKKwkJCW5hbWUsIGFyZyk7CisJCWV4aXQoLTEpOworCX0KKwljbS0+bWFzayB8PSBmbGFnczsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfY3RybG1vZGUoRklMRSAqZiwgX191MzIgY20pCit7CisJZnByaW50ZihmLCAiPCIpOworI2RlZmluZSBfUEYoY21mbGFnLCBjbW5hbWUpCQkJCQlcCisJaWYgKGNtICYgY21mbGFnKSB7CQkJCQlcCisJCWNtICY9IH5jbWZsYWc7CQkJCQlcCisJCWZwcmludGYoZiwgIiVzJXMiLCBjbW5hbWUsIGNtID8gIiwiIDogIiIpOwlcCisJfQorCV9QRihDQU5fQ1RSTE1PREVfTE9PUEJBQ0ssICJMT09QQkFDSyIpOworCV9QRihDQU5fQ1RSTE1PREVfTElTVEVOT05MWSwgIkxJU1RFTi1PTkxZIik7CisJX1BGKENBTl9DVFJMTU9ERV8zX1NBTVBMRVMsICJUUklQTEUtU0FNUExJTkciKTsKKwlfUEYoQ0FOX0NUUkxNT0RFX09ORV9TSE9ULCAiT05FLVNIT1QiKTsKKwlfUEYoQ0FOX0NUUkxNT0RFX0JFUlJfUkVQT1JUSU5HLCAiQkVSUi1SRVBPUlRJTkciKTsKKwlfUEYoQ0FOX0NUUkxNT0RFX0ZELCAiRkQiKTsKKwlfUEYoQ0FOX0NUUkxNT0RFX0ZEX05PTl9JU08sICJGRC1OT04tSVNPIik7CisJX1BGKENBTl9DVFJMTU9ERV9QUkVTVU1FX0FDSywgIlBSRVNVTUUtQUNLIik7CisjdW5kZWYgX1BGCisJaWYgKGNtKQorCQlmcHJpbnRmKGYsICIleCIsIGNtKTsKKwlmcHJpbnRmKGYsICI+ICIpOworfQorCitzdGF0aWMgaW50IGNhbl9wYXJzZV9vcHQoc3RydWN0IGxpbmtfdXRpbCAqbHUsIGludCBhcmdjLCBjaGFyICoqYXJndiwKKwkJCSBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJc3RydWN0IGNhbl9iaXR0aW1pbmcgYnQsIGRidDsKKwlzdHJ1Y3QgY2FuX2N0cmxtb2RlIGNtID0gezAsIDB9OworCisJbWVtc2V0KCZidCwgMCwgc2l6ZW9mKGJ0KSk7CisJbWVtc2V0KCZkYnQsIDAsIHNpemVvZihkYnQpKTsKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJiaXRyYXRlIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTMyKCZidC5iaXRyYXRlLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJpbnZhbGlkIFwiYml0cmF0ZVwiIHZhbHVlXG4iLCAqYXJndik7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInNhbXBsZS1wb2ludCIpID09IDApIHsKKwkJCWZsb2F0IHNwOworCisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9mbG9hdCgmc3AsICphcmd2KSkKKwkJCQlpbnZhcmcoImludmFsaWQgXCJzYW1wbGUtcG9pbnRcIiB2YWx1ZVxuIiwKKwkJCQkgICAgICAgKmFyZ3YpOworCQkJYnQuc2FtcGxlX3BvaW50ID0gKF9fdTMyKShzcCAqIDEwMDApOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJ0cSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmYnQudHEsICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoImludmFsaWQgXCJ0cVwiIHZhbHVlXG4iLCAqYXJndik7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInByb3Atc2VnIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTMyKCZidC5wcm9wX3NlZywgKmFyZ3YsIDApKQorCQkJCWludmFyZygiaW52YWxpZCBcInByb3Atc2VnXCIgdmFsdWVcbiIsICphcmd2KTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAicGhhc2Utc2VnMSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmYnQucGhhc2Vfc2VnMSwgKmFyZ3YsIDApKQorCQkJCWludmFyZygiaW52YWxpZCBcInBoYXNlLXNlZzFcIiB2YWx1ZVxuIiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJwaGFzZS1zZWcyIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTMyKCZidC5waGFzZV9zZWcyLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJpbnZhbGlkIFwicGhhc2Utc2VnMlwiIHZhbHVlXG4iLCAqYXJndik7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInNqdyIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmYnQuc2p3LCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJpbnZhbGlkIFwic2p3XCIgdmFsdWVcbiIsICphcmd2KTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiZGJpdHJhdGUiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJmRidC5iaXRyYXRlLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJpbnZhbGlkIFwiZGJpdHJhdGVcIiB2YWx1ZVxuIiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJkc2FtcGxlLXBvaW50IikgPT0gMCkgeworCQkJZmxvYXQgc3A7CisKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X2Zsb2F0KCZzcCwgKmFyZ3YpKQorCQkJCWludmFyZygiaW52YWxpZCBcImRzYW1wbGUtcG9pbnRcIiB2YWx1ZVxuIiwgKmFyZ3YpOworCQkJZGJ0LnNhbXBsZV9wb2ludCA9IChfX3UzMikoc3AgKiAxMDAwKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiZHRxIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTMyKCZkYnQudHEsICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoImludmFsaWQgXCJkdHFcIiB2YWx1ZVxuIiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJkcHJvcC1zZWciKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJmRidC5wcm9wX3NlZywgKmFyZ3YsIDApKQorCQkJCWludmFyZygiaW52YWxpZCBcImRwcm9wLXNlZ1wiIHZhbHVlXG4iLCAqYXJndik7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImRwaGFzZS1zZWcxIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTMyKCZkYnQucGhhc2Vfc2VnMSwgKmFyZ3YsIDApKQorCQkJCWludmFyZygiaW52YWxpZCBcImRwaGFzZS1zZWcxXCIgdmFsdWVcbiIsICphcmd2KTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiZHBoYXNlLXNlZzIiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJmRidC5waGFzZV9zZWcyLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJpbnZhbGlkIFwiZHBoYXNlLXNlZzJcIiB2YWx1ZVxuIiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJkc2p3IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTMyKCZkYnQuc2p3LCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJpbnZhbGlkIFwiZHNqd1wiIHZhbHVlXG4iLCAqYXJndik7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImxvb3BiYWNrIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCXNldF9jdHJsbW9kZSgibG9vcGJhY2siLCAqYXJndiwgJmNtLAorCQkJCSAgICAgQ0FOX0NUUkxNT0RFX0xPT1BCQUNLKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAibGlzdGVuLW9ubHkiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJc2V0X2N0cmxtb2RlKCJsaXN0ZW4tb25seSIsICphcmd2LCAmY20sCisJCQkJICAgICBDQU5fQ1RSTE1PREVfTElTVEVOT05MWSk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInRyaXBsZS1zYW1wbGluZyIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlzZXRfY3RybG1vZGUoInRyaXBsZS1zYW1wbGluZyIsICphcmd2LCAmY20sCisJCQkJICAgICBDQU5fQ1RSTE1PREVfM19TQU1QTEVTKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAib25lLXNob3QiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJc2V0X2N0cmxtb2RlKCJvbmUtc2hvdCIsICphcmd2LCAmY20sCisJCQkJICAgICBDQU5fQ1RSTE1PREVfT05FX1NIT1QpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJiZXJyLXJlcG9ydGluZyIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlzZXRfY3RybG1vZGUoImJlcnItcmVwb3J0aW5nIiwgKmFyZ3YsICZjbSwKKwkJCQkgICAgIENBTl9DVFJMTU9ERV9CRVJSX1JFUE9SVElORyk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImZkIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCXNldF9jdHJsbW9kZSgiZmQiLCAqYXJndiwgJmNtLAorCQkJCSAgICAgQ0FOX0NUUkxNT0RFX0ZEKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiZmQtbm9uLWlzbyIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlzZXRfY3RybG1vZGUoImZkLW5vbi1pc28iLCAqYXJndiwgJmNtLAorCQkJCSAgICAgQ0FOX0NUUkxNT0RFX0ZEX05PTl9JU08pOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJwcmVzdW1lLWFjayIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlzZXRfY3RybG1vZGUoInByZXN1bWUtYWNrIiwgKmFyZ3YsICZjbSwKKwkJCQkgICAgIENBTl9DVFJMTU9ERV9QUkVTVU1FX0FDSyk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInJlc3RhcnQiKSA9PSAwKSB7CisJCQlfX3UzMiB2YWwgPSAxOworCisJCQlhZGRhdHRyMzIobiwgMTAyNCwgSUZMQV9DQU5fUkVTVEFSVCwgdmFsKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAicmVzdGFydC1tcyIpID09IDApIHsKKwkJCV9fdTMyIHZhbDsKKworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTMyKCZ2YWwsICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoImludmFsaWQgXCJyZXN0YXJ0LW1zXCIgdmFsdWVcbiIsICphcmd2KTsKKwkJCWFkZGF0dHIzMihuLCAxMDI0LCBJRkxBX0NBTl9SRVNUQVJUX01TLCB2YWwpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJdXNhZ2UoKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiY2FuOiB1bmtub3duIG9wdGlvbiBcIiVzXCJcbiIsICphcmd2KTsKKwkJCXVzYWdlKCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYXJnYy0tLCBhcmd2Kys7CisJfQorCisJaWYgKGJ0LmJpdHJhdGUgfHwgYnQudHEpCisJCWFkZGF0dHJfbChuLCAxMDI0LCBJRkxBX0NBTl9CSVRUSU1JTkcsICZidCwgc2l6ZW9mKGJ0KSk7CisJaWYgKGRidC5iaXRyYXRlIHx8IGRidC50cSkKKwkJYWRkYXR0cl9sKG4sIDEwMjQsIElGTEFfQ0FOX0RBVEFfQklUVElNSU5HLCAmZGJ0LCBzaXplb2YoZGJ0KSk7CisJaWYgKGNtLm1hc2spCisJCWFkZGF0dHJfbChuLCAxMDI0LCBJRkxBX0NBTl9DVFJMTU9ERSwgJmNtLCBzaXplb2YoY20pKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqY2FuX3N0YXRlX25hbWVzW10gPSB7CisJW0NBTl9TVEFURV9FUlJPUl9BQ1RJVkVdID0gIkVSUk9SLUFDVElWRSIsCisJW0NBTl9TVEFURV9FUlJPUl9XQVJOSU5HXSA9ICJFUlJPUi1XQVJOSU5HIiwKKwlbQ0FOX1NUQVRFX0VSUk9SX1BBU1NJVkVdID0gIkVSUk9SLVBBU1NJVkUiLAorCVtDQU5fU1RBVEVfQlVTX09GRl0gPSAiQlVTLU9GRiIsCisJW0NBTl9TVEFURV9TVE9QUEVEXSA9ICJTVE9QUEVEIiwKKwlbQ0FOX1NUQVRFX1NMRUVQSU5HXSA9ICJTTEVFUElORyIKK307CisKK3N0YXRpYyB2b2lkIGNhbl9wcmludF9vcHQoc3RydWN0IGxpbmtfdXRpbCAqbHUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKnRiW10pCit7CisJaWYgKCF0YikKKwkJcmV0dXJuOworCisJaWYgKHRiW0lGTEFfQ0FOX0NUUkxNT0RFXSkgeworCQlzdHJ1Y3QgY2FuX2N0cmxtb2RlICpjbSA9IFJUQV9EQVRBKHRiW0lGTEFfQ0FOX0NUUkxNT0RFXSk7CisKKwkJaWYgKGNtLT5mbGFncykKKwkJCXByaW50X2N0cmxtb2RlKGYsIGNtLT5mbGFncyk7CisJfQorCisJaWYgKHRiW0lGTEFfQ0FOX1NUQVRFXSkgeworCQlpbnQgKnN0YXRlID0gUlRBX0RBVEEodGJbSUZMQV9DQU5fU1RBVEVdKTsKKworCQlmcHJpbnRmKGYsICJzdGF0ZSAlcyAiLCAqc3RhdGUgPD0gQ0FOX1NUQVRFX01BWCA/CisJCQljYW5fc3RhdGVfbmFtZXNbKnN0YXRlXSA6ICJVTktOT1dOIik7CisJfQorCisJaWYgKHRiW0lGTEFfQ0FOX0JFUlJfQ09VTlRFUl0pIHsKKwkJc3RydWN0IGNhbl9iZXJyX2NvdW50ZXIgKmJjID0KKwkJCVJUQV9EQVRBKHRiW0lGTEFfQ0FOX0JFUlJfQ09VTlRFUl0pOworCisJCWZwcmludGYoZiwgIihiZXJyLWNvdW50ZXIgdHggJWQgcnggJWQpICIsIGJjLT50eGVyciwgYmMtPnJ4ZXJyKTsKKwl9CisKKwlpZiAodGJbSUZMQV9DQU5fUkVTVEFSVF9NU10pIHsKKwkJX191MzIgKnJlc3RhcnRfbXMgPSBSVEFfREFUQSh0YltJRkxBX0NBTl9SRVNUQVJUX01TXSk7CisKKwkJZnByaW50ZihmLCAicmVzdGFydC1tcyAlZCAiLCAqcmVzdGFydF9tcyk7CisJfQorCisJaWYgKHRiW0lGTEFfQ0FOX0JJVFRJTUlOR10pIHsKKwkJc3RydWN0IGNhbl9iaXR0aW1pbmcgKmJ0ID0gUlRBX0RBVEEodGJbSUZMQV9DQU5fQklUVElNSU5HXSk7CisKKwkJZnByaW50ZihmLCAiXG4JICAiCisJCQkiYml0cmF0ZSAlZCBzYW1wbGUtcG9pbnQgJS4zZiAiLAorCQkJYnQtPmJpdHJhdGUsIChmbG9hdClidC0+c2FtcGxlX3BvaW50IC8gMTAwMC4pOworCQlmcHJpbnRmKGYsICJcbgkgICIKKwkJCSJ0cSAlZCBwcm9wLXNlZyAlZCBwaGFzZS1zZWcxICVkIHBoYXNlLXNlZzIgJWQgc2p3ICVkIiwKKwkJCWJ0LT50cSwgYnQtPnByb3Bfc2VnLCBidC0+cGhhc2Vfc2VnMSwgYnQtPnBoYXNlX3NlZzIsCisJCQlidC0+c2p3KTsKKwl9CisKKwlpZiAodGJbSUZMQV9DQU5fQklUVElNSU5HX0NPTlNUXSkgeworCQlzdHJ1Y3QgY2FuX2JpdHRpbWluZ19jb25zdCAqYnRjID0KKwkJCVJUQV9EQVRBKHRiW0lGTEFfQ0FOX0JJVFRJTUlOR19DT05TVF0pOworCisJCWZwcmludGYoZiwgIlxuCSAgIgorCQkJIiVzOiB0c2VnMSAlZC4uJWQgdHNlZzIgJWQuLiVkICIKKwkJCSJzancgMS4uJWQgYnJwICVkLi4lZCBicnAtaW5jICVkIiwKKwkJCWJ0Yy0+bmFtZSwgYnRjLT50c2VnMV9taW4sIGJ0Yy0+dHNlZzFfbWF4LAorCQkJYnRjLT50c2VnMl9taW4sIGJ0Yy0+dHNlZzJfbWF4LCBidGMtPnNqd19tYXgsCisJCQlidGMtPmJycF9taW4sIGJ0Yy0+YnJwX21heCwgYnRjLT5icnBfaW5jKTsKKwl9CisKKwlpZiAodGJbSUZMQV9DQU5fREFUQV9CSVRUSU1JTkddKSB7CisJCXN0cnVjdCBjYW5fYml0dGltaW5nICpkYnQgPQorCQkJUlRBX0RBVEEodGJbSUZMQV9DQU5fREFUQV9CSVRUSU1JTkddKTsKKworCQlmcHJpbnRmKGYsICJcbgkgICIKKwkJCSJkYml0cmF0ZSAlZCBkc2FtcGxlLXBvaW50ICUuM2YgIiwKKwkJCWRidC0+Yml0cmF0ZSwgKGZsb2F0KWRidC0+c2FtcGxlX3BvaW50IC8gMTAwMC4pOworCQlmcHJpbnRmKGYsICJcbgkgICIKKwkJCSJkdHEgJWQgZHByb3Atc2VnICVkIGRwaGFzZS1zZWcxICVkICIKKwkJCSJkcGhhc2Utc2VnMiAlZCBkc2p3ICVkIiwKKwkJCWRidC0+dHEsIGRidC0+cHJvcF9zZWcsIGRidC0+cGhhc2Vfc2VnMSwKKwkJCWRidC0+cGhhc2Vfc2VnMiwgZGJ0LT5zancpOworCX0KKworCWlmICh0YltJRkxBX0NBTl9EQVRBX0JJVFRJTUlOR19DT05TVF0pIHsKKwkJc3RydWN0IGNhbl9iaXR0aW1pbmdfY29uc3QgKmRidGMgPQorCQkJUlRBX0RBVEEodGJbSUZMQV9DQU5fREFUQV9CSVRUSU1JTkdfQ09OU1RdKTsKKworCQlmcHJpbnRmKGYsICJcbgkgICIKKwkJCSIlczogZHRzZWcxICVkLi4lZCBkdHNlZzIgJWQuLiVkICIKKwkJCSJkc2p3IDEuLiVkIGRicnAgJWQuLiVkIGRicnAtaW5jICVkIiwKKwkJCWRidGMtPm5hbWUsIGRidGMtPnRzZWcxX21pbiwgZGJ0Yy0+dHNlZzFfbWF4LAorCQkJZGJ0Yy0+dHNlZzJfbWluLCBkYnRjLT50c2VnMl9tYXgsIGRidGMtPnNqd19tYXgsCisJCQlkYnRjLT5icnBfbWluLCBkYnRjLT5icnBfbWF4LCBkYnRjLT5icnBfaW5jKTsKKwl9CisKKwlpZiAodGJbSUZMQV9DQU5fQ0xPQ0tdKSB7CisJCXN0cnVjdCBjYW5fY2xvY2sgKmNsb2NrID0gUlRBX0RBVEEodGJbSUZMQV9DQU5fQ0xPQ0tdKTsKKworCQlmcHJpbnRmKGYsICJcbgkgIGNsb2NrICVkIiwgY2xvY2stPmZyZXEpOworCX0KKworfQorCitzdGF0aWMgdm9pZCBjYW5fcHJpbnRfeHN0YXRzKHN0cnVjdCBsaW5rX3V0aWwgKmx1LAorCQkJICAgICBGSUxFICpmLCBzdHJ1Y3QgcnRhdHRyICp4c3RhdHMpCit7CisJc3RydWN0IGNhbl9kZXZpY2Vfc3RhdHMgKnN0YXRzOworCisJaWYgKHhzdGF0cyAmJiBSVEFfUEFZTE9BRCh4c3RhdHMpID09IHNpemVvZigqc3RhdHMpKSB7CisJCXN0YXRzID0gUlRBX0RBVEEoeHN0YXRzKTsKKwkJZnByaW50ZihmLCAiXG4JICAiCisJCQkicmUtc3RhcnRlZCBidXMtZXJyb3JzIGFyYml0LWxvc3QgIgorCQkJImVycm9yLXdhcm4gZXJyb3ItcGFzcyBidXMtb2ZmIik7CisJCWZwcmludGYoZiwgIlxuCSAgJS0xMGQgJS0xMGQgJS0xMGQgJS0xMGQgJS0xMGQgJS0xMGQiLAorCQkJc3RhdHMtPnJlc3RhcnRzLCBzdGF0cy0+YnVzX2Vycm9yLAorCQkJc3RhdHMtPmFyYml0cmF0aW9uX2xvc3QsIHN0YXRzLT5lcnJvcl93YXJuaW5nLAorCQkJc3RhdHMtPmVycm9yX3Bhc3NpdmUsIHN0YXRzLT5idXNfb2ZmKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNhbl9wcmludF9oZWxwKHN0cnVjdCBsaW5rX3V0aWwgKmx1LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCisJRklMRSAqZikKK3sKKwlwcmludF91c2FnZShmKTsKK30KKworc3RydWN0IGxpbmtfdXRpbCBjYW5fbGlua191dGlsID0geworCS5pZAkJPSAiY2FuIiwKKwkubWF4YXR0cgk9IElGTEFfQ0FOX01BWCwKKwkucGFyc2Vfb3B0CT0gY2FuX3BhcnNlX29wdCwKKwkucHJpbnRfb3B0CT0gY2FuX3ByaW50X29wdCwKKwkucHJpbnRfeHN0YXRzCT0gY2FuX3ByaW50X3hzdGF0cywKKwkucHJpbnRfaGVscAk9IGNhbl9wcmludF9oZWxwLAorfTsKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2lwL2lwbGlua19nZW5ldmUuYyBiL2lwcm91dGUyL2lwL2lwbGlua19nZW5ldmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzQ1NDc5Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaXAvaXBsaW5rX2dlbmV2ZS5jCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogaXBsaW5rX2dlbmV2ZS5jCUdFTkVWRSBkZXZpY2Ugc3VwcG9ydAorICoKKyAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6ICAgICBKb2huIFcuIExpbnZpbGxlIDxsaW52aWxsZUB0dXhkcml2ZXIuY29tPgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgImlwX2NvbW1vbi5oIgorCitzdGF0aWMgdm9pZCBwcmludF9leHBsYWluKEZJTEUgKmYpCit7CisJZnByaW50ZihmLCAiVXNhZ2U6IC4uLiBnZW5ldmUgaWQgVk5JIHJlbW90ZSBBRERSXG4iKTsKKwlmcHJpbnRmKGYsICIgICAgICAgICAgICAgICAgIFsgdHRsIFRUTCBdIFsgdG9zIFRPUyBdXG4iKTsKKwlmcHJpbnRmKGYsICJcbiIpOworCWZwcmludGYoZiwgIldoZXJlOiBWTkkgIDo9IDAtMTY3NzcyMTVcbiIpOworCWZwcmludGYoZiwgIiAgICAgICBBRERSIDo9IElQX0FERFJFU1NcbiIpOworCWZwcmludGYoZiwgIiAgICAgICBUT1MgIDo9IHsgTlVNQkVSIHwgaW5oZXJpdCB9XG4iKTsKKwlmcHJpbnRmKGYsICIgICAgICAgVFRMICA6PSB7IDEuLjI1NSB8IGluaGVyaXQgfVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGV4cGxhaW4odm9pZCkKK3sKKwlwcmludF9leHBsYWluKHN0ZGVycik7Cit9CisKK3N0YXRpYyBpbnQgZ2VuZXZlX3BhcnNlX29wdChzdHJ1Y3QgbGlua191dGlsICpsdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCQkJICBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJX191MzIgdm5pID0gMDsKKwlpbnQgdm5pX3NldCA9IDA7CisJX191MzIgZGFkZHIgPSAwOworCXN0cnVjdCBpbjZfYWRkciBkYWRkcjYgPSBJTjZBRERSX0FOWV9JTklUOworCV9fdTggdHRsID0gMDsKKwlfX3U4IHRvcyA9IDA7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKCFtYXRjaGVzKCphcmd2LCAiaWQiKSB8fAorCQkgICAgIW1hdGNoZXMoKmFyZ3YsICJ2bmkiKSkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTMyKCZ2bmksICphcmd2LCAwKSB8fAorCQkJICAgIHZuaSA+PSAxdSA8PCAyNCkKKwkJCQlpbnZhcmcoImludmFsaWQgaWQiLCAqYXJndik7CisJCQl2bmlfc2V0ID0gMTsKKwkJfSBlbHNlIGlmICghbWF0Y2hlcygqYXJndiwgInJlbW90ZSIpKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKCFpbmV0X2dldF9hZGRyKCphcmd2LCAmZGFkZHIsICZkYWRkcjYpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGFkZHJlc3MgXCIlc1wiXG4iLCAqYXJndik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKElONl9JU19BRERSX01VTFRJQ0FTVCgmZGFkZHI2KSB8fCBJTl9NVUxUSUNBU1QobnRvaGwoZGFkZHIpKSkKKwkJCQlpbnZhcmcoImludmFsaWQgcmVtb3RlIGFkZHJlc3MiLCAqYXJndik7CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJ0dGwiKSB8fAorCQkJICAgIW1hdGNoZXMoKmFyZ3YsICJob3BsaW1pdCIpKSB7CisJCQl1bnNpZ25lZCB1dmFsOworCisJCQlORVhUX0FSRygpOworCQkJaWYgKHN0cmNtcCgqYXJndiwgImluaGVyaXQiKSAhPSAwKSB7CisJCQkJaWYgKGdldF91bnNpZ25lZCgmdXZhbCwgKmFyZ3YsIDApKQorCQkJCQlpbnZhcmcoImludmFsaWQgVFRMIiwgKmFyZ3YpOworCQkJCWlmICh1dmFsID4gMjU1KQorCQkJCQlpbnZhcmcoIlRUTCBtdXN0IGJlIDw9IDI1NSIsICphcmd2KTsKKwkJCQl0dGwgPSB1dmFsOworCQkJfQorCQl9IGVsc2UgaWYgKCFtYXRjaGVzKCphcmd2LCAidG9zIikgfHwKKwkJCSAgICFtYXRjaGVzKCphcmd2LCAiZHNmaWVsZCIpKSB7CisJCQlfX3UzMiB1dmFsOworCisJCQlORVhUX0FSRygpOworCQkJaWYgKHN0cmNtcCgqYXJndiwgImluaGVyaXQiKSAhPSAwKSB7CisJCQkJaWYgKHJ0bmxfZHNmaWVsZF9hMm4oJnV2YWwsICphcmd2KSkKKwkJCQkJaW52YXJnKCJiYWQgVE9TIHZhbHVlIiwgKmFyZ3YpOworCQkJCXRvcyA9IHV2YWw7CisJCQl9IGVsc2UKKwkJCQl0b3MgPSAxOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJnZW5ldmU6IHVua25vd24gY29tbWFuZCBcIiVzXCI/XG4iLCAqYXJndik7CisJCQlleHBsYWluKCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYXJnYy0tLCBhcmd2Kys7CisJfQorCisJaWYgKCF2bmlfc2V0KSB7CisJCWZwcmludGYoc3RkZXJyLCAiZ2VuZXZlOiBtaXNzaW5nIHZpcnR1YWwgbmV0d29yayBpZGVudGlmaWVyXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICghZGFkZHIgJiYgbWVtY21wKCZkYWRkcjYsICZpbjZhZGRyX2FueSwgc2l6ZW9mKGRhZGRyNikpID09IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJnZW5ldmU6IHJlbW90ZSBsaW5rIHBhcnRuZXIgbm90IHNwZWNpZmllZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlhZGRhdHRyMzIobiwgMTAyNCwgSUZMQV9HRU5FVkVfSUQsIHZuaSk7CisJaWYgKGRhZGRyKQorCQlhZGRhdHRyX2wobiwgMTAyNCwgSUZMQV9HRU5FVkVfUkVNT1RFLCAmZGFkZHIsIDQpOworCWlmIChtZW1jbXAoJmRhZGRyNiwgJmluNmFkZHJfYW55LCBzaXplb2YoZGFkZHI2KSkgIT0gMCkKKwkJYWRkYXR0cl9sKG4sIDEwMjQsIElGTEFfR0VORVZFX1JFTU9URTYsICZkYWRkcjYsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwlhZGRhdHRyOChuLCAxMDI0LCBJRkxBX0dFTkVWRV9UVEwsIHR0bCk7CisJYWRkYXR0cjgobiwgMTAyNCwgSUZMQV9HRU5FVkVfVE9TLCB0b3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdlbmV2ZV9wcmludF9vcHQoc3RydWN0IGxpbmtfdXRpbCAqbHUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKnRiW10pCit7CisJX191MzIgdm5pOworCWNoYXIgczFbMTAyNF07CisJX191OCB0b3M7CisKKwlpZiAoIXRiKQorCQlyZXR1cm47CisKKwlpZiAoIXRiW0lGTEFfR0VORVZFX0lEXSB8fAorCSAgICBSVEFfUEFZTE9BRCh0YltJRkxBX0dFTkVWRV9JRF0pIDwgc2l6ZW9mKF9fdTMyKSkKKwkJcmV0dXJuOworCisJdm5pID0gcnRhX2dldGF0dHJfdTMyKHRiW0lGTEFfR0VORVZFX0lEXSk7CisJZnByaW50ZihmLCAiaWQgJXUgIiwgdm5pKTsKKworCWlmICh0YltJRkxBX0dFTkVWRV9SRU1PVEVdKSB7CisJCV9fYmUzMiBhZGRyID0gcnRhX2dldGF0dHJfdTMyKHRiW0lGTEFfR0VORVZFX1JFTU9URV0pOworCQlpZiAoYWRkcikKKwkJCWZwcmludGYoZiwgInJlbW90ZSAlcyAiLAorCQkJCWZvcm1hdF9ob3N0KEFGX0lORVQsIDQsICZhZGRyLCBzMSwgc2l6ZW9mKHMxKSkpOworCX0gZWxzZSBpZiAodGJbSUZMQV9HRU5FVkVfUkVNT1RFNl0pIHsKKwkJc3RydWN0IGluNl9hZGRyIGFkZHI7CisJCW1lbWNweSgmYWRkciwgUlRBX0RBVEEodGJbSUZMQV9HRU5FVkVfUkVNT1RFNl0pLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisJCWlmIChtZW1jbXAoJmFkZHIsICZpbjZhZGRyX2FueSwgc2l6ZW9mKGFkZHIpKSAhPSAwKSB7CisJCQlpZiAoSU42X0lTX0FERFJfTVVMVElDQVNUKCZhZGRyKSkKKwkJCQlmcHJpbnRmKGYsICJyZW1vdGUgJXMgIiwKKwkJCQkJZm9ybWF0X2hvc3QoQUZfSU5FVDYsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpLCAmYWRkciwgczEsIHNpemVvZihzMSkpKTsKKwkJfQorCX0KKworCWlmICh0YltJRkxBX0dFTkVWRV9UVExdKSB7CisJCV9fdTggdHRsID0gcnRhX2dldGF0dHJfdTgodGJbSUZMQV9HRU5FVkVfVFRMXSk7CisJCWlmICh0dGwpCisJCQlmcHJpbnRmKGYsICJ0dGwgJWQgIiwgdHRsKTsKKwl9CisKKwlpZiAodGJbSUZMQV9HRU5FVkVfVE9TXSAmJgorCSAgICAodG9zID0gcnRhX2dldGF0dHJfdTgodGJbSUZMQV9HRU5FVkVfVE9TXSkpKSB7CisJCWlmICh0b3MgPT0gMSkKKwkJCWZwcmludGYoZiwgInRvcyBpbmhlcml0ICIpOworCQllbHNlCisJCQlmcHJpbnRmKGYsICJ0b3MgJSN4ICIsIHRvcyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBnZW5ldmVfcHJpbnRfaGVscChzdHJ1Y3QgbGlua191dGlsICpsdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCUZJTEUgKmYpCit7CisJcHJpbnRfZXhwbGFpbihmKTsKK30KKworc3RydWN0IGxpbmtfdXRpbCBnZW5ldmVfbGlua191dGlsID0geworCS5pZAkJPSAiZ2VuZXZlIiwKKwkubWF4YXR0cgk9IElGTEFfR0VORVZFX01BWCwKKwkucGFyc2Vfb3B0CT0gZ2VuZXZlX3BhcnNlX29wdCwKKwkucHJpbnRfb3B0CT0gZ2VuZXZlX3ByaW50X29wdCwKKwkucHJpbnRfaGVscAk9IGdlbmV2ZV9wcmludF9oZWxwLAorfTsKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2lwL2lwbGlua19oc3IuYyBiL2lwcm91dGUyL2lwL2lwbGlua19oc3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWZiZWM4Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaXAvaXBsaW5rX2hzci5jCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogaXBsaW5rX2hzci5jCUhTUiBkZXZpY2Ugc3VwcG9ydAorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFydmlkIEJyb2RpbiA8YXJ2aWQuYnJvZGluQGFsdGVuLnNlPgorICoKKyAqCQlCYXNlZCBvbiBpcGxpbmtfdmxhbi5jIGJ5IFBhdHJpY2sgTWNIYXJkeSA8a2FiZXJAdHJhc2gubmV0PgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4gIC8qIE5lZWRlZCBieSBsaW51eC9pZi5oIGZvciBzb21lIHJlYXNvbiAqLworI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgImlwX2NvbW1vbi5oIgorCitzdGF0aWMgdm9pZCBwcmludF91c2FnZShGSUxFICpmKQoreworCWZwcmludGYoZiwKKyJVc2FnZTpcdGlwIGxpbmsgYWRkIG5hbWUgTkFNRSB0eXBlIGhzciBzbGF2ZTEgU0xBVkUxLUlGIHNsYXZlMiBTTEFWRTItSUZcbiIKKyJcdFsgc3VwZXJ2aXNpb24gQUREUi1CWVRFIF1cbiIKKyJcbiIKKyJOQU1FXG4iCisiCW5hbWUgb2YgbmV3IGhzciBkZXZpY2UgKGUuZy4gaHNyMClcbiIKKyJTTEFWRTEtSUYsIFNMQVZFMi1JRlxuIgorIgl0aGUgdHdvIHNsYXZlIGRldmljZXMgYm91bmQgdG8gdGhlIEhTUiBkZXZpY2VcbiIKKyJBRERSLUJZVEVcbiIKKyIJMC0yNTU7IHRoZSBsYXN0IGJ5dGUgb2YgdGhlIG11bHRpY2FzdCBhZGRyZXNzIHVzZWQgZm9yIEhTUiBzdXBlcnZpc2lvblxuIgorIglmcmFtZXMgKGRlZmF1bHQgPSAwKVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisJcHJpbnRfdXNhZ2Uoc3RkZXJyKTsKK30KKworc3RhdGljIGludCBoc3JfcGFyc2Vfb3B0KHN0cnVjdCBsaW5rX3V0aWwgKmx1LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCisJCQkgc3RydWN0IG5sbXNnaGRyICpuKQoreworCWludCBpZmluZGV4OworCXVuc2lnbmVkIGNoYXIgbXVsdGljYXN0X3NwZWM7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJzdXBlcnZpc2lvbiIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3U4KCZtdWx0aWNhc3Rfc3BlYywgKmFyZ3YsIDApKQorCQkJCWludmFyZygiQUREUi1CWVRFIGlzIGludmFsaWQiLCAqYXJndik7CisJCQlhZGRhdHRyX2wobiwgMTAyNCwgSUZMQV9IU1JfTVVMVElDQVNUX1NQRUMsCisJCQkJICAmbXVsdGljYXN0X3NwZWMsIDEpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJzbGF2ZTEiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWZpbmRleCA9IGxsX25hbWVfdG9faW5kZXgoKmFyZ3YpOworCQkJaWYgKGlmaW5kZXggPT0gMCkKKwkJCQlpbnZhcmcoIk5vIHN1Y2ggaW50ZXJmYWNlIiwgKmFyZ3YpOworCQkJYWRkYXR0cl9sKG4sIDEwMjQsIElGTEFfSFNSX1NMQVZFMSwgJmlmaW5kZXgsIDQpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJzbGF2ZTIiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWZpbmRleCA9IGxsX25hbWVfdG9faW5kZXgoKmFyZ3YpOworCQkJaWYgKGlmaW5kZXggPT0gMCkKKwkJCQlpbnZhcmcoIk5vIHN1Y2ggaW50ZXJmYWNlIiwgKmFyZ3YpOworCQkJYWRkYXR0cl9sKG4sIDEwMjQsIElGTEFfSFNSX1NMQVZFMiwgJmlmaW5kZXgsIDQpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJdXNhZ2UoKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiaHNyOiB3aGF0IGlzIFwiJXNcIj9cbiIsICphcmd2KTsKKwkJCXVzYWdlKCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYXJnYy0tLCBhcmd2Kys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhzcl9wcmludF9vcHQoc3RydWN0IGxpbmtfdXRpbCAqbHUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKnRiW10pCit7CisJU1BSSU5UX0JVRihiMSk7CisKKwlpZiAoIXRiKQorCQlyZXR1cm47CisKKwlpZiAodGJbSUZMQV9IU1JfU0xBVkUxXSAmJgorCSAgICBSVEFfUEFZTE9BRCh0YltJRkxBX0hTUl9TTEFWRTFdKSA8IHNpemVvZihfX3UzMikpCisJCXJldHVybjsKKwlpZiAodGJbSUZMQV9IU1JfU0xBVkUyXSAmJgorCSAgICBSVEFfUEFZTE9BRCh0YltJRkxBX0hTUl9TTEFWRTJdKSA8IHNpemVvZihfX3UzMikpCisJCXJldHVybjsKKwlpZiAodGJbSUZMQV9IU1JfU0VRX05SXSAmJgorCSAgICBSVEFfUEFZTE9BRCh0YltJRkxBX0hTUl9TRVFfTlJdKSA8IHNpemVvZihfX3UxNikpCisJCXJldHVybjsKKwlpZiAodGJbSUZMQV9IU1JfU1VQRVJWSVNJT05fQUREUl0gJiYKKwkgICAgUlRBX1BBWUxPQUQodGJbSUZMQV9IU1JfU1VQRVJWSVNJT05fQUREUl0pIDwgRVRIX0FMRU4pCisJCXJldHVybjsKKworCWZwcmludGYoZiwgInNsYXZlMSAiKTsKKwlpZiAodGJbSUZMQV9IU1JfU0xBVkUxXSkKKwkJZnByaW50ZihmLCAiJXMgIiwKKwkJCWxsX2luZGV4X3RvX25hbWUocnRhX2dldGF0dHJfdTMyKHRiW0lGTEFfSFNSX1NMQVZFMV0pKSk7CisJZWxzZQorCQlmcHJpbnRmKGYsICI8bm9uZT4gIik7CisKKwlmcHJpbnRmKGYsICJzbGF2ZTIgIik7CisJaWYgKHRiW0lGTEFfSFNSX1NMQVZFMl0pCisJCWZwcmludGYoZiwgIiVzICIsCisJCQlsbF9pbmRleF90b19uYW1lKHJ0YV9nZXRhdHRyX3UzMih0YltJRkxBX0hTUl9TTEFWRTJdKSkpOworCWVsc2UKKwkJZnByaW50ZihmLCAiPG5vbmU+ICIpOworCisJaWYgKHRiW0lGTEFfSFNSX1NFUV9OUl0pCisJCWZwcmludGYoZiwgInNlcXVlbmNlICVkICIsCisJCQlydGFfZ2V0YXR0cl91MTYodGJbSUZMQV9IU1JfU0VRX05SXSkpOworCisJaWYgKHRiW0lGTEFfSFNSX1NVUEVSVklTSU9OX0FERFJdKQorCQlmcHJpbnRmKGYsICJzdXBlcnZpc2lvbiAlcyAiLAorCQkJbGxfYWRkcl9uMmEoUlRBX0RBVEEodGJbSUZMQV9IU1JfU1VQRVJWSVNJT05fQUREUl0pLAorCQkJCSAgICBSVEFfUEFZTE9BRCh0YltJRkxBX0hTUl9TVVBFUlZJU0lPTl9BRERSXSksCisJCQkJICAgIEFSUEhSRF9WT0lELAorCQkJCSAgICBiMSwgc2l6ZW9mKGIxKSkpOworfQorCitzdGF0aWMgdm9pZCBoc3JfcHJpbnRfaGVscChzdHJ1Y3QgbGlua191dGlsICpsdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCUZJTEUgKmYpCit7CisJcHJpbnRfdXNhZ2UoZik7Cit9CisKK3N0cnVjdCBsaW5rX3V0aWwgaHNyX2xpbmtfdXRpbCA9IHsKKwkuaWQJCT0gImhzciIsCisJLm1heGF0dHIJPSBJRkxBX1ZMQU5fTUFYLAorCS5wYXJzZV9vcHQJPSBoc3JfcGFyc2Vfb3B0LAorCS5wcmludF9vcHQJPSBoc3JfcHJpbnRfb3B0LAorCS5wcmludF9oZWxwCT0gaHNyX3ByaW50X2hlbHAsCit9OwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaXAvaXBsaW5rX2lwb2liLmMgYi9pcHJvdXRlMi9pcC9pcGxpbmtfaXBvaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDg3Y2JlCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaXAvaXBsaW5rX2lwb2liLmMKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBpcGxpbmtfaXBvaWIuYwlJUG9JQiBkZXZpY2Ugc3VwcG9ydAorICoKKyAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6ICAgICBPciBHZXJsaXR6IDxvZ2VybGl0ekBtZWxsYW5veC5jb20+CisgKgkJY29waWVkIGlmbGlua192bGFuLmMgYXV0aG9yZWQgYnkgUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaWZfbGluay5oPgorCisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgImlwX2NvbW1vbi5oIgorCitzdGF0aWMgdm9pZCBwcmludF9leHBsYWluKEZJTEUgKmYpCit7CisJZnByaW50ZihmLAorCQkiVXNhZ2U6IC4uLiBpcG9pYiBbcGtleSBQS0VZXSBbbW9kZSB7ZGF0YWdyYW0gfCBjb25uZWN0ZWR9XSIKKwkJIlt1bWNhc3QgezB8MX1dXG4iCisJCSJcbiIKKwkJIlBLRVkgIDo9IDB4ODAwMS0weGZmZmZcbiIKKwkpOworfQorCitzdGF0aWMgdm9pZCBleHBsYWluKHZvaWQpCit7CisJcHJpbnRfZXhwbGFpbihzdGRlcnIpOworfQorCitzdGF0aWMgaW50IG1vZGVfYXJnKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJFcnJvcjogYXJndW1lbnQgb2YgXCJtb2RlXCIgbXVzdCBiZSBcImRhdGFncmFtXCIiCisJCSJvciBcImNvbm5lY3RlZFwiXG4iKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgaXBvaWJfcGFyc2Vfb3B0KHN0cnVjdCBsaW5rX3V0aWwgKmx1LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCisJCQkgIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlfX3UxNiBwa2V5LCBtb2RlLCB1bWNhc3Q7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJwa2V5IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTE2KCZwa2V5LCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJwa2V5IGlzIGludmFsaWQiLCAqYXJndik7CisJCQlhZGRhdHRyX2wobiwgMTAyNCwgSUZMQV9JUE9JQl9QS0VZLCAmcGtleSwgMik7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgIm1vZGUiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHN0cmNtcCgqYXJndiwgImRhdGFncmFtIikgPT0gMCkKKwkJCQltb2RlID0gSVBPSUJfTU9ERV9EQVRBR1JBTTsKKwkJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImNvbm5lY3RlZCIpID09IDApCisJCQkJbW9kZSA9IElQT0lCX01PREVfQ09OTkVDVEVEOworCQkJZWxzZQorCQkJCXJldHVybiBtb2RlX2FyZygpOworCQkJYWRkYXR0cl9sKG4sIDEwMjQsIElGTEFfSVBPSUJfTU9ERSwgJm1vZGUsIDIpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJ1bWNhc3QiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MTYoJnVtY2FzdCwgKmFyZ3YsIDApKQorCQkJCWludmFyZygidW1jYXN0IGlzIGludmFsaWQiLCAqYXJndik7CisJCQlhZGRhdHRyX2wobiwgMTAyNCwgSUZMQV9JUE9JQl9VTUNBU1QsICZ1bWNhc3QsIDIpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJpcG9pYjogdW5rbm93biBvcHRpb24gXCIlc1wiP1xuIiwgKmFyZ3YpOworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWFyZ2MtLSwgYXJndisrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpcG9pYl9wcmludF9vcHQoc3RydWN0IGxpbmtfdXRpbCAqbHUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKnRiW10pCit7CisJX191MTYgbW9kZTsKKworCWlmICghdGIpCisJCXJldHVybjsKKworCWlmICghdGJbSUZMQV9JUE9JQl9QS0VZXSB8fAorCSAgICBSVEFfUEFZTE9BRCh0YltJRkxBX0lQT0lCX1BLRVldKSA8IHNpemVvZihfX3UxNikpCisJCXJldHVybjsKKworCWZwcmludGYoZiwgInBrZXkgICUjLjR4ICIsIHJ0YV9nZXRhdHRyX3UxNih0YltJRkxBX0lQT0lCX1BLRVldKSk7CisKKwlpZiAoIXRiW0lGTEFfSVBPSUJfTU9ERV0gfHwKKwkgICAgUlRBX1BBWUxPQUQodGJbSUZMQV9JUE9JQl9NT0RFXSkgPCBzaXplb2YoX191MTYpKQorCQlyZXR1cm47CisKKwltb2RlID0gcnRhX2dldGF0dHJfdTE2KHRiW0lGTEFfSVBPSUJfTU9ERV0pOworCWZwcmludGYoZiwgIm1vZGUgICVzICIsCisJCW1vZGUgPT0gSVBPSUJfTU9ERV9EQVRBR1JBTSA/ICJkYXRhZ3JhbSIgOgorCQltb2RlID09IElQT0lCX01PREVfQ09OTkVDVEVEID8gImNvbm5lY3RlZCIgOgorCQkidW5rbm93biIpOworCisJaWYgKCF0YltJRkxBX0lQT0lCX1VNQ0FTVF0gfHwKKwkgICAgUlRBX1BBWUxPQUQodGJbSUZMQV9JUE9JQl9VTUNBU1RdKSA8IHNpemVvZihfX3UxNikpCisJCXJldHVybjsKKworCWZwcmludGYoZiwgInVtY2FzdCAgJS40eCAiLCBydGFfZ2V0YXR0cl91MTYodGJbSUZMQV9JUE9JQl9VTUNBU1RdKSk7Cit9CisKK3N0YXRpYyB2b2lkIGlwb2liX3ByaW50X2hlbHAoc3RydWN0IGxpbmtfdXRpbCAqbHUsIGludCBhcmdjLCBjaGFyICoqYXJndiwKKwlGSUxFICpmKQoreworCXByaW50X2V4cGxhaW4oZik7Cit9CisKK3N0cnVjdCBsaW5rX3V0aWwgaXBvaWJfbGlua191dGlsID0geworCS5pZAkJPSAiaXBvaWIiLAorCS5tYXhhdHRyCT0gSUZMQV9JUE9JQl9NQVgsCisJLnBhcnNlX29wdAk9IGlwb2liX3BhcnNlX29wdCwKKwkucHJpbnRfb3B0CT0gaXBvaWJfcHJpbnRfb3B0LAorCS5wcmludF9oZWxwCT0gaXBvaWJfcHJpbnRfaGVscCwKK307CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pcC9pcGxpbmtfaXB2bGFuLmMgYi9pcHJvdXRlMi9pcC9pcGxpbmtfaXB2bGFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA4ZmMzOQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2lwL2lwbGlua19pcHZsYW4uYwpAQCAtMCwwICsxLDk4IEBACisvKiBpcGxpbmtfaXB2bGFuLmMJSVBWTEFOIGRldmljZSBzdXBwb3J0CisgKgorICogICAgICAgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgICAgICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICAgICAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAgICAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczogICAgIE1haGVzaCBCYW5kZXdhciA8bWFoZXNoYkBnb29nbGUuY29tPgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9saW5rLmg+CisKKyNpbmNsdWRlICJydF9uYW1lcy5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiaXBfY29tbW9uLmgiCisKK3N0YXRpYyB2b2lkIGlwdmxhbl9leHBsYWluKEZJTEUgKmYpCit7CisJZnByaW50ZihmLCAiVXNhZ2U6IC4uLiBpcHZsYW4gWyBtb2RlIHsgbDIgfCBsMyB9IF1cbiIpOworfQorCitzdGF0aWMgdm9pZCBleHBsYWluKHZvaWQpCit7CisJaXB2bGFuX2V4cGxhaW4oc3RkZXJyKTsKK30KKworc3RhdGljIGludCBtb2RlX2FyZyh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiRXJyb3I6IGFyZ3VtZW50IG9mIFwibW9kZVwiIG11c3QgYmUgZWl0aGVyIFwibDJcIiwgIgorCQkib3IgXCJsM1wiXG4iKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgaXB2bGFuX3BhcnNlX29wdChzdHJ1Y3QgbGlua191dGlsICpsdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCQkJICAgIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJtb2RlIikgPT0gMCkgeworCQkJX191MTYgbW9kZSA9IDA7CisJCQlORVhUX0FSRygpOworCisJCQlpZiAoc3RyY21wKCphcmd2LCAibDIiKSA9PSAwKQorCQkJCW1vZGUgPSBJUFZMQU5fTU9ERV9MMjsKKwkJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImwzIikgPT0gMCkKKwkJCQltb2RlID0gSVBWTEFOX01PREVfTDM7CisJCQllbHNlCisJCQkJcmV0dXJuIG1vZGVfYXJnKCk7CisKKwkJCWFkZGF0dHIxNihuLCAxMDI0LCBJRkxBX0lQVkxBTl9NT0RFLCBtb2RlKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiaGVscCIpID09IDApIHsKKwkJCWV4cGxhaW4oKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiaXB2bGFuOiB1bmtub3duIG9wdGlvbiBcIiVzXCI/XG4iLAorCQkJCSphcmd2KTsKKwkJCWV4cGxhaW4oKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlhcmdjLS0sIGFyZ3YrKzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXB2bGFuX3ByaW50X29wdChzdHJ1Y3QgbGlua191dGlsICpsdSwgRklMRSAqZiwgc3RydWN0IHJ0YXR0ciAqdGJbXSkKK3sKKworCWlmICghdGIpCisJCXJldHVybjsKKworCWlmICh0YltJRkxBX0lQVkxBTl9NT0RFXSkgeworCQlpZiAoUlRBX1BBWUxPQUQodGJbSUZMQV9JUFZMQU5fTU9ERV0pID09IHNpemVvZihfX3UxNikpIHsKKwkJCV9fdTE2IG1vZGUgPSBydGFfZ2V0YXR0cl91MTYodGJbSUZMQV9JUFZMQU5fTU9ERV0pOworCisJCQlmcHJpbnRmKGYsICIgbW9kZSAlcyAiLAorCQkJCW1vZGUgPT0gSVBWTEFOX01PREVfTDIgPyAibDIiIDoKKwkJCQltb2RlID09IElQVkxBTl9NT0RFX0wzID8gImwzIiA6ICJ1bmtub3duIik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlwdmxhbl9wcmludF9oZWxwKHN0cnVjdCBsaW5rX3V0aWwgKmx1LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCisJCQkgICAgICBGSUxFICpmKQoreworCWlwdmxhbl9leHBsYWluKGYpOworfQorCitzdHJ1Y3QgbGlua191dGlsIGlwdmxhbl9saW5rX3V0aWwgPSB7CisJLmlkCQk9ICJpcHZsYW4iLAorCS5tYXhhdHRyCT0gSUZMQV9JUFZMQU5fTUFYLAorCS5wYXJzZV9vcHQJPSBpcHZsYW5fcGFyc2Vfb3B0LAorCS5wcmludF9vcHQJPSBpcHZsYW5fcHJpbnRfb3B0LAorCS5wcmludF9oZWxwCT0gaXB2bGFuX3ByaW50X2hlbHAsCit9OwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaXAvaXBsaW5rX21hY3ZsYW4uYyBiL2lwcm91dGUyL2lwL2lwbGlua19tYWN2bGFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5NWU4MQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2lwL2lwbGlua19tYWN2bGFuLmMKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBpcGxpbmtfbWFjdmxhbi5jCW1hY3ZsYW4vbWFjdnRhcCBkZXZpY2Ugc3VwcG9ydAorICoKKyAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6ICAgICBQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KKyAqCQlBcm5kIEJlcmdtYW5uIDxhcm5kQGFybmRiLmRlPgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9saW5rLmg+CisKKyNpbmNsdWRlICJydF9uYW1lcy5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiaXBfY29tbW9uLmgiCisKKyNkZWZpbmUgcGZ4X2VycihsdSwgLi4uKSB7ICAgICAgICAgICAgICAgXAorCWZwcmludGYoc3RkZXJyLCAiJXM6ICIsIGx1LT5pZCk7IFwKKwlmcHJpbnRmKHN0ZGVyciwgX19WQV9BUkdTX18pOyAgICBcCisJZnByaW50ZihzdGRlcnIsICJcbiIpOyAgICAgICAgICAgXAorfQorCitzdGF0aWMgdm9pZCBwcmludF9leHBsYWluKHN0cnVjdCBsaW5rX3V0aWwgKmx1LCBGSUxFICpmKQoreworCWZwcmludGYoZiwKKwkJIlVzYWdlOiAuLi4gJXMgbW9kZSB7IHByaXZhdGUgfCB2ZXBhIHwgYnJpZGdlIHwgcGFzc3RocnUgW25vcHJvbWlzY10gfVxuIiwKKwkJbHUtPmlkCisJKTsKK30KKworc3RhdGljIHZvaWQgZXhwbGFpbihzdHJ1Y3QgbGlua191dGlsICpsdSkKK3sKKwlwcmludF9leHBsYWluKGx1LCBzdGRlcnIpOworfQorCitzdGF0aWMgaW50IG1vZGVfYXJnKGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvcjogYXJndW1lbnQgb2YgXCJtb2RlXCIgbXVzdCBiZSBcInByaXZhdGVcIiwgIgorCQkiXCJ2ZXBhXCIsIFwiYnJpZGdlXCIgb3IgXCJwYXNzdGhydVwiLCBub3QgXCIlc1wiXG4iLCBhcmcpOworICAgICAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgbWFjdmxhbl9wYXJzZV9vcHQoc3RydWN0IGxpbmtfdXRpbCAqbHUsIGludCBhcmdjLCBjaGFyICoqYXJndiwKKwkJCSAgc3RydWN0IG5sbXNnaGRyICpuKQoreworCV9fdTMyIG1vZGUgPSAwOworCV9fdTE2IGZsYWdzID0gMDsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAobWF0Y2hlcygqYXJndiwgIm1vZGUiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCisJCQlpZiAoc3RyY21wKCphcmd2LCAicHJpdmF0ZSIpID09IDApCisJCQkJbW9kZSA9IE1BQ1ZMQU5fTU9ERV9QUklWQVRFOworCQkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCAidmVwYSIpID09IDApCisJCQkJbW9kZSA9IE1BQ1ZMQU5fTU9ERV9WRVBBOworCQkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiYnJpZGdlIikgPT0gMCkKKwkJCQltb2RlID0gTUFDVkxBTl9NT0RFX0JSSURHRTsKKwkJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInBhc3N0aHJ1IikgPT0gMCkKKwkJCQltb2RlID0gTUFDVkxBTl9NT0RFX1BBU1NUSFJVOworCQkJZWxzZQorCQkJCXJldHVybiBtb2RlX2FyZygqYXJndik7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgIm5vcHJvbWlzYyIpID09IDApIHsKKwkJCWZsYWdzIHw9IE1BQ1ZMQU5fRkxBR19OT1BST01JU0M7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKSB7CisJCQlleHBsYWluKGx1KTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHsKKwkJCXBmeF9lcnIobHUsICJ1bmtub3duIG9wdGlvbiBcIiVzXCI/IiwgKmFyZ3YpOworCQkJZXhwbGFpbihsdSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYXJnYy0tLCBhcmd2Kys7CisJfQorCisJaWYgKG1vZGUpCisJCWFkZGF0dHIzMihuLCAxMDI0LCBJRkxBX01BQ1ZMQU5fTU9ERSwgbW9kZSk7CisKKwlpZiAoZmxhZ3MpIHsKKwkJaWYgKGZsYWdzICYgTUFDVkxBTl9GTEFHX05PUFJPTUlTQyAmJgorCQkgICAgbW9kZSAhPSBNQUNWTEFOX01PREVfUEFTU1RIUlUpIHsKKwkJCXBmeF9lcnIobHUsICJub3Byb21pc2MgZmxhZyBvbmx5IHZhbGlkIGluIHBhc3N0aHJ1IG1vZGUiKTsKKwkJCWV4cGxhaW4obHUpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWFkZGF0dHIxNihuLCAxMDI0LCBJRkxBX01BQ1ZMQU5fRkxBR1MsIGZsYWdzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1hY3ZsYW5fcHJpbnRfb3B0KHN0cnVjdCBsaW5rX3V0aWwgKmx1LCBGSUxFICpmLCBzdHJ1Y3QgcnRhdHRyICp0YltdKQoreworCV9fdTMyIG1vZGU7CisJX191MTYgZmxhZ3M7CisKKwlpZiAoIXRiKQorCQlyZXR1cm47CisKKwlpZiAoIXRiW0lGTEFfTUFDVkxBTl9NT0RFXSB8fAorCSAgICBSVEFfUEFZTE9BRCh0YltJRkxBX01BQ1ZMQU5fTU9ERV0pIDwgc2l6ZW9mKF9fdTMyKSkKKwkJcmV0dXJuOworCisJbW9kZSA9IHJ0YV9nZXRhdHRyX3UzMih0YltJRkxBX01BQ1ZMQU5fTU9ERV0pOworCWZwcmludGYoZiwgIiBtb2RlICVzICIsCisJCSAgbW9kZSA9PSBNQUNWTEFOX01PREVfUFJJVkFURSA/ICJwcml2YXRlIgorCQk6IG1vZGUgPT0gTUFDVkxBTl9NT0RFX1ZFUEEgICAgPyAidmVwYSIKKwkJOiBtb2RlID09IE1BQ1ZMQU5fTU9ERV9CUklER0UgID8gImJyaWRnZSIKKwkJOiBtb2RlID09IE1BQ1ZMQU5fTU9ERV9QQVNTVEhSVSAgPyAicGFzc3RocnUiCisJCToJCQkJICJ1bmtub3duIik7CisKKwlpZiAoIXRiW0lGTEFfTUFDVkxBTl9GTEFHU10gfHwKKwkgICAgUlRBX1BBWUxPQUQodGJbSUZMQV9NQUNWTEFOX0ZMQUdTXSkgPCBzaXplb2YoX191MTYpKQorCQlyZXR1cm47CisKKwlmbGFncyA9IHJ0YV9nZXRhdHRyX3UxNih0YltJRkxBX01BQ1ZMQU5fRkxBR1NdKTsKKwlpZiAoZmxhZ3MgJiBNQUNWTEFOX0ZMQUdfTk9QUk9NSVNDKQorCQlmcHJpbnRmKGYsICJub3Byb21pc2MgIik7Cit9CisKK3N0YXRpYyB2b2lkIG1hY3ZsYW5fcHJpbnRfaGVscChzdHJ1Y3QgbGlua191dGlsICpsdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCUZJTEUgKmYpCit7CisJcHJpbnRfZXhwbGFpbihsdSwgZik7Cit9CisKK3N0cnVjdCBsaW5rX3V0aWwgbWFjdmxhbl9saW5rX3V0aWwgPSB7CisJLmlkCQk9ICJtYWN2bGFuIiwKKwkubWF4YXR0cgk9IElGTEFfTUFDVkxBTl9NQVgsCisJLnBhcnNlX29wdAk9IG1hY3ZsYW5fcGFyc2Vfb3B0LAorCS5wcmludF9vcHQJPSBtYWN2bGFuX3ByaW50X29wdCwKKwkucHJpbnRfaGVscAk9IG1hY3ZsYW5fcHJpbnRfaGVscCwKK307CisKK3N0cnVjdCBsaW5rX3V0aWwgbWFjdnRhcF9saW5rX3V0aWwgPSB7CisJLmlkCQk9ICJtYWN2dGFwIiwKKwkubWF4YXR0cgk9IElGTEFfTUFDVkxBTl9NQVgsCisJLnBhcnNlX29wdAk9IG1hY3ZsYW5fcGFyc2Vfb3B0LAorCS5wcmludF9vcHQJPSBtYWN2bGFuX3ByaW50X29wdCwKKwkucHJpbnRfaGVscAk9IG1hY3ZsYW5fcHJpbnRfaGVscCwKK307CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pcC9pcGxpbmtfdmxhbi5jIGIvaXByb3V0ZTIvaXAvaXBsaW5rX3ZsYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmQ3NjZmCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaXAvaXBsaW5rX3ZsYW4uYwpAQCAtMCwwICsxLDI0NiBAQAorLyoKKyAqIGlwbGlua192bGFuLmMJVkxBTiBkZXZpY2Ugc3VwcG9ydAorICoKKyAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6ICAgICBQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisKKyNpbmNsdWRlICJydF9uYW1lcy5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiaXBfY29tbW9uLmgiCisKK3N0YXRpYyB2b2lkIHByaW50X2V4cGxhaW4oRklMRSAqZikKK3sKKwlmcHJpbnRmKGYsCisJCSJVc2FnZTogLi4uIHZsYW4gWyBwcm90b2NvbCBWTEFOUFJPVE8gXSBpZCBWTEFOSUQiCisJCSIgICAgICAgICAgICAgICAgWyBGTEFHLUxJU1QgXVxuIgorCQkiICAgICAgICAgICAgICAgIFsgaW5ncmVzcy1xb3MtbWFwIFFPUy1NQVAgXSBbIGVncmVzcy1xb3MtbWFwIFFPUy1NQVAgXVxuIgorCQkiXG4iCisJCSJWTEFOUFJPVE86IFsgODAyLjFRIC8gODAyLjFhZCBdXG4iCisJCSJWTEFOSUQgOj0gMC00MDk1XG4iCisJCSJGTEFHLUxJU1QgOj0gWyBGTEFHLUxJU1QgXSBGTEFHXG4iCisJCSJGTEFHIDo9IFsgcmVvcmRlcl9oZHIgeyBvbiB8IG9mZiB9IF0gWyBndnJwIHsgb24gfCBvZmYgfSBdIFsgbXZycCB7IG9uIHwgb2ZmIH0gXVxuIgorCQkiICAgICAgICBbIGxvb3NlX2JpbmRpbmcgeyBvbiB8IG9mZiB9IF1cbiIKKwkJIlFPUy1NQVAgOj0gWyBRT1MtTUFQIF0gUU9TLU1BUFBJTkdcbiIKKwkJIlFPUy1NQVBQSU5HIDo9IEZST006VE9cbiIKKwkpOworfQorCitzdGF0aWMgdm9pZCBleHBsYWluKHZvaWQpCit7CisJcHJpbnRfZXhwbGFpbihzdGRlcnIpOworfQorCitzdGF0aWMgaW50IG9uX29mZihjb25zdCBjaGFyICptc2csIGNvbnN0IGNoYXIgKmFyZykKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBhcmd1bWVudCBvZiBcIiVzXCIgbXVzdCBiZSBcIm9uXCIgb3IgXCJvZmZcIiwgbm90IFwiJXNcIlxuIiwgbXNnLCBhcmcpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCB2bGFuX3BhcnNlX3Fvc19tYXAoaW50ICphcmdjcCwgY2hhciAqKiphcmd2cCwgc3RydWN0IG5sbXNnaGRyICpuLAorCQkJICAgICAgaW50IGF0dHJ0eXBlKQoreworCWludCBhcmdjID0gKmFyZ2NwOworCWNoYXIgKiphcmd2ID0gKmFyZ3ZwOworCXN0cnVjdCBpZmxhX3ZsYW5fcW9zX21hcHBpbmcgbTsKKwlzdHJ1Y3QgcnRhdHRyICp0YWlsOworCisJdGFpbCA9IE5MTVNHX1RBSUwobik7CisJYWRkYXR0cl9sKG4sIDEwMjQsIGF0dHJ0eXBlLCBOVUxMLCAwKTsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQljaGFyICpjb2xvbiA9IHN0cmNocigqYXJndiwgJzonKTsKKworCQlpZiAoIWNvbG9uKQorCQkJYnJlYWs7CisJCSpjb2xvbiA9ICdcMCc7CisKKwkJaWYgKGdldF91MzIoJm0uZnJvbSwgKmFyZ3YsIDApKQorCQkJcmV0dXJuIDE7CisJCWlmIChnZXRfdTMyKCZtLnRvLCBjb2xvbiArIDEsIDApKQorCQkJcmV0dXJuIDE7CisJCWFyZ2MtLSwgYXJndisrOworCisJCWFkZGF0dHJfbChuLCAxMDI0LCBJRkxBX1ZMQU5fUU9TX01BUFBJTkcsICZtLCBzaXplb2YobSkpOworCX0KKworCXRhaWwtPnJ0YV9sZW4gPSAodm9pZCAqKSBOTE1TR19UQUlMKG4pIC0gKHZvaWQgKil0YWlsOworCisJKmFyZ2NwID0gYXJnYzsKKwkqYXJndnAgPSBhcmd2OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZsYW5fcGFyc2Vfb3B0KHN0cnVjdCBsaW5rX3V0aWwgKmx1LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCisJCQkgIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlzdHJ1Y3QgaWZsYV92bGFuX2ZsYWdzIGZsYWdzID0geyAwIH07CisJX191MTYgaWQsIHByb3RvOworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChtYXRjaGVzKCphcmd2LCAicHJvdG9jb2wiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGxsX3Byb3RvX2EybigmcHJvdG8sICphcmd2KSkKKwkJCQlpbnZhcmcoInByb3RvY29sIGlzIGludmFsaWQiLCAqYXJndik7CisJCQlhZGRhdHRyX2wobiwgMTAyNCwgSUZMQV9WTEFOX1BST1RPQ09MLCAmcHJvdG8sIDIpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJpZCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UxNigmaWQsICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoImlkIGlzIGludmFsaWQiLCAqYXJndik7CisJCQlhZGRhdHRyX2wobiwgMTAyNCwgSUZMQV9WTEFOX0lELCAmaWQsIDIpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJyZW9yZGVyX2hkciIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlmbGFncy5tYXNrIHw9IFZMQU5fRkxBR19SRU9SREVSX0hEUjsKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJvbiIpID09IDApCisJCQkJZmxhZ3MuZmxhZ3MgfD0gVkxBTl9GTEFHX1JFT1JERVJfSERSOworCQkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCAib2ZmIikgPT0gMCkKKwkJCQlmbGFncy5mbGFncyAmPSB+VkxBTl9GTEFHX1JFT1JERVJfSERSOworCQkJZWxzZQorCQkJCXJldHVybiBvbl9vZmYoInJlb3JkZXJfaGRyIiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJndnJwIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWZsYWdzLm1hc2sgfD0gVkxBTl9GTEFHX0dWUlA7CisJCQlpZiAoc3RyY21wKCphcmd2LCAib24iKSA9PSAwKQorCQkJCWZsYWdzLmZsYWdzIHw9IFZMQU5fRkxBR19HVlJQOworCQkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCAib2ZmIikgPT0gMCkKKwkJCQlmbGFncy5mbGFncyAmPSB+VkxBTl9GTEFHX0dWUlA7CisJCQllbHNlCisJCQkJcmV0dXJuIG9uX29mZigiZ3ZycCIsICphcmd2KTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAibXZycCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlmbGFncy5tYXNrIHw9IFZMQU5fRkxBR19NVlJQOworCQkJaWYgKHN0cmNtcCgqYXJndiwgIm9uIikgPT0gMCkKKwkJCQlmbGFncy5mbGFncyB8PSBWTEFOX0ZMQUdfTVZSUDsKKwkJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm9mZiIpID09IDApCisJCQkJZmxhZ3MuZmxhZ3MgJj0gflZMQU5fRkxBR19NVlJQOworCQkJZWxzZQorCQkJCXJldHVybiBvbl9vZmYoIm12cnAiLCAqYXJndik7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImxvb3NlX2JpbmRpbmciKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJZmxhZ3MubWFzayB8PSBWTEFOX0ZMQUdfTE9PU0VfQklORElORzsKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJvbiIpID09IDApCisJCQkJZmxhZ3MuZmxhZ3MgfD0gVkxBTl9GTEFHX0xPT1NFX0JJTkRJTkc7CisJCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJvZmYiKSA9PSAwKQorCQkJCWZsYWdzLmZsYWdzICY9IH5WTEFOX0ZMQUdfTE9PU0VfQklORElORzsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gb25fb2ZmKCJsb29zZV9iaW5kaW5nIiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJpbmdyZXNzLXFvcy1tYXAiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHZsYW5fcGFyc2VfcW9zX21hcCgmYXJnYywgJmFyZ3YsIG4sCisJCQkJCSAgICAgICBJRkxBX1ZMQU5fSU5HUkVTU19RT1MpKQorCQkJCWludmFyZygiaW52YWxpZCBpbmdyZXNzLXFvcy1tYXAiLCAqYXJndik7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiZWdyZXNzLXFvcy1tYXAiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHZsYW5fcGFyc2VfcW9zX21hcCgmYXJnYywgJmFyZ3YsIG4sCisJCQkJCSAgICAgICBJRkxBX1ZMQU5fRUdSRVNTX1FPUykpCisJCQkJaW52YXJnKCJpbnZhbGlkIGVncmVzcy1xb3MtbWFwIiwgKmFyZ3YpOworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKSB7CisJCQlleHBsYWluKCk7CisJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgInZsYW46IHVua25vd24gY29tbWFuZCBcIiVzXCI/XG4iLCAqYXJndik7CisJCQlleHBsYWluKCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYXJnYy0tLCBhcmd2Kys7CisJfQorCisJaWYgKGZsYWdzLm1hc2spCisJCWFkZGF0dHJfbChuLCAxMDI0LCBJRkxBX1ZMQU5fRkxBR1MsICZmbGFncywgc2l6ZW9mKGZsYWdzKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdmxhbl9wcmludF9tYXAoRklMRSAqZiwgY2hhciAqbmFtZSwgc3RydWN0IHJ0YXR0ciAqYXR0cikKK3sKKwlzdHJ1Y3QgaWZsYV92bGFuX3Fvc19tYXBwaW5nICptOworCXN0cnVjdCBydGF0dHIgKmk7CisJaW50IHJlbTsKKworCWZwcmludGYoZiwgIlxuICAgICAgJXMgeyAiLCBuYW1lKTsKKworCXJlbSA9IFJUQV9QQVlMT0FEKGF0dHIpOworCWZvciAoaSA9IFJUQV9EQVRBKGF0dHIpOyBSVEFfT0soaSwgcmVtKTsgaSA9IFJUQV9ORVhUKGksIHJlbSkpIHsKKwkJbSA9IFJUQV9EQVRBKGkpOworCQlmcHJpbnRmKGYsICIldToldSAiLCBtLT5mcm9tLCBtLT50byk7CisJfQorCWZwcmludGYoZiwgIn0gIik7Cit9CisKK3N0YXRpYyB2b2lkIHZsYW5fcHJpbnRfZmxhZ3MoRklMRSAqZnAsIF9fdTMyIGZsYWdzKQoreworCWZwcmludGYoZnAsICI8Iik7CisjZGVmaW5lIF9QRihmKQlpZiAoZmxhZ3MgJiBWTEFOX0ZMQUdfIyNmKSB7IFwKKwkJCWZsYWdzICY9IH4gVkxBTl9GTEFHXyMjZjsgXAorCQkJZnByaW50ZihmcCwgI2YgIiVzIiwgZmxhZ3MgPyAiLCIgOiAiIik7IFwKKwkJfQorCV9QRihSRU9SREVSX0hEUik7CisJX1BGKEdWUlApOworCV9QRihNVlJQKTsKKwlfUEYoTE9PU0VfQklORElORyk7CisjdW5kZWYgX1BGCisJaWYgKGZsYWdzKQorCQlmcHJpbnRmKGZwLCAiJXgiLCBmbGFncyk7CisJZnByaW50ZihmcCwgIj4gIik7Cit9CisKK3N0YXRpYyB2b2lkIHZsYW5fcHJpbnRfb3B0KHN0cnVjdCBsaW5rX3V0aWwgKmx1LCBGSUxFICpmLCBzdHJ1Y3QgcnRhdHRyICp0YltdKQoreworCXN0cnVjdCBpZmxhX3ZsYW5fZmxhZ3MgKmZsYWdzOworCVNQUklOVF9CVUYoYjEpOworCisJaWYgKCF0YikKKwkJcmV0dXJuOworCisJaWYgKHRiW0lGTEFfVkxBTl9QUk9UT0NPTF0gJiYKKwkgICAgUlRBX1BBWUxPQUQodGJbSUZMQV9WTEFOX1BST1RPQ09MXSkgPCBzaXplb2YoX191MTYpKQorCQlyZXR1cm47CisJaWYgKCF0YltJRkxBX1ZMQU5fSURdIHx8CisJICAgIFJUQV9QQVlMT0FEKHRiW0lGTEFfVkxBTl9JRF0pIDwgc2l6ZW9mKF9fdTE2KSkKKwkJcmV0dXJuOworCisJaWYgKHRiW0lGTEFfVkxBTl9QUk9UT0NPTF0pCisJCWZwcmludGYoZiwgInByb3RvY29sICVzICIsCisJCQlsbF9wcm90b19uMmEocnRhX2dldGF0dHJfdTE2KHRiW0lGTEFfVkxBTl9QUk9UT0NPTF0pLAorCQkJCSAgICAgYjEsIHNpemVvZihiMSkpKTsKKwllbHNlCisJCWZwcmludGYoZiwgInByb3RvY29sIDgwMi4xcSAiKTsKKworCWZwcmludGYoZiwgImlkICV1ICIsIHJ0YV9nZXRhdHRyX3UxNih0YltJRkxBX1ZMQU5fSURdKSk7CisKKwlpZiAodGJbSUZMQV9WTEFOX0ZMQUdTXSkgeworCQlpZiAoUlRBX1BBWUxPQUQodGJbSUZMQV9WTEFOX0ZMQUdTXSkgPCBzaXplb2YoKmZsYWdzKSkKKwkJCXJldHVybjsKKwkJZmxhZ3MgPSBSVEFfREFUQSh0YltJRkxBX1ZMQU5fRkxBR1NdKTsKKwkJdmxhbl9wcmludF9mbGFncyhmLCBmbGFncy0+ZmxhZ3MpOworCX0KKwlpZiAodGJbSUZMQV9WTEFOX0lOR1JFU1NfUU9TXSkKKwkJdmxhbl9wcmludF9tYXAoZiwgImluZ3Jlc3MtcW9zLW1hcCIsIHRiW0lGTEFfVkxBTl9JTkdSRVNTX1FPU10pOworCWlmICh0YltJRkxBX1ZMQU5fRUdSRVNTX1FPU10pCisJCXZsYW5fcHJpbnRfbWFwKGYsICJlZ3Jlc3MtcW9zLW1hcCIsIHRiW0lGTEFfVkxBTl9FR1JFU1NfUU9TXSk7Cit9CisKK3N0YXRpYyB2b2lkIHZsYW5fcHJpbnRfaGVscChzdHJ1Y3QgbGlua191dGlsICpsdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCUZJTEUgKmYpCit7CisJcHJpbnRfZXhwbGFpbihmKTsKK30KKworc3RydWN0IGxpbmtfdXRpbCB2bGFuX2xpbmtfdXRpbCA9IHsKKwkuaWQJCT0gInZsYW4iLAorCS5tYXhhdHRyCT0gSUZMQV9WTEFOX01BWCwKKwkucGFyc2Vfb3B0CT0gdmxhbl9wYXJzZV9vcHQsCisJLnByaW50X29wdAk9IHZsYW5fcHJpbnRfb3B0LAorCS5wcmludF9oZWxwCT0gdmxhbl9wcmludF9oZWxwLAorfTsKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2lwL2lwbGlua192cmYuYyBiL2lwcm91dGUyL2lwL2lwbGlua192cmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjRiNzcyCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaXAvaXBsaW5rX3ZyZi5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qIGlwbGlua192cmYuYwlWUkYgZGV2aWNlIHN1cHBvcnQKKyAqCisgKiAgICAgICAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICAgICAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgICAgICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgICAgICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOiAgICAgU2hyaWplZXQgTXVraGVyamVlIDxzaG1AY3VtdWx1c25ldHdvcmtzLmNvbT4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfbGluay5oPgorCisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgImlwX2NvbW1vbi5oIgorCitzdGF0aWMgdm9pZCB2cmZfZXhwbGFpbihGSUxFICpmKQoreworCWZwcmludGYoZiwgIlVzYWdlOiAuLi4gdnJmIHRhYmxlIFRBQkxFSUQgXG4iKTsKK30KKworc3RhdGljIHZvaWQgZXhwbGFpbih2b2lkKQoreworCXZyZl9leHBsYWluKHN0ZGVycik7Cit9CisKK3N0YXRpYyBpbnQgdnJmX3BhcnNlX29wdChzdHJ1Y3QgbGlua191dGlsICpsdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCQkJICAgIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJ0YWJsZSIpID09IDApIHsKKwkJCV9fdTMyIHRhYmxlOworCisJCQlORVhUX0FSRygpOworCisJCQlpZiAocnRubF9ydHRhYmxlX2EybigmdGFibGUsICphcmd2KSkKKwkJCQlpbnZhcmcoImludmFsaWQgdGFibGUgSURcbiIsICphcmd2KTsKKwkJCWFkZGF0dHIzMihuLCAxMDI0LCBJRkxBX1ZSRl9UQUJMRSwgdGFibGUpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJ2cmY6IHVua25vd24gb3B0aW9uIFwiJXNcIj9cbiIsCisJCQkJKmFyZ3YpOworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWFyZ2MtLSwgYXJndisrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2cmZfcHJpbnRfb3B0KHN0cnVjdCBsaW5rX3V0aWwgKmx1LCBGSUxFICpmLCBzdHJ1Y3QgcnRhdHRyICp0YltdKQoreworCWlmICghdGIpCisJCXJldHVybjsKKworCWlmICh0YltJRkxBX1ZSRl9UQUJMRV0pCisJCWZwcmludGYoZiwgInRhYmxlICV1ICIsIHJ0YV9nZXRhdHRyX3UzMih0YltJRkxBX1ZSRl9UQUJMRV0pKTsKK30KKworc3RhdGljIHZvaWQgdnJmX3ByaW50X2hlbHAoc3RydWN0IGxpbmtfdXRpbCAqbHUsIGludCBhcmdjLCBjaGFyICoqYXJndiwKKwkJCSAgICAgIEZJTEUgKmYpCit7CisJdnJmX2V4cGxhaW4oZik7Cit9CisKK3N0cnVjdCBsaW5rX3V0aWwgdnJmX2xpbmtfdXRpbCA9IHsKKwkuaWQJCT0gInZyZiIsCisJLm1heGF0dHIJPSBJRkxBX1ZSRl9NQVgsCisJLnBhcnNlX29wdAk9IHZyZl9wYXJzZV9vcHQsCisJLnByaW50X29wdAk9IHZyZl9wcmludF9vcHQsCisJLnByaW50X2hlbHAJPSB2cmZfcHJpbnRfaGVscCwKK307CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pcC9pcGxpbmtfdnhsYW4uYyBiL2lwcm91dGUyL2lwL2lwbGlua192eGxhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZTg0ODIKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pcC9pcGxpbmtfdnhsYW4uYwpAQCAtMCwwICsxLDQ2MiBAQAorLyoKKyAqIGlwbGlua192eGxhbi5jCVZYTEFOIGRldmljZSBzdXBwb3J0CisgKgorICogICAgICAgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgICAgICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICAgICAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAgICAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczogICAgIFN0ZXBoZW4gSGVtbWluZ2VyIDxzaGVtbWluZ2VyQHZ5YXR0YS5jb20KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2xpbmsuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgInJ0X25hbWVzLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJpcF9jb21tb24uaCIKKworc3RhdGljIHZvaWQgcHJpbnRfZXhwbGFpbihGSUxFICpmKQoreworCWZwcmludGYoZiwgIlVzYWdlOiAuLi4gdnhsYW4gaWQgVk5JIFsgeyBncm91cCB8IHJlbW90ZSB9IElQX0FERFJFU1MgXSBbIGxvY2FsIEFERFIgXVxuIik7CisJZnByaW50ZihmLCAiICAgICAgICAgICAgICAgICBbIHR0bCBUVEwgXSBbIHRvcyBUT1MgXSBbIGRldiBQSFlTX0RFViBdXG4iKTsKKwlmcHJpbnRmKGYsICIgICAgICAgICAgICAgICAgIFsgZHN0cG9ydCBQT1JUIF0gWyBzcmNwb3J0IE1JTiBNQVggXVxuIik7CisJZnByaW50ZihmLCAiICAgICAgICAgICAgICAgICBbIFtub11sZWFybmluZyBdIFsgW25vXXByb3h5IF0gWyBbbm9dcnNjIF1cbiIpOworCWZwcmludGYoZiwgIiAgICAgICAgICAgICAgICAgWyBbbm9dbDJtaXNzIF0gWyBbbm9dbDNtaXNzIF1cbiIpOworCWZwcmludGYoZiwgIiAgICAgICAgICAgICAgICAgWyBhZ2VpbmcgU0VDT05EUyBdIFsgbWF4YWRkcmVzcyBOVU1CRVIgXVxuIik7CisJZnByaW50ZihmLCAiICAgICAgICAgICAgICAgICBbIFtub111ZHBjc3VtIF0gWyBbbm9ddWRwNnplcm9jc3VtdHggXSBbIFtub111ZHA2emVyb2NzdW1yeCBdXG4iKTsKKwlmcHJpbnRmKGYsICIgICAgICAgICAgICAgICAgIFsgW25vXXJlbWNzdW10eCBdIFsgW25vXXJlbWNzdW1yeCBdXG4iKTsKKwlmcHJpbnRmKGYsICIgICAgICAgICAgICAgICAgIFsgW25vXWV4dGVybmFsIF0gWyBnYnAgXVxuIik7CisJZnByaW50ZihmLCAiXG4iKTsKKwlmcHJpbnRmKGYsICJXaGVyZTogVk5JIDo9IDAtMTY3NzcyMTVcbiIpOworCWZwcmludGYoZiwgIiAgICAgICBBRERSIDo9IHsgSVBfQUREUkVTUyB8IGFueSB9XG4iKTsKKwlmcHJpbnRmKGYsICIgICAgICAgVE9TICA6PSB7IE5VTUJFUiB8IGluaGVyaXQgfVxuIik7CisJZnByaW50ZihmLCAiICAgICAgIFRUTCAgOj0geyAxLi4yNTUgfCBpbmhlcml0IH1cbiIpOworfQorCitzdGF0aWMgdm9pZCBleHBsYWluKHZvaWQpCit7CisJcHJpbnRfZXhwbGFpbihzdGRlcnIpOworfQorCitzdGF0aWMgaW50IHZ4bGFuX3BhcnNlX29wdChzdHJ1Y3QgbGlua191dGlsICpsdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCQkJICBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJX191MzIgdm5pID0gMDsKKwlpbnQgdm5pX3NldCA9IDA7CisJX191MzIgc2FkZHIgPSAwOworCV9fdTMyIGdhZGRyID0gMDsKKwlfX3UzMiBkYWRkciA9IDA7CisJc3RydWN0IGluNl9hZGRyIHNhZGRyNiA9IElONkFERFJfQU5ZX0lOSVQ7CisJc3RydWN0IGluNl9hZGRyIGdhZGRyNiA9IElONkFERFJfQU5ZX0lOSVQ7CisJc3RydWN0IGluNl9hZGRyIGRhZGRyNiA9IElONkFERFJfQU5ZX0lOSVQ7CisJdW5zaWduZWQgbGluayA9IDA7CisJX191OCB0b3MgPSAwOworCV9fdTggdHRsID0gMDsKKwlfX3U4IGxlYXJuaW5nID0gMTsKKwlfX3U4IHByb3h5ID0gMDsKKwlfX3U4IHJzYyA9IDA7CisJX191OCBsMm1pc3MgPSAwOworCV9fdTggbDNtaXNzID0gMDsKKwlfX3U4IG5vYWdlID0gMDsKKwlfX3UzMiBhZ2UgPSAwOworCV9fdTMyIG1heGFkZHIgPSAwOworCV9fdTE2IGRzdHBvcnQgPSAwOworCV9fdTggdWRwY3N1bSA9IDA7CisJX191OCB1ZHA2emVyb2NzdW10eCA9IDA7CisJX191OCB1ZHA2emVyb2NzdW1yeCA9IDA7CisJX191OCByZW1jc3VtdHggPSAwOworCV9fdTggcmVtY3N1bXJ4ID0gMDsKKwlfX3U4IG1ldGFkYXRhID0gMDsKKwlfX3U4IGdicCA9IDA7CisJaW50IGRzdF9wb3J0X3NldCA9IDA7CisJc3RydWN0IGlmbGFfdnhsYW5fcG9ydF9yYW5nZSByYW5nZSA9IHsgMCwgMCB9OworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmICghbWF0Y2hlcygqYXJndiwgImlkIikgfHwKKwkJICAgICFtYXRjaGVzKCphcmd2LCAidm5pIikpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmdm5pLCAqYXJndiwgMCkgfHwKKwkJCSAgICB2bmkgPj0gMXUgPDwgMjQpCisJCQkJaW52YXJnKCJpbnZhbGlkIGlkIiwgKmFyZ3YpOworCQkJdm5pX3NldCA9IDE7CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJncm91cCIpKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKCFpbmV0X2dldF9hZGRyKCphcmd2LCAmZ2FkZHIsICZnYWRkcjYpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGFkZHJlc3MgXCIlc1wiXG4iLCAqYXJndik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKCFJTjZfSVNfQUREUl9NVUxUSUNBU1QoJmdhZGRyNikgJiYgIUlOX01VTFRJQ0FTVChudG9obChnYWRkcikpKQorCQkJCWludmFyZygiaW52YWxpZCBncm91cCBhZGRyZXNzIiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKCFtYXRjaGVzKCphcmd2LCAicmVtb3RlIikpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoIWluZXRfZ2V0X2FkZHIoKmFyZ3YsICZkYWRkciwgJmRhZGRyNikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgYWRkcmVzcyBcIiVzXCJcbiIsICphcmd2KTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAoSU42X0lTX0FERFJfTVVMVElDQVNUKCZkYWRkcjYpIHx8IElOX01VTFRJQ0FTVChudG9obChkYWRkcikpKQorCQkJCWludmFyZygiaW52YWxpZCByZW1vdGUgYWRkcmVzcyIsICphcmd2KTsKKwkJfSBlbHNlIGlmICghbWF0Y2hlcygqYXJndiwgImxvY2FsIikpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoc3RyY21wKCphcmd2LCAiYW55IikpIHsKKwkJCQlpZiAoIWluZXRfZ2V0X2FkZHIoKmFyZ3YsICZzYWRkciwgJnNhZGRyNikpIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGFkZHJlc3MgXCIlc1wiXG4iLCAqYXJndik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChJTl9NVUxUSUNBU1QobnRvaGwoc2FkZHIpKSB8fCBJTjZfSVNfQUREUl9NVUxUSUNBU1QoJnNhZGRyNikpCisJCQkJaW52YXJnKCJpbnZhbGlkIGxvY2FsIGFkZHJlc3MiLCAqYXJndik7CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJkZXYiKSkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWxpbmsgPSBpZl9uYW1ldG9pbmRleCgqYXJndik7CisJCQlpZiAobGluayA9PSAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJDYW5ub3QgZmluZCBkZXZpY2UgXCIlc1wiXG4iLAorCQkJCQkqYXJndik7CisJCQkJZXhpdCgtMSk7CisJCQl9CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJ0dGwiKSB8fAorCQkJICAgIW1hdGNoZXMoKmFyZ3YsICJob3BsaW1pdCIpKSB7CisJCQl1bnNpZ25lZCB1dmFsOworCisJCQlORVhUX0FSRygpOworCQkJaWYgKHN0cmNtcCgqYXJndiwgImluaGVyaXQiKSAhPSAwKSB7CisJCQkJaWYgKGdldF91bnNpZ25lZCgmdXZhbCwgKmFyZ3YsIDApKQorCQkJCQlpbnZhcmcoImludmFsaWQgVFRMIiwgKmFyZ3YpOworCQkJCWlmICh1dmFsID4gMjU1KQorCQkJCQlpbnZhcmcoIlRUTCBtdXN0IGJlIDw9IDI1NSIsICphcmd2KTsKKwkJCQl0dGwgPSB1dmFsOworCQkJfQorCQl9IGVsc2UgaWYgKCFtYXRjaGVzKCphcmd2LCAidG9zIikgfHwKKwkJCSAgICFtYXRjaGVzKCphcmd2LCAiZHNmaWVsZCIpKSB7CisJCQlfX3UzMiB1dmFsOworCisJCQlORVhUX0FSRygpOworCQkJaWYgKHN0cmNtcCgqYXJndiwgImluaGVyaXQiKSAhPSAwKSB7CisJCQkJaWYgKHJ0bmxfZHNmaWVsZF9hMm4oJnV2YWwsICphcmd2KSkKKwkJCQkJaW52YXJnKCJiYWQgVE9TIHZhbHVlIiwgKmFyZ3YpOworCQkJCXRvcyA9IHV2YWw7CisJCQl9IGVsc2UKKwkJCQl0b3MgPSAxOworCQl9IGVsc2UgaWYgKCFtYXRjaGVzKCphcmd2LCAiYWdlaW5nIikpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoc3RyY21wKCphcmd2LCAibm9uZSIpID09IDApCisJCQkJbm9hZ2UgPSAxOworCQkJZWxzZSBpZiAoZ2V0X3UzMigmYWdlLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJhZ2VpbmcgdGltZXIiLCAqYXJndik7CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJtYXhhZGRyZXNzIikpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoc3RyY21wKCphcmd2LCAidW5saW1pdGVkIikgPT0gMCkKKwkJCQltYXhhZGRyID0gMDsKKwkJCWVsc2UgaWYgKGdldF91MzIoJm1heGFkZHIsICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoIm1heCBhZGRyZXNzZXMiLCAqYXJndik7CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJwb3J0IikgfHwKKwkJCSAgICFtYXRjaGVzKCphcmd2LCAic3JjcG9ydCIpKSB7CisJCQlfX3UxNiBtaW5wb3J0LCBtYXhwb3J0OworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTE2KCZtaW5wb3J0LCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJtaW4gcG9ydCIsICphcmd2KTsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UxNigmbWF4cG9ydCwgKmFyZ3YsIDApKQorCQkJCWludmFyZygibWF4IHBvcnQiLCAqYXJndik7CisJCQlyYW5nZS5sb3cgPSBodG9ucyhtaW5wb3J0KTsKKwkJCXJhbmdlLmhpZ2ggPSBodG9ucyhtYXhwb3J0KTsKKwkJfSBlbHNlIGlmICghbWF0Y2hlcygqYXJndiwgImRzdHBvcnQiKSl7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MTYoJmRzdHBvcnQsICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoImRzdCBwb3J0IiwgKmFyZ3YpOworCQkJZHN0X3BvcnRfc2V0ID0gMTsKKwkJfSBlbHNlIGlmICghbWF0Y2hlcygqYXJndiwgIm5vbGVhcm5pbmciKSkgeworCQkJbGVhcm5pbmcgPSAwOworCQl9IGVsc2UgaWYgKCFtYXRjaGVzKCphcmd2LCAibGVhcm5pbmciKSkgeworCQkJbGVhcm5pbmcgPSAxOworCQl9IGVsc2UgaWYgKCFtYXRjaGVzKCphcmd2LCAibm9wcm94eSIpKSB7CisJCQlwcm94eSA9IDA7CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJwcm94eSIpKSB7CisJCQlwcm94eSA9IDE7CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJub3JzYyIpKSB7CisJCQlyc2MgPSAwOworCQl9IGVsc2UgaWYgKCFtYXRjaGVzKCphcmd2LCAicnNjIikpIHsKKwkJCXJzYyA9IDE7CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJub2wybWlzcyIpKSB7CisJCQlsMm1pc3MgPSAwOworCQl9IGVsc2UgaWYgKCFtYXRjaGVzKCphcmd2LCAibDJtaXNzIikpIHsKKwkJCWwybWlzcyA9IDE7CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJub2wzbWlzcyIpKSB7CisJCQlsM21pc3MgPSAwOworCQl9IGVsc2UgaWYgKCFtYXRjaGVzKCphcmd2LCAibDNtaXNzIikpIHsKKwkJCWwzbWlzcyA9IDE7CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJ1ZHBjc3VtIikpIHsKKwkJCXVkcGNzdW0gPSAxOworCQl9IGVsc2UgaWYgKCFtYXRjaGVzKCphcmd2LCAibm91ZHBjc3VtIikpIHsKKwkJCXVkcGNzdW0gPSAwOworCQl9IGVsc2UgaWYgKCFtYXRjaGVzKCphcmd2LCAidWRwNnplcm9jc3VtdHgiKSkgeworCQkJdWRwNnplcm9jc3VtdHggPSAxOworCQl9IGVsc2UgaWYgKCFtYXRjaGVzKCphcmd2LCAibm91ZHA2emVyb2NzdW10eCIpKSB7CisJCQl1ZHA2emVyb2NzdW10eCA9IDA7CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJ1ZHA2emVyb2NzdW1yeCIpKSB7CisJCQl1ZHA2emVyb2NzdW1yeCA9IDE7CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJub3VkcDZ6ZXJvY3N1bXJ4IikpIHsKKwkJCXVkcDZ6ZXJvY3N1bXJ4ID0gMDsKKwkJfSBlbHNlIGlmICghbWF0Y2hlcygqYXJndiwgInJlbWNzdW10eCIpKSB7CisJCQlyZW1jc3VtdHggPSAxOworCQl9IGVsc2UgaWYgKCFtYXRjaGVzKCphcmd2LCAibm9yZW1jc3VtdHgiKSkgeworCQkJcmVtY3N1bXR4ID0gMDsKKwkJfSBlbHNlIGlmICghbWF0Y2hlcygqYXJndiwgInJlbWNzdW1yeCIpKSB7CisJCQlyZW1jc3VtcnggPSAxOworCQl9IGVsc2UgaWYgKCFtYXRjaGVzKCphcmd2LCAibm9yZW1jc3VtcngiKSkgeworCQkJcmVtY3N1bXJ4ID0gMDsKKwkJfSBlbHNlIGlmICghbWF0Y2hlcygqYXJndiwgImV4dGVybmFsIikpIHsKKwkJCW1ldGFkYXRhID0gMTsKKwkJfSBlbHNlIGlmICghbWF0Y2hlcygqYXJndiwgIm5vZXh0ZXJuYWwiKSkgeworCQkJbWV0YWRhdGEgPSAwOworCQl9IGVsc2UgaWYgKCFtYXRjaGVzKCphcmd2LCAiZ2JwIikpIHsKKwkJCWdicCA9IDE7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKSB7CisJCQlleHBsYWluKCk7CisJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgInZ4bGFuOiB1bmtub3duIGNvbW1hbmQgXCIlc1wiP1xuIiwgKmFyZ3YpOworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWFyZ2MtLSwgYXJndisrOworCX0KKworCWlmIChtZXRhZGF0YSAmJiB2bmlfc2V0KSB7CisJCWZwcmludGYoc3RkZXJyLCAidnhsYW46IGJvdGggJ2V4dGVybmFsJyBhbmQgdm5pIGNhbm5vdCBiZSBzcGVjaWZpZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKCFtZXRhZGF0YSAmJiAhdm5pX3NldCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInZ4bGFuOiBtaXNzaW5nIHZpcnR1YWwgbmV0d29yayBpZGVudGlmaWVyXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICgoZ2FkZHIgJiYgZGFkZHIpIHx8CisJCShtZW1jbXAoJmdhZGRyNiwgJmluNmFkZHJfYW55LCBzaXplb2YoZ2FkZHI2KSkgJiYKKwkJIG1lbWNtcCgmZGFkZHI2LCAmaW42YWRkcl9hbnksIHNpemVvZihkYWRkcjYpKSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJ2eGxhbjogYm90aCBncm91cCBhbmQgcmVtb3RlIGNhbm5vdCBiZSBzcGVjaWZpZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKCFkc3RfcG9ydF9zZXQpIHsKKwkJZnByaW50ZihzdGRlcnIsICJ2eGxhbjogZGVzdGluYXRpb24gcG9ydCBub3Qgc3BlY2lmaWVkXG4iCisJCQkiV2lsbCB1c2UgTGludXgga2VybmVsIGRlZmF1bHQgKG5vbi1zdGFuZGFyZCB2YWx1ZSlcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJVc2UgJ2RzdHBvcnQgNDc4OScgdG8gZ2V0IHRoZSBJQU5BIGFzc2lnbmVkIHZhbHVlXG4iCisJCQkiVXNlICdkc3Rwb3J0IDAnIHRvIGdldCBkZWZhdWx0IGFuZCBxdWlldCB0aGlzIG1lc3NhZ2VcbiIpOworCX0KKworCWFkZGF0dHIzMihuLCAxMDI0LCBJRkxBX1ZYTEFOX0lELCB2bmkpOworCWlmIChnYWRkcikKKwkJYWRkYXR0cl9sKG4sIDEwMjQsIElGTEFfVlhMQU5fR1JPVVAsICZnYWRkciwgNCk7CisJZWxzZSBpZiAoZGFkZHIpCisJCWFkZGF0dHJfbChuLCAxMDI0LCBJRkxBX1ZYTEFOX0dST1VQLCAmZGFkZHIsIDQpOworCWlmIChtZW1jbXAoJmdhZGRyNiwgJmluNmFkZHJfYW55LCBzaXplb2YoZ2FkZHI2KSkgIT0gMCkKKwkJYWRkYXR0cl9sKG4sIDEwMjQsIElGTEFfVlhMQU5fR1JPVVA2LCAmZ2FkZHI2LCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisJZWxzZSBpZiAobWVtY21wKCZkYWRkcjYsICZpbjZhZGRyX2FueSwgc2l6ZW9mKGRhZGRyNikpICE9IDApCisJCWFkZGF0dHJfbChuLCAxMDI0LCBJRkxBX1ZYTEFOX0dST1VQNiwgJmRhZGRyNiwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCisJaWYgKHNhZGRyKQorCQlhZGRhdHRyX2wobiwgMTAyNCwgSUZMQV9WWExBTl9MT0NBTCwgJnNhZGRyLCA0KTsKKwllbHNlIGlmIChtZW1jbXAoJnNhZGRyNiwgJmluNmFkZHJfYW55LCBzaXplb2Yoc2FkZHI2KSkgIT0gMCkKKwkJYWRkYXR0cl9sKG4sIDEwMjQsIElGTEFfVlhMQU5fTE9DQUw2LCAmc2FkZHI2LCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisKKwlpZiAobGluaykKKwkJYWRkYXR0cjMyKG4sIDEwMjQsIElGTEFfVlhMQU5fTElOSywgbGluayk7CisJYWRkYXR0cjgobiwgMTAyNCwgSUZMQV9WWExBTl9UVEwsIHR0bCk7CisJYWRkYXR0cjgobiwgMTAyNCwgSUZMQV9WWExBTl9UT1MsIHRvcyk7CisJYWRkYXR0cjgobiwgMTAyNCwgSUZMQV9WWExBTl9MRUFSTklORywgbGVhcm5pbmcpOworCWFkZGF0dHI4KG4sIDEwMjQsIElGTEFfVlhMQU5fUFJPWFksIHByb3h5KTsKKwlhZGRhdHRyOChuLCAxMDI0LCBJRkxBX1ZYTEFOX1JTQywgcnNjKTsKKwlhZGRhdHRyOChuLCAxMDI0LCBJRkxBX1ZYTEFOX0wyTUlTUywgbDJtaXNzKTsKKwlhZGRhdHRyOChuLCAxMDI0LCBJRkxBX1ZYTEFOX0wzTUlTUywgbDNtaXNzKTsKKwlhZGRhdHRyOChuLCAxMDI0LCBJRkxBX1ZYTEFOX1VEUF9DU1VNLCB1ZHBjc3VtKTsKKwlhZGRhdHRyOChuLCAxMDI0LCBJRkxBX1ZYTEFOX1VEUF9aRVJPX0NTVU02X1RYLCB1ZHA2emVyb2NzdW10eCk7CisJYWRkYXR0cjgobiwgMTAyNCwgSUZMQV9WWExBTl9VRFBfWkVST19DU1VNNl9SWCwgdWRwNnplcm9jc3VtcngpOworCWFkZGF0dHI4KG4sIDEwMjQsIElGTEFfVlhMQU5fUkVNQ1NVTV9UWCwgcmVtY3N1bXR4KTsKKwlhZGRhdHRyOChuLCAxMDI0LCBJRkxBX1ZYTEFOX1JFTUNTVU1fUlgsIHJlbWNzdW1yeCk7CisJYWRkYXR0cjgobiwgMTAyNCwgSUZMQV9WWExBTl9DT0xMRUNUX01FVEFEQVRBLCBtZXRhZGF0YSk7CisKKwlpZiAobm9hZ2UpCisJCWFkZGF0dHIzMihuLCAxMDI0LCBJRkxBX1ZYTEFOX0FHRUlORywgMCk7CisJZWxzZSBpZiAoYWdlKQorCQlhZGRhdHRyMzIobiwgMTAyNCwgSUZMQV9WWExBTl9BR0VJTkcsIGFnZSk7CisJaWYgKG1heGFkZHIpCisJCWFkZGF0dHIzMihuLCAxMDI0LCBJRkxBX1ZYTEFOX0xJTUlULCBtYXhhZGRyKTsKKwlpZiAocmFuZ2UubG93IHx8IHJhbmdlLmhpZ2gpCisJCWFkZGF0dHJfbChuLCAxMDI0LCBJRkxBX1ZYTEFOX1BPUlRfUkFOR0UsCisJCQkgICZyYW5nZSwgc2l6ZW9mKHJhbmdlKSk7CisJaWYgKGRzdHBvcnQpCisJCWFkZGF0dHIxNihuLCAxMDI0LCBJRkxBX1ZYTEFOX1BPUlQsIGh0b25zKGRzdHBvcnQpKTsKKworCWlmIChnYnApCisJCWFkZGF0dHJfbChuLCAxMDI0LCBJRkxBX1ZYTEFOX0dCUCwgTlVMTCwgMCk7CisKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2eGxhbl9wcmludF9vcHQoc3RydWN0IGxpbmtfdXRpbCAqbHUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKnRiW10pCit7CisJX191MzIgdm5pOworCXVuc2lnbmVkIGxpbms7CisJX191OCB0b3M7CisJX191MzIgbWF4YWRkcjsKKwljaGFyIHMxWzEwMjRdOworCWNoYXIgczJbNjRdOworCisJaWYgKCF0YikKKwkJcmV0dXJuOworCisJaWYgKCF0YltJRkxBX1ZYTEFOX0lEXSB8fAorCSAgICBSVEFfUEFZTE9BRCh0YltJRkxBX1ZYTEFOX0lEXSkgPCBzaXplb2YoX191MzIpKQorCQlyZXR1cm47CisKKwl2bmkgPSBydGFfZ2V0YXR0cl91MzIodGJbSUZMQV9WWExBTl9JRF0pOworCWZwcmludGYoZiwgImlkICV1ICIsIHZuaSk7CisKKwlpZiAodGJbSUZMQV9WWExBTl9HUk9VUF0pIHsKKwkJX19iZTMyIGFkZHIgPSBydGFfZ2V0YXR0cl91MzIodGJbSUZMQV9WWExBTl9HUk9VUF0pOworCQlpZiAoYWRkcikgeworCQkJaWYgKElOX01VTFRJQ0FTVChudG9obChhZGRyKSkpCisJCQkJZnByaW50ZihmLCAiZ3JvdXAgJXMgIiwKKwkJCQkJZm9ybWF0X2hvc3QoQUZfSU5FVCwgNCwgJmFkZHIsIHMxLCBzaXplb2YoczEpKSk7CisJCQllbHNlCisJCQkJZnByaW50ZihmLCAicmVtb3RlICVzICIsCisJCQkJCWZvcm1hdF9ob3N0KEFGX0lORVQsIDQsICZhZGRyLCBzMSwgc2l6ZW9mKHMxKSkpOworCQl9CisJfSBlbHNlIGlmICh0YltJRkxBX1ZYTEFOX0dST1VQNl0pIHsKKwkJc3RydWN0IGluNl9hZGRyIGFkZHI7CisJCW1lbWNweSgmYWRkciwgUlRBX0RBVEEodGJbSUZMQV9WWExBTl9HUk9VUDZdKSwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQlpZiAobWVtY21wKCZhZGRyLCAmaW42YWRkcl9hbnksIHNpemVvZihhZGRyKSkgIT0gMCkgeworCQkJaWYgKElONl9JU19BRERSX01VTFRJQ0FTVCgmYWRkcikpCisJCQkJZnByaW50ZihmLCAiZ3JvdXAgJXMgIiwKKwkJCQkJZm9ybWF0X2hvc3QoQUZfSU5FVDYsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpLCAmYWRkciwgczEsIHNpemVvZihzMSkpKTsKKwkJCWVsc2UKKwkJCQlmcHJpbnRmKGYsICJyZW1vdGUgJXMgIiwKKwkJCQkJZm9ybWF0X2hvc3QoQUZfSU5FVDYsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpLCAmYWRkciwgczEsIHNpemVvZihzMSkpKTsKKwkJfQorCX0KKworCWlmICh0YltJRkxBX1ZYTEFOX0xPQ0FMXSkgeworCQlfX2JlMzIgYWRkciA9IHJ0YV9nZXRhdHRyX3UzMih0YltJRkxBX1ZYTEFOX0xPQ0FMXSk7CisJCWlmIChhZGRyKQorCQkJZnByaW50ZihmLCAibG9jYWwgJXMgIiwKKwkJCQlmb3JtYXRfaG9zdChBRl9JTkVULCA0LCAmYWRkciwgczEsIHNpemVvZihzMSkpKTsKKwl9IGVsc2UgaWYgKHRiW0lGTEFfVlhMQU5fTE9DQUw2XSkgeworCQlzdHJ1Y3QgaW42X2FkZHIgYWRkcjsKKwkJbWVtY3B5KCZhZGRyLCBSVEFfREFUQSh0YltJRkxBX1ZYTEFOX0xPQ0FMNl0pLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisJCWlmIChtZW1jbXAoJmFkZHIsICZpbjZhZGRyX2FueSwgc2l6ZW9mKGFkZHIpKSAhPSAwKQorCQkJZnByaW50ZihmLCAibG9jYWwgJXMgIiwKKwkJCQlmb3JtYXRfaG9zdChBRl9JTkVUNiwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkciksICZhZGRyLCBzMSwgc2l6ZW9mKHMxKSkpOworCX0KKworCWlmICh0YltJRkxBX1ZYTEFOX0xJTktdICYmCisJICAgIChsaW5rID0gcnRhX2dldGF0dHJfdTMyKHRiW0lGTEFfVlhMQU5fTElOS10pKSkgeworCQljb25zdCBjaGFyICpuID0gaWZfaW5kZXh0b25hbWUobGluaywgczIpOworCisJCWlmIChuKQorCQkJZnByaW50ZihmLCAiZGV2ICVzICIsIG4pOworCQllbHNlCisJCQlmcHJpbnRmKGYsICJkZXYgJXUgIiwgbGluayk7CisJfQorCisJaWYgKHRiW0lGTEFfVlhMQU5fUE9SVF9SQU5HRV0pIHsKKwkJY29uc3Qgc3RydWN0IGlmbGFfdnhsYW5fcG9ydF9yYW5nZSAqcgorCQkJPSBSVEFfREFUQSh0YltJRkxBX1ZYTEFOX1BPUlRfUkFOR0VdKTsKKwkJZnByaW50ZihmLCAic3JjcG9ydCAldSAldSAiLCBudG9ocyhyLT5sb3cpLCBudG9ocyhyLT5oaWdoKSk7CisJfQorCisJaWYgKHRiW0lGTEFfVlhMQU5fUE9SVF0pCisJCWZwcmludGYoZiwgImRzdHBvcnQgJXUgIiwKKwkJCW50b2hzKHJ0YV9nZXRhdHRyX3UxNih0YltJRkxBX1ZYTEFOX1BPUlRdKSkpOworCisJaWYgKHRiW0lGTEFfVlhMQU5fTEVBUk5JTkddICYmCisJICAgICFydGFfZ2V0YXR0cl91OCh0YltJRkxBX1ZYTEFOX0xFQVJOSU5HXSkpCisJCWZwdXRzKCJub2xlYXJuaW5nICIsIGYpOworCisJaWYgKHRiW0lGTEFfVlhMQU5fUFJPWFldICYmIHJ0YV9nZXRhdHRyX3U4KHRiW0lGTEFfVlhMQU5fUFJPWFldKSkKKwkJZnB1dHMoInByb3h5ICIsIGYpOworCisJaWYgKHRiW0lGTEFfVlhMQU5fUlNDXSAmJiBydGFfZ2V0YXR0cl91OCh0YltJRkxBX1ZYTEFOX1JTQ10pKQorCQlmcHV0cygicnNjICIsIGYpOworCisJaWYgKHRiW0lGTEFfVlhMQU5fTDJNSVNTXSAmJiBydGFfZ2V0YXR0cl91OCh0YltJRkxBX1ZYTEFOX0wyTUlTU10pKQorCQlmcHV0cygibDJtaXNzICIsIGYpOworCisJaWYgKHRiW0lGTEFfVlhMQU5fTDNNSVNTXSAmJiBydGFfZ2V0YXR0cl91OCh0YltJRkxBX1ZYTEFOX0wzTUlTU10pKQorCQlmcHV0cygibDNtaXNzICIsIGYpOworCisJaWYgKHRiW0lGTEFfVlhMQU5fVE9TXSAmJgorCSAgICAodG9zID0gcnRhX2dldGF0dHJfdTgodGJbSUZMQV9WWExBTl9UT1NdKSkpIHsKKwkJaWYgKHRvcyA9PSAxKQorCQkJZnByaW50ZihmLCAidG9zIGluaGVyaXQgIik7CisJCWVsc2UKKwkJCWZwcmludGYoZiwgInRvcyAlI3ggIiwgdG9zKTsKKwl9CisKKwlpZiAodGJbSUZMQV9WWExBTl9UVExdKSB7CisJCV9fdTggdHRsID0gcnRhX2dldGF0dHJfdTgodGJbSUZMQV9WWExBTl9UVExdKTsKKwkJaWYgKHR0bCkKKwkJCWZwcmludGYoZiwgInR0bCAlZCAiLCB0dGwpOworCX0KKworCWlmICh0YltJRkxBX1ZYTEFOX0FHRUlOR10pIHsKKwkJX191MzIgYWdlID0gcnRhX2dldGF0dHJfdTMyKHRiW0lGTEFfVlhMQU5fQUdFSU5HXSk7CisJCWlmIChhZ2UgPT0gMCkKKwkJCWZwcmludGYoZiwgImFnZWluZyBub25lICIpOworCQllbHNlCisJCQlmcHJpbnRmKGYsICJhZ2VpbmcgJXUgIiwgYWdlKTsKKwl9CisKKwlpZiAodGJbSUZMQV9WWExBTl9MSU1JVF0gJiYKKwkgICAgKChtYXhhZGRyID0gcnRhX2dldGF0dHJfdTMyKHRiW0lGTEFfVlhMQU5fTElNSVRdKSkgIT0gMCkpCisJCSAgICBmcHJpbnRmKGYsICJtYXhhZGRyICV1ICIsIG1heGFkZHIpOworCisJaWYgKHRiW0lGTEFfVlhMQU5fVURQX0NTVU1dICYmIHJ0YV9nZXRhdHRyX3U4KHRiW0lGTEFfVlhMQU5fVURQX0NTVU1dKSkKKwkJZnB1dHMoInVkcGNzdW0gIiwgZik7CisKKwlpZiAodGJbSUZMQV9WWExBTl9VRFBfWkVST19DU1VNNl9UWF0gJiYKKwkgICAgcnRhX2dldGF0dHJfdTgodGJbSUZMQV9WWExBTl9VRFBfWkVST19DU1VNNl9UWF0pKQorCQlmcHV0cygidWRwNnplcm9jc3VtdHggIiwgZik7CisKKwlpZiAodGJbSUZMQV9WWExBTl9VRFBfWkVST19DU1VNNl9SWF0gJiYKKwkgICAgcnRhX2dldGF0dHJfdTgodGJbSUZMQV9WWExBTl9VRFBfWkVST19DU1VNNl9SWF0pKQorCQlmcHV0cygidWRwNnplcm9jc3VtcnggIiwgZik7CisKKwlpZiAodGJbSUZMQV9WWExBTl9SRU1DU1VNX1RYXSAmJgorCSAgICBydGFfZ2V0YXR0cl91OCh0YltJRkxBX1ZYTEFOX1JFTUNTVU1fVFhdKSkKKwkJZnB1dHMoInJlbWNzdW10eCAiLCBmKTsKKworCWlmICh0YltJRkxBX1ZYTEFOX1JFTUNTVU1fUlhdICYmCisJICAgIHJ0YV9nZXRhdHRyX3U4KHRiW0lGTEFfVlhMQU5fUkVNQ1NVTV9SWF0pKQorCQlmcHV0cygicmVtY3N1bXJ4ICIsIGYpOworCisJaWYgKHRiW0lGTEFfVlhMQU5fQ09MTEVDVF9NRVRBREFUQV0gJiYKKwkgICAgcnRhX2dldGF0dHJfdTgodGJbSUZMQV9WWExBTl9DT0xMRUNUX01FVEFEQVRBXSkpCisJCWZwdXRzKCJleHRlcm5hbCAiLCBmKTsKKworCWlmICh0YltJRkxBX1ZYTEFOX0dCUF0pCisJCWZwdXRzKCJnYnAgIiwgZik7Cit9CisKK3N0YXRpYyB2b2lkIHZ4bGFuX3ByaW50X2hlbHAoc3RydWN0IGxpbmtfdXRpbCAqbHUsIGludCBhcmdjLCBjaGFyICoqYXJndiwKKwlGSUxFICpmKQoreworCXByaW50X2V4cGxhaW4oZik7Cit9CisKK3N0cnVjdCBsaW5rX3V0aWwgdnhsYW5fbGlua191dGlsID0geworCS5pZAkJPSAidnhsYW4iLAorCS5tYXhhdHRyCT0gSUZMQV9WWExBTl9NQVgsCisJLnBhcnNlX29wdAk9IHZ4bGFuX3BhcnNlX29wdCwKKwkucHJpbnRfb3B0CT0gdnhsYW5fcHJpbnRfb3B0LAorCS5wcmludF9oZWxwCT0gdnhsYW5fcHJpbnRfaGVscCwKK307CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pcC9pcG1hZGRyLmMgYi9pcHJvdXRlMi9pcC9pcG1hZGRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JkNmQxMQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2lwL2lwbWFkZHIuYwpAQCAtMCwwICsxLDM0OCBAQAorLyoKKyAqIGlwbWFkZHIuYwkJImlwIG1hZGRyZXNzIi4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorCisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgImlwX2NvbW1vbi5oIgorCitzdGF0aWMgc3RydWN0IHsKKwljaGFyICpkZXY7CisJaW50ICBmYW1pbHk7Cit9IGZpbHRlcjsKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBpcCBtYWRkciBbIGFkZCB8IGRlbCBdIE1VTFRJQUREUiBkZXYgU1RSSU5HXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBpcCBtYWRkciBzaG93IFsgZGV2IFNUUklORyBdXG4iKTsKKwlleGl0KC0xKTsKK30KKworc3RhdGljIGludCBwYXJzZV9oZXgoY2hhciAqc3RyLCB1bnNpZ25lZCBjaGFyICphZGRyLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgbGVuID0gMDsKKworCXdoaWxlICgqc3RyICYmIChsZW4gPCAyICogc2l6ZSkpIHsKKwkJaW50IHRtcDsKKwkJaWYgKHN0clsxXSA9PSAwKQorCQkJcmV0dXJuIC0xOworCQlpZiAoc3NjYW5mKHN0ciwgIiUwMngiLCAmdG1wKSAhPSAxKQorCQkJcmV0dXJuIC0xOworCQlhZGRyW2xlbl0gPSB0bXA7CisJCWxlbisrOworCQlzdHIgKz0gMjsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworc3RydWN0IG1hX2luZm8KK3sKKwlzdHJ1Y3QgbWFfaW5mbyAqbmV4dDsKKwlpbnQJCWluZGV4OworCWludAkJdXNlcnM7CisJY2hhcgkJKmZlYXR1cmVzOworCWNoYXIJCW5hbWVbSUZOQU1TSVpdOworCWluZXRfcHJlZml4CWFkZHI7Cit9OworCitzdGF0aWMgdm9pZCBtYWRkcl9pbnMoc3RydWN0IG1hX2luZm8gKipsc3QsIHN0cnVjdCBtYV9pbmZvICptKQoreworCXN0cnVjdCBtYV9pbmZvICptcDsKKworCWZvciAoOyAobXAgPSAqbHN0KSAhPSBOVUxMOyBsc3QgPSAmbXAtPm5leHQpIHsKKwkJaWYgKG1wLT5pbmRleCA+IG0tPmluZGV4KQorCQkJYnJlYWs7CisJfQorCW0tPm5leHQgPSAqbHN0OworCSpsc3QgPSBtOworfQorCitzdGF0aWMgdm9pZCByZWFkX2Rldl9tY2FzdChzdHJ1Y3QgbWFfaW5mbyAqKnJlc3VsdF9wKQoreworCWNoYXIgYnVmWzI1Nl07CisJRklMRSAqZnAgPSBmb3BlbigiL3Byb2MvbmV0L2Rldl9tY2FzdCIsICJyIik7CisKKwlpZiAoIWZwKQorCQlyZXR1cm47CisKKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApKSB7CisJCWNoYXIgaGV4YVsyNTZdOworCQlzdHJ1Y3QgbWFfaW5mbyBtOworCQlpbnQgbGVuOworCQlpbnQgc3Q7CisKKwkJbWVtc2V0KCZtLCAwLCBzaXplb2YobSkpOworCQlzc2NhbmYoYnVmLCAiJWQlcyVkJWQlcyIsICZtLmluZGV4LCBtLm5hbWUsICZtLnVzZXJzLCAmc3QsCisJCSAgICAgICBoZXhhKTsKKwkJaWYgKGZpbHRlci5kZXYgJiYgc3RyY21wKGZpbHRlci5kZXYsIG0ubmFtZSkpCisJCQljb250aW51ZTsKKworCQltLmFkZHIuZmFtaWx5ID0gQUZfUEFDS0VUOworCisJCWxlbiA9IHBhcnNlX2hleChoZXhhLCAodW5zaWduZWQgY2hhciopJm0uYWRkci5kYXRhLCBzaXplb2YgKG0uYWRkci5kYXRhKSk7CisJCWlmIChsZW4gPj0gMCkgeworCQkJc3RydWN0IG1hX2luZm8gKm1hID0gbWFsbG9jKHNpemVvZihtKSk7CisKKwkJCW1lbWNweShtYSwgJm0sIHNpemVvZihtKSk7CisJCQltYS0+YWRkci5ieXRlbGVuID0gbGVuOworCQkJbWEtPmFkZHIuYml0bGVuID0gbGVuPDwzOworCQkJaWYgKHN0KQorCQkJCW1hLT5mZWF0dXJlcyA9ICJzdGF0aWMiOworCQkJbWFkZHJfaW5zKHJlc3VsdF9wLCBtYSk7CisJCX0KKwl9CisJZmNsb3NlKGZwKTsKK30KKworc3RhdGljIHZvaWQgcmVhZF9pZ21wKHN0cnVjdCBtYV9pbmZvICoqcmVzdWx0X3ApCit7CisJc3RydWN0IG1hX2luZm8gbTsKKwljaGFyIGJ1ZlsyNTZdOworCUZJTEUgKmZwID0gZm9wZW4oIi9wcm9jL25ldC9pZ21wIiwgInIiKTsKKworCWlmICghZnApCisJCXJldHVybjsKKwltZW1zZXQoJm0sIDAsIHNpemVvZihtKSk7CisJaWYgKCFmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkpIHsKKwkJZmNsb3NlKGZwKTsKKwkJcmV0dXJuOworCX0KKworCW0uYWRkci5mYW1pbHkgPSBBRl9JTkVUOworCW0uYWRkci5iaXRsZW4gPSAzMjsKKwltLmFkZHIuYnl0ZWxlbiA9IDQ7CisKKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApKSB7CisJCXN0cnVjdCBtYV9pbmZvICptYTsKKworCQlpZiAoYnVmWzBdICE9ICdcdCcpIHsKKwkJCXNzY2FuZihidWYsICIlZCVzIiwgJm0uaW5kZXgsIG0ubmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChmaWx0ZXIuZGV2ICYmIHN0cmNtcChmaWx0ZXIuZGV2LCBtLm5hbWUpKQorCQkJY29udGludWU7CisKKwkJc3NjYW5mKGJ1ZiwgIiUwOHglZCIsIChfX3UzMiopJm0uYWRkci5kYXRhLCAmbS51c2Vycyk7CisKKwkJbWEgPSBtYWxsb2Moc2l6ZW9mKG0pKTsKKwkJbWVtY3B5KG1hLCAmbSwgc2l6ZW9mKG0pKTsKKwkJbWFkZHJfaW5zKHJlc3VsdF9wLCBtYSk7CisJfQorCWZjbG9zZShmcCk7Cit9CisKKworc3RhdGljIHZvaWQgcmVhZF9pZ21wNihzdHJ1Y3QgbWFfaW5mbyAqKnJlc3VsdF9wKQoreworCWNoYXIgYnVmWzI1Nl07CisJRklMRSAqZnAgPSBmb3BlbigiL3Byb2MvbmV0L2lnbXA2IiwgInIiKTsKKworCWlmICghZnApCisJCXJldHVybjsKKworCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkpIHsKKwkJY2hhciBoZXhhWzI1Nl07CisJCXN0cnVjdCBtYV9pbmZvIG07CisJCWludCBsZW47CisKKwkJbWVtc2V0KCZtLCAwLCBzaXplb2YobSkpOworCQlzc2NhbmYoYnVmLCAiJWQlcyVzJWQiLCAmbS5pbmRleCwgbS5uYW1lLCBoZXhhLCAmbS51c2Vycyk7CisKKwkJaWYgKGZpbHRlci5kZXYgJiYgc3RyY21wKGZpbHRlci5kZXYsIG0ubmFtZSkpCisJCQljb250aW51ZTsKKworCQltLmFkZHIuZmFtaWx5ID0gQUZfSU5FVDY7CisKKwkJbGVuID0gcGFyc2VfaGV4KGhleGEsICh1bnNpZ25lZCBjaGFyKikmbS5hZGRyLmRhdGEsIHNpemVvZiAobS5hZGRyLmRhdGEpKTsKKwkJaWYgKGxlbiA+PSAwKSB7CisJCQlzdHJ1Y3QgbWFfaW5mbyAqbWEgPSBtYWxsb2Moc2l6ZW9mKG0pKTsKKworCQkJbWVtY3B5KG1hLCAmbSwgc2l6ZW9mKG0pKTsKKworCQkJbWEtPmFkZHIuYnl0ZWxlbiA9IGxlbjsKKwkJCW1hLT5hZGRyLmJpdGxlbiA9IGxlbjw8MzsKKwkJCW1hZGRyX2lucyhyZXN1bHRfcCwgbWEpOworCQl9CisJfQorCWZjbG9zZShmcCk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X21hZGRyKEZJTEUgKmZwLCBzdHJ1Y3QgbWFfaW5mbyAqbGlzdCkKK3sKKwlmcHJpbnRmKGZwLCAiXHQiKTsKKworCWlmIChsaXN0LT5hZGRyLmZhbWlseSA9PSBBRl9QQUNLRVQpIHsKKwkJU1BSSU5UX0JVRihiMSk7CisJCWZwcmludGYoZnAsICJsaW5rICAlcyIsIGxsX2FkZHJfbjJhKCh1bnNpZ25lZCBjaGFyKilsaXN0LT5hZGRyLmRhdGEsCisJCQkJCQkgICAgbGlzdC0+YWRkci5ieXRlbGVuLCAwLAorCQkJCQkJICAgIGIxLCBzaXplb2YoYjEpKSk7CisJfSBlbHNlIHsKKwkJY2hhciBhYnVmWzI1Nl07CisJCXN3aXRjaChsaXN0LT5hZGRyLmZhbWlseSkgeworCQljYXNlIEFGX0lORVQ6CisJCQlmcHJpbnRmKGZwLCAiaW5ldCAgIik7CisJCQlicmVhazsKKwkJY2FzZSBBRl9JTkVUNjoKKwkJCWZwcmludGYoZnAsICJpbmV0NiAiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZnByaW50ZihmcCwgImZhbWlseSAlZCAiLCBsaXN0LT5hZGRyLmZhbWlseSk7CisJCQlicmVhazsKKwkJfQorCQlmcHJpbnRmKGZwLCAiJXMiLAorCQkJZm9ybWF0X2hvc3QobGlzdC0+YWRkci5mYW1pbHksCisJCQkJICAgIC0xLAorCQkJCSAgICBsaXN0LT5hZGRyLmRhdGEsCisJCQkJICAgIGFidWYsIHNpemVvZihhYnVmKSkpOworCX0KKwlpZiAobGlzdC0+dXNlcnMgIT0gMSkKKwkJZnByaW50ZihmcCwgIiB1c2VycyAlZCIsIGxpc3QtPnVzZXJzKTsKKwlpZiAobGlzdC0+ZmVhdHVyZXMpCisJCWZwcmludGYoZnAsICIgJXMiLCBsaXN0LT5mZWF0dXJlcyk7CisJZnByaW50ZihmcCwgIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X21saXN0KEZJTEUgKmZwLCBzdHJ1Y3QgbWFfaW5mbyAqbGlzdCkKK3sKKwlpbnQgY3VyX2luZGV4ID0gMDsKKworCWZvciAoOyBsaXN0OyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQlpZiAob25lbGluZSkgeworCQkJY3VyX2luZGV4ID0gbGlzdC0+aW5kZXg7CisJCQlmcHJpbnRmKGZwLCAiJWQ6XHQlcyVzIiwgY3VyX2luZGV4LCBsaXN0LT5uYW1lLCBfU0xfKTsKKwkJfSBlbHNlIGlmIChjdXJfaW5kZXggIT0gbGlzdC0+aW5kZXgpIHsKKwkJCWN1cl9pbmRleCA9IGxpc3QtPmluZGV4OworCQkJZnByaW50ZihmcCwgIiVkOlx0JXNcbiIsIGN1cl9pbmRleCwgbGlzdC0+bmFtZSk7CisJCX0KKwkJcHJpbnRfbWFkZHIoZnAsIGxpc3QpOworCX0KK30KKworc3RhdGljIGludCBtdWx0aWFkZHJfbGlzdChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IG1hX2luZm8gKmxpc3QgPSBOVUxMOworCisJaWYgKCFmaWx0ZXIuZmFtaWx5KQorCQlmaWx0ZXIuZmFtaWx5ID0gcHJlZmVycmVkX2ZhbWlseTsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAoMSkgeworCQkJaWYgKHN0cmNtcCgqYXJndiwgImRldiIpID09IDApIHsKKwkJCQlORVhUX0FSRygpOworCQkJfQorCQkJZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKQorCQkJCXVzYWdlKCk7CisJCQlpZiAoZmlsdGVyLmRldikKKwkJCQlkdXBhcmcyKCJkZXYiLCAqYXJndik7CisJCQlmaWx0ZXIuZGV2ID0gKmFyZ3Y7CisJCX0KKwkJYXJndisrOyBhcmdjLS07CisJfQorCisJaWYgKCFmaWx0ZXIuZmFtaWx5IHx8IGZpbHRlci5mYW1pbHkgPT0gQUZfUEFDS0VUKQorCQlyZWFkX2Rldl9tY2FzdCgmbGlzdCk7CisJaWYgKCFmaWx0ZXIuZmFtaWx5IHx8IGZpbHRlci5mYW1pbHkgPT0gQUZfSU5FVCkKKwkJcmVhZF9pZ21wKCZsaXN0KTsKKwlpZiAoIWZpbHRlci5mYW1pbHkgfHwgZmlsdGVyLmZhbWlseSA9PSBBRl9JTkVUNikKKwkJcmVhZF9pZ21wNigmbGlzdCk7CisJcHJpbnRfbWxpc3Qoc3Rkb3V0LCBsaXN0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdWx0aWFkZHJfbW9kaWZ5KGludCBjbWQsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWludCBmZDsKKworCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisKKwlpZiAoY21kID09IFJUTV9ORVdBRERSKQorCQljbWQgPSBTSU9DQURETVVMVEk7CisJZWxzZQorCQljbWQgPSBTSU9DREVMTVVMVEk7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgImRldiIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoaWZyLmlmcl9uYW1lWzBdKQorCQkJCWR1cGFyZygiZGV2IiwgKmFyZ3YpOworCQkJc3RybmNweShpZnIuaWZyX25hbWUsICphcmd2LCBJRk5BTVNJWik7CisJCX0gZWxzZSB7CisJCQlpZiAobWF0Y2hlcygqYXJndiwgImFkZHJlc3MiKSA9PSAwKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCX0KKwkJCWlmIChtYXRjaGVzKCphcmd2LCAiaGVscCIpID09IDApCisJCQkJdXNhZ2UoKTsKKwkJCWlmIChpZnIuaWZyX2h3YWRkci5zYV9kYXRhWzBdKQorCQkJCWR1cGFyZygiYWRkcmVzcyIsICphcmd2KTsKKwkJCWlmIChsbF9hZGRyX2EybihpZnIuaWZyX2h3YWRkci5zYV9kYXRhLAorCQkJCQkxNCwgKmFyZ3YpIDwgMCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiRXJyb3I6IFwiJXNcIiBpcyBub3QgYSBsZWdhbCBsbCBhZGRyZXNzLlxuIiwgKmFyZ3YpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCX0KKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCWlmIChpZnIuaWZyX25hbWVbMF0gPT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vdCBlbm91Z2ggaW5mb3JtYXRpb246IFwiZGV2XCIgaXMgcmVxdWlyZWQuXG4iKTsKKwkJZXhpdCgtMSk7CisJfQorCisJZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJaWYgKGZkIDwgMCkgeworCQlwZXJyb3IoIkNhbm5vdCBjcmVhdGUgc29ja2V0Iik7CisJCWV4aXQoMSk7CisJfQorCWlmIChpb2N0bChmZCwgY21kLCAoY2hhciopJmlmcikgIT0gMCkgeworCQlwZXJyb3IoImlvY3RsIik7CisJCWV4aXQoMSk7CisJfQorCWNsb3NlKGZkKTsKKworCWV4aXQoMCk7Cit9CisKKworaW50IGRvX211bHRpYWRkcihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaWYgKGFyZ2MgPCAxKQorCQlyZXR1cm4gbXVsdGlhZGRyX2xpc3QoMCwgTlVMTCk7CisJaWYgKG1hdGNoZXMoKmFyZ3YsICJhZGQiKSA9PSAwKQorCQlyZXR1cm4gbXVsdGlhZGRyX21vZGlmeShSVE1fTkVXQUREUiwgYXJnYy0xLCBhcmd2KzEpOworCWlmIChtYXRjaGVzKCphcmd2LCAiZGVsZXRlIikgPT0gMCkKKwkJcmV0dXJuIG11bHRpYWRkcl9tb2RpZnkoUlRNX0RFTEFERFIsIGFyZ2MtMSwgYXJndisxKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgImxpc3QiKSA9PSAwIHx8IG1hdGNoZXMoKmFyZ3YsICJzaG93IikgPT0gMAorCSAgICB8fCBtYXRjaGVzKCphcmd2LCAibHN0IikgPT0gMCkKKwkJcmV0dXJuIG11bHRpYWRkcl9saXN0KGFyZ2MtMSwgYXJndisxKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKQorCQl1c2FnZSgpOworCWZwcmludGYoc3RkZXJyLCAiQ29tbWFuZCBcIiVzXCIgaXMgdW5rbm93biwgdHJ5IFwiaXAgbWFkZHIgaGVscFwiLlxuIiwgKmFyZ3YpOworCWV4aXQoLTEpOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaXAvaXBtb25pdG9yLmMgYi9pcHJvdXRlMi9pcC9pcG1vbml0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWEyMzdmCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaXAvaXBtb25pdG9yLmMKQEAgLTAsMCArMSwzMTEgQEAKKy8qCisgKiBpcG1vbml0b3IuYwkJImlwIG1vbml0b3IiLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiaXBfY29tbW9uLmgiCisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CitpbnQgcHJlZml4X2Jhbm5lcjsKK2ludCBsaXN0ZW5fYWxsX25zaWQ7CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogaXAgbW9uaXRvciBbIGFsbCB8IExJU1RvZk9CSkVDVFMgXSBbIEZJTEUgXSAiCisJCQkiWyBsYWJlbCBdIFthbGwtbnNpZF0gW2RldiBERVZJQ0VdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIkxJU1RvZk9CSkVDVFMgOj0gbGluayB8IGFkZHJlc3MgfCByb3V0ZSB8IG1yb3V0ZSB8IHByZWZpeCB8XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICAgbmVpZ2ggfCBuZXRjb25mIHwgcnVsZSB8IG5zaWRcbiIpOworCWZwcmludGYoc3RkZXJyLCAiRklMRSA6PSBmaWxlIEZJTEVOQU1FXG4iKTsKKwlleGl0KC0xKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfaGVhZGVycyhGSUxFICpmcCwgY2hhciAqbGFiZWwsIHN0cnVjdCBydG5sX2N0cmxfZGF0YSAqY3RybCkKK3sKKwlpZiAodGltZXN0YW1wKQorCQlwcmludF90aW1lc3RhbXAoZnApOworCisJaWYgKGxpc3Rlbl9hbGxfbnNpZCkgeworCQlpZiAoY3RybCA9PSBOVUxMIHx8IGN0cmwtPm5zaWQgPCAwKQorCQkJZnByaW50ZihmcCwgIltuc2lkIGN1cnJlbnRdIik7CisJCWVsc2UKKwkJCWZwcmludGYoZnAsICJbbnNpZCAlZF0iLCBjdHJsLT5uc2lkKTsKKwl9CisKKwlpZiAocHJlZml4X2Jhbm5lcikKKwkJZnByaW50ZihmcCwgIiVzIiwgbGFiZWwpOworfQorCitzdGF0aWMgaW50IGFjY2VwdF9tc2coY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8sCisJCSAgICAgIHN0cnVjdCBydG5sX2N0cmxfZGF0YSAqY3RybCwKKwkJICAgICAgc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcpCit7CisJRklMRSAqZnAgPSAoRklMRSopYXJnOworCisJaWYgKG4tPm5sbXNnX3R5cGUgPT0gUlRNX05FV1JPVVRFIHx8IG4tPm5sbXNnX3R5cGUgPT0gUlRNX0RFTFJPVVRFKSB7CisJCXN0cnVjdCBydG1zZyAqciA9IE5MTVNHX0RBVEEobik7CisJCWludCBsZW4gPSBuLT5ubG1zZ19sZW4gLSBOTE1TR19MRU5HVEgoc2l6ZW9mKCpyKSk7CisKKwkJaWYgKGxlbiA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQlVHOiB3cm9uZyBubG1zZyBsZW4gJWRcbiIsIGxlbik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAoci0+cnRtX2ZsYWdzICYgUlRNX0ZfQ0xPTkVEKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKHItPnJ0bV9mYW1pbHkgPT0gUlROTF9GQU1JTFlfSVBNUiB8fAorCQkgICAgci0+cnRtX2ZhbWlseSA9PSBSVE5MX0ZBTUlMWV9JUDZNUikgeworCQkJcHJpbnRfaGVhZGVycyhmcCwgIltNUk9VVEVdIiwgY3RybCk7CisJCQlwcmludF9tcm91dGUod2hvLCBuLCBhcmcpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlwcmludF9oZWFkZXJzKGZwLCAiW1JPVVRFXSIsIGN0cmwpOworCQkJcHJpbnRfcm91dGUod2hvLCBuLCBhcmcpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAobi0+bmxtc2dfdHlwZSA9PSBSVE1fTkVXTElOSyB8fCBuLT5ubG1zZ190eXBlID09IFJUTV9ERUxMSU5LKSB7CisJCWxsX3JlbWVtYmVyX2luZGV4KHdobywgbiwgTlVMTCk7CisJCXByaW50X2hlYWRlcnMoZnAsICJbTElOS10iLCBjdHJsKTsKKwkJcHJpbnRfbGlua2luZm8od2hvLCBuLCBhcmcpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKG4tPm5sbXNnX3R5cGUgPT0gUlRNX05FV0FERFIgfHwgbi0+bmxtc2dfdHlwZSA9PSBSVE1fREVMQUREUikgeworCQlwcmludF9oZWFkZXJzKGZwLCAiW0FERFJdIiwgY3RybCk7CisJCXByaW50X2FkZHJpbmZvKHdobywgbiwgYXJnKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChuLT5ubG1zZ190eXBlID09IFJUTV9ORVdBRERSTEFCRUwgfHwgbi0+bmxtc2dfdHlwZSA9PSBSVE1fREVMQUREUkxBQkVMKSB7CisJCXByaW50X2hlYWRlcnMoZnAsICJbQUREUkxBQkVMXSIsIGN0cmwpOworCQlwcmludF9hZGRybGFiZWwod2hvLCBuLCBhcmcpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKG4tPm5sbXNnX3R5cGUgPT0gUlRNX05FV05FSUdIIHx8IG4tPm5sbXNnX3R5cGUgPT0gUlRNX0RFTE5FSUdIIHx8CisJICAgIG4tPm5sbXNnX3R5cGUgPT0gUlRNX0dFVE5FSUdIKSB7CisJCWlmIChwcmVmZXJyZWRfZmFtaWx5KSB7CisJCQlzdHJ1Y3QgbmRtc2cgKnIgPSBOTE1TR19EQVRBKG4pOworCisJCQlpZiAoci0+bmRtX2ZhbWlseSAhPSBwcmVmZXJyZWRfZmFtaWx5KQorCQkJCXJldHVybiAwOworCQl9CisKKwkJcHJpbnRfaGVhZGVycyhmcCwgIltORUlHSF0iLCBjdHJsKTsKKwkJcHJpbnRfbmVpZ2god2hvLCBuLCBhcmcpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKG4tPm5sbXNnX3R5cGUgPT0gUlRNX05FV1BSRUZJWCkgeworCQlwcmludF9oZWFkZXJzKGZwLCAiW1BSRUZJWF0iLCBjdHJsKTsKKwkJcHJpbnRfcHJlZml4KHdobywgbiwgYXJnKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChuLT5ubG1zZ190eXBlID09IFJUTV9ORVdSVUxFIHx8IG4tPm5sbXNnX3R5cGUgPT0gUlRNX0RFTFJVTEUpIHsKKwkJcHJpbnRfaGVhZGVycyhmcCwgIltSVUxFXSIsIGN0cmwpOworCQlwcmludF9ydWxlKHdobywgbiwgYXJnKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChuLT5ubG1zZ190eXBlID09IFJUTV9ORVdORVRDT05GKSB7CisJCXByaW50X2hlYWRlcnMoZnAsICJbTkVUQ09ORl0iLCBjdHJsKTsKKwkJcHJpbnRfbmV0Y29uZih3aG8sIGN0cmwsIG4sIGFyZyk7CisJCXJldHVybiAwOworCX0KKwlpZiAobi0+bmxtc2dfdHlwZSA9PSBOTE1TR19UU1RBTVApIHsKKwkJcHJpbnRfbmxtc2dfdGltZXN0YW1wKGZwLCBuKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChuLT5ubG1zZ190eXBlID09IFJUTV9ORVdOU0lEIHx8IG4tPm5sbXNnX3R5cGUgPT0gUlRNX0RFTE5TSUQpIHsKKwkJcHJpbnRfaGVhZGVycyhmcCwgIltOU0lEXSIsIGN0cmwpOworCQlwcmludF9uc2lkKHdobywgbiwgYXJnKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChuLT5ubG1zZ190eXBlICE9IE5MTVNHX0VSUk9SICYmIG4tPm5sbXNnX3R5cGUgIT0gTkxNU0dfTk9PUCAmJgorCSAgICBuLT5ubG1zZ190eXBlICE9IE5MTVNHX0RPTkUpIHsKKwkJZnByaW50ZihmcCwgIlVua25vd24gbWVzc2FnZTogdHlwZT0weCUwOHgoJWQpIGZsYWdzPTB4JTA4eCglZCkiCisJCQkibGVuPTB4JTA4eCglZClcbiIsIG4tPm5sbXNnX3R5cGUsIG4tPm5sbXNnX3R5cGUsCisJCQluLT5ubG1zZ19mbGFncywgbi0+bmxtc2dfZmxhZ3MsIG4tPm5sbXNnX2xlbiwKKwkJCW4tPm5sbXNnX2xlbik7CisJfQorCXJldHVybiAwOworfQorCitpbnQgZG9faXBtb25pdG9yKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpmaWxlID0gTlVMTDsKKwl1bnNpZ25lZCBncm91cHMgPSAwOworCWludCBsbGluaz0wOworCWludCBsYWRkcj0wOworCWludCBscm91dGU9MDsKKwlpbnQgbG1yb3V0ZT0wOworCWludCBscHJlZml4PTA7CisJaW50IGxuZWlnaD0wOworCWludCBsbmV0Y29uZj0wOworCWludCBscnVsZT0wOworCWludCBsbnNpZD0wOworCWludCBpZmluZGV4PTA7CisKKwlncm91cHMgfD0gbmxfbWdycChSVE5MR1JQX0xJTkspOworCWdyb3VwcyB8PSBubF9tZ3JwKFJUTkxHUlBfSVBWNF9JRkFERFIpOworCWdyb3VwcyB8PSBubF9tZ3JwKFJUTkxHUlBfSVBWNl9JRkFERFIpOworCWdyb3VwcyB8PSBubF9tZ3JwKFJUTkxHUlBfSVBWNF9ST1VURSk7CisJZ3JvdXBzIHw9IG5sX21ncnAoUlROTEdSUF9JUFY2X1JPVVRFKTsKKwlncm91cHMgfD0gbmxfbWdycChSVE5MR1JQX01QTFNfUk9VVEUpOworCWdyb3VwcyB8PSBubF9tZ3JwKFJUTkxHUlBfSVBWNF9NUk9VVEUpOworCWdyb3VwcyB8PSBubF9tZ3JwKFJUTkxHUlBfSVBWNl9NUk9VVEUpOworCWdyb3VwcyB8PSBubF9tZ3JwKFJUTkxHUlBfSVBWNl9QUkVGSVgpOworCWdyb3VwcyB8PSBubF9tZ3JwKFJUTkxHUlBfTkVJR0gpOworCWdyb3VwcyB8PSBubF9tZ3JwKFJUTkxHUlBfSVBWNF9ORVRDT05GKTsKKwlncm91cHMgfD0gbmxfbWdycChSVE5MR1JQX0lQVjZfTkVUQ09ORik7CisJZ3JvdXBzIHw9IG5sX21ncnAoUlROTEdSUF9JUFY0X1JVTEUpOworCWdyb3VwcyB8PSBubF9tZ3JwKFJUTkxHUlBfSVBWNl9SVUxFKTsKKwlncm91cHMgfD0gbmxfbWdycChSVE5MR1JQX05TSUQpOworCisJcnRubF9jbG9zZSgmcnRoKTsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAobWF0Y2hlcygqYXJndiwgImZpbGUiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJZmlsZSA9ICphcmd2OworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJsYWJlbCIpID09IDApIHsKKwkJCXByZWZpeF9iYW5uZXIgPSAxOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJhbGwtbnNpZCIpID09IDApIHsKKwkJCWxpc3Rlbl9hbGxfbnNpZCA9IDE7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImxpbmsiKSA9PSAwKSB7CisJCQlsbGluaz0xOworCQkJZ3JvdXBzID0gMDsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiYWRkcmVzcyIpID09IDApIHsKKwkJCWxhZGRyPTE7CisJCQlncm91cHMgPSAwOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJyb3V0ZSIpID09IDApIHsKKwkJCWxyb3V0ZT0xOworCQkJZ3JvdXBzID0gMDsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAibXJvdXRlIikgPT0gMCkgeworCQkJbG1yb3V0ZT0xOworCQkJZ3JvdXBzID0gMDsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAicHJlZml4IikgPT0gMCkgeworCQkJbHByZWZpeD0xOworCQkJZ3JvdXBzID0gMDsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAibmVpZ2giKSA9PSAwKSB7CisJCQlsbmVpZ2ggPSAxOworCQkJZ3JvdXBzID0gMDsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAibmV0Y29uZiIpID09IDApIHsKKwkJCWxuZXRjb25mID0gMTsKKwkJCWdyb3VwcyA9IDA7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInJ1bGUiKSA9PSAwKSB7CisJCQlscnVsZSA9IDE7CisJCQlncm91cHMgPSAwOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJuc2lkIikgPT0gMCkgeworCQkJbG5zaWQgPSAxOworCQkJZ3JvdXBzID0gMDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJhbGwiKSA9PSAwKSB7CisJCQlwcmVmaXhfYmFubmVyPTE7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKSB7CisJCQl1c2FnZSgpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImRldiIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisKKwkJCWlmaW5kZXggPSBsbF9uYW1lX3RvX2luZGV4KCphcmd2KTsKKwkJCWlmICghaWZpbmRleCkKKwkJCQlpbnZhcmcoIkRldmljZSBkb2VzIG5vdCBleGlzdFxuIiwgKmFyZ3YpOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJBcmd1bWVudCBcIiVzXCIgaXMgdW5rbm93biwgdHJ5IFwiaXAgbW9uaXRvciBoZWxwXCIuXG4iLCAqYXJndik7CisJCQlleGl0KC0xKTsKKwkJfQorCQlhcmdjLS07CWFyZ3YrKzsKKwl9CisKKwlpcGFkZHJfcmVzZXRfZmlsdGVyKDEsIGlmaW5kZXgpOworCWlwcm91dGVfcmVzZXRfZmlsdGVyKGlmaW5kZXgpOworCWlwbXJvdXRlX3Jlc2V0X2ZpbHRlcihpZmluZGV4KTsKKwlpcG5laWdoX3Jlc2V0X2ZpbHRlcihpZmluZGV4KTsKKwlpcG5ldGNvbmZfcmVzZXRfZmlsdGVyKGlmaW5kZXgpOworCisJaWYgKGxsaW5rKQorCQlncm91cHMgfD0gbmxfbWdycChSVE5MR1JQX0xJTkspOworCWlmIChsYWRkcikgeworCQlpZiAoIXByZWZlcnJlZF9mYW1pbHkgfHwgcHJlZmVycmVkX2ZhbWlseSA9PSBBRl9JTkVUKQorCQkJZ3JvdXBzIHw9IG5sX21ncnAoUlROTEdSUF9JUFY0X0lGQUREUik7CisJCWlmICghcHJlZmVycmVkX2ZhbWlseSB8fCBwcmVmZXJyZWRfZmFtaWx5ID09IEFGX0lORVQ2KQorCQkJZ3JvdXBzIHw9IG5sX21ncnAoUlROTEdSUF9JUFY2X0lGQUREUik7CisJfQorCWlmIChscm91dGUpIHsKKwkJaWYgKCFwcmVmZXJyZWRfZmFtaWx5IHx8IHByZWZlcnJlZF9mYW1pbHkgPT0gQUZfSU5FVCkKKwkJCWdyb3VwcyB8PSBubF9tZ3JwKFJUTkxHUlBfSVBWNF9ST1VURSk7CisJCWlmICghcHJlZmVycmVkX2ZhbWlseSB8fCBwcmVmZXJyZWRfZmFtaWx5ID09IEFGX0lORVQ2KQorCQkJZ3JvdXBzIHw9IG5sX21ncnAoUlROTEdSUF9JUFY2X1JPVVRFKTsKKwkJaWYgKCFwcmVmZXJyZWRfZmFtaWx5IHx8IHByZWZlcnJlZF9mYW1pbHkgPT0gQUZfTVBMUykKKwkJCWdyb3VwcyB8PSBubF9tZ3JwKFJUTkxHUlBfTVBMU19ST1VURSk7CisJfQorCWlmIChsbXJvdXRlKSB7CisJCWlmICghcHJlZmVycmVkX2ZhbWlseSB8fCBwcmVmZXJyZWRfZmFtaWx5ID09IEFGX0lORVQpCisJCQlncm91cHMgfD0gbmxfbWdycChSVE5MR1JQX0lQVjRfTVJPVVRFKTsKKwkJaWYgKCFwcmVmZXJyZWRfZmFtaWx5IHx8IHByZWZlcnJlZF9mYW1pbHkgPT0gQUZfSU5FVDYpCisJCQlncm91cHMgfD0gbmxfbWdycChSVE5MR1JQX0lQVjZfTVJPVVRFKTsKKwl9CisJaWYgKGxwcmVmaXgpIHsKKwkJaWYgKCFwcmVmZXJyZWRfZmFtaWx5IHx8IHByZWZlcnJlZF9mYW1pbHkgPT0gQUZfSU5FVDYpCisJCQlncm91cHMgfD0gbmxfbWdycChSVE5MR1JQX0lQVjZfUFJFRklYKTsKKwl9CisJaWYgKGxuZWlnaCkgeworCQlncm91cHMgfD0gbmxfbWdycChSVE5MR1JQX05FSUdIKTsKKwl9CisJaWYgKGxuZXRjb25mKSB7CisJCWlmICghcHJlZmVycmVkX2ZhbWlseSB8fCBwcmVmZXJyZWRfZmFtaWx5ID09IEFGX0lORVQpCisJCQlncm91cHMgfD0gbmxfbWdycChSVE5MR1JQX0lQVjRfTkVUQ09ORik7CisJCWlmICghcHJlZmVycmVkX2ZhbWlseSB8fCBwcmVmZXJyZWRfZmFtaWx5ID09IEFGX0lORVQ2KQorCQkJZ3JvdXBzIHw9IG5sX21ncnAoUlROTEdSUF9JUFY2X05FVENPTkYpOworCX0KKwlpZiAobHJ1bGUpIHsKKwkJaWYgKCFwcmVmZXJyZWRfZmFtaWx5IHx8IHByZWZlcnJlZF9mYW1pbHkgPT0gQUZfSU5FVCkKKwkJCWdyb3VwcyB8PSBubF9tZ3JwKFJUTkxHUlBfSVBWNF9SVUxFKTsKKwkJaWYgKCFwcmVmZXJyZWRfZmFtaWx5IHx8IHByZWZlcnJlZF9mYW1pbHkgPT0gQUZfSU5FVDYpCisJCQlncm91cHMgfD0gbmxfbWdycChSVE5MR1JQX0lQVjZfUlVMRSk7CisJfQorCWlmIChsbnNpZCkgeworCQlncm91cHMgfD0gbmxfbWdycChSVE5MR1JQX05TSUQpOworCX0KKwlpZiAoZmlsZSkgeworCQlGSUxFICpmcDsKKwkJaW50IGVycjsKKworCQlmcCA9IGZvcGVuKGZpbGUsICJyIik7CisJCWlmIChmcCA9PSBOVUxMKSB7CisJCQlwZXJyb3IoIkNhbm5vdCBmb3BlbiIpOworCQkJZXhpdCgtMSk7CisJCX0KKwkJZXJyID0gcnRubF9mcm9tX2ZpbGUoZnAsIGFjY2VwdF9tc2csIHN0ZG91dCk7CisJCWZjbG9zZShmcCk7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKHJ0bmxfb3BlbigmcnRoLCBncm91cHMpIDwgMCkKKwkJZXhpdCgxKTsKKwlpZiAobGlzdGVuX2FsbF9uc2lkICYmIHJ0bmxfbGlzdGVuX2FsbF9uc2lkKCZydGgpIDwgMCkKKwkJZXhpdCgxKTsKKworCWxsX2luaXRfbWFwKCZydGgpOworCW5ldG5zX21hcF9pbml0KCk7CisKKwlpZiAocnRubF9saXN0ZW4oJnJ0aCwgYWNjZXB0X21zZywgc3Rkb3V0KSA8IDApCisJCWV4aXQoMik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2lwL2lwbXJvdXRlLmMgYi9pcHJvdXRlMi9pcC9pcG1yb3V0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZmE5ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pcC9pcG1yb3V0ZS5jCkBAIC0wLDAgKzEsMjg3IEBACisvKgorICogaXBtcm91dGUuYwkJImlwIG1yb3V0ZSIuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorCisjaW5jbHVkZSA8cnRfbmFtZXMuaD4KKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgImlwX2NvbW1vbi5oIgorCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGlwIG1yb3V0ZSBzaG93IFsgWyB0byBdIFBSRUZJWCBdIFsgZnJvbSBQUkVGSVggXSBbIGlpZiBERVZJQ0UgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgICAgICAgWyB0YWJsZSBUQUJMRV9JRCBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlRBQkxFX0lEIDo9IFsgbG9jYWwgfCBtYWluIHwgZGVmYXVsdCB8IGFsbCB8IE5VTUJFUiBdXG4iKTsKKyNpZiAwCisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogaXAgbXJvdXRlIFsgYWRkIHwgZGVsIF0gREVTVElOQVRJT04gZnJvbSBTT1VSQ0UgWyBpaWYgREVWSUNFIF0gWyBvaWYgREVWSUNFIF1cbiIpOworI2VuZGlmCisJZXhpdCgtMSk7Cit9CisKK3N0cnVjdCBydGZpbHRlcgoreworCWludCB0YjsKKwlpbnQgYWY7CisJaW50IGlpZjsKKwlpbmV0X3ByZWZpeCBtZHN0OworCWluZXRfcHJlZml4IG1zcmM7Cit9IGZpbHRlcjsKKworaW50IHByaW50X21yb3V0ZShjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobywgc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcpCit7CisJRklMRSAqZnAgPSAoRklMRSopYXJnOworCXN0cnVjdCBydG1zZyAqciA9IE5MTVNHX0RBVEEobik7CisJaW50IGxlbiA9IG4tPm5sbXNnX2xlbjsKKwlzdHJ1Y3QgcnRhdHRyICogdGJbUlRBX01BWCsxXTsKKwljaGFyIGFidWZbMjU2XTsKKwljaGFyIG9idWZbMjU2XTsKKwlTUFJJTlRfQlVGKGIxKTsKKwlfX3UzMiB0YWJsZTsKKwlpbnQgaWlmID0gMDsKKwlpbnQgZmFtaWx5OworCisJaWYgKChuLT5ubG1zZ190eXBlICE9IFJUTV9ORVdST1VURSAmJgorCSAgICAgbi0+bmxtc2dfdHlwZSAhPSBSVE1fREVMUk9VVEUpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm90IGEgbXVsdGljYXN0IHJvdXRlOiAlMDh4ICUwOHggJTA4eFxuIiwKKwkJCW4tPm5sbXNnX2xlbiwgbi0+bmxtc2dfdHlwZSwgbi0+bmxtc2dfZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisJbGVuIC09IE5MTVNHX0xFTkdUSChzaXplb2YoKnIpKTsKKwlpZiAobGVuIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkJVRzogd3Jvbmcgbmxtc2cgbGVuICVkXG4iLCBsZW4pOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChyLT5ydG1fdHlwZSAhPSBSVE5fTVVMVElDQVNUKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm90IGEgbXVsdGljYXN0IHJvdXRlICh0eXBlOiAlcylcbiIsCisJCQlydG5sX3J0bnR5cGVfbjJhKHItPnJ0bV90eXBlLCBiMSwgc2l6ZW9mKGIxKSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwYXJzZV9ydGF0dHIodGIsIFJUQV9NQVgsIFJUTV9SVEEociksIGxlbik7CisJdGFibGUgPSBydG1fZ2V0X3RhYmxlKHIsIHRiKTsKKworCWlmIChmaWx0ZXIudGIgPiAwICYmIGZpbHRlci50YiAhPSB0YWJsZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAodGJbUlRBX0lJRl0pCisJCWlpZiA9ICooaW50KilSVEFfREFUQSh0YltSVEFfSUlGXSk7CisJaWYgKGZpbHRlci5paWYgJiYgZmlsdGVyLmlpZiAhPSBpaWYpCisJCXJldHVybiAwOworCisJaWYgKGZpbHRlci5hZiAmJiBmaWx0ZXIuYWYgIT0gci0+cnRtX2ZhbWlseSkKKwkJcmV0dXJuIDA7CisKKwlpZiAodGJbUlRBX0RTVF0gJiYgZmlsdGVyLm1kc3QuYml0bGVuID4gMCkgeworCQlpbmV0X3ByZWZpeCBkc3Q7CisKKwkJbWVtc2V0KCZkc3QsIDAsIHNpemVvZihkc3QpKTsKKwkJZHN0LmZhbWlseSA9IHItPnJ0bV9mYW1pbHk7CisJCW1lbWNweSgmZHN0LmRhdGEsIFJUQV9EQVRBKHRiW1JUQV9EU1RdKSwgUlRBX1BBWUxPQUQodGJbUlRBX0RTVF0pKTsKKwkJaWYgKGluZXRfYWRkcl9tYXRjaCgmZHN0LCAmZmlsdGVyLm1kc3QsIGZpbHRlci5tZHN0LmJpdGxlbikpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodGJbUlRBX1NSQ10gJiYgZmlsdGVyLm1zcmMuYml0bGVuID4gMCkgeworCQlpbmV0X3ByZWZpeCBzcmM7CisKKwkJbWVtc2V0KCZzcmMsIDAsIHNpemVvZihzcmMpKTsKKwkJc3JjLmZhbWlseSA9IHItPnJ0bV9mYW1pbHk7CisJCW1lbWNweSgmc3JjLmRhdGEsIFJUQV9EQVRBKHRiW1JUQV9TUkNdKSwgUlRBX1BBWUxPQUQodGJbUlRBX1NSQ10pKTsKKwkJaWYgKGluZXRfYWRkcl9tYXRjaCgmc3JjLCAmZmlsdGVyLm1zcmMsIGZpbHRlci5tc3JjLmJpdGxlbikpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlmYW1pbHkgPSByLT5ydG1fZmFtaWx5ID09IFJUTkxfRkFNSUxZX0lQTVIgPyBBRl9JTkVUIDogQUZfSU5FVDY7CisKKwlpZiAobi0+bmxtc2dfdHlwZSA9PSBSVE1fREVMUk9VVEUpCisJCWZwcmludGYoZnAsICJEZWxldGVkICIpOworCisJaWYgKHRiW1JUQV9TUkNdKQorCQlsZW4gPSBzbnByaW50ZihvYnVmLCBzaXplb2Yob2J1ZiksCisJCQkgICAgICAgIiglcywgIiwgcnRfYWRkcl9uMmEoZmFtaWx5LAorCQkJCQkJICAgIFJUQV9QQVlMT0FEKHRiW1JUQV9TUkNdKSwKKwkJCQkJCSAgICBSVEFfREFUQSh0YltSVEFfU1JDXSksCisJCQkJCQkgICAgYWJ1Ziwgc2l6ZW9mKGFidWYpKSk7CisJZWxzZQorCQlsZW4gPSBzcHJpbnRmKG9idWYsICIodW5rbm93biwgIik7CisJaWYgKHRiW1JUQV9EU1RdKQorCQlzbnByaW50ZihvYnVmICsgbGVuLCBzaXplb2Yob2J1ZikgLSBsZW4sCisJCQkgIiVzKSIsIHJ0X2FkZHJfbjJhKGZhbWlseSwKKwkJCQkJICAgIFJUQV9QQVlMT0FEKHRiW1JUQV9EU1RdKSwKKwkJCQkJICAgIFJUQV9EQVRBKHRiW1JUQV9EU1RdKSwKKwkJCQkJICAgIGFidWYsIHNpemVvZihhYnVmKSkpOworCWVsc2UKKwkJc25wcmludGYob2J1ZiArIGxlbiwgc2l6ZW9mKG9idWYpIC0gbGVuLCAidW5rbm93bikgIik7CisKKwlmcHJpbnRmKGZwLCAiJS0zMnMgSWlmOiAiLCBvYnVmKTsKKwlpZiAoaWlmKQorCQlmcHJpbnRmKGZwLCAiJS0xMHMgIiwgbGxfaW5kZXhfdG9fbmFtZShpaWYpKTsKKwllbHNlCisJCWZwcmludGYoZnAsICJ1bnJlc29sdmVkICIpOworCisJaWYgKHRiW1JUQV9NVUxUSVBBVEhdKSB7CisJCXN0cnVjdCBydG5leHRob3AgKm5oID0gUlRBX0RBVEEodGJbUlRBX01VTFRJUEFUSF0pOworCQlpbnQgZmlyc3QgPSAxOworCisJCWxlbiA9IFJUQV9QQVlMT0FEKHRiW1JUQV9NVUxUSVBBVEhdKTsKKworCQlmb3IgKDs7KSB7CisJCQlpZiAobGVuIDwgc2l6ZW9mKCpuaCkpCisJCQkJYnJlYWs7CisJCQlpZiAobmgtPnJ0bmhfbGVuID4gbGVuKQorCQkJCWJyZWFrOworCisJCQlpZiAoZmlyc3QpIHsKKwkJCQlmcHJpbnRmKGZwLCAiT2lmczogIik7CisJCQkJZmlyc3QgPSAwOworCQkJfQorCQkJZnByaW50ZihmcCwgIiVzIiwgbGxfaW5kZXhfdG9fbmFtZShuaC0+cnRuaF9pZmluZGV4KSk7CisJCQlpZiAobmgtPnJ0bmhfaG9wcyA+IDEpCisJCQkJZnByaW50ZihmcCwgIih0dGwgJWQpICIsIG5oLT5ydG5oX2hvcHMpOworCQkJZWxzZQorCQkJCWZwcmludGYoZnAsICIgIik7CisJCQlsZW4gLT0gTkxNU0dfQUxJR04obmgtPnJ0bmhfbGVuKTsKKwkJCW5oID0gUlROSF9ORVhUKG5oKTsKKwkJfQorCX0KKwlpZiAoc2hvd19zdGF0cyAmJiB0YltSVEFfTUZDX1NUQVRTXSkgeworCQlzdHJ1Y3QgcnRhX21mY19zdGF0cyAqbWZjcyA9IFJUQV9EQVRBKHRiW1JUQV9NRkNfU1RBVFNdKTsKKworCQlmcHJpbnRmKGZwLCAiJXMgICUiUFJJdTY0IiBwYWNrZXRzLCAlIlBSSXU2NCIgYnl0ZXMiLCBfU0xfLAorCQkJKHVpbnQ2NF90KW1mY3MtPm1mY3NfcGFja2V0cywKKwkJCSh1aW50NjRfdCltZmNzLT5tZmNzX2J5dGVzKTsKKwkJaWYgKG1mY3MtPm1mY3Nfd3JvbmdfaWYpCisJCQlmcHJpbnRmKGZwLCAiLCAlIlBSSXU2NCIgYXJyaXZlZCBvbiB3cm9uZyBpaWYuIiwKKwkJCQkodWludDY0X3QpbWZjcy0+bWZjc193cm9uZ19pZik7CisJfQorCWZwcmludGYoZnAsICJcbiIpOworCWZmbHVzaChmcCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaXBtcm91dGVfcmVzZXRfZmlsdGVyKGludCBpZmluZGV4KQoreworCW1lbXNldCgmZmlsdGVyLCAwLCBzaXplb2YoZmlsdGVyKSk7CisJZmlsdGVyLm1kc3QuYml0bGVuID0gLTE7CisJZmlsdGVyLm1zcmMuYml0bGVuID0gLTE7CisJZmlsdGVyLmlpZiA9IGlmaW5kZXg7Cit9CisKK3N0YXRpYyBpbnQgbXJvdXRlX2xpc3QoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKmlkID0gTlVMTDsKKwlpbnQgZmFtaWx5OworCisJaXBtcm91dGVfcmVzZXRfZmlsdGVyKDApOworCWlmIChwcmVmZXJyZWRfZmFtaWx5ID09IEFGX1VOU1BFQykKKwkJZmFtaWx5ID0gQUZfSU5FVDsKKwllbHNlCisJCWZhbWlseSA9IEFGX0lORVQ2OworCWlmIChmYW1pbHkgPT0gQUZfSU5FVCkgeworCQlmaWx0ZXIuYWYgPSBSVE5MX0ZBTUlMWV9JUE1SOworCQlmaWx0ZXIudGIgPSBSVF9UQUJMRV9ERUZBVUxUOyAgLyogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKwl9IGVsc2UKKwkJZmlsdGVyLmFmID0gUlROTF9GQU1JTFlfSVA2TVI7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJ0YWJsZSIpID09IDApIHsKKwkJCV9fdTMyIHRpZDsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocnRubF9ydHRhYmxlX2EybigmdGlkLCAqYXJndikpIHsKKwkJCQlpZiAoc3RyY21wKCphcmd2LCAiYWxsIikgPT0gMCkgeworCQkJCQlmaWx0ZXIudGIgPSAwOworCQkJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaGVscCIpID09IDApIHsKKwkJCQkJdXNhZ2UoKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpbnZhcmcoInRhYmxlIGlkIHZhbHVlIGlzIGludmFsaWRcbiIsICphcmd2KTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlmaWx0ZXIudGIgPSB0aWQ7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaWlmIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlkID0gKmFyZ3Y7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImZyb20iKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJZ2V0X3ByZWZpeCgmZmlsdGVyLm1zcmMsICphcmd2LCBmYW1pbHkpOworCQl9IGVsc2UgeworCQkJaWYgKHN0cmNtcCgqYXJndiwgInRvIikgPT0gMCkgeworCQkJCU5FWFRfQVJHKCk7CisJCQl9CisJCQlpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKQorCQkJCXVzYWdlKCk7CisJCQlnZXRfcHJlZml4KCZmaWx0ZXIubWRzdCwgKmFyZ3YsIGZhbWlseSk7CisJCX0KKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJbGxfaW5pdF9tYXAoJnJ0aCk7CisKKwlpZiAoaWQpICB7CisJCWludCBpZHg7CisKKwkJaWYgKChpZHggPSBsbF9uYW1lX3RvX2luZGV4KGlkKSkgPT0gMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJDYW5ub3QgZmluZCBkZXZpY2UgXCIlc1wiXG4iLCBpZCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZmlsdGVyLmlpZiA9IGlkeDsKKwl9CisKKwlpZiAocnRubF93aWxkZHVtcF9yZXF1ZXN0KCZydGgsIGZpbHRlci5hZiwgUlRNX0dFVFJPVVRFKSA8IDApIHsKKwkJcGVycm9yKCJDYW5ub3Qgc2VuZCBkdW1wIHJlcXVlc3QiKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHJ0bmxfZHVtcF9maWx0ZXIoJnJ0aCwgcHJpbnRfbXJvdXRlLCBzdGRvdXQpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkR1bXAgdGVybWluYXRlZFxuIik7CisJCWV4aXQoMSk7CisJfQorCisJZXhpdCgwKTsKK30KKworaW50IGRvX211bHRpcm91dGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWlmIChhcmdjIDwgMSkKKwkJcmV0dXJuIG1yb3V0ZV9saXN0KDAsIE5VTEwpOworI2lmIDAKKwlpZiAobWF0Y2hlcygqYXJndiwgImFkZCIpID09IDApCisJCXJldHVybiBtcm91dGVfbW9kaWZ5KFJUTV9ORVdBRERSLCBhcmdjLTEsIGFyZ3YrMSk7CisJaWYgKG1hdGNoZXMoKmFyZ3YsICJkZWxldGUiKSA9PSAwKQorCQlyZXR1cm4gbXJvdXRlX21vZGlmeShSVE1fREVMQUREUiwgYXJnYy0xLCBhcmd2KzEpOworCWlmIChtYXRjaGVzKCphcmd2LCAiZ2V0IikgPT0gMCkKKwkJcmV0dXJuIG1yb3V0ZV9nZXQoYXJnYy0xLCBhcmd2KzEpOworI2VuZGlmCisJaWYgKG1hdGNoZXMoKmFyZ3YsICJsaXN0IikgPT0gMCB8fCBtYXRjaGVzKCphcmd2LCAic2hvdyIpID09IDAKKwkgICAgfHwgbWF0Y2hlcygqYXJndiwgImxzdCIpID09IDApCisJCXJldHVybiBtcm91dGVfbGlzdChhcmdjLTEsIGFyZ3YrMSk7CisJaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkKKwkJdXNhZ2UoKTsKKwlmcHJpbnRmKHN0ZGVyciwgIkNvbW1hbmQgXCIlc1wiIGlzIHVua25vd24sIHRyeSBcImlwIG1yb3V0ZSBoZWxwXCIuXG4iLCAqYXJndik7CisJZXhpdCgtMSk7Cit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pcC9pcG5laWdoLmMgYi9pcHJvdXRlMi9pcC9pcG5laWdoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiN2NkNgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2lwL2lwbmVpZ2guYwpAQCAtMCwwICsxLDUxNCBAQAorLyoKKyAqIGlwbmVpZ2guYwkJImlwIG5laWdoIi4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaXAuaD4KKworI2luY2x1ZGUgInJ0X25hbWVzLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJpcF9jb21tb24uaCIKKworI2RlZmluZSBOVURfVkFMSUQJKE5VRF9QRVJNQU5FTlR8TlVEX05PQVJQfE5VRF9SRUFDSEFCTEV8TlVEX1BST0JFfE5VRF9TVEFMRXxOVURfREVMQVkpCisjZGVmaW5lIE1BWF9ST1VORFMJMTAKKworc3RhdGljIHN0cnVjdAoreworCWludCBmYW1pbHk7CisgICAgICAgIGludCBpbmRleDsKKwlpbnQgc3RhdGU7CisJaW50IHVudXNlZF9vbmx5OworCWluZXRfcHJlZml4IHBmeDsKKwlpbnQgZmx1c2hlZDsKKwljaGFyICpmbHVzaGI7CisJaW50IGZsdXNocDsKKwlpbnQgZmx1c2hlOworCWludCBtYXN0ZXI7Cit9IGZpbHRlcjsKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBpcCBuZWlnaCB7IGFkZCB8IGRlbCB8IGNoYW5nZSB8IHJlcGxhY2UgfSB7IEFERFIgWyBsbGFkZHIgTExBRERSIF1cbiIKKwkJICAgICAgICAiICAgICAgICAgIFsgbnVkIHsgcGVybWFuZW50IHwgbm9hcnAgfCBzdGFsZSB8IHJlYWNoYWJsZSB9IF1cbiIKKwkJICAgICAgICAiICAgICAgICAgIHwgcHJveHkgQUREUiB9IFsgZGV2IERFViBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBpcCBuZWlnaCB7c2hvd3xmbHVzaH0gWyB0byBQUkVGSVggXSBbIGRldiBERVYgXSBbIG51ZCBTVEFURSBdXG4iKTsKKwlleGl0KC0xKTsKK30KKworc3RhdGljIGludCBudWRfc3RhdGVfYTJuKHVuc2lnbmVkICpzdGF0ZSwgY29uc3QgY2hhciAqYXJnKQoreworCWlmIChtYXRjaGVzKGFyZywgInBlcm1hbmVudCIpID09IDApCisJCSpzdGF0ZSA9IE5VRF9QRVJNQU5FTlQ7CisJZWxzZSBpZiAobWF0Y2hlcyhhcmcsICJyZWFjaGFibGUiKSA9PSAwKQorCQkqc3RhdGUgPSBOVURfUkVBQ0hBQkxFOworCWVsc2UgaWYgKHN0cmNtcChhcmcsICJub2FycCIpID09IDApCisJCSpzdGF0ZSA9IE5VRF9OT0FSUDsKKwllbHNlIGlmIChzdHJjbXAoYXJnLCAibm9uZSIpID09IDApCisJCSpzdGF0ZSA9IE5VRF9OT05FOworCWVsc2UgaWYgKHN0cmNtcChhcmcsICJzdGFsZSIpID09IDApCisJCSpzdGF0ZSA9IE5VRF9TVEFMRTsKKwllbHNlIGlmIChzdHJjbXAoYXJnLCAiaW5jb21wbGV0ZSIpID09IDApCisJCSpzdGF0ZSA9IE5VRF9JTkNPTVBMRVRFOworCWVsc2UgaWYgKHN0cmNtcChhcmcsICJkZWxheSIpID09IDApCisJCSpzdGF0ZSA9IE5VRF9ERUxBWTsKKwllbHNlIGlmIChzdHJjbXAoYXJnLCAicHJvYmUiKSA9PSAwKQorCQkqc3RhdGUgPSBOVURfUFJPQkU7CisJZWxzZSBpZiAobWF0Y2hlcyhhcmcsICJmYWlsZWQiKSA9PSAwKQorCQkqc3RhdGUgPSBOVURfRkFJTEVEOworCWVsc2UgeworCQlpZiAoZ2V0X3Vuc2lnbmVkKHN0YXRlLCBhcmcsIDApKQorCQkJcmV0dXJuIC0xOworCQlpZiAoKnN0YXRlPj0weDEwMCB8fCAoKnN0YXRlJigoKnN0YXRlKS0xKSkpCisJCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZsdXNoX3VwZGF0ZSh2b2lkKQoreworCWlmIChydG5sX3NlbmRfY2hlY2soJnJ0aCwgZmlsdGVyLmZsdXNoYiwgZmlsdGVyLmZsdXNocCkgPCAwKSB7CisJCXBlcnJvcigiRmFpbGVkIHRvIHNlbmQgZmx1c2ggcmVxdWVzdCIpOworCQlyZXR1cm4gLTE7CisJfQorCWZpbHRlci5mbHVzaHAgPSAwOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaXBuZWlnaF9tb2RpZnkoaW50IGNtZCwgaW50IGZsYWdzLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyCW47CisJCXN0cnVjdCBuZG1zZwkJbmRtOworCQljaGFyICAJCQlidWZbMjU2XTsKKwl9IHJlcTsKKwljaGFyICAqZGV2ID0gTlVMTDsKKwlpbnQgZHN0X29rID0gMDsKKwlpbnQgZGV2X29rID0gMDsKKwlpbnQgbGxhZGRyX29rID0gMDsKKwljaGFyICogbGxhID0gTlVMTDsKKwlpbmV0X3ByZWZpeCBkc3Q7CisKKwltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCisJcmVxLm4ubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgbmRtc2cpKTsKKwlyZXEubi5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1R8ZmxhZ3M7CisJcmVxLm4ubmxtc2dfdHlwZSA9IGNtZDsKKwlyZXEubmRtLm5kbV9mYW1pbHkgPSBwcmVmZXJyZWRfZmFtaWx5OworCXJlcS5uZG0ubmRtX3N0YXRlID0gTlVEX1BFUk1BTkVOVDsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAobWF0Y2hlcygqYXJndiwgImxsYWRkciIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAobGxhZGRyX29rKQorCQkJCWR1cGFyZygibGxhZGRyIiwgKmFyZ3YpOworCQkJbGxhID0gKmFyZ3Y7CisJCQlsbGFkZHJfb2sgPSAxOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm51ZCIpID09IDApIHsKKwkJCXVuc2lnbmVkIHN0YXRlOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChudWRfc3RhdGVfYTJuKCZzdGF0ZSwgKmFyZ3YpKQorCQkJCWludmFyZygibnVkIHN0YXRlIGlzIGJhZCIsICphcmd2KTsKKwkJCXJlcS5uZG0ubmRtX3N0YXRlID0gc3RhdGU7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInByb3h5IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChtYXRjaGVzKCphcmd2LCAiaGVscCIpID09IDApCisJCQkJdXNhZ2UoKTsKKwkJCWlmIChkc3Rfb2spCisJCQkJZHVwYXJnKCJhZGRyZXNzIiwgKmFyZ3YpOworCQkJZ2V0X2FkZHIoJmRzdCwgKmFyZ3YsIHByZWZlcnJlZF9mYW1pbHkpOworCQkJZHN0X29rID0gMTsKKwkJCWRldl9vayA9IDE7CisJCQlyZXEubmRtLm5kbV9mbGFncyB8PSBOVEZfUFJPWFk7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZGV2IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWRldiA9ICphcmd2OworCQkJZGV2X29rID0gMTsKKwkJfSBlbHNlIHsKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJ0byIpID09IDApIHsKKwkJCQlORVhUX0FSRygpOworCQkJfQorCQkJaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJCU5FWFRfQVJHKCk7CisJCQl9CisJCQlpZiAoZHN0X29rKQorCQkJCWR1cGFyZzIoInRvIiwgKmFyZ3YpOworCQkJZ2V0X2FkZHIoJmRzdCwgKmFyZ3YsIHByZWZlcnJlZF9mYW1pbHkpOworCQkJZHN0X29rID0gMTsKKwkJfQorCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisJaWYgKCFkZXZfb2sgfHwgIWRzdF9vayB8fCBkc3QuZmFtaWx5ID09IEFGX1VOU1BFQykgeworCQlmcHJpbnRmKHN0ZGVyciwgIkRldmljZSBhbmQgZGVzdGluYXRpb24gYXJlIHJlcXVpcmVkIGFyZ3VtZW50cy5cbiIpOworCQlleGl0KC0xKTsKKwl9CisJcmVxLm5kbS5uZG1fZmFtaWx5ID0gZHN0LmZhbWlseTsKKwlpZiAoYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIE5EQV9EU1QsICZkc3QuZGF0YSwgZHN0LmJ5dGVsZW4pIDwgMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGxsYSAmJiBzdHJjbXAobGxhLCAibnVsbCIpKSB7CisJCWNoYXIgbGxhYnVmWzIwXTsKKwkJaW50IGw7CisKKwkJbCA9IGxsX2FkZHJfYTJuKGxsYWJ1Ziwgc2l6ZW9mKGxsYWJ1ZiksIGxsYSk7CisJCWlmIChsIDwgMCkKKwkJCXJldHVybiAtMTsKKworCQlpZiAoYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIE5EQV9MTEFERFIsIGxsYWJ1ZiwgbCkgPCAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCWxsX2luaXRfbWFwKCZydGgpOworCisJaWYgKGRldiAmJiAocmVxLm5kbS5uZG1faWZpbmRleCA9IGxsX25hbWVfdG9faW5kZXgoZGV2KSkgPT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBmaW5kIGRldmljZSBcIiVzXCJcbiIsIGRldik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAocnRubF90YWxrKCZydGgsICZyZXEubiwgTlVMTCwgMCkgPCAwKQorCQlleGl0KDIpOworCisJcmV0dXJuIDA7Cit9CisKKworaW50IHByaW50X25laWdoKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZykKK3sKKwlGSUxFICpmcCA9IChGSUxFKilhcmc7CisJc3RydWN0IG5kbXNnICpyID0gTkxNU0dfREFUQShuKTsKKwlpbnQgbGVuID0gbi0+bmxtc2dfbGVuOworCXN0cnVjdCBydGF0dHIgKiB0YltOREFfTUFYKzFdOworCWNoYXIgYWJ1ZlsyNTZdOworCXN0YXRpYyBpbnQgbG9naXQgPSAxOworCisJaWYgKG4tPm5sbXNnX3R5cGUgIT0gUlRNX05FV05FSUdIICYmIG4tPm5sbXNnX3R5cGUgIT0gUlRNX0RFTE5FSUdIICYmCisJICAgIG4tPm5sbXNnX3R5cGUgIT0gUlRNX0dFVE5FSUdIKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm90IFJUTV9ORVdORUlHSDogJTA4eCAlMDh4ICUwOHhcbiIsCisJCQluLT5ubG1zZ19sZW4sIG4tPm5sbXNnX3R5cGUsIG4tPm5sbXNnX2ZsYWdzKTsKKworCQlyZXR1cm4gMDsKKwl9CisJbGVuIC09IE5MTVNHX0xFTkdUSChzaXplb2YoKnIpKTsKKwlpZiAobGVuIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkJVRzogd3Jvbmcgbmxtc2cgbGVuICVkXG4iLCBsZW4pOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGZpbHRlci5mbHVzaGIgJiYgbi0+bmxtc2dfdHlwZSAhPSBSVE1fTkVXTkVJR0gpCisJCXJldHVybiAwOworCisJaWYgKGZpbHRlci5mYW1pbHkgJiYgZmlsdGVyLmZhbWlseSAhPSByLT5uZG1fZmFtaWx5KQorCQlyZXR1cm4gMDsKKwlpZiAoZmlsdGVyLmluZGV4ICYmIGZpbHRlci5pbmRleCAhPSByLT5uZG1faWZpbmRleCkKKwkJcmV0dXJuIDA7CisJaWYgKCEoZmlsdGVyLnN0YXRlJnItPm5kbV9zdGF0ZSkgJiYKKwkgICAgIShyLT5uZG1fZmxhZ3MgJiBOVEZfUFJPWFkpICYmCisJICAgIChyLT5uZG1fc3RhdGUgfHwgIShmaWx0ZXIuc3RhdGUmMHgxMDApKSAmJgorICAgICAgICAgICAgIChyLT5uZG1fZmFtaWx5ICE9IEFGX0RFQ25ldCkpCisJCXJldHVybiAwOworCisJaWYgKGZpbHRlci5tYXN0ZXIgJiYgIShuLT5ubG1zZ19mbGFncyAmIE5MTV9GX0RVTVBfRklMVEVSRUQpKSB7CisJCWlmIChsb2dpdCkgeworCQkJbG9naXQgPSAwOworCQkJZnByaW50ZihmcCwKKwkJCQkiXG5XQVJOSU5HOiBLZXJuZWwgZG9lcyBub3Qgc3VwcG9ydCBmaWx0ZXJpbmcgYnkgbWFzdGVyIGRldmljZVxuXG4iKTsKKwkJfQorCX0KKworCXBhcnNlX3J0YXR0cih0YiwgTkRBX01BWCwgTkRBX1JUQShyKSwgbi0+bmxtc2dfbGVuIC0gTkxNU0dfTEVOR1RIKHNpemVvZigqcikpKTsKKworCWlmICh0YltOREFfRFNUXSkgeworCQlpZiAoZmlsdGVyLnBmeC5mYW1pbHkpIHsKKwkJCWluZXRfcHJlZml4IGRzdDsKKwkJCW1lbXNldCgmZHN0LCAwLCBzaXplb2YoZHN0KSk7CisJCQlkc3QuZmFtaWx5ID0gci0+bmRtX2ZhbWlseTsKKwkJCW1lbWNweSgmZHN0LmRhdGEsIFJUQV9EQVRBKHRiW05EQV9EU1RdKSwgUlRBX1BBWUxPQUQodGJbTkRBX0RTVF0pKTsKKwkJCWlmIChpbmV0X2FkZHJfbWF0Y2goJmRzdCwgJmZpbHRlci5wZngsIGZpbHRlci5wZnguYml0bGVuKSkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlpZiAoZmlsdGVyLnVudXNlZF9vbmx5ICYmIHRiW05EQV9DQUNIRUlORk9dKSB7CisJCXN0cnVjdCBuZGFfY2FjaGVpbmZvICpjaSA9IFJUQV9EQVRBKHRiW05EQV9DQUNIRUlORk9dKTsKKwkJaWYgKGNpLT5uZG1fcmVmY250KQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKGZpbHRlci5mbHVzaGIpIHsKKwkJc3RydWN0IG5sbXNnaGRyICpmbjsKKwkJaWYgKE5MTVNHX0FMSUdOKGZpbHRlci5mbHVzaHApICsgbi0+bmxtc2dfbGVuID4gZmlsdGVyLmZsdXNoZSkgeworCQkJaWYgKGZsdXNoX3VwZGF0ZSgpKQorCQkJCXJldHVybiAtMTsKKwkJfQorCQlmbiA9IChzdHJ1Y3Qgbmxtc2doZHIqKShmaWx0ZXIuZmx1c2hiICsgTkxNU0dfQUxJR04oZmlsdGVyLmZsdXNocCkpOworCQltZW1jcHkoZm4sIG4sIG4tPm5sbXNnX2xlbik7CisJCWZuLT5ubG1zZ190eXBlID0gUlRNX0RFTE5FSUdIOworCQlmbi0+bmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUOworCQlmbi0+bmxtc2dfc2VxID0gKytydGguc2VxOworCQlmaWx0ZXIuZmx1c2hwID0gKCgoY2hhciopZm4pICsgbi0+bmxtc2dfbGVuKSAtIGZpbHRlci5mbHVzaGI7CisJCWZpbHRlci5mbHVzaGVkKys7CisJCWlmIChzaG93X3N0YXRzIDwgMikKKwkJCXJldHVybiAwOworCX0KKworCWlmIChuLT5ubG1zZ190eXBlID09IFJUTV9ERUxORUlHSCkKKwkJZnByaW50ZihmcCwgIkRlbGV0ZWQgIik7CisJZWxzZSBpZiAobi0+bmxtc2dfdHlwZSA9PSBSVE1fR0VUTkVJR0gpCisJCWZwcmludGYoZnAsICJtaXNzICIpOworCWlmICh0YltOREFfRFNUXSkgeworCQlmcHJpbnRmKGZwLCAiJXMgIiwKKwkJCWZvcm1hdF9ob3N0KHItPm5kbV9mYW1pbHksCisJCQkJICAgIFJUQV9QQVlMT0FEKHRiW05EQV9EU1RdKSwKKwkJCQkgICAgUlRBX0RBVEEodGJbTkRBX0RTVF0pLAorCQkJCSAgICBhYnVmLCBzaXplb2YoYWJ1ZikpKTsKKwl9CisJaWYgKCFmaWx0ZXIuaW5kZXggJiYgci0+bmRtX2lmaW5kZXgpCisJCWZwcmludGYoZnAsICJkZXYgJXMgIiwgbGxfaW5kZXhfdG9fbmFtZShyLT5uZG1faWZpbmRleCkpOworCWlmICh0YltOREFfTExBRERSXSkgeworCQlTUFJJTlRfQlVGKGIxKTsKKwkJZnByaW50ZihmcCwgImxsYWRkciAlcyIsIGxsX2FkZHJfbjJhKFJUQV9EQVRBKHRiW05EQV9MTEFERFJdKSwKKwkJCQkJICAgICAgUlRBX1BBWUxPQUQodGJbTkRBX0xMQUREUl0pLAorCQkJCQkgICAgICBsbF9pbmRleF90b190eXBlKHItPm5kbV9pZmluZGV4KSwKKwkJCQkJICAgICAgYjEsIHNpemVvZihiMSkpKTsKKwl9CisJaWYgKHItPm5kbV9mbGFncyAmIE5URl9ST1VURVIpIHsKKwkJZnByaW50ZihmcCwgIiByb3V0ZXIiKTsKKwl9CisJaWYgKHItPm5kbV9mbGFncyAmIE5URl9QUk9YWSkgeworCQlmcHJpbnRmKGZwLCAiIHByb3h5Iik7CisJfQorCWlmICh0YltOREFfQ0FDSEVJTkZPXSAmJiBzaG93X3N0YXRzKSB7CisJCXN0cnVjdCBuZGFfY2FjaGVpbmZvICpjaSA9IFJUQV9EQVRBKHRiW05EQV9DQUNIRUlORk9dKTsKKwkJaW50IGh6ID0gZ2V0X3VzZXJfaHooKTsKKworCQlpZiAoY2ktPm5kbV9yZWZjbnQpCisJCQlwcmludGYoIiByZWYgJWQiLCBjaS0+bmRtX3JlZmNudCk7CisJCWZwcmludGYoZnAsICIgdXNlZCAlZC8lZC8lZCIsIGNpLT5uZG1fdXNlZC9oeiwKKwkJICAgICAgIGNpLT5uZG1fY29uZmlybWVkL2h6LCBjaS0+bmRtX3VwZGF0ZWQvaHopOworCX0KKworCWlmICh0YltOREFfUFJPQkVTXSAmJiBzaG93X3N0YXRzKSB7CisJCV9fdTMyIHAgPSBydGFfZ2V0YXR0cl91MzIodGJbTkRBX1BST0JFU10pOworCQlmcHJpbnRmKGZwLCAiIHByb2JlcyAldSIsIHApOworCX0KKworCWlmIChyLT5uZG1fc3RhdGUpIHsKKwkJaW50IG51ZCA9IHItPm5kbV9zdGF0ZTsKKwkJZnByaW50ZihmcCwgIiAiKTsKKworI2RlZmluZSBQUklOVF9GTEFHKGYpIGlmIChudWQgJiBOVURfIyNmKSB7IFwKKwludWQgJj0gfk5VRF8jI2Y7IGZwcmludGYoZnAsICNmICIlcyIsIG51ZCA/ICIsIiA6ICIiKTsgfQorCQlQUklOVF9GTEFHKElOQ09NUExFVEUpOworCQlQUklOVF9GTEFHKFJFQUNIQUJMRSk7CisJCVBSSU5UX0ZMQUcoU1RBTEUpOworCQlQUklOVF9GTEFHKERFTEFZKTsKKwkJUFJJTlRfRkxBRyhQUk9CRSk7CisJCVBSSU5UX0ZMQUcoRkFJTEVEKTsKKwkJUFJJTlRfRkxBRyhOT0FSUCk7CisJCVBSSU5UX0ZMQUcoUEVSTUFORU5UKTsKKyN1bmRlZiBQUklOVF9GTEFHCisJfQorCWZwcmludGYoZnAsICJcbiIpOworCisJZmZsdXNoKGZwKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBpcG5laWdoX3Jlc2V0X2ZpbHRlcihpbnQgaWZpbmRleCkKK3sKKwltZW1zZXQoJmZpbHRlciwgMCwgc2l6ZW9mKGZpbHRlcikpOworCWZpbHRlci5zdGF0ZSA9IH4wOworCWZpbHRlci5pbmRleCA9IGlmaW5kZXg7Cit9CisKK3N0YXRpYyBpbnQgZG9fc2hvd19vcl9mbHVzaChpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGludCBmbHVzaCkKK3sKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgbmxtc2doZHIJbjsKKwkJc3RydWN0IG5kbXNnCQluZG07CisJCWNoYXIgIAkJCWJ1ZlsyNTZdOworCX0gcmVxOworCWNoYXIgKmZpbHRlcl9kZXYgPSBOVUxMOworCWludCBzdGF0ZV9naXZlbiA9IDA7CisKKwltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCisJcmVxLm4ubmxtc2dfdHlwZSA9IFJUTV9HRVRORUlHSDsKKwlyZXEubi5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBuZG1zZykpOworCisJaXBuZWlnaF9yZXNldF9maWx0ZXIoMCk7CisKKwlpZiAoIWZpbHRlci5mYW1pbHkpCisJCWZpbHRlci5mYW1pbHkgPSBwcmVmZXJyZWRfZmFtaWx5OworCisJaWYgKGZsdXNoKSB7CisJCWlmIChhcmdjIDw9IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiRmx1c2ggcmVxdWlyZXMgYXJndW1lbnRzLlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZmlsdGVyLnN0YXRlID0gfihOVURfUEVSTUFORU5UfE5VRF9OT0FSUCk7CisJfSBlbHNlCisJCWZpbHRlci5zdGF0ZSA9IDB4RkYgJiB+TlVEX05PQVJQOworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChzdHJjbXAoKmFyZ3YsICJkZXYiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGZpbHRlcl9kZXYpCisJCQkJZHVwYXJnKCJkZXYiLCAqYXJndik7CisJCQlmaWx0ZXJfZGV2ID0gKmFyZ3Y7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibWFzdGVyIikgPT0gMCkgeworCQkJaW50IGlmaW5kZXg7CisJCQlORVhUX0FSRygpOworCQkJaWZpbmRleCA9IGxsX25hbWVfdG9faW5kZXgoKmFyZ3YpOworCQkJaWYgKCFpZmluZGV4KQorCQkJCWludmFyZygiRGV2aWNlIGRvZXMgbm90IGV4aXN0XG4iLCAqYXJndik7CisJCQlhZGRhdHRyMzIoJnJlcS5uLCBzaXplb2YocmVxKSwgTkRBX01BU1RFUiwgaWZpbmRleCk7CisJCQlmaWx0ZXIubWFzdGVyID0gaWZpbmRleDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJ1bnVzZWQiKSA9PSAwKSB7CisJCQlmaWx0ZXIudW51c2VkX29ubHkgPSAxOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm51ZCIpID09IDApIHsKKwkJCXVuc2lnbmVkIHN0YXRlOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmICghc3RhdGVfZ2l2ZW4pIHsKKwkJCQlzdGF0ZV9naXZlbiA9IDE7CisJCQkJZmlsdGVyLnN0YXRlID0gMDsKKwkJCX0KKwkJCWlmIChudWRfc3RhdGVfYTJuKCZzdGF0ZSwgKmFyZ3YpKSB7CisJCQkJaWYgKHN0cmNtcCgqYXJndiwgImFsbCIpICE9IDApCisJCQkJCWludmFyZygibnVkIHN0YXRlIGlzIGJhZCIsICphcmd2KTsKKwkJCQlzdGF0ZSA9IH4wOworCQkJCWlmIChmbHVzaCkKKwkJCQkJc3RhdGUgJj0gfk5VRF9OT0FSUDsKKwkJCX0KKwkJCWlmIChzdGF0ZSA9PSAwKQorCQkJCXN0YXRlID0gMHgxMDA7CisJCQlmaWx0ZXIuc3RhdGUgfD0gc3RhdGU7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAicHJveHkiKSA9PSAwKQorCQkJcmVxLm5kbS5uZG1fZmxhZ3MgPSBOVEZfUFJPWFk7CisJCWVsc2UgeworCQkJaWYgKHN0cmNtcCgqYXJndiwgInRvIikgPT0gMCkgeworCQkJCU5FWFRfQVJHKCk7CisJCQl9CisJCQlpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKQorCQkJCXVzYWdlKCk7CisJCQlnZXRfcHJlZml4KCZmaWx0ZXIucGZ4LCAqYXJndiwgZmlsdGVyLmZhbWlseSk7CisJCQlpZiAoZmlsdGVyLmZhbWlseSA9PSBBRl9VTlNQRUMpCisJCQkJZmlsdGVyLmZhbWlseSA9IGZpbHRlci5wZnguZmFtaWx5OworCQl9CisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCWxsX2luaXRfbWFwKCZydGgpOworCisJaWYgKGZpbHRlcl9kZXYpIHsKKwkJaWYgKChmaWx0ZXIuaW5kZXggPSBsbF9uYW1lX3RvX2luZGV4KGZpbHRlcl9kZXYpKSA9PSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBmaW5kIGRldmljZSBcIiVzXCJcbiIsIGZpbHRlcl9kZXYpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWFkZGF0dHIzMigmcmVxLm4sIHNpemVvZihyZXEpLCBOREFfSUZJTkRFWCwgZmlsdGVyLmluZGV4KTsKKwl9CisKKwlpZiAoZmx1c2gpIHsKKwkJaW50IHJvdW5kID0gMDsKKwkJY2hhciBmbHVzaGJbNDA5Ni01MTJdOworCisJCWZpbHRlci5mbHVzaGIgPSBmbHVzaGI7CisJCWZpbHRlci5mbHVzaHAgPSAwOworCQlmaWx0ZXIuZmx1c2hlID0gc2l6ZW9mKGZsdXNoYik7CisJCWZpbHRlci5zdGF0ZSAmPSB+TlVEX0ZBSUxFRDsKKworCQl3aGlsZSAocm91bmQgPCBNQVhfUk9VTkRTKSB7CisJCQlpZiAocnRubF93aWxkZHVtcF9yZXF1ZXN0KCZydGgsIGZpbHRlci5mYW1pbHksIFJUTV9HRVRORUlHSCkgPCAwKSB7CisJCQkJcGVycm9yKCJDYW5ub3Qgc2VuZCBkdW1wIHJlcXVlc3QiKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQkJZmlsdGVyLmZsdXNoZWQgPSAwOworCQkJaWYgKHJ0bmxfZHVtcF9maWx0ZXIoJnJ0aCwgcHJpbnRfbmVpZ2gsIHN0ZG91dCkgPCAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJGbHVzaCB0ZXJtaW5hdGVkXG4iKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQkJaWYgKGZpbHRlci5mbHVzaGVkID09IDApIHsKKwkJCQlpZiAoc2hvd19zdGF0cykgeworCQkJCQlpZiAocm91bmQgPT0gMCkKKwkJCQkJCXByaW50ZigiTm90aGluZyB0byBmbHVzaC5cbiIpOworCQkJCQllbHNlCisJCQkJCQlwcmludGYoIioqKiBGbHVzaCBpcyBjb21wbGV0ZSBhZnRlciAlZCByb3VuZCVzICoqKlxuIiwgcm91bmQsIHJvdW5kPjE/InMiOiIiKTsKKwkJCQl9CisJCQkJZmZsdXNoKHN0ZG91dCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlyb3VuZCsrOworCQkJaWYgKGZsdXNoX3VwZGF0ZSgpIDwgMCkKKwkJCQlleGl0KDEpOworCQkJaWYgKHNob3dfc3RhdHMpIHsKKwkJCQlwcmludGYoIlxuKioqIFJvdW5kICVkLCBkZWxldGluZyAlZCBlbnRyaWVzICoqKlxuIiwgcm91bmQsIGZpbHRlci5mbHVzaGVkKTsKKwkJCQlmZmx1c2goc3Rkb3V0KTsKKwkJCX0KKwkJfQorCQlwcmludGYoIioqKiBGbHVzaCBub3QgY29tcGxldGUgYmFpbGluZyBvdXQgYWZ0ZXIgJWQgcm91bmRzXG4iLAorCQkJTUFYX1JPVU5EUyk7CisJCXJldHVybiAxOworCX0KKworCXJlcS5uZG0ubmRtX2ZhbWlseSA9IGZpbHRlci5mYW1pbHk7CisKKwlpZiAocnRubF9kdW1wX3JlcXVlc3RfbigmcnRoLCAmcmVxLm4pIDwgMCkgeworCQlwZXJyb3IoIkNhbm5vdCBzZW5kIGR1bXAgcmVxdWVzdCIpOworCQlleGl0KDEpOworCX0KKworCWlmIChydG5sX2R1bXBfZmlsdGVyKCZydGgsIHByaW50X25laWdoLCBzdGRvdXQpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkR1bXAgdGVybWluYXRlZFxuIik7CisJCWV4aXQoMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBkb19pcG5laWdoKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpZiAoYXJnYyA+IDApIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJhZGQiKSA9PSAwKQorCQkJcmV0dXJuIGlwbmVpZ2hfbW9kaWZ5KFJUTV9ORVdORUlHSCwgTkxNX0ZfQ1JFQVRFfE5MTV9GX0VYQ0wsIGFyZ2MtMSwgYXJndisxKTsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJjaGFuZ2UiKSA9PSAwIHx8CisJCSAgICBzdHJjbXAoKmFyZ3YsICJjaGciKSA9PSAwKQorCQkJcmV0dXJuIGlwbmVpZ2hfbW9kaWZ5KFJUTV9ORVdORUlHSCwgTkxNX0ZfUkVQTEFDRSwgYXJnYy0xLCBhcmd2KzEpOworCQlpZiAobWF0Y2hlcygqYXJndiwgInJlcGxhY2UiKSA9PSAwKQorCQkJcmV0dXJuIGlwbmVpZ2hfbW9kaWZ5KFJUTV9ORVdORUlHSCwgTkxNX0ZfQ1JFQVRFfE5MTV9GX1JFUExBQ0UsIGFyZ2MtMSwgYXJndisxKTsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJkZWxldGUiKSA9PSAwKQorCQkJcmV0dXJuIGlwbmVpZ2hfbW9kaWZ5KFJUTV9ERUxORUlHSCwgMCwgYXJnYy0xLCBhcmd2KzEpOworCQlpZiAobWF0Y2hlcygqYXJndiwgImdldCIpID09IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiU29ycnksIFwibmVpZ2ggZ2V0XCIgaXMgbm90IGltcGxlbWVudGVkIDotKFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJzaG93IikgPT0gMCB8fAorCQkgICAgbWF0Y2hlcygqYXJndiwgImxzdCIpID09IDAgfHwKKwkJICAgIG1hdGNoZXMoKmFyZ3YsICJsaXN0IikgPT0gMCkKKwkJCXJldHVybiBkb19zaG93X29yX2ZsdXNoKGFyZ2MtMSwgYXJndisxLCAwKTsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJmbHVzaCIpID09IDApCisJCQlyZXR1cm4gZG9fc2hvd19vcl9mbHVzaChhcmdjLTEsIGFyZ3YrMSwgMSk7CisJCWlmIChtYXRjaGVzKCphcmd2LCAiaGVscCIpID09IDApCisJCQl1c2FnZSgpOworCX0gZWxzZQorCQlyZXR1cm4gZG9fc2hvd19vcl9mbHVzaCgwLCBOVUxMLCAwKTsKKworCWZwcmludGYoc3RkZXJyLCAiQ29tbWFuZCBcIiVzXCIgaXMgdW5rbm93biwgdHJ5IFwiaXAgbmVpZ2ggaGVscFwiLlxuIiwgKmFyZ3YpOworCWV4aXQoLTEpOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaXAvaXBuZXRjb25mLmMgYi9pcHJvdXRlMi9pcC9pcG5ldGNvbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2E2ZWVlCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaXAvaXBuZXRjb25mLmMKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBpcG5ldGNvbmYuYwkJImlwIG5ldGNvbmYiLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CU5pY29sYXMgRGljaHRlbCwgPG5pY29sYXMuZGljaHRlbEA2d2luZC5jb20+CisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgImlwX2NvbW1vbi5oIgorCitzdGF0aWMgc3RydWN0Cit7CisJaW50IGZhbWlseTsKKwlpbnQgaWZpbmRleDsKK30gZmlsdGVyOworCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGlwIG5ldGNvbmYgc2hvdyBbIGRldiBTVFJJTkcgXVxuIik7CisJZXhpdCgtMSk7Cit9CisKKyNkZWZpbmUgTkVUQ09ORl9SVEEocikJKChzdHJ1Y3QgcnRhdHRyKikoKChjaGFyKikocikpICsgTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBuZXRjb25mbXNnKSkpKQorCitpbnQgcHJpbnRfbmV0Y29uZihjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobywgc3RydWN0IHJ0bmxfY3RybF9kYXRhICpjdHJsLAorCQkgIHN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqYXJnKQoreworCUZJTEUgKmZwID0gKEZJTEUqKWFyZzsKKwlzdHJ1Y3QgbmV0Y29uZm1zZyAqbmNtID0gTkxNU0dfREFUQShuKTsKKwlpbnQgbGVuID0gbi0+bmxtc2dfbGVuOworCXN0cnVjdCBydGF0dHIgKnRiW05FVENPTkZBX01BWCsxXTsKKworCWlmIChuLT5ubG1zZ190eXBlID09IE5MTVNHX0VSUk9SKQorCQlyZXR1cm4gLTE7CisJaWYgKG4tPm5sbXNnX3R5cGUgIT0gUlRNX05FV05FVENPTkYpIHsKKwkJZnByaW50ZihzdGRlcnIsICJOb3QgUlRNX05FV05FVENPTkY6ICUwOHggJTA4eCAlMDh4XG4iLAorCQkJbi0+bmxtc2dfbGVuLCBuLT5ubG1zZ190eXBlLCBuLT5ubG1zZ19mbGFncyk7CisKKwkJcmV0dXJuIC0xOworCX0KKwlsZW4gLT0gTkxNU0dfU1BBQ0Uoc2l6ZW9mKCpuY20pKTsKKwlpZiAobGVuIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkJVRzogd3Jvbmcgbmxtc2cgbGVuICVkXG4iLCBsZW4pOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGZpbHRlci5mYW1pbHkgJiYgZmlsdGVyLmZhbWlseSAhPSBuY20tPm5jbV9mYW1pbHkpCisJCXJldHVybiAwOworCisJcGFyc2VfcnRhdHRyKHRiLCBORVRDT05GQV9NQVgsIE5FVENPTkZfUlRBKG5jbSksCisJCSAgICAgTkxNU0dfUEFZTE9BRChuLCBzaXplb2YoKm5jbSkpKTsKKworCXN3aXRjaCAobmNtLT5uY21fZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQlmcHJpbnRmKGZwLCAiaXB2NCAiKTsKKwkJYnJlYWs7CisJY2FzZSBBRl9JTkVUNjoKKwkJZnByaW50ZihmcCwgImlwdjYgIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZwcmludGYoZnAsICJ1bmtub3duICIpOworCQlicmVhazsKKwl9CisKKwlpZiAodGJbTkVUQ09ORkFfSUZJTkRFWF0pIHsKKwkJaW50ICppZmluZGV4ID0gKGludCAqKVJUQV9EQVRBKHRiW05FVENPTkZBX0lGSU5ERVhdKTsKKworCQlzd2l0Y2ggKCppZmluZGV4KSB7CisJCWNhc2UgTkVUQ09ORkFfSUZJTkRFWF9BTEw6CisJCQlmcHJpbnRmKGZwLCAiYWxsICIpOworCQkJYnJlYWs7CisJCWNhc2UgTkVUQ09ORkFfSUZJTkRFWF9ERUZBVUxUOgorCQkJZnByaW50ZihmcCwgImRlZmF1bHQgIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZwcmludGYoZnAsICJkZXYgJXMgIiwgbGxfaW5kZXhfdG9fbmFtZSgqaWZpbmRleCkpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAodGJbTkVUQ09ORkFfRk9SV0FSRElOR10pCisJCWZwcmludGYoZnAsICJmb3J3YXJkaW5nICVzICIsCisJCQkqKGludCAqKVJUQV9EQVRBKHRiW05FVENPTkZBX0ZPUldBUkRJTkddKT8ib24iOiJvZmYiKTsKKwlpZiAodGJbTkVUQ09ORkFfUlBfRklMVEVSXSkgeworCQlpbnQgcnBfZmlsdGVyID0gKihpbnQgKilSVEFfREFUQSh0YltORVRDT05GQV9SUF9GSUxURVJdKTsKKworCQlpZiAocnBfZmlsdGVyID09IDApCisJCQlmcHJpbnRmKGZwLCAicnBfZmlsdGVyIG9mZiAiKTsKKwkJZWxzZSBpZiAocnBfZmlsdGVyID09IDEpCisJCQlmcHJpbnRmKGZwLCAicnBfZmlsdGVyIHN0cmljdCAiKTsKKwkJZWxzZSBpZiAocnBfZmlsdGVyID09IDIpCisJCQlmcHJpbnRmKGZwLCAicnBfZmlsdGVyIGxvb3NlICIpOworCQllbHNlCisJCQlmcHJpbnRmKGZwLCAicnBfZmlsdGVyIHVua25vd24gbW9kZSAiKTsKKwl9CisJaWYgKHRiW05FVENPTkZBX01DX0ZPUldBUkRJTkddKQorCQlmcHJpbnRmKGZwLCAibWNfZm9yd2FyZGluZyAlZCAiLAorCQkJKihpbnQgKilSVEFfREFUQSh0YltORVRDT05GQV9NQ19GT1JXQVJESU5HXSkpOworCisJaWYgKHRiW05FVENPTkZBX1BST1hZX05FSUdIXSkKKwkJZnByaW50ZihmcCwgInByb3h5X25laWdoICVzICIsCisJCQkqKGludCAqKVJUQV9EQVRBKHRiW05FVENPTkZBX1BST1hZX05FSUdIXSk/Im9uIjoib2ZmIik7CisKKwlmcHJpbnRmKGZwLCAiXG4iKTsKKwlmZmx1c2goZnApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByaW50X25ldGNvbmYyKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLAorCQkJICBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZykKK3sKKwlyZXR1cm4gcHJpbnRfbmV0Y29uZih3aG8sIE5VTEwsIG4sIGFyZyk7Cit9CisKK3ZvaWQgaXBuZXRjb25mX3Jlc2V0X2ZpbHRlcihpbnQgaWZpbmRleCkKK3sKKwltZW1zZXQoJmZpbHRlciwgMCwgc2l6ZW9mKGZpbHRlcikpOworCWZpbHRlci5pZmluZGV4ID0gaWZpbmRleDsKK30KKworc3RhdGljIGludCBkb19zaG93KGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgbmxtc2doZHIJCW47CisJCXN0cnVjdCBuZXRjb25mbXNnCW5jbTsKKwkJY2hhcgkJCWJ1ZlsxMDI0XTsKKwl9IHJlcTsKKworCWlwbmV0Y29uZl9yZXNldF9maWx0ZXIoMCk7CisJZmlsdGVyLmZhbWlseSA9IHByZWZlcnJlZF9mYW1pbHk7CisJaWYgKGZpbHRlci5mYW1pbHkgPT0gQUZfVU5TUEVDKQorCQlmaWx0ZXIuZmFtaWx5ID0gQUZfSU5FVDsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAoc3RyY21wKCphcmd2LCAiZGV2IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWZpbHRlci5pZmluZGV4ID0gbGxfbmFtZV90b19pbmRleCgqYXJndik7CisJCQlpZiAoZmlsdGVyLmlmaW5kZXggPD0gMCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiRGV2aWNlIFwiJXNcIiBkb2VzIG5vdCBleGlzdC5cbiIsCisJCQkJCSphcmd2KTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJYXJndisrOyBhcmdjLS07CisJfQorCisJbGxfaW5pdF9tYXAoJnJ0aCk7CisJaWYgKGZpbHRlci5pZmluZGV4KSB7CisJCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisJCXJlcS5uLm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IG5ldGNvbmZtc2cpKTsKKwkJcmVxLm4ubmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUfE5MTV9GX0FDSzsKKwkJcmVxLm4ubmxtc2dfdHlwZSA9IFJUTV9HRVRORVRDT05GOworCQlyZXEubmNtLm5jbV9mYW1pbHkgPSBmaWx0ZXIuZmFtaWx5OworCQlpZiAoZmlsdGVyLmlmaW5kZXgpCisJCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgTkVUQ09ORkFfSUZJTkRFWCwKKwkJCQkgICZmaWx0ZXIuaWZpbmRleCwgc2l6ZW9mKGZpbHRlci5pZmluZGV4KSk7CisKKwkJaWYgKHJ0bmxfc2VuZCgmcnRoLCAmcmVxLm4sIHJlcS5uLm5sbXNnX2xlbikgPCAwKSB7CisJCQlwZXJyb3IoIkNhbiBub3Qgc2VuZCByZXF1ZXN0Iik7CisJCQlleGl0KDEpOworCQl9CisJCXJ0bmxfbGlzdGVuKCZydGgsIHByaW50X25ldGNvbmYsIHN0ZG91dCk7CisJfSBlbHNlIHsKK2R1bXA6CisJCWlmIChydG5sX3dpbGRkdW1wX3JlcXVlc3QoJnJ0aCwgZmlsdGVyLmZhbWlseSwgUlRNX0dFVE5FVENPTkYpIDwgMCkgeworCQkJcGVycm9yKCJDYW5ub3Qgc2VuZCBkdW1wIHJlcXVlc3QiKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJaWYgKHJ0bmxfZHVtcF9maWx0ZXIoJnJ0aCwgcHJpbnRfbmV0Y29uZjIsIHN0ZG91dCkgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkR1bXAgdGVybWluYXRlZFxuIik7CisJCQlleGl0KDEpOworCQl9CisJCWlmIChwcmVmZXJyZWRfZmFtaWx5ID09IEFGX1VOU1BFQykgeworCQkJcHJlZmVycmVkX2ZhbWlseSA9IEFGX0lORVQ2OworCQkJZmlsdGVyLmZhbWlseSA9IEFGX0lORVQ2OworCQkJZ290byBkdW1wOworCQl9CisJfQorCXJldHVybiAwOworfQorCitpbnQgZG9faXBuZXRjb25mKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpZiAoYXJnYyA+IDApIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJzaG93IikgPT0gMCB8fAorCQkgICAgbWF0Y2hlcygqYXJndiwgImxzdCIpID09IDAgfHwKKwkJICAgIG1hdGNoZXMoKmFyZ3YsICJsaXN0IikgPT0gMCkKKwkJCXJldHVybiBkb19zaG93KGFyZ2MtMSwgYXJndisxKTsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkKKwkJCXVzYWdlKCk7CisJfSBlbHNlCisJCXJldHVybiBkb19zaG93KDAsIE5VTEwpOworCisJZnByaW50ZihzdGRlcnIsICJDb21tYW5kIFwiJXNcIiBpcyB1bmtub3duLCB0cnkgXCJpcCBuZXRjb25mIGhlbHBcIi5cbiIsICphcmd2KTsKKwlleGl0KC0xKTsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2lwL2lwbmV0bnMuYyBiL2lwcm91dGUyL2lwL2lwbmV0bnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODgwOTZmCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaXAvaXBuZXRucy5jCkBAIC0wLDAgKzEsODE0IEBACisjZGVmaW5lIF9BVEZJTEVfU09VUkNFCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5cy9pbm90aWZ5Lmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNjaGVkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRfbmFtZXNwYWNlLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgImhsaXN0LmgiCisjaW5jbHVkZSAiaXBfY29tbW9uLmgiCisjaW5jbHVkZSAibmFtZXNwYWNlLmgiCisKK3N0YXRpYyBpbnQgdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBpcCBuZXRucyBsaXN0XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBpcCBuZXRucyBhZGQgTkFNRVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgaXAgbmV0bnMgc2V0IE5BTUUgTkVUTlNJRFxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgaXAgWy1hbGxdIG5ldG5zIGRlbGV0ZSBbTkFNRV1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgIGlwIG5ldG5zIGlkZW50aWZ5IFtQSURdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBpcCBuZXRucyBwaWRzIE5BTUVcbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgIGlwIFstYWxsXSBuZXRucyBleGVjIFtOQU1FXSBjbWQgLi4uXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBpcCBuZXRucyBtb25pdG9yXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBpcCBuZXRucyBsaXN0LWlkXG4iKTsKKwlleGl0KC0xKTsKK30KKworLyogVGhpcyBzb2NrZXQgaXMgdXNlZCB0byBnZXQgbnNpZCAqLworc3RhdGljIHN0cnVjdCBydG5sX2hhbmRsZSBydG5zaCA9IHsgLmZkID0gLTEgfTsKKworc3RhdGljIGludCBoYXZlX3J0bmxfZ2V0bnNpZCA9IC0xOworCitzdGF0aWMgaW50IGlwbmV0bnNfYWNjZXB0X21zZyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobywKKwkJCSAgICAgIHN0cnVjdCBydG5sX2N0cmxfZGF0YSAqY3RybCwKKwkJCSAgICAgIHN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBubG1zZ2VyciAqZXJyID0gKHN0cnVjdCBubG1zZ2VyciAqKU5MTVNHX0RBVEEobik7CisKKwlpZiAobi0+bmxtc2dfdHlwZSA9PSBOTE1TR19FUlJPUiAmJgorCSAgICAoZXJyLT5lcnJvciA9PSAtRU9QTk9UU1VQUCB8fCBlcnItPmVycm9yID09IC1FSU5WQUwpKQorCQloYXZlX3J0bmxfZ2V0bnNpZCA9IDA7CisJZWxzZQorCQloYXZlX3J0bmxfZ2V0bnNpZCA9IDE7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGlwbmV0bnNfaGF2ZV9uc2lkKHZvaWQpCit7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyIG47CisJCXN0cnVjdCBydGdlbm1zZyBnOworCQljaGFyICAgICAgICAgICAgYnVmWzEwMjRdOworCX0gcmVxOworCWludCBmZDsKKworCWlmIChoYXZlX3J0bmxfZ2V0bnNpZCA8IDApIHsKKwkJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKwkJcmVxLm4ubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgcnRnZW5tc2cpKTsKKwkJcmVxLm4ubmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUOworCQlyZXEubi5ubG1zZ190eXBlID0gUlRNX0dFVE5TSUQ7CisJCXJlcS5nLnJ0Z2VuX2ZhbWlseSA9IEFGX1VOU1BFQzsKKworCQlmZCA9IG9wZW4oIi9wcm9jL3NlbGYvbnMvbmV0IiwgT19SRE9OTFkpOworCQlpZiAoZmQgPCAwKSB7CisJCQlwZXJyb3IoIm9wZW4oXCIvcHJvYy9zZWxmL25zL25ldFwiKSIpOworCQkJZXhpdCgxKTsKKwkJfQorCisJCWFkZGF0dHIzMigmcmVxLm4sIDEwMjQsIE5FVE5TQV9GRCwgZmQpOworCisJCWlmIChydG5sX3NlbmQoJnJ0aCwgJnJlcS5uLCByZXEubi5ubG1zZ19sZW4pIDwgMCkgeworCQkJcGVycm9yKCJyZXF1ZXN0IHNlbmQgZmFpbGVkIik7CisJCQlleGl0KDEpOworCQl9CisJCXJ0bmxfbGlzdGVuKCZydGgsIGlwbmV0bnNfYWNjZXB0X21zZywgTlVMTCk7CisJCWNsb3NlKGZkKTsKKwl9CisKKwlyZXR1cm4gaGF2ZV9ydG5sX2dldG5zaWQ7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X25ldG5zaWRfZnJvbV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyIG47CisJCXN0cnVjdCBydGdlbm1zZyBnOworCQljaGFyICAgICAgICAgICAgYnVmWzEwMjRdOworCX0gcmVxLCBhbnN3ZXI7CisJc3RydWN0IHJ0YXR0ciAqdGJbTkVUTlNBX01BWCArIDFdOworCXN0cnVjdCBydGdlbm1zZyAqcnRoZHI7CisJaW50IGxlbiwgZmQ7CisKKwltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCXJlcS5uLm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IHJ0Z2VubXNnKSk7CisJcmVxLm4ubmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUOworCXJlcS5uLm5sbXNnX3R5cGUgPSBSVE1fR0VUTlNJRDsKKwlyZXEuZy5ydGdlbl9mYW1pbHkgPSBBRl9VTlNQRUM7CisKKwlmZCA9IG5ldG5zX2dldF9mZChuYW1lKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gZmQ7CisKKwlhZGRhdHRyMzIoJnJlcS5uLCAxMDI0LCBORVROU0FfRkQsIGZkKTsKKwlpZiAocnRubF90YWxrKCZydG5zaCwgJnJlcS5uLCAmYW5zd2VyLm4sIHNpemVvZihhbnN3ZXIpKSA8IDApIHsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gLTI7CisJfQorCWNsb3NlKGZkKTsKKworCS8qIFZhbGlkYXRlIG1lc3NhZ2UgYW5kIHBhcnNlIGF0dHJpYnV0ZXMgKi8KKwlpZiAoYW5zd2VyLm4ubmxtc2dfdHlwZSA9PSBOTE1TR19FUlJPUikKKwkJcmV0dXJuIC0xOworCisJcnRoZHIgPSBOTE1TR19EQVRBKCZhbnN3ZXIubik7CisJbGVuID0gYW5zd2VyLm4ubmxtc2dfbGVuIC0gTkxNU0dfU1BBQ0Uoc2l6ZW9mKCpydGhkcikpOworCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gLTE7CisKKwlwYXJzZV9ydGF0dHIodGIsIE5FVE5TQV9NQVgsIE5FVE5TX1JUQShydGhkciksIGxlbik7CisKKwlpZiAodGJbTkVUTlNBX05TSURdKQorCQlyZXR1cm4gcnRhX2dldGF0dHJfdTMyKHRiW05FVE5TQV9OU0lEXSk7CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0cnVjdCBuc2lkX2NhY2hlIHsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZQluc2lkX2hhc2g7CisJc3RydWN0IGhsaXN0X25vZGUJbmFtZV9oYXNoOworCWludAkJCW5zaWQ7CisJY2hhcgkJCW5hbWVbMF07Cit9OworCisjZGVmaW5lIE5TSURNQVBfU0laRQkJMTI4CisjZGVmaW5lIE5TSURfSEFTSF9OU0lEKG5zaWQpCShuc2lkICYgKE5TSURNQVBfU0laRSAtIDEpKQorI2RlZmluZSBOU0lEX0hBU0hfTkFNRShuYW1lKQkobmFtZWhhc2gobmFtZSkgJiAoTlNJRE1BUF9TSVpFIC0gMSkpCisKK3N0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZAluc2lkX2hlYWRbTlNJRE1BUF9TSVpFXTsKK3N0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZAluYW1lX2hlYWRbTlNJRE1BUF9TSVpFXTsKKworc3RhdGljIHN0cnVjdCBuc2lkX2NhY2hlICpuZXRuc19tYXBfZ2V0X2J5X25zaWQoaW50IG5zaWQpCit7CisJdWludDMyX3QgaCA9IE5TSURfSEFTSF9OU0lEKG5zaWQpOworCXN0cnVjdCBobGlzdF9ub2RlICpuOworCisJaGxpc3RfZm9yX2VhY2gobiwgJm5zaWRfaGVhZFtoXSkgeworCQlzdHJ1Y3QgbnNpZF9jYWNoZSAqYyA9IGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgbnNpZF9jYWNoZSwKKwkJCQkJCSAgICBuc2lkX2hhc2gpOworCQlpZiAoYy0+bnNpZCA9PSBuc2lkKQorCQkJcmV0dXJuIGM7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgbmV0bnNfbWFwX2FkZChpbnQgbnNpZCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbnNpZF9jYWNoZSAqYzsKKwl1aW50MzJfdCBoOworCisJaWYgKG5ldG5zX21hcF9nZXRfYnlfbnNpZChuc2lkKSAhPSBOVUxMKQorCQlyZXR1cm4gLUVFWElTVDsKKworCWMgPSBtYWxsb2Moc2l6ZW9mKCpjKSArIHN0cmxlbihuYW1lKSk7CisJaWYgKGMgPT0gTlVMTCkgeworCQlwZXJyb3IoIm1hbGxvYyIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJYy0+bnNpZCA9IG5zaWQ7CisJc3RyY3B5KGMtPm5hbWUsIG5hbWUpOworCisJaCA9IE5TSURfSEFTSF9OU0lEKG5zaWQpOworCWhsaXN0X2FkZF9oZWFkKCZjLT5uc2lkX2hhc2gsICZuc2lkX2hlYWRbaF0pOworCisJaCA9IE5TSURfSEFTSF9OQU1FKG5hbWUpOworCWhsaXN0X2FkZF9oZWFkKCZjLT5uYW1lX2hhc2gsICZuYW1lX2hlYWRbaF0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG5ldG5zX21hcF9kZWwoc3RydWN0IG5zaWRfY2FjaGUgKmMpCit7CisJaGxpc3RfZGVsKCZjLT5uYW1lX2hhc2gpOworCWhsaXN0X2RlbCgmYy0+bnNpZF9oYXNoKTsKKwlmcmVlKGMpOworfQorCit2b2lkIG5ldG5zX21hcF9pbml0KHZvaWQpCit7CisJc3RhdGljIGludCBpbml0aWFsaXplZDsKKwlzdHJ1Y3QgZGlyZW50ICplbnRyeTsKKwlESVIgKmRpcjsKKwlpbnQgbnNpZDsKKworCWlmIChpbml0aWFsaXplZCB8fCAhaXBuZXRuc19oYXZlX25zaWQoKSkKKwkJcmV0dXJuOworCisJaWYgKHJ0bmxfb3BlbigmcnRuc2gsIDApIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBvcGVuIHJ0bmV0bGlua1xuIik7CisJCWV4aXQoMSk7CisJfQorCisJZGlyID0gb3BlbmRpcihORVROU19SVU5fRElSKTsKKwlpZiAoIWRpcikKKwkJcmV0dXJuOworCisJd2hpbGUgKChlbnRyeSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKGVudHJ5LT5kX25hbWUsICIuIikgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoc3RyY21wKGVudHJ5LT5kX25hbWUsICIuLiIpID09IDApCisJCQljb250aW51ZTsKKwkJbnNpZCA9IGdldF9uZXRuc2lkX2Zyb21fbmFtZShlbnRyeS0+ZF9uYW1lKTsKKworCQlpZiAobnNpZCA+PSAwKQorCQkJbmV0bnNfbWFwX2FkZChuc2lkLCBlbnRyeS0+ZF9uYW1lKTsKKwl9CisJY2xvc2VkaXIoZGlyKTsKKwlpbml0aWFsaXplZCA9IDE7Cit9CisKK3N0YXRpYyBpbnQgbmV0bnNfZ2V0X25hbWUoaW50IG5zaWQsIGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGRpcmVudCAqZW50cnk7CisJRElSICpkaXI7CisJaW50IGlkOworCisJZGlyID0gb3BlbmRpcihORVROU19SVU5fRElSKTsKKwlpZiAoIWRpcikKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwl3aGlsZSAoKGVudHJ5ID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCWlmIChzdHJjbXAoZW50cnktPmRfbmFtZSwgIi4iKSA9PSAwKQorCQkJY29udGludWU7CisJCWlmIChzdHJjbXAoZW50cnktPmRfbmFtZSwgIi4uIikgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZCA9IGdldF9uZXRuc2lkX2Zyb21fbmFtZShlbnRyeS0+ZF9uYW1lKTsKKworCQlpZiAobnNpZCA9PSBpZCkgeworCQkJc3RyY3B5KG5hbWUsIGVudHJ5LT5kX25hbWUpOworCQkJY2xvc2VkaXIoZGlyKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWNsb3NlZGlyKGRpcik7CisJcmV0dXJuIC1FTk9FTlQ7Cit9CisKK2ludCBwcmludF9uc2lkKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcnRnZW5tc2cgKnJ0aGRyID0gTkxNU0dfREFUQShuKTsKKwlzdHJ1Y3QgcnRhdHRyICp0YltORVROU0FfTUFYKzFdOworCWludCBsZW4gPSBuLT5ubG1zZ19sZW47CisJRklMRSAqZnAgPSAoRklMRSAqKWFyZzsKKwlzdHJ1Y3QgbnNpZF9jYWNoZSAqYzsKKwljaGFyIG5hbWVbTkFNRV9NQVhdOworCWludCBuc2lkOworCisJaWYgKG4tPm5sbXNnX3R5cGUgIT0gUlRNX05FV05TSUQgJiYgbi0+bmxtc2dfdHlwZSAhPSBSVE1fREVMTlNJRCkKKwkJcmV0dXJuIDA7CisKKwlsZW4gLT0gTkxNU0dfU1BBQ0Uoc2l6ZW9mKCpydGhkcikpOworCWlmIChsZW4gPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQlVHOiB3cm9uZyBubG1zZyBsZW4gJWQgaW4gJXNcbiIsIGxlbiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXBhcnNlX3J0YXR0cih0YiwgTkVUTlNBX01BWCwgTkVUTlNfUlRBKHJ0aGRyKSwgbGVuKTsKKwlpZiAodGJbTkVUTlNBX05TSURdID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJCVUc6IE5FVE5TQV9OU0lEIGlzIG1pc3NpbmcgJXNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChuLT5ubG1zZ190eXBlID09IFJUTV9ERUxOU0lEKQorCQlmcHJpbnRmKGZwLCAiRGVsZXRlZCAiKTsKKworCW5zaWQgPSBydGFfZ2V0YXR0cl91MzIodGJbTkVUTlNBX05TSURdKTsKKwlmcHJpbnRmKGZwLCAibnNpZCAldSAiLCBuc2lkKTsKKworCWMgPSBuZXRuc19tYXBfZ2V0X2J5X25zaWQobnNpZCk7CisJaWYgKGMgIT0gTlVMTCkgeworCQlmcHJpbnRmKGZwLCAiKGlwcm91dGUyIG5ldG5zIG5hbWU6ICVzKSIsIGMtPm5hbWUpOworCQluZXRuc19tYXBfZGVsKGMpOworCX0KKworCS8qIER1cmluZyAnaXAgbW9uaXRvciBuc2lkJywgbm8gY2hhbmNlIHRvIGhhdmUgbmV3IG5zaWQgaW4gY2FjaGUuICovCisJaWYgKGMgPT0gTlVMTCAmJiBuLT5ubG1zZ190eXBlID09IFJUTV9ORVdOU0lEKQorCQlpZiAobmV0bnNfZ2V0X25hbWUobnNpZCwgbmFtZSkgPT0gMCkgeworCQkJZnByaW50ZihmcCwgIihpcHJvdXRlMiBuZXRucyBuYW1lOiAlcykiLCBuYW1lKTsKKwkJCW5ldG5zX21hcF9hZGQobnNpZCwgbmFtZSk7CisJCX0KKworCWZwcmludGYoZnAsICJcbiIpOworCWZmbHVzaChmcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmV0bnNfbGlzdF9pZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaWYgKCFpcG5ldG5zX2hhdmVfbnNpZCgpKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIlJUTV9HRVROU0lEIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGtlcm5lbC5cbiIpOworCQlyZXR1cm4gLUVOT1RTVVA7CisJfQorCisJaWYgKHJ0bmxfd2lsZGR1bXBfcmVxdWVzdCgmcnRoLCBBRl9VTlNQRUMsIFJUTV9HRVROU0lEKSA8IDApIHsKKwkJcGVycm9yKCJDYW5ub3Qgc2VuZCBkdW1wIHJlcXVlc3QiKTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKHJ0bmxfZHVtcF9maWx0ZXIoJnJ0aCwgcHJpbnRfbnNpZCwgc3Rkb3V0KSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJEdW1wIHRlcm1pbmF0ZWRcbiIpOworCQlleGl0KDEpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXRuc19saXN0KGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgZGlyZW50ICplbnRyeTsKKwlESVIgKmRpcjsKKwlpbnQgaWQ7CisKKwlkaXIgPSBvcGVuZGlyKE5FVE5TX1JVTl9ESVIpOworCWlmICghZGlyKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICgoZW50cnkgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKKwkJaWYgKHN0cmNtcChlbnRyeS0+ZF9uYW1lLCAiLiIpID09IDApCisJCQljb250aW51ZTsKKwkJaWYgKHN0cmNtcChlbnRyeS0+ZF9uYW1lLCAiLi4iKSA9PSAwKQorCQkJY29udGludWU7CisJCXByaW50ZigiJXMiLCBlbnRyeS0+ZF9uYW1lKTsKKwkJaWYgKGlwbmV0bnNfaGF2ZV9uc2lkKCkpIHsKKwkJCWlkID0gZ2V0X25ldG5zaWRfZnJvbV9uYW1lKGVudHJ5LT5kX25hbWUpOworCQkJaWYgKGlkID49IDApCisJCQkJcHJpbnRmKCIgKGlkOiAlZCkiLCBpZCk7CisJCX0KKwkJcHJpbnRmKCJcbiIpOworCX0KKwljbG9zZWRpcihkaXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNtZF9leGVjKGNvbnN0IGNoYXIgKmNtZCwgY2hhciAqKmFyZ3YsIGJvb2wgZG9fZm9yaykKK3sKKwlmZmx1c2goc3Rkb3V0KTsKKwlpZiAoZG9fZm9yaykgeworCQlpbnQgc3RhdHVzOworCQlwaWRfdCBwaWQ7CisKKwkJcGlkID0gZm9yaygpOworCQlpZiAocGlkIDwgMCkgeworCQkJcGVycm9yKCJmb3JrIik7CisJCQlleGl0KDEpOworCQl9CisKKwkJaWYgKHBpZCAhPSAwKSB7CisJCQkvKiBQYXJlbnQgICovCisJCQlpZiAod2FpdHBpZChwaWQsICZzdGF0dXMsIDApIDwgMCkgeworCQkJCXBlcnJvcigid2FpdHBpZCIpOworCQkJCWV4aXQoMSk7CisJCQl9CisKKwkJCWlmIChXSUZFWElURUQoc3RhdHVzKSkgeworCQkJCXJldHVybiBXRVhJVFNUQVRVUyhzdGF0dXMpOworCQkJfQorCisJCQlleGl0KDEpOworCQl9CisJfQorCisJaWYgKGV4ZWN2cChjbWQsIGFyZ3YpICA8IDApCisJCWZwcmludGYoc3RkZXJyLCAiZXhlYyBvZiBcIiVzXCIgZmFpbGVkOiAlc1xuIiwKKwkJCQljbWQsIHN0cmVycm9yKGVycm5vKSk7CisJX2V4aXQoMSk7Cit9CisKK3N0YXRpYyBpbnQgb25fbmV0bnNfZXhlYyhjaGFyICpuc25hbWUsIHZvaWQgKmFyZykKK3sKKwljaGFyICoqYXJndiA9IGFyZzsKKwljbWRfZXhlYyhhcmd2WzFdLCBhcmd2ICsgMSwgdHJ1ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmV0bnNfZXhlYyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJLyogU2V0dXAgdGhlIHByb3BlciBlbnZpcm9ubWVudCBmb3IgYXBwcyB0aGF0IGFyZSBub3QgbmV0bnMKKwkgKiBhd2FyZSwgYW5kIGV4ZWN1dGUgYSBwcm9ncmFtIGluIHRoYXQgZW52aXJvbm1lbnQuCisJICovCisJY29uc3QgY2hhciAqY21kOworCisJaWYgKGFyZ2MgPCAxICYmICFkb19hbGwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJObyBuZXRucyBuYW1lIHNwZWNpZmllZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKChhcmdjIDwgMiAmJiAhZG9fYWxsKSB8fCAoYXJnYyA8IDEgJiYgZG9fYWxsKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vIGNvbW1hbmQgc3BlY2lmaWVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChkb19hbGwpCisJCXJldHVybiBkb19lYWNoX25ldG5zKG9uX25ldG5zX2V4ZWMsIC0tYXJndiwgMSk7CisKKwlpZiAobmV0bnNfc3dpdGNoKGFyZ3ZbMF0pKQorCQlyZXR1cm4gLTE7CisKKwkvKiBpcCBtdXN0IHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSBjaGlsZCwKKwkgKiBidXQgZG9fY21kKCkgd2lsbCBhZGQgYSBtaW51cyB0byB0aGlzLAorCSAqIHNvIGxldCdzIGFkZCBhbm90aGVyIG9uZSBoZXJlIHRvIGNhbmNlbCBpdC4KKwkgKi8KKwljbWQgPSBhcmd2WzFdOworCXJldHVybiAtY21kX2V4ZWMoY21kLCBhcmd2ICsgMSwgISFiYXRjaF9tb2RlKTsKK30KKworc3RhdGljIGludCBpc19waWQoY29uc3QgY2hhciAqc3RyKQoreworCWludCBjaDsKKwlmb3IgKDsgKGNoID0gKnN0cik7IHN0cisrKSB7CisJCWlmICghaXNkaWdpdChjaCkpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbmV0bnNfcGlkcyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqbmFtZTsKKwljaGFyIG5ldF9wYXRoW1BBVEhfTUFYXTsKKwlpbnQgbmV0bnM7CisJc3RydWN0IHN0YXQgbmV0c3Q7CisJRElSICpkaXI7CisJc3RydWN0IGRpcmVudCAqZW50cnk7CisKKwlpZiAoYXJnYyA8IDEpIHsKKwkJZnByaW50ZihzdGRlcnIsICJObyBuZXRucyBuYW1lIHNwZWNpZmllZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKGFyZ2MgPiAxKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXh0cmEgYXJndW1lbnRzIHNwZWNpZmllZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwluYW1lID0gYXJndlswXTsKKwlzbnByaW50ZihuZXRfcGF0aCwgc2l6ZW9mKG5ldF9wYXRoKSwgIiVzLyVzIiwgTkVUTlNfUlVOX0RJUiwgbmFtZSk7CisJbmV0bnMgPSBvcGVuKG5ldF9wYXRoLCBPX1JET05MWSk7CisJaWYgKG5ldG5zIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBvcGVuIG5ldHdvcmsgbmFtZXNwYWNlOiAlc1xuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKGZzdGF0KG5ldG5zLCAmbmV0c3QpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlN0YXQgb2YgbmV0bnMgZmFpbGVkOiAlc1xuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisJZGlyID0gb3BlbmRpcigiL3Byb2MvIik7CisJaWYgKCFkaXIpIHsKKwkJZnByaW50ZihzdGRlcnIsICJPcGVuIG9mIC9wcm9jIGZhaWxlZDogJXNcbiIsCisJCQlzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCXdoaWxlKChlbnRyeSA9IHJlYWRkaXIoZGlyKSkpIHsKKwkJY2hhciBwaWRfbmV0X3BhdGhbUEFUSF9NQVhdOworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJaWYgKCFpc19waWQoZW50cnktPmRfbmFtZSkpCisJCQljb250aW51ZTsKKwkJc25wcmludGYocGlkX25ldF9wYXRoLCBzaXplb2YocGlkX25ldF9wYXRoKSwgIi9wcm9jLyVzL25zL25ldCIsCisJCQllbnRyeS0+ZF9uYW1lKTsKKwkJaWYgKHN0YXQocGlkX25ldF9wYXRoLCAmc3QpICE9IDApCisJCQljb250aW51ZTsKKwkJaWYgKChzdC5zdF9kZXYgPT0gbmV0c3Quc3RfZGV2KSAmJgorCQkgICAgKHN0LnN0X2lubyA9PSBuZXRzdC5zdF9pbm8pKSB7CisJCQlwcmludGYoIiVzXG4iLCBlbnRyeS0+ZF9uYW1lKTsKKwkJfQorCX0KKwljbG9zZWRpcihkaXIpOworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQgbmV0bnNfaWRlbnRpZnkoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKnBpZHN0cjsKKwljaGFyIG5ldF9wYXRoW1BBVEhfTUFYXTsKKwlpbnQgbmV0bnM7CisJc3RydWN0IHN0YXQgbmV0c3Q7CisJRElSICpkaXI7CisJc3RydWN0IGRpcmVudCAqZW50cnk7CisKKwlpZiAoYXJnYyA8IDEpIHsKKwkJcGlkc3RyID0gInNlbGYiOworCX0gZWxzZSBpZiAoYXJnYyA+IDEpIHsKKwkJZnByaW50ZihzdGRlcnIsICJleHRyYSBhcmd1bWVudHMgc3BlY2lmaWVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0gZWxzZSB7CisJCXBpZHN0ciA9IGFyZ3ZbMF07CisJCWlmICghaXNfcGlkKHBpZHN0cikpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiU3BlY2lmaWVkIHN0cmluZyAnJXMnIGlzIG5vdCBhIHBpZFxuIiwKKwkJCQkJcGlkc3RyKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXNucHJpbnRmKG5ldF9wYXRoLCBzaXplb2YobmV0X3BhdGgpLCAiL3Byb2MvJXMvbnMvbmV0IiwgcGlkc3RyKTsKKwluZXRucyA9IG9wZW4obmV0X3BhdGgsIE9fUkRPTkxZKTsKKwlpZiAobmV0bnMgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9wZW4gbmV0d29yayBuYW1lc3BhY2U6ICVzXG4iLAorCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoZnN0YXQobmV0bnMsICZuZXRzdCkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiU3RhdCBvZiBuZXRucyBmYWlsZWQ6ICVzXG4iLAorCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKwlkaXIgPSBvcGVuZGlyKE5FVE5TX1JVTl9ESVIpOworCWlmICghZGlyKSB7CisJCS8qIFN1Y2NlZWQgdHJlYXQgYSBtaXNzaW5nIGRpcmVjdG9yeSBhcyBhbiBlbXB0eSBkaXJlY3RvcnkgKi8KKwkJaWYgKGVycm5vID09IEVOT0VOVCkKKwkJCXJldHVybiAwOworCisJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIG9wZW4gZGlyZWN0b3J5ICVzOiVzXG4iLAorCQkJTkVUTlNfUlVOX0RJUiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXdoaWxlKChlbnRyeSA9IHJlYWRkaXIoZGlyKSkpIHsKKwkJY2hhciBuYW1lX3BhdGhbUEFUSF9NQVhdOworCQlzdHJ1Y3Qgc3RhdCBzdDsKKworCQlpZiAoc3RyY21wKGVudHJ5LT5kX25hbWUsICIuIikgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoc3RyY21wKGVudHJ5LT5kX25hbWUsICIuLiIpID09IDApCisJCQljb250aW51ZTsKKworCQlzbnByaW50ZihuYW1lX3BhdGgsIHNpemVvZihuYW1lX3BhdGgpLCAiJXMvJXMiLAlORVROU19SVU5fRElSLAorCQkJZW50cnktPmRfbmFtZSk7CisKKwkJaWYgKHN0YXQobmFtZV9wYXRoLCAmc3QpICE9IDApCisJCQljb250aW51ZTsKKworCQlpZiAoKHN0LnN0X2RldiA9PSBuZXRzdC5zdF9kZXYpICYmCisJCSAgICAoc3Quc3RfaW5vID09IG5ldHN0LnN0X2lubykpIHsKKwkJCXByaW50ZigiJXNcbiIsIGVudHJ5LT5kX25hbWUpOworCQl9CisJfQorCWNsb3NlZGlyKGRpcik7CisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIGludCBvbl9uZXRuc19kZWwoY2hhciAqbnNuYW1lLCB2b2lkICphcmcpCit7CisJY2hhciBuZXRuc19wYXRoW1BBVEhfTUFYXTsKKworCXNucHJpbnRmKG5ldG5zX3BhdGgsIHNpemVvZihuZXRuc19wYXRoKSwgIiVzLyVzIiwgTkVUTlNfUlVOX0RJUiwgbnNuYW1lKTsKKwl1bW91bnQyKG5ldG5zX3BhdGgsIE1OVF9ERVRBQ0gpOworCWlmICh1bmxpbmsobmV0bnNfcGF0aCkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IHJlbW92ZSBuYW1lc3BhY2UgZmlsZSBcIiVzXCI6ICVzXG4iLAorCQkJbmV0bnNfcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXRuc19kZWxldGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWlmIChhcmdjIDwgMSAmJiAhZG9fYWxsKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm8gbmV0bnMgbmFtZSBzcGVjaWZpZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGRvX2FsbCkKKwkJcmV0dXJuIG5ldG5zX2ZvcmVhY2gob25fbmV0bnNfZGVsLCBOVUxMKTsKKworCXJldHVybiBvbl9uZXRuc19kZWwoYXJndlswXSwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgY3JlYXRlX25ldG5zX2Rpcih2b2lkKQoreworCS8qIENyZWF0ZSB0aGUgYmFzZSBuZXRucyBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBleGlzdCAqLworCWlmIChta2RpcihORVROU19SVU5fRElSLCBTX0lSV1hVfFNfSVJHUlB8U19JWEdSUHxTX0lST1RIfFNfSVhPVEgpKSB7CisJCWlmIChlcnJubyAhPSBFRVhJU1QpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAibWtkaXIgJXMgZmFpbGVkOiAlc1xuIiwKKwkJCQlORVROU19SVU5fRElSLCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmV0bnNfYWRkKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwkvKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBuZXcgbmV0d29yayBuYW1lc3BhY2UgYW5kCisJICogYSBuZXcgbW91bnQgbmFtZXNwYWNlIGFuZCBiaW5kIHRoZW0gaW50byBhIHdlbGwga25vd24KKwkgKiBsb2NhdGlvbiBpbiB0aGUgZmlsZXN5c3RlbSBiYXNlZCBvbiB0aGUgbmFtZSBwcm92aWRlZC4KKwkgKgorCSAqIFRoZSBtb3VudCBuYW1lc3BhY2UgaXMgY3JlYXRlZCBzbyB0aGF0IGFueSBuZWNlc3NhcnkKKwkgKiB1c2Vyc3BhY2UgdHdlYWtzIGxpa2UgcmVtb3VudGluZyAvc3lzLCBvciBiaW5kIG1vdW50aW5nCisJICogYSBuZXcgL2V0Yy9yZXNvbHYuY29uZiBjYW4gYmUgc2hhcmVkIGJldHdlZW4gdWVycy4KKwkgKi8KKwljaGFyIG5ldG5zX3BhdGhbUEFUSF9NQVhdOworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IGZkOworCWludCBtYWRlX25ldG5zX3J1bl9kaXJfbW91bnQgPSAwOworCisJaWYgKGFyZ2MgPCAxKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm8gbmV0bnMgbmFtZSBzcGVjaWZpZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCW5hbWUgPSBhcmd2WzBdOworCisJc25wcmludGYobmV0bnNfcGF0aCwgc2l6ZW9mKG5ldG5zX3BhdGgpLCAiJXMvJXMiLCBORVROU19SVU5fRElSLCBuYW1lKTsKKworCWlmIChjcmVhdGVfbmV0bnNfZGlyKCkpCisJCXJldHVybiAtMTsKKworCS8qIE1ha2UgaXQgcG9zc2libGUgZm9yIG5ldHdvcmsgbmFtZXNwYWNlIG1vdW50cyB0byBwcm9wYWdhdGUgYmV0d2VlbgorCSAqIG1vdW50IG5hbWVzcGFjZXMuICBUaGlzIG1ha2VzIGl0IGxpa2VseSB0aGF0IGEgdW5tb3VudGluZyBhIG5ldHdvcmsKKwkgKiBuYW1lc3BhY2UgZmlsZSBpbiBvbmUgbmFtZXNwYWNlIHdpbGwgdW5tb3VudCB0aGUgbmV0d29yayBuYW1lc3BhY2UKKwkgKiBmaWxlIGluIGFsbCBuYW1lc3BhY2VzIGFsbG93aW5nIHRoZSBuZXR3b3JrIG5hbWVzcGFjZSB0byBiZSBmcmVlZAorCSAqIHNvb25lci4KKwkgKi8KKwl3aGlsZSAobW91bnQoIiIsIE5FVE5TX1JVTl9ESVIsICJub25lIiwgTVNfU0hBUkVEIHwgTVNfUkVDLCBOVUxMKSkgeworCQkvKiBGYWlsIHVubGVzcyB3ZSBuZWVkIHRvIG1ha2UgdGhlIG1vdW50IHBvaW50ICovCisJCWlmIChlcnJubyAhPSBFSU5WQUwgfHwgbWFkZV9uZXRuc19ydW5fZGlyX21vdW50KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIm1vdW50IC0tbWFrZS1zaGFyZWQgJXMgZmFpbGVkOiAlc1xuIiwKKwkJCQlORVROU19SVU5fRElSLCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyogVXBncmFkZSBORVROU19SVU5fRElSIHRvIGEgbW91bnQgcG9pbnQgKi8KKwkJaWYgKG1vdW50KE5FVE5TX1JVTl9ESVIsIE5FVE5TX1JVTl9ESVIsICJub25lIiwgTVNfQklORCwgTlVMTCkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAibW91bnQgLS1iaW5kICVzICVzIGZhaWxlZDogJXNcbiIsCisJCQkJTkVUTlNfUlVOX0RJUiwgTkVUTlNfUlVOX0RJUiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQltYWRlX25ldG5zX3J1bl9kaXJfbW91bnQgPSAxOworCX0KKworCS8qIENyZWF0ZSB0aGUgZmlsZXN5c3RlbSBzdGF0ZSAqLworCWZkID0gb3BlbihuZXRuc19wYXRoLCBPX1JET05MWXxPX0NSRUFUfE9fRVhDTCwgMCk7CisJaWYgKGZkIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBjcmVhdGUgbmFtZXNwYWNlIGZpbGUgXCIlc1wiOiAlc1xuIiwKKwkJCW5ldG5zX3BhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisJY2xvc2UoZmQpOworCWlmICh1bnNoYXJlKENMT05FX05FV05FVCkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGNyZWF0ZSBhIG5ldyBuZXR3b3JrIG5hbWVzcGFjZSBcIiVzXCI6ICVzXG4iLAorCQkJbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBvdXRfZGVsZXRlOworCX0KKworCS8qIEJpbmQgdGhlIG5ldG5zIGxhc3Qgc28gSSBjYW4gd2F0Y2ggZm9yIGl0ICovCisJaWYgKG1vdW50KCIvcHJvYy9zZWxmL25zL25ldCIsIG5ldG5zX3BhdGgsICJub25lIiwgTVNfQklORCwgTlVMTCkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQmluZCAvcHJvYy9zZWxmL25zL25ldCAtPiAlcyBmYWlsZWQ6ICVzXG4iLAorCQkJbmV0bnNfcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBvdXRfZGVsZXRlOworCX0KKwlyZXR1cm4gMDsKK291dF9kZWxldGU6CisJbmV0bnNfZGVsZXRlKGFyZ2MsIGFyZ3YpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBzZXRfbmV0bnNpZF9mcm9tX25hbWUoY29uc3QgY2hhciAqbmFtZSwgaW50IG5zaWQpCit7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyIG47CisJCXN0cnVjdCBydGdlbm1zZyBnOworCQljaGFyICAgICAgICAgICAgYnVmWzEwMjRdOworCX0gcmVxOworCWludCBmZCwgZXJyID0gMDsKKworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisJcmVxLm4ubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgcnRnZW5tc2cpKTsKKwlyZXEubi5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1Q7CisJcmVxLm4ubmxtc2dfdHlwZSA9IFJUTV9ORVdOU0lEOworCXJlcS5nLnJ0Z2VuX2ZhbWlseSA9IEFGX1VOU1BFQzsKKworCWZkID0gbmV0bnNfZ2V0X2ZkKG5hbWUpOworCWlmIChmZCA8IDApCisJCXJldHVybiBmZDsKKworCWFkZGF0dHIzMigmcmVxLm4sIDEwMjQsIE5FVE5TQV9GRCwgZmQpOworCWFkZGF0dHIzMigmcmVxLm4sIDEwMjQsIE5FVE5TQV9OU0lELCBuc2lkKTsKKwlpZiAocnRubF90YWxrKCZydGgsICZyZXEubiwgTlVMTCwgMCkgPCAwKQorCQllcnIgPSAtMjsKKworCWNsb3NlKGZkKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG5ldG5zX3NldChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciBuZXRuc19wYXRoW1BBVEhfTUFYXTsKKwljb25zdCBjaGFyICpuYW1lOworCWludCBuZXRucywgbnNpZDsKKworCWlmIChhcmdjIDwgMSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vIG5ldG5zIG5hbWUgc3BlY2lmaWVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoYXJnYyA8IDIpIHsKKwkJZnByaW50ZihzdGRlcnIsICJObyBuc2lkIHNwZWNpZmllZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisJbmFtZSA9IGFyZ3ZbMF07CisJbnNpZCA9IGF0b2koYXJndlsxXSk7CisKKwlzbnByaW50ZihuZXRuc19wYXRoLCBzaXplb2YobmV0bnNfcGF0aCksICIlcy8lcyIsIE5FVE5TX1JVTl9ESVIsIG5hbWUpOworCW5ldG5zID0gb3BlbihuZXRuc19wYXRoLCBPX1JET05MWSB8IE9fQ0xPRVhFQyk7CisJaWYgKG5ldG5zIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBvcGVuIG5ldHdvcmsgbmFtZXNwYWNlIFwiJXNcIjogJXNcbiIsCisJCQluYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIHNldF9uZXRuc2lkX2Zyb21fbmFtZShuYW1lLCBuc2lkKTsKK30KKworc3RhdGljIGludCBuZXRuc19tb25pdG9yKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyIGJ1Zls0MDk2XTsKKwlzdHJ1Y3QgaW5vdGlmeV9ldmVudCAqZXZlbnQ7CisJaW50IGZkOworCWZkID0gaW5vdGlmeV9pbml0KCk7CisJaWYgKGZkIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImlub3RpZnlfaW5pdCBmYWlsZWQ6ICVzXG4iLAorCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChjcmVhdGVfbmV0bnNfZGlyKCkpCisJCXJldHVybiAtMTsKKworCWlmIChpbm90aWZ5X2FkZF93YXRjaChmZCwgTkVUTlNfUlVOX0RJUiwgSU5fQ1JFQVRFIHwgSU5fREVMRVRFKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJpbm90aWZ5X2FkZF93YXRjaCBmYWlsZWQ6ICVzXG4iLAorCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKwlmb3IoOzspIHsKKwkJc3NpemVfdCBsZW4gPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpKTsKKwkJaWYgKGxlbiA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAicmVhZCBmYWlsZWQ6ICVzXG4iLAorCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZm9yIChldmVudCA9IChzdHJ1Y3QgaW5vdGlmeV9ldmVudCAqKWJ1ZjsKKwkJICAgICAoY2hhciAqKWV2ZW50IDwgJmJ1ZltsZW5dOworCQkgICAgIGV2ZW50ID0gKHN0cnVjdCBpbm90aWZ5X2V2ZW50ICopKChjaGFyICopZXZlbnQgKyBzaXplb2YoKmV2ZW50KSArIGV2ZW50LT5sZW4pKSB7CisJCQlpZiAoZXZlbnQtPm1hc2sgJiBJTl9DUkVBVEUpCisJCQkJcHJpbnRmKCJhZGQgJXNcbiIsIGV2ZW50LT5uYW1lKTsKKwkJCWlmIChldmVudC0+bWFzayAmIElOX0RFTEVURSkKKwkJCQlwcmludGYoImRlbGV0ZSAlc1xuIiwgZXZlbnQtPm5hbWUpOworCQl9CisJfQorCXJldHVybiAwOworfQorCitpbnQgZG9fbmV0bnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCW5ldG5zX21hcF9pbml0KCk7CisKKwlpZiAoYXJnYyA8IDEpCisJCXJldHVybiBuZXRuc19saXN0KDAsIE5VTEwpOworCisJaWYgKChtYXRjaGVzKCphcmd2LCAibGlzdCIpID09IDApIHx8IChtYXRjaGVzKCphcmd2LCAic2hvdyIpID09IDApIHx8CisJICAgIChtYXRjaGVzKCphcmd2LCAibHN0IikgPT0gMCkpCisJCXJldHVybiBuZXRuc19saXN0KGFyZ2MtMSwgYXJndisxKTsKKworCWlmICgobWF0Y2hlcygqYXJndiwgImxpc3QtaWQiKSA9PSAwKSkKKwkJcmV0dXJuIG5ldG5zX2xpc3RfaWQoYXJnYy0xLCBhcmd2KzEpOworCisJaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkKKwkJcmV0dXJuIHVzYWdlKCk7CisKKwlpZiAobWF0Y2hlcygqYXJndiwgImFkZCIpID09IDApCisJCXJldHVybiBuZXRuc19hZGQoYXJnYy0xLCBhcmd2KzEpOworCisJaWYgKG1hdGNoZXMoKmFyZ3YsICJzZXQiKSA9PSAwKQorCQlyZXR1cm4gbmV0bnNfc2V0KGFyZ2MtMSwgYXJndisxKTsKKworCWlmIChtYXRjaGVzKCphcmd2LCAiZGVsZXRlIikgPT0gMCkKKwkJcmV0dXJuIG5ldG5zX2RlbGV0ZShhcmdjLTEsIGFyZ3YrMSk7CisKKwlpZiAobWF0Y2hlcygqYXJndiwgImlkZW50aWZ5IikgPT0gMCkKKwkJcmV0dXJuIG5ldG5zX2lkZW50aWZ5KGFyZ2MtMSwgYXJndisxKTsKKworCWlmIChtYXRjaGVzKCphcmd2LCAicGlkcyIpID09IDApCisJCXJldHVybiBuZXRuc19waWRzKGFyZ2MtMSwgYXJndisxKTsKKworCWlmIChtYXRjaGVzKCphcmd2LCAiZXhlYyIpID09IDApCisJCXJldHVybiBuZXRuc19leGVjKGFyZ2MtMSwgYXJndisxKTsKKworCWlmIChtYXRjaGVzKCphcmd2LCAibW9uaXRvciIpID09IDApCisJCXJldHVybiBuZXRuc19tb25pdG9yKGFyZ2MtMSwgYXJndisxKTsKKworCWZwcmludGYoc3RkZXJyLCAiQ29tbWFuZCBcIiVzXCIgaXMgdW5rbm93biwgdHJ5IFwiaXAgbmV0bnMgaGVscFwiLlxuIiwgKmFyZ3YpOworCWV4aXQoLTEpOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaXAvaXBudGFibGUuYyBiL2lwcm91dGUyL2lwL2lwbnRhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmViODRlNwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2lwL2lwbnRhYmxlLmMKQEAgLTAsMCArMSw2NjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpMjAwNiBVU0FHSS9XSURFIFByb2plY3QKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzPi4KKyAqLworLyoKKyAqIGJhc2VkIG9uIGlwbmVpZ2guYworICovCisvKgorICogQXV0aG9yczoKKyAqCU1hc2FoaWRlIE5BS0FNVVJBIEBVU0FHSQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiaXBfY29tbW9uLmgiCisKK3N0YXRpYyBzdHJ1Y3QKK3sKKwlpbnQgZmFtaWx5OworICAgICAgICBpbnQgaW5kZXg7CisjZGVmaW5lIE5PTkVfREVWCSgtMSkKKwljaGFyIG5hbWVbMTAyNF07Cit9IGZpbHRlcjsKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwKKwkJIlVzYWdlOiBpcCBudGFibGUgY2hhbmdlIG5hbWUgTkFNRSBbIGRldiBERVYgXVxuIgorCQkiICAgICAgICAgIFsgdGhyZXNoMSBWQUwgXSBbIHRocmVzaDIgVkFMIF0gWyB0aHJlc2gzIFZBTCBdIFsgZ2NfaW50IE1TRUMgXVxuIgorCQkiICAgICAgICAgIFsgUEFSTVMgXVxuIgorCQkiVXNhZ2U6IGlwIG50YWJsZSBzaG93IFsgZGV2IERFViBdIFsgbmFtZSBOQU1FIF1cbiIKKworCQkiUEFSTVMgOj0gWyBiYXNlX3JlYWNoYWJsZSBNU0VDIF0gWyByZXRyYW5zIE1TRUMgXSBbIGdjX3N0YWxlIE1TRUMgXVxuIgorCQkiICAgICAgICAgWyBkZWxheV9wcm9iZSBNU0VDIF0gWyBxdWV1ZSBMRU4gXVxuIgorCQkiICAgICAgICAgWyBhcHBfcHJvYnMgVkFMIF0gWyB1Y2FzdF9wcm9iZXMgVkFMIF0gWyBtY2FzdF9wcm9iZXMgVkFMIF1cbiIKKwkJIiAgICAgICAgIFsgYW55Y2FzdF9kZWxheSBNU0VDIF0gWyBwcm94eV9kZWxheSBNU0VDIF0gWyBwcm94eV9xdWV1ZSBMRU4gXVxuIgorCQkiICAgICAgICAgWyBsb2NrdGltZSBNU0VDIF1cbiIKKwkJKTsKKworCWV4aXQoLTEpOworfQorCitzdGF0aWMgaW50IGlwbnRhYmxlX21vZGlmeShpbnQgY21kLCBpbnQgZmxhZ3MsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgbmxtc2doZHIJbjsKKwkJc3RydWN0IG5kdG1zZwkJbmR0bTsKKwkJY2hhciAgCQkJYnVmWzEwMjRdOworCX0gcmVxOworCWNoYXIgKm5hbWVwID0gTlVMTDsKKwljaGFyICp0aHJlc2hzcCA9IE5VTEw7CisJY2hhciAqZ2NfaW50cCA9IE5VTEw7CisJY2hhciBwYXJtc19idWZbMTAyNF07CisJc3RydWN0IHJ0YXR0ciAqcGFybXNfcnRhID0gKHN0cnVjdCBydGF0dHIgKilwYXJtc19idWY7CisJaW50IHBhcm1zX2NoYW5nZSA9IDA7CisKKwltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCisJcmVxLm4ubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgbmR0bXNnKSk7CisJcmVxLm4ubmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUfGZsYWdzOworCXJlcS5uLm5sbXNnX3R5cGUgPSBjbWQ7CisKKwlyZXEubmR0bS5uZHRtX2ZhbWlseSA9IHByZWZlcnJlZF9mYW1pbHk7CisJcmVxLm5kdG0ubmR0bV9wYWQxID0gMDsKKwlyZXEubmR0bS5uZHRtX3BhZDIgPSAwOworCisJbWVtc2V0KCZwYXJtc19idWYsIDAsIHNpemVvZihwYXJtc19idWYpKTsKKworCXBhcm1zX3J0YS0+cnRhX3R5cGUgPSBORFRBX1BBUk1TOworCXBhcm1zX3J0YS0+cnRhX2xlbiA9IFJUQV9MRU5HVEgoMCk7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgIm5hbWUiKSA9PSAwKSB7CisJCQlpbnQgbGVuOworCisJCQlORVhUX0FSRygpOworCQkJaWYgKG5hbWVwKQorCQkJCWR1cGFyZygiTkFNRSIsICphcmd2KTsKKworCQkJbmFtZXAgPSAqYXJndjsKKwkJCWxlbiA9IHN0cmxlbihuYW1lcCkgKyAxOworCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIE5EVEFfTkFNRSwgbmFtZXAsIGxlbik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAidGhyZXNoMSIpID09IDApIHsKKwkJCV9fdTMyIHRocmVzaDE7CisKKwkJCU5FWFRfQVJHKCk7CisJCQl0aHJlc2hzcCA9ICphcmd2OworCisJCQlpZiAoZ2V0X3UzMigmdGhyZXNoMSwgKmFyZ3YsIDApKQorCQkJCWludmFyZygiXCJ0aHJlc2gxXCIgdmFsdWUgaXMgaW52YWxpZCIsICphcmd2KTsKKworCQkJYWRkYXR0cjMyKCZyZXEubiwgc2l6ZW9mKHJlcSksIE5EVEFfVEhSRVNIMSwgdGhyZXNoMSk7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAidGhyZXNoMiIpID09IDApIHsKKwkJCV9fdTMyIHRocmVzaDI7CisKKwkJCU5FWFRfQVJHKCk7CisJCQl0aHJlc2hzcCA9ICphcmd2OworCisJCQlpZiAoZ2V0X3UzMigmdGhyZXNoMiwgKmFyZ3YsIDApKQorCQkJCWludmFyZygiXCJ0aHJlc2gyXCIgdmFsdWUgaXMgaW52YWxpZCIsICphcmd2KTsKKworCQkJYWRkYXR0cjMyKCZyZXEubiwgc2l6ZW9mKHJlcSksIE5EVEFfVEhSRVNIMiwgdGhyZXNoMik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAidGhyZXNoMyIpID09IDApIHsKKwkJCV9fdTMyIHRocmVzaDM7CisKKwkJCU5FWFRfQVJHKCk7CisJCQl0aHJlc2hzcCA9ICphcmd2OworCisJCQlpZiAoZ2V0X3UzMigmdGhyZXNoMywgKmFyZ3YsIDApKQorCQkJCWludmFyZygiXCJ0aHJlc2gzXCIgdmFsdWUgaXMgaW52YWxpZCIsICphcmd2KTsKKworCQkJYWRkYXR0cjMyKCZyZXEubiwgc2l6ZW9mKHJlcSksIE5EVEFfVEhSRVNIMywgdGhyZXNoMyk7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZ2NfaW50IikgPT0gMCkgeworCQkJX191NjQgZ2NfaW50OworCisJCQlORVhUX0FSRygpOworCQkJZ2NfaW50cCA9ICphcmd2OworCisJCQlpZiAoZ2V0X3U2NCgmZ2NfaW50LCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJcImdjX2ludFwiIHZhbHVlIGlzIGludmFsaWQiLCAqYXJndik7CisKKwkJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBORFRBX0dDX0lOVEVSVkFMLAorCQkJCSAgJmdjX2ludCwgc2l6ZW9mKGdjX2ludCkpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImRldiIpID09IDApIHsKKwkJCV9fdTMyIGlmaW5kZXg7CisKKwkJCU5FWFRfQVJHKCk7CisJCQlpZmluZGV4ID0gbGxfbmFtZV90b19pbmRleCgqYXJndik7CisJCQlpZiAoaWZpbmRleCA9PSAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJDYW5ub3QgZmluZCBkZXZpY2UgXCIlc1wiXG4iLCAqYXJndik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCisJCQlydGFfYWRkYXR0cjMyKHBhcm1zX3J0YSwgc2l6ZW9mKHBhcm1zX2J1ZiksCisJCQkJICAgICAgTkRUUEFfSUZJTkRFWCwgaWZpbmRleCk7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiYmFzZV9yZWFjaGFibGUiKSA9PSAwKSB7CisJCQlfX3U2NCBicmVhY2hhYmxlOworCisJCQlORVhUX0FSRygpOworCisJCQlpZiAoZ2V0X3U2NCgmYnJlYWNoYWJsZSwgKmFyZ3YsIDApKQorCQkJCWludmFyZygiXCJiYXNlX3JlYWNoYWJsZVwiIHZhbHVlIGlzIGludmFsaWQiLCAqYXJndik7CisKKwkJCXJ0YV9hZGRhdHRyX2wocGFybXNfcnRhLCBzaXplb2YocGFybXNfYnVmKSwKKwkJCQkgICAgICBORFRQQV9CQVNFX1JFQUNIQUJMRV9USU1FLAorCQkJCSAgICAgICZicmVhY2hhYmxlLCBzaXplb2YoYnJlYWNoYWJsZSkpOworCQkJcGFybXNfY2hhbmdlID0gMTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJyZXRyYW5zIikgPT0gMCkgeworCQkJX191NjQgcmV0cmFuczsKKworCQkJTkVYVF9BUkcoKTsKKworCQkJaWYgKGdldF91NjQoJnJldHJhbnMsICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoIlwicmV0cmFuc1wiIHZhbHVlIGlzIGludmFsaWQiLCAqYXJndik7CisKKwkJCXJ0YV9hZGRhdHRyX2wocGFybXNfcnRhLCBzaXplb2YocGFybXNfYnVmKSwKKwkJCQkgICAgICBORFRQQV9SRVRSQU5TX1RJTUUsCisJCQkJICAgICAgJnJldHJhbnMsIHNpemVvZihyZXRyYW5zKSk7CisJCQlwYXJtc19jaGFuZ2UgPSAxOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImdjX3N0YWxlIikgPT0gMCkgeworCQkJX191NjQgZ2Nfc3RhbGU7CisKKwkJCU5FWFRfQVJHKCk7CisKKwkJCWlmIChnZXRfdTY0KCZnY19zdGFsZSwgKmFyZ3YsIDApKQorCQkJCWludmFyZygiXCJnY19zdGFsZVwiIHZhbHVlIGlzIGludmFsaWQiLCAqYXJndik7CisKKwkJCXJ0YV9hZGRhdHRyX2wocGFybXNfcnRhLCBzaXplb2YocGFybXNfYnVmKSwKKwkJCQkgICAgICBORFRQQV9HQ19TVEFMRVRJTUUsCisJCQkJICAgICAgJmdjX3N0YWxlLCBzaXplb2YoZ2Nfc3RhbGUpKTsKKwkJCXBhcm1zX2NoYW5nZSA9IDE7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZGVsYXlfcHJvYmUiKSA9PSAwKSB7CisJCQlfX3U2NCBkZWxheV9wcm9iZTsKKworCQkJTkVYVF9BUkcoKTsKKworCQkJaWYgKGdldF91NjQoJmRlbGF5X3Byb2JlLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJcImRlbGF5X3Byb2JlXCIgdmFsdWUgaXMgaW52YWxpZCIsICphcmd2KTsKKworCQkJcnRhX2FkZGF0dHJfbChwYXJtc19ydGEsIHNpemVvZihwYXJtc19idWYpLAorCQkJCSAgICAgIE5EVFBBX0RFTEFZX1BST0JFX1RJTUUsCisJCQkJICAgICAgJmRlbGF5X3Byb2JlLCBzaXplb2YoZGVsYXlfcHJvYmUpKTsKKwkJCXBhcm1zX2NoYW5nZSA9IDE7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAicXVldWUiKSA9PSAwKSB7CisJCQlfX3UzMiBxdWV1ZTsKKworCQkJTkVYVF9BUkcoKTsKKworCQkJaWYgKGdldF91MzIoJnF1ZXVlLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJcInF1ZXVlXCIgdmFsdWUgaXMgaW52YWxpZCIsICphcmd2KTsKKworCQkJaWYgKCFwYXJtc19ydGEpCisJCQkJcGFybXNfcnRhID0gKHN0cnVjdCBydGF0dHIgKikmcGFybXNfYnVmOworCQkJcnRhX2FkZGF0dHIzMihwYXJtc19ydGEsIHNpemVvZihwYXJtc19idWYpLAorCQkJCSAgICAgIE5EVFBBX1FVRVVFX0xFTiwgcXVldWUpOworCQkJcGFybXNfY2hhbmdlID0gMTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJhcHBfcHJvYmVzIikgPT0gMCkgeworCQkJX191MzIgYXByb2JlOworCisJCQlORVhUX0FSRygpOworCisJCQlpZiAoZ2V0X3UzMigmYXByb2JlLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJcImFwcF9wcm9iZXNcIiB2YWx1ZSBpcyBpbnZhbGlkIiwgKmFyZ3YpOworCisJCQlydGFfYWRkYXR0cjMyKHBhcm1zX3J0YSwgc2l6ZW9mKHBhcm1zX2J1ZiksCisJCQkJICAgICAgTkRUUEFfQVBQX1BST0JFUywgYXByb2JlKTsKKwkJCXBhcm1zX2NoYW5nZSA9IDE7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAidWNhc3RfcHJvYmVzIikgPT0gMCkgeworCQkJX191MzIgdXByb2JlOworCisJCQlORVhUX0FSRygpOworCisJCQlpZiAoZ2V0X3UzMigmdXByb2JlLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJcInVjYXN0X3Byb2Jlc1wiIHZhbHVlIGlzIGludmFsaWQiLCAqYXJndik7CisKKwkJCXJ0YV9hZGRhdHRyMzIocGFybXNfcnRhLCBzaXplb2YocGFybXNfYnVmKSwKKwkJCQkgICAgICBORFRQQV9VQ0FTVF9QUk9CRVMsIHVwcm9iZSk7CisJCQlwYXJtc19jaGFuZ2UgPSAxOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm1jYXN0X3Byb2JlcyIpID09IDApIHsKKwkJCV9fdTMyIG1wcm9iZTsKKworCQkJTkVYVF9BUkcoKTsKKworCQkJaWYgKGdldF91MzIoJm1wcm9iZSwgKmFyZ3YsIDApKQorCQkJCWludmFyZygiXCJtY2FzdF9wcm9iZXNcIiB2YWx1ZSBpcyBpbnZhbGlkIiwgKmFyZ3YpOworCisJCQlydGFfYWRkYXR0cjMyKHBhcm1zX3J0YSwgc2l6ZW9mKHBhcm1zX2J1ZiksCisJCQkJICAgICAgTkRUUEFfTUNBU1RfUFJPQkVTLCBtcHJvYmUpOworCQkJcGFybXNfY2hhbmdlID0gMTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJhbnljYXN0X2RlbGF5IikgPT0gMCkgeworCQkJX191NjQgYW55Y2FzdF9kZWxheTsKKworCQkJTkVYVF9BUkcoKTsKKworCQkJaWYgKGdldF91NjQoJmFueWNhc3RfZGVsYXksICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoIlwiYW55Y2FzdF9kZWxheVwiIHZhbHVlIGlzIGludmFsaWQiLCAqYXJndik7CisKKwkJCXJ0YV9hZGRhdHRyX2wocGFybXNfcnRhLCBzaXplb2YocGFybXNfYnVmKSwKKwkJCQkgICAgICBORFRQQV9BTllDQVNUX0RFTEFZLAorCQkJCSAgICAgICZhbnljYXN0X2RlbGF5LCBzaXplb2YoYW55Y2FzdF9kZWxheSkpOworCQkJcGFybXNfY2hhbmdlID0gMTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJwcm94eV9kZWxheSIpID09IDApIHsKKwkJCV9fdTY0IHByb3h5X2RlbGF5OworCisJCQlORVhUX0FSRygpOworCisJCQlpZiAoZ2V0X3U2NCgmcHJveHlfZGVsYXksICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoIlwicHJveHlfZGVsYXlcIiB2YWx1ZSBpcyBpbnZhbGlkIiwgKmFyZ3YpOworCisJCQlydGFfYWRkYXR0cl9sKHBhcm1zX3J0YSwgc2l6ZW9mKHBhcm1zX2J1ZiksCisJCQkJICAgICAgTkRUUEFfUFJPWFlfREVMQVksCisJCQkJICAgICAgJnByb3h5X2RlbGF5LCBzaXplb2YocHJveHlfZGVsYXkpKTsKKwkJCXBhcm1zX2NoYW5nZSA9IDE7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAicHJveHlfcXVldWUiKSA9PSAwKSB7CisJCQlfX3UzMiBwcXVldWU7CisKKwkJCU5FWFRfQVJHKCk7CisKKwkJCWlmIChnZXRfdTMyKCZwcXVldWUsICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoIlwicHJveHlfcXVldWVcIiB2YWx1ZSBpcyBpbnZhbGlkIiwgKmFyZ3YpOworCisJCQlydGFfYWRkYXR0cjMyKHBhcm1zX3J0YSwgc2l6ZW9mKHBhcm1zX2J1ZiksCisJCQkJICAgICAgTkRUUEFfUFJPWFlfUUxFTiwgcHF1ZXVlKTsKKwkJCXBhcm1zX2NoYW5nZSA9IDE7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibG9ja3RpbWUiKSA9PSAwKSB7CisJCQlfX3U2NCBsb2NrdGltZTsKKworCQkJTkVYVF9BUkcoKTsKKworCQkJaWYgKGdldF91NjQoJmxvY2t0aW1lLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJcImxvY2t0aW1lXCIgdmFsdWUgaXMgaW52YWxpZCIsICphcmd2KTsKKworCQkJcnRhX2FkZGF0dHJfbChwYXJtc19ydGEsIHNpemVvZihwYXJtc19idWYpLAorCQkJCSAgICAgIE5EVFBBX0xPQ0tUSU1FLAorCQkJCSAgICAgICZsb2NrdGltZSwgc2l6ZW9mKGxvY2t0aW1lKSk7CisJCQlwYXJtc19jaGFuZ2UgPSAxOworCQl9IGVsc2UgeworCQkJaW52YXJnKCJ1bmtub3duIiwgKmFyZ3YpOworCQl9CisKKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJaWYgKCFuYW1lcCkKKwkJbWlzc2FyZygiTkFNRSIpOworCWlmICghdGhyZXNoc3AgJiYgIWdjX2ludHAgJiYgIXBhcm1zX2NoYW5nZSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vdCBlbm91Z2ggaW5mb3JtYXRpb246IGNoYW5nZWFibGUgYXR0cmlidXRlcyByZXF1aXJlZC5cbiIpOworCQlleGl0KC0xKTsKKwl9CisKKwlpZiAocGFybXNfcnRhLT5ydGFfbGVuID4gUlRBX0xFTkdUSCgwKSkgeworCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgTkRUQV9QQVJNUywgUlRBX0RBVEEocGFybXNfcnRhKSwKKwkJCSAgUlRBX1BBWUxPQUQocGFybXNfcnRhKSk7CisJfQorCisJaWYgKHJ0bmxfdGFsaygmcnRoLCAmcmVxLm4sIE5VTEwsIDApIDwgMCkKKwkJZXhpdCgyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqbnRhYmxlX3N0cnRpbWVfZGVsdGEoX191MzIgbXNlYykKK3sKKwlzdGF0aWMgY2hhciBzdHJbMzJdOworCXN0cnVjdCB0aW1ldmFsIG5vdzsKKwl0aW1lX3QgdDsKKwlzdHJ1Y3QgdG0gKnRwOworCisJaWYgKG1zZWMgPT0gMCkKKwkJZ290byBlcnJvcjsKKworCW1lbXNldCgmbm93LCAwLCBzaXplb2Yobm93KSk7CisKKwlpZiAoZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpIDwgMCkgeworCQlwZXJyb3IoImdldHRpbWVvZmRheSIpOworCQlnb3RvIGVycm9yOworCX0KKworCXQgPSBub3cudHZfc2VjIC0gKG1zZWMgLyAxMDAwKTsKKwl0cCA9IGxvY2FsdGltZSgmdCk7CisJaWYgKCF0cCkKKwkJZ290byBlcnJvcjsKKworCXN0cmZ0aW1lKHN0ciwgc2l6ZW9mKHN0ciksICIlWS0lbS0lZCAlVCIsIHRwKTsKKworCXJldHVybiBzdHI7CisgZXJyb3I6CisJc3RyY3B5KHN0ciwgIihlcnJvcikiKTsKKwlyZXR1cm4gc3RyOworfQorCitzdGF0aWMgaW50IHByaW50X250YWJsZShjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobywgc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcpCit7CisJRklMRSAqZnAgPSAoRklMRSopYXJnOworCXN0cnVjdCBuZHRtc2cgKm5kdG0gPSBOTE1TR19EQVRBKG4pOworCWludCBsZW4gPSBuLT5ubG1zZ19sZW47CisJc3RydWN0IHJ0YXR0ciAqdGJbTkRUQV9NQVgrMV07CisJc3RydWN0IHJ0YXR0ciAqdHBiW05EVFBBX01BWCsxXTsKKwlpbnQgcmV0OworCisJaWYgKG4tPm5sbXNnX3R5cGUgIT0gUlRNX05FV05FSUdIVEJMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm90IE5FSUdIVEJMOiAlMDh4ICUwOHggJTA4eFxuIiwKKwkJCW4tPm5sbXNnX2xlbiwgbi0+bmxtc2dfdHlwZSwgbi0+bmxtc2dfZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisJbGVuIC09IE5MTVNHX0xFTkdUSChzaXplb2YoKm5kdG0pKTsKKwlpZiAobGVuIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkJVRzogd3Jvbmcgbmxtc2cgbGVuICVkXG4iLCBsZW4pOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHByZWZlcnJlZF9mYW1pbHkgJiYgcHJlZmVycmVkX2ZhbWlseSAhPSBuZHRtLT5uZHRtX2ZhbWlseSkKKwkJcmV0dXJuIDA7CisKKwlwYXJzZV9ydGF0dHIodGIsIE5EVEFfTUFYLCBORFRBX1JUQShuZHRtKSwKKwkJICAgICBuLT5ubG1zZ19sZW4gLSBOTE1TR19MRU5HVEgoc2l6ZW9mKCpuZHRtKSkpOworCisJaWYgKHRiW05EVEFfTkFNRV0pIHsKKwkJY29uc3QgY2hhciAqbmFtZSA9IHJ0YV9nZXRhdHRyX3N0cih0YltORFRBX05BTUVdKTsKKworCQlpZiAoc3RybGVuKGZpbHRlci5uYW1lKSA+IDAgJiYgc3RyY21wKGZpbHRlci5uYW1lLCBuYW1lKSkKKwkJCXJldHVybiAwOworCX0KKwlpZiAodGJbTkRUQV9QQVJNU10pIHsKKwkJcGFyc2VfcnRhdHRyKHRwYiwgTkRUUEFfTUFYLCBSVEFfREFUQSh0YltORFRBX1BBUk1TXSksCisJCQkgICAgIFJUQV9QQVlMT0FEKHRiW05EVEFfUEFSTVNdKSk7CisKKwkJaWYgKHRwYltORFRQQV9JRklOREVYXSkgeworCQkJX191MzIgaWZpbmRleCA9IHJ0YV9nZXRhdHRyX3UzMih0cGJbTkRUUEFfSUZJTkRFWF0pOworCisJCQlpZiAoZmlsdGVyLmluZGV4ICYmIGZpbHRlci5pbmRleCAhPSBpZmluZGV4KQorCQkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJaWYgKGZpbHRlci5pbmRleCAmJiBmaWx0ZXIuaW5kZXggIT0gTk9ORV9ERVYpCisJCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAobmR0bS0+bmR0bV9mYW1pbHkgPT0gQUZfSU5FVCkKKwkJZnByaW50ZihmcCwgImluZXQgIik7CisJZWxzZSBpZiAobmR0bS0+bmR0bV9mYW1pbHkgPT0gQUZfSU5FVDYpCisJCWZwcmludGYoZnAsICJpbmV0NiAiKTsKKwllbHNlIGlmIChuZHRtLT5uZHRtX2ZhbWlseSA9PSBBRl9ERUNuZXQpCisJCWZwcmludGYoZnAsICJkbmV0ICIpOworCWVsc2UKKwkJZnByaW50ZihmcCwgIiglZCkgIiwgbmR0bS0+bmR0bV9mYW1pbHkpOworCisJaWYgKHRiW05EVEFfTkFNRV0pIHsKKwkJY29uc3QgY2hhciAqbmFtZSA9IHJ0YV9nZXRhdHRyX3N0cih0YltORFRBX05BTUVdKTsKKwkJZnByaW50ZihmcCwgIiVzICIsIG5hbWUpOworCX0KKworCWZwcmludGYoZnAsICIlcyIsIF9TTF8pOworCisJcmV0ID0gKHRiW05EVEFfVEhSRVNIMV0gfHwgdGJbTkRUQV9USFJFU0gyXSB8fCB0YltORFRBX1RIUkVTSDNdIHx8CisJICAgICAgIHRiW05EVEFfR0NfSU5URVJWQUxdKTsKKwlpZiAocmV0KQorCQlmcHJpbnRmKGZwLCAiICAgICIpOworCisJaWYgKHRiW05EVEFfVEhSRVNIMV0pIHsKKwkJX191MzIgdGhyZXNoMSA9IHJ0YV9nZXRhdHRyX3UzMih0YltORFRBX1RIUkVTSDFdKTsKKwkJZnByaW50ZihmcCwgInRocmVzaDEgJXUgIiwgdGhyZXNoMSk7CisJfQorCWlmICh0YltORFRBX1RIUkVTSDJdKSB7CisJCV9fdTMyIHRocmVzaDIgPSBydGFfZ2V0YXR0cl91MzIodGJbTkRUQV9USFJFU0gyXSk7CisJCWZwcmludGYoZnAsICJ0aHJlc2gyICV1ICIsIHRocmVzaDIpOworCX0KKwlpZiAodGJbTkRUQV9USFJFU0gzXSkgeworCQlfX3UzMiB0aHJlc2gzID0gcnRhX2dldGF0dHJfdTMyKHRiW05EVEFfVEhSRVNIM10pOworCQlmcHJpbnRmKGZwLCAidGhyZXNoMyAldSAiLCB0aHJlc2gzKTsKKwl9CisJaWYgKHRiW05EVEFfR0NfSU5URVJWQUxdKSB7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBnY19pbnQgPSBydGFfZ2V0YXR0cl91NjQodGJbTkRUQV9HQ19JTlRFUlZBTF0pOworCQlmcHJpbnRmKGZwLCAiZ2NfaW50ICVsbHUgIiwgZ2NfaW50KTsKKwl9CisKKwlpZiAocmV0KQorCQlmcHJpbnRmKGZwLCAiJXMiLCBfU0xfKTsKKworCWlmICh0YltORFRBX0NPTkZJR10gJiYgc2hvd19zdGF0cykgeworCQlzdHJ1Y3QgbmR0X2NvbmZpZyAqbmR0YyA9IFJUQV9EQVRBKHRiW05EVEFfQ09ORklHXSk7CisKKwkJZnByaW50ZihmcCwgIiAgICAiKTsKKwkJZnByaW50ZihmcCwgImNvbmZpZyAiKTsKKworCQlmcHJpbnRmKGZwLCAia2V5X2xlbiAldSAiLCBuZHRjLT5uZHRjX2tleV9sZW4pOworCQlmcHJpbnRmKGZwLCAiZW50cnlfc2l6ZSAldSAiLCBuZHRjLT5uZHRjX2VudHJ5X3NpemUpOworCQlmcHJpbnRmKGZwLCAiZW50cmllcyAldSAiLCBuZHRjLT5uZHRjX2VudHJpZXMpOworCisJCWZwcmludGYoZnAsICIlcyIsIF9TTF8pOworCQlmcHJpbnRmKGZwLCAiICAgICAgICAiKTsKKworCQlmcHJpbnRmKGZwLCAibGFzdF9mbHVzaCAlcyAiLAorCQkJbnRhYmxlX3N0cnRpbWVfZGVsdGEobmR0Yy0+bmR0Y19sYXN0X2ZsdXNoKSk7CisJCWZwcmludGYoZnAsICJsYXN0X3JhbmQgJXMgIiwKKwkJCW50YWJsZV9zdHJ0aW1lX2RlbHRhKG5kdGMtPm5kdGNfbGFzdF9yYW5kKSk7CisKKwkJZnByaW50ZihmcCwgIiVzIiwgX1NMXyk7CisJCWZwcmludGYoZnAsICIgICAgICAgICIpOworCisJCWZwcmludGYoZnAsICJoYXNoX3JuZCAldSAiLCBuZHRjLT5uZHRjX2hhc2hfcm5kKTsKKwkJZnByaW50ZihmcCwgImhhc2hfbWFzayAlMDh4ICIsIG5kdGMtPm5kdGNfaGFzaF9tYXNrKTsKKworCQlmcHJpbnRmKGZwLCAiaGFzaF9jaGFpbl9nYyAldSAiLCBuZHRjLT5uZHRjX2hhc2hfY2hhaW5fZ2MpOworCQlmcHJpbnRmKGZwLCAicHJveHlfcWxlbiAldSAiLCBuZHRjLT5uZHRjX3Byb3h5X3FsZW4pOworCisJCWZwcmludGYoZnAsICIlcyIsIF9TTF8pOworCX0KKworCWlmICh0YltORFRBX1BBUk1TXSkgeworCQlpZiAodHBiW05EVFBBX0lGSU5ERVhdKSB7CisJCQlfX3UzMiBpZmluZGV4ID0gcnRhX2dldGF0dHJfdTMyKHRwYltORFRQQV9JRklOREVYXSk7CisKKwkJCWZwcmludGYoZnAsICIgICAgIik7CisJCQlmcHJpbnRmKGZwLCAiZGV2ICVzICIsIGxsX2luZGV4X3RvX25hbWUoaWZpbmRleCkpOworCQkJZnByaW50ZihmcCwgIiVzIiwgX1NMXyk7CisJCX0KKworCQlmcHJpbnRmKGZwLCAiICAgICIpOworCisJCWlmICh0cGJbTkRUUEFfUkVGQ05UXSkgeworCQkJX191MzIgcmVmY250ID0gcnRhX2dldGF0dHJfdTMyKHRwYltORFRQQV9SRUZDTlRdKTsKKwkJCWZwcmludGYoZnAsICJyZWZjbnQgJXUgIiwgcmVmY250KTsKKwkJfQorCQlpZiAodHBiW05EVFBBX1JFQUNIQUJMRV9USU1FXSkgeworCQkJdW5zaWduZWQgbG9uZyBsb25nIHJlYWNoYWJsZSA9IHJ0YV9nZXRhdHRyX3U2NCh0cGJbTkRUUEFfUkVBQ0hBQkxFX1RJTUVdKTsKKwkJCWZwcmludGYoZnAsICJyZWFjaGFibGUgJWxsdSAiLCByZWFjaGFibGUpOworCQl9CisJCWlmICh0cGJbTkRUUEFfQkFTRV9SRUFDSEFCTEVfVElNRV0pIHsKKwkJCXVuc2lnbmVkIGxvbmcgbG9uZyBicmVhY2hhYmxlID0gcnRhX2dldGF0dHJfdTY0KHRwYltORFRQQV9CQVNFX1JFQUNIQUJMRV9USU1FXSk7CisJCQlmcHJpbnRmKGZwLCAiYmFzZV9yZWFjaGFibGUgJWxsdSAiLCBicmVhY2hhYmxlKTsKKwkJfQorCQlpZiAodHBiW05EVFBBX1JFVFJBTlNfVElNRV0pIHsKKwkJCXVuc2lnbmVkIGxvbmcgbG9uZyByZXRyYW5zID0gcnRhX2dldGF0dHJfdTY0KHRwYltORFRQQV9SRVRSQU5TX1RJTUVdKTsKKwkJCWZwcmludGYoZnAsICJyZXRyYW5zICVsbHUgIiwgcmV0cmFucyk7CisJCX0KKworCQlmcHJpbnRmKGZwLCAiJXMiLCBfU0xfKTsKKworCQlmcHJpbnRmKGZwLCAiICAgICIpOworCisJCWlmICh0cGJbTkRUUEFfR0NfU1RBTEVUSU1FXSkgeworCQkJdW5zaWduZWQgbG9uZyBsb25nIGdjX3N0YWxlID0gcnRhX2dldGF0dHJfdTY0KHRwYltORFRQQV9HQ19TVEFMRVRJTUVdKTsKKwkJCWZwcmludGYoZnAsICJnY19zdGFsZSAlbGx1ICIsIGdjX3N0YWxlKTsKKwkJfQorCQlpZiAodHBiW05EVFBBX0RFTEFZX1BST0JFX1RJTUVdKSB7CisJCQl1bnNpZ25lZCBsb25nIGxvbmcgZGVsYXlfcHJvYmUgPSBydGFfZ2V0YXR0cl91NjQodHBiW05EVFBBX0RFTEFZX1BST0JFX1RJTUVdKTsKKwkJCWZwcmludGYoZnAsICJkZWxheV9wcm9iZSAlbGx1ICIsIGRlbGF5X3Byb2JlKTsKKwkJfQorCQlpZiAodHBiW05EVFBBX1FVRVVFX0xFTl0pIHsKKwkJCV9fdTMyIHF1ZXVlID0gcnRhX2dldGF0dHJfdTMyKHRwYltORFRQQV9RVUVVRV9MRU5dKTsKKwkJCWZwcmludGYoZnAsICJxdWV1ZSAldSAiLCBxdWV1ZSk7CisJCX0KKworCQlmcHJpbnRmKGZwLCAiJXMiLCBfU0xfKTsKKworCQlmcHJpbnRmKGZwLCAiICAgICIpOworCisJCWlmICh0cGJbTkRUUEFfQVBQX1BST0JFU10pIHsKKwkJCV9fdTMyIGFwcm9iZSA9IHJ0YV9nZXRhdHRyX3UzMih0cGJbTkRUUEFfQVBQX1BST0JFU10pOworCQkJZnByaW50ZihmcCwgImFwcF9wcm9iZXMgJXUgIiwgYXByb2JlKTsKKwkJfQorCQlpZiAodHBiW05EVFBBX1VDQVNUX1BST0JFU10pIHsKKwkJCV9fdTMyIHVwcm9iZSA9IHJ0YV9nZXRhdHRyX3UzMih0cGJbTkRUUEFfVUNBU1RfUFJPQkVTXSk7CisJCQlmcHJpbnRmKGZwLCAidWNhc3RfcHJvYmVzICV1ICIsIHVwcm9iZSk7CisJCX0KKwkJaWYgKHRwYltORFRQQV9NQ0FTVF9QUk9CRVNdKSB7CisJCQlfX3UzMiBtcHJvYmUgPSBydGFfZ2V0YXR0cl91MzIodHBiW05EVFBBX01DQVNUX1BST0JFU10pOworCQkJZnByaW50ZihmcCwgIm1jYXN0X3Byb2JlcyAldSAiLCBtcHJvYmUpOworCQl9CisKKwkJZnByaW50ZihmcCwgIiVzIiwgX1NMXyk7CisKKwkJZnByaW50ZihmcCwgIiAgICAiKTsKKworCQlpZiAodHBiW05EVFBBX0FOWUNBU1RfREVMQVldKSB7CisJCQl1bnNpZ25lZCBsb25nIGxvbmcgYW55Y2FzdF9kZWxheSA9IHJ0YV9nZXRhdHRyX3U2NCh0cGJbTkRUUEFfQU5ZQ0FTVF9ERUxBWV0pOworCQkJZnByaW50ZihmcCwgImFueWNhc3RfZGVsYXkgJWxsdSAiLCBhbnljYXN0X2RlbGF5KTsKKwkJfQorCQlpZiAodHBiW05EVFBBX1BST1hZX0RFTEFZXSkgeworCQkJdW5zaWduZWQgbG9uZyBsb25nIHByb3h5X2RlbGF5ID0gcnRhX2dldGF0dHJfdTY0KHRwYltORFRQQV9QUk9YWV9ERUxBWV0pOworCQkJZnByaW50ZihmcCwgInByb3h5X2RlbGF5ICVsbHUgIiwgcHJveHlfZGVsYXkpOworCQl9CisJCWlmICh0cGJbTkRUUEFfUFJPWFlfUUxFTl0pIHsKKwkJCV9fdTMyIHBxdWV1ZSA9IHJ0YV9nZXRhdHRyX3UzMih0cGJbTkRUUEFfUFJPWFlfUUxFTl0pOworCQkJZnByaW50ZihmcCwgInByb3h5X3F1ZXVlICV1ICIsIHBxdWV1ZSk7CisJCX0KKwkJaWYgKHRwYltORFRQQV9MT0NLVElNRV0pIHsKKwkJCXVuc2lnbmVkIGxvbmcgbG9uZyBsb2NrdGltZSA9IHJ0YV9nZXRhdHRyX3U2NCh0cGJbTkRUUEFfTE9DS1RJTUVdKTsKKwkJCWZwcmludGYoZnAsICJsb2NrdGltZSAlbGx1ICIsIGxvY2t0aW1lKTsKKwkJfQorCisJCWZwcmludGYoZnAsICIlcyIsIF9TTF8pOworCX0KKworCWlmICh0YltORFRBX1NUQVRTXSAmJiBzaG93X3N0YXRzKSB7CisJCXN0cnVjdCBuZHRfc3RhdHMgKm5kdHMgPSBSVEFfREFUQSh0YltORFRBX1NUQVRTXSk7CisKKwkJZnByaW50ZihmcCwgIiAgICAiKTsKKwkJZnByaW50ZihmcCwgInN0YXRzICIpOworCisJCWZwcmludGYoZnAsICJhbGxvY3MgJWxsdSAiLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgbmR0cy0+bmR0c19hbGxvY3MpOworCQlmcHJpbnRmKGZwLCAiZGVzdHJveXMgJWxsdSAiLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgbmR0cy0+bmR0c19kZXN0cm95cyk7CisJCWZwcmludGYoZnAsICJoYXNoX2dyb3dzICVsbHUgIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIG5kdHMtPm5kdHNfaGFzaF9ncm93cyk7CisKKwkJZnByaW50ZihmcCwgIiVzIiwgX1NMXyk7CisJCWZwcmludGYoZnAsICIgICAgICAgICIpOworCisJCWZwcmludGYoZnAsICJyZXNfZmFpbGVkICVsbHUgIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIG5kdHMtPm5kdHNfcmVzX2ZhaWxlZCk7CisJCWZwcmludGYoZnAsICJsb29rdXBzICVsbHUgIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIG5kdHMtPm5kdHNfbG9va3Vwcyk7CisJCWZwcmludGYoZnAsICJoaXRzICVsbHUgIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIG5kdHMtPm5kdHNfaGl0cyk7CisKKwkJZnByaW50ZihmcCwgIiVzIiwgX1NMXyk7CisJCWZwcmludGYoZnAsICIgICAgICAgICIpOworCisJCWZwcmludGYoZnAsICJyY3ZfcHJvYmVzX21jYXN0ICVsbHUgIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIG5kdHMtPm5kdHNfcmN2X3Byb2Jlc19tY2FzdCk7CisJCWZwcmludGYoZnAsICJyY3ZfcHJvYmVzX3VjYXN0ICVsbHUgIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIG5kdHMtPm5kdHNfcmN2X3Byb2Jlc191Y2FzdCk7CisKKwkJZnByaW50ZihmcCwgIiVzIiwgX1NMXyk7CisJCWZwcmludGYoZnAsICIgICAgICAgICIpOworCisJCWZwcmludGYoZnAsICJwZXJpb2RpY19nY19ydW5zICVsbHUgIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIG5kdHMtPm5kdHNfcGVyaW9kaWNfZ2NfcnVucyk7CisJCWZwcmludGYoZnAsICJmb3JjZWRfZ2NfcnVucyAlbGx1ICIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKSBuZHRzLT5uZHRzX2ZvcmNlZF9nY19ydW5zKTsKKworCQlmcHJpbnRmKGZwLCAiJXMiLCBfU0xfKTsKKwl9CisKKwlmcHJpbnRmKGZwLCAiXG4iKTsKKworCWZmbHVzaChmcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlwbnRhYmxlX3Jlc2V0X2ZpbHRlcih2b2lkKQoreworCW1lbXNldCgmZmlsdGVyLCAwLCBzaXplb2YoZmlsdGVyKSk7Cit9CisKK3N0YXRpYyBpbnQgaXBudGFibGVfc2hvdyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaXBudGFibGVfcmVzZXRfZmlsdGVyKCk7CisKKwlmaWx0ZXIuZmFtaWx5ID0gcHJlZmVycmVkX2ZhbWlseTsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAoc3RyY21wKCphcmd2LCAiZGV2IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKworCQkJaWYgKHN0cmNtcCgibm9uZSIsICphcmd2KSA9PSAwKQorCQkJCWZpbHRlci5pbmRleCA9IE5PTkVfREVWOworCQkJZWxzZSBpZiAoKGZpbHRlci5pbmRleCA9IGxsX25hbWVfdG9faW5kZXgoKmFyZ3YpKSA9PSAwKQorCQkJCWludmFyZygiXCJERVZcIiBpcyBpbnZhbGlkIiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm5hbWUiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCisJCQlzdHJuY3B5KGZpbHRlci5uYW1lLCAqYXJndiwgc2l6ZW9mKGZpbHRlci5uYW1lKSk7CisJCX0gZWxzZQorCQkJaW52YXJnKCJ1bmtub3duIiwgKmFyZ3YpOworCisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCWlmIChydG5sX3dpbGRkdW1wX3JlcXVlc3QoJnJ0aCwgcHJlZmVycmVkX2ZhbWlseSwgUlRNX0dFVE5FSUdIVEJMKSA8IDApIHsKKwkJcGVycm9yKCJDYW5ub3Qgc2VuZCBkdW1wIHJlcXVlc3QiKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAocnRubF9kdW1wX2ZpbHRlcigmcnRoLCBwcmludF9udGFibGUsIHN0ZG91dCkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRHVtcCB0ZXJtaW5hdGVkXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRvX2lwbnRhYmxlKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlsbF9pbml0X21hcCgmcnRoKTsKKworCWlmIChhcmdjID4gMCkgeworCQlpZiAobWF0Y2hlcygqYXJndiwgImNoYW5nZSIpID09IDAgfHwKKwkJICAgIG1hdGNoZXMoKmFyZ3YsICJjaGciKSA9PSAwKQorCQkJcmV0dXJuIGlwbnRhYmxlX21vZGlmeShSVE1fU0VUTkVJR0hUQkwsCisJCQkJCSAgICAgICBOTE1fRl9SRVBMQUNFLAorCQkJCQkgICAgICAgYXJnYy0xLCBhcmd2KzEpOworCQlpZiAobWF0Y2hlcygqYXJndiwgInNob3ciKSA9PSAwIHx8CisJCSAgICBtYXRjaGVzKCphcmd2LCAibHN0IikgPT0gMCB8fAorCQkgICAgbWF0Y2hlcygqYXJndiwgImxpc3QiKSA9PSAwKQorCQkJcmV0dXJuIGlwbnRhYmxlX3Nob3coYXJnYy0xLCBhcmd2KzEpOworCQlpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKQorCQkJdXNhZ2UoKTsKKwl9IGVsc2UKKwkJcmV0dXJuIGlwbnRhYmxlX3Nob3coMCwgTlVMTCk7CisKKwlmcHJpbnRmKHN0ZGVyciwgIkNvbW1hbmQgXCIlc1wiIGlzIHVua25vd24sIHRyeSBcImlwIG50YWJsZSBoZWxwXCIuXG4iLCAqYXJndik7CisJZXhpdCgtMSk7Cit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pcC9pcHByZWZpeC5jIGIvaXByb3V0ZTIvaXAvaXBwcmVmaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTUxZjA0Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaXAvaXBwcmVmaXguYwpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykyMDA1IFVTQUdJL1dJREUgUHJvamVjdAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXM+LgorICovCisvKgorICogYmFzZWQgb24gaXAuYywgaXByb3V0ZS5jCisgKi8KKy8qCisgKiBBdXRob3JzOgorICoJTWFzYWhpZGUgTkFLQU1VUkEgQFVTQUdJCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaWNtcDYuaD4KKworI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiaXBfY29tbW9uLmgiCisKKy8qIHByZWZpeCBmbGFnczsgc2VlIGtlcm5lbCdzIG5ldC9pcHY2L2FkZHJjb25mLmMgYW5kIGluY2x1ZGUvbmV0L2lmX2luZXQ2LmggKi8KKyNkZWZpbmUgSUZfUFJFRklYX09OTElOSwkweDAxCisjZGVmaW5lIElGX1BSRUZJWF9BVVRPQ09ORgkweDAyCisKK2ludCBwcmludF9wcmVmaXgoY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8sIHN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqYXJnKQoreworCUZJTEUgKmZwID0gKEZJTEUqKWFyZzsKKwlzdHJ1Y3QgcHJlZml4bXNnICpwcmVmaXggPSBOTE1TR19EQVRBKG4pOworCWludCBsZW4gPSBuLT5ubG1zZ19sZW47CisJc3RydWN0IHJ0YXR0ciAqIHRiW1JUQV9NQVgrMV07CisJaW50IGZhbWlseSA9IHByZWZlcnJlZF9mYW1pbHk7CisKKwlpZiAobi0+bmxtc2dfdHlwZSAhPSBSVE1fTkVXUFJFRklYKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm90IGEgcHJlZml4OiAlMDh4ICUwOHggJTA4eFxuIiwKKwkJCW4tPm5sbXNnX2xlbiwgbi0+bmxtc2dfdHlwZSwgbi0+bmxtc2dfZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwlsZW4gLT0gTkxNU0dfTEVOR1RIKHNpemVvZigqcHJlZml4KSk7CisJaWYgKGxlbiA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJCVUc6IHdyb25nIG5sbXNnIGxlbiAlZFxuIiwgbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChmYW1pbHkgPT0gQUZfVU5TUEVDKQorCQlmYW1pbHkgPSBBRl9JTkVUNjsKKwlpZiAoZmFtaWx5ICE9IEFGX0lORVQ2KQorCQlyZXR1cm4gMDsKKworCWlmIChwcmVmaXgtPnByZWZpeF9mYW1pbHkgIT0gQUZfSU5FVDYpIHsKKwkJZnByaW50ZihzdGRlcnIsICJpbmNvcnJlY3QgcHJvdG9jb2wgZmFtaWx5OiAlZFxuIiwgcHJlZml4LT5wcmVmaXhfZmFtaWx5KTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChwcmVmaXgtPnByZWZpeF90eXBlICE9IE5EX09QVF9QUkVGSVhfSU5GT1JNQVRJT04pIHsKKwkJZnByaW50ZihzdGRlcnIsICJ3cm9uZyBORCB0eXBlICVkXG4iLCBwcmVmaXgtPnByZWZpeF90eXBlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcGFyc2VfcnRhdHRyKHRiLCBSVEFfTUFYLCBSVE1fUlRBKHByZWZpeCksIGxlbik7CisKKwlmcHJpbnRmKGZwLCAicHJlZml4ICIpOworCisJaWYgKHRiW1BSRUZJWF9BRERSRVNTXSkgeworCQlzdHJ1Y3QgaW42X2FkZHIgKnBmeDsKKwkJY2hhciBhYnVmWzI1Nl07CisKKwkJcGZ4ID0gKHN0cnVjdCBpbjZfYWRkciAqKVJUQV9EQVRBKHRiW1BSRUZJWF9BRERSRVNTXSk7CisKKwkJbWVtc2V0KGFidWYsICdcMCcsIHNpemVvZihhYnVmKSk7CisJCWZwcmludGYoZnAsICIlcyIsIHJ0X2FkZHJfbjJhKGZhbWlseSwKKwkJCQkJICAgICAgUlRBX1BBWUxPQUQodGJbUFJFRklYX0FERFJFU1NdKSwKKwkJCQkJICAgICAgcGZ4LAorCQkJCQkgICAgICBhYnVmLCBzaXplb2YoYWJ1ZikpKTsKKwl9CisJZnByaW50ZihmcCwgIi8ldSAiLCBwcmVmaXgtPnByZWZpeF9sZW4pOworCisJZnByaW50ZihmcCwgImRldiAlcyAiLCBsbF9pbmRleF90b19uYW1lKHByZWZpeC0+cHJlZml4X2lmaW5kZXgpKTsKKworCWlmIChwcmVmaXgtPnByZWZpeF9mbGFncyAmIElGX1BSRUZJWF9PTkxJTkspCisJCWZwcmludGYoZnAsICJvbmxpbmsgIik7CisJaWYgKHByZWZpeC0+cHJlZml4X2ZsYWdzICYgSUZfUFJFRklYX0FVVE9DT05GKQorCQlmcHJpbnRmKGZwLCAiYXV0b2NvbmYgIik7CisKKwlpZiAodGJbUFJFRklYX0NBQ0hFSU5GT10pIHsKKwkJc3RydWN0IHByZWZpeF9jYWNoZWluZm8gKnBjOworCQlwYyA9IChzdHJ1Y3QgcHJlZml4X2NhY2hlaW5mbyAqKVJUQV9EQVRBKHRiW1BSRUZJWF9DQUNIRUlORk9dKTsKKworCQlmcHJpbnRmKGZwLCAidmFsaWQgJXUgIiwgcGMtPnZhbGlkX3RpbWUpOworCQlmcHJpbnRmKGZwLCAicHJlZmVycmVkICV1ICIsIHBjLT5wcmVmZXJyZWRfdGltZSk7CisJfQorCisJZnByaW50ZihmcCwgIlxuIik7CisJZmZsdXNoKGZwKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaXAvaXByb3V0ZS5jIGIvaXByb3V0ZTIvaXAvaXByb3V0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MWMzZGQKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pcC9pcHJvdXRlLmMKQEAgLTAsMCArMSwxODYxIEBACisvKgorICogaXByb3V0ZS5jCQkiaXAgcm91dGUiLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaXAuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbl9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ljbXB2Ni5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJydF9uYW1lcy5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiaXBfY29tbW9uLmgiCisjaW5jbHVkZSAiaXByb3V0ZV9sd3R1bm5lbC5oIgorCisjaWZuZGVmIFJUQVhfUlRUVkFSCisjZGVmaW5lIFJUQVhfUlRUVkFSIFJUQVhfSE9QUworI2VuZGlmCisKK2VudW0gbGlzdF9hY3Rpb24geworCUlQUk9VVEVfTElTVCwKKwlJUFJPVVRFX0ZMVVNILAorCUlQUk9VVEVfU0FWRSwKK307CitzdGF0aWMgY29uc3QgY2hhciAqbXhfbmFtZXNbUlRBWF9NQVgrMV0gPSB7CisJW1JUQVhfTVRVXQk9ICJtdHUiLAorCVtSVEFYX1dJTkRPV10JPSAid2luZG93IiwKKwlbUlRBWF9SVFRdCT0gInJ0dCIsCisJW1JUQVhfUlRUVkFSXQk9ICJydHR2YXIiLAorCVtSVEFYX1NTVEhSRVNIXSA9ICJzc3RocmVzaCIsCisJW1JUQVhfQ1dORF0JPSAiY3duZCIsCisJW1JUQVhfQURWTVNTXQk9ICJhZHZtc3MiLAorCVtSVEFYX1JFT1JERVJJTkddPSJyZW9yZGVyaW5nIiwKKwlbUlRBWF9IT1BMSU1JVF0gPSAiaG9wbGltaXQiLAorCVtSVEFYX0lOSVRDV05EXSA9ICJpbml0Y3duZCIsCisJW1JUQVhfRkVBVFVSRVNdID0gImZlYXR1cmVzIiwKKwlbUlRBWF9SVE9fTUlOXQk9ICJydG9fbWluIiwKKwlbUlRBWF9JTklUUldORF0JPSAiaW5pdHJ3bmQiLAorCVtSVEFYX1FVSUNLQUNLXQk9ICJxdWlja2FjayIsCisJW1JUQVhfQ0NfQUxHT10JPSAiY29uZ2N0bCIsCit9Oworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBpcCByb3V0ZSB7IGxpc3QgfCBmbHVzaCB9IFNFTEVDVE9SXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBpcCByb3V0ZSBzYXZlIFNFTEVDVE9SXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBpcCByb3V0ZSByZXN0b3JlXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBpcCByb3V0ZSBzaG93ZHVtcFxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgaXAgcm91dGUgZ2V0IEFERFJFU1MgWyBmcm9tIEFERFJFU1MgaWlmIFNUUklORyBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIG9pZiBTVFJJTkcgXSBbIHRvcyBUT1MgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBtYXJrIE5VTUJFUiBdIFsgdWlkIE5VTUJFUiBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBpcCByb3V0ZSB7IGFkZCB8IGRlbCB8IGNoYW5nZSB8IGFwcGVuZCB8IHJlcGxhY2UgfSBST1VURVxuIik7CisJZnByaW50ZihzdGRlcnIsICJTRUxFQ1RPUiA6PSBbIHJvb3QgUFJFRklYIF0gWyBtYXRjaCBQUkVGSVggXSBbIGV4YWN0IFBSRUZJWCBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgIFsgdGFibGUgVEFCTEVfSUQgXSBbIHByb3RvIFJUUFJPVE8gXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICBbIHR5cGUgVFlQRSBdIFsgc2NvcGUgU0NPUEUgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICJST1VURSA6PSBOT0RFX1NQRUMgWyBJTkZPX1NQRUMgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICJOT0RFX1NQRUMgOj0gWyBUWVBFIF0gUFJFRklYIFsgdG9zIFRPUyBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICBbIHRhYmxlIFRBQkxFX0lEIF0gWyBwcm90byBSVFBST1RPIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgIFsgc2NvcGUgU0NPUEUgXSBbIG1ldHJpYyBNRVRSSUMgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICJJTkZPX1NQRUMgOj0gTkggT1BUSU9OUyBGTEFHUyBbIG5leHRob3AgTkggXS4uLlxuIik7CisJZnByaW50ZihzdGRlcnIsICJOSCA6PSBbIGVuY2FwIEVOQ0FQVFlQRSBFTkNBUEhEUiBdIFsgdmlhIFsgRkFNSUxZIF0gQUREUkVTUyBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIgkgICAgWyBkZXYgU1RSSU5HIF0gWyB3ZWlnaHQgTlVNQkVSIF0gTkhGTEFHU1xuIik7CisJZnByaW50ZihzdGRlcnIsICJGQU1JTFkgOj0gWyBpbmV0IHwgaW5ldDYgfCBpcHggfCBkbmV0IHwgbXBscyB8IGJyaWRnZSB8IGxpbmsgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICJPUFRJT05TIDo9IEZMQUdTIFsgbXR1IE5VTUJFUiBdIFsgYWR2bXNzIE5VTUJFUiBdIFsgYXMgWyB0byBdIEFERFJFU1MgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgIFsgcnR0IFRJTUUgXSBbIHJ0dHZhciBUSU1FIF0gWyByZW9yZGVyaW5nIE5VTUJFUiBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgWyB3aW5kb3cgTlVNQkVSXSBbIGN3bmQgTlVNQkVSIF0gWyBpbml0Y3duZCBOVU1CRVIgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgIFsgc3N0aHJlc2ggTlVNQkVSIF0gWyByZWFsbXMgUkVBTE0gXSBbIHNyYyBBRERSRVNTIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICBbIHJ0b19taW4gVElNRSBdIFsgaG9wbGltaXQgTlVNQkVSIF0gWyBpbml0cnduZCBOVU1CRVIgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgIFsgZmVhdHVyZXMgRkVBVFVSRVMgXSBbIHF1aWNrYWNrIEJPT0wgXSBbIGNvbmdjdGwgTkFNRSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgWyBwcmVmIFBSRUYgXSBbIGV4cGlyZXMgVElNRSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlRZUEUgOj0gWyB1bmljYXN0IHwgbG9jYWwgfCBicm9hZGNhc3QgfCBtdWx0aWNhc3QgfCB0aHJvdyB8XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICB1bnJlYWNoYWJsZSB8IHByb2hpYml0IHwgYmxhY2tob2xlIHwgbmF0IF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiVEFCTEVfSUQgOj0gWyBsb2NhbCB8IG1haW4gfCBkZWZhdWx0IHwgYWxsIHwgTlVNQkVSIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiU0NPUEUgOj0gWyBob3N0IHwgbGluayB8IGdsb2JhbCB8IE5VTUJFUiBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIk5IRkxBR1MgOj0gWyBvbmxpbmsgfCBwZXJ2YXNpdmUgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICJSVFBST1RPIDo9IFsga2VybmVsIHwgYm9vdCB8IHN0YXRpYyB8IE5VTUJFUiBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlBSRUYgOj0gWyBsb3cgfCBtZWRpdW0gfCBoaWdoIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiVElNRSA6PSBOVU1CRVJbc3xtc11cbiIpOworCWZwcmludGYoc3RkZXJyLCAiQk9PTCA6PSBbMXwwXVxuIik7CisJZnByaW50ZihzdGRlcnIsICJGRUFUVVJFUyA6PSBlY25cbiIpOworCWZwcmludGYoc3RkZXJyLCAiRU5DQVBUWVBFIDo9IFsgbXBscyB8IGlwIHwgaXA2IF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiRU5DQVBIRFIgOj0gWyBNUExTTEFCRUwgXVxuIik7CisJZXhpdCgtMSk7Cit9CisKKworc3RhdGljIHN0cnVjdAoreworCXVuc2lnbmVkIGludCB0YjsKKwlpbnQgY2xvbmVkOworCWludCBmbHVzaGVkOworCWNoYXIgKmZsdXNoYjsKKwlpbnQgZmx1c2hwOworCWludCBmbHVzaGU7CisJaW50IHByb3RvY29sLCBwcm90b2NvbG1hc2s7CisJaW50IHNjb3BlLCBzY29wZW1hc2s7CisJaW50IHR5cGUsIHR5cGVtYXNrOworCWludCB0b3MsIHRvc21hc2s7CisJaW50IGlpZiwgaWlmbWFzazsKKwlpbnQgb2lmLCBvaWZtYXNrOworCWludCBtYXJrLCBtYXJrbWFzazsKKwlpbnQgcmVhbG0sIHJlYWxtbWFzazsKKwlpbmV0X3ByZWZpeCBycHJlZnNyYzsKKwlpbmV0X3ByZWZpeCBydmlhOworCWluZXRfcHJlZml4IHJkc3Q7CisJaW5ldF9wcmVmaXggbWRzdDsKKwlpbmV0X3ByZWZpeCByc3JjOworCWluZXRfcHJlZml4IG1zcmM7Cit9IGZpbHRlcjsKKworc3RhdGljIGludCBmbHVzaF91cGRhdGUodm9pZCkKK3sKKwlpZiAocnRubF9zZW5kX2NoZWNrKCZydGgsIGZpbHRlci5mbHVzaGIsIGZpbHRlci5mbHVzaHApIDwgMCkgeworCQlwZXJyb3IoIkZhaWxlZCB0byBzZW5kIGZsdXNoIHJlcXVlc3QiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlmaWx0ZXIuZmx1c2hwID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfbmxtc2coc3RydWN0IG5sbXNnaGRyICpuLCBzdHJ1Y3QgcnRhdHRyICoqdGIsIGludCBob3N0X2xlbikKK3sKKwlzdHJ1Y3QgcnRtc2cgKnIgPSBOTE1TR19EQVRBKG4pOworCWluZXRfcHJlZml4IGRzdDsKKwlpbmV0X3ByZWZpeCBzcmM7CisJaW5ldF9wcmVmaXggdmlhOworCWluZXRfcHJlZml4IHByZWZzcmM7CisJX191MzIgdGFibGU7CisJc3RhdGljIGludCBpcDZfbXVsdGlwbGVfdGFibGVzOworCisJdGFibGUgPSBydG1fZ2V0X3RhYmxlKHIsIHRiKTsKKworCWlmIChwcmVmZXJyZWRfZmFtaWx5ICE9IEFGX1VOU1BFQyAmJiByLT5ydG1fZmFtaWx5ICE9IHByZWZlcnJlZF9mYW1pbHkpCisJCXJldHVybiAwOworCisJaWYgKHItPnJ0bV9mYW1pbHkgPT0gQUZfSU5FVDYgJiYgdGFibGUgIT0gUlRfVEFCTEVfTUFJTikKKwkJaXA2X211bHRpcGxlX3RhYmxlcyA9IDE7CisKKwlpZiAoZmlsdGVyLmNsb25lZCA9PSAhKHItPnJ0bV9mbGFncyZSVE1fRl9DTE9ORUQpKQorCQlyZXR1cm4gMDsKKworCWlmIChyLT5ydG1fZmFtaWx5ID09IEFGX0lORVQ2ICYmICFpcDZfbXVsdGlwbGVfdGFibGVzKSB7CisJCWlmIChmaWx0ZXIudGIpIHsKKwkJCWlmIChmaWx0ZXIudGIgPT0gUlRfVEFCTEVfTE9DQUwpIHsKKwkJCQlpZiAoci0+cnRtX3R5cGUgIT0gUlROX0xPQ0FMKQorCQkJCQlyZXR1cm4gMDsKKwkJCX0gZWxzZSBpZiAoZmlsdGVyLnRiID09IFJUX1RBQkxFX01BSU4pIHsKKwkJCQlpZiAoci0+cnRtX3R5cGUgPT0gUlROX0xPQ0FMKQorCQkJCQlyZXR1cm4gMDsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZmlsdGVyLnRiID4gMCAmJiBmaWx0ZXIudGIgIT0gdGFibGUpCisJCQlyZXR1cm4gMDsKKwl9CisJaWYgKChmaWx0ZXIucHJvdG9jb2xeci0+cnRtX3Byb3RvY29sKSZmaWx0ZXIucHJvdG9jb2xtYXNrKQorCQlyZXR1cm4gMDsKKwlpZiAoKGZpbHRlci5zY29wZV5yLT5ydG1fc2NvcGUpJmZpbHRlci5zY29wZW1hc2spCisJCXJldHVybiAwOworCWlmICgoZmlsdGVyLnR5cGVeci0+cnRtX3R5cGUpJmZpbHRlci50eXBlbWFzaykKKwkJcmV0dXJuIDA7CisJaWYgKChmaWx0ZXIudG9zXnItPnJ0bV90b3MpJmZpbHRlci50b3NtYXNrKQorCQlyZXR1cm4gMDsKKwlpZiAoZmlsdGVyLnJkc3QuZmFtaWx5ICYmCisJICAgIChyLT5ydG1fZmFtaWx5ICE9IGZpbHRlci5yZHN0LmZhbWlseSB8fCBmaWx0ZXIucmRzdC5iaXRsZW4gPiByLT5ydG1fZHN0X2xlbikpCisJCXJldHVybiAwOworCWlmIChmaWx0ZXIubWRzdC5mYW1pbHkgJiYKKwkgICAgKHItPnJ0bV9mYW1pbHkgIT0gZmlsdGVyLm1kc3QuZmFtaWx5IHx8CisJICAgICAoZmlsdGVyLm1kc3QuYml0bGVuID49IDAgJiYgZmlsdGVyLm1kc3QuYml0bGVuIDwgci0+cnRtX2RzdF9sZW4pKSkKKwkJcmV0dXJuIDA7CisJaWYgKGZpbHRlci5yc3JjLmZhbWlseSAmJgorCSAgICAoci0+cnRtX2ZhbWlseSAhPSBmaWx0ZXIucnNyYy5mYW1pbHkgfHwgZmlsdGVyLnJzcmMuYml0bGVuID4gci0+cnRtX3NyY19sZW4pKQorCQlyZXR1cm4gMDsKKwlpZiAoZmlsdGVyLm1zcmMuZmFtaWx5ICYmCisJICAgIChyLT5ydG1fZmFtaWx5ICE9IGZpbHRlci5tc3JjLmZhbWlseSB8fAorCSAgICAgKGZpbHRlci5tc3JjLmJpdGxlbiA+PSAwICYmIGZpbHRlci5tc3JjLmJpdGxlbiA8IHItPnJ0bV9zcmNfbGVuKSkpCisJCXJldHVybiAwOworCWlmIChmaWx0ZXIucnZpYS5mYW1pbHkpIHsKKwkJaW50IGZhbWlseSA9IHItPnJ0bV9mYW1pbHk7CisJCWlmICh0YltSVEFfVklBXSkgeworCQkJc3RydWN0IHJ0dmlhICp2aWEgPSBSVEFfREFUQSh0YltSVEFfVklBXSk7CisJCQlmYW1pbHkgPSB2aWEtPnJ0dmlhX2ZhbWlseTsKKwkJfQorCQlpZiAoZmFtaWx5ICE9IGZpbHRlci5ydmlhLmZhbWlseSkKKwkJCXJldHVybiAwOworCX0KKwlpZiAoZmlsdGVyLnJwcmVmc3JjLmZhbWlseSAmJiByLT5ydG1fZmFtaWx5ICE9IGZpbHRlci5ycHJlZnNyYy5mYW1pbHkpCisJCXJldHVybiAwOworCisJbWVtc2V0KCZkc3QsIDAsIHNpemVvZihkc3QpKTsKKwlkc3QuZmFtaWx5ID0gci0+cnRtX2ZhbWlseTsKKwlpZiAodGJbUlRBX0RTVF0pCisJCW1lbWNweSgmZHN0LmRhdGEsIFJUQV9EQVRBKHRiW1JUQV9EU1RdKSwgKHItPnJ0bV9kc3RfbGVuKzcpLzgpOworCWlmIChmaWx0ZXIucnNyYy5mYW1pbHkgfHwgZmlsdGVyLm1zcmMuZmFtaWx5KSB7CisJCW1lbXNldCgmc3JjLCAwLCBzaXplb2Yoc3JjKSk7CisJCXNyYy5mYW1pbHkgPSByLT5ydG1fZmFtaWx5OworCQlpZiAodGJbUlRBX1NSQ10pCisJCQltZW1jcHkoJnNyYy5kYXRhLCBSVEFfREFUQSh0YltSVEFfU1JDXSksIChyLT5ydG1fc3JjX2xlbis3KS84KTsKKwl9CisJaWYgKGZpbHRlci5ydmlhLmJpdGxlbj4wKSB7CisJCW1lbXNldCgmdmlhLCAwLCBzaXplb2YodmlhKSk7CisJCXZpYS5mYW1pbHkgPSByLT5ydG1fZmFtaWx5OworCQlpZiAodGJbUlRBX0dBVEVXQVldKQorCQkJbWVtY3B5KCZ2aWEuZGF0YSwgUlRBX0RBVEEodGJbUlRBX0dBVEVXQVldKSwgaG9zdF9sZW4vOCk7CisJCWlmICh0YltSVEFfVklBXSkgeworCQkJc2l6ZV90IGxlbiA9IFJUQV9QQVlMT0FEKHRiW1JUQV9WSUFdKSAtIDI7CisJCQlzdHJ1Y3QgcnR2aWEgKnJ0dmlhID0gUlRBX0RBVEEodGJbUlRBX1ZJQV0pOworCQkJdmlhLmZhbWlseSA9IHJ0dmlhLT5ydHZpYV9mYW1pbHk7CisJCQltZW1jcHkoJnZpYS5kYXRhLCBydHZpYS0+cnR2aWFfYWRkciwgbGVuKTsKKwkJfQorCX0KKwlpZiAoZmlsdGVyLnJwcmVmc3JjLmJpdGxlbj4wKSB7CisJCW1lbXNldCgmcHJlZnNyYywgMCwgc2l6ZW9mKHByZWZzcmMpKTsKKwkJcHJlZnNyYy5mYW1pbHkgPSByLT5ydG1fZmFtaWx5OworCQlpZiAodGJbUlRBX1BSRUZTUkNdKQorCQkJbWVtY3B5KCZwcmVmc3JjLmRhdGEsIFJUQV9EQVRBKHRiW1JUQV9QUkVGU1JDXSksIGhvc3RfbGVuLzgpOworCX0KKworCWlmIChmaWx0ZXIucmRzdC5mYW1pbHkgJiYgaW5ldF9hZGRyX21hdGNoKCZkc3QsICZmaWx0ZXIucmRzdCwgZmlsdGVyLnJkc3QuYml0bGVuKSkKKwkJcmV0dXJuIDA7CisJaWYgKGZpbHRlci5tZHN0LmZhbWlseSAmJiBmaWx0ZXIubWRzdC5iaXRsZW4gPj0gMCAmJgorCSAgICBpbmV0X2FkZHJfbWF0Y2goJmRzdCwgJmZpbHRlci5tZHN0LCByLT5ydG1fZHN0X2xlbikpCisJCXJldHVybiAwOworCisJaWYgKGZpbHRlci5yc3JjLmZhbWlseSAmJiBpbmV0X2FkZHJfbWF0Y2goJnNyYywgJmZpbHRlci5yc3JjLCBmaWx0ZXIucnNyYy5iaXRsZW4pKQorCQlyZXR1cm4gMDsKKwlpZiAoZmlsdGVyLm1zcmMuZmFtaWx5ICYmIGZpbHRlci5tc3JjLmJpdGxlbiA+PSAwICYmCisJICAgIGluZXRfYWRkcl9tYXRjaCgmc3JjLCAmZmlsdGVyLm1zcmMsIHItPnJ0bV9zcmNfbGVuKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZmlsdGVyLnJ2aWEuZmFtaWx5ICYmIGluZXRfYWRkcl9tYXRjaCgmdmlhLCAmZmlsdGVyLnJ2aWEsIGZpbHRlci5ydmlhLmJpdGxlbikpCisJCXJldHVybiAwOworCWlmIChmaWx0ZXIucnByZWZzcmMuZmFtaWx5ICYmIGluZXRfYWRkcl9tYXRjaCgmcHJlZnNyYywgJmZpbHRlci5ycHJlZnNyYywgZmlsdGVyLnJwcmVmc3JjLmJpdGxlbikpCisJCXJldHVybiAwOworCWlmIChmaWx0ZXIucmVhbG1tYXNrKSB7CisJCV9fdTMyIHJlYWxtcyA9IDA7CisJCWlmICh0YltSVEFfRkxPV10pCisJCQlyZWFsbXMgPSBydGFfZ2V0YXR0cl91MzIodGJbUlRBX0ZMT1ddKTsKKwkJaWYgKChyZWFsbXNeZmlsdGVyLnJlYWxtKSZmaWx0ZXIucmVhbG1tYXNrKQorCQkJcmV0dXJuIDA7CisJfQorCWlmIChmaWx0ZXIuaWlmbWFzaykgeworCQlpbnQgaWlmID0gMDsKKwkJaWYgKHRiW1JUQV9JSUZdKQorCQkJaWlmID0gKihpbnQqKVJUQV9EQVRBKHRiW1JUQV9JSUZdKTsKKwkJaWYgKChpaWZeZmlsdGVyLmlpZikmZmlsdGVyLmlpZm1hc2spCisJCQlyZXR1cm4gMDsKKwl9CisJaWYgKGZpbHRlci5vaWZtYXNrKSB7CisJCWludCBvaWYgPSAwOworCQlpZiAodGJbUlRBX09JRl0pCisJCQlvaWYgPSAqKGludCopUlRBX0RBVEEodGJbUlRBX09JRl0pOworCQlpZiAoKG9pZl5maWx0ZXIub2lmKSZmaWx0ZXIub2lmbWFzaykKKwkJCXJldHVybiAwOworCX0KKwlpZiAoZmlsdGVyLm1hcmttYXNrKSB7CisJCWludCBtYXJrID0gMDsKKwkJaWYgKHRiW1JUQV9NQVJLXSkKKwkJCW1hcmsgPSAqKGludCAqKVJUQV9EQVRBKHRiW1JUQV9NQVJLXSk7CisJCWlmICgobWFyayBeIGZpbHRlci5tYXJrKSAmIGZpbHRlci5tYXJrbWFzaykKKwkJCXJldHVybiAwOworCX0KKwlpZiAoZmlsdGVyLmZsdXNoYiAmJgorCSAgICByLT5ydG1fZmFtaWx5ID09IEFGX0lORVQ2ICYmCisJICAgIHItPnJ0bV9kc3RfbGVuID09IDAgJiYKKwkgICAgci0+cnRtX3R5cGUgPT0gUlROX1VOUkVBQ0hBQkxFICYmCisJICAgIHRiW1JUQV9QUklPUklUWV0gJiYKKwkgICAgKihpbnQqKVJUQV9EQVRBKHRiW1JUQV9QUklPUklUWV0pID09IC0xKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBwcmludF9ydGF4X2ZlYXR1cmVzKEZJTEUgKmZwLCB1bnNpZ25lZCBpbnQgZmVhdHVyZXMpCit7CisJdW5zaWduZWQgaW50IG9mID0gZmVhdHVyZXM7CisKKwlpZiAoZmVhdHVyZXMgJiBSVEFYX0ZFQVRVUkVfRUNOKSB7CisJCWZwcmludGYoZnAsICIgZWNuIik7CisJCWZlYXR1cmVzICY9IH5SVEFYX0ZFQVRVUkVfRUNOOworCX0KKworCWlmIChmZWF0dXJlcykKKwkJZnByaW50ZihmcCwgIiAweCV4Iiwgb2YpOworfQorCitpbnQgcHJpbnRfcm91dGUoY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8sIHN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqYXJnKQoreworCUZJTEUgKmZwID0gKEZJTEUqKWFyZzsKKwlzdHJ1Y3QgcnRtc2cgKnIgPSBOTE1TR19EQVRBKG4pOworCWludCBsZW4gPSBuLT5ubG1zZ19sZW47CisJc3RydWN0IHJ0YXR0ciAqIHRiW1JUQV9NQVgrMV07CisJY2hhciBhYnVmWzI1Nl07CisJaW50IGhvc3RfbGVuOworCV9fdTMyIHRhYmxlOworCVNQUklOVF9CVUYoYjEpOworCXN0YXRpYyBpbnQgaHo7CisKKwlpZiAobi0+bmxtc2dfdHlwZSAhPSBSVE1fTkVXUk9VVEUgJiYgbi0+bmxtc2dfdHlwZSAhPSBSVE1fREVMUk9VVEUpIHsKKwkJZnByaW50ZihzdGRlcnIsICJOb3QgYSByb3V0ZTogJTA4eCAlMDh4ICUwOHhcbiIsCisJCQluLT5ubG1zZ19sZW4sIG4tPm5sbXNnX3R5cGUsIG4tPm5sbXNnX2ZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChmaWx0ZXIuZmx1c2hiICYmIG4tPm5sbXNnX3R5cGUgIT0gUlRNX05FV1JPVVRFKQorCQlyZXR1cm4gMDsKKwlsZW4gLT0gTkxNU0dfTEVOR1RIKHNpemVvZigqcikpOworCWlmIChsZW4gPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQlVHOiB3cm9uZyBubG1zZyBsZW4gJWRcbiIsIGxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlob3N0X2xlbiA9IGFmX2JpdF9sZW4oci0+cnRtX2ZhbWlseSk7CisKKwlwYXJzZV9ydGF0dHIodGIsIFJUQV9NQVgsIFJUTV9SVEEociksIGxlbik7CisJdGFibGUgPSBydG1fZ2V0X3RhYmxlKHIsIHRiKTsKKworCWlmICghZmlsdGVyX25sbXNnKG4sIHRiLCBob3N0X2xlbikpCisJCXJldHVybiAwOworCisJaWYgKGZpbHRlci5mbHVzaGIpIHsKKwkJc3RydWN0IG5sbXNnaGRyICpmbjsKKwkJaWYgKE5MTVNHX0FMSUdOKGZpbHRlci5mbHVzaHApICsgbi0+bmxtc2dfbGVuID4gZmlsdGVyLmZsdXNoZSkgeworCQkJaWYgKGZsdXNoX3VwZGF0ZSgpKQorCQkJCXJldHVybiAtMTsKKwkJfQorCQlmbiA9IChzdHJ1Y3Qgbmxtc2doZHIqKShmaWx0ZXIuZmx1c2hiICsgTkxNU0dfQUxJR04oZmlsdGVyLmZsdXNocCkpOworCQltZW1jcHkoZm4sIG4sIG4tPm5sbXNnX2xlbik7CisJCWZuLT5ubG1zZ190eXBlID0gUlRNX0RFTFJPVVRFOworCQlmbi0+bmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUOworCQlmbi0+bmxtc2dfc2VxID0gKytydGguc2VxOworCQlmaWx0ZXIuZmx1c2hwID0gKCgoY2hhciopZm4pICsgbi0+bmxtc2dfbGVuKSAtIGZpbHRlci5mbHVzaGI7CisJCWZpbHRlci5mbHVzaGVkKys7CisJCWlmIChzaG93X3N0YXRzIDwgMikKKwkJCXJldHVybiAwOworCX0KKworCWlmIChuLT5ubG1zZ190eXBlID09IFJUTV9ERUxST1VURSkKKwkJZnByaW50ZihmcCwgIkRlbGV0ZWQgIik7CisJaWYgKChyLT5ydG1fdHlwZSAhPSBSVE5fVU5JQ0FTVCB8fCBzaG93X2RldGFpbHMgPiAwKSAmJiAhZmlsdGVyLnR5cGUpCisJCWZwcmludGYoZnAsICIlcyAiLCBydG5sX3J0bnR5cGVfbjJhKHItPnJ0bV90eXBlLCBiMSwgc2l6ZW9mKGIxKSkpOworCisJaWYgKHRiW1JUQV9EU1RdKSB7CisJCWlmIChyLT5ydG1fZHN0X2xlbiAhPSBob3N0X2xlbikgeworCQkJZnByaW50ZihmcCwgIiVzLyV1ICIsIHJ0X2FkZHJfbjJhKHItPnJ0bV9mYW1pbHksCisJCQkJCQkgICAgICAgUlRBX1BBWUxPQUQodGJbUlRBX0RTVF0pLAorCQkJCQkJICAgICAgIFJUQV9EQVRBKHRiW1JUQV9EU1RdKSwKKwkJCQkJCSAgICAgICBhYnVmLCBzaXplb2YoYWJ1ZikpLAorCQkJCXItPnJ0bV9kc3RfbGVuCisJCQkJKTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoZnAsICIlcyAiLCBmb3JtYXRfaG9zdChyLT5ydG1fZmFtaWx5LAorCQkJCQkJICAgICAgIFJUQV9QQVlMT0FEKHRiW1JUQV9EU1RdKSwKKwkJCQkJCSAgICAgICBSVEFfREFUQSh0YltSVEFfRFNUXSksCisJCQkJCQkgICAgICAgYWJ1Ziwgc2l6ZW9mKGFidWYpKQorCQkJCSk7CisJCX0KKwl9IGVsc2UgaWYgKHItPnJ0bV9kc3RfbGVuKSB7CisJCWZwcmludGYoZnAsICIwLyVkICIsIHItPnJ0bV9kc3RfbGVuKTsKKwl9IGVsc2UgeworCQlmcHJpbnRmKGZwLCAiZGVmYXVsdCAiKTsKKwl9CisJaWYgKHRiW1JUQV9TUkNdKSB7CisJCWlmIChyLT5ydG1fc3JjX2xlbiAhPSBob3N0X2xlbikgeworCQkJZnByaW50ZihmcCwgImZyb20gJXMvJXUgIiwgcnRfYWRkcl9uMmEoci0+cnRtX2ZhbWlseSwKKwkJCQkJCSAgICAgICBSVEFfUEFZTE9BRCh0YltSVEFfU1JDXSksCisJCQkJCQkgICAgICAgUlRBX0RBVEEodGJbUlRBX1NSQ10pLAorCQkJCQkJICAgICAgIGFidWYsIHNpemVvZihhYnVmKSksCisJCQkJci0+cnRtX3NyY19sZW4KKwkJCQkpOworCQl9IGVsc2UgeworCQkJZnByaW50ZihmcCwgImZyb20gJXMgIiwgZm9ybWF0X2hvc3Qoci0+cnRtX2ZhbWlseSwKKwkJCQkJCSAgICAgICBSVEFfUEFZTE9BRCh0YltSVEFfU1JDXSksCisJCQkJCQkgICAgICAgUlRBX0RBVEEodGJbUlRBX1NSQ10pLAorCQkJCQkJICAgICAgIGFidWYsIHNpemVvZihhYnVmKSkKKwkJCQkpOworCQl9CisJfSBlbHNlIGlmIChyLT5ydG1fc3JjX2xlbikgeworCQlmcHJpbnRmKGZwLCAiZnJvbSAwLyV1ICIsIHItPnJ0bV9zcmNfbGVuKTsKKwl9CisJaWYgKHRiW1JUQV9ORVdEU1RdKSB7CisJCWZwcmludGYoZnAsICJhcyB0byAlcyAiLCBmb3JtYXRfaG9zdChyLT5ydG1fZmFtaWx5LAorCQkJCQkJICBSVEFfUEFZTE9BRCh0YltSVEFfTkVXRFNUXSksCisJCQkJCQkgIFJUQV9EQVRBKHRiW1JUQV9ORVdEU1RdKSwKKwkJCQkJCSAgYWJ1Ziwgc2l6ZW9mKGFidWYpKQorCQkJKTsKKwl9CisKKwlpZiAodGJbUlRBX0VOQ0FQXSkKKwkJbHd0X3ByaW50X2VuY2FwKGZwLCB0YltSVEFfRU5DQVBfVFlQRV0sIHRiW1JUQV9FTkNBUF0pOworCisJaWYgKHItPnJ0bV90b3MgJiYgZmlsdGVyLnRvc21hc2sgIT0gLTEpIHsKKwkJU1BSSU5UX0JVRihiMSk7CisJCWZwcmludGYoZnAsICJ0b3MgJXMgIiwgcnRubF9kc2ZpZWxkX24yYShyLT5ydG1fdG9zLCBiMSwgc2l6ZW9mKGIxKSkpOworCX0KKworCWlmICh0YltSVEFfR0FURVdBWV0gJiYgZmlsdGVyLnJ2aWEuYml0bGVuICE9IGhvc3RfbGVuKSB7CisJCWZwcmludGYoZnAsICJ2aWEgJXMgIiwKKwkJCWZvcm1hdF9ob3N0KHItPnJ0bV9mYW1pbHksCisJCQkJICAgIFJUQV9QQVlMT0FEKHRiW1JUQV9HQVRFV0FZXSksCisJCQkJICAgIFJUQV9EQVRBKHRiW1JUQV9HQVRFV0FZXSksCisJCQkJICAgIGFidWYsIHNpemVvZihhYnVmKSkpOworCX0KKwlpZiAodGJbUlRBX1ZJQV0pIHsKKwkJc2l6ZV90IGxlbiA9IFJUQV9QQVlMT0FEKHRiW1JUQV9WSUFdKSAtIDI7CisJCXN0cnVjdCBydHZpYSAqdmlhID0gUlRBX0RBVEEodGJbUlRBX1ZJQV0pOworCQlmcHJpbnRmKGZwLCAidmlhICVzICVzICIsCisJCQlmYW1pbHlfbmFtZSh2aWEtPnJ0dmlhX2ZhbWlseSksCisJCQlmb3JtYXRfaG9zdCh2aWEtPnJ0dmlhX2ZhbWlseSwgbGVuLCB2aWEtPnJ0dmlhX2FkZHIsCisJCQkJICAgIGFidWYsIHNpemVvZihhYnVmKSkpOworCX0KKwlpZiAodGJbUlRBX09JRl0gJiYgZmlsdGVyLm9pZm1hc2sgIT0gLTEpCisJCWZwcmludGYoZnAsICJkZXYgJXMgIiwgbGxfaW5kZXhfdG9fbmFtZSgqKGludCopUlRBX0RBVEEodGJbUlRBX09JRl0pKSk7CisKKwlpZiAodGFibGUgJiYgKHRhYmxlICE9IFJUX1RBQkxFX01BSU4gfHwgc2hvd19kZXRhaWxzID4gMCkgJiYgIWZpbHRlci50YikKKwkJZnByaW50ZihmcCwgIiB0YWJsZSAlcyAiLCBydG5sX3J0dGFibGVfbjJhKHRhYmxlLCBiMSwgc2l6ZW9mKGIxKSkpOworCWlmICghKHItPnJ0bV9mbGFncyZSVE1fRl9DTE9ORUQpKSB7CisJCWlmICgoci0+cnRtX3Byb3RvY29sICE9IFJUUFJPVF9CT09UIHx8IHNob3dfZGV0YWlscyA+IDApICYmIGZpbHRlci5wcm90b2NvbG1hc2sgIT0gLTEpCisJCQlmcHJpbnRmKGZwLCAiIHByb3RvICVzICIsIHJ0bmxfcnRwcm90X24yYShyLT5ydG1fcHJvdG9jb2wsIGIxLCBzaXplb2YoYjEpKSk7CisJCWlmICgoci0+cnRtX3Njb3BlICE9IFJUX1NDT1BFX1VOSVZFUlNFIHx8IHNob3dfZGV0YWlscyA+IDApICYmIGZpbHRlci5zY29wZW1hc2sgIT0gLTEpCisJCQlmcHJpbnRmKGZwLCAiIHNjb3BlICVzICIsIHJ0bmxfcnRzY29wZV9uMmEoci0+cnRtX3Njb3BlLCBiMSwgc2l6ZW9mKGIxKSkpOworCX0KKwlpZiAodGJbUlRBX1BSRUZTUkNdICYmIGZpbHRlci5ycHJlZnNyYy5iaXRsZW4gIT0gaG9zdF9sZW4pIHsKKwkJLyogRG8gbm90IHVzZSBmb3JtYXRfaG9zdCgpLiBJdCBpcyBvdXIgbG9jYWwgYWRkcgorCQkgICBhbmQgc3ltYm9saWMgbmFtZSB3aWxsIG5vdCBiZSB1c2VmdWwuCisJCSAqLworCQlmcHJpbnRmKGZwLCAiIHNyYyAlcyAiLAorCQkJcnRfYWRkcl9uMmEoci0+cnRtX2ZhbWlseSwKKwkJCQkgICAgUlRBX1BBWUxPQUQodGJbUlRBX1BSRUZTUkNdKSwKKwkJCQkgICAgUlRBX0RBVEEodGJbUlRBX1BSRUZTUkNdKSwKKwkJCQkgICAgYWJ1Ziwgc2l6ZW9mKGFidWYpKSk7CisJfQorCWlmICh0YltSVEFfUFJJT1JJVFldKQorCQlmcHJpbnRmKGZwLCAiIG1ldHJpYyAldSAiLCBydGFfZ2V0YXR0cl91MzIodGJbUlRBX1BSSU9SSVRZXSkpOworCWlmIChyLT5ydG1fZmxhZ3MgJiBSVE5IX0ZfREVBRCkKKwkJZnByaW50ZihmcCwgImRlYWQgIik7CisJaWYgKHItPnJ0bV9mbGFncyAmIFJUTkhfRl9PTkxJTkspCisJCWZwcmludGYoZnAsICJvbmxpbmsgIik7CisJaWYgKHItPnJ0bV9mbGFncyAmIFJUTkhfRl9QRVJWQVNJVkUpCisJCWZwcmludGYoZnAsICJwZXJ2YXNpdmUgIik7CisJaWYgKHItPnJ0bV9mbGFncyAmIFJUTkhfRl9PRkZMT0FEKQorCQlmcHJpbnRmKGZwLCAib2ZmbG9hZCAiKTsKKwlpZiAoci0+cnRtX2ZsYWdzICYgUlRNX0ZfTk9USUZZKQorCQlmcHJpbnRmKGZwLCAibm90aWZ5ICIpOworCWlmIChyLT5ydG1fZmxhZ3MgJiBSVE5IX0ZfTElOS0RPV04pCisJCWZwcmludGYoZnAsICJsaW5rZG93biAiKTsKKwlpZiAodGJbUlRBX01BUktdKSB7CisJCXVuc2lnbmVkIGludCBtYXJrID0gKih1bnNpZ25lZCBpbnQqKVJUQV9EQVRBKHRiW1JUQV9NQVJLXSk7CisJCWlmIChtYXJrKSB7CisJCQlpZiAobWFyayA+PSAxNikKKwkJCQlmcHJpbnRmKGZwLCAiIG1hcmsgMHgleCIsIG1hcmspOworCQkJZWxzZQorCQkJCWZwcmludGYoZnAsICIgbWFyayAldSIsIG1hcmspOworCQl9CisJfQorCisJaWYgKHRiW1JUQV9VSURdKQorCQlmcHJpbnRmKGZwLCAiIHVpZCAldSAiLCBydGFfZ2V0YXR0cl91MzIodGJbUlRBX1VJRF0pKTsKKworCWlmICh0YltSVEFfRkxPV10gJiYgZmlsdGVyLnJlYWxtbWFzayAhPSB+MFUpIHsKKwkJX191MzIgdG8gPSBydGFfZ2V0YXR0cl91MzIodGJbUlRBX0ZMT1ddKTsKKwkJX191MzIgZnJvbSA9IHRvPj4xNjsKKwkJdG8gJj0gMHhGRkZGOworCQlmcHJpbnRmKGZwLCAicmVhbG0lcyAiLCBmcm9tID8gInMiIDogIiIpOworCQlpZiAoZnJvbSkgeworCQkJZnByaW50ZihmcCwgIiVzLyIsCisJCQkJcnRubF9ydHJlYWxtX24yYShmcm9tLCBiMSwgc2l6ZW9mKGIxKSkpOworCQl9CisJCWZwcmludGYoZnAsICIlcyAiLAorCQkJcnRubF9ydHJlYWxtX24yYSh0bywgYjEsIHNpemVvZihiMSkpKTsKKwl9CisJaWYgKChyLT5ydG1fZmxhZ3MmUlRNX0ZfQ0xPTkVEKSAmJiByLT5ydG1fZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJX191MzIgZmxhZ3MgPSByLT5ydG1fZmxhZ3MmfjB4RkZGRjsKKwkJaW50IGZpcnN0ID0gMTsKKworCQlmcHJpbnRmKGZwLCAiJXMgICAgY2FjaGUgIiwgX1NMXyk7CisKKyNkZWZpbmUgUFJURkwoZmwsZmxuYW1lKSBpZiAoZmxhZ3MmUlRDRl8jI2ZsKSB7IFwKKyAgZmxhZ3MgJj0gflJUQ0ZfIyNmbDsgXAorICBmcHJpbnRmKGZwLCAiJXMiIGZsbmFtZSAiJXMiLCBmaXJzdCA/ICI8IiA6ICIiLCBmbGFncyA/ICIsIiA6ICI+ICIpOyBcCisgIGZpcnN0ID0gMDsgfQorCQlQUlRGTChMT0NBTCwgImxvY2FsIik7CisJCVBSVEZMKFJFSkVDVCwgInJlamVjdCIpOworCQlQUlRGTChNVUxUSUNBU1QsICJtYyIpOworCQlQUlRGTChCUk9BRENBU1QsICJicmQiKTsKKwkJUFJURkwoRE5BVCwgImRzdC1uYXQiKTsKKwkJUFJURkwoU05BVCwgInNyYy1uYXQiKTsKKwkJUFJURkwoTUFTUSwgIm1hc3EiKTsKKwkJUFJURkwoRElSRUNURFNULCAiZHN0LWRpcmVjdCIpOworCQlQUlRGTChESVJFQ1RTUkMsICJzcmMtZGlyZWN0Iik7CisJCVBSVEZMKFJFRElSRUNURUQsICJyZWRpcmVjdGVkIik7CisJCVBSVEZMKERPUkVESVJFQ1QsICJyZWRpcmVjdCIpOworCQlQUlRGTChGQVNULCAiZmFzdHJvdXRlIik7CisJCVBSVEZMKE5PVElGWSwgIm5vdGlmeSIpOworCQlQUlRGTChUUFJPWFksICJwcm94eSIpOworCisJCWlmIChmbGFncykKKwkJCWZwcmludGYoZnAsICIlcyV4PiAiLCBmaXJzdCA/ICI8IiA6ICIiLCBmbGFncyk7CisJCWlmICh0YltSVEFfQ0FDSEVJTkZPXSkgeworCQkJc3RydWN0IHJ0YV9jYWNoZWluZm8gKmNpID0gUlRBX0RBVEEodGJbUlRBX0NBQ0hFSU5GT10pOworCQkJaWYgKCFoeikKKwkJCQloeiA9IGdldF91c2VyX2h6KCk7CisJCQlpZiAoY2ktPnJ0YV9leHBpcmVzICE9IDApCisJCQkJZnByaW50ZihmcCwgIiBleHBpcmVzICVkc2VjIiwgY2ktPnJ0YV9leHBpcmVzL2h6KTsKKwkJCWlmIChjaS0+cnRhX2Vycm9yICE9IDApCisJCQkJZnByaW50ZihmcCwgIiBlcnJvciAlZCIsIGNpLT5ydGFfZXJyb3IpOworCQkJaWYgKHNob3dfc3RhdHMpIHsKKwkJCQlpZiAoY2ktPnJ0YV9jbG50cmVmKQorCQkJCQlmcHJpbnRmKGZwLCAiIHVzZXJzICVkIiwgY2ktPnJ0YV9jbG50cmVmKTsKKwkJCQlpZiAoY2ktPnJ0YV91c2VkICE9IDApCisJCQkJCWZwcmludGYoZnAsICIgdXNlZCAlZCIsIGNpLT5ydGFfdXNlZCk7CisJCQkJaWYgKGNpLT5ydGFfbGFzdHVzZSAhPSAwKQorCQkJCQlmcHJpbnRmKGZwLCAiIGFnZSAlZHNlYyIsIGNpLT5ydGFfbGFzdHVzZS9oeik7CisJCQl9CisJCQlpZiAoY2ktPnJ0YV9pZCkKKwkJCQlmcHJpbnRmKGZwLCAiIGlwaWQgMHglMDR4IiwgY2ktPnJ0YV9pZCk7CisJCQlpZiAoY2ktPnJ0YV90cyB8fCBjaS0+cnRhX3RzYWdlKQorCQkJCWZwcmludGYoZnAsICIgdHMgMHgleCB0c2FnZSAlZHNlYyIsCisJCQkJCWNpLT5ydGFfdHMsIGNpLT5ydGFfdHNhZ2UpOworCQl9CisJfSBlbHNlIGlmIChyLT5ydG1fZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCXN0cnVjdCBydGFfY2FjaGVpbmZvICpjaSA9IE5VTEw7CisJCWlmICh0YltSVEFfQ0FDSEVJTkZPXSkKKwkJCWNpID0gUlRBX0RBVEEodGJbUlRBX0NBQ0hFSU5GT10pOworCQlpZiAoKHItPnJ0bV9mbGFncyAmIFJUTV9GX0NMT05FRCkgfHwgKGNpICYmIGNpLT5ydGFfZXhwaXJlcykpIHsKKwkJCWlmICghaHopCisJCQkJaHogPSBnZXRfdXNlcl9oeigpOworCQkJaWYgKHItPnJ0bV9mbGFncyAmIFJUTV9GX0NMT05FRCkKKwkJCQlmcHJpbnRmKGZwLCAiJXMgICAgY2FjaGUgIiwgX1NMXyk7CisJCQlpZiAoY2ktPnJ0YV9leHBpcmVzKQorCQkJCWZwcmludGYoZnAsICIgZXhwaXJlcyAlZHNlYyIsIGNpLT5ydGFfZXhwaXJlcy9oeik7CisJCQlpZiAoY2ktPnJ0YV9lcnJvciAhPSAwKQorCQkJCWZwcmludGYoZnAsICIgZXJyb3IgJWQiLCBjaS0+cnRhX2Vycm9yKTsKKwkJCWlmIChzaG93X3N0YXRzKSB7CisJCQkJaWYgKGNpLT5ydGFfY2xudHJlZikKKwkJCQkJZnByaW50ZihmcCwgIiB1c2VycyAlZCIsIGNpLT5ydGFfY2xudHJlZik7CisJCQkJaWYgKGNpLT5ydGFfdXNlZCAhPSAwKQorCQkJCQlmcHJpbnRmKGZwLCAiIHVzZWQgJWQiLCBjaS0+cnRhX3VzZWQpOworCQkJCWlmIChjaS0+cnRhX2xhc3R1c2UgIT0gMCkKKwkJCQkJZnByaW50ZihmcCwgIiBhZ2UgJWRzZWMiLCBjaS0+cnRhX2xhc3R1c2UvaHopOworCQkJfQorCQl9IGVsc2UgaWYgKGNpKSB7CisJCQlpZiAoY2ktPnJ0YV9lcnJvciAhPSAwKQorCQkJCWZwcmludGYoZnAsICIgZXJyb3IgJWQiLCBjaS0+cnRhX2Vycm9yKTsKKwkJfQorCX0KKwlpZiAodGJbUlRBX01FVFJJQ1NdKSB7CisJCWludCBpOworCQl1bnNpZ25lZCBteGxvY2sgPSAwOworCQlzdHJ1Y3QgcnRhdHRyICpteHJ0YVtSVEFYX01BWCsxXTsKKworCQlwYXJzZV9ydGF0dHIobXhydGEsIFJUQVhfTUFYLCBSVEFfREFUQSh0YltSVEFfTUVUUklDU10pLAorCQkJICAgIFJUQV9QQVlMT0FEKHRiW1JUQV9NRVRSSUNTXSkpOworCQlpZiAobXhydGFbUlRBWF9MT0NLXSkKKwkJCW14bG9jayA9ICoodW5zaWduZWQqKVJUQV9EQVRBKG14cnRhW1JUQVhfTE9DS10pOworCisJCWZvciAoaT0yOyBpPD0gUlRBWF9NQVg7IGkrKykgeworCQkJX191MzIgdmFsOworCisJCQlpZiAobXhydGFbaV0gPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGkgIT0gUlRBWF9DQ19BTEdPKQorCQkJCXZhbCA9IHJ0YV9nZXRhdHRyX3UzMihteHJ0YVtpXSk7CisKKwkJCWlmIChpID09IFJUQVhfSE9QTElNSVQgJiYgKGludCl2YWwgPT0gLTEpCisJCQkJY29udGludWU7CisKKwkJCWlmIChpIDwgc2l6ZW9mKG14X25hbWVzKS9zaXplb2YoY2hhciopICYmIG14X25hbWVzW2ldKQorCQkJCWZwcmludGYoZnAsICIgJXMiLCBteF9uYW1lc1tpXSk7CisJCQllbHNlCisJCQkJZnByaW50ZihmcCwgIiBtZXRyaWMgJWQiLCBpKTsKKworCQkJaWYgKG14bG9jayAmICgxPDxpKSkKKwkJCQlmcHJpbnRmKGZwLCAiIGxvY2siKTsKKworCQkJc3dpdGNoIChpKSB7CisJCQljYXNlIFJUQVhfRkVBVFVSRVM6CisJCQkJcHJpbnRfcnRheF9mZWF0dXJlcyhmcCwgdmFsKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZnByaW50ZihmcCwgIiAldSIsIHZhbCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUlRBWF9SVFQ6CisJCQljYXNlIFJUQVhfUlRUVkFSOgorCQkJY2FzZSBSVEFYX1JUT19NSU46CisJCQkJaWYgKGkgPT0gUlRBWF9SVFQpCisJCQkJCXZhbCAvPSA4OworCQkJCWVsc2UgaWYgKGkgPT0gUlRBWF9SVFRWQVIpCisJCQkJCXZhbCAvPSA0OworCisJCQkJaWYgKHZhbCA+PSAxMDAwKQorCQkJCQlmcHJpbnRmKGZwLCAiICVncyIsIHZhbC8xZTMpOworCQkJCWVsc2UKKwkJCQkJZnByaW50ZihmcCwgIiAldW1zIiwgdmFsKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUlRBWF9DQ19BTEdPOgorCQkJCWZwcmludGYoZnAsICIgJXMiLCBydGFfZ2V0YXR0cl9zdHIobXhydGFbaV0pKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlpZiAodGJbUlRBX0lJRl0gJiYgZmlsdGVyLmlpZm1hc2sgIT0gLTEpIHsKKwkJZnByaW50ZihmcCwgIiBpaWYgJXMiLCBsbF9pbmRleF90b19uYW1lKCooaW50KilSVEFfREFUQSh0YltSVEFfSUlGXSkpKTsKKwl9CisJaWYgKHRiW1JUQV9NVUxUSVBBVEhdKSB7CisJCXN0cnVjdCBydG5leHRob3AgKm5oID0gUlRBX0RBVEEodGJbUlRBX01VTFRJUEFUSF0pOworCQlpbnQgZmlyc3QgPSAwOworCisJCWxlbiA9IFJUQV9QQVlMT0FEKHRiW1JUQV9NVUxUSVBBVEhdKTsKKworCQlmb3IgKDs7KSB7CisJCQlpZiAobGVuIDwgc2l6ZW9mKCpuaCkpCisJCQkJYnJlYWs7CisJCQlpZiAobmgtPnJ0bmhfbGVuID4gbGVuKQorCQkJCWJyZWFrOworCQkJaWYgKHItPnJ0bV9mbGFncyZSVE1fRl9DTE9ORUQgJiYgci0+cnRtX3R5cGUgPT0gUlROX01VTFRJQ0FTVCkgeworCQkJCWlmIChmaXJzdCkKKwkJCQkJZnByaW50ZihmcCwgIiBPaWZzOiIpOworCQkJCWVsc2UKKwkJCQkJZnByaW50ZihmcCwgIiAiKTsKKwkJCX0gZWxzZQorCQkJCWZwcmludGYoZnAsICIlc1x0bmV4dGhvcCIsIF9TTF8pOworCQkJaWYgKG5oLT5ydG5oX2xlbiA+IHNpemVvZigqbmgpKSB7CisJCQkJcGFyc2VfcnRhdHRyKHRiLCBSVEFfTUFYLCBSVE5IX0RBVEEobmgpLCBuaC0+cnRuaF9sZW4gLSBzaXplb2YoKm5oKSk7CisKKwkJCQlpZiAodGJbUlRBX0VOQ0FQXSkKKwkJCQkJbHd0X3ByaW50X2VuY2FwKGZwLAorCQkJCQkJCXRiW1JUQV9FTkNBUF9UWVBFXSwKKwkJCQkJCQl0YltSVEFfRU5DQVBdKTsKKworCQkJCWlmICh0YltSVEFfR0FURVdBWV0pIHsKKwkJCQkJZnByaW50ZihmcCwgIiB2aWEgJXMgIiwKKwkJCQkJCWZvcm1hdF9ob3N0KHItPnJ0bV9mYW1pbHksCisJCQkJCQkJICAgIFJUQV9QQVlMT0FEKHRiW1JUQV9HQVRFV0FZXSksCisJCQkJCQkJICAgIFJUQV9EQVRBKHRiW1JUQV9HQVRFV0FZXSksCisJCQkJCQkJICAgIGFidWYsIHNpemVvZihhYnVmKSkpOworCQkJCX0KKwkJCQlpZiAodGJbUlRBX1ZJQV0pIHsKKwkJCQkJc2l6ZV90IGxlbiA9IFJUQV9QQVlMT0FEKHRiW1JUQV9WSUFdKSAtIDI7CisJCQkJCXN0cnVjdCBydHZpYSAqdmlhID0gUlRBX0RBVEEodGJbUlRBX1ZJQV0pOworCQkJCQlmcHJpbnRmKGZwLCAidmlhICVzICVzICIsCisJCQkJCQlmYW1pbHlfbmFtZSh2aWEtPnJ0dmlhX2ZhbWlseSksCisJCQkJCQlmb3JtYXRfaG9zdCh2aWEtPnJ0dmlhX2ZhbWlseSwgbGVuLCB2aWEtPnJ0dmlhX2FkZHIsCisJCQkJCQkJICAgIGFidWYsIHNpemVvZihhYnVmKSkpOworCQkJCX0KKwkJCQlpZiAodGJbUlRBX0ZMT1ddKSB7CisJCQkJCV9fdTMyIHRvID0gcnRhX2dldGF0dHJfdTMyKHRiW1JUQV9GTE9XXSk7CisJCQkJCV9fdTMyIGZyb20gPSB0bz4+MTY7CisJCQkJCXRvICY9IDB4RkZGRjsKKwkJCQkJZnByaW50ZihmcCwgIiByZWFsbSVzICIsIGZyb20gPyAicyIgOiAiIik7CisJCQkJCWlmIChmcm9tKSB7CisJCQkJCQlmcHJpbnRmKGZwLCAiJXMvIiwKKwkJCQkJCQlydG5sX3J0cmVhbG1fbjJhKGZyb20sIGIxLCBzaXplb2YoYjEpKSk7CisJCQkJCX0KKwkJCQkJZnByaW50ZihmcCwgIiVzIiwKKwkJCQkJCXJ0bmxfcnRyZWFsbV9uMmEodG8sIGIxLCBzaXplb2YoYjEpKSk7CisJCQkJfQorCQkJfQorCQkJaWYgKHItPnJ0bV9mbGFncyZSVE1fRl9DTE9ORUQgJiYgci0+cnRtX3R5cGUgPT0gUlROX01VTFRJQ0FTVCkgeworCQkJCWZwcmludGYoZnAsICIgJXMiLCBsbF9pbmRleF90b19uYW1lKG5oLT5ydG5oX2lmaW5kZXgpKTsKKwkJCQlpZiAobmgtPnJ0bmhfaG9wcyAhPSAxKQorCQkJCQlmcHJpbnRmKGZwLCAiKHR0bD4lZCkiLCBuaC0+cnRuaF9ob3BzKTsKKwkJCX0gZWxzZSB7CisJCQkJZnByaW50ZihmcCwgIiBkZXYgJXMiLCBsbF9pbmRleF90b19uYW1lKG5oLT5ydG5oX2lmaW5kZXgpKTsKKwkJCQlmcHJpbnRmKGZwLCAiIHdlaWdodCAlZCIsIG5oLT5ydG5oX2hvcHMrMSk7CisJCQl9CisJCQlpZiAobmgtPnJ0bmhfZmxhZ3MgJiBSVE5IX0ZfREVBRCkKKwkJCQlmcHJpbnRmKGZwLCAiIGRlYWQiKTsKKwkJCWlmIChuaC0+cnRuaF9mbGFncyAmIFJUTkhfRl9PTkxJTkspCisJCQkJZnByaW50ZihmcCwgIiBvbmxpbmsiKTsKKwkJCWlmIChuaC0+cnRuaF9mbGFncyAmIFJUTkhfRl9QRVJWQVNJVkUpCisJCQkJZnByaW50ZihmcCwgIiBwZXJ2YXNpdmUiKTsKKwkJCWlmIChuaC0+cnRuaF9mbGFncyAmIFJUTkhfRl9MSU5LRE9XTikKKwkJCQlmcHJpbnRmKGZwLCAiIGxpbmtkb3duIik7CisJCQlsZW4gLT0gTkxNU0dfQUxJR04obmgtPnJ0bmhfbGVuKTsKKwkJCW5oID0gUlROSF9ORVhUKG5oKTsKKwkJfQorCX0KKwlpZiAodGJbUlRBX1BSRUZdKSB7CisJCXVuc2lnbmVkIGludCBwcmVmID0gcnRhX2dldGF0dHJfdTgodGJbUlRBX1BSRUZdKTsKKwkJZnByaW50ZihmcCwgIiBwcmVmICIpOworCisJCXN3aXRjaCAocHJlZikgeworCQljYXNlIElDTVBWNl9ST1VURVJfUFJFRl9MT1c6CisJCQlmcHJpbnRmKGZwLCAibG93Iik7CisJCQlicmVhazsKKwkJY2FzZSBJQ01QVjZfUk9VVEVSX1BSRUZfTUVESVVNOgorCQkJZnByaW50ZihmcCwgIm1lZGl1bSIpOworCQkJYnJlYWs7CisJCWNhc2UgSUNNUFY2X1JPVVRFUl9QUkVGX0hJR0g6CisJCQlmcHJpbnRmKGZwLCAiaGlnaCIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKGZwLCAiJXUiLCBwcmVmKTsKKwkJfQorCX0KKwlmcHJpbnRmKGZwLCAiXG4iKTsKKwlmZmx1c2goZnApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX29uZV9uaChzdHJ1Y3Qgbmxtc2doZHIgKm4sIHN0cnVjdCBydG1zZyAqciwKKwkJCXN0cnVjdCBydGF0dHIgKnJ0YSwgc3RydWN0IHJ0bmV4dGhvcCAqcnRuaCwKKwkJCWludCAqYXJnY3AsIGNoYXIgKioqYXJndnApCit7CisJaW50IGFyZ2MgPSAqYXJnY3A7CisJY2hhciAqKmFyZ3YgPSAqYXJndnA7CisKKwl3aGlsZSAoKythcmd2LCAtLWFyZ2MgPiAwKSB7CisJCWlmIChzdHJjbXAoKmFyZ3YsICJ2aWEiKSA9PSAwKSB7CisJCQlpbmV0X3ByZWZpeCBhZGRyOworCQkJaW50IGZhbWlseTsKKwkJCU5FWFRfQVJHKCk7CisJCQlmYW1pbHkgPSByZWFkX2ZhbWlseSgqYXJndik7CisJCQlpZiAoZmFtaWx5ID09IEFGX1VOU1BFQykKKwkJCQlmYW1pbHkgPSByLT5ydG1fZmFtaWx5OworCQkJZWxzZQorCQkJCU5FWFRfQVJHKCk7CisJCQlnZXRfYWRkcigmYWRkciwgKmFyZ3YsIGZhbWlseSk7CisJCQlpZiAoci0+cnRtX2ZhbWlseSA9PSBBRl9VTlNQRUMpCisJCQkJci0+cnRtX2ZhbWlseSA9IGFkZHIuZmFtaWx5OworCQkJaWYgKGFkZHIuZmFtaWx5ID09IHItPnJ0bV9mYW1pbHkpIHsKKwkJCQlydGFfYWRkYXR0cl9sKHJ0YSwgNDA5NiwgUlRBX0dBVEVXQVksICZhZGRyLmRhdGEsIGFkZHIuYnl0ZWxlbik7CisJCQkJcnRuaC0+cnRuaF9sZW4gKz0gc2l6ZW9mKHN0cnVjdCBydGF0dHIpICsgYWRkci5ieXRlbGVuOworCQkJfSBlbHNlIHsKKwkJCQlydGFfYWRkYXR0cl9sKHJ0YSwgNDA5NiwgUlRBX1ZJQSwgJmFkZHIuZmFtaWx5LCBhZGRyLmJ5dGVsZW4rMik7CisJCQkJcnRuaC0+cnRuaF9sZW4gKz0gc2l6ZW9mKHN0cnVjdCBydGF0dHIpICsgYWRkci5ieXRlbGVuKzI7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZGV2IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmICgocnRuaC0+cnRuaF9pZmluZGV4ID0gbGxfbmFtZV90b19pbmRleCgqYXJndikpID09IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBmaW5kIGRldmljZSBcIiVzXCJcbiIsICphcmd2KTsKKwkJCQlleGl0KDEpOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIndlaWdodCIpID09IDApIHsKKwkJCXVuc2lnbmVkIHc7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91bnNpZ25lZCgmdywgKmFyZ3YsIDApIHx8IHcgPT0gMCB8fCB3ID4gMjU2KQorCQkJCWludmFyZygiXCJ3ZWlnaHRcIiBpcyBpbnZhbGlkXG4iLCAqYXJndik7CisJCQlydG5oLT5ydG5oX2hvcHMgPSB3IC0gMTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJvbmxpbmsiKSA9PSAwKSB7CisJCQlydG5oLT5ydG5oX2ZsYWdzIHw9IFJUTkhfRl9PTkxJTks7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInJlYWxtcyIpID09IDApIHsKKwkJCV9fdTMyIHJlYWxtOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfcnRfcmVhbG1zX29yX3JhdygmcmVhbG0sICphcmd2KSkKKwkJCQlpbnZhcmcoIlwicmVhbG1cIiB2YWx1ZSBpcyBpbnZhbGlkXG4iLCAqYXJndik7CisJCQlydGFfYWRkYXR0cjMyKHJ0YSwgNDA5NiwgUlRBX0ZMT1csIHJlYWxtKTsKKwkJCXJ0bmgtPnJ0bmhfbGVuICs9IHNpemVvZihzdHJ1Y3QgcnRhdHRyKSArIDQ7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZW5jYXAiKSA9PSAwKSB7CisJCQlpbnQgbGVuID0gcnRhLT5ydGFfbGVuOworCisJCQlsd3RfcGFyc2VfZW5jYXAocnRhLCA0MDk2LCAmYXJnYywgJmFyZ3YpOworCQkJcnRuaC0+cnRuaF9sZW4gKz0gcnRhLT5ydGFfbGVuIC0gbGVuOworCQl9IGVsc2UKKwkJCWJyZWFrOworCX0KKwkqYXJnY3AgPSBhcmdjOworCSphcmd2cCA9IGFyZ3Y7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfbmV4dGhvcHMoc3RydWN0IG5sbXNnaGRyICpuLCBzdHJ1Y3QgcnRtc2cgKnIsCisJCQkgIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyIGJ1ZlsxMDI0XTsKKwlzdHJ1Y3QgcnRhdHRyICpydGEgPSAodm9pZCopYnVmOworCXN0cnVjdCBydG5leHRob3AgKnJ0bmg7CisKKwlydGEtPnJ0YV90eXBlID0gUlRBX01VTFRJUEFUSDsKKwlydGEtPnJ0YV9sZW4gPSBSVEFfTEVOR1RIKDApOworCXJ0bmggPSBSVEFfREFUQShydGEpOworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChzdHJjbXAoKmFyZ3YsICJuZXh0aG9wIikgIT0gMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJFcnJvcjogXCJuZXh0aG9wXCIgb3IgZW5kIG9mIGxpbmUgaXMgZXhwZWN0ZWQgaW5zdGVhZCBvZiBcIiVzXCJcbiIsICphcmd2KTsKKwkJCWV4aXQoLTEpOworCQl9CisJCWlmIChhcmdjIDw9IDEpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiRXJyb3I6IHVuZXhwZWN0ZWQgZW5kIG9mIGxpbmUgYWZ0ZXIgXCJuZXh0aG9wXCJcbiIpOworCQkJZXhpdCgtMSk7CisJCX0KKwkJbWVtc2V0KHJ0bmgsIDAsIHNpemVvZigqcnRuaCkpOworCQlydG5oLT5ydG5oX2xlbiA9IHNpemVvZigqcnRuaCk7CisJCXJ0YS0+cnRhX2xlbiArPSBydG5oLT5ydG5oX2xlbjsKKwkJcGFyc2Vfb25lX25oKG4sIHIsIHJ0YSwgcnRuaCwgJmFyZ2MsICZhcmd2KTsKKwkJcnRuaCA9IFJUTkhfTkVYVChydG5oKTsKKwl9CisKKwlpZiAocnRhLT5ydGFfbGVuID4gUlRBX0xFTkdUSCgwKSkKKwkJYWRkYXR0cl9sKG4sIDEwMjQsIFJUQV9NVUxUSVBBVEgsIFJUQV9EQVRBKHJ0YSksIFJUQV9QQVlMT0FEKHJ0YSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwcm91dGVfbW9kaWZ5KGludCBjbWQsIHVuc2lnbmVkIGZsYWdzLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyCW47CisJCXN0cnVjdCBydG1zZwkJcjsKKwkJY2hhciAgCQkJYnVmWzEwMjRdOworCX0gcmVxOworCWNoYXIgIG14YnVmWzI1Nl07CisJc3RydWN0IHJ0YXR0ciAqIG14cnRhID0gKHZvaWQqKW14YnVmOworCXVuc2lnbmVkIG14bG9jayA9IDA7CisJY2hhciAgKmQgPSBOVUxMOworCWludCBnd19vayA9IDA7CisJaW50IGRzdF9vayA9IDA7CisJaW50IG5oc19vayA9IDA7CisJaW50IHNjb3BlX29rID0gMDsKKwlpbnQgdGFibGVfb2sgPSAwOworCWludCByYXcgPSAwOworCWludCB0eXBlX29rID0gMDsKKwlzdGF0aWMgaW50IGh6OworCisJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKworCXJlcS5uLm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IHJ0bXNnKSk7CisJcmVxLm4ubmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUfGZsYWdzOworCXJlcS5uLm5sbXNnX3R5cGUgPSBjbWQ7CisJcmVxLnIucnRtX2ZhbWlseSA9IHByZWZlcnJlZF9mYW1pbHk7CisJcmVxLnIucnRtX3RhYmxlID0gUlRfVEFCTEVfTUFJTjsKKwlyZXEuci5ydG1fc2NvcGUgPSBSVF9TQ09QRV9OT1dIRVJFOworCisJaWYgKGNtZCAhPSBSVE1fREVMUk9VVEUpIHsKKwkJcmVxLnIucnRtX3Byb3RvY29sID0gUlRQUk9UX0JPT1Q7CisJCXJlcS5yLnJ0bV9zY29wZSA9IFJUX1NDT1BFX1VOSVZFUlNFOworCQlyZXEuci5ydG1fdHlwZSA9IFJUTl9VTklDQVNUOworCX0KKworCW14cnRhLT5ydGFfdHlwZSA9IFJUQV9NRVRSSUNTOworCW14cnRhLT5ydGFfbGVuID0gUlRBX0xFTkdUSCgwKTsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAoc3RyY21wKCphcmd2LCAic3JjIikgPT0gMCkgeworCQkJaW5ldF9wcmVmaXggYWRkcjsKKwkJCU5FWFRfQVJHKCk7CisJCQlnZXRfYWRkcigmYWRkciwgKmFyZ3YsIHJlcS5yLnJ0bV9mYW1pbHkpOworCQkJaWYgKHJlcS5yLnJ0bV9mYW1pbHkgPT0gQUZfVU5TUEVDKQorCQkJCXJlcS5yLnJ0bV9mYW1pbHkgPSBhZGRyLmZhbWlseTsKKwkJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBSVEFfUFJFRlNSQywgJmFkZHIuZGF0YSwgYWRkci5ieXRlbGVuKTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJhcyIpID09IDApIHsKKwkJCWluZXRfcHJlZml4IGFkZHI7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHN0cmNtcCgqYXJndiwgInRvIikgPT0gMCkgeworCQkJCU5FWFRfQVJHKCk7CisJCQl9CisJCQlnZXRfYWRkcigmYWRkciwgKmFyZ3YsIHJlcS5yLnJ0bV9mYW1pbHkpOworCQkJaWYgKHJlcS5yLnJ0bV9mYW1pbHkgPT0gQUZfVU5TUEVDKQorCQkJCXJlcS5yLnJ0bV9mYW1pbHkgPSBhZGRyLmZhbWlseTsKKwkJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBSVEFfTkVXRFNULCAmYWRkci5kYXRhLCBhZGRyLmJ5dGVsZW4pOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInZpYSIpID09IDApIHsKKwkJCWluZXRfcHJlZml4IGFkZHI7CisJCQlpbnQgZmFtaWx5OworCQkJZ3dfb2sgPSAxOworCQkJTkVYVF9BUkcoKTsKKwkJCWZhbWlseSA9IHJlYWRfZmFtaWx5KCphcmd2KTsKKwkJCWlmIChmYW1pbHkgPT0gQUZfVU5TUEVDKQorCQkJCWZhbWlseSA9IHJlcS5yLnJ0bV9mYW1pbHk7CisJCQllbHNlCisJCQkJTkVYVF9BUkcoKTsKKwkJCWdldF9hZGRyKCZhZGRyLCAqYXJndiwgZmFtaWx5KTsKKwkJCWlmIChyZXEuci5ydG1fZmFtaWx5ID09IEFGX1VOU1BFQykKKwkJCQlyZXEuci5ydG1fZmFtaWx5ID0gYWRkci5mYW1pbHk7CisJCQlpZiAoYWRkci5mYW1pbHkgPT0gcmVxLnIucnRtX2ZhbWlseSkKKwkJCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgUlRBX0dBVEVXQVksICZhZGRyLmRhdGEsIGFkZHIuYnl0ZWxlbik7CisJCQllbHNlCisJCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIFJUQV9WSUEsICZhZGRyLmZhbWlseSwgYWRkci5ieXRlbGVuKzIpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImZyb20iKSA9PSAwKSB7CisJCQlpbmV0X3ByZWZpeCBhZGRyOworCQkJTkVYVF9BUkcoKTsKKwkJCWdldF9wcmVmaXgoJmFkZHIsICphcmd2LCByZXEuci5ydG1fZmFtaWx5KTsKKwkJCWlmIChyZXEuci5ydG1fZmFtaWx5ID09IEFGX1VOU1BFQykKKwkJCQlyZXEuci5ydG1fZmFtaWx5ID0gYWRkci5mYW1pbHk7CisJCQlpZiAoYWRkci5ieXRlbGVuKQorCQkJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBSVEFfU1JDLCAmYWRkci5kYXRhLCBhZGRyLmJ5dGVsZW4pOworCQkJcmVxLnIucnRtX3NyY19sZW4gPSBhZGRyLmJpdGxlbjsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJ0b3MiKSA9PSAwIHx8CisJCQkgICBtYXRjaGVzKCphcmd2LCAiZHNmaWVsZCIpID09IDApIHsKKwkJCV9fdTMyIHRvczsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocnRubF9kc2ZpZWxkX2EybigmdG9zLCAqYXJndikpCisJCQkJaW52YXJnKCJcInRvc1wiIHZhbHVlIGlzIGludmFsaWRcbiIsICphcmd2KTsKKwkJCXJlcS5yLnJ0bV90b3MgPSB0b3M7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZXhwaXJlcyIpID09IDAgKSB7CisJCQlfX3UzMiBleHBpcmVzOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTMyKCZleHBpcmVzLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJcImV4cGlyZXNcIiB2YWx1ZSBpcyBpbnZhbGlkXG4iLCAqYXJndik7CisJCQlpZiAoIWh6KQorCQkJCWh6ID0gZ2V0X3VzZXJfaHooKTsKKwkJCWFkZGF0dHIzMigmcmVxLm4sIHNpemVvZihyZXEpLCBSVEFfRVhQSVJFUywgZXhwaXJlcypoeik7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgIm1ldHJpYyIpID09IDAgfHwKKwkJCSAgIG1hdGNoZXMoKmFyZ3YsICJwcmlvcml0eSIpID09IDAgfHwKKwkJCSAgIHN0cmNtcCgqYXJndiwgInByZWZlcmVuY2UiKSA9PSAwKSB7CisJCQlfX3UzMiBtZXRyaWM7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJm1ldHJpYywgKmFyZ3YsIDApKQorCQkJCWludmFyZygiXCJtZXRyaWNcIiB2YWx1ZSBpcyBpbnZhbGlkXG4iLCAqYXJndik7CisJCQlhZGRhdHRyMzIoJnJlcS5uLCBzaXplb2YocmVxKSwgUlRBX1BSSU9SSVRZLCBtZXRyaWMpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInNjb3BlIikgPT0gMCkgeworCQkJX191MzIgc2NvcGUgPSAwOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChydG5sX3J0c2NvcGVfYTJuKCZzY29wZSwgKmFyZ3YpKQorCQkJCWludmFyZygiaW52YWxpZCBcInNjb3BlXCIgdmFsdWVcbiIsICphcmd2KTsKKwkJCXJlcS5yLnJ0bV9zY29wZSA9IHNjb3BlOworCQkJc2NvcGVfb2sgPSAxOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm10dSIpID09IDApIHsKKwkJCXVuc2lnbmVkIG10dTsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoc3RyY21wKCphcmd2LCAibG9jayIpID09IDApIHsKKwkJCQlteGxvY2sgfD0gKDE8PFJUQVhfTVRVKTsKKwkJCQlORVhUX0FSRygpOworCQkJfQorCQkJaWYgKGdldF91bnNpZ25lZCgmbXR1LCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJcIm10dVwiIHZhbHVlIGlzIGludmFsaWRcbiIsICphcmd2KTsKKwkJCXJ0YV9hZGRhdHRyMzIobXhydGEsIHNpemVvZihteGJ1ZiksIFJUQVhfTVRVLCBtdHUpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImhvcGxpbWl0IikgPT0gMCkgeworCQkJdW5zaWduZWQgaG9wbGltaXQ7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHN0cmNtcCgqYXJndiwgImxvY2siKSA9PSAwKSB7CisJCQkJbXhsb2NrIHw9ICgxPDxSVEFYX0hPUExJTUlUKTsKKwkJCQlORVhUX0FSRygpOworCQkJfQorCQkJaWYgKGdldF91bnNpZ25lZCgmaG9wbGltaXQsICphcmd2LCAwKSB8fCBob3BsaW1pdCA+IDI1NSkKKwkJCQlpbnZhcmcoIlwiaG9wbGltaXRcIiB2YWx1ZSBpcyBpbnZhbGlkXG4iLCAqYXJndik7CisJCQlydGFfYWRkYXR0cjMyKG14cnRhLCBzaXplb2YobXhidWYpLCBSVEFYX0hPUExJTUlULCBob3BsaW1pdCk7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiYWR2bXNzIikgPT0gMCkgeworCQkJdW5zaWduZWQgbXNzOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJsb2NrIikgPT0gMCkgeworCQkJCW14bG9jayB8PSAoMTw8UlRBWF9BRFZNU1MpOworCQkJCU5FWFRfQVJHKCk7CisJCQl9CisJCQlpZiAoZ2V0X3Vuc2lnbmVkKCZtc3MsICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoIlwibXNzXCIgdmFsdWUgaXMgaW52YWxpZFxuIiwgKmFyZ3YpOworCQkJcnRhX2FkZGF0dHIzMihteHJ0YSwgc2l6ZW9mKG14YnVmKSwgUlRBWF9BRFZNU1MsIG1zcyk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInJlb3JkZXJpbmciKSA9PSAwKSB7CisJCQl1bnNpZ25lZCByZW9yZDsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoc3RyY21wKCphcmd2LCAibG9jayIpID09IDApIHsKKwkJCQlteGxvY2sgfD0gKDE8PFJUQVhfUkVPUkRFUklORyk7CisJCQkJTkVYVF9BUkcoKTsKKwkJCX0KKwkJCWlmIChnZXRfdW5zaWduZWQoJnJlb3JkLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJcInJlb3JkZXJpbmdcIiB2YWx1ZSBpcyBpbnZhbGlkXG4iLCAqYXJndik7CisJCQlydGFfYWRkYXR0cjMyKG14cnRhLCBzaXplb2YobXhidWYpLCBSVEFYX1JFT1JERVJJTkcsIHJlb3JkKTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJydHQiKSA9PSAwKSB7CisJCQl1bnNpZ25lZCBydHQ7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHN0cmNtcCgqYXJndiwgImxvY2siKSA9PSAwKSB7CisJCQkJbXhsb2NrIHw9ICgxPDxSVEFYX1JUVCk7CisJCQkJTkVYVF9BUkcoKTsKKwkJCX0KKwkJCWlmIChnZXRfdGltZV9ydHQoJnJ0dCwgKmFyZ3YsICZyYXcpKQorCQkJCWludmFyZygiXCJydHRcIiB2YWx1ZSBpcyBpbnZhbGlkXG4iLCAqYXJndik7CisJCQlydGFfYWRkYXR0cjMyKG14cnRhLCBzaXplb2YobXhidWYpLCBSVEFYX1JUVCwKKwkJCQkocmF3KSA/IHJ0dCA6IHJ0dCAqIDgpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInJ0b19taW4iKSA9PSAwKSB7CisJCQl1bnNpZ25lZCBydG9fbWluOworCQkJTkVYVF9BUkcoKTsKKwkJCW14bG9jayB8PSAoMTw8UlRBWF9SVE9fTUlOKTsKKwkJCWlmIChnZXRfdGltZV9ydHQoJnJ0b19taW4sICphcmd2LCAmcmF3KSkKKwkJCQlpbnZhcmcoIlwicnRvX21pblwiIHZhbHVlIGlzIGludmFsaWRcbiIsCisJCQkJICAgICAgICphcmd2KTsKKwkJCXJ0YV9hZGRhdHRyMzIobXhydGEsIHNpemVvZihteGJ1ZiksIFJUQVhfUlRPX01JTiwKKwkJCQkgICAgICBydG9fbWluKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAid2luZG93IikgPT0gMCkgeworCQkJdW5zaWduZWQgd2luOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJsb2NrIikgPT0gMCkgeworCQkJCW14bG9jayB8PSAoMTw8UlRBWF9XSU5ET1cpOworCQkJCU5FWFRfQVJHKCk7CisJCQl9CisJCQlpZiAoZ2V0X3Vuc2lnbmVkKCZ3aW4sICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoIlwid2luZG93XCIgdmFsdWUgaXMgaW52YWxpZFxuIiwgKmFyZ3YpOworCQkJcnRhX2FkZGF0dHIzMihteHJ0YSwgc2l6ZW9mKG14YnVmKSwgUlRBWF9XSU5ET1csIHdpbik7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImN3bmQiKSA9PSAwKSB7CisJCQl1bnNpZ25lZCB3aW47CisJCQlORVhUX0FSRygpOworCQkJaWYgKHN0cmNtcCgqYXJndiwgImxvY2siKSA9PSAwKSB7CisJCQkJbXhsb2NrIHw9ICgxPDxSVEFYX0NXTkQpOworCQkJCU5FWFRfQVJHKCk7CisJCQl9CisJCQlpZiAoZ2V0X3Vuc2lnbmVkKCZ3aW4sICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoIlwiY3duZFwiIHZhbHVlIGlzIGludmFsaWRcbiIsICphcmd2KTsKKwkJCXJ0YV9hZGRhdHRyMzIobXhydGEsIHNpemVvZihteGJ1ZiksIFJUQVhfQ1dORCwgd2luKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiaW5pdGN3bmQiKSA9PSAwKSB7CisJCQl1bnNpZ25lZCB3aW47CisJCQlORVhUX0FSRygpOworCQkJaWYgKHN0cmNtcCgqYXJndiwgImxvY2siKSA9PSAwKSB7CisJCQkJbXhsb2NrIHw9ICgxPDxSVEFYX0lOSVRDV05EKTsKKwkJCQlORVhUX0FSRygpOworCQkJfQorCQkJaWYgKGdldF91bnNpZ25lZCgmd2luLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJcImluaXRjd25kXCIgdmFsdWUgaXMgaW52YWxpZFxuIiwgKmFyZ3YpOworCQkJcnRhX2FkZGF0dHIzMihteHJ0YSwgc2l6ZW9mKG14YnVmKSwgUlRBWF9JTklUQ1dORCwgd2luKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiaW5pdHJ3bmQiKSA9PSAwKSB7CisJCQl1bnNpZ25lZCB3aW47CisJCQlORVhUX0FSRygpOworCQkJaWYgKHN0cmNtcCgqYXJndiwgImxvY2siKSA9PSAwKSB7CisJCQkJbXhsb2NrIHw9ICgxPDxSVEFYX0lOSVRSV05EKTsKKwkJCQlORVhUX0FSRygpOworCQkJfQorCQkJaWYgKGdldF91bnNpZ25lZCgmd2luLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJcImluaXRyd25kXCIgdmFsdWUgaXMgaW52YWxpZFxuIiwgKmFyZ3YpOworCQkJcnRhX2FkZGF0dHIzMihteHJ0YSwgc2l6ZW9mKG14YnVmKSwgUlRBWF9JTklUUldORCwgd2luKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiZmVhdHVyZXMiKSA9PSAwKSB7CisJCQl1bnNpZ25lZCBpbnQgZmVhdHVyZXMgPSAwOworCisJCQl3aGlsZSAoYXJnYyA+IDApIHsKKwkJCQlORVhUX0FSRygpOworCisJCQkJaWYgKHN0cmNtcCgqYXJndiwgImVjbiIpID09IDApCisJCQkJCWZlYXR1cmVzIHw9IFJUQVhfRkVBVFVSRV9FQ047CisJCQkJZWxzZQorCQkJCQlpbnZhcmcoIlwiZmVhdHVyZXNcIiB2YWx1ZSBub3QgdmFsaWRcbiIsICphcmd2KTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcnRhX2FkZGF0dHIzMihteHJ0YSwgc2l6ZW9mKG14YnVmKSwgUlRBWF9GRUFUVVJFUywgZmVhdHVyZXMpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJxdWlja2FjayIpID09IDApIHsKKwkJCXVuc2lnbmVkIHF1aWNrYWNrOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdW5zaWduZWQoJnF1aWNrYWNrLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJcInF1aWNrYWNrXCIgdmFsdWUgaXMgaW52YWxpZFxuIiwgKmFyZ3YpOworCQkJaWYgKHF1aWNrYWNrICE9IDEgJiYgcXVpY2thY2sgIT0gMCkKKwkJCQlpbnZhcmcoIlwicXVpY2thY2tcIiB2YWx1ZSBzaG91bGQgYmUgMCBvciAxXG4iLCAqYXJndik7CisJCQlydGFfYWRkYXR0cjMyKG14cnRhLCBzaXplb2YobXhidWYpLCBSVEFYX1FVSUNLQUNLLCBxdWlja2Fjayk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImNvbmdjdGwiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHN0cmNtcCgqYXJndiwgImxvY2siKSA9PSAwKSB7CisJCQkJbXhsb2NrIHw9IDEgPDwgUlRBWF9DQ19BTEdPOworCQkJCU5FWFRfQVJHKCk7CisJCQl9CisJCQlydGFfYWRkYXR0cl9sKG14cnRhLCBzaXplb2YobXhidWYpLCBSVEFYX0NDX0FMR08sICphcmd2LAorCQkJCSAgICAgIHN0cmxlbigqYXJndikpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJydHR2YXIiKSA9PSAwKSB7CisJCQl1bnNpZ25lZCB3aW47CisJCQlORVhUX0FSRygpOworCQkJaWYgKHN0cmNtcCgqYXJndiwgImxvY2siKSA9PSAwKSB7CisJCQkJbXhsb2NrIHw9ICgxPDxSVEFYX1JUVFZBUik7CisJCQkJTkVYVF9BUkcoKTsKKwkJCX0KKwkJCWlmIChnZXRfdGltZV9ydHQoJndpbiwgKmFyZ3YsICZyYXcpKQorCQkJCWludmFyZygiXCJydHR2YXJcIiB2YWx1ZSBpcyBpbnZhbGlkXG4iLCAqYXJndik7CisJCQlydGFfYWRkYXR0cjMyKG14cnRhLCBzaXplb2YobXhidWYpLCBSVEFYX1JUVFZBUiwKKwkJCQkocmF3KSA/IHdpbiA6IHdpbiAqIDQpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJzc3RocmVzaCIpID09IDApIHsKKwkJCXVuc2lnbmVkIHdpbjsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoc3RyY21wKCphcmd2LCAibG9jayIpID09IDApIHsKKwkJCQlteGxvY2sgfD0gKDE8PFJUQVhfU1NUSFJFU0gpOworCQkJCU5FWFRfQVJHKCk7CisJCQl9CisJCQlpZiAoZ2V0X3Vuc2lnbmVkKCZ3aW4sICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoIlwic3N0aHJlc2hcIiB2YWx1ZSBpcyBpbnZhbGlkXG4iLCAqYXJndik7CisJCQlydGFfYWRkYXR0cjMyKG14cnRhLCBzaXplb2YobXhidWYpLCBSVEFYX1NTVEhSRVNILCB3aW4pOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJyZWFsbXMiKSA9PSAwKSB7CisJCQlfX3UzMiByZWFsbTsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3J0X3JlYWxtc19vcl9yYXcoJnJlYWxtLCAqYXJndikpCisJCQkJaW52YXJnKCJcInJlYWxtXCIgdmFsdWUgaXMgaW52YWxpZFxuIiwgKmFyZ3YpOworCQkJYWRkYXR0cjMyKCZyZXEubiwgc2l6ZW9mKHJlcSksIFJUQV9GTE9XLCByZWFsbSk7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAib25saW5rIikgPT0gMCkgeworCQkJcmVxLnIucnRtX2ZsYWdzIHw9IFJUTkhfRl9PTkxJTks7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibmV4dGhvcCIpID09IDApIHsKKwkJCW5oc19vayA9IDE7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAicHJvdG9jb2wiKSA9PSAwKSB7CisJCQlfX3UzMiBwcm90OworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChydG5sX3J0cHJvdF9hMm4oJnByb3QsICphcmd2KSkKKwkJCQlpbnZhcmcoIlwicHJvdG9jb2xcIiB2YWx1ZSBpcyBpbnZhbGlkXG4iLCAqYXJndik7CisJCQlyZXEuci5ydG1fcHJvdG9jb2wgPSBwcm90OworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJ0YWJsZSIpID09IDApIHsKKwkJCV9fdTMyIHRpZDsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocnRubF9ydHRhYmxlX2EybigmdGlkLCAqYXJndikpCisJCQkJaW52YXJnKCJcInRhYmxlXCIgdmFsdWUgaXMgaW52YWxpZFxuIiwgKmFyZ3YpOworCQkJaWYgKHRpZCA8IDI1NikKKwkJCQlyZXEuci5ydG1fdGFibGUgPSB0aWQ7CisJCQllbHNlIHsKKwkJCQlyZXEuci5ydG1fdGFibGUgPSBSVF9UQUJMRV9VTlNQRUM7CisJCQkJYWRkYXR0cjMyKCZyZXEubiwgc2l6ZW9mKHJlcSksIFJUQV9UQUJMRSwgdGlkKTsKKwkJCX0KKwkJCXRhYmxlX29rID0gMTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJkZXYiKSA9PSAwIHx8CisJCQkgICBzdHJjbXAoKmFyZ3YsICJvaWYiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJZCA9ICphcmd2OworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJwcmVmIikgPT0gMCkgeworCQkJX191OCBwcmVmOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJsb3ciKSA9PSAwKQorCQkJCXByZWYgPSBJQ01QVjZfUk9VVEVSX1BSRUZfTE9XOworCQkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibWVkaXVtIikgPT0gMCkKKwkJCQlwcmVmID0gSUNNUFY2X1JPVVRFUl9QUkVGX01FRElVTTsKKwkJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImhpZ2giKSA9PSAwKQorCQkJCXByZWYgPSBJQ01QVjZfUk9VVEVSX1BSRUZfSElHSDsKKwkJCWVsc2UgaWYgKGdldF91OCgmcHJlZiwgKmFyZ3YsIDApKQorCQkJCWludmFyZygiXCJwcmVmXCIgdmFsdWUgaXMgaW52YWxpZFxuIiwgKmFyZ3YpOworCQkJYWRkYXR0cjgoJnJlcS5uLCBzaXplb2YocmVxKSwgUlRBX1BSRUYsIHByZWYpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImVuY2FwIikgPT0gMCkgeworCQkJY2hhciBidWZbMTAyNF07CisJCQlzdHJ1Y3QgcnRhdHRyICpydGEgPSAodm9pZCopYnVmOworCisJCQlydGEtPnJ0YV90eXBlID0gUlRBX0VOQ0FQOworCQkJcnRhLT5ydGFfbGVuID0gUlRBX0xFTkdUSCgwKTsKKworCQkJbHd0X3BhcnNlX2VuY2FwKHJ0YSwgc2l6ZW9mKGJ1ZiksICZhcmdjLCAmYXJndik7CisKKwkJCWlmIChydGEtPnJ0YV9sZW4gPiBSVEFfTEVOR1RIKDApKQorCQkJCWFkZHJhd19sKCZyZXEubiwgMTAyNCwgUlRBX0RBVEEocnRhKSwgUlRBX1BBWUxPQUQocnRhKSk7CisJCX0gZWxzZSB7CisJCQlpbnQgdHlwZTsKKwkJCWluZXRfcHJlZml4IGRzdDsKKworCQkJaWYgKHN0cmNtcCgqYXJndiwgInRvIikgPT0gMCkgeworCQkJCU5FWFRfQVJHKCk7CisJCQl9CisJCQlpZiAoKCoqYXJndiA8ICcwJyB8fCAqKmFyZ3YgPiAnOScpICYmCisJCQkgICAgcnRubF9ydG50eXBlX2EybigmdHlwZSwgKmFyZ3YpID09IDApIHsKKwkJCQlORVhUX0FSRygpOworCQkJCXJlcS5yLnJ0bV90eXBlID0gdHlwZTsKKwkJCQl0eXBlX29rID0gMTsKKwkJCX0KKworCQkJaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkKKwkJCQl1c2FnZSgpOworCQkJaWYgKGRzdF9vaykKKwkJCQlkdXBhcmcyKCJ0byIsICphcmd2KTsKKwkJCWdldF9wcmVmaXgoJmRzdCwgKmFyZ3YsIHJlcS5yLnJ0bV9mYW1pbHkpOworCQkJaWYgKHJlcS5yLnJ0bV9mYW1pbHkgPT0gQUZfVU5TUEVDKQorCQkJCXJlcS5yLnJ0bV9mYW1pbHkgPSBkc3QuZmFtaWx5OworCQkJcmVxLnIucnRtX2RzdF9sZW4gPSBkc3QuYml0bGVuOworCQkJZHN0X29rID0gMTsKKwkJCWlmIChkc3QuYnl0ZWxlbikKKwkJCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgUlRBX0RTVCwgJmRzdC5kYXRhLCBkc3QuYnl0ZWxlbik7CisJCX0KKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJaWYgKCFkc3Rfb2spCisJCXVzYWdlKCk7CisKKwlpZiAoZCB8fCBuaHNfb2spICB7CisJCWludCBpZHg7CisKKwkJaWYgKGQpIHsKKwkJCWlmICgoaWR4ID0gbGxfbmFtZV90b19pbmRleChkKSkgPT0gMCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IGZpbmQgZGV2aWNlIFwiJXNcIlxuIiwgZCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYWRkYXR0cjMyKCZyZXEubiwgc2l6ZW9mKHJlcSksIFJUQV9PSUYsIGlkeCk7CisJCX0KKwl9CisKKwlpZiAobXhydGEtPnJ0YV9sZW4gPiBSVEFfTEVOR1RIKDApKSB7CisJCWlmIChteGxvY2spCisJCQlydGFfYWRkYXR0cjMyKG14cnRhLCBzaXplb2YobXhidWYpLCBSVEFYX0xPQ0ssIG14bG9jayk7CisJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBSVEFfTUVUUklDUywgUlRBX0RBVEEobXhydGEpLCBSVEFfUEFZTE9BRChteHJ0YSkpOworCX0KKworCWlmIChuaHNfb2spCisJCXBhcnNlX25leHRob3BzKCZyZXEubiwgJnJlcS5yLCBhcmdjLCBhcmd2KTsKKworCWlmIChyZXEuci5ydG1fZmFtaWx5ID09IEFGX1VOU1BFQykKKwkJcmVxLnIucnRtX2ZhbWlseSA9IEFGX0lORVQ7CisKKwlpZiAoIXRhYmxlX29rKSB7CisJCWlmIChyZXEuci5ydG1fdHlwZSA9PSBSVE5fTE9DQUwgfHwKKwkJICAgIHJlcS5yLnJ0bV90eXBlID09IFJUTl9CUk9BRENBU1QgfHwKKwkJICAgIHJlcS5yLnJ0bV90eXBlID09IFJUTl9OQVQgfHwKKwkJICAgIHJlcS5yLnJ0bV90eXBlID09IFJUTl9BTllDQVNUKQorCQkJcmVxLnIucnRtX3RhYmxlID0gUlRfVEFCTEVfTE9DQUw7CisJfQorCWlmICghc2NvcGVfb2spIHsKKwkJaWYgKHJlcS5yLnJ0bV9mYW1pbHkgPT0gQUZfSU5FVDYgfHwKKwkJICAgIHJlcS5yLnJ0bV9mYW1pbHkgPT0gQUZfTVBMUykKKwkJCXJlcS5yLnJ0bV9zY29wZSA9IFJUX1NDT1BFX1VOSVZFUlNFOworCQllbHNlIGlmIChyZXEuci5ydG1fdHlwZSA9PSBSVE5fTE9DQUwgfHwKKwkJCSByZXEuci5ydG1fdHlwZSA9PSBSVE5fTkFUKQorCQkJcmVxLnIucnRtX3Njb3BlID0gUlRfU0NPUEVfSE9TVDsKKwkJZWxzZSBpZiAocmVxLnIucnRtX3R5cGUgPT0gUlROX0JST0FEQ0FTVCB8fAorCQkJIHJlcS5yLnJ0bV90eXBlID09IFJUTl9NVUxUSUNBU1QgfHwKKwkJCSByZXEuci5ydG1fdHlwZSA9PSBSVE5fQU5ZQ0FTVCkKKwkJCXJlcS5yLnJ0bV9zY29wZSA9IFJUX1NDT1BFX0xJTks7CisJCWVsc2UgaWYgKHJlcS5yLnJ0bV90eXBlID09IFJUTl9VTklDQVNUIHx8CisJCQkgcmVxLnIucnRtX3R5cGUgPT0gUlROX1VOU1BFQykgeworCQkJaWYgKGNtZCA9PSBSVE1fREVMUk9VVEUpCisJCQkJcmVxLnIucnRtX3Njb3BlID0gUlRfU0NPUEVfTk9XSEVSRTsKKwkJCWVsc2UgaWYgKCFnd19vayAmJiAhbmhzX29rKQorCQkJCXJlcS5yLnJ0bV9zY29wZSA9IFJUX1NDT1BFX0xJTks7CisJCX0KKwl9CisKKwlpZiAoIXR5cGVfb2sgJiYgcmVxLnIucnRtX2ZhbWlseSA9PSBBRl9NUExTKQorCQlyZXEuci5ydG1fdHlwZSA9IFJUTl9VTklDQVNUOworCisJaWYgKHJ0bmxfdGFsaygmcnRoLCAmcmVxLm4sIE5VTEwsIDApIDwgMCkKKwkJcmV0dXJuIC0yOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnRubF9ydGNhY2hlX3JlcXVlc3Qoc3RydWN0IHJ0bmxfaGFuZGxlICpydGgsIGludCBmYW1pbHkpCit7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyIG5saDsKKwkJc3RydWN0IHJ0bXNnIHJ0bTsKKwl9IHJlcTsKKwlzdHJ1Y3Qgc29ja2FkZHJfbmwgbmxhZGRyOworCisJbWVtc2V0KCZubGFkZHIsIDAsIHNpemVvZihubGFkZHIpKTsKKwltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCW5sYWRkci5ubF9mYW1pbHkgPSBBRl9ORVRMSU5LOworCisJcmVxLm5saC5ubG1zZ19sZW4gPSBzaXplb2YocmVxKTsKKwlyZXEubmxoLm5sbXNnX3R5cGUgPSBSVE1fR0VUUk9VVEU7CisJcmVxLm5saC5ubG1zZ19mbGFncyA9IE5MTV9GX1JPT1R8TkxNX0ZfUkVRVUVTVDsKKwlyZXEubmxoLm5sbXNnX3BpZCA9IDA7CisJcmVxLm5saC5ubG1zZ19zZXEgPSBydGgtPmR1bXAgPSArK3J0aC0+c2VxOworCXJlcS5ydG0ucnRtX2ZhbWlseSA9IGZhbWlseTsKKwlyZXEucnRtLnJ0bV9mbGFncyB8PSBSVE1fRl9DTE9ORUQ7CisKKwlyZXR1cm4gc2VuZHRvKHJ0aC0+ZmQsICh2b2lkKikmcmVxLCBzaXplb2YocmVxKSwgMCwgKHN0cnVjdCBzb2NrYWRkciopJm5sYWRkciwgc2l6ZW9mKG5sYWRkcikpOworfQorCitzdGF0aWMgaW50IGlwcm91dGVfZmx1c2hfY2FjaGUodm9pZCkKK3sKKyNkZWZpbmUgUk9VVEVfRkxVU0hfUEFUSCAiL3Byb2Mvc3lzL25ldC9pcHY0L3JvdXRlL2ZsdXNoIgorCisJaW50IGxlbjsKKwlpbnQgZmx1c2hfZmQgPSBvcGVuIChST1VURV9GTFVTSF9QQVRILCBPX1dST05MWSk7CisJY2hhciAqYnVmZmVyID0gIi0xIjsKKworCWlmIChmbHVzaF9mZCA8IDApIHsKKwkJZnByaW50ZiAoc3RkZXJyLCAiQ2Fubm90IG9wZW4gXCIlc1wiOiAlc1xuIiwKKwkJCQlST1VURV9GTFVTSF9QQVRILCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCisJbGVuID0gc3RybGVuIChidWZmZXIpOworCisJaWYgKCh3cml0ZSAoZmx1c2hfZmQsICh2b2lkICopYnVmZmVyLCBsZW4pKSA8IGxlbikgeworCQlmcHJpbnRmIChzdGRlcnIsICJDYW5ub3QgZmx1c2ggcm91dGluZyBjYWNoZVxuIik7CisJCWNsb3NlKGZsdXNoX2ZkKTsKKwkJcmV0dXJuIC0xOworCX0KKwljbG9zZShmbHVzaF9mZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX3UzMiByb3V0ZV9kdW1wX21hZ2ljID0gMHg0NTMxMTIyNDsKKworc3RhdGljIGludCBzYXZlX3JvdXRlKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sCisJCSAgICAgIHZvaWQgKmFyZykKK3sKKwlpbnQgcmV0OworCWludCBsZW4gPSBuLT5ubG1zZ19sZW47CisJc3RydWN0IHJ0bXNnICpyID0gTkxNU0dfREFUQShuKTsKKwlzdHJ1Y3QgcnRhdHRyICp0YltSVEFfTUFYKzFdOworCWludCBob3N0X2xlbjsKKworCWhvc3RfbGVuID0gYWZfYml0X2xlbihyLT5ydG1fZmFtaWx5KTsKKwlsZW4gLT0gTkxNU0dfTEVOR1RIKHNpemVvZigqcikpOworCXBhcnNlX3J0YXR0cih0YiwgUlRBX01BWCwgUlRNX1JUQShyKSwgbGVuKTsKKworCWlmICghZmlsdGVyX25sbXNnKG4sIHRiLCBob3N0X2xlbikpCisJCXJldHVybiAwOworCisJcmV0ID0gd3JpdGUoU1RET1VUX0ZJTEVOTywgbiwgbi0+bmxtc2dfbGVuKTsKKwlpZiAoKHJldCA+IDApICYmIChyZXQgIT0gbi0+bmxtc2dfbGVuKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlNob3J0IHdyaXRlIHdoaWxlIHNhdmluZyBubG1zZ1xuIik7CisJCXJldCA9IC1FSU87CisJfQorCisJcmV0dXJuIHJldCA9PSBuLT5ubG1zZ19sZW4gPyAwIDogcmV0OworfQorCitzdGF0aWMgaW50IHNhdmVfcm91dGVfcHJlcCh2b2lkKQoreworCWludCByZXQ7CisKKwlpZiAoaXNhdHR5KFNURE9VVF9GSUxFTk8pKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm90IHNlbmRpbmcgYSBiaW5hcnkgc3RyZWFtIHRvIHN0ZG91dFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXQgPSB3cml0ZShTVERPVVRfRklMRU5PLCAmcm91dGVfZHVtcF9tYWdpYywgc2l6ZW9mKHJvdXRlX2R1bXBfbWFnaWMpKTsKKwlpZiAocmV0ICE9IHNpemVvZihyb3V0ZV9kdW1wX21hZ2ljKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNhbid0IHdyaXRlIG1hZ2ljIHRvIGR1bXAgZmlsZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHJvdXRlX2xpc3RfZmx1c2hfb3Jfc2F2ZShpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGludCBhY3Rpb24pCit7CisJaW50IGRvX2lwdjYgPSBwcmVmZXJyZWRfZmFtaWx5OworCWNoYXIgKmlkID0gTlVMTDsKKwljaGFyICpvZCA9IE5VTEw7CisJdW5zaWduZWQgaW50IG1hcmsgPSAwOworCXJ0bmxfZmlsdGVyX3QgZmlsdGVyX2ZuOworCisJaWYgKGFjdGlvbiA9PSBJUFJPVVRFX1NBVkUpIHsKKwkJaWYgKHNhdmVfcm91dGVfcHJlcCgpKQorCQkJcmV0dXJuIC0xOworCisJCWZpbHRlcl9mbiA9IHNhdmVfcm91dGU7CisJfSBlbHNlCisJCWZpbHRlcl9mbiA9IHByaW50X3JvdXRlOworCisJaXByb3V0ZV9yZXNldF9maWx0ZXIoMCk7CisJZmlsdGVyLnRiID0gUlRfVEFCTEVfTUFJTjsKKworCWlmICgoYWN0aW9uID09IElQUk9VVEVfRkxVU0gpICYmIGFyZ2MgPD0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlwiaXAgcm91dGUgZmx1c2hcIiByZXF1aXJlcyBhcmd1bWVudHMuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAobWF0Y2hlcygqYXJndiwgInRhYmxlIikgPT0gMCkgeworCQkJX191MzIgdGlkOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChydG5sX3J0dGFibGVfYTJuKCZ0aWQsICphcmd2KSkgeworCQkJCWlmIChzdHJjbXAoKmFyZ3YsICJhbGwiKSA9PSAwKSB7CisJCQkJCWZpbHRlci50YiA9IDA7CisJCQkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJjYWNoZSIpID09IDApIHsKKwkJCQkJZmlsdGVyLmNsb25lZCA9IDE7CisJCQkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJCQl1c2FnZSgpOworCQkJCX0gZWxzZSB7CisJCQkJCWludmFyZygidGFibGUgaWQgdmFsdWUgaXMgaW52YWxpZFxuIiwgKmFyZ3YpOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCWZpbHRlci50YiA9IHRpZDsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiY2FjaGVkIikgPT0gMCB8fAorCQkJICAgbWF0Y2hlcygqYXJndiwgImNsb25lZCIpID09IDApIHsKKwkJCWZpbHRlci5jbG9uZWQgPSAxOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInRvcyIpID09IDAgfHwKKwkJCSAgIG1hdGNoZXMoKmFyZ3YsICJkc2ZpZWxkIikgPT0gMCkgeworCQkJX191MzIgdG9zOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChydG5sX2RzZmllbGRfYTJuKCZ0b3MsICphcmd2KSkKKwkJCQlpbnZhcmcoIlRPUyB2YWx1ZSBpcyBpbnZhbGlkXG4iLCAqYXJndik7CisJCQlmaWx0ZXIudG9zID0gdG9zOworCQkJZmlsdGVyLnRvc21hc2sgPSAtMTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAicHJvdG9jb2wiKSA9PSAwKSB7CisJCQlfX3UzMiBwcm90ID0gMDsKKwkJCU5FWFRfQVJHKCk7CisJCQlmaWx0ZXIucHJvdG9jb2xtYXNrID0gLTE7CisJCQlpZiAocnRubF9ydHByb3RfYTJuKCZwcm90LCAqYXJndikpIHsKKwkJCQlpZiAoc3RyY21wKCphcmd2LCAiYWxsIikgIT0gMCkKKwkJCQkJaW52YXJnKCJpbnZhbGlkIFwicHJvdG9jb2xcIlxuIiwgKmFyZ3YpOworCQkJCXByb3QgPSAwOworCQkJCWZpbHRlci5wcm90b2NvbG1hc2sgPSAwOworCQkJfQorCQkJZmlsdGVyLnByb3RvY29sID0gcHJvdDsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAic2NvcGUiKSA9PSAwKSB7CisJCQlfX3UzMiBzY29wZSA9IDA7CisJCQlORVhUX0FSRygpOworCQkJZmlsdGVyLnNjb3BlbWFzayA9IC0xOworCQkJaWYgKHJ0bmxfcnRzY29wZV9hMm4oJnNjb3BlLCAqYXJndikpIHsKKwkJCQlpZiAoc3RyY21wKCphcmd2LCAiYWxsIikgIT0gMCkKKwkJCQkJaW52YXJnKCJpbnZhbGlkIFwic2NvcGVcIlxuIiwgKmFyZ3YpOworCQkJCXNjb3BlID0gUlRfU0NPUEVfTk9XSEVSRTsKKwkJCQlmaWx0ZXIuc2NvcGVtYXNrID0gMDsKKwkJCX0KKwkJCWZpbHRlci5zY29wZSA9IHNjb3BlOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJ0eXBlIikgPT0gMCkgeworCQkJaW50IHR5cGU7CisJCQlORVhUX0FSRygpOworCQkJZmlsdGVyLnR5cGVtYXNrID0gLTE7CisJCQlpZiAocnRubF9ydG50eXBlX2EybigmdHlwZSwgKmFyZ3YpKQorCQkJCWludmFyZygibm9kZSB0eXBlIHZhbHVlIGlzIGludmFsaWRcbiIsICphcmd2KTsKKwkJCWZpbHRlci50eXBlID0gdHlwZTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJkZXYiKSA9PSAwIHx8CisJCQkgICBzdHJjbXAoKmFyZ3YsICJvaWYiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJb2QgPSAqYXJndjsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJpaWYiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWQgPSAqYXJndjsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJtYXJrIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWdldF91bnNpZ25lZCgmbWFyaywgKmFyZ3YsIDApOworCQkJZmlsdGVyLm1hcmttYXNrID0gLTE7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAidmlhIikgPT0gMCkgeworCQkJaW50IGZhbWlseTsKKwkJCU5FWFRfQVJHKCk7CisJCQlmYW1pbHkgPSByZWFkX2ZhbWlseSgqYXJndik7CisJCQlpZiAoZmFtaWx5ID09IEFGX1VOU1BFQykKKwkJCQlmYW1pbHkgPSBkb19pcHY2OworCQkJZWxzZQorCQkJCU5FWFRfQVJHKCk7CisJCQlnZXRfcHJlZml4KCZmaWx0ZXIucnZpYSwgKmFyZ3YsIGZhbWlseSk7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAic3JjIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWdldF9wcmVmaXgoJmZpbHRlci5ycHJlZnNyYywgKmFyZ3YsIGRvX2lwdjYpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJyZWFsbXMiKSA9PSAwKSB7CisJCQlfX3UzMiByZWFsbTsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3J0X3JlYWxtc19vcl9yYXcoJnJlYWxtLCAqYXJndikpCisJCQkJaW52YXJnKCJpbnZhbGlkIHJlYWxtc1xuIiwgKmFyZ3YpOworCQkJZmlsdGVyLnJlYWxtID0gcmVhbG07CisJCQlmaWx0ZXIucmVhbG1tYXNrID0gfjBVOworCQkJaWYgKChmaWx0ZXIucmVhbG0mMHhGRkZGKSA9PSAwICYmCisJCQkgICAgKCphcmd2KVtzdHJsZW4oKmFyZ3YpIC0gMV0gPT0gJy8nKQorCQkJCWZpbHRlci5yZWFsbW1hc2sgJj0gfjB4RkZGRjsKKwkJCWlmICgoZmlsdGVyLnJlYWxtJjB4RkZGRjAwMDBVKSA9PSAwICYmCisJCQkgICAgKHN0cmNocigqYXJndiwgJy8nKSA9PSBOVUxMIHx8CisJCQkgICAgICgqYXJndilbMF0gPT0gJy8nKSkKKwkJCQlmaWx0ZXIucmVhbG1tYXNrICY9IH4weEZGRkYwMDAwVTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiZnJvbSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAobWF0Y2hlcygqYXJndiwgInJvb3QiKSA9PSAwKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCQlnZXRfcHJlZml4KCZmaWx0ZXIucnNyYywgKmFyZ3YsIGRvX2lwdjYpOworCQkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAibWF0Y2giKSA9PSAwKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCQlnZXRfcHJlZml4KCZmaWx0ZXIubXNyYywgKmFyZ3YsIGRvX2lwdjYpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAobWF0Y2hlcygqYXJndiwgImV4YWN0IikgPT0gMCkgeworCQkJCQlORVhUX0FSRygpOworCQkJCX0KKwkJCQlnZXRfcHJlZml4KCZmaWx0ZXIubXNyYywgKmFyZ3YsIGRvX2lwdjYpOworCQkJCWZpbHRlci5yc3JjID0gZmlsdGVyLm1zcmM7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAobWF0Y2hlcygqYXJndiwgInRvIikgPT0gMCkgeworCQkJCU5FWFRfQVJHKCk7CisJCQl9CisJCQlpZiAobWF0Y2hlcygqYXJndiwgInJvb3QiKSA9PSAwKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCQlnZXRfcHJlZml4KCZmaWx0ZXIucmRzdCwgKmFyZ3YsIGRvX2lwdjYpOworCQkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAibWF0Y2giKSA9PSAwKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCQlnZXRfcHJlZml4KCZmaWx0ZXIubWRzdCwgKmFyZ3YsIGRvX2lwdjYpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAobWF0Y2hlcygqYXJndiwgImV4YWN0IikgPT0gMCkgeworCQkJCQlORVhUX0FSRygpOworCQkJCX0KKwkJCQlnZXRfcHJlZml4KCZmaWx0ZXIubWRzdCwgKmFyZ3YsIGRvX2lwdjYpOworCQkJCWZpbHRlci5yZHN0ID0gZmlsdGVyLm1kc3Q7CisJCQl9CisJCX0KKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJaWYgKGRvX2lwdjYgPT0gQUZfVU5TUEVDICYmIGZpbHRlci50YikKKwkJZG9faXB2NiA9IEFGX0lORVQ7CisKKwlpZiAoaWQgfHwgb2QpICB7CisJCWludCBpZHg7CisKKwkJaWYgKGlkKSB7CisJCQlpZiAoKGlkeCA9IGxsX25hbWVfdG9faW5kZXgoaWQpKSA9PSAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJDYW5ub3QgZmluZCBkZXZpY2UgXCIlc1wiXG4iLCBpZCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJZmlsdGVyLmlpZiA9IGlkeDsKKwkJCWZpbHRlci5paWZtYXNrID0gLTE7CisJCX0KKwkJaWYgKG9kKSB7CisJCQlpZiAoKGlkeCA9IGxsX25hbWVfdG9faW5kZXgob2QpKSA9PSAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJDYW5ub3QgZmluZCBkZXZpY2UgXCIlc1wiXG4iLCBvZCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJZmlsdGVyLm9pZiA9IGlkeDsKKwkJCWZpbHRlci5vaWZtYXNrID0gLTE7CisJCX0KKwl9CisJZmlsdGVyLm1hcmsgPSBtYXJrOworCisJaWYgKGFjdGlvbiA9PSBJUFJPVVRFX0ZMVVNIKSB7CisJCWludCByb3VuZCA9IDA7CisJCWNoYXIgZmx1c2hiWzQwOTYtNTEyXTsKKwkJdGltZV90IHN0YXJ0ID0gdGltZSgwKTsKKworCQlpZiAoZmlsdGVyLmNsb25lZCkgeworCQkJaWYgKGRvX2lwdjYgIT0gQUZfSU5FVDYpIHsKKwkJCQlpcHJvdXRlX2ZsdXNoX2NhY2hlKCk7CisJCQkJaWYgKHNob3dfc3RhdHMpCisJCQkJCXByaW50ZigiKioqIElQdjQgcm91dGluZyBjYWNoZSBpcyBmbHVzaGVkLlxuIik7CisJCQl9CisJCQlpZiAoZG9faXB2NiA9PSBBRl9JTkVUKQorCQkJCXJldHVybiAwOworCQl9CisKKwkJZmlsdGVyLmZsdXNoYiA9IGZsdXNoYjsKKwkJZmlsdGVyLmZsdXNocCA9IDA7CisJCWZpbHRlci5mbHVzaGUgPSBzaXplb2YoZmx1c2hiKTsKKworCQlmb3IgKDs7KSB7CisJCQlpZiAocnRubF93aWxkZHVtcF9yZXF1ZXN0KCZydGgsIGRvX2lwdjYsIFJUTV9HRVRST1VURSkgPCAwKSB7CisJCQkJcGVycm9yKCJDYW5ub3Qgc2VuZCBkdW1wIHJlcXVlc3QiKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQkJZmlsdGVyLmZsdXNoZWQgPSAwOworCQkJaWYgKHJ0bmxfZHVtcF9maWx0ZXIoJnJ0aCwgZmlsdGVyX2ZuLCBzdGRvdXQpIDwgMCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiRmx1c2ggdGVybWluYXRlZFxuIik7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWlmIChmaWx0ZXIuZmx1c2hlZCA9PSAwKSB7CisJCQkJaWYgKHNob3dfc3RhdHMpIHsKKwkJCQkJaWYgKHJvdW5kID09IDAgJiYgKCFmaWx0ZXIuY2xvbmVkIHx8IGRvX2lwdjYgPT0gQUZfSU5FVDYpKQorCQkJCQkJcHJpbnRmKCJOb3RoaW5nIHRvIGZsdXNoLlxuIik7CisJCQkJCWVsc2UKKwkJCQkJCXByaW50ZigiKioqIEZsdXNoIGlzIGNvbXBsZXRlIGFmdGVyICVkIHJvdW5kJXMgKioqXG4iLCByb3VuZCwgcm91bmQ+MT8icyI6IiIpOworCQkJCX0KKwkJCQlmZmx1c2goc3Rkb3V0KTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXJvdW5kKys7CisJCQlpZiAoZmx1c2hfdXBkYXRlKCkgPCAwKQorCQkJCWV4aXQoMSk7CisKKwkJCWlmICh0aW1lKDApIC0gc3RhcnQgPiAzMCkgeworCQkJCXByaW50ZigiXG4qKiogRmx1c2ggbm90IGNvbXBsZXRlZCBhZnRlciAlbGQgc2Vjb25kcywgJWQgZW50cmllcyByZW1haW4gKioqXG4iLAorCQkJCSAgICAgICAobG9uZykodGltZSgwKSAtIHN0YXJ0KSwgZmlsdGVyLmZsdXNoZWQpOworCQkJCWV4aXQoMSk7CisJCQl9CisKKwkJCWlmIChzaG93X3N0YXRzKSB7CisJCQkJcHJpbnRmKCJcbioqKiBSb3VuZCAlZCwgZGVsZXRpbmcgJWQgZW50cmllcyAqKipcbiIsIHJvdW5kLCBmaWx0ZXIuZmx1c2hlZCk7CisJCQkJZmZsdXNoKHN0ZG91dCk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIWZpbHRlci5jbG9uZWQpIHsKKwkJaWYgKHJ0bmxfd2lsZGR1bXBfcmVxdWVzdCgmcnRoLCBkb19pcHY2LCBSVE1fR0VUUk9VVEUpIDwgMCkgeworCQkJcGVycm9yKCJDYW5ub3Qgc2VuZCBkdW1wIHJlcXVlc3QiKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAocnRubF9ydGNhY2hlX3JlcXVlc3QoJnJ0aCwgZG9faXB2NikgPCAwKSB7CisJCQlwZXJyb3IoIkNhbm5vdCBzZW5kIGR1bXAgcmVxdWVzdCIpOworCQkJZXhpdCgxKTsKKwkJfQorCX0KKworCWlmIChydG5sX2R1bXBfZmlsdGVyKCZydGgsIGZpbHRlcl9mbiwgc3Rkb3V0KSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJEdW1wIHRlcm1pbmF0ZWRcbiIpOworCQlleGl0KDEpOworCX0KKworCWV4aXQoMCk7Cit9CisKKworc3RhdGljIGludCBpcHJvdXRlX2dldChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyCW47CisJCXN0cnVjdCBydG1zZwkJcjsKKwkJY2hhciAgCQkJYnVmWzEwMjRdOworCX0gcmVxOworCWNoYXIgICppZGV2ID0gTlVMTDsKKwljaGFyICAqb2RldiA9IE5VTEw7CisJaW50IGNvbm5lY3RlZCA9IDA7CisJaW50IGZyb21fb2sgPSAwOworCXVuc2lnbmVkIGludCBtYXJrID0gMDsKKworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisKKwlpcHJvdXRlX3Jlc2V0X2ZpbHRlcigwKTsKKwlmaWx0ZXIuY2xvbmVkID0gMjsKKworCXJlcS5uLm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IHJ0bXNnKSk7CisJcmVxLm4ubmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUOworCXJlcS5uLm5sbXNnX3R5cGUgPSBSVE1fR0VUUk9VVEU7CisJcmVxLnIucnRtX2ZhbWlseSA9IHByZWZlcnJlZF9mYW1pbHk7CisJcmVxLnIucnRtX3RhYmxlID0gMDsKKwlyZXEuci5ydG1fcHJvdG9jb2wgPSAwOworCXJlcS5yLnJ0bV9zY29wZSA9IDA7CisJcmVxLnIucnRtX3R5cGUgPSAwOworCXJlcS5yLnJ0bV9zcmNfbGVuID0gMDsKKwlyZXEuci5ydG1fZHN0X2xlbiA9IDA7CisJcmVxLnIucnRtX3RvcyA9IDA7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgInRvcyIpID09IDAgfHwKKwkJICAgIG1hdGNoZXMoKmFyZ3YsICJkc2ZpZWxkIikgPT0gMCkgeworCQkJX191MzIgdG9zOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChydG5sX2RzZmllbGRfYTJuKCZ0b3MsICphcmd2KSkKKwkJCQlpbnZhcmcoIlRPUyB2YWx1ZSBpcyBpbnZhbGlkXG4iLCAqYXJndik7CisJCQlyZXEuci5ydG1fdG9zID0gdG9zOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJmcm9tIikgPT0gMCkgeworCQkJaW5ldF9wcmVmaXggYWRkcjsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKQorCQkJCXVzYWdlKCk7CisJCQlmcm9tX29rID0gMTsKKwkJCWdldF9wcmVmaXgoJmFkZHIsICphcmd2LCByZXEuci5ydG1fZmFtaWx5KTsKKwkJCWlmIChyZXEuci5ydG1fZmFtaWx5ID09IEFGX1VOU1BFQykKKwkJCQlyZXEuci5ydG1fZmFtaWx5ID0gYWRkci5mYW1pbHk7CisJCQlpZiAoYWRkci5ieXRlbGVuKQorCQkJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBSVEFfU1JDLCAmYWRkci5kYXRhLCBhZGRyLmJ5dGVsZW4pOworCQkJcmVxLnIucnRtX3NyY19sZW4gPSBhZGRyLmJpdGxlbjsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiaWlmIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlkZXYgPSAqYXJndjsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAibWFyayIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlnZXRfdW5zaWduZWQoJm1hcmssICphcmd2LCAwKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAib2lmIikgPT0gMCB8fAorCQkJICAgc3RyY21wKCphcmd2LCAiZGV2IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCW9kZXYgPSAqYXJndjsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAidWlkIikgPT0gMCkgeworCQkgICAgICAgIHVpZF90IHVpZDsKKwkJCU5FWFRfQVJHKCk7CisJCQlnZXRfdW5zaWduZWQoJnVpZCwgKmFyZ3YsIDApOworCQkJYWRkYXR0cjMyKCZyZXEubiwgc2l6ZW9mKHJlcSksIFJUQV9VSUQsIHVpZCk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgIm5vdGlmeSIpID09IDApIHsKKwkJCXJlcS5yLnJ0bV9mbGFncyB8PSBSVE1fRl9OT1RJRlk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImNvbm5lY3RlZCIpID09IDApIHsKKwkJCWNvbm5lY3RlZCA9IDE7CisJCX0gZWxzZSB7CisJCQlpbmV0X3ByZWZpeCBhZGRyOworCQkJaWYgKHN0cmNtcCgqYXJndiwgInRvIikgPT0gMCkgeworCQkJCU5FWFRfQVJHKCk7CisJCQl9CisJCQlpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKQorCQkJCXVzYWdlKCk7CisJCQlnZXRfcHJlZml4KCZhZGRyLCAqYXJndiwgcmVxLnIucnRtX2ZhbWlseSk7CisJCQlpZiAocmVxLnIucnRtX2ZhbWlseSA9PSBBRl9VTlNQRUMpCisJCQkJcmVxLnIucnRtX2ZhbWlseSA9IGFkZHIuZmFtaWx5OworCQkJaWYgKGFkZHIuYnl0ZWxlbikKKwkJCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgUlRBX0RTVCwgJmFkZHIuZGF0YSwgYWRkci5ieXRlbGVuKTsKKwkJCXJlcS5yLnJ0bV9kc3RfbGVuID0gYWRkci5iaXRsZW47CisJCX0KKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJaWYgKHJlcS5yLnJ0bV9kc3RfbGVuID09IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJuZWVkIGF0IGxlYXN0IGEgZGVzdGluYXRpb24gYWRkcmVzc1xuIik7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKGlkZXYgfHwgb2RldikgIHsKKwkJaW50IGlkeDsKKworCQlpZiAoaWRldikgeworCQkJaWYgKChpZHggPSBsbF9uYW1lX3RvX2luZGV4KGlkZXYpKSA9PSAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJDYW5ub3QgZmluZCBkZXZpY2UgXCIlc1wiXG4iLCBpZGV2KTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlhZGRhdHRyMzIoJnJlcS5uLCBzaXplb2YocmVxKSwgUlRBX0lJRiwgaWR4KTsKKwkJfQorCQlpZiAob2RldikgeworCQkJaWYgKChpZHggPSBsbF9uYW1lX3RvX2luZGV4KG9kZXYpKSA9PSAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJDYW5ub3QgZmluZCBkZXZpY2UgXCIlc1wiXG4iLCBvZGV2KTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlhZGRhdHRyMzIoJnJlcS5uLCBzaXplb2YocmVxKSwgUlRBX09JRiwgaWR4KTsKKwkJfQorCX0KKwlpZiAobWFyaykKKwkJYWRkYXR0cjMyKCZyZXEubiwgc2l6ZW9mKHJlcSksIFJUQV9NQVJLLCBtYXJrKTsKKworCWlmIChyZXEuci5ydG1fZmFtaWx5ID09IEFGX1VOU1BFQykKKwkJcmVxLnIucnRtX2ZhbWlseSA9IEFGX0lORVQ7CisKKwlyZXEuci5ydG1fZmxhZ3MgfD0gUlRNX0ZfTE9PS1VQX1RBQkxFOworCisJaWYgKHJ0bmxfdGFsaygmcnRoLCAmcmVxLm4sICZyZXEubiwgc2l6ZW9mKHJlcSkpIDwgMCkKKwkJcmV0dXJuIC0yOworCisJaWYgKGNvbm5lY3RlZCAmJiAhZnJvbV9vaykgeworCQlzdHJ1Y3QgcnRtc2cgKnIgPSBOTE1TR19EQVRBKCZyZXEubik7CisJCWludCBsZW4gPSByZXEubi5ubG1zZ19sZW47CisJCXN0cnVjdCBydGF0dHIgKiB0YltSVEFfTUFYKzFdOworCisJCWlmIChwcmludF9yb3V0ZShOVUxMLCAmcmVxLm4sICh2b2lkKilzdGRvdXQpIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJBbiBlcnJvciA6LSlcbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCisJCWlmIChyZXEubi5ubG1zZ190eXBlICE9IFJUTV9ORVdST1VURSkgeworCQkJZnByaW50ZihzdGRlcnIsICJOb3QgYSByb3V0ZT9cbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWxlbiAtPSBOTE1TR19MRU5HVEgoc2l6ZW9mKCpyKSk7CisJCWlmIChsZW4gPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIldyb25nIGxlbiAlZFxuIiwgbGVuKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXBhcnNlX3J0YXR0cih0YiwgUlRBX01BWCwgUlRNX1JUQShyKSwgbGVuKTsKKworCQlpZiAodGJbUlRBX1BSRUZTUkNdKSB7CisJCQl0YltSVEFfUFJFRlNSQ10tPnJ0YV90eXBlID0gUlRBX1NSQzsKKwkJCXItPnJ0bV9zcmNfbGVuID0gOCpSVEFfUEFZTE9BRCh0YltSVEFfUFJFRlNSQ10pOworCQl9IGVsc2UgaWYgKCF0YltSVEFfU1JDXSkgeworCQkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY29ubmVjdCB0aGUgcm91dGVcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmICghb2RldiAmJiB0YltSVEFfT0lGXSkKKwkJCXRiW1JUQV9PSUZdLT5ydGFfdHlwZSA9IDA7CisJCWlmICh0YltSVEFfR0FURVdBWV0pCisJCQl0YltSVEFfR0FURVdBWV0tPnJ0YV90eXBlID0gMDsKKwkJaWYgKHRiW1JUQV9WSUFdKQorCQkJdGJbUlRBX1ZJQV0tPnJ0YV90eXBlID0gMDsKKwkJaWYgKCFpZGV2ICYmIHRiW1JUQV9JSUZdKQorCQkJdGJbUlRBX0lJRl0tPnJ0YV90eXBlID0gMDsKKwkJcmVxLm4ubmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUOworCQlyZXEubi5ubG1zZ190eXBlID0gUlRNX0dFVFJPVVRFOworCisJCWlmIChydG5sX3RhbGsoJnJ0aCwgJnJlcS5uLCAmcmVxLm4sIHNpemVvZihyZXEpKSA8IDApCisJCQlyZXR1cm4gLTI7CisJfQorCisJaWYgKHByaW50X3JvdXRlKE5VTEwsICZyZXEubiwgKHZvaWQqKXN0ZG91dCkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQW4gZXJyb3IgOi0pXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlc3RvcmVfaGFuZGxlcihjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKm5sLAorCQkJICAgc3RydWN0IHJ0bmxfY3RybF9kYXRhICpjdHJsLAorCQkJICAgc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcpCit7CisJaW50IHJldDsKKworCW4tPm5sbXNnX2ZsYWdzIHw9IE5MTV9GX1JFUVVFU1QgfCBOTE1fRl9DUkVBVEUgfCBOTE1fRl9BQ0s7CisKKwlsbF9pbml0X21hcCgmcnRoKTsKKworCXJldCA9IHJ0bmxfdGFsaygmcnRoLCBuLCBuLCBzaXplb2YoKm4pKTsKKwlpZiAoKHJldCA8IDApICYmIChlcnJubyA9PSBFRVhJU1QpKQorCQlyZXQgPSAwOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByb3V0ZV9kdW1wX2NoZWNrX21hZ2ljKHZvaWQpCit7CisJaW50IHJldDsKKwlfX3UzMiBtYWdpYyA9IDA7CisKKwlpZiAoaXNhdHR5KFNURElOX0ZJTEVOTykpIHsKKwkJZnByaW50ZihzdGRlcnIsICJDYW4ndCByZXN0b3JlIHJvdXRlIGR1bXAgZnJvbSBhIHRlcm1pbmFsXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldCA9IGZyZWFkKCZtYWdpYywgc2l6ZW9mKG1hZ2ljKSwgMSwgc3RkaW4pOworCWlmIChtYWdpYyAhPSByb3V0ZV9kdW1wX21hZ2ljKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTWFnaWMgbWlzbWF0Y2ggKCVkIGVsZW1zLCAleCBtYWdpYylcbiIsIHJldCwgbWFnaWMpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXByb3V0ZV9yZXN0b3JlKHZvaWQpCit7CisJaWYgKHJvdXRlX2R1bXBfY2hlY2tfbWFnaWMoKSkKKwkJZXhpdCgtMSk7CisKKwlleGl0KHJ0bmxfZnJvbV9maWxlKHN0ZGluLCAmcmVzdG9yZV9oYW5kbGVyLCBOVUxMKSk7Cit9CisKK3N0YXRpYyBpbnQgc2hvd19oYW5kbGVyKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqbmwsCisJCQlzdHJ1Y3QgcnRubF9jdHJsX2RhdGEgKmN0cmwsCisJCQlzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZykKK3sKKwlwcmludF9yb3V0ZShubCwgbiwgc3Rkb3V0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHJvdXRlX3Nob3dkdW1wKHZvaWQpCit7CisJaWYgKHJvdXRlX2R1bXBfY2hlY2tfbWFnaWMoKSkKKwkJZXhpdCgtMSk7CisKKwlleGl0KHJ0bmxfZnJvbV9maWxlKHN0ZGluLCAmc2hvd19oYW5kbGVyLCBOVUxMKSk7Cit9CisKK3ZvaWQgaXByb3V0ZV9yZXNldF9maWx0ZXIoaW50IGlmaW5kZXgpCit7CisJbWVtc2V0KCZmaWx0ZXIsIDAsIHNpemVvZihmaWx0ZXIpKTsKKwlmaWx0ZXIubWRzdC5iaXRsZW4gPSAtMTsKKwlmaWx0ZXIubXNyYy5iaXRsZW4gPSAtMTsKKwlmaWx0ZXIub2lmID0gaWZpbmRleDsKKwlpZiAoZmlsdGVyLm9pZiA+IDApCisJCWZpbHRlci5vaWZtYXNrID0gLTE7Cit9CisKK2ludCBkb19pcHJvdXRlKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpZiAoYXJnYyA8IDEpCisJCXJldHVybiBpcHJvdXRlX2xpc3RfZmx1c2hfb3Jfc2F2ZSgwLCBOVUxMLCBJUFJPVVRFX0xJU1QpOworCisJaWYgKG1hdGNoZXMoKmFyZ3YsICJhZGQiKSA9PSAwKQorCQlyZXR1cm4gaXByb3V0ZV9tb2RpZnkoUlRNX05FV1JPVVRFLCBOTE1fRl9DUkVBVEV8TkxNX0ZfRVhDTCwKKwkJCQkgICAgICBhcmdjLTEsIGFyZ3YrMSk7CisJaWYgKG1hdGNoZXMoKmFyZ3YsICJjaGFuZ2UiKSA9PSAwIHx8IHN0cmNtcCgqYXJndiwgImNoZyIpID09IDApCisJCXJldHVybiBpcHJvdXRlX21vZGlmeShSVE1fTkVXUk9VVEUsIE5MTV9GX1JFUExBQ0UsCisJCQkJICAgICAgYXJnYy0xLCBhcmd2KzEpOworCWlmIChtYXRjaGVzKCphcmd2LCAicmVwbGFjZSIpID09IDApCisJCXJldHVybiBpcHJvdXRlX21vZGlmeShSVE1fTkVXUk9VVEUsIE5MTV9GX0NSRUFURXxOTE1fRl9SRVBMQUNFLAorCQkJCSAgICAgIGFyZ2MtMSwgYXJndisxKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgInByZXBlbmQiKSA9PSAwKQorCQlyZXR1cm4gaXByb3V0ZV9tb2RpZnkoUlRNX05FV1JPVVRFLCBOTE1fRl9DUkVBVEUsCisJCQkJICAgICAgYXJnYy0xLCBhcmd2KzEpOworCWlmIChtYXRjaGVzKCphcmd2LCAiYXBwZW5kIikgPT0gMCkKKwkJcmV0dXJuIGlwcm91dGVfbW9kaWZ5KFJUTV9ORVdST1VURSwgTkxNX0ZfQ1JFQVRFfE5MTV9GX0FQUEVORCwKKwkJCQkgICAgICBhcmdjLTEsIGFyZ3YrMSk7CisJaWYgKG1hdGNoZXMoKmFyZ3YsICJ0ZXN0IikgPT0gMCkKKwkJcmV0dXJuIGlwcm91dGVfbW9kaWZ5KFJUTV9ORVdST1VURSwgTkxNX0ZfRVhDTCwKKwkJCQkgICAgICBhcmdjLTEsIGFyZ3YrMSk7CisJaWYgKG1hdGNoZXMoKmFyZ3YsICJkZWxldGUiKSA9PSAwKQorCQlyZXR1cm4gaXByb3V0ZV9tb2RpZnkoUlRNX0RFTFJPVVRFLCAwLAorCQkJCSAgICAgIGFyZ2MtMSwgYXJndisxKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgImxpc3QiKSA9PSAwIHx8IG1hdGNoZXMoKmFyZ3YsICJzaG93IikgPT0gMAorCSAgICB8fCBtYXRjaGVzKCphcmd2LCAibHN0IikgPT0gMCkKKwkJcmV0dXJuIGlwcm91dGVfbGlzdF9mbHVzaF9vcl9zYXZlKGFyZ2MtMSwgYXJndisxLCBJUFJPVVRFX0xJU1QpOworCWlmIChtYXRjaGVzKCphcmd2LCAiZ2V0IikgPT0gMCkKKwkJcmV0dXJuIGlwcm91dGVfZ2V0KGFyZ2MtMSwgYXJndisxKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgImZsdXNoIikgPT0gMCkKKwkJcmV0dXJuIGlwcm91dGVfbGlzdF9mbHVzaF9vcl9zYXZlKGFyZ2MtMSwgYXJndisxLCBJUFJPVVRFX0ZMVVNIKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgInNhdmUiKSA9PSAwKQorCQlyZXR1cm4gaXByb3V0ZV9saXN0X2ZsdXNoX29yX3NhdmUoYXJnYy0xLCBhcmd2KzEsIElQUk9VVEVfU0FWRSk7CisJaWYgKG1hdGNoZXMoKmFyZ3YsICJyZXN0b3JlIikgPT0gMCkKKwkJcmV0dXJuIGlwcm91dGVfcmVzdG9yZSgpOworCWlmIChtYXRjaGVzKCphcmd2LCAic2hvd2R1bXAiKSA9PSAwKQorCQlyZXR1cm4gaXByb3V0ZV9zaG93ZHVtcCgpOworCWlmIChtYXRjaGVzKCphcmd2LCAiaGVscCIpID09IDApCisJCXVzYWdlKCk7CisJZnByaW50ZihzdGRlcnIsICJDb21tYW5kIFwiJXNcIiBpcyB1bmtub3duLCB0cnkgXCJpcCByb3V0ZSBoZWxwXCIuXG4iLCAqYXJndik7CisJZXhpdCgtMSk7Cit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pcC9pcHJvdXRlX2x3dHVubmVsLmMgYi9pcHJvdXRlMi9pcC9pcHJvdXRlX2x3dHVubmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA3NDkwNgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2lwL2lwcm91dGVfbHd0dW5uZWwuYwpAQCAtMCwwICsxLDM2NyBAQAorLyoKKyAqIGlwcm91dGVfbHd0dW5uZWwuYworICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CVJvb3BhIFByYWJodSwgPHJvb3BhQGN1bXVsdXNuZXR3b3Jrcy5jb20+CisgKiAJCVRob21hcyBHcmFmIDx0Z3JhZkBzdXVnLmNoPgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lsYS5oPgorI2luY2x1ZGUgPGxpbnV4L2x3dHVubmVsLmg+CisjaW5jbHVkZSA8bGludXgvbXBsc19pcHR1bm5lbC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJydF9uYW1lcy5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiaXByb3V0ZV9sd3R1bm5lbC5oIgorCitzdGF0aWMgaW50IHJlYWRfZW5jYXBfdHlwZShjb25zdCBjaGFyICpuYW1lKQoreworCWlmIChzdHJjbXAobmFtZSwgIm1wbHMiKSA9PSAwKQorCQlyZXR1cm4gTFdUVU5ORUxfRU5DQVBfTVBMUzsKKwllbHNlIGlmIChzdHJjbXAobmFtZSwgImlwIikgPT0gMCkKKwkJcmV0dXJuIExXVFVOTkVMX0VOQ0FQX0lQOworCWVsc2UgaWYgKHN0cmNtcChuYW1lLCAiaXA2IikgPT0gMCkKKwkJcmV0dXJuIExXVFVOTkVMX0VOQ0FQX0lQNjsKKwllbHNlIGlmIChzdHJjbXAobmFtZSwgImlsYSIpID09IDApCisJCXJldHVybiBMV1RVTk5FTF9FTkNBUF9JTEE7CisJZWxzZQorCQlyZXR1cm4gTFdUVU5ORUxfRU5DQVBfTk9ORTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmZvcm1hdF9lbmNhcF90eXBlKGludCB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgTFdUVU5ORUxfRU5DQVBfTVBMUzoKKwkJcmV0dXJuICJtcGxzIjsKKwljYXNlIExXVFVOTkVMX0VOQ0FQX0lQOgorCQlyZXR1cm4gImlwIjsKKwljYXNlIExXVFVOTkVMX0VOQ0FQX0lQNjoKKwkJcmV0dXJuICJpcDYiOworCWNhc2UgTFdUVU5ORUxfRU5DQVBfSUxBOgorCQlyZXR1cm4gImlsYSI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJ1bmtub3duIjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2VuY2FwX21wbHMoRklMRSAqZnAsIHN0cnVjdCBydGF0dHIgKmVuY2FwKQoreworCXN0cnVjdCBydGF0dHIgKnRiW01QTFNfSVBUVU5ORUxfTUFYKzFdOworCWNoYXIgYWJ1ZlsyNTZdOworCisJcGFyc2VfcnRhdHRyX25lc3RlZCh0YiwgTVBMU19JUFRVTk5FTF9NQVgsIGVuY2FwKTsKKworCWlmICh0YltNUExTX0lQVFVOTkVMX0RTVF0pCisJCWZwcmludGYoZnAsICIgJXMgIiwgZm9ybWF0X2hvc3QoQUZfTVBMUywKKwkJCVJUQV9QQVlMT0FEKHRiW01QTFNfSVBUVU5ORUxfRFNUXSksCisJCQlSVEFfREFUQSh0YltNUExTX0lQVFVOTkVMX0RTVF0pLAorCQkJYWJ1Ziwgc2l6ZW9mKGFidWYpKSk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2VuY2FwX2lwKEZJTEUgKmZwLCBzdHJ1Y3QgcnRhdHRyICplbmNhcCkKK3sKKwlzdHJ1Y3QgcnRhdHRyICp0YltMV1RVTk5FTF9JUF9NQVgrMV07CisJY2hhciBhYnVmWzI1Nl07CisKKwlwYXJzZV9ydGF0dHJfbmVzdGVkKHRiLCBMV1RVTk5FTF9JUF9NQVgsIGVuY2FwKTsKKworCWlmICh0YltMV1RVTk5FTF9JUF9JRF0pCisJCWZwcmludGYoZnAsICJpZCAlbGx1ICIsIG50b2hsbChydGFfZ2V0YXR0cl91NjQodGJbTFdUVU5ORUxfSVBfSURdKSkpOworCisJaWYgKHRiW0xXVFVOTkVMX0lQX1NSQ10pCisJCWZwcmludGYoZnAsICJzcmMgJXMgIiwKKwkJCXJ0X2FkZHJfbjJhKEFGX0lORVQsCisJCQkJICAgIFJUQV9QQVlMT0FEKHRiW0xXVFVOTkVMX0lQX1NSQ10pLAorCQkJCSAgICBSVEFfREFUQSh0YltMV1RVTk5FTF9JUF9TUkNdKSwKKwkJCQkgICAgYWJ1Ziwgc2l6ZW9mKGFidWYpKSk7CisKKwlpZiAodGJbTFdUVU5ORUxfSVBfRFNUXSkKKwkJZnByaW50ZihmcCwgImRzdCAlcyAiLAorCQkJcnRfYWRkcl9uMmEoQUZfSU5FVCwKKwkJCQkgICAgUlRBX1BBWUxPQUQodGJbTFdUVU5ORUxfSVBfRFNUXSksCisJCQkJICAgIFJUQV9EQVRBKHRiW0xXVFVOTkVMX0lQX0RTVF0pLAorCQkJCSAgICBhYnVmLCBzaXplb2YoYWJ1ZikpKTsKKworCWlmICh0YltMV1RVTk5FTF9JUF9UVExdKQorCQlmcHJpbnRmKGZwLCAidHRsICVkICIsIHJ0YV9nZXRhdHRyX3U4KHRiW0xXVFVOTkVMX0lQX1RUTF0pKTsKKworCWlmICh0YltMV1RVTk5FTF9JUF9UT1NdKQorCQlmcHJpbnRmKGZwLCAidG9zICVkICIsIHJ0YV9nZXRhdHRyX3U4KHRiW0xXVFVOTkVMX0lQX1RPU10pKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfZW5jYXBfaWxhKEZJTEUgKmZwLCBzdHJ1Y3QgcnRhdHRyICplbmNhcCkKK3sKKwlzdHJ1Y3QgcnRhdHRyICp0YltJTEFfQVRUUl9NQVgrMV07CisKKwlwYXJzZV9ydGF0dHJfbmVzdGVkKHRiLCBJTEFfQVRUUl9NQVgsIGVuY2FwKTsKKworCWlmICh0YltJTEFfQVRUUl9MT0NBVE9SXSkgeworCQljaGFyIGFidWZbQUREUjY0X0JVRl9TSVpFXTsKKworCQlhZGRyNjRfbjJhKCooX191NjQgKilSVEFfREFUQSh0YltJTEFfQVRUUl9MT0NBVE9SXSksCisJCQkgICBhYnVmLCBzaXplb2YoYWJ1ZikpOworCQlmcHJpbnRmKGZwLCAiICVzICIsIGFidWYpOworCX0KK30KKworc3RhdGljIHZvaWQgcHJpbnRfZW5jYXBfaXA2KEZJTEUgKmZwLCBzdHJ1Y3QgcnRhdHRyICplbmNhcCkKK3sKKwlzdHJ1Y3QgcnRhdHRyICp0YltMV1RVTk5FTF9JUDZfTUFYKzFdOworCWNoYXIgYWJ1ZlsyNTZdOworCisJcGFyc2VfcnRhdHRyX25lc3RlZCh0YiwgTFdUVU5ORUxfSVA2X01BWCwgZW5jYXApOworCisJaWYgKHRiW0xXVFVOTkVMX0lQNl9JRF0pCisJCWZwcmludGYoZnAsICJpZCAlbGx1ICIsIG50b2hsbChydGFfZ2V0YXR0cl91NjQodGJbTFdUVU5ORUxfSVA2X0lEXSkpKTsKKworCWlmICh0YltMV1RVTk5FTF9JUDZfU1JDXSkKKwkJZnByaW50ZihmcCwgInNyYyAlcyAiLAorCQkJcnRfYWRkcl9uMmEoQUZfSU5FVDYsCisJCQkJICAgIFJUQV9QQVlMT0FEKHRiW0xXVFVOTkVMX0lQNl9TUkNdKSwKKwkJCQkgICAgUlRBX0RBVEEodGJbTFdUVU5ORUxfSVA2X1NSQ10pLAorCQkJCSAgICBhYnVmLCBzaXplb2YoYWJ1ZikpKTsKKworCWlmICh0YltMV1RVTk5FTF9JUDZfRFNUXSkKKwkJZnByaW50ZihmcCwgImRzdCAlcyAiLAorCQkJcnRfYWRkcl9uMmEoQUZfSU5FVDYsCisJCQkJICAgIFJUQV9QQVlMT0FEKHRiW0xXVFVOTkVMX0lQNl9EU1RdKSwKKwkJCQkgICAgUlRBX0RBVEEodGJbTFdUVU5ORUxfSVA2X0RTVF0pLAorCQkJCSAgICBhYnVmLCBzaXplb2YoYWJ1ZikpKTsKKworCWlmICh0YltMV1RVTk5FTF9JUDZfSE9QTElNSVRdKQorCQlmcHJpbnRmKGZwLCAiaG9wbGltaXQgJWQgIiwgcnRhX2dldGF0dHJfdTgodGJbTFdUVU5ORUxfSVA2X0hPUExJTUlUXSkpOworCisJaWYgKHRiW0xXVFVOTkVMX0lQNl9UQ10pCisJCWZwcmludGYoZnAsICJ0YyAlZCAiLCBydGFfZ2V0YXR0cl91OCh0YltMV1RVTk5FTF9JUDZfVENdKSk7Cit9CisKK3ZvaWQgbHd0X3ByaW50X2VuY2FwKEZJTEUgKmZwLCBzdHJ1Y3QgcnRhdHRyICplbmNhcF90eXBlLAorCQkJICBzdHJ1Y3QgcnRhdHRyICplbmNhcCkKK3sKKwlpbnQgZXQ7CisKKwlpZiAoIWVuY2FwX3R5cGUpCisJCXJldHVybjsKKworCWV0ID0gcnRhX2dldGF0dHJfdTE2KGVuY2FwX3R5cGUpOworCisJZnByaW50ZihmcCwgIiBlbmNhcCAlcyAiLCBmb3JtYXRfZW5jYXBfdHlwZShldCkpOworCisJc3dpdGNoIChldCkgeworCWNhc2UgTFdUVU5ORUxfRU5DQVBfTVBMUzoKKwkJcHJpbnRfZW5jYXBfbXBscyhmcCwgZW5jYXApOworCQlicmVhazsKKwljYXNlIExXVFVOTkVMX0VOQ0FQX0lQOgorCQlwcmludF9lbmNhcF9pcChmcCwgZW5jYXApOworCQlicmVhazsKKwljYXNlIExXVFVOTkVMX0VOQ0FQX0lMQToKKwkJcHJpbnRfZW5jYXBfaWxhKGZwLCBlbmNhcCk7CisJCWJyZWFrOworCWNhc2UgTFdUVU5ORUxfRU5DQVBfSVA2OgorCQlwcmludF9lbmNhcF9pcDYoZnAsIGVuY2FwKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IHBhcnNlX2VuY2FwX21wbHMoc3RydWN0IHJ0YXR0ciAqcnRhLCBzaXplX3QgbGVuLCBpbnQgKmFyZ2NwLCBjaGFyICoqKmFyZ3ZwKQoreworCWluZXRfcHJlZml4IGFkZHI7CisJaW50IGFyZ2MgPSAqYXJnY3A7CisJY2hhciAqKmFyZ3YgPSAqYXJndnA7CisKKwlpZiAoZ2V0X2FkZHIoJmFkZHIsICphcmd2LCBBRl9NUExTKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBhbiBpbmV0IGFkZHJlc3MgaXMgZXhwZWN0ZWQgcmF0aGVyIHRoYW4gXCIlc1wiLlxuIiwgKmFyZ3YpOworCQlleGl0KDEpOworCX0KKworCXJ0YV9hZGRhdHRyX2wocnRhLCBsZW4sIE1QTFNfSVBUVU5ORUxfRFNULCAmYWRkci5kYXRhLAorCQkgICAgICBhZGRyLmJ5dGVsZW4pOworCisJKmFyZ2NwID0gYXJnYzsKKwkqYXJndnAgPSBhcmd2OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfZW5jYXBfaXAoc3RydWN0IHJ0YXR0ciAqcnRhLCBzaXplX3QgbGVuLCBpbnQgKmFyZ2NwLCBjaGFyICoqKmFyZ3ZwKQoreworCWludCBpZF9vayA9IDAsIGRzdF9vayA9IDAsIHRvc19vayA9IDAsIHR0bF9vayA9IDA7CisJY2hhciAqKmFyZ3YgPSAqYXJndnA7CisJaW50IGFyZ2MgPSAqYXJnY3A7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgImlkIikgPT0gMCkgeworCQkJX191NjQgaWQ7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGlkX29rKyspCisJCQkJZHVwYXJnMigiaWQiLCAqYXJndik7CisJCQlpZiAoZ2V0X3U2NCgmaWQsICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoIlwiaWRcIiB2YWx1ZSBpcyBpbnZhbGlkXG4iLCAqYXJndik7CisJCQlydGFfYWRkYXR0cjY0KHJ0YSwgbGVuLCBMV1RVTk5FTF9JUF9JRCwgaHRvbmxsKGlkKSk7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZHN0IikgPT0gMCkgeworCQkJaW5ldF9wcmVmaXggYWRkcjsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZHN0X29rKyspCisJCQkJZHVwYXJnMigiZHN0IiwgKmFyZ3YpOworCQkJZ2V0X2FkZHIoJmFkZHIsICphcmd2LCBBRl9JTkVUKTsKKwkJCXJ0YV9hZGRhdHRyX2wocnRhLCBsZW4sIExXVFVOTkVMX0lQX0RTVCwgJmFkZHIuZGF0YSwgYWRkci5ieXRlbGVuKTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJ0b3MiKSA9PSAwKSB7CisJCQlfX3UzMiB0b3M7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHRvc19vaysrKQorCQkJCWR1cGFyZzIoInRvcyIsICphcmd2KTsKKwkJCWlmIChydG5sX2RzZmllbGRfYTJuKCZ0b3MsICphcmd2KSkKKwkJCQlpbnZhcmcoIlwidG9zXCIgdmFsdWUgaXMgaW52YWxpZFxuIiwgKmFyZ3YpOworCQkJcnRhX2FkZGF0dHI4KHJ0YSwgbGVuLCBMV1RVTk5FTF9JUF9UT1MsIHRvcyk7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAidHRsIikgPT0gMCkgeworCQkJX191OCB0dGw7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHR0bF9vaysrKQorCQkJCWR1cGFyZzIoInR0bCIsICphcmd2KTsKKwkJCWlmIChnZXRfdTgoJnR0bCwgKmFyZ3YsIDApKQorCQkJCWludmFyZygiXCJ0dGxcIiB2YWx1ZSBpcyBpbnZhbGlkXG4iLCAqYXJndik7CisJCQlydGFfYWRkYXR0cjgocnRhLCBsZW4sIExXVFVOTkVMX0lQX1RUTCwgdHRsKTsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCS8qIGFyZ3YgaXMgY3VycmVudGx5IHRoZSBmaXJzdCB1bnBhcnNlZCBhcmd1bWVudCwKKwkgKiBidXQgdGhlIGx3dF9wYXJzZV9lbmNhcCgpIGNhbGxlciB3aWxsIG1vdmUgdG8gdGhlIG5leHQsCisJICogc28gc3RlcCBiYWNrICovCisJKmFyZ2NwID0gYXJnYyArIDE7CisJKmFyZ3ZwID0gYXJndiAtIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9lbmNhcF9pbGEoc3RydWN0IHJ0YXR0ciAqcnRhLCBzaXplX3QgbGVuLAorCQkJICAgaW50ICphcmdjcCwgY2hhciAqKiphcmd2cCkKK3sKKwlfX3U2NCBsb2NhdG9yOworCWludCBhcmdjID0gKmFyZ2NwOworCWNoYXIgKiphcmd2ID0gKmFyZ3ZwOworCisJaWYgKGdldF9hZGRyNjQoJmxvY2F0b3IsICphcmd2KSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJCYWQgbG9jYXRvcjogJXNcbiIsICphcmd2KTsKKwkJZXhpdCgxKTsKKwl9CisKKwlydGFfYWRkYXR0cjY0KHJ0YSwgMTAyNCwgSUxBX0FUVFJfTE9DQVRPUiwgbG9jYXRvcik7CisKKwkqYXJnY3AgPSBhcmdjOworCSphcmd2cCA9IGFyZ3Y7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9lbmNhcF9pcDYoc3RydWN0IHJ0YXR0ciAqcnRhLCBzaXplX3QgbGVuLCBpbnQgKmFyZ2NwLCBjaGFyICoqKmFyZ3ZwKQoreworCWludCBpZF9vayA9IDAsIGRzdF9vayA9IDAsIHRvc19vayA9IDAsIHR0bF9vayA9IDA7CisJY2hhciAqKmFyZ3YgPSAqYXJndnA7CisJaW50IGFyZ2MgPSAqYXJnY3A7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgImlkIikgPT0gMCkgeworCQkJX191NjQgaWQ7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGlkX29rKyspCisJCQkJZHVwYXJnMigiaWQiLCAqYXJndik7CisJCQlpZiAoZ2V0X3U2NCgmaWQsICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoIlwiaWRcIiB2YWx1ZSBpcyBpbnZhbGlkXG4iLCAqYXJndik7CisJCQlydGFfYWRkYXR0cjY0KHJ0YSwgbGVuLCBMV1RVTk5FTF9JUDZfSUQsIGh0b25sbChpZCkpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImRzdCIpID09IDApIHsKKwkJCWluZXRfcHJlZml4IGFkZHI7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGRzdF9vaysrKQorCQkJCWR1cGFyZzIoImRzdCIsICphcmd2KTsKKwkJCWdldF9hZGRyKCZhZGRyLCAqYXJndiwgQUZfSU5FVDYpOworCQkJcnRhX2FkZGF0dHJfbChydGEsIGxlbiwgTFdUVU5ORUxfSVA2X0RTVCwgJmFkZHIuZGF0YSwgYWRkci5ieXRlbGVuKTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJ0YyIpID09IDApIHsKKwkJCV9fdTMyIHRjOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmICh0b3Nfb2srKykKKwkJCQlkdXBhcmcyKCJ0YyIsICphcmd2KTsKKwkJCWlmIChydG5sX2RzZmllbGRfYTJuKCZ0YywgKmFyZ3YpKQorCQkJCWludmFyZygiXCJ0Y1wiIHZhbHVlIGlzIGludmFsaWRcbiIsICphcmd2KTsKKwkJCXJ0YV9hZGRhdHRyOChydGEsIGxlbiwgTFdUVU5ORUxfSVA2X1RDLCB0Yyk7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaG9wbGltaXQiKSA9PSAwKSB7CisJCQlfX3U4IGhvcGxpbWl0OworCQkJTkVYVF9BUkcoKTsKKwkJCWlmICh0dGxfb2srKykKKwkJCQlkdXBhcmcyKCJob3BsaW1pdCIsICphcmd2KTsKKwkJCWlmIChnZXRfdTgoJmhvcGxpbWl0LCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJcImhvcGxpbWl0XCIgdmFsdWUgaXMgaW52YWxpZFxuIiwgKmFyZ3YpOworCQkJcnRhX2FkZGF0dHI4KHJ0YSwgbGVuLCBMV1RVTk5FTF9JUDZfSE9QTElNSVQsIGhvcGxpbWl0KTsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCS8qIGFyZ3YgaXMgY3VycmVudGx5IHRoZSBmaXJzdCB1bnBhcnNlZCBhcmd1bWVudCwKKwkgKiBidXQgdGhlIGx3dF9wYXJzZV9lbmNhcCgpIGNhbGxlciB3aWxsIG1vdmUgdG8gdGhlIG5leHQsCisJICogc28gc3RlcCBiYWNrICovCisJKmFyZ2NwID0gYXJnYyArIDE7CisJKmFyZ3ZwID0gYXJndiAtIDE7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGx3dF9wYXJzZV9lbmNhcChzdHJ1Y3QgcnRhdHRyICpydGEsIHNpemVfdCBsZW4sIGludCAqYXJnY3AsIGNoYXIgKioqYXJndnApCit7CisJc3RydWN0IHJ0YXR0ciAqbmVzdDsKKwlpbnQgYXJnYyA9ICphcmdjcDsKKwljaGFyICoqYXJndiA9ICphcmd2cDsKKwlfX3UxNiB0eXBlOworCisJTkVYVF9BUkcoKTsKKwl0eXBlID0gcmVhZF9lbmNhcF90eXBlKCphcmd2KTsKKwlpZiAoIXR5cGUpCisJCWludmFyZygiXCJlbmNhcCB0eXBlXCIgdmFsdWUgaXMgaW52YWxpZFxuIiwgKmFyZ3YpOworCisJTkVYVF9BUkcoKTsKKwlpZiAoYXJnYyA8PSAxKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRXJyb3I6IHVuZXhwZWN0ZWQgZW5kIG9mIGxpbmUgYWZ0ZXIgXCJlbmNhcFwiXG4iKTsKKwkJZXhpdCgtMSk7CisJfQorCisJbmVzdCA9IHJ0YV9uZXN0KHJ0YSwgMTAyNCwgUlRBX0VOQ0FQKTsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIExXVFVOTkVMX0VOQ0FQX01QTFM6CisJCXBhcnNlX2VuY2FwX21wbHMocnRhLCBsZW4sICZhcmdjLCAmYXJndik7CisJCWJyZWFrOworCWNhc2UgTFdUVU5ORUxfRU5DQVBfSVA6CisJCXBhcnNlX2VuY2FwX2lwKHJ0YSwgbGVuLCAmYXJnYywgJmFyZ3YpOworCQlicmVhazsKKwljYXNlIExXVFVOTkVMX0VOQ0FQX0lMQToKKwkJcGFyc2VfZW5jYXBfaWxhKHJ0YSwgbGVuLCAmYXJnYywgJmFyZ3YpOworCQlicmVhazsKKwljYXNlIExXVFVOTkVMX0VOQ0FQX0lQNjoKKwkJcGFyc2VfZW5jYXBfaXA2KHJ0YSwgbGVuLCAmYXJnYywgJmFyZ3YpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiB1bnN1cHBvcnRlZCBlbmNhcCB0eXBlXG4iKTsKKwkJYnJlYWs7CisJfQorCXJ0YV9uZXN0X2VuZChydGEsIG5lc3QpOworCisJcnRhX2FkZGF0dHIxNihydGEsIDEwMjQsIFJUQV9FTkNBUF9UWVBFLCB0eXBlKTsKKworCSphcmdjcCA9IGFyZ2M7CisJKmFyZ3ZwID0gYXJndjsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaXAvaXByb3V0ZV9sd3R1bm5lbC5oIGIvaXByb3V0ZTIvaXAvaXByb3V0ZV9sd3R1bm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MmI1OGEKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pcC9pcHJvdXRlX2x3dHVubmVsLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9fTFdUVU5ORUxfSF9fCisjZGVmaW5lIF9fTEVUVU5ORUxfSF9fIDEKKworaW50IGx3dF9wYXJzZV9lbmNhcChzdHJ1Y3QgcnRhdHRyICpydGEsIHNpemVfdCBsZW4sIGludCAqYXJnY3AsIGNoYXIgKioqYXJndnApOwordm9pZCBsd3RfcHJpbnRfZW5jYXAoRklMRSAqZnAsIHN0cnVjdCBydGF0dHIgKmVuY2FwX3R5cGUsCisJCSAgICAgc3RydWN0IHJ0YXR0ciAqZW5jYXApOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2lwL2lwcnVsZS5jIGIvaXByb3V0ZTIvaXAvaXBydWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM2M2NjYwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2lwL2lwcnVsZS5jCkBAIC0wLDAgKzEsNTk1IEBACisvKgorICogaXBydWxlLmMJCSJpcCBydWxlIi4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZmliX3J1bGVzLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgInJ0X25hbWVzLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJpcF9jb21tb24uaCIKKworZXh0ZXJuIHN0cnVjdCBydG5sX2hhbmRsZSBydGg7CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogaXAgcnVsZSBbIGxpc3QgfCBhZGQgfCBkZWwgfCBmbHVzaCB8IHNhdmUgXSBTRUxFQ1RPUiBBQ1RJT05cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgIGlwIHJ1bGUgcmVzdG9yZVxuIik7CisJZnByaW50ZihzdGRlcnIsICJTRUxFQ1RPUiA6PSBbIG5vdCBdIFsgZnJvbSBQUkVGSVggXSBbIHRvIFBSRUZJWCBdIFsgdG9zIFRPUyBdIFsgZndtYXJrIEZXTUFSS1svTUFTS10gXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICBbIGlpZiBTVFJJTkcgXSBbIG9pZiBTVFJJTkcgXSBbIHByZWYgTlVNQkVSIF0gWyB1aWRyYW5nZSBVSUQxLVVJRDIgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICJBQ1RJT04gOj0gWyB0YWJsZSBUQUJMRV9JRCBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICBbIHJlYWxtcyBbU1JDUkVBTE0vXURTVFJFQUxNIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgIFsgZ290byBOVU1CRVIgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgU1VQUFJFU1NPUlxuIik7CisJZnByaW50ZihzdGRlcnIsICJTVVBQUkVTU09SIDo9IFsgc3VwcHJlc3NfcHJlZml4bGVuZ3RoIE5VTUJFUiBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgWyBzdXBwcmVzc19pZmdyb3VwIERFVkdST1VQIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiVEFCTEVfSUQgOj0gWyBsb2NhbCB8IG1haW4gfCBkZWZhdWx0IHwgTlVNQkVSIF1cbiIpOworCWV4aXQoLTEpOworfQorCitpbnQgcHJpbnRfcnVsZShjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobywgc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcpCit7CisJRklMRSAqZnAgPSAoRklMRSopYXJnOworCXN0cnVjdCBydG1zZyAqciA9IE5MTVNHX0RBVEEobik7CisJaW50IGxlbiA9IG4tPm5sbXNnX2xlbjsKKwlpbnQgaG9zdF9sZW4gPSAtMTsKKwlfX3UzMiB0YWJsZTsKKwlzdHJ1Y3QgcnRhdHRyICogdGJbRlJBX01BWCsxXTsKKwljaGFyIGFidWZbMjU2XTsKKwlTUFJJTlRfQlVGKGIxKTsKKworCWlmIChuLT5ubG1zZ190eXBlICE9IFJUTV9ORVdSVUxFICYmIG4tPm5sbXNnX3R5cGUgIT0gUlRNX0RFTFJVTEUpCisJCXJldHVybiAwOworCisJbGVuIC09IE5MTVNHX0xFTkdUSChzaXplb2YoKnIpKTsKKwlpZiAobGVuIDwgMCkKKwkJcmV0dXJuIC0xOworCisJcGFyc2VfcnRhdHRyKHRiLCBGUkFfTUFYLCBSVE1fUlRBKHIpLCBsZW4pOworCisJaG9zdF9sZW4gPSBhZl9iaXRfbGVuKHItPnJ0bV9mYW1pbHkpOworCisJaWYgKG4tPm5sbXNnX3R5cGUgPT0gUlRNX0RFTFJVTEUpCisJCWZwcmludGYoZnAsICJEZWxldGVkICIpOworCisJaWYgKHRiW0ZSQV9QUklPUklUWV0pCisJCWZwcmludGYoZnAsICIldTpcdCIsICoodW5zaWduZWQqKVJUQV9EQVRBKHRiW0ZSQV9QUklPUklUWV0pKTsKKwllbHNlCisJCWZwcmludGYoZnAsICIwOlx0Iik7CisKKwlpZiAoci0+cnRtX2ZsYWdzICYgRklCX1JVTEVfSU5WRVJUKQorCQlmcHJpbnRmKGZwLCAibm90ICIpOworCisJaWYgKHRiW0ZSQV9TUkNdKSB7CisJCWlmIChyLT5ydG1fc3JjX2xlbiAhPSBob3N0X2xlbikgeworCQkJZnByaW50ZihmcCwgImZyb20gJXMvJXUgIiwgcnRfYWRkcl9uMmEoci0+cnRtX2ZhbWlseSwKKwkJCQkJCSAgICAgICBSVEFfUEFZTE9BRCh0YltGUkFfU1JDXSksCisJCQkJCQkgICAgICAgUlRBX0RBVEEodGJbRlJBX1NSQ10pLAorCQkJCQkJICAgICAgIGFidWYsIHNpemVvZihhYnVmKSksCisJCQkJci0+cnRtX3NyY19sZW4KKwkJCQkpOworCQl9IGVsc2UgeworCQkJZnByaW50ZihmcCwgImZyb20gJXMgIiwgZm9ybWF0X2hvc3Qoci0+cnRtX2ZhbWlseSwKKwkJCQkJCSAgICAgICBSVEFfUEFZTE9BRCh0YltGUkFfU1JDXSksCisJCQkJCQkgICAgICAgUlRBX0RBVEEodGJbRlJBX1NSQ10pLAorCQkJCQkJICAgICAgIGFidWYsIHNpemVvZihhYnVmKSkKKwkJCQkpOworCQl9CisJfSBlbHNlIGlmIChyLT5ydG1fc3JjX2xlbikgeworCQlmcHJpbnRmKGZwLCAiZnJvbSAwLyVkICIsIHItPnJ0bV9zcmNfbGVuKTsKKwl9IGVsc2UgeworCQlmcHJpbnRmKGZwLCAiZnJvbSBhbGwgIik7CisJfQorCisJaWYgKHRiW0ZSQV9EU1RdKSB7CisJCWlmIChyLT5ydG1fZHN0X2xlbiAhPSBob3N0X2xlbikgeworCQkJZnByaW50ZihmcCwgInRvICVzLyV1ICIsIHJ0X2FkZHJfbjJhKHItPnJ0bV9mYW1pbHksCisJCQkJCQkgICAgICAgUlRBX1BBWUxPQUQodGJbRlJBX0RTVF0pLAorCQkJCQkJICAgICAgIFJUQV9EQVRBKHRiW0ZSQV9EU1RdKSwKKwkJCQkJCSAgICAgICBhYnVmLCBzaXplb2YoYWJ1ZikpLAorCQkJCXItPnJ0bV9kc3RfbGVuCisJCQkJKTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoZnAsICJ0byAlcyAiLCBmb3JtYXRfaG9zdChyLT5ydG1fZmFtaWx5LAorCQkJCQkJICAgICAgIFJUQV9QQVlMT0FEKHRiW0ZSQV9EU1RdKSwKKwkJCQkJCSAgICAgICBSVEFfREFUQSh0YltGUkFfRFNUXSksCisJCQkJCQkgICAgICAgYWJ1Ziwgc2l6ZW9mKGFidWYpKSk7CisJCX0KKwl9IGVsc2UgaWYgKHItPnJ0bV9kc3RfbGVuKSB7CisJCWZwcmludGYoZnAsICJ0byAwLyVkICIsIHItPnJ0bV9kc3RfbGVuKTsKKwl9CisKKwlpZiAoci0+cnRtX3RvcykgeworCQlTUFJJTlRfQlVGKGIxKTsKKwkJZnByaW50ZihmcCwgInRvcyAlcyAiLCBydG5sX2RzZmllbGRfbjJhKHItPnJ0bV90b3MsIGIxLCBzaXplb2YoYjEpKSk7CisJfQorCisJaWYgKHRiW0ZSQV9GV01BUktdIHx8IHRiW0ZSQV9GV01BU0tdKSB7CisJCV9fdTMyIG1hcmsgPSAwLCBtYXNrID0gMDsKKworCQlpZiAodGJbRlJBX0ZXTUFSS10pCisJCQltYXJrID0gcnRhX2dldGF0dHJfdTMyKHRiW0ZSQV9GV01BUktdKTsKKworCQlpZiAodGJbRlJBX0ZXTUFTS10gJiYKKwkJICAgIChtYXNrID0gcnRhX2dldGF0dHJfdTMyKHRiW0ZSQV9GV01BU0tdKSkgIT0gMHhGRkZGRkZGRikKKwkJCWZwcmludGYoZnAsICJmd21hcmsgMHgleC8weCV4ICIsIG1hcmssIG1hc2spOworCQllbHNlCisJCQlmcHJpbnRmKGZwLCAiZndtYXJrIDB4JXggIiwgbWFyayk7CisJfQorCisJaWYgKHRiW0ZSQV9JRk5BTUVdKSB7CisJCWZwcmludGYoZnAsICJpaWYgJXMgIiwgcnRhX2dldGF0dHJfc3RyKHRiW0ZSQV9JRk5BTUVdKSk7CisJCWlmIChyLT5ydG1fZmxhZ3MgJiBGSUJfUlVMRV9JSUZfREVUQUNIRUQpCisJCQlmcHJpbnRmKGZwLCAiW2RldGFjaGVkXSAiKTsKKwl9CisKKwlpZiAodGJbRlJBX09JRk5BTUVdKSB7CisJCWZwcmludGYoZnAsICJvaWYgJXMgIiwgcnRhX2dldGF0dHJfc3RyKHRiW0ZSQV9PSUZOQU1FXSkpOworCQlpZiAoci0+cnRtX2ZsYWdzICYgRklCX1JVTEVfT0lGX0RFVEFDSEVEKQorCQkJZnByaW50ZihmcCwgIltkZXRhY2hlZF0gIik7CisJfQorCisJaWYgKHRiW0ZSQV9VSURfU1RBUlRdIHx8IHRiW0ZSQV9VSURfRU5EXSkgeworCQlmcHJpbnRmKGZwLCAidWlkcmFuZ2UgIik7CisJCWlmICh0YltGUkFfVUlEX1NUQVJUXSkKKwkJCWZwcmludGYoZnAsICIldSIsIHJ0YV9nZXRhdHRyX3UzMih0YltGUkFfVUlEX1NUQVJUXSkpOworCQllbHNlCisJCQlmcHJpbnRmKGZwLCAiPz8/Iik7CisKKwkJaWYgKHRiW0ZSQV9VSURfRU5EXSkKKwkJCWZwcmludGYoZnAsICItJXUgIiwgcnRhX2dldGF0dHJfdTMyKHRiW0ZSQV9VSURfRU5EXSkpOworCQllbHNlCisJCQlmcHJpbnRmKGZwLCAiLT8/PyAiKTsKKwl9CisKKwl0YWJsZSA9IHJ0bV9nZXRfdGFibGUociwgdGIpOworCWlmICh0YWJsZSkgeworCQlmcHJpbnRmKGZwLCAibG9va3VwICVzICIsIHJ0bmxfcnR0YWJsZV9uMmEodGFibGUsIGIxLCBzaXplb2YoYjEpKSk7CisKKwkJaWYgKHRiW0ZSQV9TVVBQUkVTU19QUkVGSVhMRU5dKSB7CisJCQlpbnQgcGwgPSBydGFfZ2V0YXR0cl91MzIodGJbRlJBX1NVUFBSRVNTX1BSRUZJWExFTl0pOworCQkJaWYgKHBsICE9IC0xKSB7CisJCQkJZnByaW50ZihmcCwgInN1cHByZXNzX3ByZWZpeGxlbmd0aCAlZCAiLCBwbCk7CisJCQl9CisJCX0KKwkJaWYgKHRiW0ZSQV9TVVBQUkVTU19JRkdST1VQXSkgeworCQkJaW50IGdyb3VwID0gcnRhX2dldGF0dHJfdTMyKHRiW0ZSQV9TVVBQUkVTU19JRkdST1VQXSk7CisJCQlpZiAoZ3JvdXAgIT0gLTEpIHsKKwkJCQlTUFJJTlRfQlVGKGIxKTsKKwkJCQlmcHJpbnRmKGZwLCAic3VwcHJlc3NfaWZncm91cCAlcyAiLCBydG5sX2dyb3VwX24yYShncm91cCwgYjEsIHNpemVvZihiMSkpKTsKKwkJCX0KKwkJfQorCX0KKworCWlmICh0YltGUkFfRkxPV10pIHsKKwkJX191MzIgdG8gPSBydGFfZ2V0YXR0cl91MzIodGJbRlJBX0ZMT1ddKTsKKwkJX191MzIgZnJvbSA9IHRvPj4xNjsKKwkJdG8gJj0gMHhGRkZGOworCQlpZiAoZnJvbSkgeworCQkJZnByaW50ZihmcCwgInJlYWxtcyAlcy8iLAorCQkJCXJ0bmxfcnRyZWFsbV9uMmEoZnJvbSwgYjEsIHNpemVvZihiMSkpKTsKKwkJfQorCQlmcHJpbnRmKGZwLCAiJXMgIiwKKwkJCXJ0bmxfcnRyZWFsbV9uMmEodG8sIGIxLCBzaXplb2YoYjEpKSk7CisJfQorCisJaWYgKHItPnJ0bV90eXBlID09IFJUTl9OQVQpIHsKKwkJaWYgKHRiW1JUQV9HQVRFV0FZXSkgeworCQkJZnByaW50ZihmcCwgIm1hcC10byAlcyAiLAorCQkJCWZvcm1hdF9ob3N0KHItPnJ0bV9mYW1pbHksCisJCQkJCSAgICBSVEFfUEFZTE9BRCh0YltSVEFfR0FURVdBWV0pLAorCQkJCQkgICAgUlRBX0RBVEEodGJbUlRBX0dBVEVXQVldKSwKKwkJCQkJICAgIGFidWYsIHNpemVvZihhYnVmKSkpOworCQl9IGVsc2UKKwkJCWZwcmludGYoZnAsICJtYXNxdWVyYWRlIik7CisJfSBlbHNlIGlmIChyLT5ydG1fdHlwZSA9PSBGUl9BQ1RfR09UTykgeworCQlmcHJpbnRmKGZwLCAiZ290byAiKTsKKwkJaWYgKHRiW0ZSQV9HT1RPXSkKKwkJCWZwcmludGYoZnAsICIldSIsIHJ0YV9nZXRhdHRyX3UzMih0YltGUkFfR09UT10pKTsKKwkJZWxzZQorCQkJZnByaW50ZihmcCwgIm5vbmUiKTsKKwkJaWYgKHItPnJ0bV9mbGFncyAmIEZJQl9SVUxFX1VOUkVTT0xWRUQpCisJCQlmcHJpbnRmKGZwLCAiIFt1bnJlc29sdmVkXSIpOworCX0gZWxzZSBpZiAoci0+cnRtX3R5cGUgPT0gRlJfQUNUX05PUCkKKwkJZnByaW50ZihmcCwgIm5vcCIpOworCWVsc2UgaWYgKHItPnJ0bV90eXBlICE9IFJUTl9VTklDQVNUKQorCQlmcHJpbnRmKGZwLCAiJXMiLCBydG5sX3J0bnR5cGVfbjJhKHItPnJ0bV90eXBlLCBiMSwgc2l6ZW9mKGIxKSkpOworCisJZnByaW50ZihmcCwgIlxuIik7CisJZmZsdXNoKGZwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9fdTMyIHJ1bGVfZHVtcF9tYWdpYyA9IDB4NzE3MDY5ODY7CisKK3N0YXRpYyBpbnQgc2F2ZV9ydWxlX3ByZXAodm9pZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKGlzYXR0eShTVERPVVRfRklMRU5PKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vdCBzZW5kaW5nIGEgYmluYXJ5IHN0cmVhbSB0byBzdGRvdXRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0ID0gd3JpdGUoU1RET1VUX0ZJTEVOTywgJnJ1bGVfZHVtcF9tYWdpYywgc2l6ZW9mKHJ1bGVfZHVtcF9tYWdpYykpOworCWlmIChyZXQgIT0gc2l6ZW9mKHJ1bGVfZHVtcF9tYWdpYykpIHsKKwkJZnByaW50ZihzdGRlcnIsICJDYW4ndCB3cml0ZSBtYWdpYyB0byBkdW1wIGZpbGVcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2F2ZV9ydWxlKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gd3JpdGUoU1RET1VUX0ZJTEVOTywgbiwgbi0+bmxtc2dfbGVuKTsKKwlpZiAoKHJldCA+IDApICYmIChyZXQgIT0gbi0+bmxtc2dfbGVuKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlNob3J0IHdyaXRlIHdoaWxlIHNhdmluZyBubG1zZ1xuIik7CisJCXJldCA9IC1FSU87CisJfQorCisJcmV0dXJuIHJldCA9PSBuLT5ubG1zZ19sZW4gPyAwIDogcmV0OworfQorCitzdGF0aWMgaW50IGlwcnVsZV9saXN0X29yX3NhdmUoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBpbnQgc2F2ZSkKK3sKKwlydG5sX2ZpbHRlcl90IGZpbHRlciA9IHByaW50X3J1bGU7CisJaW50IGFmID0gcHJlZmVycmVkX2ZhbWlseTsKKworCWlmIChhZiA9PSBBRl9VTlNQRUMpCisJCWFmID0gQUZfSU5FVDsKKworCWlmIChhcmdjID4gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlwiaXAgcnVsZSAlc1wiIGRvZXMgbm90IHRha2UgYW55IGFyZ3VtZW50cy5cbiIsCisJCQkJc2F2ZSA/ICJzYXZlIiA6ICJzaG93Iik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoc2F2ZSkgeworCQlpZiAoc2F2ZV9ydWxlX3ByZXAoKSkKKwkJCXJldHVybiAtMTsKKwkJZmlsdGVyID0gc2F2ZV9ydWxlOworCX0KKworCWlmIChydG5sX3dpbGRkdW1wX3JlcXVlc3QoJnJ0aCwgYWYsIFJUTV9HRVRSVUxFKSA8IDApIHsKKwkJcGVycm9yKCJDYW5ub3Qgc2VuZCBkdW1wIHJlcXVlc3QiKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHJ0bmxfZHVtcF9maWx0ZXIoJnJ0aCwgZmlsdGVyLCBzdGRvdXQpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkR1bXAgdGVybWluYXRlZFxuIik7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ1bGVfZHVtcF9jaGVja19tYWdpYyh2b2lkKQoreworCWludCByZXQ7CisJX191MzIgbWFnaWMgPSAwOworCisJaWYgKGlzYXR0eShTVERJTl9GSUxFTk8pKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ2FuJ3QgcmVzdG9yZSBydWxlIGR1bXAgZnJvbSBhIHRlcm1pbmFsXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldCA9IGZyZWFkKCZtYWdpYywgc2l6ZW9mKG1hZ2ljKSwgMSwgc3RkaW4pOworCWlmIChtYWdpYyAhPSBydWxlX2R1bXBfbWFnaWMpIHsKKwkJZnByaW50ZihzdGRlcnIsICJNYWdpYyBtaXNtYXRjaCAoJWQgZWxlbXMsICV4IG1hZ2ljKVxuIiwgcmV0LCBtYWdpYyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZXN0b3JlX2hhbmRsZXIoY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICpubCwKKwkJCSAgIHN0cnVjdCBydG5sX2N0cmxfZGF0YSAqY3RybCwKKwkJCSAgIHN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqYXJnKQoreworCWludCByZXQ7CisKKwluLT5ubG1zZ19mbGFncyB8PSBOTE1fRl9SRVFVRVNUIHwgTkxNX0ZfQ1JFQVRFIHwgTkxNX0ZfQUNLOworCisJbGxfaW5pdF9tYXAoJnJ0aCk7CisKKwlyZXQgPSBydG5sX3RhbGsoJnJ0aCwgbiwgbiwgc2l6ZW9mKCpuKSk7CisJaWYgKChyZXQgPCAwKSAmJiAoZXJybm8gPT0gRUVYSVNUKSkKKwkJcmV0ID0gMDsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBpcHJ1bGVfcmVzdG9yZSh2b2lkKQoreworCWlmIChydWxlX2R1bXBfY2hlY2tfbWFnaWMoKSkKKwkJZXhpdCgtMSk7CisKKwlleGl0KHJ0bmxfZnJvbV9maWxlKHN0ZGluLCAmcmVzdG9yZV9oYW5kbGVyLCBOVUxMKSk7Cit9CisKK3N0YXRpYyBpbnQgaXBydWxlX21vZGlmeShpbnQgY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IHRhYmxlX29rID0gMDsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgbmxtc2doZHIJbjsKKwkJc3RydWN0IHJ0bXNnCQlyOworCQljaGFyICAJCQlidWZbMTAyNF07CisJfSByZXE7CisKKwltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCisJcmVxLm4ubmxtc2dfdHlwZSA9IGNtZDsKKwlyZXEubi5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBydG1zZykpOworCXJlcS5uLm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVDsKKwlyZXEuci5ydG1fZmFtaWx5ID0gcHJlZmVycmVkX2ZhbWlseTsKKwlyZXEuci5ydG1fcHJvdG9jb2wgPSBSVFBST1RfQk9PVDsKKwlyZXEuci5ydG1fc2NvcGUgPSBSVF9TQ09QRV9VTklWRVJTRTsKKwlyZXEuci5ydG1fdGFibGUgPSAwOworCXJlcS5yLnJ0bV90eXBlID0gUlROX1VOU1BFQzsKKwlyZXEuci5ydG1fZmxhZ3MgPSAwOworCisJaWYgKGNtZCA9PSBSVE1fTkVXUlVMRSkgeworCQlyZXEubi5ubG1zZ19mbGFncyB8PSBOTE1fRl9DUkVBVEV8TkxNX0ZfRVhDTDsKKwkJcmVxLnIucnRtX3R5cGUgPSBSVE5fVU5JQ0FTVDsKKwl9CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgIm5vdCIpID09IDApIHsKKwkJCXJlcS5yLnJ0bV9mbGFncyB8PSBGSUJfUlVMRV9JTlZFUlQ7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZnJvbSIpID09IDApIHsKKwkJCWluZXRfcHJlZml4IGRzdDsKKwkJCU5FWFRfQVJHKCk7CisJCQlnZXRfcHJlZml4KCZkc3QsICphcmd2LCByZXEuci5ydG1fZmFtaWx5KTsKKwkJCXJlcS5yLnJ0bV9zcmNfbGVuID0gZHN0LmJpdGxlbjsKKwkJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBGUkFfU1JDLCAmZHN0LmRhdGEsIGRzdC5ieXRlbGVuKTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJ0byIpID09IDApIHsKKwkJCWluZXRfcHJlZml4IGRzdDsKKwkJCU5FWFRfQVJHKCk7CisJCQlnZXRfcHJlZml4KCZkc3QsICphcmd2LCByZXEuci5ydG1fZmFtaWx5KTsKKwkJCXJlcS5yLnJ0bV9kc3RfbGVuID0gZHN0LmJpdGxlbjsKKwkJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBGUkFfRFNULCAmZHN0LmRhdGEsIGRzdC5ieXRlbGVuKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAicHJlZmVyZW5jZSIpID09IDAgfHwKKwkJCSAgIG1hdGNoZXMoKmFyZ3YsICJvcmRlciIpID09IDAgfHwKKwkJCSAgIG1hdGNoZXMoKmFyZ3YsICJwcmlvcml0eSIpID09IDApIHsKKwkJCV9fdTMyIHByZWY7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJnByZWYsICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoInByZWZlcmVuY2UgdmFsdWUgaXMgaW52YWxpZFxuIiwgKmFyZ3YpOworCQkJYWRkYXR0cjMyKCZyZXEubiwgc2l6ZW9mKHJlcSksIEZSQV9QUklPUklUWSwgcHJlZik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAidG9zIikgPT0gMCB8fAorCQkJICAgbWF0Y2hlcygqYXJndiwgImRzZmllbGQiKSA9PSAwKSB7CisJCQlfX3UzMiB0b3M7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHJ0bmxfZHNmaWVsZF9hMm4oJnRvcywgKmFyZ3YpKQorCQkJCWludmFyZygiVE9TIHZhbHVlIGlzIGludmFsaWRcbiIsICphcmd2KTsKKwkJCXJlcS5yLnJ0bV90b3MgPSB0b3M7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZndtYXJrIikgPT0gMCkgeworCQkJY2hhciAqc2xhc2g7CisJCQlfX3UzMiBmd21hcmssIGZ3bWFzazsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoKHNsYXNoID0gc3RyY2hyKCphcmd2LCAnLycpKSAhPSBOVUxMKQorCQkJCSpzbGFzaCA9ICdcMCc7CisJCQlpZiAoZ2V0X3UzMigmZndtYXJrLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJmd21hcmsgdmFsdWUgaXMgaW52YWxpZFxuIiwgKmFyZ3YpOworCQkJYWRkYXR0cjMyKCZyZXEubiwgc2l6ZW9mKHJlcSksIEZSQV9GV01BUkssIGZ3bWFyayk7CisJCQlpZiAoc2xhc2gpIHsKKwkJCQlpZiAoZ2V0X3UzMigmZndtYXNrLCBzbGFzaCsxLCAwKSkKKwkJCQkJaW52YXJnKCJmd21hc2sgdmFsdWUgaXMgaW52YWxpZFxuIiwgc2xhc2grMSk7CisJCQkJYWRkYXR0cjMyKCZyZXEubiwgc2l6ZW9mKHJlcSksIEZSQV9GV01BU0ssIGZ3bWFzayk7CisJCQl9CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInJlYWxtcyIpID09IDApIHsKKwkJCV9fdTMyIHJlYWxtOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfcnRfcmVhbG1zX29yX3JhdygmcmVhbG0sICphcmd2KSkKKwkJCQlpbnZhcmcoImludmFsaWQgcmVhbG1zXG4iLCAqYXJndik7CisJCQlhZGRhdHRyMzIoJnJlcS5uLCBzaXplb2YocmVxKSwgRlJBX0ZMT1csIHJlYWxtKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAidGFibGUiKSA9PSAwIHx8CisJCQkgICBzdHJjbXAoKmFyZ3YsICJsb29rdXAiKSA9PSAwKSB7CisJCQlfX3UzMiB0aWQ7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHJ0bmxfcnR0YWJsZV9hMm4oJnRpZCwgKmFyZ3YpKQorCQkJCWludmFyZygiaW52YWxpZCB0YWJsZSBJRFxuIiwgKmFyZ3YpOworCQkJaWYgKHRpZCA8IDI1NikKKwkJCQlyZXEuci5ydG1fdGFibGUgPSB0aWQ7CisJCQllbHNlIHsKKwkJCQlyZXEuci5ydG1fdGFibGUgPSBSVF9UQUJMRV9VTlNQRUM7CisJCQkJYWRkYXR0cjMyKCZyZXEubiwgc2l6ZW9mKHJlcSksIEZSQV9UQUJMRSwgdGlkKTsKKwkJCX0KKwkJCXRhYmxlX29rID0gMTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAic3VwcHJlc3NfcHJlZml4bGVuZ3RoIikgPT0gMCB8fAorCQkJICAgc3RyY21wKCphcmd2LCAic3VwX3BsIikgPT0gMCkgeworCQkJaW50IHBsOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfczMyKCZwbCwgKmFyZ3YsIDApIHx8IHBsIDwgMCkKKwkJCQlpbnZhcmcoInN1cHByZXNzX3ByZWZpeGxlbmd0aCB2YWx1ZSBpcyBpbnZhbGlkXG4iLCAqYXJndik7CisJCQlhZGRhdHRyMzIoJnJlcS5uLCBzaXplb2YocmVxKSwgRlJBX1NVUFBSRVNTX1BSRUZJWExFTiwgcGwpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJzdXBwcmVzc19pZmdyb3VwIikgPT0gMCB8fAorCQkJICAgc3RyY21wKCphcmd2LCAic3VwX2dyb3VwIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWludCBncm91cDsKKwkJCWlmIChydG5sX2dyb3VwX2EybigmZ3JvdXAsICphcmd2KSkKKwkJCQlpbnZhcmcoIkludmFsaWQgXCJzdXBwcmVzc19pZmdyb3VwXCIgdmFsdWVcbiIsICphcmd2KTsKKwkJCWFkZGF0dHIzMigmcmVxLm4sIHNpemVvZihyZXEpLCBGUkFfU1VQUFJFU1NfSUZHUk9VUCwgZ3JvdXApOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImRldiIpID09IDAgfHwKKwkJCSAgIHN0cmNtcCgqYXJndiwgImlpZiIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgRlJBX0lGTkFNRSwgKmFyZ3YsIHN0cmxlbigqYXJndikrMSk7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAib2lmIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBGUkFfT0lGTkFNRSwgKmFyZ3YsIHN0cmxlbigqYXJndikrMSk7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibmF0IikgPT0gMCB8fAorCQkJICAgbWF0Y2hlcygqYXJndiwgIm1hcC10byIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IHJvdXRlIE5BVCBpcyBkZXByZWNhdGVkXG4iKTsKKwkJCWFkZGF0dHIzMigmcmVxLm4sIHNpemVvZihyZXEpLCBSVEFfR0FURVdBWSwgZ2V0X2FkZHIzMigqYXJndikpOworCQkJcmVxLnIucnRtX3R5cGUgPSBSVE5fTkFUOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInVpZHJhbmdlIikgPT0gMCkgeworCQkJX191MzIgdWlkX3N0YXJ0LCB1aWRfZW5kOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChzc2NhbmYoKmFyZ3YsICIldS0ldSIsICZ1aWRfc3RhcnQsICZ1aWRfZW5kKSAhPSAyKQorCQkJCWludmFyZygiVUlEIHJhbmdlIGlzIGludmFsaWRcbiIsICphcmd2KTsKKwkJCWFkZGF0dHIzMigmcmVxLm4sIHNpemVvZihyZXEpLCBGUkFfVUlEX1NUQVJULCB1aWRfc3RhcnQpOworCQkJYWRkYXR0cjMyKCZyZXEubiwgc2l6ZW9mKHJlcSksIEZSQV9VSURfRU5ELCB1aWRfZW5kKTsKKwkJfSBlbHNlIHsKKwkJCWludCB0eXBlOworCisJCQlpZiAoc3RyY21wKCphcmd2LCAidHlwZSIpID09IDApIHsKKwkJCQlORVhUX0FSRygpOworCQkJfQorCQkJaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkKKwkJCQl1c2FnZSgpOworCQkJZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImdvdG8iKSA9PSAwKSB7CisJCQkJX191MzIgdGFyZ2V0OworCQkJCXR5cGUgPSBGUl9BQ1RfR09UTzsKKwkJCQlORVhUX0FSRygpOworCQkJCWlmIChnZXRfdTMyKCZ0YXJnZXQsICphcmd2LCAwKSkKKwkJCQkJaW52YXJnKCJpbnZhbGlkIHRhcmdldFxuIiwgKmFyZ3YpOworCQkJCWFkZGF0dHIzMigmcmVxLm4sIHNpemVvZihyZXEpLCBGUkFfR09UTywgdGFyZ2V0KTsKKwkJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgIm5vcCIpID09IDApCisJCQkJdHlwZSA9IEZSX0FDVF9OT1A7CisJCQllbHNlIGlmIChydG5sX3J0bnR5cGVfYTJuKCZ0eXBlLCAqYXJndikpCisJCQkJaW52YXJnKCJGYWlsZWQgdG8gcGFyc2UgcnVsZSB0eXBlIiwgKmFyZ3YpOworCQkJcmVxLnIucnRtX3R5cGUgPSB0eXBlOworCQkJdGFibGVfb2sgPSAxOworCQl9CisJCWFyZ2MtLTsKKwkJYXJndisrOworCX0KKworCWlmIChyZXEuci5ydG1fZmFtaWx5ID09IEFGX1VOU1BFQykKKwkJcmVxLnIucnRtX2ZhbWlseSA9IEFGX0lORVQ7CisKKwlpZiAoIXRhYmxlX29rICYmIGNtZCA9PSBSVE1fTkVXUlVMRSkKKwkJcmVxLnIucnRtX3RhYmxlID0gUlRfVEFCTEVfTUFJTjsKKworCWlmIChydG5sX3RhbGsoJnJ0aCwgJnJlcS5uLCBOVUxMLCAwKSA8IDApCisJCXJldHVybiAtMjsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZmx1c2hfcnVsZShjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobywgc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcpCit7CisJc3RydWN0IHJ0bmxfaGFuZGxlIHJ0aDI7CisJc3RydWN0IHJ0bXNnICpyID0gTkxNU0dfREFUQShuKTsKKwlpbnQgbGVuID0gbi0+bmxtc2dfbGVuOworCXN0cnVjdCBydGF0dHIgKiB0YltGUkFfTUFYKzFdOworCisJbGVuIC09IE5MTVNHX0xFTkdUSChzaXplb2YoKnIpKTsKKwlpZiAobGVuIDwgMCkKKwkJcmV0dXJuIC0xOworCisJcGFyc2VfcnRhdHRyKHRiLCBGUkFfTUFYLCBSVE1fUlRBKHIpLCBsZW4pOworCisJaWYgKHRiW0ZSQV9QUklPUklUWV0pIHsKKwkJbi0+bmxtc2dfdHlwZSA9IFJUTV9ERUxSVUxFOworCQluLT5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1Q7CisKKwkJaWYgKHJ0bmxfb3BlbigmcnRoMiwgMCkgPCAwKQorCQkJcmV0dXJuIC0xOworCisJCWlmIChydG5sX3RhbGsoJnJ0aDIsIG4sIE5VTEwsIDApIDwgMCkKKwkJCXJldHVybiAtMjsKKworCQlydG5sX2Nsb3NlKCZydGgyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHJ1bGVfZmx1c2goaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBhZiA9IHByZWZlcnJlZF9mYW1pbHk7CisKKwlpZiAoYWYgPT0gQUZfVU5TUEVDKQorCQlhZiA9IEFGX0lORVQ7CisKKwlpZiAoYXJnYyA+IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJcImlwIHJ1bGUgZmx1c2hcIiBkb2VzIG5vdCBhbGxvdyBhcmd1bWVudHNcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHJ0bmxfd2lsZGR1bXBfcmVxdWVzdCgmcnRoLCBhZiwgUlRNX0dFVFJVTEUpIDwgMCkgeworCQlwZXJyb3IoIkNhbm5vdCBzZW5kIGR1bXAgcmVxdWVzdCIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAocnRubF9kdW1wX2ZpbHRlcigmcnRoLCBmbHVzaF9ydWxlLCBOVUxMKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJGbHVzaCB0ZXJtaW5hdGVkXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBkb19pcHJ1bGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWlmIChhcmdjIDwgMSkgeworCQlyZXR1cm4gaXBydWxlX2xpc3Rfb3Jfc2F2ZSgwLCBOVUxMLCAwKTsKKwl9IGVsc2UgaWYgKG1hdGNoZXMoYXJndlswXSwgImxpc3QiKSA9PSAwIHx8CisJCSAgIG1hdGNoZXMoYXJndlswXSwgImxzdCIpID09IDAgfHwKKwkJICAgbWF0Y2hlcyhhcmd2WzBdLCAic2hvdyIpID09IDApIHsKKwkJcmV0dXJuIGlwcnVsZV9saXN0X29yX3NhdmUoYXJnYy0xLCBhcmd2KzEsIDApOworCX0gZWxzZSBpZiAobWF0Y2hlcyhhcmd2WzBdLCAic2F2ZSIpID09IDApIHsKKwkJcmV0dXJuIGlwcnVsZV9saXN0X29yX3NhdmUoYXJnYy0xLCBhcmd2KzEsIDEpOworCX0gZWxzZSBpZiAobWF0Y2hlcyhhcmd2WzBdLCAicmVzdG9yZSIpID09IDApIHsKKwkJcmV0dXJuIGlwcnVsZV9yZXN0b3JlKCk7CisJfSBlbHNlIGlmIChtYXRjaGVzKGFyZ3ZbMF0sICJhZGQiKSA9PSAwKSB7CisJCXJldHVybiBpcHJ1bGVfbW9kaWZ5KFJUTV9ORVdSVUxFLCBhcmdjLTEsIGFyZ3YrMSk7CisJfSBlbHNlIGlmIChtYXRjaGVzKGFyZ3ZbMF0sICJkZWxldGUiKSA9PSAwKSB7CisJCXJldHVybiBpcHJ1bGVfbW9kaWZ5KFJUTV9ERUxSVUxFLCBhcmdjLTEsIGFyZ3YrMSk7CisJfSBlbHNlIGlmIChtYXRjaGVzKGFyZ3ZbMF0sICJmbHVzaCIpID09IDApIHsKKwkJcmV0dXJuIGlwcnVsZV9mbHVzaChhcmdjLTEsIGFyZ3YrMSk7CisJfSBlbHNlIGlmIChtYXRjaGVzKGFyZ3ZbMF0sICJoZWxwIikgPT0gMCkKKwkJdXNhZ2UoKTsKKworCWZwcmludGYoc3RkZXJyLCAiQ29tbWFuZCBcIiVzXCIgaXMgdW5rbm93biwgdHJ5IFwiaXAgcnVsZSBoZWxwXCIuXG4iLCAqYXJndik7CisJZXhpdCgtMSk7Cit9CisKK2ludCBkb19tdWx0aXJ1bGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN3aXRjaCAocHJlZmVycmVkX2ZhbWlseSkgeworCWNhc2UgQUZfVU5TUEVDOgorCWNhc2UgQUZfSU5FVDoKKwkJcHJlZmVycmVkX2ZhbWlseSA9IFJUTkxfRkFNSUxZX0lQTVI7CisJCWJyZWFrOworCWNhc2UgQUZfSU5FVDY6CisJCXByZWZlcnJlZF9mYW1pbHkgPSBSVE5MX0ZBTUlMWV9JUDZNUjsKKwkJYnJlYWs7CisJY2FzZSBSVE5MX0ZBTUlMWV9JUE1SOgorCWNhc2UgUlROTF9GQU1JTFlfSVA2TVI6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZwcmludGYoc3RkZXJyLCAiTXVsdGljYXN0IHJ1bGVzIGFyZSBvbmx5IHN1cHBvcnRlZCBmb3IgSVB2NC9JUHY2LCB3YXM6ICVpXG4iLAorCQkJcHJlZmVycmVkX2ZhbWlseSk7CisJCWV4aXQoLTEpOworCX0KKworCXJldHVybiBkb19pcHJ1bGUoYXJnYywgYXJndik7Cit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pcC9pcHRva2VuLmMgYi9pcHJvdXRlMi9pcC9pcHRva2VuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI4ZjEzMwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2lwL2lwdG9rZW4uYwpAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAqIGlwdG9rZW4uYyAgICAiaXAgdG9rZW4iCisgKgorICogICAgICAgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgICAgICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICAgICAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAgICAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczogICAgIERhbmllbCBCb3JrbWFubiwgPGJvcmttYW5uQHJlZGhhdC5jb20+CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorCisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgImlwX2NvbW1vbi5oIgorCitleHRlcm4gc3RydWN0IHJ0bmxfaGFuZGxlIHJ0aDsKKworc3RydWN0IHJ0bmxfZHVtcF9hcmdzIHsKKwlGSUxFICpmcDsKKwlpbnQgaWZpbmRleDsKK307CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogaXAgdG9rZW4gWyBsaXN0IHwgc2V0IHwgZ2V0IF0gWyBUT0tFTiBdIFsgZGV2IERFViBdXG4iKTsKKwlleGl0KC0xKTsKK30KKworc3RhdGljIGludCBwcmludF90b2tlbihjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobywgc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcpCit7CisJc3RydWN0IHJ0bmxfZHVtcF9hcmdzICphcmdzID0gYXJnOworCUZJTEUgKmZwID0gYXJncy0+ZnA7CisJaW50IGlmaW5kZXggPSBhcmdzLT5pZmluZGV4OworCXN0cnVjdCBpZmluZm9tc2cgKmlmaSA9IE5MTVNHX0RBVEEobik7CisJaW50IGxlbiA9IG4tPm5sbXNnX2xlbjsKKwlzdHJ1Y3QgcnRhdHRyICp0YltJRkxBX01BWCArIDFdOworCXN0cnVjdCBydGF0dHIgKmx0YltJRkxBX0lORVQ2X01BWCArIDFdOworCWNoYXIgYWJ1ZlsyNTZdOworCisJaWYgKG4tPm5sbXNnX3R5cGUgIT0gUlRNX05FV0xJTkspCisJCXJldHVybiAtMTsKKworCWxlbiAtPSBOTE1TR19MRU5HVEgoc2l6ZW9mKCppZmkpKTsKKwlpZiAobGVuIDwgMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGlmaS0+aWZpX2ZhbWlseSAhPSBBRl9JTkVUNikKKwkJcmV0dXJuIC0xOworCWlmIChpZmktPmlmaV9pbmRleCA9PSAwKQorCQlyZXR1cm4gLTE7CisJaWYgKGlmaW5kZXggPiAwICYmIGlmaS0+aWZpX2luZGV4ICE9IGlmaW5kZXgpCisJCXJldHVybiAwOworCWlmIChpZmktPmlmaV9mbGFncyAmIChJRkZfTE9PUEJBQ0sgfCBJRkZfTk9BUlApKQorCQlyZXR1cm4gMDsKKworCXBhcnNlX3J0YXR0cih0YiwgSUZMQV9NQVgsIElGTEFfUlRBKGlmaSksIGxlbik7CisJaWYgKCF0YltJRkxBX1BST1RJTkZPXSkKKwkJcmV0dXJuIC0xOworCisJcGFyc2VfcnRhdHRyX25lc3RlZChsdGIsIElGTEFfSU5FVDZfTUFYLCB0YltJRkxBX1BST1RJTkZPXSk7CisJaWYgKCFsdGJbSUZMQV9JTkVUNl9UT0tFTl0pIHsKKwkJZnByaW50ZihzdGRlcnIsICJTZWVtcyB0aGVyZSdzIG5vIHN1cHBvcnQgZm9yIElQdjYgdG9rZW4hXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZwcmludGYoZnAsICJ0b2tlbiAlcyAiLAorCQlmb3JtYXRfaG9zdChpZmktPmlmaV9mYW1pbHksCisJCQkgICAgUlRBX1BBWUxPQUQobHRiW0lGTEFfSU5FVDZfVE9LRU5dKSwKKwkJCSAgICBSVEFfREFUQShsdGJbSUZMQV9JTkVUNl9UT0tFTl0pLAorCQkJICAgIGFidWYsIHNpemVvZihhYnVmKSkpOworCWZwcmludGYoZnAsICJkZXYgJXMgIiwgbGxfaW5kZXhfdG9fbmFtZShpZmktPmlmaV9pbmRleCkpOworCWZwcmludGYoZnAsICJcbiIpOworCWZmbHVzaChmcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHRva2VuX2xpc3QoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBhZiA9IEFGX0lORVQ2OworCXN0cnVjdCBydG5sX2R1bXBfYXJncyBkYTsKKworCW1lbXNldCgmZGEsIDAsIHNpemVvZihkYSkpOworCWRhLmZwID0gc3Rkb3V0OworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChzdHJjbXAoKmFyZ3YsICJkZXYiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKChkYS5pZmluZGV4ID0gbGxfbmFtZV90b19pbmRleCgqYXJndikpID09IDApCisJCQkJaW52YXJnKCJkZXYgaXMgaW52YWxpZFxuIiwgKmFyZ3YpOworCQkJYnJlYWs7CisJCX0KKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJaWYgKHJ0bmxfd2lsZGR1bXBfcmVxdWVzdCgmcnRoLCBhZiwgUlRNX0dFVExJTkspIDwgMCkgeworCQlwZXJyb3IoIkNhbm5vdCBzZW5kIGR1bXAgcmVxdWVzdCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHJ0bmxfZHVtcF9maWx0ZXIoJnJ0aCwgcHJpbnRfdG9rZW4sICZkYSkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRHVtcCB0ZXJtaW5hdGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwdG9rZW5fc2V0KGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgbmxtc2doZHIgbjsKKwkJc3RydWN0IGlmaW5mb21zZyBpZmk7CisJCWNoYXIgYnVmWzUxMl07CisJfSByZXE7CisJc3RydWN0IHJ0YXR0ciAqYWZzLCAqYWZzNjsKKwlib29sIGhhdmVfdG9rZW4gPSBmYWxzZSwgaGF2ZV9kZXYgPSBmYWxzZTsKKwlpbmV0X3ByZWZpeCBhZGRyOworCisJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisKKwlyZXEubi5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBpZmluZm9tc2cpKTsKKwlyZXEubi5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1Q7CisJcmVxLm4ubmxtc2dfdHlwZSA9IFJUTV9TRVRMSU5LOworCXJlcS5pZmkuaWZpX2ZhbWlseSA9IEFGX0lORVQ2OworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChzdHJjbXAoKmFyZ3YsICJkZXYiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKCFoYXZlX2RldikgeworCQkJCWlmICgocmVxLmlmaS5pZmlfaW5kZXggPQorCQkJCSAgICAgbGxfbmFtZV90b19pbmRleCgqYXJndikpID09IDApCisJCQkJCWludmFyZygiZGV2IGlzIGludmFsaWRcbiIsICphcmd2KTsKKwkJCQloYXZlX2RldiA9IHRydWU7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKQorCQkJCXVzYWdlKCk7CisJCQlpZiAoIWhhdmVfdG9rZW4pIHsKKwkJCQlhZnMgPSBhZGRhdHRyX25lc3QoJnJlcS5uLCBzaXplb2YocmVxKSwgSUZMQV9BRl9TUEVDKTsKKwkJCQlhZnM2ID0gYWRkYXR0cl9uZXN0KCZyZXEubiwgc2l6ZW9mKHJlcSksIEFGX0lORVQ2KTsKKwkJCQlnZXRfcHJlZml4KCZhZGRyLCAqYXJndiwgcmVxLmlmaS5pZmlfZmFtaWx5KTsKKwkJCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgSUZMQV9JTkVUNl9UT0tFTiwKKwkJCQkJICAmYWRkci5kYXRhLCBhZGRyLmJ5dGVsZW4pOworCQkJCWFkZGF0dHJfbmVzdF9lbmQoJnJlcS5uLCBhZnM2KTsKKwkJCQlhZGRhdHRyX25lc3RfZW5kKCZyZXEubiwgYWZzKTsKKwkJCQloYXZlX3Rva2VuID0gdHJ1ZTsKKwkJCX0KKwkJfQorCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisKKwlpZiAoIWhhdmVfdG9rZW4pIHsKKwkJZnByaW50ZihzdGRlcnIsICJOb3QgZW5vdWdoIGluZm9ybWF0aW9uOiB0b2tlbiAiCisJCQkiaXMgcmVxdWlyZWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoIWhhdmVfZGV2KSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm90IGVub3VnaCBpbmZvcm1hdGlvbjogXCJkZXZcIiAiCisJCQkiYXJndW1lbnQgaXMgcmVxdWlyZWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChydG5sX3RhbGsoJnJ0aCwgJnJlcS5uLCBOVUxMLCAwKSA8IDApCisJCXJldHVybiAtMjsKKworCXJldHVybiAwOworfQorCitpbnQgZG9faXB0b2tlbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJbGxfaW5pdF9tYXAoJnJ0aCk7CisKKwlpZiAoYXJnYyA8IDEpIHsKKwkJcmV0dXJuIGlwdG9rZW5fbGlzdCgwLCBOVUxMKTsKKwl9IGVsc2UgaWYgKG1hdGNoZXMoYXJndlswXSwgImxpc3QiKSA9PSAwIHx8CisJCSAgIG1hdGNoZXMoYXJndlswXSwgImxzdCIpID09IDAgfHwKKwkJICAgbWF0Y2hlcyhhcmd2WzBdLCAic2hvdyIpID09IDApIHsKKwkJcmV0dXJuIGlwdG9rZW5fbGlzdChhcmdjIC0gMSwgYXJndiArIDEpOworCX0gZWxzZSBpZiAobWF0Y2hlcyhhcmd2WzBdLCAic2V0IikgPT0gMCB8fAorCQkgICBtYXRjaGVzKGFyZ3ZbMF0sICJhZGQiKSA9PSAwKSB7CisJCXJldHVybiBpcHRva2VuX3NldChhcmdjIC0gMSwgYXJndiArIDEpOworCX0gZWxzZSBpZiAobWF0Y2hlcyhhcmd2WzBdLCAiZ2V0IikgPT0gMCkgeworCQlyZXR1cm4gaXB0b2tlbl9saXN0KGFyZ2MgLSAxLCBhcmd2ICsgMSk7CisJfSBlbHNlIGlmIChtYXRjaGVzKGFyZ3ZbMF0sICJoZWxwIikgPT0gMCkKKwkJdXNhZ2UoKTsKKworCWZwcmludGYoc3RkZXJyLCAiQ29tbWFuZCBcIiVzXCIgaXMgdW5rbm93biwgdHJ5IFwiaXAgdG9rZW4gaGVscFwiLlxuIiwgKmFyZ3YpOworCWV4aXQoLTEpOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaXAvaXB0dW5uZWwuYyBiL2lwcm91dGUyL2lwL2lwdHVubmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVhNGU2ZQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2lwL2lwdHVubmVsLmMKQEAgLTAsMCArMSw2MzkgQEAKKy8qCisgKiBpcHR1bm5lbC5jCSAgICAgICAiaXAgdHVubmVsIgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPG5ldC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3R1bm5lbC5oPgorCisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgImlwX2NvbW1vbi5oIgorI2luY2x1ZGUgInR1bm5lbC5oIgorCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGlwIHR1bm5lbCB7IGFkZCB8IGNoYW5nZSB8IGRlbCB8IHNob3cgfCBwcmwgfCA2cmQgfSBbIE5BTUUgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgWyBtb2RlIHsgaXBpcCB8IGdyZSB8IHNpdCB8IGlzYXRhcCB8IHZ0aSB9IF0gWyByZW1vdGUgQUREUiBdIFsgbG9jYWwgQUREUiBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICBbIFtpfG9dc2VxIF0gWyBbaXxvXWtleSBLRVkgXSBbIFtpfG9dY3N1bSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICBbIHBybC1kZWZhdWx0IEFERFIgXSBbIHBybC1ub2RlZmF1bHQgQUREUiBdIFsgcHJsLWRlbGV0ZSBBRERSIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgIFsgNnJkLXByZWZpeCBBRERSIF0gWyA2cmQtcmVsYXlfcHJlZml4IEFERFIgXSBbIDZyZC1yZXNldCBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICBbIHR0bCBUVEwgXSBbIHRvcyBUT1MgXSBbIFtub11wbXR1ZGlzYyBdIFsgZGV2IFBIWVNfREVWIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIldoZXJlOiBOQU1FIDo9IFNUUklOR1xuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgQUREUiA6PSB7IElQX0FERFJFU1MgfCBhbnkgfVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgVE9TICA6PSB7IFNUUklORyB8IDAwLi5mZiB8IGluaGVyaXQgfCBpbmhlcml0L1NUUklORyB8IGluaGVyaXQvMDAuLmZmIH1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgIFRUTCAgOj0geyAxLi4yNTUgfCBpbmhlcml0IH1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgIEtFWSAgOj0geyBET1RURURfUVVBRCB8IE5VTUJFUiB9XG4iKTsKKwlleGl0KC0xKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3R1bm5lbF9wcm90byhzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gKnAsIGludCBwcm90bykKK3sKKwlpZiAocC0+aXBoLnByb3RvY29sICYmIHAtPmlwaC5wcm90b2NvbCAhPSBwcm90bykgeworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJZb3UgbWFuYWdlZCB0byBhc2sgZm9yIG1vcmUgdGhhbiBvbmUgdHVubmVsIG1vZGUuXG4iKTsKKwkJZXhpdCgtMSk7CisJfQorCXAtPmlwaC5wcm90b2NvbCA9IHByb3RvOworfQorCitzdGF0aWMgaW50IHBhcnNlX2FyZ3MoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBpbnQgY21kLCBzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gKnApCit7CisJaW50IGNvdW50ID0gMDsKKwljaGFyIG1lZGl1bVtJRk5BTVNJWl07CisJaW50IGlzYXRhcCA9IDA7CisKKwltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSk7CisJbWVtc2V0KCZtZWRpdW0sIDAsIHNpemVvZihtZWRpdW0pKTsKKworCXAtPmlwaC52ZXJzaW9uID0gNDsKKwlwLT5pcGguaWhsID0gNTsKKyNpZm5kZWYgSVBfREYKKyNkZWZpbmUgSVBfREYJCTB4NDAwMAkJLyogRmxhZzogIkRvbid0IEZyYWdtZW50IgkqLworI2VuZGlmCisJcC0+aXBoLmZyYWdfb2ZmID0gaHRvbnMoSVBfREYpOworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChzdHJjbXAoKmFyZ3YsICJtb2RlIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJpcGlwIikgPT0gMCB8fAorCQkJICAgIHN0cmNtcCgqYXJndiwgImlwL2lwIikgPT0gMCkgeworCQkJCXNldF90dW5uZWxfcHJvdG8ocCwgSVBQUk9UT19JUElQKTsKKwkJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZ3JlIikgPT0gMCB8fAorCQkJCSAgIHN0cmNtcCgqYXJndiwgImdyZS9pcCIpID09IDApIHsKKwkJCQlzZXRfdHVubmVsX3Byb3RvKHAsIElQUFJPVE9fR1JFKTsKKwkJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAic2l0IikgPT0gMCB8fAorCQkJCSAgIHN0cmNtcCgqYXJndiwgImlwdjYvaXAiKSA9PSAwKSB7CisJCQkJc2V0X3R1bm5lbF9wcm90byhwLCBJUFBST1RPX0lQVjYpOworCQkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJpc2F0YXAiKSA9PSAwKSB7CisJCQkJc2V0X3R1bm5lbF9wcm90byhwLCBJUFBST1RPX0lQVjYpOworCQkJCWlzYXRhcCsrOworCQkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJ2dGkiKSA9PSAwKSB7CisJCQkJc2V0X3R1bm5lbF9wcm90byhwLCBJUFBST1RPX0lQSVApOworCQkJCXAtPmlfZmxhZ3MgfD0gVlRJX0lTVlRJOworCQkJfSBlbHNlIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJIlVua25vd24gdHVubmVsIG1vZGUgXCIlc1wiXG4iLCAqYXJndik7CisJCQkJZXhpdCgtMSk7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAia2V5IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCXAtPmlfZmxhZ3MgfD0gR1JFX0tFWTsKKwkJCXAtPm9fZmxhZ3MgfD0gR1JFX0tFWTsKKwkJCXAtPmlfa2V5ID0gcC0+b19rZXkgPSB0bmxfcGFyc2Vfa2V5KCJrZXkiLCAqYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaWtleSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlwLT5pX2ZsYWdzIHw9IEdSRV9LRVk7CisJCQlwLT5pX2tleSA9IHRubF9wYXJzZV9rZXkoImlrZXkiLCAqYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAib2tleSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlwLT5vX2ZsYWdzIHw9IEdSRV9LRVk7CisJCQlwLT5vX2tleSA9IHRubF9wYXJzZV9rZXkoIm9rZXkiLCAqYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAic2VxIikgPT0gMCkgeworCQkJcC0+aV9mbGFncyB8PSBHUkVfU0VROworCQkJcC0+b19mbGFncyB8PSBHUkVfU0VROworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImlzZXEiKSA9PSAwKSB7CisJCQlwLT5pX2ZsYWdzIHw9IEdSRV9TRVE7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAib3NlcSIpID09IDApIHsKKwkJCXAtPm9fZmxhZ3MgfD0gR1JFX1NFUTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJjc3VtIikgPT0gMCkgeworCQkJcC0+aV9mbGFncyB8PSBHUkVfQ1NVTTsKKwkJCXAtPm9fZmxhZ3MgfD0gR1JFX0NTVU07CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaWNzdW0iKSA9PSAwKSB7CisJCQlwLT5pX2ZsYWdzIHw9IEdSRV9DU1VNOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm9jc3VtIikgPT0gMCkgeworCQkJcC0+b19mbGFncyB8PSBHUkVfQ1NVTTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJub3BtdHVkaXNjIikgPT0gMCkgeworCQkJcC0+aXBoLmZyYWdfb2ZmID0gMDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJwbXR1ZGlzYyIpID09IDApIHsKKwkJCXAtPmlwaC5mcmFnX29mZiA9IGh0b25zKElQX0RGKTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJyZW1vdGUiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHN0cmNtcCgqYXJndiwgImFueSIpKQorCQkJCXAtPmlwaC5kYWRkciA9IGdldF9hZGRyMzIoKmFyZ3YpOworCQkJZWxzZQorCQkJCXAtPmlwaC5kYWRkciA9IGh0b25sKElOQUREUl9BTlkpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImxvY2FsIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJhbnkiKSkKKwkJCQlwLT5pcGguc2FkZHIgPSBnZXRfYWRkcjMyKCphcmd2KTsKKwkJCWVsc2UKKwkJCQlwLT5pcGguc2FkZHIgPSBodG9ubChJTkFERFJfQU5ZKTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJkZXYiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJc3RybmNweShtZWRpdW0sICphcmd2LCBJRk5BTVNJWiAtIDEpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInR0bCIpID09IDAgfHwKKwkJCSAgIHN0cmNtcCgqYXJndiwgImhvcGxpbWl0IikgPT0gMCB8fAorCQkJICAgc3RyY21wKCphcmd2LCAiaGxpbSIpID09IDApIHsKKwkJCV9fdTggdXZhbDsKKworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJpbmhlcml0IikgIT0gMCkgeworCQkJCWlmIChnZXRfdTgoJnV2YWwsICphcmd2LCAwKSkKKwkJCQkJaW52YXJnKCJpbnZhbGlkIFRUTFxuIiwgKmFyZ3YpOworCQkJCXAtPmlwaC50dGwgPSB1dmFsOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInRvcyIpID09IDAgfHwKKwkJCSAgIHN0cmNtcCgqYXJndiwgInRjbGFzcyIpID09IDAgfHwKKwkJCSAgIG1hdGNoZXMoKmFyZ3YsICJkc2ZpZWxkIikgPT0gMCkgeworCQkJY2hhciAqZHNmaWVsZDsKKwkJCV9fdTMyIHV2YWw7CisKKwkJCU5FWFRfQVJHKCk7CisJCQlkc2ZpZWxkID0gKmFyZ3Y7CisJCQlzdHJzZXAoJmRzZmllbGQsICIvIik7CisJCQlpZiAoc3RyY21wKCphcmd2LCAiaW5oZXJpdCIpICE9IDApIHsKKwkJCQlkc2ZpZWxkID0gKmFyZ3Y7CisJCQkJcC0+aXBoLnRvcyA9IDA7CisJCQl9IGVsc2UKKwkJCQlwLT5pcGgudG9zID0gMTsKKwkJCWlmIChkc2ZpZWxkKSB7CisJCQkJaWYgKHJ0bmxfZHNmaWVsZF9hMm4oJnV2YWwsIGRzZmllbGQpKQorCQkJCQlpbnZhcmcoImJhZCBUT1MgdmFsdWUiLCAqYXJndik7CisJCQkJcC0+aXBoLnRvcyB8PSB1dmFsOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHN0cmNtcCgqYXJndiwgIm5hbWUiKSA9PSAwKQorCQkJCU5FWFRfQVJHKCk7CisJCQllbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiaGVscCIpID09IDApCisJCQkJdXNhZ2UoKTsKKworCQkJaWYgKHAtPm5hbWVbMF0pCisJCQkJZHVwYXJnMigibmFtZSIsICphcmd2KTsKKwkJCXN0cm5jcHkocC0+bmFtZSwgKmFyZ3YsIElGTkFNU0laIC0gMSk7CisJCQlpZiAoY21kID09IFNJT0NDSEdUVU5ORUwgJiYgY291bnQgPT0gMCkgeworCQkJCXN0cnVjdCBpcF90dW5uZWxfcGFybSBvbGRfcDsKKworCQkJCW1lbXNldCgmb2xkX3AsIDAsIHNpemVvZihvbGRfcCkpOworCQkJCWlmICh0bmxfZ2V0X2lvY3RsKCphcmd2LCAmb2xkX3ApKQorCQkJCQlyZXR1cm4gLTE7CisJCQkJKnAgPSBvbGRfcDsKKwkJCX0KKwkJfQorCQljb3VudCsrOworCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisKKworCWlmIChwLT5pcGgucHJvdG9jb2wgPT0gMCkgeworCQlpZiAobWVtY21wKHAtPm5hbWUsICJncmUiLCAzKSA9PSAwKQorCQkJcC0+aXBoLnByb3RvY29sID0gSVBQUk9UT19HUkU7CisJCWVsc2UgaWYgKG1lbWNtcChwLT5uYW1lLCAiaXBpcCIsIDQpID09IDApCisJCQlwLT5pcGgucHJvdG9jb2wgPSBJUFBST1RPX0lQSVA7CisJCWVsc2UgaWYgKG1lbWNtcChwLT5uYW1lLCAic2l0IiwgMykgPT0gMCkKKwkJCXAtPmlwaC5wcm90b2NvbCA9IElQUFJPVE9fSVBWNjsKKwkJZWxzZSBpZiAobWVtY21wKHAtPm5hbWUsICJpc2F0YXAiLCA2KSA9PSAwKSB7CisJCQlwLT5pcGgucHJvdG9jb2wgPSBJUFBST1RPX0lQVjY7CisJCQlpc2F0YXArKzsKKwkJfSBlbHNlIGlmIChtZW1jbXAocC0+bmFtZSwgInZ0aSIsIDMpID09IDApIHsKKwkJCXAtPmlwaC5wcm90b2NvbCA9IElQUFJPVE9fSVBJUDsKKwkJCXAtPmlfZmxhZ3MgfD0gVlRJX0lTVlRJOworCQl9CisJfQorCisJaWYgKChwLT5pX2ZsYWdzICYgR1JFX0tFWSkgfHwgKHAtPm9fZmxhZ3MgJiBHUkVfS0VZKSkgeworCQlpZiAoIShwLT5pX2ZsYWdzICYgVlRJX0lTVlRJKSAmJgorCQkgICAgKHAtPmlwaC5wcm90b2NvbCAhPSBJUFBST1RPX0dSRSkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiS2V5cyBhcmUgbm90IGFsbG93ZWQgd2l0aCBpcGlwIGFuZCBzaXQgdHVubmVsc1xuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlpZiAobWVkaXVtWzBdKSB7CisJCXAtPmxpbmsgPSBsbF9uYW1lX3RvX2luZGV4KG1lZGl1bSk7CisJCWlmIChwLT5saW5rID09IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IGZpbmQgZGV2aWNlIFwiJXNcIlxuIiwgbWVkaXVtKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWlmIChwLT5pX2tleSA9PSAwICYmIElOX01VTFRJQ0FTVChudG9obChwLT5pcGguZGFkZHIpKSkgeworCQlwLT5pX2tleSA9IHAtPmlwaC5kYWRkcjsKKwkJcC0+aV9mbGFncyB8PSBHUkVfS0VZOworCX0KKwlpZiAocC0+b19rZXkgPT0gMCAmJiBJTl9NVUxUSUNBU1QobnRvaGwocC0+aXBoLmRhZGRyKSkpIHsKKwkJcC0+b19rZXkgPSBwLT5pcGguZGFkZHI7CisJCXAtPm9fZmxhZ3MgfD0gR1JFX0tFWTsKKwl9CisJaWYgKElOX01VTFRJQ0FTVChudG9obChwLT5pcGguZGFkZHIpKSAmJiAhcC0+aXBoLnNhZGRyKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQSBicm9hZGNhc3QgdHVubmVsIHJlcXVpcmVzIGEgc291cmNlIGFkZHJlc3NcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChpc2F0YXApCisJCXAtPmlfZmxhZ3MgfD0gU0lUX0lTQVRBUDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqdG5sX2RlZm5hbWUoY29uc3Qgc3RydWN0IGlwX3R1bm5lbF9wYXJtICpwKQoreworCXN3aXRjaCAocC0+aXBoLnByb3RvY29sKSB7CisJY2FzZSBJUFBST1RPX0lQSVA6CisJCWlmIChwLT5pX2ZsYWdzICYgVlRJX0lTVlRJKQorCQkJcmV0dXJuICJpcF92dGkwIjsKKwkJZWxzZQorCQkJcmV0dXJuICJ0dW5sMCI7CisJY2FzZSBJUFBST1RPX0dSRToKKwkJcmV0dXJuICJncmUwIjsKKwljYXNlIElQUFJPVE9fSVBWNjoKKwkJcmV0dXJuICJzaXQwIjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZG9fYWRkKGludCBjbWQsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gcDsKKwljb25zdCBjaGFyICpiYXNlZGV2OworCisJaWYgKHBhcnNlX2FyZ3MoYXJnYywgYXJndiwgY21kLCAmcCkgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAocC5pcGgudHRsICYmIHAuaXBoLmZyYWdfb2ZmID09IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJ0dGwgIT0gMCBhbmQgbm9wbXR1ZGlzYyBhcmUgaW5jb21wYXRpYmxlXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWJhc2VkZXYgPSB0bmxfZGVmbmFtZSgmcCk7CisJaWYgKCFiYXNlZGV2KSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJImNhbm5vdCBkZXRlcm1pbmUgdHVubmVsIG1vZGUgKGlwaXAsIGdyZSwgdnRpIG9yIHNpdClcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIHRubF9hZGRfaW9jdGwoY21kLCBiYXNlZGV2LCBwLm5hbWUsICZwKTsKK30KKworc3RhdGljIGludCBkb19kZWwoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBpcF90dW5uZWxfcGFybSBwOworCisJaWYgKHBhcnNlX2FyZ3MoYXJnYywgYXJndiwgU0lPQ0RFTFRVTk5FTCwgJnApIDwgMCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIHRubF9kZWxfaW9jdGwodG5sX2RlZm5hbWUoJnApID8gOiBwLm5hbWUsIHAubmFtZSwgJnApOworfQorCitzdGF0aWMgdm9pZCBwcmludF90dW5uZWwoc3RydWN0IGlwX3R1bm5lbF9wYXJtICpwKQoreworCXN0cnVjdCBpcF90dW5uZWxfNnJkIGlwNnJkOworCWNoYXIgczFbMTAyNF07CisJY2hhciBzMlsxMDI0XTsKKworCW1lbXNldCgmaXA2cmQsIDAsIHNpemVvZihpcDZyZCkpOworCisJLyogRG8gbm90IHVzZSBmb3JtYXRfaG9zdCgpIGZvciBsb2NhbCBhZGRyLAorCSAqIHN5bWJvbGljIG5hbWUgd2lsbCBub3QgYmUgdXNlZnVsLgorCSAqLworCXByaW50ZigiJXM6ICVzL2lwIHJlbW90ZSAlcyBsb2NhbCAlcyIsCisJICAgICAgIHAtPm5hbWUsCisJICAgICAgIHRubF9zdHJwcm90byhwLT5pcGgucHJvdG9jb2wpLAorCSAgICAgICBwLT5pcGguZGFkZHIgPyBmb3JtYXRfaG9zdChBRl9JTkVULCA0LCAmcC0+aXBoLmRhZGRyLCBzMSwgc2l6ZW9mKHMxKSkgOiAiYW55IiwKKwkgICAgICAgcC0+aXBoLnNhZGRyID8gcnRfYWRkcl9uMmEoQUZfSU5FVCwgNCwgJnAtPmlwaC5zYWRkciwgczIsIHNpemVvZihzMikpIDogImFueSIpOworCisJaWYgKHAtPmlwaC5wcm90b2NvbCA9PSBJUFBST1RPX0lQVjYgJiYgKHAtPmlfZmxhZ3MgJiBTSVRfSVNBVEFQKSkgeworCQlzdHJ1Y3QgaXBfdHVubmVsX3BybCBwcmxbMTZdOworCQlpbnQgaTsKKworCQltZW1zZXQocHJsLCAwLCBzaXplb2YocHJsKSk7CisJCXBybFswXS5kYXRhbGVuID0gc2l6ZW9mKHBybCkgLSBzaXplb2YocHJsWzBdKTsKKwkJcHJsWzBdLmFkZHIgPSBodG9ubChJTkFERFJfQU5ZKTsKKworCQlpZiAoIXRubF9wcmxfaW9jdGwoU0lPQ0dFVFBSTCwgcC0+bmFtZSwgcHJsKSkKKwkJCWZvciAoaSA9IDE7IGkgPCBBUlJBWV9TSVpFKHBybCk7IGkrKykgeworCQkJCWlmIChwcmxbaV0uYWRkciAhPSBodG9ubChJTkFERFJfQU5ZKSkgeworCQkJCQlwcmludGYoIiAlcyAlcyAiLAorCQkJCQkgICAgICAgKHBybFtpXS5mbGFncyAmIFBSTF9ERUZBVUxUKSA/ICJwZHIiIDogInByIiwKKwkJCQkJICAgICAgIGZvcm1hdF9ob3N0KEFGX0lORVQsIDQsICZwcmxbaV0uYWRkciwgczEsIHNpemVvZihzMSkpKTsKKwkJCQl9CisJCQl9CisJfQorCisJaWYgKHAtPmxpbmspIHsKKwkJY29uc3QgY2hhciAqbiA9IGxsX2luZGV4X3RvX25hbWUocC0+bGluayk7CisKKwkJaWYgKG4pCisJCQlwcmludGYoIiBkZXYgJXMiLCBuKTsKKwl9CisKKwlpZiAocC0+aXBoLnR0bCkKKwkJcHJpbnRmKCIgdHRsICVkIiwgcC0+aXBoLnR0bCk7CisJZWxzZQorCQlwcmludGYoIiB0dGwgaW5oZXJpdCIpOworCisJaWYgKHAtPmlwaC50b3MpIHsKKwkJU1BSSU5UX0JVRihiMSk7CisJCXByaW50ZigiIHRvcyIpOworCQlpZiAocC0+aXBoLnRvcyAmIDEpCisJCQlwcmludGYoIiBpbmhlcml0Iik7CisJCWlmIChwLT5pcGgudG9zICYgfjEpCisJCQlwcmludGYoIiVjJXMgIiwgcC0+aXBoLnRvcyAmIDEgPyAnLycgOiAnICcsCisJCQkgICAgICAgcnRubF9kc2ZpZWxkX24yYShwLT5pcGgudG9zICYgfjEsIGIxLCBzaXplb2YoYjEpKSk7CisJfQorCisJaWYgKCEocC0+aXBoLmZyYWdfb2ZmICYgaHRvbnMoSVBfREYpKSkKKwkJcHJpbnRmKCIgbm9wbXR1ZGlzYyIpOworCisJaWYgKHAtPmlwaC5wcm90b2NvbCA9PSBJUFBST1RPX0lQVjYgJiYgIXRubF9pb2N0bF9nZXRfNnJkKHAtPm5hbWUsICZpcDZyZCkgJiYgaXA2cmQucHJlZml4bGVuKSB7CisJCXByaW50ZigiIDZyZC1wcmVmaXggJXMvJXUiLAorCQkgICAgICAgaW5ldF9udG9wKEFGX0lORVQ2LCAmaXA2cmQucHJlZml4LCBzMSwgc2l6ZW9mKHMxKSksCisJCSAgICAgICBpcDZyZC5wcmVmaXhsZW4pOworCQlpZiAoaXA2cmQucmVsYXlfcHJlZml4KSB7CisJCQlwcmludGYoIiA2cmQtcmVsYXlfcHJlZml4ICVzLyV1IiwKKwkJCSAgICAgICBmb3JtYXRfaG9zdChBRl9JTkVULCA0LCAmaXA2cmQucmVsYXlfcHJlZml4LCBzMSwgc2l6ZW9mKHMxKSksCisJCQkgICAgICAgaXA2cmQucmVsYXlfcHJlZml4bGVuKTsKKwkJfQorCX0KKworCWlmICgocC0+aV9mbGFncyAmIEdSRV9LRVkpICYmIChwLT5vX2ZsYWdzICYgR1JFX0tFWSkgJiYgcC0+b19rZXkgPT0gcC0+aV9rZXkpCisJCXByaW50ZigiIGtleSAldSIsIG50b2hsKHAtPmlfa2V5KSk7CisJZWxzZSBpZiAoKHAtPmlfZmxhZ3MgfCBwLT5vX2ZsYWdzKSAmIEdSRV9LRVkpIHsKKwkJaWYgKHAtPmlfZmxhZ3MgJiBHUkVfS0VZKQorCQkJcHJpbnRmKCIgaWtleSAldSIsIG50b2hsKHAtPmlfa2V5KSk7CisJCWlmIChwLT5vX2ZsYWdzICYgR1JFX0tFWSkKKwkJCXByaW50ZigiIG9rZXkgJXUiLCBudG9obChwLT5vX2tleSkpOworCX0KKworCWlmIChwLT5pX2ZsYWdzICYgR1JFX1NFUSkKKwkJcHJpbnRmKCIlcyAgRHJvcCBwYWNrZXRzIG91dCBvZiBzZXF1ZW5jZS4iLCBfU0xfKTsKKwlpZiAocC0+aV9mbGFncyAmIEdSRV9DU1VNKQorCQlwcmludGYoIiVzICBDaGVja3N1bSBpbiByZWNlaXZlZCBwYWNrZXQgaXMgcmVxdWlyZWQuIiwgX1NMXyk7CisJaWYgKHAtPm9fZmxhZ3MgJiBHUkVfU0VRKQorCQlwcmludGYoIiVzICBTZXF1ZW5jZSBwYWNrZXRzIG9uIG91dHB1dC4iLCBfU0xfKTsKKwlpZiAocC0+b19mbGFncyAmIEdSRV9DU1VNKQorCQlwcmludGYoIiVzICBDaGVja3N1bSBvdXRwdXQgcGFja2V0cy4iLCBfU0xfKTsKK30KKworc3RhdGljIGludCBkb190dW5uZWxzX2xpc3Qoc3RydWN0IGlwX3R1bm5lbF9wYXJtICpwKQoreworCWNoYXIgYnVmWzUxMl07CisJaW50IGVyciA9IC0xOworCUZJTEUgKmZwID0gZm9wZW4oIi9wcm9jL25ldC9kZXYiLCAiciIpOworCisJaWYgKGZwID09IE5VTEwpIHsKKwkJcGVycm9yKCJmb3BlbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogc2tpcCBoZWFkZXIgbGluZXMgKi8KKwlpZiAoIWZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKSB8fAorCSAgICAhZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApKSB7CisJCWZwcmludGYoc3RkZXJyLCAiL3Byb2MvbmV0L2RldiByZWFkIGVycm9yXG4iKTsKKwkJZ290byBlbmQ7CisJfQorCisJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKSAhPSBOVUxMKSB7CisJCWNoYXIgbmFtZVtJRk5BTVNJWl07CisJCWludCBpbmRleCwgdHlwZTsKKwkJc3RydWN0IGlwX3R1bm5lbF9wYXJtIHAxOworCQljaGFyICpwdHI7CisKKwkJYnVmW3NpemVvZihidWYpIC0gMV0gPSAwOworCQlwdHIgPSBzdHJjaHIoYnVmLCAnOicpOworCQlpZiAocHRyID09IE5VTEwgfHwKKwkJICAgICgqcHRyKysgPSAwLCBzc2NhbmYoYnVmLCAiJXMiLCBuYW1lKSAhPSAxKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJXcm9uZyBmb3JtYXQgZm9yIC9wcm9jL25ldC9kZXYuIEdpdmluZyB1cC5cbiIpOworCQkJZ290byBlbmQ7CisJCX0KKwkJaWYgKHAtPm5hbWVbMF0gJiYgc3RyY21wKHAtPm5hbWUsIG5hbWUpKQorCQkJY29udGludWU7CisJCWluZGV4ID0gbGxfbmFtZV90b19pbmRleChuYW1lKTsKKwkJaWYgKGluZGV4ID09IDApCisJCQljb250aW51ZTsKKwkJdHlwZSA9IGxsX2luZGV4X3RvX3R5cGUoaW5kZXgpOworCQlpZiAodHlwZSA9PSAtMSkgeworCQkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gZ2V0IHR5cGUgb2YgXCIlc1wiXG4iLCBuYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICh0eXBlICE9IEFSUEhSRF9UVU5ORUwgJiYgdHlwZSAhPSBBUlBIUkRfSVBHUkUgJiYgdHlwZSAhPSBBUlBIUkRfU0lUKQorCQkJY29udGludWU7CisJCW1lbXNldCgmcDEsIDAsIHNpemVvZihwMSkpOworCQlpZiAodG5sX2dldF9pb2N0bChuYW1lLCAmcDEpKQorCQkJY29udGludWU7CisJCWlmICgocC0+bGluayAmJiBwMS5saW5rICE9IHAtPmxpbmspIHx8CisJCSAgICAocC0+bmFtZVswXSAmJiBzdHJjbXAocDEubmFtZSwgcC0+bmFtZSkpIHx8CisJCSAgICAocC0+aXBoLmRhZGRyICYmIHAxLmlwaC5kYWRkciAhPSBwLT5pcGguZGFkZHIpIHx8CisJCSAgICAocC0+aXBoLnNhZGRyICYmIHAxLmlwaC5zYWRkciAhPSBwLT5pcGguc2FkZHIpIHx8CisJCSAgICAocC0+aV9rZXkgJiYgcDEuaV9rZXkgIT0gcC0+aV9rZXkpKQorCQkJY29udGludWU7CisJCXByaW50X3R1bm5lbCgmcDEpOworCQlpZiAoc2hvd19zdGF0cykKKwkJCXRubF9wcmludF9zdGF0cyhwdHIpOworCQlwcmludGYoIlxuIik7CisJfQorCWVyciA9IDA7CisgZW5kOgorCWZjbG9zZShmcCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBkb19zaG93KGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gcDsKKwljb25zdCBjaGFyICpiYXNlZGV2OworCisJbGxfaW5pdF9tYXAoJnJ0aCk7CisJaWYgKHBhcnNlX2FyZ3MoYXJnYywgYXJndiwgU0lPQ0dFVFRVTk5FTCwgJnApIDwgMCkKKwkJcmV0dXJuIC0xOworCisJYmFzZWRldiA9IHRubF9kZWZuYW1lKCZwKTsKKwlpZiAoIWJhc2VkZXYpCisJCXJldHVybiBkb190dW5uZWxzX2xpc3QoJnApOworCisJaWYgKHRubF9nZXRfaW9jdGwocC5uYW1lWzBdID8gcC5uYW1lIDogYmFzZWRldiwgJnApKQorCQlyZXR1cm4gLTE7CisKKwlwcmludF90dW5uZWwoJnApOworCXByaW50ZigiXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19wcmwoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBpcF90dW5uZWxfcHJsIHA7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgZGV2bmFtZSA9IDA7CisJaW50IGNtZCA9IDA7CisJY2hhciBtZWRpdW1bSUZOQU1TSVpdOworCisJbWVtc2V0KCZwLCAwLCBzaXplb2YocCkpOworCW1lbXNldCgmbWVkaXVtLCAwLCBzaXplb2YobWVkaXVtKSk7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgInBybC1kZWZhdWx0IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWNtZCA9IFNJT0NBRERQUkw7CisJCQlwLmFkZHIgPSBnZXRfYWRkcjMyKCphcmd2KTsKKwkJCXAuZmxhZ3MgfD0gUFJMX0RFRkFVTFQ7CisJCQljb3VudCsrOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInBybC1ub2RlZmF1bHQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJY21kID0gU0lPQ0FERFBSTDsKKwkJCXAuYWRkciA9IGdldF9hZGRyMzIoKmFyZ3YpOworCQkJY291bnQrKzsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJwcmwtZGVsZXRlIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWNtZCA9IFNJT0NERUxQUkw7CisJCQlwLmFkZHIgPSBnZXRfYWRkcjMyKCphcmd2KTsKKwkJCWNvdW50Kys7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZGV2IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCXN0cm5jcHkobWVkaXVtLCAqYXJndiwgSUZOQU1TSVotMSk7CisJCQlkZXZuYW1lKys7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiSW52YWxpZCBQUkwgcGFyYW1ldGVyIFwiJXNcIlxuIiwgKmFyZ3YpOworCQkJZXhpdCgtMSk7CisJCX0KKwkJaWYgKGNvdW50ID4gMSkgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIk9uZSBQUkwgZW50cnkgYXQgYSB0aW1lXG4iKTsKKwkJCWV4aXQoLTEpOworCQl9CisJCWFyZ2MtLTsgYXJndisrOworCX0KKwlpZiAoZGV2bmFtZSA9PSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTXVzdCBzcGVjaWZ5IGRldmljZVxuIik7CisJCWV4aXQoLTEpOworCX0KKworCXJldHVybiB0bmxfcHJsX2lvY3RsKGNtZCwgbWVkaXVtLCAmcCk7Cit9CisKK3N0YXRpYyBpbnQgZG9fNnJkKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgaXBfdHVubmVsXzZyZCBpcDZyZDsKKwlpbnQgZGV2bmFtZSA9IDA7CisJaW50IGNtZCA9IDA7CisJY2hhciBtZWRpdW1bSUZOQU1TSVpdOworCWluZXRfcHJlZml4IHByZWZpeDsKKworCW1lbXNldCgmaXA2cmQsIDAsIHNpemVvZihpcDZyZCkpOworCW1lbXNldCgmbWVkaXVtLCAwLCBzaXplb2YobWVkaXVtKSk7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgIjZyZC1wcmVmaXgiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9wcmVmaXgoJnByZWZpeCwgKmFyZ3YsIEFGX0lORVQ2KSkKKwkJCQlpbnZhcmcoImludmFsaWQgNnJkX3ByZWZpeFxuIiwgKmFyZ3YpOworCQkJY21kID0gU0lPQ0FERDZSRDsKKwkJCW1lbWNweSgmaXA2cmQucHJlZml4LCBwcmVmaXguZGF0YSwgMTYpOworCQkJaXA2cmQucHJlZml4bGVuID0gcHJlZml4LmJpdGxlbjsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICI2cmQtcmVsYXlfcHJlZml4IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfcHJlZml4KCZwcmVmaXgsICphcmd2LCBBRl9JTkVUKSkKKwkJCQlpbnZhcmcoImludmFsaWQgNnJkLXJlbGF5X3ByZWZpeFxuIiwgKmFyZ3YpOworCQkJY21kID0gU0lPQ0FERDZSRDsKKwkJCW1lbWNweSgmaXA2cmQucmVsYXlfcHJlZml4LCBwcmVmaXguZGF0YSwgNCk7CisJCQlpcDZyZC5yZWxheV9wcmVmaXhsZW4gPSBwcmVmaXguYml0bGVuOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIjZyZC1yZXNldCIpID09IDApIHsKKwkJCWNtZCA9IFNJT0NERUw2UkQ7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZGV2IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCXN0cm5jcHkobWVkaXVtLCAqYXJndiwgSUZOQU1TSVotMSk7CisJCQlkZXZuYW1lKys7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiSW52YWxpZCA2UkQgcGFyYW1ldGVyIFwiJXNcIlxuIiwgKmFyZ3YpOworCQkJZXhpdCgtMSk7CisJCX0KKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCWlmIChkZXZuYW1lID09IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJNdXN0IHNwZWNpZnkgZGV2aWNlXG4iKTsKKwkJZXhpdCgtMSk7CisJfQorCisJcmV0dXJuIHRubF82cmRfaW9jdGwoY21kLCBtZWRpdW0sICZpcDZyZCk7Cit9CisKK3N0YXRpYyBpbnQgdHVubmVsX21vZGVfaXNfaXB2NihjaGFyICp0dW5uZWxfbW9kZSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGlwdjZfbW9kZXNbXSA9IHsKKwkJImlwdjYvaXB2NiIsICJpcDZpcDYiLAorCQkidnRpNiIsCisJCSJpcC9pcHY2IiwgImlwdjQvaXB2NiIsICJpcGlwNiIsICJpcDRpcDYiLAorCQkiaXA2Z3JlIiwgImdyZS9pcHY2IiwKKwkJImFueS9pcHY2IiwgImFueSIKKwl9OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaXB2Nl9tb2Rlcyk7IGkrKykgeworCQlpZiAoc3RyY21wKGlwdjZfbW9kZXNbaV0sIHR1bm5lbF9tb2RlKSA9PSAwKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitpbnQgZG9faXB0dW5uZWwoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGFyZ2MgLSAxOyBpKyspIHsKKwkJaWYgKHN0cmNtcChhcmd2W2ldLCAibW9kZSIpID09IDApIHsKKwkJCWlmICh0dW5uZWxfbW9kZV9pc19pcHY2KGFyZ3ZbaSArIDFdKSkKKwkJCQlwcmVmZXJyZWRfZmFtaWx5ID0gQUZfSU5FVDY7CisJCQlicmVhazsKKwkJfQorCX0KKwlzd2l0Y2ggKHByZWZlcnJlZF9mYW1pbHkpIHsKKwljYXNlIEFGX1VOU1BFQzoKKwkJcHJlZmVycmVkX2ZhbWlseSA9IEFGX0lORVQ7CisJCWJyZWFrOworCWNhc2UgQUZfSU5FVDoKKwkJYnJlYWs7CisJLyoKKwkgKiBUaGlzIGlzIHNpbGx5IGVub3VnaCBidXQgd2UgaGF2ZSBubyBlYXN5IHdheSB0byBtYWtlIGl0CisJICogcHJvdG9jb2wtaW5kZXBlbmRlbnQgYmVjYXVzZSBvZiB1bmFycmFuZ2VkIHN0cnVjdHVyZSBiZXR3ZWVuCisJICogSVB2NCBhbmQgSVB2Ni4KKwkgKi8KKwljYXNlIEFGX0lORVQ2OgorCQlyZXR1cm4gZG9faXA2dHVubmVsKGFyZ2MsIGFyZ3YpOworCWRlZmF1bHQ6CisJCWZwcmludGYoc3RkZXJyLCAiVW5zdXBwb3J0ZWQgcHJvdG9jb2wgZmFtaWx5OiAlZFxuIiwgcHJlZmVycmVkX2ZhbWlseSk7CisJCWV4aXQoLTEpOworCX0KKworCWlmIChhcmdjID4gMCkgeworCQlpZiAobWF0Y2hlcygqYXJndiwgImFkZCIpID09IDApCisJCQlyZXR1cm4gZG9fYWRkKFNJT0NBRERUVU5ORUwsIGFyZ2MgLSAxLCBhcmd2ICsgMSk7CisJCWlmIChtYXRjaGVzKCphcmd2LCAiY2hhbmdlIikgPT0gMCkKKwkJCXJldHVybiBkb19hZGQoU0lPQ0NIR1RVTk5FTCwgYXJnYyAtIDEsIGFyZ3YgKyAxKTsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJkZWxldGUiKSA9PSAwKQorCQkJcmV0dXJuIGRvX2RlbChhcmdjIC0gMSwgYXJndiArIDEpOworCQlpZiAobWF0Y2hlcygqYXJndiwgInNob3ciKSA9PSAwIHx8CisJCSAgICBtYXRjaGVzKCphcmd2LCAibHN0IikgPT0gMCB8fAorCQkgICAgbWF0Y2hlcygqYXJndiwgImxpc3QiKSA9PSAwKQorCQkJcmV0dXJuIGRvX3Nob3coYXJnYyAtIDEsIGFyZ3YgKyAxKTsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJwcmwiKSA9PSAwKQorCQkJcmV0dXJuIGRvX3BybChhcmdjIC0gMSwgYXJndiArIDEpOworCQlpZiAobWF0Y2hlcygqYXJndiwgIjZyZCIpID09IDApCisJCQlyZXR1cm4gZG9fNnJkKGFyZ2MgLSAxLCBhcmd2ICsgMSk7CisJCWlmIChtYXRjaGVzKCphcmd2LCAiaGVscCIpID09IDApCisJCQl1c2FnZSgpOworCX0gZWxzZQorCQlyZXR1cm4gZG9fc2hvdygwLCBOVUxMKTsKKworCWZwcmludGYoc3RkZXJyLCAiQ29tbWFuZCBcIiVzXCIgaXMgdW5rbm93biwgdHJ5IFwiaXAgdHVubmVsIGhlbHBcIlxuIiwgKmFyZ3YpOworCWV4aXQoLTEpOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaXAvaXB0dW50YXAuYyBiL2lwcm91dGUyL2lwL2lwdHVudGFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjliMjhhMQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2lwL2lwdHVudGFwLmMKQEAgLTAsMCArMSwzMjcgQEAKKy8qCisgKiBpcHR1bm5lbC5jCSAgICAgICAiaXAgdHVudGFwIgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CURhdmlkIFdvb2Rob3VzZSA8RGF2aWQuV29vZGhvdXNlQGludGVsLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdHVuLmg+CisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8Z3JwLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgImlwX2NvbW1vbi5oIgorCisjZGVmaW5lIFRVTkRFViAiL2Rldi9uZXQvdHVuIgorCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGlwIHR1bnRhcCB7IGFkZCB8IGRlbCB8IHNob3cgfCBsaXN0IHwgbHN0IHwgaGVscCB9IFsgZGV2IFBIWVNfREVWIF0gXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICBbIG1vZGUgeyB0dW4gfCB0YXAgfSBdIFsgdXNlciBVU0VSIF0gWyBncm91cCBHUk9VUCBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICBbIG9uZV9xdWV1ZSBdIFsgcGkgXSBbIHZuZXRfaGRyIF0gWyBtdWx0aV9xdWV1ZSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJZnByaW50ZihzdGRlcnIsICJXaGVyZTogVVNFUiAgOj0geyBTVFJJTkcgfCBOVU1CRVIgfVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgR1JPVVAgOj0geyBTVFJJTkcgfCBOVU1CRVIgfVxuIik7CisJZXhpdCgtMSk7Cit9CisKK3N0YXRpYyBpbnQgdGFwX2FkZF9pb2N0bChzdHJ1Y3QgaWZyZXEgKmlmciwgdWlkX3QgdWlkLCBnaWRfdCBnaWQpCit7CisJaW50IGZkOworCWludCByZXQgPSAtMTsKKworI2lmZGVmIElGRl9UVU5fRVhDTAorCWlmci0+aWZyX2ZsYWdzIHw9IElGRl9UVU5fRVhDTDsKKyNlbmRpZgorCisJZmQgPSBvcGVuKFRVTkRFViwgT19SRFdSKTsKKwlpZiAoZmQgPCAwKSB7CisJCXBlcnJvcigib3BlbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChpb2N0bChmZCwgVFVOU0VUSUZGLCBpZnIpKSB7CisJCXBlcnJvcigiaW9jdGwoVFVOU0VUSUZGKSIpOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHVpZCAhPSAtMSAmJiBpb2N0bChmZCwgVFVOU0VUT1dORVIsIHVpZCkpIHsKKwkJcGVycm9yKCJpb2N0bChUVU5TRVRPV05FUikiKTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChnaWQgIT0gLTEgJiYgaW9jdGwoZmQsIFRVTlNFVEdST1VQLCBnaWQpKSB7CisJCXBlcnJvcigiaW9jdGwoVFVOU0VUR1JPVVApIik7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoaW9jdGwoZmQsIFRVTlNFVFBFUlNJU1QsIDEpKSB7CisJCXBlcnJvcigiaW9jdGwoVFVOU0VUUEVSU0lTVCkiKTsKKwkJZ290byBvdXQ7CisJfQorCXJldCA9IDA7Cisgb3V0OgorCWNsb3NlKGZkKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRhcF9kZWxfaW9jdGwoc3RydWN0IGlmcmVxICppZnIpCit7CisJaW50IGZkID0gb3BlbihUVU5ERVYsIE9fUkRXUik7CisJaW50IHJldCA9IC0xOworCisJaWYgKGZkIDwgMCkgeworCQlwZXJyb3IoIm9wZW4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoaW9jdGwoZmQsIFRVTlNFVElGRiwgaWZyKSkgeworCQlwZXJyb3IoImlvY3RsKFRVTlNFVElGRikiKTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChpb2N0bChmZCwgVFVOU0VUUEVSU0lTVCwgMCkpIHsKKwkJcGVycm9yKCJpb2N0bChUVU5TRVRQRVJTSVNUKSIpOworCQlnb3RvIG91dDsKKwl9CisJcmV0ID0gMDsKKyBvdXQ6CisJY2xvc2UoZmQpOworCXJldHVybiByZXQ7CisKK30KK3N0YXRpYyBpbnQgcGFyc2VfYXJncyhpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBpZnJlcSAqaWZyLCB1aWRfdCAqdWlkLCBnaWRfdCAqZ2lkKQoreworCWludCBjb3VudCA9IDA7CisKKwltZW1zZXQoaWZyLCAwLCBzaXplb2YoKmlmcikpOworCisJaWZyLT5pZnJfZmxhZ3MgfD0gSUZGX05PX1BJOworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChtYXRjaGVzKCphcmd2LCAibW9kZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAobWF0Y2hlcygqYXJndiwgInR1biIpID09IDApIHsKKwkJCQlpZiAoaWZyLT5pZnJfZmxhZ3MgJiBJRkZfVEFQKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLCJZb3UgbWFuYWdlZCB0byBhc2sgZm9yIG1vcmUgdGhhbiBvbmUgdHVubmVsIG1vZGUuXG4iKTsKKwkJCQkJZXhpdCgtMSk7CisJCQkJfQorCQkJCWlmci0+aWZyX2ZsYWdzIHw9IElGRl9UVU47CisJCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJ0YXAiKSA9PSAwKSB7CisJCQkJaWYgKGlmci0+aWZyX2ZsYWdzICYgSUZGX1RVTikgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwiWW91IG1hbmFnZWQgdG8gYXNrIGZvciBtb3JlIHRoYW4gb25lIHR1bm5lbCBtb2RlLlxuIik7CisJCQkJCWV4aXQoLTEpOworCQkJCX0KKwkJCQlpZnItPmlmcl9mbGFncyB8PSBJRkZfVEFQOworCQkJfSBlbHNlIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwiVW5rbm93biB0dW5uZWwgbW9kZSBcIiVzXCJcbiIsICphcmd2KTsKKwkJCQlleGl0KC0xKTsKKwkJCX0KKwkJfSBlbHNlIGlmICh1aWQgJiYgbWF0Y2hlcygqYXJndiwgInVzZXIiKSA9PSAwKSB7CisJCQljaGFyICplbmQ7CisJCQl1bnNpZ25lZCBsb25nIHVzZXI7CisKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoKiphcmd2ICYmICgodXNlciA9IHN0cnRvbCgqYXJndiwgJmVuZCwgMTApKSwgISplbmQpKQorCQkJCSp1aWQgPSB1c2VyOworCQkJZWxzZSB7CisJCQkJc3RydWN0IHBhc3N3ZCAqcHcgPSBnZXRwd25hbSgqYXJndik7CisJCQkJaWYgKCFwdykgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgdXNlciBcIiVzXCJcbiIsICphcmd2KTsKKwkJCQkJZXhpdCgtMSk7CisJCQkJfQorCQkJCSp1aWQgPSBwdy0+cHdfdWlkOworCQkJfQorCQl9IGVsc2UgaWYgKGdpZCAmJiBtYXRjaGVzKCphcmd2LCAiZ3JvdXAiKSA9PSAwKSB7CisJCQljaGFyICplbmQ7CisJCQl1bnNpZ25lZCBsb25nIGdyb3VwOworCisJCQlORVhUX0FSRygpOworCisJCQlpZiAoKiphcmd2ICYmICgoZ3JvdXAgPSBzdHJ0b2woKmFyZ3YsICZlbmQsIDEwKSksICEqZW5kKSkKKwkJCQkqZ2lkID0gZ3JvdXA7CisJCQllbHNlIHsKKwkJCQlzdHJ1Y3QgZ3JvdXAgKmdyID0gZ2V0Z3JuYW0oKmFyZ3YpOworCQkJCWlmICghZ3IpIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIGdyb3VwIFwiJXNcIlxuIiwgKmFyZ3YpOworCQkJCQlleGl0KC0xKTsKKwkJCQl9CisJCQkJKmdpZCA9IGdyLT5ncl9naWQ7CisJCQl9CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInBpIikgPT0gMCkgeworCQkJaWZyLT5pZnJfZmxhZ3MgJj0gfklGRl9OT19QSTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAib25lX3F1ZXVlIikgPT0gMCkgeworCQkJaWZyLT5pZnJfZmxhZ3MgfD0gSUZGX09ORV9RVUVVRTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAidm5ldF9oZHIiKSA9PSAwKSB7CisJCQlpZnItPmlmcl9mbGFncyB8PSBJRkZfVk5FVF9IRFI7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgIm11bHRpX3F1ZXVlIikgPT0gMCkgeworCQkJaWZyLT5pZnJfZmxhZ3MgfD0gSUZGX01VTFRJX1FVRVVFOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJkZXYiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJc3RybmNweShpZnItPmlmcl9uYW1lLCAqYXJndiwgSUZOQU1TSVotMSk7CisJCX0gZWxzZSB7CisJCQlpZiAobWF0Y2hlcygqYXJndiwgIm5hbWUiKSA9PSAwKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKQorCQkJCXVzYWdlKCk7CisJCQlpZiAoaWZyLT5pZnJfbmFtZVswXSkKKwkJCQlkdXBhcmcyKCJuYW1lIiwgKmFyZ3YpOworCQkJc3RybmNweShpZnItPmlmcl9uYW1lLCAqYXJndiwgSUZOQU1TSVopOworCQl9CisJCWNvdW50Kys7CisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCWlmICghKGlmci0+aWZyX2ZsYWdzICYgVFVOX1RZUEVfTUFTSykpIHsKKwkJZnByaW50ZihzdGRlcnIsICJZb3UgZmFpbGVkIHRvIHNwZWNpZnkgYSB0dW5uZWwgbW9kZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGRvX2FkZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwl1aWRfdCB1aWQgPSAtMTsKKwlnaWRfdCBnaWQgPSAtMTsKKworCWlmIChwYXJzZV9hcmdzKGFyZ2MsIGFyZ3YsICZpZnIsICZ1aWQsICZnaWQpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIHRhcF9hZGRfaW9jdGwoJmlmciwgdWlkLCBnaWQpOworfQorCitzdGF0aWMgaW50IGRvX2RlbChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKworCWlmIChwYXJzZV9hcmdzKGFyZ2MsIGFyZ3YsICZpZnIsIE5VTEwsIE5VTEwpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIHRhcF9kZWxfaW9jdGwoJmlmcik7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9wcm9wKGNoYXIgKmRldiwgY2hhciAqcHJvcCwgbG9uZyAqdmFsdWUpCit7CisJY2hhciBmbmFtZVtJRk5BTVNJWisyNV0sIGJ1Zls4MF0sICplbmRwOworCXNzaXplX3QgbGVuOworCWludCBmZDsKKwlsb25nIHJlc3VsdDsKKworCXNwcmludGYoZm5hbWUsICIvc3lzL2NsYXNzL25ldC8lcy8lcyIsIGRldiwgcHJvcCk7CisJZmQgPSBvcGVuKGZuYW1lLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkgeworCQlpZiAoc3RyY21wKHByb3AsICJ0dW5fZmxhZ3MiKSkKKwkJCWZwcmludGYoc3RkZXJyLCAib3BlbiAlczogJXNcbiIsIGZuYW1lLAorCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisJbGVuID0gcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKS0xKTsKKwljbG9zZShmZCk7CisJaWYgKGxlbiA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJyZWFkICVzOiAlcyIsIGZuYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCisJYnVmW2xlbl0gPSAwOworCXJlc3VsdCA9IHN0cnRvbChidWYsICZlbmRwLCAwKTsKKwlpZiAoKmVuZHAgIT0gJ1xuJykgeworCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBwYXJzZSAlc1xuIiwgZm5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCSp2YWx1ZSA9IHJlc3VsdDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfZmxhZ3MobG9uZyBmbGFncykKK3sKKwlpZiAoZmxhZ3MgJiBJRkZfVFVOKQorCQlwcmludGYoIiB0dW4iKTsKKworCWlmIChmbGFncyAmIElGRl9UQVApCisJCXByaW50ZigiIHRhcCIpOworCisJaWYgKCEoZmxhZ3MgJiBJRkZfTk9fUEkpKQorCQlwcmludGYoIiBwaSIpOworCisJaWYgKGZsYWdzICYgSUZGX09ORV9RVUVVRSkKKwkJcHJpbnRmKCIgb25lX3F1ZXVlIik7CisKKwlpZiAoZmxhZ3MgJiBJRkZfVk5FVF9IRFIpCisJCXByaW50ZigiIHZuZXRfaGRyIik7CisKKwlmbGFncyAmPSB+KElGRl9UVU58SUZGX1RBUHxJRkZfTk9fUEl8SUZGX09ORV9RVUVVRXxJRkZfVk5FVF9IRFIpOworCWlmIChmbGFncykKKwkJcHJpbnRmKCIgVU5LTk9XTl9GTEFHUzolbHgiLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgZG9fc2hvdyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJRElSICpkaXI7CisJc3RydWN0IGRpcmVudCAqZDsKKwlsb25nIGZsYWdzLCBvd25lciA9IC0xLCBncm91cCA9IC0xOworCisJZGlyID0gb3BlbmRpcigiL3N5cy9jbGFzcy9uZXQiKTsKKwlpZiAoIWRpcikgeworCQlwZXJyb3IoIm9wZW5kaXIiKTsKKwkJcmV0dXJuIC0xOworCX0KKwl3aGlsZSAoKGQgPSByZWFkZGlyKGRpcikpKSB7CisJCWlmIChkLT5kX25hbWVbMF0gPT0gJy4nICYmCisJCSAgICAoZC0+ZF9uYW1lWzFdID09IDAgfHwgZC0+ZF9uYW1lWzFdID09ICcuJykpCisJCQljb250aW51ZTsKKworCQlpZiAocmVhZF9wcm9wKGQtPmRfbmFtZSwgInR1bl9mbGFncyIsICZmbGFncykpCisJCQljb250aW51ZTsKKworCQlyZWFkX3Byb3AoZC0+ZF9uYW1lLCAib3duZXIiLCAmb3duZXIpOworCQlyZWFkX3Byb3AoZC0+ZF9uYW1lLCAiZ3JvdXAiLCAmZ3JvdXApOworCisJCXByaW50ZigiJXM6IiwgZC0+ZF9uYW1lKTsKKwkJcHJpbnRfZmxhZ3MoZmxhZ3MpOworCQlpZiAob3duZXIgIT0gLTEpCisJCQlwcmludGYoIiB1c2VyICVsZCIsIG93bmVyKTsKKwkJaWYgKGdyb3VwICE9IC0xKQorCQkJcHJpbnRmKCIgZ3JvdXAgJWxkIiwgZ3JvdXApOworCQlwcmludGYoIlxuIik7CisJfQorCWNsb3NlZGlyKGRpcik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkb19pcHR1bnRhcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaWYgKGFyZ2MgPiAwKSB7CisJCWlmIChtYXRjaGVzKCphcmd2LCAiYWRkIikgPT0gMCkKKwkJCXJldHVybiBkb19hZGQoYXJnYy0xLCBhcmd2KzEpOworCQlpZiAobWF0Y2hlcygqYXJndiwgImRlbGV0ZSIpID09IDApCisJCQlyZXR1cm4gZG9fZGVsKGFyZ2MtMSwgYXJndisxKTsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJzaG93IikgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICBtYXRjaGVzKCphcmd2LCAibHN0IikgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICBtYXRjaGVzKCphcmd2LCAibGlzdCIpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9fc2hvdyhhcmdjLTEsIGFyZ3YrMSk7CisJCWlmIChtYXRjaGVzKCphcmd2LCAiaGVscCIpID09IDApCisJCQl1c2FnZSgpOworCX0gZWxzZQorCQlyZXR1cm4gZG9fc2hvdygwLCBOVUxMKTsKKworCWZwcmludGYoc3RkZXJyLCAiQ29tbWFuZCBcIiVzXCIgaXMgdW5rbm93biwgdHJ5IFwiaXAgdHVudGFwIGhlbHBcIi5cbiIsCisJCSphcmd2KTsKKwlleGl0KC0xKTsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2lwL2lweGZybS5jIGIvaXByb3V0ZTIvaXAvaXB4ZnJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU4M2FiZgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2lwL2lweGZybS5jCkBAIC0wLDAgKzEsMTUzOCBAQAorLyogJFVTQUdJOiAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpMjAwNCBVU0FHSS9XSURFIFByb2plY3QKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzPi4KKyAqLworLyoKKyAqIGJhc2VkIG9uIGlwLmMsIGlwcm91dGUuYworICovCisvKgorICogQXV0aG9yczoKKyAqCU1hc2FoaWRlIE5BS0FNVVJBIEBVU0FHSQorICovCisKKyNpbmNsdWRlIDxhbGxvY2EuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInhmcm0uaCIKKyNpbmNsdWRlICJpcF9jb21tb24uaCIKKworI2RlZmluZSBTVFJCVUZfU0laRQkoMTI4KQorI2RlZmluZSBTVFJCVUZfQ0FUKGJ1Ziwgc3RyKSBcCisJZG8geyBcCisJCWludCByZXN0ID0gc2l6ZW9mKGJ1ZikgLSAxIC0gc3RybGVuKGJ1Zik7IFwKKwkJaWYgKHJlc3QgPiAwKSB7IFwKKwkJCWludCBsZW4gPSBzdHJsZW4oc3RyKTsgXAorCQkJaWYgKGxlbiA+IHJlc3QpIFwKKwkJCQlsZW4gPSByZXN0OyBcCisJCQlzdHJuY2F0KGJ1Ziwgc3RyLCBsZW4pOyBcCisJCQlidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9ICdcMCc7IFwKKwkJfSBcCisJfSB3aGlsZSgwKTsKKworc3RydWN0IHhmcm1fZmlsdGVyIGZpbHRlcjsKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwKKwkJIlVzYWdlOiBpcCB4ZnJtIFhGUk0tT0JKRUNUIHsgQ09NTUFORCB8IGhlbHAgfVxuIgorCQkid2hlcmUgIFhGUk0tT0JKRUNUIDo9IHN0YXRlIHwgcG9saWN5IHwgbW9uaXRvclxuIik7CisJZXhpdCgtMSk7Cit9CisKKy8qIFRoaXMgaXMgYmFzZWQgb24gdXRpbHMuYyhpbmV0X2FkZHJfbWF0Y2gpICovCitpbnQgeGZybV9hZGRyX21hdGNoKHhmcm1fYWRkcmVzc190ICp4MSwgeGZybV9hZGRyZXNzX3QgKngyLCBpbnQgYml0cykKK3sKKwlfX3UzMiAqYTEgPSAoX191MzIgKil4MTsKKwlfX3UzMiAqYTIgPSAoX191MzIgKil4MjsKKwlpbnQgd29yZHMgPSBiaXRzID4+IDB4MDU7CisKKwliaXRzICY9IDB4MWY7CisKKwlpZiAod29yZHMpCisJCWlmIChtZW1jbXAoYTEsIGEyLCB3b3JkcyA8PCAyKSkKKwkJCXJldHVybiAtMTsKKworCWlmIChiaXRzKSB7CisJCV9fdTMyIHcxLCB3MjsKKwkJX191MzIgbWFzazsKKworCQl3MSA9IGExW3dvcmRzXTsKKwkJdzIgPSBhMlt3b3Jkc107CisKKwkJbWFzayA9IGh0b25sKCgweGZmZmZmZmZmKSA8PCAoMHgyMCAtIGJpdHMpKTsKKworCQlpZiAoKHcxIF4gdzIpICYgbWFzaykKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgeGZybV94ZnJtcHJvdG9faXNfaXBzZWMoX191OCBwcm90bykKK3sKKwlyZXR1cm4gKHByb3RvID09ICBJUFBST1RPX0VTUCB8fAorCQlwcm90byA9PSAgSVBQUk9UT19BSCAgfHwKKwkJcHJvdG8gPT0gIElQUFJPVE9fQ09NUCk7Cit9CisKK2ludCB4ZnJtX3hmcm1wcm90b19pc19ybyhfX3U4IHByb3RvKQoreworCXJldHVybiAocHJvdG8gPT0gIElQUFJPVE9fUk9VVElORyB8fAorCQlwcm90byA9PSAgSVBQUk9UT19EU1RPUFRTKTsKK30KKworc3RydWN0IHR5cGVlbnQgeworCWNvbnN0IGNoYXIgKnRfbmFtZTsKKwlpbnQgdF90eXBlOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0eXBlZW50IHhmcm1wcm90b190eXBlc1tdPSB7CisJeyAiZXNwIiwgSVBQUk9UT19FU1AgfSwgeyAiYWgiLCBJUFBST1RPX0FIIH0sIHsgImNvbXAiLCBJUFBST1RPX0NPTVAgfSwKKwl7ICJyb3V0ZTIiLCBJUFBST1RPX1JPVVRJTkcgfSwgeyAiaGFvIiwgSVBQUk9UT19EU1RPUFRTIH0sCisJeyAiaXBzZWMtYW55IiwgSVBTRUNfUFJPVE9fQU5ZIH0sCisJeyBOVUxMLCAtMSB9Cit9OworCitpbnQgeGZybV94ZnJtcHJvdG9fZ2V0YnluYW1lKGNoYXIgKm5hbWUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyA7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgdHlwZWVudCAqdCA9ICZ4ZnJtcHJvdG9fdHlwZXNbaV07CisJCWlmICghdC0+dF9uYW1lIHx8IHQtPnRfdHlwZSA9PSAtMSkKKwkJCWJyZWFrOworCisJCWlmIChzdHJjbXAodC0+dF9uYW1lLCBuYW1lKSA9PSAwKQorCQkJcmV0dXJuIHQtPnRfdHlwZTsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK2NvbnN0IGNoYXIgKnN0cnhmX3hmcm1wcm90byhfX3U4IHByb3RvKQoreworCXN0YXRpYyBjaGFyIHN0clsxNl07CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyA7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgdHlwZWVudCAqdCA9ICZ4ZnJtcHJvdG9fdHlwZXNbaV07CisJCWlmICghdC0+dF9uYW1lIHx8IHQtPnRfdHlwZSA9PSAtMSkKKwkJCWJyZWFrOworCisJCWlmICh0LT50X3R5cGUgPT0gcHJvdG8pCisJCQlyZXR1cm4gdC0+dF9uYW1lOworCX0KKworCXNwcmludGYoc3RyLCAiJXUiLCBwcm90byk7CisJcmV0dXJuIHN0cjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB0eXBlZW50IGFsZ29fdHlwZXNbXT0geworCXsgImVuYyIsIFhGUk1BX0FMR19DUllQVCB9LCB7ICJhdXRoIiwgWEZSTUFfQUxHX0FVVEggfSwKKwl7ICJjb21wIiwgWEZSTUFfQUxHX0NPTVAgfSwgeyAiYWVhZCIsIFhGUk1BX0FMR19BRUFEIH0sCisJeyAiYXV0aC10cnVuYyIsIFhGUk1BX0FMR19BVVRIX1RSVU5DIH0sCisJeyBOVUxMLCAtMSB9Cit9OworCitpbnQgeGZybV9hbGdvdHlwZV9nZXRieW5hbWUoY2hhciAqbmFtZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IDsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCB0eXBlZW50ICp0ID0gJmFsZ29fdHlwZXNbaV07CisJCWlmICghdC0+dF9uYW1lIHx8IHQtPnRfdHlwZSA9PSAtMSkKKwkJCWJyZWFrOworCisJCWlmIChzdHJjbXAodC0+dF9uYW1lLCBuYW1lKSA9PSAwKQorCQkJcmV0dXJuIHQtPnRfdHlwZTsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK2NvbnN0IGNoYXIgKnN0cnhmX2FsZ290eXBlKGludCB0eXBlKQoreworCXN0YXRpYyBjaGFyIHN0clszMl07CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyA7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgdHlwZWVudCAqdCA9ICZhbGdvX3R5cGVzW2ldOworCQlpZiAoIXQtPnRfbmFtZSB8fCB0LT50X3R5cGUgPT0gLTEpCisJCQlicmVhazsKKworCQlpZiAodC0+dF90eXBlID09IHR5cGUpCisJCQlyZXR1cm4gdC0+dF9uYW1lOworCX0KKworCXNwcmludGYoc3RyLCAiJWQiLCB0eXBlKTsKKwlyZXR1cm4gc3RyOworfQorCitjb25zdCBjaGFyICpzdHJ4Zl9tYXNrOChfX3U4IG1hc2spCit7CisJc3RhdGljIGNoYXIgc3RyWzE2XTsKKwljb25zdCBpbnQgc24gPSBzaXplb2YobWFzaykgKiA4IC0gMTsKKwlfX3U4IGI7CisJaW50IGkgPSAwOworCisJZm9yIChiID0gKDEgPDwgc24pOyBiID4gMDsgYiA+Pj0gMSkKKwkJc3RyW2krK10gPSAoKGIgJiBtYXNrKSA/ICcxJyA6ICcwJyk7CisJc3RyW2ldID0gJ1wwJzsKKworCXJldHVybiBzdHI7Cit9CisKK2NvbnN0IGNoYXIgKnN0cnhmX21hc2szMihfX3UzMiBtYXNrKQoreworCXN0YXRpYyBjaGFyIHN0clsxNl07CisKKwlzcHJpbnRmKHN0ciwgIiUuOHgiLCBtYXNrKTsKKworCXJldHVybiBzdHI7Cit9CisKK2NvbnN0IGNoYXIgKnN0cnhmX3NoYXJlKF9fdTggc2hhcmUpCit7CisJc3RhdGljIGNoYXIgc3RyWzMyXTsKKworCXN3aXRjaCAoc2hhcmUpIHsKKwljYXNlIFhGUk1fU0hBUkVfQU5ZOgorCQlzdHJjcHkoc3RyLCAiYW55Iik7CisJCWJyZWFrOworCWNhc2UgWEZSTV9TSEFSRV9TRVNTSU9OOgorCQlzdHJjcHkoc3RyLCAic2Vzc2lvbiIpOworCQlicmVhazsKKwljYXNlIFhGUk1fU0hBUkVfVVNFUjoKKwkJc3RyY3B5KHN0ciwgInVzZXIiKTsKKwkJYnJlYWs7CisJY2FzZSBYRlJNX1NIQVJFX1VOSVFVRToKKwkJc3RyY3B5KHN0ciwgInVuaXF1ZSIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzcHJpbnRmKHN0ciwgIiV1Iiwgc2hhcmUpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc3RyOworfQorCitjb25zdCBjaGFyICpzdHJ4Zl9wcm90byhfX3U4IHByb3RvKQoreworCXN0YXRpYyBjaGFyIGJ1ZlszMl07CisJc3RydWN0IHByb3RvZW50ICpwcDsKKwljb25zdCBjaGFyICpwOworCisJcHAgPSBnZXRwcm90b2J5bnVtYmVyKHByb3RvKTsKKwlpZiAocHApCisJCXAgPSBwcC0+cF9uYW1lOworCWVsc2UgeworCQlzcHJpbnRmKGJ1ZiwgIiV1IiwgcHJvdG8pOworCQlwID0gYnVmOworCX0KKworCXJldHVybiBwOworfQorCitjb25zdCBjaGFyICpzdHJ4Zl9wdHlwZShfX3U4IHB0eXBlKQoreworCXN0YXRpYyBjaGFyIHN0clsxNl07CisKKwlzd2l0Y2ggKHB0eXBlKSB7CisJY2FzZSBYRlJNX1BPTElDWV9UWVBFX01BSU46CisJCXN0cmNweShzdHIsICJtYWluIik7CisJCWJyZWFrOworCWNhc2UgWEZSTV9QT0xJQ1lfVFlQRV9TVUI6CisJCXN0cmNweShzdHIsICJzdWIiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3ByaW50ZihzdHIsICIldSIsIHB0eXBlKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHN0cjsKK30KKwordm9pZCB4ZnJtX2lkX2luZm9fcHJpbnQoeGZybV9hZGRyZXNzX3QgKnNhZGRyLCBzdHJ1Y3QgeGZybV9pZCAqaWQsCisJCQlfX3U4IG1vZGUsIF9fdTMyIHJlcWlkLCBfX3UxNiBmYW1pbHksIGludCBmb3JjZV9zcGksCisJCQlGSUxFICpmcCwgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICp0aXRsZSkKK3sKKwljaGFyIGFidWZbMjU2XTsKKworCWlmICh0aXRsZSkKKwkJZnB1dHModGl0bGUsIGZwKTsKKworCW1lbXNldChhYnVmLCAnXDAnLCBzaXplb2YoYWJ1ZikpOworCWZwcmludGYoZnAsICJzcmMgJXMgIiwgcnRfYWRkcl9uMmEoZmFtaWx5LCBzaXplb2YoKnNhZGRyKSwKKwkJCQkJICAgc2FkZHIsIGFidWYsIHNpemVvZihhYnVmKSkpOworCW1lbXNldChhYnVmLCAnXDAnLCBzaXplb2YoYWJ1ZikpOworCWZwcmludGYoZnAsICJkc3QgJXMiLCBydF9hZGRyX24yYShmYW1pbHksIHNpemVvZihpZC0+ZGFkZHIpLAorCQkJCQkgICZpZC0+ZGFkZHIsIGFidWYsIHNpemVvZihhYnVmKSkpOworCWZwcmludGYoZnAsICIlcyIsIF9TTF8pOworCisJaWYgKHByZWZpeCkKKwkJZnB1dHMocHJlZml4LCBmcCk7CisJZnByaW50ZihmcCwgIlx0Iik7CisKKwlmcHJpbnRmKGZwLCAicHJvdG8gJXMgIiwgc3RyeGZfeGZybXByb3RvKGlkLT5wcm90bykpOworCisJaWYgKHNob3dfc3RhdHMgPiAwIHx8IGZvcmNlX3NwaSB8fCBpZC0+c3BpKSB7CisJCV9fdTMyIHNwaSA9IG50b2hsKGlkLT5zcGkpOworCQlmcHJpbnRmKGZwLCAic3BpIDB4JTA4eCIsIHNwaSk7CisJCWlmIChzaG93X3N0YXRzID4gMCkKKwkJCWZwcmludGYoZnAsICIoJXUpIiwgc3BpKTsKKwkJZnByaW50ZihmcCwgIiAiKTsKKwl9CisKKwlmcHJpbnRmKGZwLCAicmVxaWQgJXUiLCByZXFpZCk7CisJaWYgKHNob3dfc3RhdHMgPiAwKQorCQlmcHJpbnRmKGZwLCAiKDB4JTA4eCkiLCByZXFpZCk7CisJZnByaW50ZihmcCwgIiAiKTsKKworCWZwcmludGYoZnAsICJtb2RlICIpOworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgWEZSTV9NT0RFX1RSQU5TUE9SVDoKKwkJZnByaW50ZihmcCwgInRyYW5zcG9ydCIpOworCQlicmVhazsKKwljYXNlIFhGUk1fTU9ERV9UVU5ORUw6CisJCWZwcmludGYoZnAsICJ0dW5uZWwiKTsKKwkJYnJlYWs7CisJY2FzZSBYRlJNX01PREVfUk9VVEVPUFRJTUlaQVRJT046CisJCWZwcmludGYoZnAsICJybyIpOworCQlicmVhazsKKwljYXNlIFhGUk1fTU9ERV9JTl9UUklHR0VSOgorCQlmcHJpbnRmKGZwLCAiaW5fdHJpZ2dlciIpOworCQlicmVhazsKKwljYXNlIFhGUk1fTU9ERV9CRUVUOgorCQlmcHJpbnRmKGZwLCAiYmVldCIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcHJpbnRmKGZwLCAiJXUiLCBtb2RlKTsKKwkJYnJlYWs7CisJfQorCWZwcmludGYoZnAsICIlcyIsIF9TTF8pOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqc3RyeGZfbGltaXQoX191NjQgbGltaXQpCit7CisJc3RhdGljIGNoYXIgc3RyWzMyXTsKKwlpZiAobGltaXQgPT0gWEZSTV9JTkYpCisJCXN0cmNweShzdHIsICIoSU5GKSIpOworCWVsc2UKKwkJc3ByaW50ZihzdHIsICIlbGx1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgbGltaXQpOworCisJcmV0dXJuIHN0cjsKK30KKwordm9pZCB4ZnJtX3N0YXRzX3ByaW50KHN0cnVjdCB4ZnJtX3N0YXRzICpzLCBGSUxFICpmcCwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWlmIChwcmVmaXgpCisJCWZwdXRzKHByZWZpeCwgZnApOworCWZwcmludGYoZnAsICJzdGF0czolcyIsIF9TTF8pOworCisJaWYgKHByZWZpeCkKKwkJZnB1dHMocHJlZml4LCBmcCk7CisJZnByaW50ZihmcCwgIiAgcmVwbGF5LXdpbmRvdyAldSByZXBsYXkgJXUgZmFpbGVkICV1JXMiLAorCQlzLT5yZXBsYXlfd2luZG93LCBzLT5yZXBsYXksIHMtPmludGVncml0eV9mYWlsZWQsIF9TTF8pOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqc3RyeGZfdGltZShfX3U2NCB0aW1lKQoreworCXN0YXRpYyBjaGFyIHN0clszMl07CisKKwlpZiAodGltZSA9PSAwKQorCQlzdHJjcHkoc3RyLCAiLSIpOworCWVsc2UgeworCQl0aW1lX3QgdDsKKwkJc3RydWN0IHRtICp0cDsKKworCQkvKiBYWFg6IHRyZWF0IHRpbWUgaW4gdGhlIHNhbWUgbWFubmVyIG9mIGtlcm5lbCdzCisJCSAqIG5ldC94ZnJtL3hmcm1fe3VzZXIsc3RhdGV9LmMKKwkJICovCisJCXQgPSAobG9uZyl0aW1lOworCQl0cCA9IGxvY2FsdGltZSgmdCk7CisKKwkJc3RyZnRpbWUoc3RyLCBzaXplb2Yoc3RyKSwgIiVZLSVtLSVkICVUIiwgdHApOworCX0KKworCXJldHVybiBzdHI7Cit9CisKK3ZvaWQgeGZybV9saWZldGltZV9wcmludChzdHJ1Y3QgeGZybV9saWZldGltZV9jZmcgKmNmZywKKwkJCSBzdHJ1Y3QgeGZybV9saWZldGltZV9jdXIgKmN1ciwKKwkJCSBGSUxFICpmcCwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWlmIChjZmcpIHsKKwkJaWYgKHByZWZpeCkKKwkJCWZwdXRzKHByZWZpeCwgZnApOworCQlmcHJpbnRmKGZwLCAibGlmZXRpbWUgY29uZmlnOiVzIixfU0xfKTsKKworCQlpZiAocHJlZml4KQorCQkJZnB1dHMocHJlZml4LCBmcCk7CisJCWZwcmludGYoZnAsICIgIGxpbWl0OiBzb2Z0ICVzKGJ5dGVzKSwiLAorCQkJc3RyeGZfbGltaXQoY2ZnLT5zb2Z0X2J5dGVfbGltaXQpKTsKKwkJZnByaW50ZihmcCwgIiBoYXJkICVzKGJ5dGVzKSVzIiwKKwkJCXN0cnhmX2xpbWl0KGNmZy0+aGFyZF9ieXRlX2xpbWl0KSwgX1NMXyk7CisKKwkJaWYgKHByZWZpeCkKKwkJCWZwdXRzKHByZWZpeCwgZnApOworCQlmcHJpbnRmKGZwLCAiICBsaW1pdDogc29mdCAlcyhwYWNrZXRzKSwiLAorCQkJc3RyeGZfbGltaXQoY2ZnLT5zb2Z0X3BhY2tldF9saW1pdCkpOworCQlmcHJpbnRmKGZwLCAiIGhhcmQgJXMocGFja2V0cyklcyIsCisJCQlzdHJ4Zl9saW1pdChjZmctPmhhcmRfcGFja2V0X2xpbWl0KSwgX1NMXyk7CisKKwkJaWYgKHByZWZpeCkKKwkJCWZwdXRzKHByZWZpeCwgZnApOworCQlmcHJpbnRmKGZwLCAiICBleHBpcmUgYWRkOiBzb2Z0ICVsbHUoc2VjKSwgaGFyZCAlbGx1KHNlYyklcyIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKSBjZmctPnNvZnRfYWRkX2V4cGlyZXNfc2Vjb25kcywKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGNmZy0+aGFyZF9hZGRfZXhwaXJlc19zZWNvbmRzLAorCQkJX1NMXyk7CisKKwkJaWYgKHByZWZpeCkKKwkJCWZwdXRzKHByZWZpeCwgZnApOworCQlmcHJpbnRmKGZwLCAiICBleHBpcmUgdXNlOiBzb2Z0ICVsbHUoc2VjKSwgaGFyZCAlbGx1KHNlYyklcyIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKSBjZmctPnNvZnRfdXNlX2V4cGlyZXNfc2Vjb25kcywKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGNmZy0+aGFyZF91c2VfZXhwaXJlc19zZWNvbmRzLAorCQkJX1NMXyk7CisJfQorCWlmIChjdXIpIHsKKwkJaWYgKHByZWZpeCkKKwkJCWZwdXRzKHByZWZpeCwgZnApOworCQlmcHJpbnRmKGZwLCAibGlmZXRpbWUgY3VycmVudDolcyIsIF9TTF8pOworCisJCWlmIChwcmVmaXgpCisJCQlmcHV0cyhwcmVmaXgsIGZwKTsKKwkJZnByaW50ZihmcCwgIiAgJWxsdShieXRlcyksICVsbHUocGFja2V0cyklcyIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKSBjdXItPmJ5dGVzLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgY3VyLT5wYWNrZXRzLAorCQkJIF9TTF8pOworCisJCWlmIChwcmVmaXgpCisJCQlmcHV0cyhwcmVmaXgsIGZwKTsKKwkJZnByaW50ZihmcCwgIiAgYWRkICVzICIsIHN0cnhmX3RpbWUoY3VyLT5hZGRfdGltZSkpOworCQlmcHJpbnRmKGZwLCAidXNlICVzJXMiLCBzdHJ4Zl90aW1lKGN1ci0+dXNlX3RpbWUpLCBfU0xfKTsKKwl9Cit9CisKK3ZvaWQgeGZybV9zZWxlY3Rvcl9wcmludChzdHJ1Y3QgeGZybV9zZWxlY3RvciAqc2VsLCBfX3UxNiBmYW1pbHksCisJCQkgRklMRSAqZnAsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwljaGFyIGFidWZbMjU2XTsKKwlfX3UxNiBmOworCisJZiA9IHNlbC0+ZmFtaWx5OworCWlmIChmID09IEFGX1VOU1BFQykKKwkJZiA9IGZhbWlseTsKKwlpZiAoZiA9PSBBRl9VTlNQRUMpCisJCWYgPSBwcmVmZXJyZWRfZmFtaWx5OworCisJaWYgKHByZWZpeCkKKwkJZnB1dHMocHJlZml4LCBmcCk7CisKKwltZW1zZXQoYWJ1ZiwgJ1wwJywgc2l6ZW9mKGFidWYpKTsKKwlmcHJpbnRmKGZwLCAic3JjICVzLyV1ICIsCisJCXJ0X2FkZHJfbjJhKGYsIHNpemVvZihzZWwtPnNhZGRyKSwgJnNlbC0+c2FkZHIsCisJCQkgICAgYWJ1Ziwgc2l6ZW9mKGFidWYpKSwKKwkJc2VsLT5wcmVmaXhsZW5fcyk7CisKKwltZW1zZXQoYWJ1ZiwgJ1wwJywgc2l6ZW9mKGFidWYpKTsKKwlmcHJpbnRmKGZwLCAiZHN0ICVzLyV1ICIsCisJCXJ0X2FkZHJfbjJhKGYsIHNpemVvZihzZWwtPmRhZGRyKSwgJnNlbC0+ZGFkZHIsCisJCQkgICAgYWJ1Ziwgc2l6ZW9mKGFidWYpKSwKKwkJc2VsLT5wcmVmaXhsZW5fZCk7CisKKwlpZiAoc2VsLT5wcm90bykKKwkJZnByaW50ZihmcCwgInByb3RvICVzICIsIHN0cnhmX3Byb3RvKHNlbC0+cHJvdG8pKTsKKwlzd2l0Y2ggKHNlbC0+cHJvdG8pIHsKKwljYXNlIElQUFJPVE9fVENQOgorCWNhc2UgSVBQUk9UT19VRFA6CisJY2FzZSBJUFBST1RPX1NDVFA6CisJY2FzZSBJUFBST1RPX0RDQ1A6CisJZGVmYXVsdDogLyogWFhYICovCisJCWlmIChzZWwtPnNwb3J0X21hc2spCisJCQlmcHJpbnRmKGZwLCAic3BvcnQgJXUgIiwgbnRvaHMoc2VsLT5zcG9ydCkpOworCQlpZiAoc2VsLT5kcG9ydF9tYXNrKQorCQkJZnByaW50ZihmcCwgImRwb3J0ICV1ICIsIG50b2hzKHNlbC0+ZHBvcnQpKTsKKwkJYnJlYWs7CisJY2FzZSBJUFBST1RPX0lDTVA6CisJY2FzZSBJUFBST1RPX0lDTVBWNjoKKwkJLyogdHlwZS9jb2RlIGlzIHN0b3JlZCBhdCBzcG9ydC9kcG9ydCBpbiBzZWxlY3RvciAqLworCQlpZiAoc2VsLT5zcG9ydF9tYXNrKQorCQkJZnByaW50ZihmcCwgInR5cGUgJXUgIiwgbnRvaHMoc2VsLT5zcG9ydCkpOworCQlpZiAoc2VsLT5kcG9ydF9tYXNrKQorCQkJZnByaW50ZihmcCwgImNvZGUgJXUgIiwgbnRvaHMoc2VsLT5kcG9ydCkpOworCQlicmVhazsKKwljYXNlIElQUFJPVE9fR1JFOgorCQlpZiAoc2VsLT5zcG9ydF9tYXNrIHx8IHNlbC0+ZHBvcnRfbWFzaykKKwkJCWZwcmludGYoZnAsICJrZXkgJXUgIiwKKwkJCQkoKChfX3UzMiludG9ocyhzZWwtPnNwb3J0KSkgPDwgMTYpICsKKwkJCQludG9ocyhzZWwtPmRwb3J0KSk7CisJCWJyZWFrOworCWNhc2UgSVBQUk9UT19NSDoKKwkJaWYgKHNlbC0+c3BvcnRfbWFzaykKKwkJCWZwcmludGYoZnAsICJ0eXBlICV1ICIsIG50b2hzKHNlbC0+c3BvcnQpKTsKKwkJaWYgKHNlbC0+ZHBvcnRfbWFzaykgeworCQkJaWYgKHNob3dfc3RhdHMgPiAwKQorCQkJCWZwcmludGYoZnAsICIoZHBvcnQpIDB4JS40eCAiLCBzZWwtPmRwb3J0KTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlpZiAoc2VsLT5pZmluZGV4ID4gMCkKKwkJZnByaW50ZihmcCwgImRldiAlcyAiLCBsbF9pbmRleF90b19uYW1lKHNlbC0+aWZpbmRleCkpOworCisJaWYgKHNob3dfc3RhdHMgPiAwKQorCQlmcHJpbnRmKGZwLCAidWlkICV1Iiwgc2VsLT51c2VyKTsKKworCWZwcmludGYoZnAsICIlcyIsIF9TTF8pOworfQorCitzdGF0aWMgdm9pZCBfX3hmcm1fYWxnb19wcmludChzdHJ1Y3QgeGZybV9hbGdvICphbGdvLCBpbnQgdHlwZSwgaW50IGxlbiwKKwkJCSAgICAgIEZJTEUgKmZwLCBjb25zdCBjaGFyICpwcmVmaXgsIGludCBuZXdsaW5lKQoreworCWludCBrZXlsZW47CisJaW50IGk7CisKKwlpZiAocHJlZml4KQorCQlmcHV0cyhwcmVmaXgsIGZwKTsKKworCWZwcmludGYoZnAsICIlcyAiLCBzdHJ4Zl9hbGdvdHlwZSh0eXBlKSk7CisKKwlpZiAobGVuIDwgc2l6ZW9mKCphbGdvKSkgeworCQlmcHJpbnRmKGZwLCAiKEVSUk9SIHRydW5jYXRlZCkiKTsKKwkJZ290byBmaW47CisJfQorCWxlbiAtPSBzaXplb2YoKmFsZ28pOworCisJZnByaW50ZihmcCwgIiVzICIsIGFsZ28tPmFsZ19uYW1lKTsKKworCWtleWxlbiA9IGFsZ28tPmFsZ19rZXlfbGVuIC8gODsKKwlpZiAobGVuIDwga2V5bGVuKSB7CisJCWZwcmludGYoZnAsICIoRVJST1IgdHJ1bmNhdGVkKSIpOworCQlnb3RvIGZpbjsKKwl9CisKKwlpZiAoa2V5bGVuID4gMCkgeworCQlmcHJpbnRmKGZwLCAiMHgiKTsKKwkJZm9yIChpID0gMDsgaSA8IGtleWxlbjsgaSArKykKKwkJCWZwcmludGYoZnAsICIlLjJ4IiwgKHVuc2lnbmVkIGNoYXIpYWxnby0+YWxnX2tleVtpXSk7CisKKwkJaWYgKHNob3dfc3RhdHMgPiAwKQorCQkJZnByaW50ZihmcCwgIiAoJWQgYml0cykiLCBhbGdvLT5hbGdfa2V5X2xlbik7CisJfQorCisgZmluOgorCWlmIChuZXdsaW5lKQorCQlmcHJpbnRmKGZwLCAiJXMiLCBfU0xfKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHhmcm1fYWxnb19wcmludChzdHJ1Y3QgeGZybV9hbGdvICphbGdvLCBpbnQgdHlwZSwgaW50IGxlbiwKKwkJCQkgICBGSUxFICpmcCwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXJldHVybiBfX3hmcm1fYWxnb19wcmludChhbGdvLCB0eXBlLCBsZW4sIGZwLCBwcmVmaXgsIDEpOworfQorCitzdGF0aWMgdm9pZCB4ZnJtX2FlYWRfcHJpbnQoc3RydWN0IHhmcm1fYWxnb19hZWFkICphbGdvLCBpbnQgbGVuLAorCQkJICAgIEZJTEUgKmZwLCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3RydWN0IHhmcm1fYWxnbyAqYmFzZV9hbGdvID0gYWxsb2NhKHNpemVvZigqYmFzZV9hbGdvKSArIGFsZ28tPmFsZ19rZXlfbGVuIC8gOCk7CisKKwltZW1jcHkoYmFzZV9hbGdvLT5hbGdfbmFtZSwgYWxnby0+YWxnX25hbWUsIHNpemVvZihiYXNlX2FsZ28tPmFsZ19uYW1lKSk7CisJYmFzZV9hbGdvLT5hbGdfa2V5X2xlbiA9IGFsZ28tPmFsZ19rZXlfbGVuOworCW1lbWNweShiYXNlX2FsZ28tPmFsZ19rZXksIGFsZ28tPmFsZ19rZXksIGFsZ28tPmFsZ19rZXlfbGVuIC8gOCk7CisKKwlfX3hmcm1fYWxnb19wcmludChiYXNlX2FsZ28sIFhGUk1BX0FMR19BRUFELCBsZW4sIGZwLCBwcmVmaXgsIDApOworCisJZnByaW50ZihmcCwgIiAlZCIsIGFsZ28tPmFsZ19pY3ZfbGVuKTsKKworCWZwcmludGYoZnAsICIlcyIsIF9TTF8pOworfQorCitzdGF0aWMgdm9pZCB4ZnJtX2F1dGhfdHJ1bmNfcHJpbnQoc3RydWN0IHhmcm1fYWxnb19hdXRoICphbGdvLCBpbnQgbGVuLAorCQkJCSAgRklMRSAqZnAsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJ1Y3QgeGZybV9hbGdvICpiYXNlX2FsZ28gPSBhbGxvY2Eoc2l6ZW9mKCpiYXNlX2FsZ28pICsgYWxnby0+YWxnX2tleV9sZW4gLyA4KTsKKworCW1lbWNweShiYXNlX2FsZ28tPmFsZ19uYW1lLCBhbGdvLT5hbGdfbmFtZSwgc2l6ZW9mKGJhc2VfYWxnby0+YWxnX25hbWUpKTsKKwliYXNlX2FsZ28tPmFsZ19rZXlfbGVuID0gYWxnby0+YWxnX2tleV9sZW47CisJbWVtY3B5KGJhc2VfYWxnby0+YWxnX2tleSwgYWxnby0+YWxnX2tleSwgYWxnby0+YWxnX2tleV9sZW4gLyA4KTsKKworCV9feGZybV9hbGdvX3ByaW50KGJhc2VfYWxnbywgWEZSTUFfQUxHX0FVVEhfVFJVTkMsIGxlbiwgZnAsIHByZWZpeCwgMCk7CisKKwlmcHJpbnRmKGZwLCAiICVkIiwgYWxnby0+YWxnX3RydW5jX2xlbik7CisKKwlmcHJpbnRmKGZwLCAiJXMiLCBfU0xfKTsKK30KKworc3RhdGljIHZvaWQgeGZybV90bXBsX3ByaW50KHN0cnVjdCB4ZnJtX3VzZXJfdG1wbCAqdG1wbHMsIGludCBsZW4sCisJCQkgICAgRklMRSAqZnAsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgbnRtcGxzID0gbGVuIC8gc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJfdG1wbCk7CisJaW50IGk7CisKKwlpZiAobnRtcGxzIDw9IDApIHsKKwkJaWYgKHByZWZpeCkKKwkJCWZwdXRzKHByZWZpeCwgZnApOworCQlmcHJpbnRmKGZwLCAiKEVSUk9SIFwidG1wbFwiIHRydW5jYXRlZCkiKTsKKwkJZnByaW50ZihmcCwgIiVzIiwgX1NMXyk7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnRtcGxzOyBpKyspIHsKKwkJc3RydWN0IHhmcm1fdXNlcl90bXBsICp0bXBsID0gJnRtcGxzW2ldOworCisJCWlmIChwcmVmaXgpCisJCQlmcHV0cyhwcmVmaXgsIGZwKTsKKworCQl4ZnJtX2lkX2luZm9fcHJpbnQoJnRtcGwtPnNhZGRyLCAmdG1wbC0+aWQsIHRtcGwtPm1vZGUsCisJCQkJICAgdG1wbC0+cmVxaWQsIHRtcGwtPmZhbWlseSwgMCwgZnAsIHByZWZpeCwgInRtcGwgIik7CisKKwkJaWYgKHNob3dfc3RhdHMgPiAwIHx8IHRtcGwtPm9wdGlvbmFsKSB7CisJCQlpZiAocHJlZml4KQorCQkJCWZwdXRzKHByZWZpeCwgZnApOworCQkJZnByaW50ZihmcCwgIlx0Iik7CisJCQlzd2l0Y2ggKHRtcGwtPm9wdGlvbmFsKSB7CisJCQljYXNlIDA6CisJCQkJaWYgKHNob3dfc3RhdHMgPiAwKQorCQkJCQlmcHJpbnRmKGZwLCAibGV2ZWwgcmVxdWlyZWQgIik7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJZnByaW50ZihmcCwgImxldmVsIHVzZSAiKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZnByaW50ZihmcCwgImxldmVsICV1ICIsIHRtcGwtPm9wdGlvbmFsKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKHNob3dfc3RhdHMgPiAwKQorCQkJCWZwcmludGYoZnAsICJzaGFyZSAlcyAiLCBzdHJ4Zl9zaGFyZSh0bXBsLT5zaGFyZSkpOworCisJCQlmcHJpbnRmKGZwLCAiJXMiLCBfU0xfKTsKKwkJfQorCisJCWlmIChzaG93X3N0YXRzID4gMCkgeworCQkJaWYgKHByZWZpeCkKKwkJCQlmcHV0cyhwcmVmaXgsIGZwKTsKKwkJCWZwcmludGYoZnAsICJcdCIpOworCQkJZnByaW50ZihmcCwgIiVzLW1hc2sgJXMgIiwKKwkJCQlzdHJ4Zl9hbGdvdHlwZShYRlJNQV9BTEdfQ1JZUFQpLAorCQkJCXN0cnhmX21hc2szMih0bXBsLT5lYWxnb3MpKTsKKwkJCWZwcmludGYoZnAsICIlcy1tYXNrICVzICIsCisJCQkJc3RyeGZfYWxnb3R5cGUoWEZSTUFfQUxHX0FVVEgpLAorCQkJCXN0cnhmX21hc2szMih0bXBsLT5hYWxnb3MpKTsKKwkJCWZwcmludGYoZnAsICIlcy1tYXNrICVzIiwKKwkJCQlzdHJ4Zl9hbGdvdHlwZShYRlJNQV9BTEdfQ09NUCksCisJCQkJc3RyeGZfbWFzazMyKHRtcGwtPmNhbGdvcykpOworCisJCQlmcHJpbnRmKGZwLCAiJXMiLCBfU0xfKTsKKwkJfQorCX0KK30KKworaW50IHhmcm1fcGFyc2VfbWFyayhzdHJ1Y3QgeGZybV9tYXJrICptYXJrLCBpbnQgKmFyZ2NwLCBjaGFyICoqKmFyZ3ZwKQoreworCWludCBhcmdjID0gKmFyZ2NwOworCWNoYXIgKiphcmd2ID0gKmFyZ3ZwOworCisJTkVYVF9BUkcoKTsKKwlpZiAoZ2V0X3UzMigmbWFyay0+diwgKmFyZ3YsIDApKSB7CisJCWludmFyZygiTUFSSyB2YWx1ZSBpcyBpbnZhbGlkXG4iLCAqYXJndik7CisJfQorCWlmIChhcmdjID4gMSkKKwkJTkVYVF9BUkcoKTsKKwllbHNlIHsgLyogbGFzdCBlbnRyeSBvbiBwYXJzZSBsaW5lICovCisJCW1hcmstPm0gPSAweGZmZmZmZmZmOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHN0cmNtcCgqYXJndiwgIm1hc2siKSA9PSAwKSB7CisJCU5FWFRfQVJHKCk7CisJCWlmIChnZXRfdTMyKCZtYXJrLT5tLCAqYXJndiwgMCkpIHsKKwkJCWludmFyZygiTUFTSyB2YWx1ZSBpcyBpbnZhbGlkXG4iLCAqYXJndik7CisJCX0KKwl9IGVsc2UgeworCQltYXJrLT5tID0gMHhmZmZmZmZmZjsKKwkJUFJFVl9BUkcoKTsKKwl9CisKK2RvbmU6CisJKmFyZ2NwID0gYXJnYzsKKwkqYXJndnAgPSBhcmd2OworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgeGZybV94ZnJtYV9wcmludChzdHJ1Y3QgcnRhdHRyICp0YltdLCBfX3UxNiBmYW1pbHksCisJCSAgICAgIEZJTEUgKmZwLCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaWYgKHRiW1hGUk1BX01BUktdKSB7CisJCXN0cnVjdCBydGF0dHIgKnJ0YSA9IHRiW1hGUk1BX01BUktdOworCQlzdHJ1Y3QgeGZybV9tYXJrICptID0gKHN0cnVjdCB4ZnJtX21hcmsgKikgUlRBX0RBVEEocnRhKTsKKwkJZnByaW50ZihmcCwgIlx0bWFyayAlI3gvJSN4IiwgbS0+diwgbS0+bSk7CisJCWZwcmludGYoZnAsICIlcyIsIF9TTF8pOworCX0KKworCWlmICh0YltYRlJNQV9BTEdfQVVUSF0gJiYgIXRiW1hGUk1BX0FMR19BVVRIX1RSVU5DXSkgeworCQlzdHJ1Y3QgcnRhdHRyICpydGEgPSB0YltYRlJNQV9BTEdfQVVUSF07CisJCXhmcm1fYWxnb19wcmludCgoc3RydWN0IHhmcm1fYWxnbyAqKSBSVEFfREFUQShydGEpLAorCQkJCVhGUk1BX0FMR19BVVRILCBSVEFfUEFZTE9BRChydGEpLCBmcCwgcHJlZml4KTsKKwl9CisKKwlpZiAodGJbWEZSTUFfQUxHX0FVVEhfVFJVTkNdKSB7CisJCXN0cnVjdCBydGF0dHIgKnJ0YSA9IHRiW1hGUk1BX0FMR19BVVRIX1RSVU5DXTsKKwkJeGZybV9hdXRoX3RydW5jX3ByaW50KChzdHJ1Y3QgeGZybV9hbGdvX2F1dGggKikgUlRBX0RBVEEocnRhKSwKKwkJCQkgICAgICBSVEFfUEFZTE9BRChydGEpLCBmcCwgcHJlZml4KTsKKwl9CisKKwlpZiAodGJbWEZSTUFfQUxHX0FFQURdKSB7CisJCXN0cnVjdCBydGF0dHIgKnJ0YSA9IHRiW1hGUk1BX0FMR19BRUFEXTsKKwkJeGZybV9hZWFkX3ByaW50KChzdHJ1Y3QgeGZybV9hbGdvX2FlYWQgKilSVEFfREFUQShydGEpLAorCQkJCVJUQV9QQVlMT0FEKHJ0YSksIGZwLCBwcmVmaXgpOworCX0KKworCWlmICh0YltYRlJNQV9BTEdfQ1JZUFRdKSB7CisJCXN0cnVjdCBydGF0dHIgKnJ0YSA9IHRiW1hGUk1BX0FMR19DUllQVF07CisJCXhmcm1fYWxnb19wcmludCgoc3RydWN0IHhmcm1fYWxnbyAqKSBSVEFfREFUQShydGEpLAorCQkJCVhGUk1BX0FMR19DUllQVCwgUlRBX1BBWUxPQUQocnRhKSwgZnAsIHByZWZpeCk7CisJfQorCisJaWYgKHRiW1hGUk1BX0FMR19DT01QXSkgeworCQlzdHJ1Y3QgcnRhdHRyICpydGEgPSB0YltYRlJNQV9BTEdfQ09NUF07CisJCXhmcm1fYWxnb19wcmludCgoc3RydWN0IHhmcm1fYWxnbyAqKSBSVEFfREFUQShydGEpLAorCQkJCVhGUk1BX0FMR19DT01QLCBSVEFfUEFZTE9BRChydGEpLCBmcCwgcHJlZml4KTsKKwl9CisKKwlpZiAodGJbWEZSTUFfRU5DQVBdKSB7CisJCXN0cnVjdCB4ZnJtX2VuY2FwX3RtcGwgKmU7CisJCWNoYXIgYWJ1ZlsyNTZdOworCisJCWlmIChwcmVmaXgpCisJCQlmcHV0cyhwcmVmaXgsIGZwKTsKKwkJZnByaW50ZihmcCwgImVuY2FwICIpOworCisJCWlmIChSVEFfUEFZTE9BRCh0YltYRlJNQV9FTkNBUF0pIDwgc2l6ZW9mKCplKSkgeworCQkJZnByaW50ZihmcCwgIihFUlJPUiB0cnVuY2F0ZWQpIik7CisJCQlmcHJpbnRmKGZwLCAiJXMiLCBfU0xfKTsKKwkJCXJldHVybjsKKwkJfQorCQllID0gKHN0cnVjdCB4ZnJtX2VuY2FwX3RtcGwgKikgUlRBX0RBVEEodGJbWEZSTUFfRU5DQVBdKTsKKworCQlmcHJpbnRmKGZwLCAidHlwZSAiKTsKKwkJc3dpdGNoIChlLT5lbmNhcF90eXBlKSB7CisJCWNhc2UgMToKKwkJCWZwcmludGYoZnAsICJlc3BpbnVkcC1ub25pa2UgIik7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJZnByaW50ZihmcCwgImVzcGludWRwICIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKGZwLCAiJXUgIiwgZS0+ZW5jYXBfdHlwZSk7CisJCQlicmVhazsKKwkJfQorCQlmcHJpbnRmKGZwLCAic3BvcnQgJXUgIiwgbnRvaHMoZS0+ZW5jYXBfc3BvcnQpKTsKKwkJZnByaW50ZihmcCwgImRwb3J0ICV1ICIsIG50b2hzKGUtPmVuY2FwX2Rwb3J0KSk7CisKKwkJbWVtc2V0KGFidWYsICdcMCcsIHNpemVvZihhYnVmKSk7CisJCWZwcmludGYoZnAsICJhZGRyICVzIiwKKwkJCXJ0X2FkZHJfbjJhKGZhbWlseSwgc2l6ZW9mKGUtPmVuY2FwX29hKSwgJmUtPmVuY2FwX29hLAorCQkJCSAgICBhYnVmLCBzaXplb2YoYWJ1ZikpKTsKKwkJZnByaW50ZihmcCwgIiVzIiwgX1NMXyk7CisJfQorCisJaWYgKHRiW1hGUk1BX1RNUExdKSB7CisJCXN0cnVjdCBydGF0dHIgKnJ0YSA9IHRiW1hGUk1BX1RNUExdOworCQl4ZnJtX3RtcGxfcHJpbnQoKHN0cnVjdCB4ZnJtX3VzZXJfdG1wbCAqKSBSVEFfREFUQShydGEpLAorCQkJCVJUQV9QQVlMT0FEKHJ0YSksIGZwLCBwcmVmaXgpOworCX0KKworCWlmICh0YltYRlJNQV9DT0FERFJdKSB7CisJCWNoYXIgYWJ1ZlsyNTZdOworCQl4ZnJtX2FkZHJlc3NfdCAqY29hOworCisJCWlmIChwcmVmaXgpCisJCQlmcHV0cyhwcmVmaXgsIGZwKTsKKwkJZnByaW50ZihmcCwgImNvYSAiKTsKKworCQljb2EgPSAoeGZybV9hZGRyZXNzX3QgKilSVEFfREFUQSh0YltYRlJNQV9DT0FERFJdKTsKKworCQlpZiAoUlRBX1BBWUxPQUQodGJbWEZSTUFfQ09BRERSXSkgPCBzaXplb2YoKmNvYSkpIHsKKwkJCWZwcmludGYoZnAsICIoRVJST1IgdHJ1bmNhdGVkKSIpOworCQkJZnByaW50ZihmcCwgIiVzIiwgX1NMXyk7CisJCQlyZXR1cm47CisJCX0KKworCQltZW1zZXQoYWJ1ZiwgJ1wwJywgc2l6ZW9mKGFidWYpKTsKKwkJZnByaW50ZihmcCwgIiVzIiwKKwkJCXJ0X2FkZHJfbjJhKGZhbWlseSwgc2l6ZW9mKCpjb2EpLCBjb2EsCisJCQkJICAgIGFidWYsIHNpemVvZihhYnVmKSkpOworCQlmcHJpbnRmKGZwLCAiJXMiLCBfU0xfKTsKKwl9CisKKwlpZiAodGJbWEZSTUFfTEFTVFVTRURdKSB7CisJCV9fdTY0IGxhc3R1c2VkOworCisJCWlmIChwcmVmaXgpCisJCQlmcHV0cyhwcmVmaXgsIGZwKTsKKwkJZnByaW50ZihmcCwgImxhc3R1c2VkICIpOworCisJCWlmIChSVEFfUEFZTE9BRCh0YltYRlJNQV9MQVNUVVNFRF0pIDwgc2l6ZW9mKGxhc3R1c2VkKSkgeworCQkJZnByaW50ZihmcCwgIihFUlJPUiB0cnVuY2F0ZWQpIik7CisJCQlmcHJpbnRmKGZwLCAiJXMiLCBfU0xfKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWxhc3R1c2VkID0gcnRhX2dldGF0dHJfdTY0KHRiW1hGUk1BX0xBU1RVU0VEXSk7CisKKwkJZnByaW50ZihmcCwgIiVzIiwgc3RyeGZfdGltZShsYXN0dXNlZCkpOworCQlmcHJpbnRmKGZwLCAiJXMiLCBfU0xfKTsKKwl9CisKKwlpZiAodGJbWEZSTUFfUkVQTEFZX1ZBTF0pIHsKKwkJc3RydWN0IHhmcm1fcmVwbGF5X3N0YXRlICpyZXBsYXk7CisKKwkJaWYgKHByZWZpeCkKKwkJCWZwdXRzKHByZWZpeCwgZnApOworCQlmcHJpbnRmKGZwLCAiYW50aS1yZXBsYXkgY29udGV4dDogIik7CisKKwkJaWYgKFJUQV9QQVlMT0FEKHRiW1hGUk1BX1JFUExBWV9WQUxdKSA8IHNpemVvZigqcmVwbGF5KSkgeworCQkJZnByaW50ZihmcCwgIihFUlJPUiB0cnVuY2F0ZWQpIik7CisJCQlmcHJpbnRmKGZwLCAiJXMiLCBfU0xfKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXJlcGxheSA9IChzdHJ1Y3QgeGZybV9yZXBsYXlfc3RhdGUgKilSVEFfREFUQSh0YltYRlJNQV9SRVBMQVlfVkFMXSk7CisJCWZwcmludGYoZnAsICJzZXEgMHgleCwgb3NlcSAweCV4LCBiaXRtYXAgMHglMDh4IiwKKwkJCXJlcGxheS0+c2VxLCByZXBsYXktPm9zZXEsIHJlcGxheS0+Yml0bWFwKTsKKwkJZnByaW50ZihmcCwgIiVzIiwgX1NMXyk7CisJfQorCisJaWYgKHRiW1hGUk1BX1JFUExBWV9FU05fVkFMXSkgeworCQlzdHJ1Y3QgeGZybV9yZXBsYXlfc3RhdGVfZXNuICpyZXBsYXk7CisJCXVuc2lnbmVkIGludCBpLCBqOworCisJCWlmIChwcmVmaXgpCisJCQlmcHV0cyhwcmVmaXgsIGZwKTsKKwkJZnByaW50ZihmcCwgImFudGktcmVwbGF5IGVzbiBjb250ZXh0OiIpOworCisJCWlmIChSVEFfUEFZTE9BRCh0YltYRlJNQV9SRVBMQVlfRVNOX1ZBTF0pIDwgc2l6ZW9mKCpyZXBsYXkpKSB7CisJCQlmcHJpbnRmKGZwLCAiKEVSUk9SIHRydW5jYXRlZCkiKTsKKwkJCWZwcmludGYoZnAsICIlcyIsIF9TTF8pOworCQkJcmV0dXJuOworCQl9CisJCWZwcmludGYoZnAsICIlcyIsIF9TTF8pOworCisJCXJlcGxheSA9IChzdHJ1Y3QgeGZybV9yZXBsYXlfc3RhdGVfZXNuICopUlRBX0RBVEEodGJbWEZSTUFfUkVQTEFZX0VTTl9WQUxdKTsKKwkJaWYgKHByZWZpeCkKKwkJCWZwdXRzKHByZWZpeCwgZnApOworCQlmcHJpbnRmKGZwLCAiIHNlcS1oaSAweCV4LCBzZXEgMHgleCwgb3NlcS1oaSAweCUweCwgb3NlcSAweCUweCIsCisJCQlyZXBsYXktPnNlcV9oaSwgcmVwbGF5LT5zZXEsIHJlcGxheS0+b3NlcV9oaSwKKwkJCXJlcGxheS0+b3NlcSk7CisJCWZwcmludGYoZnAsICIlcyIsIF9TTF8pOworCQlpZiAocHJlZml4KQorCQkJZnB1dHMocHJlZml4LCBmcCk7CisJCWZwcmludGYoZnAsICIgcmVwbGF5X3dpbmRvdyAldSwgYml0bWFwLWxlbmd0aCAldSIsCisJCQlyZXBsYXktPnJlcGxheV93aW5kb3csIHJlcGxheS0+Ym1wX2xlbik7CisJCWZvciAoaSA9IHJlcGxheS0+Ym1wX2xlbiwgaiA9IDA7IGk7IGktLSkgeworCQkJaWYgKGorKyAlIDggPT0gMCkgeworCQkJCWZwcmludGYoZnAsICIlcyIsIF9TTF8pOworCQkJCWlmIChwcmVmaXgpCisJCQkJCWZwdXRzKHByZWZpeCwgZnApOworCQkJCWZwcmludGYoZnAsICIgIik7CisJCQl9CisJCQlmcHJpbnRmKGZwLCAiJTA4eCAiLCByZXBsYXktPmJtcFtpIC0gMV0pOworCQl9CisJCWZwcmludGYoZnAsICIlcyIsIF9TTF8pOworCX0KK30KKworc3RhdGljIGludCB4ZnJtX3NlbGVjdG9yX2lzemVybyhzdHJ1Y3QgeGZybV9zZWxlY3RvciAqcykKK3sKKwlzdHJ1Y3QgeGZybV9zZWxlY3RvciBzMDsKKworCW1lbXNldCgmczAsIDAsIHNpemVvZihzMCkpOworCisJcmV0dXJuIChtZW1jbXAoJnMwLCBzLCBzaXplb2YoczApKSA9PSAwKTsKK30KKwordm9pZCB4ZnJtX3N0YXRlX2luZm9fcHJpbnQoc3RydWN0IHhmcm1fdXNlcnNhX2luZm8gKnhzaW5mbywKKwkJCSAgICBzdHJ1Y3QgcnRhdHRyICp0YltdLCBGSUxFICpmcCwgY29uc3QgY2hhciAqcHJlZml4LAorCQkJICAgIGNvbnN0IGNoYXIgKnRpdGxlKQoreworCWNoYXIgYnVmW1NUUkJVRl9TSVpFXTsKKwlpbnQgZm9yY2Vfc3BpID0geGZybV94ZnJtcHJvdG9faXNfaXBzZWMoeHNpbmZvLT5pZC5wcm90byk7CisKKwltZW1zZXQoYnVmLCAnXDAnLCBzaXplb2YoYnVmKSk7CisKKwl4ZnJtX2lkX2luZm9fcHJpbnQoJnhzaW5mby0+c2FkZHIsICZ4c2luZm8tPmlkLCB4c2luZm8tPm1vZGUsCisJCQkgICB4c2luZm8tPnJlcWlkLCB4c2luZm8tPmZhbWlseSwgZm9yY2Vfc3BpLCBmcCwKKwkJCSAgIHByZWZpeCwgdGl0bGUpOworCisJaWYgKHByZWZpeCkKKwkJU1RSQlVGX0NBVChidWYsIHByZWZpeCk7CisJU1RSQlVGX0NBVChidWYsICJcdCIpOworCisJZnB1dHMoYnVmLCBmcCk7CisJZnByaW50ZihmcCwgInJlcGxheS13aW5kb3cgJXUgIiwgeHNpbmZvLT5yZXBsYXlfd2luZG93KTsKKwlpZiAoc2hvd19zdGF0cyA+IDApCisJCWZwcmludGYoZnAsICJzZXEgMHglMDh1ICIsIHhzaW5mby0+c2VxKTsKKwlpZiAoc2hvd19zdGF0cyA+IDAgfHwgeHNpbmZvLT5mbGFncykgeworCQlfX3U4IGZsYWdzID0geHNpbmZvLT5mbGFnczsKKworCQlmcHJpbnRmKGZwLCAiZmxhZyAiKTsKKwkJWEZSTV9GTEFHX1BSSU5UKGZwLCBmbGFncywgWEZSTV9TVEFURV9OT0VDTiwgIm5vZWNuIik7CisJCVhGUk1fRkxBR19QUklOVChmcCwgZmxhZ3MsIFhGUk1fU1RBVEVfREVDQVBfRFNDUCwgImRlY2FwLWRzY3AiKTsKKwkJWEZSTV9GTEFHX1BSSU5UKGZwLCBmbGFncywgWEZSTV9TVEFURV9OT1BNVFVESVNDLCAibm9wbXR1ZGlzYyIpOworCQlYRlJNX0ZMQUdfUFJJTlQoZnAsIGZsYWdzLCBYRlJNX1NUQVRFX1dJTERSRUNWLCAid2lsZHJlY3YiKTsKKwkJWEZSTV9GTEFHX1BSSU5UKGZwLCBmbGFncywgWEZSTV9TVEFURV9JQ01QLCAiaWNtcCIpOworCQlYRlJNX0ZMQUdfUFJJTlQoZnAsIGZsYWdzLCBYRlJNX1NUQVRFX0FGX1VOU1BFQywgImFmLXVuc3BlYyIpOworCQlYRlJNX0ZMQUdfUFJJTlQoZnAsIGZsYWdzLCBYRlJNX1NUQVRFX0FMSUdONCwgImFsaWduNCIpOworCQlYRlJNX0ZMQUdfUFJJTlQoZnAsIGZsYWdzLCBYRlJNX1NUQVRFX0VTTiwgImVzbiIpOworCQlpZiAoZmxhZ3MpCisJCQlmcHJpbnRmKGZwLCAiJXgiLCBmbGFncyk7CisJfQorCWlmIChzaG93X3N0YXRzID4gMCAmJiB0YltYRlJNQV9TQV9FWFRSQV9GTEFHU10pIHsKKwkJX191MzIgZXh0cmFfZmxhZ3MgPSAqKF9fdTMyICopUlRBX0RBVEEodGJbWEZSTUFfU0FfRVhUUkFfRkxBR1NdKTsKKworCQlmcHJpbnRmKGZwLCAiZXh0cmFfZmxhZyAiKTsKKwkJWEZSTV9GTEFHX1BSSU5UKGZwLCBleHRyYV9mbGFncywKKwkJCQlYRlJNX1NBX1hGTEFHX0RPTlRfRU5DQVBfRFNDUCwKKwkJCQkiZG9udC1lbmNhcC1kc2NwIik7CisJCWlmIChleHRyYV9mbGFncykKKwkJCWZwcmludGYoZnAsICIleCIsIGV4dHJhX2ZsYWdzKTsKKwl9CisJaWYgKHNob3dfc3RhdHMgPiAwKQorCQlmcHJpbnRmKGZwLCAiICgweCVzKSIsIHN0cnhmX21hc2s4KHhzaW5mby0+ZmxhZ3MpKTsKKwlmcHJpbnRmKGZwLCAiJXMiLCBfU0xfKTsKKworCXhmcm1feGZybWFfcHJpbnQodGIsIHhzaW5mby0+ZmFtaWx5LCBmcCwgYnVmKTsKKworCWlmICgheGZybV9zZWxlY3Rvcl9pc3plcm8oJnhzaW5mby0+c2VsKSkgeworCQljaGFyIHNidWZbU1RSQlVGX1NJWkVdOworCisJCW1lbWNweShzYnVmLCBidWYsIHNpemVvZihzYnVmKSk7CisJCVNUUkJVRl9DQVQoc2J1ZiwgInNlbCAiKTsKKworCQl4ZnJtX3NlbGVjdG9yX3ByaW50KCZ4c2luZm8tPnNlbCwgeHNpbmZvLT5mYW1pbHksIGZwLCBzYnVmKTsKKwl9CisKKwlpZiAoc2hvd19zdGF0cyA+IDApIHsKKwkJeGZybV9saWZldGltZV9wcmludCgmeHNpbmZvLT5sZnQsICZ4c2luZm8tPmN1cmxmdCwgZnAsIGJ1Zik7CisJCXhmcm1fc3RhdHNfcHJpbnQoJnhzaW5mby0+c3RhdHMsIGZwLCBidWYpOworCX0KKworCWlmICh0YltYRlJNQV9TRUNfQ1RYXSkgeworCQlzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggKnNjdHg7CisKKwkJZnByaW50ZihmcCwgIlx0c2VjdXJpdHkgY29udGV4dCAiKTsKKworCQlpZiAoUlRBX1BBWUxPQUQodGJbWEZSTUFfU0VDX0NUWF0pIDwgc2l6ZW9mKCpzY3R4KSkKKwkJCWZwcmludGYoZnAsICIoRVJST1IgdHJ1bmNhdGVkKSIpOworCisJCXNjdHggPSAoc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICopUlRBX0RBVEEodGJbWEZSTUFfU0VDX0NUWF0pOworCisJCWZwcmludGYoZnAsICIlcyAlcyIsIChjaGFyICopKHNjdHggKyAxKSwgX1NMXyk7CisJfQorCit9CisKK3ZvaWQgeGZybV9wb2xpY3lfaW5mb19wcmludChzdHJ1Y3QgeGZybV91c2VycG9saWN5X2luZm8gKnhwaW5mbywKKwkJCSAgICBzdHJ1Y3QgcnRhdHRyICp0YltdLCBGSUxFICpmcCwgY29uc3QgY2hhciAqcHJlZml4LAorCQkJICAgIGNvbnN0IGNoYXIgKnRpdGxlKQoreworCWNoYXIgYnVmW1NUUkJVRl9TSVpFXTsKKworCW1lbXNldChidWYsICdcMCcsIHNpemVvZihidWYpKTsKKworCXhmcm1fc2VsZWN0b3JfcHJpbnQoJnhwaW5mby0+c2VsLCBwcmVmZXJyZWRfZmFtaWx5LCBmcCwgdGl0bGUpOworCisJaWYgKHRiW1hGUk1BX1NFQ19DVFhdKSB7CisJCXN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqc2N0eDsKKworCQlmcHJpbnRmKGZwLCAiXHRzZWN1cml0eSBjb250ZXh0ICIpOworCisJCWlmIChSVEFfUEFZTE9BRCh0YltYRlJNQV9TRUNfQ1RYXSkgPCBzaXplb2YoKnNjdHgpKQorCQkJZnByaW50ZihmcCwgIihFUlJPUiB0cnVuY2F0ZWQpIik7CisKKwkJc2N0eCA9IChzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggKilSVEFfREFUQSh0YltYRlJNQV9TRUNfQ1RYXSk7CisKKwkJZnByaW50ZihmcCwgIiVzICIsIChjaGFyICopKHNjdHggKyAxKSk7CisJCWZwcmludGYoZnAsICIlcyIsIF9TTF8pOworCX0KKworCWlmIChwcmVmaXgpCisJCVNUUkJVRl9DQVQoYnVmLCBwcmVmaXgpOworCVNUUkJVRl9DQVQoYnVmLCAiXHQiKTsKKworCWZwdXRzKGJ1ZiwgZnApOworCWlmICh4cGluZm8tPmRpciA+PSBYRlJNX1BPTElDWV9NQVgpIHsKKwkJeHBpbmZvLT5kaXIgLT0gWEZSTV9QT0xJQ1lfTUFYOworCQlmcHJpbnRmKGZwLCAic29ja2V0ICIpOworCX0gZWxzZQorCQlmcHJpbnRmKGZwLCAiZGlyICIpOworCisJc3dpdGNoICh4cGluZm8tPmRpcikgeworCWNhc2UgWEZSTV9QT0xJQ1lfSU46CisJCWZwcmludGYoZnAsICJpbiIpOworCQlicmVhazsKKwljYXNlIFhGUk1fUE9MSUNZX09VVDoKKwkJZnByaW50ZihmcCwgIm91dCIpOworCQlicmVhazsKKwljYXNlIFhGUk1fUE9MSUNZX0ZXRDoKKwkJZnByaW50ZihmcCwgImZ3ZCIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcHJpbnRmKGZwLCAiJXUiLCB4cGluZm8tPmRpcik7CisJCWJyZWFrOworCX0KKwlmcHJpbnRmKGZwLCAiICIpOworCisJc3dpdGNoICh4cGluZm8tPmFjdGlvbikgeworCWNhc2UgWEZSTV9QT0xJQ1lfQUxMT1c6CisJCWlmIChzaG93X3N0YXRzID4gMCkKKwkJCWZwcmludGYoZnAsICJhY3Rpb24gYWxsb3cgIik7CisJCWJyZWFrOworCWNhc2UgWEZSTV9QT0xJQ1lfQkxPQ0s6CisJCWZwcmludGYoZnAsICJhY3Rpb24gYmxvY2sgIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZwcmludGYoZnAsICJhY3Rpb24gJXUgIiwgeHBpbmZvLT5hY3Rpb24pOworCQlicmVhazsKKwl9CisKKwlpZiAoc2hvd19zdGF0cykKKwkJZnByaW50ZihmcCwgImluZGV4ICV1ICIsIHhwaW5mby0+aW5kZXgpOworCWZwcmludGYoZnAsICJwcmlvcml0eSAldSAiLCB4cGluZm8tPnByaW9yaXR5KTsKKworCWlmICh0YltYRlJNQV9QT0xJQ1lfVFlQRV0pIHsKKwkJc3RydWN0IHhmcm1fdXNlcnBvbGljeV90eXBlICp1cHQ7CisKKwkJZnByaW50ZihmcCwgInB0eXBlICIpOworCisJCWlmIChSVEFfUEFZTE9BRCh0YltYRlJNQV9QT0xJQ1lfVFlQRV0pIDwgc2l6ZW9mKCp1cHQpKQorCQkJZnByaW50ZihmcCwgIihFUlJPUiB0cnVuY2F0ZWQpIik7CisKKwkJdXB0ID0gKHN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfdHlwZSAqKVJUQV9EQVRBKHRiW1hGUk1BX1BPTElDWV9UWVBFXSk7CisJCWZwcmludGYoZnAsICIlcyAiLCBzdHJ4Zl9wdHlwZSh1cHQtPnR5cGUpKTsKKwl9CisKKwlpZiAoc2hvd19zdGF0cyA+IDApCisJCWZwcmludGYoZnAsICJzaGFyZSAlcyAiLCBzdHJ4Zl9zaGFyZSh4cGluZm8tPnNoYXJlKSk7CisKKwlpZiAoc2hvd19zdGF0cyA+IDAgfHwgeHBpbmZvLT5mbGFncykgeworCQlfX3U4IGZsYWdzID0geHBpbmZvLT5mbGFnczsKKworCQlmcHJpbnRmKGZwLCAiZmxhZyAiKTsKKwkJWEZSTV9GTEFHX1BSSU5UKGZwLCBmbGFncywgWEZSTV9QT0xJQ1lfTE9DQUxPSywgImxvY2Fsb2siKTsKKwkJWEZSTV9GTEFHX1BSSU5UKGZwLCBmbGFncywgWEZSTV9QT0xJQ1lfSUNNUCwgImljbXAiKTsKKwkJaWYgKGZsYWdzKQorCQkJZnByaW50ZihmcCwgIiV4IiwgZmxhZ3MpOworCX0KKwlpZiAoc2hvd19zdGF0cyA+IDApCisJCWZwcmludGYoZnAsICIgKDB4JXMpIiwgc3RyeGZfbWFzazgoeHBpbmZvLT5mbGFncykpOworCWZwcmludGYoZnAsICIlcyIsIF9TTF8pOworCisJaWYgKHNob3dfc3RhdHMgPiAwKQorCQl4ZnJtX2xpZmV0aW1lX3ByaW50KCZ4cGluZm8tPmxmdCwgJnhwaW5mby0+Y3VybGZ0LCBmcCwgYnVmKTsKKworCXhmcm1feGZybWFfcHJpbnQodGIsIHhwaW5mby0+c2VsLmZhbWlseSwgZnAsIGJ1Zik7Cit9CisKK2ludCB4ZnJtX2lkX3BhcnNlKHhmcm1fYWRkcmVzc190ICpzYWRkciwgc3RydWN0IHhmcm1faWQgKmlkLCBfX3UxNiAqZmFtaWx5LAorCQkgIGludCBsb29zZSwgaW50ICphcmdjcCwgY2hhciAqKiphcmd2cCkKK3sKKwlpbnQgYXJnYyA9ICphcmdjcDsKKwljaGFyICoqYXJndiA9ICphcmd2cDsKKwlpbmV0X3ByZWZpeCBkc3Q7CisJaW5ldF9wcmVmaXggc3JjOworCisJbWVtc2V0KCZkc3QsIDAsIHNpemVvZihkc3QpKTsKKwltZW1zZXQoJnNyYywgMCwgc2l6ZW9mKHNyYykpOworCisJd2hpbGUgKDEpIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgInNyYyIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisKKwkJCWdldF9wcmVmaXgoJnNyYywgKmFyZ3YsIHByZWZlcnJlZF9mYW1pbHkpOworCQkJaWYgKHNyYy5mYW1pbHkgPT0gQUZfVU5TUEVDKQorCQkJCWludmFyZygidmFsdWUgYWZ0ZXIgXCJzcmNcIiBoYXMgYW4gdW5yZWNvZ25pemVkIGFkZHJlc3MgZmFtaWx5IiwgKmFyZ3YpOworCQkJaWYgKGZhbWlseSkKKwkJCQkqZmFtaWx5ID0gc3JjLmZhbWlseTsKKworCQkJbWVtY3B5KHNhZGRyLCAmc3JjLmRhdGEsIHNpemVvZigqc2FkZHIpKTsKKworCQkJZmlsdGVyLmlkX3NyY19tYXNrID0gc3JjLmJpdGxlbjsKKworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImRzdCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisKKwkJCWdldF9wcmVmaXgoJmRzdCwgKmFyZ3YsIHByZWZlcnJlZF9mYW1pbHkpOworCQkJaWYgKGRzdC5mYW1pbHkgPT0gQUZfVU5TUEVDKQorCQkJCWludmFyZygidmFsdWUgYWZ0ZXIgXCJkc3RcIiBoYXMgYW4gdW5yZWNvZ25pemVkIGFkZHJlc3MgZmFtaWx5IiwgKmFyZ3YpOworCQkJaWYgKGZhbWlseSkKKwkJCQkqZmFtaWx5ID0gZHN0LmZhbWlseTsKKworCQkJbWVtY3B5KCZpZC0+ZGFkZHIsICZkc3QuZGF0YSwgc2l6ZW9mKGlkLT5kYWRkcikpOworCisJCQlmaWx0ZXIuaWRfZHN0X21hc2sgPSBkc3QuYml0bGVuOworCisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAicHJvdG8iKSA9PSAwKSB7CisJCQlpbnQgcmV0OworCisJCQlORVhUX0FSRygpOworCisJCQlyZXQgPSB4ZnJtX3hmcm1wcm90b19nZXRieW5hbWUoKmFyZ3YpOworCQkJaWYgKHJldCA8IDApCisJCQkJaW52YXJnKCJYRlJNLVBST1RPIHZhbHVlIGlzIGludmFsaWQiLCAqYXJndik7CisKKwkJCWlkLT5wcm90byA9IChfX3U4KXJldDsKKworCQkJZmlsdGVyLmlkX3Byb3RvX21hc2sgPSBYRlJNX0ZJTFRFUl9NQVNLX0ZVTEw7CisKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJzcGkiKSA9PSAwKSB7CisJCQlfX3UzMiBzcGk7CisKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmc3BpLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJTUEkgdmFsdWUgaXMgaW52YWxpZCIsICphcmd2KTsKKworCQkJc3BpID0gaHRvbmwoc3BpKTsKKwkJCWlkLT5zcGkgPSBzcGk7CisKKwkJCWZpbHRlci5pZF9zcGlfbWFzayA9IFhGUk1fRklMVEVSX01BU0tfRlVMTDsKKworCQl9IGVsc2UgeworCQkJUFJFVl9BUkcoKTsgLyogYmFjayB0cmFjayAqLworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIU5FWFRfQVJHX09LKCkpCisJCQlicmVhazsKKwkJTkVYVF9BUkcoKTsKKwl9CisKKwlpZiAoc3JjLmZhbWlseSAmJiBkc3QuZmFtaWx5ICYmIChzcmMuZmFtaWx5ICE9IGRzdC5mYW1pbHkpKQorCQlpbnZhcmcoInRoZSBzYW1lIGFkZHJlc3MgZmFtaWx5IGlzIHJlcXVpcmVkIGJldHdlZW4gdmFsdWVzIGFmdGVyIFwic3JjXCIgYW5kIFwiZHN0XCIiLCAqYXJndik7CisKKwlpZiAoaWQtPnNwaSAmJiBpZC0+cHJvdG8pIHsKKwkJaWYgKHhmcm1feGZybXByb3RvX2lzX3JvKGlkLT5wcm90bykpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiXCJzcGlcIiBpcyBpbnZhbGlkIHdpdGggWEZSTS1QUk9UTyB2YWx1ZSBcIiVzXCJcbiIsCisJCQkgICAgICAgIHN0cnhmX3hmcm1wcm90byhpZC0+cHJvdG8pKTsKKwkJCWV4aXQoMSk7CisJCX0gZWxzZSBpZiAoaWQtPnByb3RvID09IElQUFJPVE9fQ09NUCAmJiBudG9obChpZC0+c3BpKSA+PSAweDEwMDAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlNQSSB2YWx1ZSBpcyB0b28gbGFyZ2Ugd2l0aCBYRlJNLVBST1RPIHZhbHVlIFwiJXNcIlxuIiwKKwkJCSAgICAgICAgc3RyeGZfeGZybXByb3RvKGlkLT5wcm90bykpOworCQkJZXhpdCgxKTsKKwkJfQorCX0KKworCWlmIChsb29zZSA9PSAwICYmIGlkLT5wcm90byA9PSAwKQorCQltaXNzYXJnKCJYRlJNLVBST1RPIik7CisJaWYgKGFyZ2MgPT0gKmFyZ2NwKQorCQltaXNzYXJnKCJJRCIpOworCisJKmFyZ2NwID0gYXJnYzsKKwkqYXJndnAgPSBhcmd2OworCisJcmV0dXJuIDA7Cit9CisKK2ludCB4ZnJtX21vZGVfcGFyc2UoX191OCAqbW9kZSwgaW50ICphcmdjcCwgY2hhciAqKiphcmd2cCkKK3sKKwlpbnQgYXJnYyA9ICphcmdjcDsKKwljaGFyICoqYXJndiA9ICphcmd2cDsKKworCWlmIChtYXRjaGVzKCphcmd2LCAidHJhbnNwb3J0IikgPT0gMCkKKwkJKm1vZGUgPSBYRlJNX01PREVfVFJBTlNQT1JUOworCWVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJ0dW5uZWwiKSA9PSAwKQorCQkqbW9kZSA9IFhGUk1fTU9ERV9UVU5ORUw7CisJZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInJvIikgPT0gMCkKKwkJKm1vZGUgPSBYRlJNX01PREVfUk9VVEVPUFRJTUlaQVRJT047CisJZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImluX3RyaWdnZXIiKSA9PSAwKQorCQkqbW9kZSA9IFhGUk1fTU9ERV9JTl9UUklHR0VSOworCWVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJiZWV0IikgPT0gMCkKKwkJKm1vZGUgPSBYRlJNX01PREVfQkVFVDsKKwllbHNlCisJCWludmFyZygiTU9ERSB2YWx1ZSBpcyBpbnZhbGlkIiwgKmFyZ3YpOworCisJKmFyZ2NwID0gYXJnYzsKKwkqYXJndnAgPSBhcmd2OworCisJcmV0dXJuIDA7Cit9CisKK2ludCB4ZnJtX2VuY2FwX3R5cGVfcGFyc2UoX191MTYgKnR5cGUsIGludCAqYXJnY3AsIGNoYXIgKioqYXJndnApCit7CisJaW50IGFyZ2MgPSAqYXJnY3A7CisJY2hhciAqKmFyZ3YgPSAqYXJndnA7CisKKwlpZiAoc3RyY21wKCphcmd2LCAiZXNwaW51ZHAtbm9uaWtlIikgPT0gMCkKKwkJKnR5cGUgPSAxOworCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImVzcGludWRwIikgPT0gMCkKKwkJKnR5cGUgPSAyOworCWVsc2UKKwkJaW52YXJnKCJFTkNBUC1UWVBFIHZhbHVlIGlzIGludmFsaWQiLCAqYXJndik7CisKKwkqYXJnY3AgPSBhcmdjOworCSphcmd2cCA9IGFyZ3Y7CisKKwlyZXR1cm4gMDsKK30KKworLyogTk9URTogcmVxaWQgaXMgdXNlZCBieSBob3N0LWJ5dGUgb3JkZXIgKi8KK2ludCB4ZnJtX3JlcWlkX3BhcnNlKF9fdTMyICpyZXFpZCwgaW50ICphcmdjcCwgY2hhciAqKiphcmd2cCkKK3sKKwlpbnQgYXJnYyA9ICphcmdjcDsKKwljaGFyICoqYXJndiA9ICphcmd2cDsKKworCWlmIChnZXRfdTMyKHJlcWlkLCAqYXJndiwgMCkpCisJCWludmFyZygiUkVRSUQgdmFsdWUgaXMgaW52YWxpZCIsICphcmd2KTsKKworCSphcmdjcCA9IGFyZ2M7CisJKmFyZ3ZwID0gYXJndjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhmcm1fc2VsZWN0b3JfdXBzcGVjX3BhcnNlKHN0cnVjdCB4ZnJtX3NlbGVjdG9yICpzZWwsCisJCQkJICAgICAgaW50ICphcmdjcCwgY2hhciAqKiphcmd2cCkKK3sKKwlpbnQgYXJnYyA9ICphcmdjcDsKKwljaGFyICoqYXJndiA9ICphcmd2cDsKKwljaGFyICpzcG9ydHAgPSBOVUxMOworCWNoYXIgKmRwb3J0cCA9IE5VTEw7CisJY2hhciAqdHlwZXAgPSBOVUxMOworCWNoYXIgKmNvZGVwID0gTlVMTDsKKwljaGFyICpncmVrZXkgPSBOVUxMOworCisJd2hpbGUgKDEpIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgInByb3RvIikgPT0gMCkgeworCQkJX191OCB1cHNwZWM7CisKKwkJCU5FWFRfQVJHKCk7CisKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJhbnkiKSA9PSAwKQorCQkJCXVwc3BlYyA9IDA7CisJCQllbHNlIHsKKwkJCQlzdHJ1Y3QgcHJvdG9lbnQgKnBwOworCQkJCXBwID0gZ2V0cHJvdG9ieW5hbWUoKmFyZ3YpOworCQkJCWlmIChwcCkKKwkJCQkJdXBzcGVjID0gcHAtPnBfcHJvdG87CisJCQkJZWxzZSB7CisJCQkJCWlmIChnZXRfdTgoJnVwc3BlYywgKmFyZ3YsIDApKQorCQkJCQkJaW52YXJnKCJQUk9UTyB2YWx1ZSBpcyBpbnZhbGlkIiwgKmFyZ3YpOworCQkJCX0KKwkJCX0KKwkJCXNlbC0+cHJvdG8gPSB1cHNwZWM7CisKKwkJCWZpbHRlci51cHNwZWNfcHJvdG9fbWFzayA9IFhGUk1fRklMVEVSX01BU0tfRlVMTDsKKworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInNwb3J0IikgPT0gMCkgeworCQkJc3BvcnRwID0gKmFyZ3Y7CisKKwkJCU5FWFRfQVJHKCk7CisKKwkJCWlmIChnZXRfdTE2KCZzZWwtPnNwb3J0LCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJ2YWx1ZSBhZnRlciBcInNwb3J0XCIgaXMgaW52YWxpZCIsICphcmd2KTsKKwkJCXNlbC0+c3BvcnQgPSBodG9ucyhzZWwtPnNwb3J0KTsKKwkJCWlmIChzZWwtPnNwb3J0KQorCQkJCXNlbC0+c3BvcnRfbWFzayA9IH4oKF9fdTE2KTApOworCisJCQlmaWx0ZXIudXBzcGVjX3Nwb3J0X21hc2sgPSBYRlJNX0ZJTFRFUl9NQVNLX0ZVTEw7CisKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJkcG9ydCIpID09IDApIHsKKwkJCWRwb3J0cCA9ICphcmd2OworCisJCQlORVhUX0FSRygpOworCisJCQlpZiAoZ2V0X3UxNigmc2VsLT5kcG9ydCwgKmFyZ3YsIDApKQorCQkJCWludmFyZygidmFsdWUgYWZ0ZXIgXCJkcG9ydFwiIGlzIGludmFsaWQiLCAqYXJndik7CisJCQlzZWwtPmRwb3J0ID0gaHRvbnMoc2VsLT5kcG9ydCk7CisJCQlpZiAoc2VsLT5kcG9ydCkKKwkJCQlzZWwtPmRwb3J0X21hc2sgPSB+KChfX3UxNikwKTsKKworCQkJZmlsdGVyLnVwc3BlY19kcG9ydF9tYXNrID0gWEZSTV9GSUxURVJfTUFTS19GVUxMOworCisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAidHlwZSIpID09IDApIHsKKwkJCXR5cGVwID0gKmFyZ3Y7CisKKwkJCU5FWFRfQVJHKCk7CisKKwkJCWlmIChnZXRfdTE2KCZzZWwtPnNwb3J0LCAqYXJndiwgMCkgfHwKKwkJCSAgICAoc2VsLT5zcG9ydCAmIH4oKF9fdTE2KTB4ZmYpKSkKKwkJCQlpbnZhcmcoInZhbHVlIGFmdGVyIFwidHlwZVwiIGlzIGludmFsaWQiLCAqYXJndik7CisJCQlzZWwtPnNwb3J0ID0gaHRvbnMoc2VsLT5zcG9ydCk7CisJCQlzZWwtPnNwb3J0X21hc2sgPSB+KChfX3UxNikwKTsKKworCQkJZmlsdGVyLnVwc3BlY19zcG9ydF9tYXNrID0gWEZSTV9GSUxURVJfTUFTS19GVUxMOworCisKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJjb2RlIikgPT0gMCkgeworCQkJY29kZXAgPSAqYXJndjsKKworCQkJTkVYVF9BUkcoKTsKKworCQkJaWYgKGdldF91MTYoJnNlbC0+ZHBvcnQsICphcmd2LCAwKSB8fAorCQkJICAgIChzZWwtPmRwb3J0ICYgfigoX191MTYpMHhmZikpKQorCQkJCWludmFyZygidmFsdWUgYWZ0ZXIgXCJjb2RlXCIgaXMgaW52YWxpZCIsICphcmd2KTsKKwkJCXNlbC0+ZHBvcnQgPSBodG9ucyhzZWwtPmRwb3J0KTsKKwkJCXNlbC0+ZHBvcnRfbWFzayA9IH4oKF9fdTE2KTApOworCisJCQlmaWx0ZXIudXBzcGVjX2Rwb3J0X21hc2sgPSBYRlJNX0ZJTFRFUl9NQVNLX0ZVTEw7CisKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJrZXkiKSA9PSAwKSB7CisJCQl1bnNpZ25lZCB1dmFsOworCisJCQlncmVrZXkgPSAqYXJndjsKKworCQkJTkVYVF9BUkcoKTsKKworCQkJaWYgKHN0cmNocigqYXJndiwgJy4nKSkKKwkJCQl1dmFsID0gaHRvbmwoZ2V0X2FkZHIzMigqYXJndikpOworCQkJZWxzZSB7CisJCQkJaWYgKGdldF91bnNpZ25lZCgmdXZhbCwgKmFyZ3YsIDApPDApIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJ2YWx1ZSBhZnRlciBcImtleVwiIGlzIGludmFsaWRcbiIpOworCQkJCQlleGl0KC0xKTsKKwkJCQl9CisJCQl9CisKKwkJCXNlbC0+c3BvcnQgPSBodG9ucyh1dmFsID4+IDE2KTsKKwkJCXNlbC0+ZHBvcnQgPSBodG9ucyh1dmFsICYgMHhmZmZmKTsKKwkJCXNlbC0+c3BvcnRfbWFzayA9IH4oKF9fdTE2KTApOworCQkJc2VsLT5kcG9ydF9tYXNrID0gfigoX191MTYpMCk7CisKKwkJCWZpbHRlci51cHNwZWNfZHBvcnRfbWFzayA9IFhGUk1fRklMVEVSX01BU0tfRlVMTDsKKworCQl9IGVsc2UgeworCQkJUFJFVl9BUkcoKTsgLyogYmFjayB0cmFjayAqLworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIU5FWFRfQVJHX09LKCkpCisJCQlicmVhazsKKwkJTkVYVF9BUkcoKTsKKwl9CisJaWYgKGFyZ2MgPT0gKmFyZ2NwKQorCQltaXNzYXJnKCJVUFNQRUMiKTsKKwlpZiAoc3BvcnRwIHx8IGRwb3J0cCkgeworCQlzd2l0Y2ggKHNlbC0+cHJvdG8pIHsKKwkJY2FzZSBJUFBST1RPX1RDUDoKKwkJY2FzZSBJUFBST1RPX1VEUDoKKwkJY2FzZSBJUFBST1RPX1NDVFA6CisJCWNhc2UgSVBQUk9UT19EQ0NQOgorCQljYXNlIElQUFJPVE9fSVA6IC8qIHRvIGFsbG93IHNoYXJlZCBTQSBmb3IgZGlmZmVyZW50IHByb3RvY29scyAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKHN0ZGVyciwgIlwic3BvcnRcIiBhbmQgXCJkcG9ydFwiIGFyZSBpbnZhbGlkIHdpdGggUFJPVE8gdmFsdWUgXCIlc1wiXG4iLCBzdHJ4Zl9wcm90byhzZWwtPnByb3RvKSk7CisJCQlleGl0KDEpOworCQl9CisJfQorCWlmICh0eXBlcCB8fCBjb2RlcCkgeworCQlzd2l0Y2ggKHNlbC0+cHJvdG8pIHsKKwkJY2FzZSBJUFBST1RPX0lDTVA6CisJCWNhc2UgSVBQUk9UT19JQ01QVjY6CisJCWNhc2UgSVBQUk9UT19NSDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZnByaW50ZihzdGRlcnIsICJcInR5cGVcIiBhbmQgXCJjb2RlXCIgYXJlIGludmFsaWQgd2l0aCBQUk9UTyB2YWx1ZSBcIiVzXCJcbiIsIHN0cnhmX3Byb3RvKHNlbC0+cHJvdG8pKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisJaWYgKGdyZWtleSkgeworCQlzd2l0Y2ggKHNlbC0+cHJvdG8pIHsKKwkJY2FzZSBJUFBST1RPX0dSRToKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZnByaW50ZihzdGRlcnIsICJcImtleVwiIGlzIGludmFsaWQgd2l0aCBQUk9UTyB2YWx1ZSBcIiVzXCJcbiIsIHN0cnhmX3Byb3RvKHNlbC0+cHJvdG8pKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisKKwkqYXJnY3AgPSBhcmdjOworCSphcmd2cCA9IGFyZ3Y7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHhmcm1fc2VsZWN0b3JfcGFyc2Uoc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCwgaW50ICphcmdjcCwgY2hhciAqKiphcmd2cCkKK3sKKwlpbnQgYXJnYyA9ICphcmdjcDsKKwljaGFyICoqYXJndiA9ICphcmd2cDsKKwlpbmV0X3ByZWZpeCBkc3Q7CisJaW5ldF9wcmVmaXggc3JjOworCWNoYXIgKnVwc3BlY3AgPSBOVUxMOworCisJbWVtc2V0KCZkc3QsIDAsIHNpemVvZihkc3QpKTsKKwltZW1zZXQoJnNyYywgMCwgc2l6ZW9mKHNyYykpOworCisJd2hpbGUgKDEpIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgInNyYyIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisKKwkJCWdldF9wcmVmaXgoJnNyYywgKmFyZ3YsIHByZWZlcnJlZF9mYW1pbHkpOworCQkJaWYgKHNyYy5mYW1pbHkgPT0gQUZfVU5TUEVDKQorCQkJCWludmFyZygidmFsdWUgYWZ0ZXIgXCJzcmNcIiBoYXMgYW4gdW5yZWNvZ25pemVkIGFkZHJlc3MgZmFtaWx5IiwgKmFyZ3YpOworCQkJc2VsLT5mYW1pbHkgPSBzcmMuZmFtaWx5OworCisJCQltZW1jcHkoJnNlbC0+c2FkZHIsICZzcmMuZGF0YSwgc2l6ZW9mKHNlbC0+c2FkZHIpKTsKKwkJCXNlbC0+cHJlZml4bGVuX3MgPSBzcmMuYml0bGVuOworCisJCQlmaWx0ZXIuc2VsX3NyY19tYXNrID0gc3JjLmJpdGxlbjsKKworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImRzdCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisKKwkJCWdldF9wcmVmaXgoJmRzdCwgKmFyZ3YsIHByZWZlcnJlZF9mYW1pbHkpOworCQkJaWYgKGRzdC5mYW1pbHkgPT0gQUZfVU5TUEVDKQorCQkJCWludmFyZygidmFsdWUgYWZ0ZXIgXCJkc3RcIiBoYXMgYW4gdW5yZWNvZ25pemVkIGFkZHJlc3MgZmFtaWx5IiwgKmFyZ3YpOworCQkJc2VsLT5mYW1pbHkgPSBkc3QuZmFtaWx5OworCisJCQltZW1jcHkoJnNlbC0+ZGFkZHIsICZkc3QuZGF0YSwgc2l6ZW9mKHNlbC0+ZGFkZHIpKTsKKwkJCXNlbC0+cHJlZml4bGVuX2QgPSBkc3QuYml0bGVuOworCisJCQlmaWx0ZXIuc2VsX2RzdF9tYXNrID0gZHN0LmJpdGxlbjsKKworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImRldiIpID09IDApIHsKKwkJCWludCBpZmluZGV4OworCisJCQlORVhUX0FSRygpOworCisJCQlpZiAoc3RyY21wKCphcmd2LCAibm9uZSIpID09IDApCisJCQkJaWZpbmRleCA9IDA7CisJCQllbHNlIHsKKwkJCQlpZmluZGV4ID0gbGxfbmFtZV90b19pbmRleCgqYXJndik7CisJCQkJaWYgKGlmaW5kZXggPD0gMCkKKwkJCQkJaW52YXJnKCJERVYgdmFsdWUgaXMgaW52YWxpZCIsICphcmd2KTsKKwkJCX0KKwkJCXNlbC0+aWZpbmRleCA9IGlmaW5kZXg7CisKKwkJCWZpbHRlci5zZWxfZGV2X21hc2sgPSBYRlJNX0ZJTFRFUl9NQVNLX0ZVTEw7CisKKwkJfSBlbHNlIHsKKwkJCWlmICh1cHNwZWNwKSB7CisJCQkJUFJFVl9BUkcoKTsgLyogYmFjayB0cmFjayAqLworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQl1cHNwZWNwID0gKmFyZ3Y7CisJCQkJeGZybV9zZWxlY3Rvcl91cHNwZWNfcGFyc2Uoc2VsLCAmYXJnYywgJmFyZ3YpOworCQkJfQorCQl9CisKKwkJaWYgKCFORVhUX0FSR19PSygpKQorCQkJYnJlYWs7CisKKwkJTkVYVF9BUkcoKTsKKwl9CisKKwlpZiAoc3JjLmZhbWlseSAmJiBkc3QuZmFtaWx5ICYmIChzcmMuZmFtaWx5ICE9IGRzdC5mYW1pbHkpKQorCQlpbnZhcmcoInRoZSBzYW1lIGFkZHJlc3MgZmFtaWx5IGlzIHJlcXVpcmVkIGJldHdlZW4gdmFsdWVzIGFmdGVyIFwic3JjXCIgYW5kIFwiZHN0XCIiLCAqYXJndik7CisKKwlpZiAoYXJnYyA9PSAqYXJnY3ApCisJCW1pc3NhcmcoIlNFTEVDVE9SIik7CisKKwkqYXJnY3AgPSBhcmdjOworCSphcmd2cCA9IGFyZ3Y7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHhmcm1fbGlmZXRpbWVfY2ZnX3BhcnNlKHN0cnVjdCB4ZnJtX2xpZmV0aW1lX2NmZyAqbGZ0LAorCQkJICAgIGludCAqYXJnY3AsIGNoYXIgKioqYXJndnApCit7CisJaW50IGFyZ2MgPSAqYXJnY3A7CisJY2hhciAqKmFyZ3YgPSAqYXJndnA7CisJaW50IHJldDsKKworCWlmIChzdHJjbXAoKmFyZ3YsICJ0aW1lLXNvZnQiKSA9PSAwKSB7CisJCU5FWFRfQVJHKCk7CisJCXJldCA9IGdldF91NjQoJmxmdC0+c29mdF9hZGRfZXhwaXJlc19zZWNvbmRzLCAqYXJndiwgMCk7CisJCWlmIChyZXQpCisJCQlpbnZhcmcoInZhbHVlIGFmdGVyIFwidGltZS1zb2Z0XCIgaXMgaW52YWxpZCIsICphcmd2KTsKKwl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInRpbWUtaGFyZCIpID09IDApIHsKKwkJTkVYVF9BUkcoKTsKKwkJcmV0ID0gZ2V0X3U2NCgmbGZ0LT5oYXJkX2FkZF9leHBpcmVzX3NlY29uZHMsICphcmd2LCAwKTsKKwkJaWYgKHJldCkKKwkJCWludmFyZygidmFsdWUgYWZ0ZXIgXCJ0aW1lLWhhcmRcIiBpcyBpbnZhbGlkIiwgKmFyZ3YpOworCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAidGltZS11c2Utc29mdCIpID09IDApIHsKKwkJTkVYVF9BUkcoKTsKKwkJcmV0ID0gZ2V0X3U2NCgmbGZ0LT5zb2Z0X3VzZV9leHBpcmVzX3NlY29uZHMsICphcmd2LCAwKTsKKwkJaWYgKHJldCkKKwkJCWludmFyZygidmFsdWUgYWZ0ZXIgXCJ0aW1lLXVzZS1zb2Z0XCIgaXMgaW52YWxpZCIsICphcmd2KTsKKwl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInRpbWUtdXNlLWhhcmQiKSA9PSAwKSB7CisJCU5FWFRfQVJHKCk7CisJCXJldCA9IGdldF91NjQoJmxmdC0+aGFyZF91c2VfZXhwaXJlc19zZWNvbmRzLCAqYXJndiwgMCk7CisJCWlmIChyZXQpCisJCQlpbnZhcmcoInZhbHVlIGFmdGVyIFwidGltZS11c2UtaGFyZFwiIGlzIGludmFsaWQiLCAqYXJndik7CisJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJieXRlLXNvZnQiKSA9PSAwKSB7CisJCU5FWFRfQVJHKCk7CisJCXJldCA9IGdldF91NjQoJmxmdC0+c29mdF9ieXRlX2xpbWl0LCAqYXJndiwgMCk7CisJCWlmIChyZXQpCisJCQlpbnZhcmcoInZhbHVlIGFmdGVyIFwiYnl0ZS1zb2Z0XCIgaXMgaW52YWxpZCIsICphcmd2KTsKKwl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImJ5dGUtaGFyZCIpID09IDApIHsKKwkJTkVYVF9BUkcoKTsKKwkJcmV0ID0gZ2V0X3U2NCgmbGZ0LT5oYXJkX2J5dGVfbGltaXQsICphcmd2LCAwKTsKKwkJaWYgKHJldCkKKwkJCWludmFyZygidmFsdWUgYWZ0ZXIgXCJieXRlLWhhcmRcIiBpcyBpbnZhbGlkIiwgKmFyZ3YpOworCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAicGFja2V0LXNvZnQiKSA9PSAwKSB7CisJCU5FWFRfQVJHKCk7CisJCXJldCA9IGdldF91NjQoJmxmdC0+c29mdF9wYWNrZXRfbGltaXQsICphcmd2LCAwKTsKKwkJaWYgKHJldCkKKwkJCWludmFyZygidmFsdWUgYWZ0ZXIgXCJwYWNrZXQtc29mdFwiIGlzIGludmFsaWQiLCAqYXJndik7CisJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJwYWNrZXQtaGFyZCIpID09IDApIHsKKwkJTkVYVF9BUkcoKTsKKwkJcmV0ID0gZ2V0X3U2NCgmbGZ0LT5oYXJkX3BhY2tldF9saW1pdCwgKmFyZ3YsIDApOworCQlpZiAocmV0KQorCQkJaW52YXJnKCJ2YWx1ZSBhZnRlciBcInBhY2tldC1oYXJkXCIgaXMgaW52YWxpZCIsICphcmd2KTsKKwl9IGVsc2UKKwkJaW52YXJnKCJMSU1JVCB2YWx1ZSBpcyBpbnZhbGlkIiwgKmFyZ3YpOworCisJKmFyZ2NwID0gYXJnYzsKKwkqYXJndnAgPSBhcmd2OworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkb194ZnJtKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwltZW1zZXQoJmZpbHRlciwgMCwgc2l6ZW9mKGZpbHRlcikpOworCisJaWYgKGFyZ2MgPCAxKQorCQl1c2FnZSgpOworCisJaWYgKG1hdGNoZXMoKmFyZ3YsICJzdGF0ZSIpID09IDAgfHwKKwkgICAgbWF0Y2hlcygqYXJndiwgInNhIikgPT0gMCkKKwkJcmV0dXJuIGRvX3hmcm1fc3RhdGUoYXJnYy0xLCBhcmd2KzEpOworCWVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJwb2xpY3kiKSA9PSAwKQorCQlyZXR1cm4gZG9feGZybV9wb2xpY3koYXJnYy0xLCBhcmd2KzEpOworCWVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJtb25pdG9yIikgPT0gMCkKKwkJcmV0dXJuIGRvX3hmcm1fbW9uaXRvcihhcmdjLTEsIGFyZ3YrMSk7CisJZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKSB7CisJCXVzYWdlKCk7CisJCWZwcmludGYoc3RkZXJyLCAieGZybSBPYmplY3QgXCIlc1wiIGlzIHVua25vd24uXG4iLCAqYXJndik7CisJCWV4aXQoLTEpOworCX0KKwl1c2FnZSgpOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaXAvbGlua19ncmUuYyBiL2lwcm91dGUyL2lwL2xpbmtfZ3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg1NzQxZgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2lwL2xpbmtfZ3JlLmMKQEAgLTAsMCArMSw0OTEgQEAKKy8qCisgKiBsaW5rX2dyZS5jCWdyZSBkcml2ZXIgbW9kdWxlCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgorICoKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl90dW5uZWwuaD4KKyNpbmNsdWRlICJydF9uYW1lcy5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiaXBfY29tbW9uLmgiCisjaW5jbHVkZSAidHVubmVsLmgiCisKK3N0YXRpYyB2b2lkIHByaW50X3VzYWdlKEZJTEUgKmYpCit7CisJZnByaW50ZihmLCAiVXNhZ2U6IGlwIGxpbmsgeyBhZGQgfCBzZXQgfCBjaGFuZ2UgfCByZXBsYWNlIHwgZGVsIH0gTkFNRVxuIik7CisJZnByaW50ZihmLCAiICAgICAgICAgIHR5cGUgeyBncmUgfCBncmV0YXAgfSBbIHJlbW90ZSBBRERSIF0gWyBsb2NhbCBBRERSIF1cbiIpOworCWZwcmludGYoZiwgIiAgICAgICAgICBbIFtpfG9dc2VxIF0gWyBbaXxvXWtleSBLRVkgXSBbIFtpfG9dY3N1bSBdXG4iKTsKKwlmcHJpbnRmKGYsICIgICAgICAgICAgWyB0dGwgVFRMIF0gWyB0b3MgVE9TIF0gWyBbbm9dcG10dWRpc2MgXSBbIGRldiBQSFlTX0RFViBdXG4iKTsKKwlmcHJpbnRmKGYsICIgICAgICAgICAgWyBub2VuY2FwIF0gWyBlbmNhcCB7IGZvdSB8IGd1ZSB8IG5vbmUgfSBdXG4iKTsKKwlmcHJpbnRmKGYsICIgICAgICAgICAgWyBlbmNhcC1zcG9ydCBQT1JUIF0gWyBlbmNhcC1kcG9ydCBQT1JUIF1cbiIpOworCWZwcmludGYoZiwgIiAgICAgICAgICBbIFtub11lbmNhcC1jc3VtIF0gWyBbbm9dZW5jYXAtY3N1bTYgXSBbIFtub11lbmNhcC1yZW1jc3VtIF1cbiIpOworCWZwcmludGYoZiwgIlxuIik7CisJZnByaW50ZihmLCAiV2hlcmU6IE5BTUUgOj0gU1RSSU5HXG4iKTsKKwlmcHJpbnRmKGYsICIgICAgICAgQUREUiA6PSB7IElQX0FERFJFU1MgfCBhbnkgfVxuIik7CisJZnByaW50ZihmLCAiICAgICAgIFRPUyAgOj0geyBOVU1CRVIgfCBpbmhlcml0IH1cbiIpOworCWZwcmludGYoZiwgIiAgICAgICBUVEwgIDo9IHsgMS4uMjU1IHwgaW5oZXJpdCB9XG4iKTsKKwlmcHJpbnRmKGYsICIgICAgICAgS0VZICA6PSB7IERPVFRFRF9RVUFEIHwgTlVNQkVSIH1cbiIpOworfQorCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlwcmludF91c2FnZShzdGRlcnIpOworCWV4aXQoLTEpOworfQorCitzdGF0aWMgaW50IGdyZV9wYXJzZV9vcHQoc3RydWN0IGxpbmtfdXRpbCAqbHUsIGludCBhcmdjLCBjaGFyICoqYXJndiwKKwkJCSBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyIG47CisJCXN0cnVjdCBpZmluZm9tc2cgaTsKKwkJY2hhciBidWZbMTYzODRdOworCX0gcmVxOworCXN0cnVjdCBpZmluZm9tc2cgKmlmaSA9IChzdHJ1Y3QgaWZpbmZvbXNnICopKG4gKyAxKTsKKwlzdHJ1Y3QgcnRhdHRyICp0YltJRkxBX01BWCArIDFdOworCXN0cnVjdCBydGF0dHIgKmxpbmtpbmZvW0lGTEFfSU5GT19NQVgrMV07CisJc3RydWN0IHJ0YXR0ciAqZ3JlaW5mb1tJRkxBX0dSRV9NQVggKyAxXTsKKwlfX3UxNiBpZmxhZ3MgPSAwOworCV9fdTE2IG9mbGFncyA9IDA7CisJdW5zaWduZWQgaWtleSA9IDA7CisJdW5zaWduZWQgb2tleSA9IDA7CisJdW5zaWduZWQgc2FkZHIgPSAwOworCXVuc2lnbmVkIGRhZGRyID0gMDsKKwl1bnNpZ25lZCBsaW5rID0gMDsKKwlfX3U4IHBtdHVkaXNjID0gMTsKKwlfX3U4IHR0bCA9IDA7CisJX191OCB0b3MgPSAwOworCWludCBsZW47CisJX191MTYgZW5jYXB0eXBlID0gMDsKKwlfX3UxNiBlbmNhcGZsYWdzID0gMDsKKwlfX3UxNiBlbmNhcHNwb3J0ID0gMDsKKwlfX3UxNiBlbmNhcGRwb3J0ID0gMDsKKwlfX3U4IG1ldGFkYXRhID0gMDsKKworCWlmICghKG4tPm5sbXNnX2ZsYWdzICYgTkxNX0ZfQ1JFQVRFKSkgeworCQltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCisJCXJlcS5uLm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2YoKmlmaSkpOworCQlyZXEubi5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1Q7CisJCXJlcS5uLm5sbXNnX3R5cGUgPSBSVE1fR0VUTElOSzsKKwkJcmVxLmkuaWZpX2ZhbWlseSA9IHByZWZlcnJlZF9mYW1pbHk7CisJCXJlcS5pLmlmaV9pbmRleCA9IGlmaS0+aWZpX2luZGV4OworCisJCWlmIChydG5sX3RhbGsoJnJ0aCwgJnJlcS5uLCAmcmVxLm4sIHNpemVvZihyZXEpKSA8IDApIHsKK2dldF9mYWlsZWQ6CisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiRmFpbGVkIHRvIGdldCBleGlzdGluZyB0dW5uZWwgaW5mby5cbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJbGVuID0gcmVxLm4ubmxtc2dfbGVuOworCQlsZW4gLT0gTkxNU0dfTEVOR1RIKHNpemVvZigqaWZpKSk7CisJCWlmIChsZW4gPCAwKQorCQkJZ290byBnZXRfZmFpbGVkOworCisJCXBhcnNlX3J0YXR0cih0YiwgSUZMQV9NQVgsIElGTEFfUlRBKCZyZXEuaSksIGxlbik7CisKKwkJaWYgKCF0YltJRkxBX0xJTktJTkZPXSkKKwkJCWdvdG8gZ2V0X2ZhaWxlZDsKKworCQlwYXJzZV9ydGF0dHJfbmVzdGVkKGxpbmtpbmZvLCBJRkxBX0lORk9fTUFYLCB0YltJRkxBX0xJTktJTkZPXSk7CisKKwkJaWYgKCFsaW5raW5mb1tJRkxBX0lORk9fREFUQV0pCisJCQlnb3RvIGdldF9mYWlsZWQ7CisKKwkJcGFyc2VfcnRhdHRyX25lc3RlZChncmVpbmZvLCBJRkxBX0dSRV9NQVgsCisJCQkJICAgIGxpbmtpbmZvW0lGTEFfSU5GT19EQVRBXSk7CisKKwkJaWYgKGdyZWluZm9bSUZMQV9HUkVfSUtFWV0pCisJCQlpa2V5ID0gcnRhX2dldGF0dHJfdTMyKGdyZWluZm9bSUZMQV9HUkVfSUtFWV0pOworCisJCWlmIChncmVpbmZvW0lGTEFfR1JFX09LRVldKQorCQkJb2tleSA9IHJ0YV9nZXRhdHRyX3UzMihncmVpbmZvW0lGTEFfR1JFX09LRVldKTsKKworCQlpZiAoZ3JlaW5mb1tJRkxBX0dSRV9JRkxBR1NdKQorCQkJaWZsYWdzID0gcnRhX2dldGF0dHJfdTE2KGdyZWluZm9bSUZMQV9HUkVfSUZMQUdTXSk7CisKKwkJaWYgKGdyZWluZm9bSUZMQV9HUkVfT0ZMQUdTXSkKKwkJCW9mbGFncyA9IHJ0YV9nZXRhdHRyX3UxNihncmVpbmZvW0lGTEFfR1JFX09GTEFHU10pOworCisJCWlmIChncmVpbmZvW0lGTEFfR1JFX0xPQ0FMXSkKKwkJCXNhZGRyID0gcnRhX2dldGF0dHJfdTMyKGdyZWluZm9bSUZMQV9HUkVfTE9DQUxdKTsKKworCQlpZiAoZ3JlaW5mb1tJRkxBX0dSRV9SRU1PVEVdKQorCQkJZGFkZHIgPSBydGFfZ2V0YXR0cl91MzIoZ3JlaW5mb1tJRkxBX0dSRV9SRU1PVEVdKTsKKworCQlpZiAoZ3JlaW5mb1tJRkxBX0dSRV9QTVRVRElTQ10pCisJCQlwbXR1ZGlzYyA9IHJ0YV9nZXRhdHRyX3U4KAorCQkJCWdyZWluZm9bSUZMQV9HUkVfUE1UVURJU0NdKTsKKworCQlpZiAoZ3JlaW5mb1tJRkxBX0dSRV9UVExdKQorCQkJdHRsID0gcnRhX2dldGF0dHJfdTgoZ3JlaW5mb1tJRkxBX0dSRV9UVExdKTsKKworCQlpZiAoZ3JlaW5mb1tJRkxBX0dSRV9UT1NdKQorCQkJdG9zID0gcnRhX2dldGF0dHJfdTgoZ3JlaW5mb1tJRkxBX0dSRV9UT1NdKTsKKworCQlpZiAoZ3JlaW5mb1tJRkxBX0dSRV9MSU5LXSkKKwkJCWxpbmsgPSBydGFfZ2V0YXR0cl91OChncmVpbmZvW0lGTEFfR1JFX0xJTktdKTsKKworCQlpZiAoZ3JlaW5mb1tJRkxBX0dSRV9FTkNBUF9UWVBFXSkKKwkJCWVuY2FwdHlwZSA9IHJ0YV9nZXRhdHRyX3UxNihncmVpbmZvW0lGTEFfR1JFX0VOQ0FQX1RZUEVdKTsKKwkJaWYgKGdyZWluZm9bSUZMQV9HUkVfRU5DQVBfRkxBR1NdKQorCQkJZW5jYXBmbGFncyA9IHJ0YV9nZXRhdHRyX3UxNihncmVpbmZvW0lGTEFfR1JFX0VOQ0FQX0ZMQUdTXSk7CisJCWlmIChncmVpbmZvW0lGTEFfR1JFX0VOQ0FQX1NQT1JUXSkKKwkJCWVuY2Fwc3BvcnQgPSBydGFfZ2V0YXR0cl91MTYoZ3JlaW5mb1tJRkxBX0dSRV9FTkNBUF9TUE9SVF0pOworCQlpZiAoZ3JlaW5mb1tJRkxBX0dSRV9FTkNBUF9EUE9SVF0pCisJCQllbmNhcGRwb3J0ID0gcnRhX2dldGF0dHJfdTE2KGdyZWluZm9bSUZMQV9HUkVfRU5DQVBfRFBPUlRdKTsKKworCQlpZiAoZ3JlaW5mb1tJRkxBX0dSRV9DT0xMRUNUX01FVEFEQVRBXSkKKwkJCW1ldGFkYXRhID0gMTsKKwl9CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKCFtYXRjaGVzKCphcmd2LCAia2V5IikpIHsKKwkJCXVuc2lnbmVkIHV2YWw7CisKKwkJCU5FWFRfQVJHKCk7CisJCQlpZmxhZ3MgfD0gR1JFX0tFWTsKKwkJCW9mbGFncyB8PSBHUkVfS0VZOworCQkJaWYgKHN0cmNocigqYXJndiwgJy4nKSkKKwkJCQl1dmFsID0gZ2V0X2FkZHIzMigqYXJndik7CisJCQllbHNlIHsKKwkJCQlpZiAoZ2V0X3Vuc2lnbmVkKCZ1dmFsLCAqYXJndiwgMCkgPCAwKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkJIkludmFsaWQgdmFsdWUgZm9yIFwia2V5XCI6IFwiJXNcIjsgaXQgc2hvdWxkIGJlIGFuIHVuc2lnbmVkIGludGVnZXJcbiIsICphcmd2KTsKKwkJCQkJZXhpdCgtMSk7CisJCQkJfQorCQkJCXV2YWwgPSBodG9ubCh1dmFsKTsKKwkJCX0KKworCQkJaWtleSA9IG9rZXkgPSB1dmFsOworCQl9IGVsc2UgaWYgKCFtYXRjaGVzKCphcmd2LCAiaWtleSIpKSB7CisJCQl1bnNpZ25lZCB1dmFsOworCisJCQlORVhUX0FSRygpOworCQkJaWZsYWdzIHw9IEdSRV9LRVk7CisJCQlpZiAoc3RyY2hyKCphcmd2LCAnLicpKQorCQkJCXV2YWwgPSBnZXRfYWRkcjMyKCphcmd2KTsKKwkJCWVsc2UgeworCQkJCWlmIChnZXRfdW5zaWduZWQoJnV2YWwsICphcmd2LCAwKTwwKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiaW52YWxpZCB2YWx1ZSBmb3IgXCJpa2V5XCI6IFwiJXNcIjsgaXQgc2hvdWxkIGJlIGFuIHVuc2lnbmVkIGludGVnZXJcbiIsICphcmd2KTsKKwkJCQkJZXhpdCgtMSk7CisJCQkJfQorCQkJCXV2YWwgPSBodG9ubCh1dmFsKTsKKwkJCX0KKwkJCWlrZXkgPSB1dmFsOworCQl9IGVsc2UgaWYgKCFtYXRjaGVzKCphcmd2LCAib2tleSIpKSB7CisJCQl1bnNpZ25lZCB1dmFsOworCisJCQlORVhUX0FSRygpOworCQkJb2ZsYWdzIHw9IEdSRV9LRVk7CisJCQlpZiAoc3RyY2hyKCphcmd2LCAnLicpKQorCQkJCXV2YWwgPSBnZXRfYWRkcjMyKCphcmd2KTsKKwkJCWVsc2UgeworCQkJCWlmIChnZXRfdW5zaWduZWQoJnV2YWwsICphcmd2LCAwKTwwKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiaW52YWxpZCB2YWx1ZSBmb3IgXCJva2V5XCI6IFwiJXNcIjsgaXQgc2hvdWxkIGJlIGFuIHVuc2lnbmVkIGludGVnZXJcbiIsICphcmd2KTsKKwkJCQkJZXhpdCgtMSk7CisJCQkJfQorCQkJCXV2YWwgPSBodG9ubCh1dmFsKTsKKwkJCX0KKwkJCW9rZXkgPSB1dmFsOworCQl9IGVsc2UgaWYgKCFtYXRjaGVzKCphcmd2LCAic2VxIikpIHsKKwkJCWlmbGFncyB8PSBHUkVfU0VROworCQkJb2ZsYWdzIHw9IEdSRV9TRVE7CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJpc2VxIikpIHsKKwkJCWlmbGFncyB8PSBHUkVfU0VROworCQl9IGVsc2UgaWYgKCFtYXRjaGVzKCphcmd2LCAib3NlcSIpKSB7CisJCQlvZmxhZ3MgfD0gR1JFX1NFUTsKKwkJfSBlbHNlIGlmICghbWF0Y2hlcygqYXJndiwgImNzdW0iKSkgeworCQkJaWZsYWdzIHw9IEdSRV9DU1VNOworCQkJb2ZsYWdzIHw9IEdSRV9DU1VNOworCQl9IGVsc2UgaWYgKCFtYXRjaGVzKCphcmd2LCAiaWNzdW0iKSkgeworCQkJaWZsYWdzIHw9IEdSRV9DU1VNOworCQl9IGVsc2UgaWYgKCFtYXRjaGVzKCphcmd2LCAib2NzdW0iKSkgeworCQkJb2ZsYWdzIHw9IEdSRV9DU1VNOworCQl9IGVsc2UgaWYgKCFtYXRjaGVzKCphcmd2LCAibm9wbXR1ZGlzYyIpKSB7CisJCQlwbXR1ZGlzYyA9IDA7CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJwbXR1ZGlzYyIpKSB7CisJCQlwbXR1ZGlzYyA9IDE7CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJyZW1vdGUiKSkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJhbnkiKSkKKwkJCQlkYWRkciA9IGdldF9hZGRyMzIoKmFyZ3YpOworCQl9IGVsc2UgaWYgKCFtYXRjaGVzKCphcmd2LCAibG9jYWwiKSkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJhbnkiKSkKKwkJCQlzYWRkciA9IGdldF9hZGRyMzIoKmFyZ3YpOworCQl9IGVsc2UgaWYgKCFtYXRjaGVzKCphcmd2LCAiZGV2IikpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlsaW5rID0gaWZfbmFtZXRvaW5kZXgoKmFyZ3YpOworCQkJaWYgKGxpbmsgPT0gMCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IGZpbmQgZGV2aWNlIFwiJXNcIlxuIiwKKwkJCQkJKmFyZ3YpOworCQkJCWV4aXQoLTEpOworCQkJfQorCQl9IGVsc2UgaWYgKCFtYXRjaGVzKCphcmd2LCAidHRsIikgfHwKKwkJCSAgICFtYXRjaGVzKCphcmd2LCAiaG9wbGltaXQiKSkgeworCQkJdW5zaWduZWQgdXZhbDsKKworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJpbmhlcml0IikgIT0gMCkgeworCQkJCWlmIChnZXRfdW5zaWduZWQoJnV2YWwsICphcmd2LCAwKSkKKwkJCQkJaW52YXJnKCJpbnZhbGlkIFRUTFxuIiwgKmFyZ3YpOworCQkJCWlmICh1dmFsID4gMjU1KQorCQkJCQlpbnZhcmcoIlRUTCBtdXN0IGJlIDw9IDI1NVxuIiwgKmFyZ3YpOworCQkJCXR0bCA9IHV2YWw7CisJCQl9CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJ0b3MiKSB8fAorCQkJICAgIW1hdGNoZXMoKmFyZ3YsICJ0Y2xhc3MiKSB8fAorCQkJICAgIW1hdGNoZXMoKmFyZ3YsICJkc2ZpZWxkIikpIHsKKwkJCV9fdTMyIHV2YWw7CisKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoc3RyY21wKCphcmd2LCAiaW5oZXJpdCIpICE9IDApIHsKKwkJCQlpZiAocnRubF9kc2ZpZWxkX2EybigmdXZhbCwgKmFyZ3YpKQorCQkJCQlpbnZhcmcoImJhZCBUT1MgdmFsdWUiLCAqYXJndik7CisJCQkJdG9zID0gdXZhbDsKKwkJCX0gZWxzZQorCQkJCXRvcyA9IDE7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibm9lbmNhcCIpID09IDApIHsKKwkJCWVuY2FwdHlwZSA9IFRVTk5FTF9FTkNBUF9OT05FOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImVuY2FwIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJmb3UiKSA9PSAwKQorCQkJCWVuY2FwdHlwZSA9IFRVTk5FTF9FTkNBUF9GT1U7CisJCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJndWUiKSA9PSAwKQorCQkJCWVuY2FwdHlwZSA9IFRVTk5FTF9FTkNBUF9HVUU7CisJCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJub25lIikgPT0gMCkKKwkJCQllbmNhcHR5cGUgPSBUVU5ORUxfRU5DQVBfTk9ORTsKKwkJCWVsc2UKKwkJCQlpbnZhcmcoIkludmFsaWQgZW5jYXAgdHlwZS4iLCAqYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZW5jYXAtc3BvcnQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHN0cmNtcCgqYXJndiwgImF1dG8iKSA9PSAwKQorCQkJCWVuY2Fwc3BvcnQgPSAwOworCQkJZWxzZSBpZiAoZ2V0X3UxNigmZW5jYXBzcG9ydCwgKmFyZ3YsIDApKQorCQkJCWludmFyZygiSW52YWxpZCBzb3VyY2UgcG9ydC4iLCAqYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZW5jYXAtZHBvcnQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MTYoJmVuY2FwZHBvcnQsICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoIkludmFsaWQgZGVzdGluYXRpb24gcG9ydC4iLCAqYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZW5jYXAtY3N1bSIpID09IDApIHsKKwkJCWVuY2FwZmxhZ3MgfD0gVFVOTkVMX0VOQ0FQX0ZMQUdfQ1NVTTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJub2VuY2FwLWNzdW0iKSA9PSAwKSB7CisJCQllbmNhcGZsYWdzICY9IH5UVU5ORUxfRU5DQVBfRkxBR19DU1VNOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImVuY2FwLXVkcDYtY3N1bSIpID09IDApIHsKKwkJCWVuY2FwZmxhZ3MgfD0gVFVOTkVMX0VOQ0FQX0ZMQUdfQ1NVTTY7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibm9lbmNhcC11ZHA2LWNzdW0iKSA9PSAwKSB7CisJCQllbmNhcGZsYWdzIHw9IH5UVU5ORUxfRU5DQVBfRkxBR19DU1VNNjsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJlbmNhcC1yZW1jc3VtIikgPT0gMCkgeworCQkJZW5jYXBmbGFncyB8PSBUVU5ORUxfRU5DQVBfRkxBR19SRU1DU1VNOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm5vZW5jYXAtcmVtY3N1bSIpID09IDApIHsKKwkJCWVuY2FwZmxhZ3MgfD0gflRVTk5FTF9FTkNBUF9GTEFHX1JFTUNTVU07CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZXh0ZXJuYWwiKSA9PSAwKSB7CisJCQltZXRhZGF0YSA9IDE7CisJCX0gZWxzZQorCQkJdXNhZ2UoKTsKKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJaWYgKCFpa2V5ICYmIElOX01VTFRJQ0FTVChudG9obChkYWRkcikpKSB7CisJCWlrZXkgPSBkYWRkcjsKKwkJaWZsYWdzIHw9IEdSRV9LRVk7CisJfQorCWlmICghb2tleSAmJiBJTl9NVUxUSUNBU1QobnRvaGwoZGFkZHIpKSkgeworCQlva2V5ID0gZGFkZHI7CisJCW9mbGFncyB8PSBHUkVfS0VZOworCX0KKwlpZiAoSU5fTVVMVElDQVNUKG50b2hsKGRhZGRyKSkgJiYgIXNhZGRyKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQSBicm9hZGNhc3QgdHVubmVsIHJlcXVpcmVzIGEgc291cmNlIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWFkZGF0dHIzMihuLCAxMDI0LCBJRkxBX0dSRV9JS0VZLCBpa2V5KTsKKwlhZGRhdHRyMzIobiwgMTAyNCwgSUZMQV9HUkVfT0tFWSwgb2tleSk7CisJYWRkYXR0cl9sKG4sIDEwMjQsIElGTEFfR1JFX0lGTEFHUywgJmlmbGFncywgMik7CisJYWRkYXR0cl9sKG4sIDEwMjQsIElGTEFfR1JFX09GTEFHUywgJm9mbGFncywgMik7CisJYWRkYXR0cl9sKG4sIDEwMjQsIElGTEFfR1JFX0xPQ0FMLCAmc2FkZHIsIDQpOworCWFkZGF0dHJfbChuLCAxMDI0LCBJRkxBX0dSRV9SRU1PVEUsICZkYWRkciwgNCk7CisJYWRkYXR0cl9sKG4sIDEwMjQsIElGTEFfR1JFX1BNVFVESVNDLCAmcG10dWRpc2MsIDEpOworCWlmIChsaW5rKQorCQlhZGRhdHRyMzIobiwgMTAyNCwgSUZMQV9HUkVfTElOSywgbGluayk7CisJYWRkYXR0cl9sKG4sIDEwMjQsIElGTEFfR1JFX1RUTCwgJnR0bCwgMSk7CisJYWRkYXR0cl9sKG4sIDEwMjQsIElGTEFfR1JFX1RPUywgJnRvcywgMSk7CisKKwlhZGRhdHRyMTYobiwgMTAyNCwgSUZMQV9HUkVfRU5DQVBfVFlQRSwgZW5jYXB0eXBlKTsKKwlhZGRhdHRyMTYobiwgMTAyNCwgSUZMQV9HUkVfRU5DQVBfRkxBR1MsIGVuY2FwZmxhZ3MpOworCWFkZGF0dHIxNihuLCAxMDI0LCBJRkxBX0dSRV9FTkNBUF9TUE9SVCwgaHRvbnMoZW5jYXBzcG9ydCkpOworCWFkZGF0dHIxNihuLCAxMDI0LCBJRkxBX0dSRV9FTkNBUF9EUE9SVCwgaHRvbnMoZW5jYXBkcG9ydCkpOworCWlmIChtZXRhZGF0YSkKKwkJYWRkYXR0cl9sKG4sIDEwMjQsIElGTEFfR1JFX0NPTExFQ1RfTUVUQURBVEEsIE5VTEwsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdyZV9wcmludF9vcHQoc3RydWN0IGxpbmtfdXRpbCAqbHUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKnRiW10pCit7CisJY2hhciBzMVsxMDI0XTsKKwljaGFyIHMyWzY0XTsKKwljb25zdCBjaGFyICpsb2NhbCA9ICJhbnkiOworCWNvbnN0IGNoYXIgKnJlbW90ZSA9ICJhbnkiOworCXVuc2lnbmVkIGlmbGFncyA9IDA7CisJdW5zaWduZWQgb2ZsYWdzID0gMDsKKworCWlmICghdGIpCisJCXJldHVybjsKKworCWlmICh0YltJRkxBX0dSRV9SRU1PVEVdKSB7CisJCXVuc2lnbmVkIGFkZHIgPSBydGFfZ2V0YXR0cl91MzIodGJbSUZMQV9HUkVfUkVNT1RFXSk7CisKKwkJaWYgKGFkZHIpCisJCQlyZW1vdGUgPSBmb3JtYXRfaG9zdChBRl9JTkVULCA0LCAmYWRkciwgczEsIHNpemVvZihzMSkpOworCX0KKworCWZwcmludGYoZiwgInJlbW90ZSAlcyAiLCByZW1vdGUpOworCisJaWYgKHRiW0lGTEFfR1JFX0xPQ0FMXSkgeworCQl1bnNpZ25lZCBhZGRyID0gcnRhX2dldGF0dHJfdTMyKHRiW0lGTEFfR1JFX0xPQ0FMXSk7CisKKwkJaWYgKGFkZHIpCisJCQlsb2NhbCA9IGZvcm1hdF9ob3N0KEFGX0lORVQsIDQsICZhZGRyLCBzMSwgc2l6ZW9mKHMxKSk7CisJfQorCisJZnByaW50ZihmLCAibG9jYWwgJXMgIiwgbG9jYWwpOworCisJaWYgKHRiW0lGTEFfR1JFX0xJTktdICYmIHJ0YV9nZXRhdHRyX3UzMih0YltJRkxBX0dSRV9MSU5LXSkpIHsKKwkJdW5zaWduZWQgbGluayA9IHJ0YV9nZXRhdHRyX3UzMih0YltJRkxBX0dSRV9MSU5LXSk7CisJCWNvbnN0IGNoYXIgKm4gPSBpZl9pbmRleHRvbmFtZShsaW5rLCBzMik7CisKKwkJaWYgKG4pCisJCQlmcHJpbnRmKGYsICJkZXYgJXMgIiwgbik7CisJCWVsc2UKKwkJCWZwcmludGYoZiwgImRldiAldSAiLCBsaW5rKTsKKwl9CisKKwlpZiAodGJbSUZMQV9HUkVfVFRMXSAmJiBydGFfZ2V0YXR0cl91OCh0YltJRkxBX0dSRV9UVExdKSkKKwkJZnByaW50ZihmLCAidHRsICVkICIsIHJ0YV9nZXRhdHRyX3U4KHRiW0lGTEFfR1JFX1RUTF0pKTsKKwllbHNlCisJCWZwcmludGYoZiwgInR0bCBpbmhlcml0ICIpOworCisJaWYgKHRiW0lGTEFfR1JFX1RPU10gJiYgcnRhX2dldGF0dHJfdTgodGJbSUZMQV9HUkVfVE9TXSkpIHsKKwkJaW50IHRvcyA9IHJ0YV9nZXRhdHRyX3U4KHRiW0lGTEFfR1JFX1RPU10pOworCisJCWZwdXRzKCJ0b3MgIiwgZik7CisJCWlmICh0b3MgPT0gMSkKKwkJCWZwdXRzKCJpbmhlcml0ICIsIGYpOworCQllbHNlCisJCQlmcHJpbnRmKGYsICIweCV4ICIsIHRvcyk7CisJfQorCisJaWYgKHRiW0lGTEFfR1JFX1BNVFVESVNDXSAmJgorCSAgICAhcnRhX2dldGF0dHJfdTgodGJbSUZMQV9HUkVfUE1UVURJU0NdKSkKKwkJZnB1dHMoIm5vcG10dWRpc2MgIiwgZik7CisKKwlpZiAodGJbSUZMQV9HUkVfSUZMQUdTXSkKKwkJaWZsYWdzID0gcnRhX2dldGF0dHJfdTE2KHRiW0lGTEFfR1JFX0lGTEFHU10pOworCisJaWYgKHRiW0lGTEFfR1JFX09GTEFHU10pCisJCW9mbGFncyA9IHJ0YV9nZXRhdHRyX3UxNih0YltJRkxBX0dSRV9PRkxBR1NdKTsKKworCWlmICgoaWZsYWdzICYgR1JFX0tFWSkgJiYgdGJbSUZMQV9HUkVfSUtFWV0pIHsKKwkJaW5ldF9udG9wKEFGX0lORVQsIFJUQV9EQVRBKHRiW0lGTEFfR1JFX0lLRVldKSwgczIsIHNpemVvZihzMikpOworCQlmcHJpbnRmKGYsICJpa2V5ICVzICIsIHMyKTsKKwl9CisKKwlpZiAoKG9mbGFncyAmIEdSRV9LRVkpICYmIHRiW0lGTEFfR1JFX09LRVldKSB7CisJCWluZXRfbnRvcChBRl9JTkVULCBSVEFfREFUQSh0YltJRkxBX0dSRV9PS0VZXSksIHMyLCBzaXplb2YoczIpKTsKKwkJZnByaW50ZihmLCAib2tleSAlcyAiLCBzMik7CisJfQorCisJaWYgKGlmbGFncyAmIEdSRV9TRVEpCisJCWZwdXRzKCJpc2VxICIsIGYpOworCWlmIChvZmxhZ3MgJiBHUkVfU0VRKQorCQlmcHV0cygib3NlcSAiLCBmKTsKKwlpZiAoaWZsYWdzICYgR1JFX0NTVU0pCisJCWZwdXRzKCJpY3N1bSAiLCBmKTsKKwlpZiAob2ZsYWdzICYgR1JFX0NTVU0pCisJCWZwdXRzKCJvY3N1bSAiLCBmKTsKKworCWlmICh0YltJRkxBX0dSRV9DT0xMRUNUX01FVEFEQVRBXSkKKwkJZnB1dHMoImV4dGVybmFsICIsIGYpOworCisJaWYgKHRiW0lGTEFfR1JFX0VOQ0FQX1RZUEVdICYmCisJICAgICooX191MTYgKilSVEFfREFUQSh0YltJRkxBX0dSRV9FTkNBUF9UWVBFXSkgIT0gVFVOTkVMX0VOQ0FQX05PTkUpIHsKKwkJX191MTYgdHlwZSA9IHJ0YV9nZXRhdHRyX3UxNih0YltJRkxBX0dSRV9FTkNBUF9UWVBFXSk7CisJCV9fdTE2IGZsYWdzID0gcnRhX2dldGF0dHJfdTE2KHRiW0lGTEFfR1JFX0VOQ0FQX0ZMQUdTXSk7CisJCV9fdTE2IHNwb3J0ID0gcnRhX2dldGF0dHJfdTE2KHRiW0lGTEFfR1JFX0VOQ0FQX1NQT1JUXSk7CisJCV9fdTE2IGRwb3J0ID0gcnRhX2dldGF0dHJfdTE2KHRiW0lGTEFfR1JFX0VOQ0FQX0RQT1JUXSk7CisKKwkJZnB1dHMoImVuY2FwICIsIGYpOworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBUVU5ORUxfRU5DQVBfRk9VOgorCQkJZnB1dHMoImZvdSAiLCBmKTsKKwkJCWJyZWFrOworCQljYXNlIFRVTk5FTF9FTkNBUF9HVUU6CisJCQlmcHV0cygiZ3VlICIsIGYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmcHV0cygidW5rbm93biAiLCBmKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHNwb3J0ID09IDApCisJCQlmcHV0cygiZW5jYXAtc3BvcnQgYXV0byAiLCBmKTsKKwkJZWxzZQorCQkJZnByaW50ZihmLCAiZW5jYXAtc3BvcnQgJXUiLCBudG9ocyhzcG9ydCkpOworCisJCWZwcmludGYoZiwgImVuY2FwLWRwb3J0ICV1ICIsIG50b2hzKGRwb3J0KSk7CisKKwkJaWYgKGZsYWdzICYgVFVOTkVMX0VOQ0FQX0ZMQUdfQ1NVTSkKKwkJCWZwdXRzKCJlbmNhcC1jc3VtICIsIGYpOworCQllbHNlCisJCQlmcHV0cygibm9lbmNhcC1jc3VtICIsIGYpOworCisJCWlmIChmbGFncyAmIFRVTk5FTF9FTkNBUF9GTEFHX0NTVU02KQorCQkJZnB1dHMoImVuY2FwLWNzdW02ICIsIGYpOworCQllbHNlCisJCQlmcHV0cygibm9lbmNhcC1jc3VtNiAiLCBmKTsKKworCQlpZiAoZmxhZ3MgJiBUVU5ORUxfRU5DQVBfRkxBR19SRU1DU1VNKQorCQkJZnB1dHMoImVuY2FwLXJlbWNzdW0gIiwgZik7CisJCWVsc2UKKwkJCWZwdXRzKCJub2VuY2FwLXJlbWNzdW0gIiwgZik7CisJfQorfQorCitzdGF0aWMgdm9pZCBncmVfcHJpbnRfaGVscChzdHJ1Y3QgbGlua191dGlsICpsdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCUZJTEUgKmYpCit7CisJcHJpbnRfdXNhZ2UoZik7Cit9CisKK3N0cnVjdCBsaW5rX3V0aWwgZ3JlX2xpbmtfdXRpbCA9IHsKKwkuaWQgPSAiZ3JlIiwKKwkubWF4YXR0ciA9IElGTEFfR1JFX01BWCwKKwkucGFyc2Vfb3B0ID0gZ3JlX3BhcnNlX29wdCwKKwkucHJpbnRfb3B0ID0gZ3JlX3ByaW50X29wdCwKKwkucHJpbnRfaGVscCA9IGdyZV9wcmludF9oZWxwLAorfTsKKworc3RydWN0IGxpbmtfdXRpbCBncmV0YXBfbGlua191dGlsID0geworCS5pZCA9ICJncmV0YXAiLAorCS5tYXhhdHRyID0gSUZMQV9HUkVfTUFYLAorCS5wYXJzZV9vcHQgPSBncmVfcGFyc2Vfb3B0LAorCS5wcmludF9vcHQgPSBncmVfcHJpbnRfb3B0LAorCS5wcmludF9oZWxwID0gZ3JlX3ByaW50X2hlbHAsCit9OwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaXAvbGlua19ncmU2LmMgYi9pcHJvdXRlMi9pcC9saW5rX2dyZTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDBlYTA5Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaXAvbGlua19ncmU2LmMKQEAgLTAsMCArMSw0MTQgQEAKKy8qCisgKiBsaW5rX2dyZTYuYwlncmUgZHJpdmVyIG1vZHVsZQorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CURtaXRyeSBLb3psb3YgPHhlYkBtYWlsLnJ1PgorICoKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl90dW5uZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pcDZfdHVubmVsLmg+CisKKyNpbmNsdWRlICJydF9uYW1lcy5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiaXBfY29tbW9uLmgiCisjaW5jbHVkZSAidHVubmVsLmgiCisKKyNkZWZpbmUgSVA2X0ZMT1dJTkZPX1RDTEFTUwlodG9ubCgweDBGRjAwMDAwKQorI2RlZmluZSBJUDZfRkxPV0lORk9fRkxPV0xBQkVMCWh0b25sKDB4MDAwRkZGRkYpCisKKyNkZWZpbmUgREVGQVVMVF9UTkxfSE9QX0xJTUlUCSg2NCkKKworc3RhdGljIHZvaWQgcHJpbnRfdXNhZ2UoRklMRSAqZikKK3sKKwlmcHJpbnRmKGYsICJVc2FnZTogaXAgbGluayB7IGFkZCB8IHNldCB8IGNoYW5nZSB8IHJlcGxhY2UgfCBkZWwgfSBOQU1FXG4iKTsKKwlmcHJpbnRmKGYsICIgICAgICAgICAgdHlwZSB7IGlwNmdyZSB8IGlwNmdyZXRhcCB9IFsgcmVtb3RlIEFERFIgXSBbIGxvY2FsIEFERFIgXVxuIik7CisJZnByaW50ZihmLCAiICAgICAgICAgIFsgW2l8b11zZXEgXSBbIFtpfG9da2V5IEtFWSBdIFsgW2l8b11jc3VtIF1cbiIpOworCWZwcmludGYoZiwgIiAgICAgICAgICBbIGhvcGxpbWl0IFRUTCBdIFsgZW5jYXBsaW1pdCBFTElNIF1cbiIpOworCWZwcmludGYoZiwgIiAgICAgICAgICBbIHRjbGFzcyBUQ0xBU1MgXSBbIGZsb3dsYWJlbCBGTE9XTEFCRUwgXVxuIik7CisJZnByaW50ZihmLCAiICAgICAgICAgIFsgZHNjcCBpbmhlcml0IF0gWyBkZXYgUEhZU19ERVYgXVxuIik7CisJZnByaW50ZihmLCAiXG4iKTsKKwlmcHJpbnRmKGYsICJXaGVyZTogTkFNRSAgICAgIDo9IFNUUklOR1xuIik7CisJZnByaW50ZihmLCAiICAgICAgIEFERFIgICAgICA6PSBJUFY2X0FERFJFU1NcbiIpOworCWZwcmludGYoZiwgIiAgICAgICBUVEwgICAgICAgOj0geyAwLi4yNTUgfSAoZGVmYXVsdD0lZClcbiIsCisJCURFRkFVTFRfVE5MX0hPUF9MSU1JVCk7CisJZnByaW50ZihmLCAiICAgICAgIEtFWSAgICAgICA6PSB7IERPVFRFRF9RVUFEIHwgTlVNQkVSIH1cbiIpOworCWZwcmludGYoZiwgIiAgICAgICBFTElNICAgICAgOj0geyBub25lIHwgMC4uMjU1IH0oZGVmYXVsdD0lZClcbiIsCisJCUlQVjZfREVGQVVMVF9UTkxfRU5DQVBfTElNSVQpOworCWZwcmludGYoZiwgIiAgICAgICBUQ0xBU1MgICAgOj0geyAweDAuLjB4ZmYgfCBpbmhlcml0IH1cbiIpOworCWZwcmludGYoZiwgIiAgICAgICBGTE9XTEFCRUwgOj0geyAweDAuLjB4ZmZmZmYgfCBpbmhlcml0IH1cbiIpOworfQorCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlwcmludF91c2FnZShzdGRlcnIpOworCWV4aXQoLTEpOworfQorCitzdGF0aWMgaW50IGdyZV9wYXJzZV9vcHQoc3RydWN0IGxpbmtfdXRpbCAqbHUsIGludCBhcmdjLCBjaGFyICoqYXJndiwKKwkJCSBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyIG47CisJCXN0cnVjdCBpZmluZm9tc2cgaTsKKwkJY2hhciBidWZbMTAyNF07CisJfSByZXE7CisJc3RydWN0IGlmaW5mb21zZyAqaWZpID0gKHN0cnVjdCBpZmluZm9tc2cgKikobiArIDEpOworCXN0cnVjdCBydGF0dHIgKnRiW0lGTEFfTUFYICsgMV07CisJc3RydWN0IHJ0YXR0ciAqbGlua2luZm9bSUZMQV9JTkZPX01BWCsxXTsKKwlzdHJ1Y3QgcnRhdHRyICpncmVpbmZvW0lGTEFfR1JFX01BWCArIDFdOworCV9fdTE2IGlmbGFncyA9IDA7CisJX191MTYgb2ZsYWdzID0gMDsKKwl1bnNpZ25lZCBpa2V5ID0gMDsKKwl1bnNpZ25lZCBva2V5ID0gMDsKKwlzdHJ1Y3QgaW42X2FkZHIgcmFkZHIgPSBJTjZBRERSX0FOWV9JTklUOworCXN0cnVjdCBpbjZfYWRkciBsYWRkciA9IElONkFERFJfQU5ZX0lOSVQ7CisJdW5zaWduZWQgbGluayA9IDA7CisJdW5zaWduZWQgZmxvd2luZm8gPSAwOworCXVuc2lnbmVkIGZsYWdzID0gMDsKKwlfX3U4IGhvcF9saW1pdCA9IERFRkFVTFRfVE5MX0hPUF9MSU1JVDsKKwlfX3U4IGVuY2FwX2xpbWl0ID0gSVBWNl9ERUZBVUxUX1ROTF9FTkNBUF9MSU1JVDsKKwlpbnQgbGVuOworCisJaWYgKCEobi0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9DUkVBVEUpKSB7CisJCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisKKwkJcmVxLm4ubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZigqaWZpKSk7CisJCXJlcS5uLm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVDsKKwkJcmVxLm4ubmxtc2dfdHlwZSA9IFJUTV9HRVRMSU5LOworCQlyZXEuaS5pZmlfZmFtaWx5ID0gcHJlZmVycmVkX2ZhbWlseTsKKwkJcmVxLmkuaWZpX2luZGV4ID0gaWZpLT5pZmlfaW5kZXg7CisKKwkJaWYgKHJ0bmxfdGFsaygmcnRoLCAmcmVxLm4sICZyZXEubiwgc2l6ZW9mKHJlcSkpIDwgMCkgeworZ2V0X2ZhaWxlZDoKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJGYWlsZWQgdG8gZ2V0IGV4aXN0aW5nIHR1bm5lbCBpbmZvLlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlsZW4gPSByZXEubi5ubG1zZ19sZW47CisJCWxlbiAtPSBOTE1TR19MRU5HVEgoc2l6ZW9mKCppZmkpKTsKKwkJaWYgKGxlbiA8IDApCisJCQlnb3RvIGdldF9mYWlsZWQ7CisKKwkJcGFyc2VfcnRhdHRyKHRiLCBJRkxBX01BWCwgSUZMQV9SVEEoJnJlcS5pKSwgbGVuKTsKKworCQlpZiAoIXRiW0lGTEFfTElOS0lORk9dKQorCQkJZ290byBnZXRfZmFpbGVkOworCisJCXBhcnNlX3J0YXR0cl9uZXN0ZWQobGlua2luZm8sIElGTEFfSU5GT19NQVgsIHRiW0lGTEFfTElOS0lORk9dKTsKKworCQlpZiAoIWxpbmtpbmZvW0lGTEFfSU5GT19EQVRBXSkKKwkJCWdvdG8gZ2V0X2ZhaWxlZDsKKworCQlwYXJzZV9ydGF0dHJfbmVzdGVkKGdyZWluZm8sIElGTEFfR1JFX01BWCwKKwkJCQkgICAgbGlua2luZm9bSUZMQV9JTkZPX0RBVEFdKTsKKworCQlpZiAoZ3JlaW5mb1tJRkxBX0dSRV9JS0VZXSkKKwkJCWlrZXkgPSBydGFfZ2V0YXR0cl91MzIoZ3JlaW5mb1tJRkxBX0dSRV9JS0VZXSk7CisKKwkJaWYgKGdyZWluZm9bSUZMQV9HUkVfT0tFWV0pCisJCQlva2V5ID0gcnRhX2dldGF0dHJfdTMyKGdyZWluZm9bSUZMQV9HUkVfT0tFWV0pOworCisJCWlmIChncmVpbmZvW0lGTEFfR1JFX0lGTEFHU10pCisJCQlpZmxhZ3MgPSBydGFfZ2V0YXR0cl91MTYoZ3JlaW5mb1tJRkxBX0dSRV9JRkxBR1NdKTsKKworCQlpZiAoZ3JlaW5mb1tJRkxBX0dSRV9PRkxBR1NdKQorCQkJb2ZsYWdzID0gcnRhX2dldGF0dHJfdTE2KGdyZWluZm9bSUZMQV9HUkVfT0ZMQUdTXSk7CisKKwkJaWYgKGdyZWluZm9bSUZMQV9HUkVfTE9DQUxdKQorCQkJbWVtY3B5KCZsYWRkciwgUlRBX0RBVEEoZ3JlaW5mb1tJRkxBX0dSRV9MT0NBTF0pLCBzaXplb2YobGFkZHIpKTsKKworCQlpZiAoZ3JlaW5mb1tJRkxBX0dSRV9SRU1PVEVdKQorCQkJbWVtY3B5KCZyYWRkciwgUlRBX0RBVEEoZ3JlaW5mb1tJRkxBX0dSRV9SRU1PVEVdKSwgc2l6ZW9mKHJhZGRyKSk7CisKKwkJaWYgKGdyZWluZm9bSUZMQV9HUkVfVFRMXSkKKwkJCWhvcF9saW1pdCA9IHJ0YV9nZXRhdHRyX3U4KGdyZWluZm9bSUZMQV9HUkVfVFRMXSk7CisKKwkJaWYgKGdyZWluZm9bSUZMQV9HUkVfTElOS10pCisJCQlsaW5rID0gcnRhX2dldGF0dHJfdTMyKGdyZWluZm9bSUZMQV9HUkVfTElOS10pOworCisJCWlmIChncmVpbmZvW0lGTEFfR1JFX0VOQ0FQX0xJTUlUXSkKKwkJCWVuY2FwX2xpbWl0ID0gcnRhX2dldGF0dHJfdTgoZ3JlaW5mb1tJRkxBX0dSRV9FTkNBUF9MSU1JVF0pOworCisJCWlmIChncmVpbmZvW0lGTEFfR1JFX0ZMT1dJTkZPXSkKKwkJCWZsb3dpbmZvID0gcnRhX2dldGF0dHJfdTMyKGdyZWluZm9bSUZMQV9HUkVfRkxPV0lORk9dKTsKKworCQlpZiAoZ3JlaW5mb1tJRkxBX0dSRV9GTEFHU10pCisJCQlmbGFncyA9IHJ0YV9nZXRhdHRyX3UzMihncmVpbmZvW0lGTEFfR1JFX0ZMQUdTXSk7CisJfQorCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmICghbWF0Y2hlcygqYXJndiwgImtleSIpKSB7CisJCQl1bnNpZ25lZCB1dmFsOworCisJCQlORVhUX0FSRygpOworCQkJaWZsYWdzIHw9IEdSRV9LRVk7CisJCQlvZmxhZ3MgfD0gR1JFX0tFWTsKKwkJCWlmIChzdHJjaHIoKmFyZ3YsICcuJykpCisJCQkJdXZhbCA9IGdldF9hZGRyMzIoKmFyZ3YpOworCQkJZWxzZSB7CisJCQkJaWYgKGdldF91bnNpZ25lZCgmdXZhbCwgKmFyZ3YsIDApIDwgMCkgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJCSJJbnZhbGlkIHZhbHVlIGZvciBcImtleVwiXG4iKTsKKwkJCQkJZXhpdCgtMSk7CisJCQkJfQorCQkJCXV2YWwgPSBodG9ubCh1dmFsKTsKKwkJCX0KKworCQkJaWtleSA9IG9rZXkgPSB1dmFsOworCQl9IGVsc2UgaWYgKCFtYXRjaGVzKCphcmd2LCAiaWtleSIpKSB7CisJCQl1bnNpZ25lZCB1dmFsOworCisJCQlORVhUX0FSRygpOworCQkJaWZsYWdzIHw9IEdSRV9LRVk7CisJCQlpZiAoc3RyY2hyKCphcmd2LCAnLicpKQorCQkJCXV2YWwgPSBnZXRfYWRkcjMyKCphcmd2KTsKKwkJCWVsc2UgeworCQkJCWlmIChnZXRfdW5zaWduZWQoJnV2YWwsICphcmd2LCAwKTwwKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiaW52YWxpZCB2YWx1ZSBvZiBcImlrZXlcIlxuIik7CisJCQkJCWV4aXQoLTEpOworCQkJCX0KKwkJCQl1dmFsID0gaHRvbmwodXZhbCk7CisJCQl9CisJCQlpa2V5ID0gdXZhbDsKKwkJfSBlbHNlIGlmICghbWF0Y2hlcygqYXJndiwgIm9rZXkiKSkgeworCQkJdW5zaWduZWQgdXZhbDsKKworCQkJTkVYVF9BUkcoKTsKKwkJCW9mbGFncyB8PSBHUkVfS0VZOworCQkJaWYgKHN0cmNocigqYXJndiwgJy4nKSkKKwkJCQl1dmFsID0gZ2V0X2FkZHIzMigqYXJndik7CisJCQllbHNlIHsKKwkJCQlpZiAoZ2V0X3Vuc2lnbmVkKCZ1dmFsLCAqYXJndiwgMCk8MCkgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgdmFsdWUgb2YgXCJva2V5XCJcbiIpOworCQkJCQlleGl0KC0xKTsKKwkJCQl9CisJCQkJdXZhbCA9IGh0b25sKHV2YWwpOworCQkJfQorCQkJb2tleSA9IHV2YWw7CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJzZXEiKSkgeworCQkJaWZsYWdzIHw9IEdSRV9TRVE7CisJCQlvZmxhZ3MgfD0gR1JFX1NFUTsKKwkJfSBlbHNlIGlmICghbWF0Y2hlcygqYXJndiwgImlzZXEiKSkgeworCQkJaWZsYWdzIHw9IEdSRV9TRVE7CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJvc2VxIikpIHsKKwkJCW9mbGFncyB8PSBHUkVfU0VROworCQl9IGVsc2UgaWYgKCFtYXRjaGVzKCphcmd2LCAiY3N1bSIpKSB7CisJCQlpZmxhZ3MgfD0gR1JFX0NTVU07CisJCQlvZmxhZ3MgfD0gR1JFX0NTVU07CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJpY3N1bSIpKSB7CisJCQlpZmxhZ3MgfD0gR1JFX0NTVU07CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJvY3N1bSIpKSB7CisJCQlvZmxhZ3MgfD0gR1JFX0NTVU07CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJyZW1vdGUiKSkgeworCQkJaW5ldF9wcmVmaXggYWRkcjsKKwkJCU5FWFRfQVJHKCk7CisJCQlnZXRfcHJlZml4KCZhZGRyLCAqYXJndiwgcHJlZmVycmVkX2ZhbWlseSk7CisJCQlpZiAoYWRkci5mYW1pbHkgPT0gQUZfVU5TUEVDKQorCQkJCWludmFyZygiXCJyZW1vdGVcIiBhZGRyZXNzIGZhbWlseSBpcyBBRl9VTlNQRUMiLCAqYXJndik7CisJCQltZW1jcHkoJnJhZGRyLCAmYWRkci5kYXRhLCBzaXplb2YocmFkZHIpKTsKKwkJfSBlbHNlIGlmICghbWF0Y2hlcygqYXJndiwgImxvY2FsIikpIHsKKwkJCWluZXRfcHJlZml4IGFkZHI7CisJCQlORVhUX0FSRygpOworCQkJZ2V0X3ByZWZpeCgmYWRkciwgKmFyZ3YsIHByZWZlcnJlZF9mYW1pbHkpOworCQkJaWYgKGFkZHIuZmFtaWx5ID09IEFGX1VOU1BFQykKKwkJCQlpbnZhcmcoIlwibG9jYWxcIiBhZGRyZXNzIGZhbWlseSBpcyBBRl9VTlNQRUMiLCAqYXJndik7CisJCQltZW1jcHkoJmxhZGRyLCAmYWRkci5kYXRhLCBzaXplb2YobGFkZHIpKTsKKwkJfSBlbHNlIGlmICghbWF0Y2hlcygqYXJndiwgImRldiIpKSB7CisJCQlORVhUX0FSRygpOworCQkJbGluayA9IGlmX25hbWV0b2luZGV4KCphcmd2KTsKKwkJCWlmIChsaW5rID09IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBmaW5kIGRldmljZSBcIiVzXCJcbiIsCisJCQkJCSphcmd2KTsKKwkJCQlleGl0KC0xKTsKKwkJCX0KKwkJfSBlbHNlIGlmICghbWF0Y2hlcygqYXJndiwgInR0bCIpIHx8CisJCQkgICAhbWF0Y2hlcygqYXJndiwgImhvcGxpbWl0IikpIHsKKwkJCV9fdTggdXZhbDsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3U4KCZ1dmFsLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJpbnZhbGlkIFRUTCIsICphcmd2KTsKKwkJCWhvcF9saW1pdCA9IHV2YWw7CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJ0b3MiKSB8fAorCQkJICAgIW1hdGNoZXMoKmFyZ3YsICJ0Y2xhc3MiKSB8fAorCQkJICAgIW1hdGNoZXMoKmFyZ3YsICJkc2ZpZWxkIikpIHsKKwkJCV9fdTggdXZhbDsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoc3RyY21wKCphcmd2LCAiaW5oZXJpdCIpID09IDApCisJCQkJZmxhZ3MgfD0gSVA2X1ROTF9GX1VTRV9PUklHX1RDTEFTUzsKKwkJCWVsc2UgeworCQkJCWlmIChnZXRfdTgoJnV2YWwsICphcmd2LCAxNikpCisJCQkJCWludmFyZygiaW52YWxpZCBUQ2xhc3MiLCAqYXJndik7CisJCQkJZmxvd2luZm8gfD0gaHRvbmwoKF9fdTMyKXV2YWwgPDwgMjApICYgSVA2X0ZMT1dJTkZPX1RDTEFTUzsKKwkJCQlmbGFncyAmPSB+SVA2X1ROTF9GX1VTRV9PUklHX1RDTEFTUzsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJmbG93bGFiZWwiKSA9PSAwIHx8CisJCQkgICBzdHJjbXAoKmFyZ3YsICJmbCIpID09IDApIHsKKwkJCV9fdTMyIHV2YWw7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHN0cmNtcCgqYXJndiwgImluaGVyaXQiKSA9PSAwKQorCQkJCWZsYWdzIHw9IElQNl9UTkxfRl9VU0VfT1JJR19GTE9XTEFCRUw7CisJCQllbHNlIHsKKwkJCQlpZiAoZ2V0X3UzMigmdXZhbCwgKmFyZ3YsIDE2KSkKKwkJCQkJaW52YXJnKCJpbnZhbGlkIEZsb3dsYWJlbCIsICphcmd2KTsKKwkJCQlpZiAodXZhbCA+IDB4RkZGRkYpCisJCQkJCWludmFyZygiaW52YWxpZCBGbG93bGFiZWwiLCAqYXJndik7CisJCQkJZmxvd2luZm8gfD0gaHRvbmwodXZhbCkgJiBJUDZfRkxPV0lORk9fRkxPV0xBQkVMOworCQkJCWZsYWdzICY9IH5JUDZfVE5MX0ZfVVNFX09SSUdfRkxPV0xBQkVMOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImRzY3AiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHN0cmNtcCgqYXJndiwgImluaGVyaXQiKSAhPSAwKQorCQkJCWludmFyZygibm90IGluaGVyaXQiLCAqYXJndik7CisJCQlmbGFncyB8PSBJUDZfVE5MX0ZfUkNWX0RTQ1BfQ09QWTsKKwkJfSBlbHNlCisJCQl1c2FnZSgpOworCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisKKwlhZGRhdHRyMzIobiwgMTAyNCwgSUZMQV9HUkVfSUtFWSwgaWtleSk7CisJYWRkYXR0cjMyKG4sIDEwMjQsIElGTEFfR1JFX09LRVksIG9rZXkpOworCWFkZGF0dHJfbChuLCAxMDI0LCBJRkxBX0dSRV9JRkxBR1MsICZpZmxhZ3MsIDIpOworCWFkZGF0dHJfbChuLCAxMDI0LCBJRkxBX0dSRV9PRkxBR1MsICZvZmxhZ3MsIDIpOworCWFkZGF0dHJfbChuLCAxMDI0LCBJRkxBX0dSRV9MT0NBTCwgJmxhZGRyLCBzaXplb2YobGFkZHIpKTsKKwlhZGRhdHRyX2wobiwgMTAyNCwgSUZMQV9HUkVfUkVNT1RFLCAmcmFkZHIsIHNpemVvZihyYWRkcikpOworCWlmIChsaW5rKQorCQlhZGRhdHRyMzIobiwgMTAyNCwgSUZMQV9HUkVfTElOSywgbGluayk7CisJYWRkYXR0cl9sKG4sIDEwMjQsIElGTEFfR1JFX1RUTCwgJmhvcF9saW1pdCwgMSk7CisJYWRkYXR0cl9sKG4sIDEwMjQsIElGTEFfR1JFX0VOQ0FQX0xJTUlULCAmZW5jYXBfbGltaXQsIDEpOworCWFkZGF0dHJfbChuLCAxMDI0LCBJRkxBX0dSRV9GTE9XSU5GTywgJmZsb3dpbmZvLCA0KTsKKwlhZGRhdHRyX2wobiwgMTAyNCwgSUZMQV9HUkVfRkxBR1MsICZmbG93aW5mbywgNCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ3JlX3ByaW50X29wdChzdHJ1Y3QgbGlua191dGlsICpsdSwgRklMRSAqZiwgc3RydWN0IHJ0YXR0ciAqdGJbXSkKK3sKKwljaGFyIHMxWzEwMjRdOworCWNoYXIgczJbNjRdOworCWNvbnN0IGNoYXIgKmxvY2FsID0gImFueSI7CisJY29uc3QgY2hhciAqcmVtb3RlID0gImFueSI7CisJdW5zaWduZWQgaWZsYWdzID0gMDsKKwl1bnNpZ25lZCBvZmxhZ3MgPSAwOworCXVuc2lnbmVkIGZsYWdzID0gMDsKKwl1bnNpZ25lZCBmbG93aW5mbyA9IDA7CisJc3RydWN0IGluNl9hZGRyIGluNl9hZGRyX2FueSA9IElONkFERFJfQU5ZX0lOSVQ7CisKKwlpZiAoIXRiKQorCQlyZXR1cm47CisKKwlpZiAodGJbSUZMQV9HUkVfRkxBR1NdKQorCQlmbGFncyA9IHJ0YV9nZXRhdHRyX3UzMih0YltJRkxBX0dSRV9GTEFHU10pOworCisJaWYgKHRiW0lGTEFfR1JFX0ZMT1dJTkZPXSkKKwkJZmxhZ3MgPSBydGFfZ2V0YXR0cl91MzIodGJbSUZMQV9HUkVfRkxPV0lORk9dKTsKKworCWlmICh0YltJRkxBX0dSRV9SRU1PVEVdKSB7CisJCXN0cnVjdCBpbjZfYWRkciBhZGRyOworCQltZW1jcHkoJmFkZHIsIFJUQV9EQVRBKHRiW0lGTEFfR1JFX1JFTU9URV0pLCBzaXplb2YoYWRkcikpOworCisJCWlmIChtZW1jbXAoJmFkZHIsICZpbjZfYWRkcl9hbnksIHNpemVvZihhZGRyKSkpCisJCQlyZW1vdGUgPSBmb3JtYXRfaG9zdChBRl9JTkVUNiwgc2l6ZW9mKGFkZHIpLCAmYWRkciwgczEsIHNpemVvZihzMSkpOworCX0KKworCWZwcmludGYoZiwgInJlbW90ZSAlcyAiLCByZW1vdGUpOworCisJaWYgKHRiW0lGTEFfR1JFX0xPQ0FMXSkgeworCQlzdHJ1Y3QgaW42X2FkZHIgYWRkcjsKKwkJbWVtY3B5KCZhZGRyLCBSVEFfREFUQSh0YltJRkxBX0dSRV9MT0NBTF0pLCBzaXplb2YoYWRkcikpOworCisJCWlmIChtZW1jbXAoJmFkZHIsICZpbjZfYWRkcl9hbnksIHNpemVvZihhZGRyKSkpCisJCQlsb2NhbCA9IGZvcm1hdF9ob3N0KEFGX0lORVQ2LCBzaXplb2YoYWRkciksICZhZGRyLCBzMSwgc2l6ZW9mKHMxKSk7CisJfQorCisJZnByaW50ZihmLCAibG9jYWwgJXMgIiwgbG9jYWwpOworCisJaWYgKHRiW0lGTEFfR1JFX0xJTktdICYmIHJ0YV9nZXRhdHRyX3UzMih0YltJRkxBX0dSRV9MSU5LXSkpIHsKKwkJdW5zaWduZWQgbGluayA9IHJ0YV9nZXRhdHRyX3UzMih0YltJRkxBX0dSRV9MSU5LXSk7CisJCWNvbnN0IGNoYXIgKm4gPSBpZl9pbmRleHRvbmFtZShsaW5rLCBzMik7CisKKwkJaWYgKG4pCisJCQlmcHJpbnRmKGYsICJkZXYgJXMgIiwgbik7CisJCWVsc2UKKwkJCWZwcmludGYoZiwgImRldiAldSAiLCBsaW5rKTsKKwl9CisKKwlpZiAodGJbSUZMQV9HUkVfVFRMXSAmJiBydGFfZ2V0YXR0cl91OCh0YltJRkxBX0dSRV9UVExdKSkKKwkJZnByaW50ZihmLCAiaG9wbGltaXQgJWQgIiwgcnRhX2dldGF0dHJfdTgodGJbSUZMQV9HUkVfVFRMXSkpOworCisJaWYgKGZsYWdzICYgSVA2X1ROTF9GX0lHTl9FTkNBUF9MSU1JVCkKKwkJZnByaW50ZihmLCAiZW5jYXBsaW1pdCBub25lICIpOworCWVsc2UgaWYgKHRiW0lGTEFfR1JFX0VOQ0FQX0xJTUlUXSkgeworCQlpbnQgZW5jYXBfbGltaXQgPSBydGFfZ2V0YXR0cl91OCh0YltJRkxBX0dSRV9FTkNBUF9MSU1JVF0pOworCisJCWZwcmludGYoZiwgImVuY2FwbGltaXQgJWQgIiwgZW5jYXBfbGltaXQpOworCX0KKworCWlmIChmbGFncyAmIElQNl9UTkxfRl9VU0VfT1JJR19GTE9XTEFCRUwpCisJCWZwcmludGYoZiwgImZsb3dsYWJlbCBpbmhlcml0ICIpOworCWVsc2UKKwkJZnByaW50ZihmLCAiZmxvd2xhYmVsIDB4JTA1eCAiLCBudG9obChmbG93aW5mbyAmIElQNl9GTE9XSU5GT19GTE9XTEFCRUwpKTsKKworCWlmIChmbGFncyAmIElQNl9UTkxfRl9SQ1ZfRFNDUF9DT1BZKQorCQlmcHJpbnRmKGYsICJkc2NwIGluaGVyaXQgIik7CisKKwlpZiAodGJbSUZMQV9HUkVfSUZMQUdTXSkKKwkJaWZsYWdzID0gcnRhX2dldGF0dHJfdTE2KHRiW0lGTEFfR1JFX0lGTEFHU10pOworCisJaWYgKHRiW0lGTEFfR1JFX09GTEFHU10pCisJCW9mbGFncyA9IHJ0YV9nZXRhdHRyX3UxNih0YltJRkxBX0dSRV9PRkxBR1NdKTsKKworCWlmICgoaWZsYWdzICYgR1JFX0tFWSkgJiYgdGJbSUZMQV9HUkVfSUtFWV0pIHsKKwkJaW5ldF9udG9wKEFGX0lORVQsIFJUQV9EQVRBKHRiW0lGTEFfR1JFX0lLRVldKSwgczIsIHNpemVvZihzMikpOworCQlmcHJpbnRmKGYsICJpa2V5ICVzICIsIHMyKTsKKwl9CisKKwlpZiAoKG9mbGFncyAmIEdSRV9LRVkpICYmIHRiW0lGTEFfR1JFX09LRVldKSB7CisJCWluZXRfbnRvcChBRl9JTkVULCBSVEFfREFUQSh0YltJRkxBX0dSRV9PS0VZXSksIHMyLCBzaXplb2YoczIpKTsKKwkJZnByaW50ZihmLCAib2tleSAlcyAiLCBzMik7CisJfQorCisJaWYgKGlmbGFncyAmIEdSRV9TRVEpCisJCWZwdXRzKCJpc2VxICIsIGYpOworCWlmIChvZmxhZ3MgJiBHUkVfU0VRKQorCQlmcHV0cygib3NlcSAiLCBmKTsKKwlpZiAoaWZsYWdzICYgR1JFX0NTVU0pCisJCWZwdXRzKCJpY3N1bSAiLCBmKTsKKwlpZiAob2ZsYWdzICYgR1JFX0NTVU0pCisJCWZwdXRzKCJvY3N1bSAiLCBmKTsKK30KKworc3RhdGljIHZvaWQgZ3JlX3ByaW50X2hlbHAoc3RydWN0IGxpbmtfdXRpbCAqbHUsIGludCBhcmdjLCBjaGFyICoqYXJndiwKKwlGSUxFICpmKQoreworCXByaW50X3VzYWdlKGYpOworfQorCitzdHJ1Y3QgbGlua191dGlsIGlwNmdyZV9saW5rX3V0aWwgPSB7CisJLmlkID0gImlwNmdyZSIsCisJLm1heGF0dHIgPSBJRkxBX0dSRV9NQVgsCisJLnBhcnNlX29wdCA9IGdyZV9wYXJzZV9vcHQsCisJLnByaW50X29wdCA9IGdyZV9wcmludF9vcHQsCisJLnByaW50X2hlbHAgPSBncmVfcHJpbnRfaGVscCwKK307CisKK3N0cnVjdCBsaW5rX3V0aWwgaXA2Z3JldGFwX2xpbmtfdXRpbCA9IHsKKwkuaWQgPSAiaXA2Z3JldGFwIiwKKwkubWF4YXR0ciA9IElGTEFfR1JFX01BWCwKKwkucGFyc2Vfb3B0ID0gZ3JlX3BhcnNlX29wdCwKKwkucHJpbnRfb3B0ID0gZ3JlX3ByaW50X29wdCwKKwkucHJpbnRfaGVscCA9IGdyZV9wcmludF9oZWxwLAorfTsKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2lwL2xpbmtfaXA2dG5sLmMgYi9pcHJvdXRlMi9pcC9saW5rX2lwNnRubC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NzFjNzUKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pcC9saW5rX2lwNnRubC5jCkBAIC0wLDAgKzEsMzU3IEBACisvKgorICogbGlua19pcDZ0bmwuYwlpcDZ0bmwgZHJpdmVyIG1vZHVsZQorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CU5pY29sYXMgRGljaHRlbCA8bmljb2xhcy5kaWNodGVsQDZ3aW5kLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdHVubmVsLmg+CisjaW5jbHVkZSA8bGludXgvaXA2X3R1bm5lbC5oPgorI2luY2x1ZGUgInJ0X25hbWVzLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJpcF9jb21tb24uaCIKKyNpbmNsdWRlICJ0dW5uZWwuaCIKKworI2RlZmluZSBJUDZfRkxPV0lORk9fVENMQVNTCWh0b25sKDB4MEZGMDAwMDApCisjZGVmaW5lIElQNl9GTE9XSU5GT19GTE9XTEFCRUwJaHRvbmwoMHgwMDBGRkZGRikKKworI2RlZmluZSBERUZBVUxUX1ROTF9IT1BfTElNSVQJKDY0KQorCitzdGF0aWMgdm9pZCBwcmludF91c2FnZShGSUxFICpmKQoreworCWZwcmludGYoZiwgIlVzYWdlOiBpcCBsaW5rIHsgYWRkIHwgc2V0IHwgY2hhbmdlIHwgcmVwbGFjZSB8IGRlbCB9IE5BTUVcbiIpOworCWZwcmludGYoZiwgIiAgICAgICAgICBbIG1vZGUgeyBpcDZpcDYgfCBpcGlwNiB8IGFueSB9IF1cbiIpOworCWZwcmludGYoZiwgIiAgICAgICAgICB0eXBlIGlwNnRubCBbIHJlbW90ZSBBRERSIF0gWyBsb2NhbCBBRERSIF1cbiIpOworCWZwcmludGYoZiwgIiAgICAgICAgICBbIGRldiBQSFlTX0RFViBdIFsgZW5jYXBsaW1pdCBFTElNIF1cbiIpOworCWZwcmludGYoZiAsIiAgICAgICAgICBbIGhvcGxpbWl0IEhMSU0gXSBbIHRjbGFzcyBUQ0xBU1MgXSBbIGZsb3dsYWJlbCBGTE9XTEFCRUwgXVxuIik7CisJZnByaW50ZihmLCAiICAgICAgICAgIFsgZHNjcCBpbmhlcml0IF0gWyBmd21hcmsgaW5oZXJpdCBdXG4iKTsKKwlmcHJpbnRmKGYsICJcbiIpOworCWZwcmludGYoZiwgIldoZXJlOiBOQU1FICAgICAgOj0gU1RSSU5HXG4iKTsKKwlmcHJpbnRmKGYsICIgICAgICAgQUREUiAgICAgIDo9IElQVjZfQUREUkVTU1xuIik7CisJZnByaW50ZihmLCAiICAgICAgIEVMSU0gICAgICA6PSB7IG5vbmUgfCAwLi4yNTUgfShkZWZhdWx0PSVkKVxuIiwKKwkJSVBWNl9ERUZBVUxUX1ROTF9FTkNBUF9MSU1JVCk7CisJZnByaW50ZihmLCAiICAgICAgIEhMSU0gICAgICA6PSAwLi4yNTUgKGRlZmF1bHQ9JWQpXG4iLAorCQlERUZBVUxUX1ROTF9IT1BfTElNSVQpOworCWZwcmludGYoZiwgIiAgICAgICBUQ0xBU1MgICAgOj0geyAweDAuLjB4ZmYgfCBpbmhlcml0IH1cbiIpOworCWZwcmludGYoZiwgIiAgICAgICBGTE9XTEFCRUwgOj0geyAweDAuLjB4ZmZmZmYgfCBpbmhlcml0IH1cbiIpOworfQorCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlwcmludF91c2FnZShzdGRlcnIpOworCWV4aXQoLTEpOworfQorCitzdGF0aWMgaW50IGlwNnR1bm5lbF9wYXJzZV9vcHQoc3RydWN0IGxpbmtfdXRpbCAqbHUsIGludCBhcmdjLCBjaGFyICoqYXJndiwKKwkJCSAgICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyIG47CisJCXN0cnVjdCBpZmluZm9tc2cgaTsKKwkJY2hhciBidWZbMjA0OF07CisJfSByZXE7CisJc3RydWN0IGlmaW5mb21zZyAqaWZpID0gKHN0cnVjdCBpZmluZm9tc2cgKikobiArIDEpOworCXN0cnVjdCBydGF0dHIgKnRiW0lGTEFfTUFYICsgMV07CisJc3RydWN0IHJ0YXR0ciAqbGlua2luZm9bSUZMQV9JTkZPX01BWCsxXTsKKwlzdHJ1Y3QgcnRhdHRyICppcHR1bmluZm9bSUZMQV9JUFRVTl9NQVggKyAxXTsKKwlpbnQgbGVuOworCXN0cnVjdCBpbjZfYWRkciBsYWRkcjsKKwlzdHJ1Y3QgaW42X2FkZHIgcmFkZHI7CisJX191OCBob3BfbGltaXQgPSBERUZBVUxUX1ROTF9IT1BfTElNSVQ7CisJX191OCBlbmNhcF9saW1pdCA9IElQVjZfREVGQVVMVF9UTkxfRU5DQVBfTElNSVQ7CisJX191MzIgZmxvd2luZm8gPSAwOworCV9fdTMyIGZsYWdzID0gMDsKKwlfX3UzMiBsaW5rID0gMDsKKwlfX3U4IHByb3RvID0gMDsKKworCW1lbXNldCgmbGFkZHIsIDAsIHNpemVvZihsYWRkcikpOworCW1lbXNldCgmcmFkZHIsIDAsIHNpemVvZihyYWRkcikpOworCisJaWYgKCEobi0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9DUkVBVEUpKSB7CisJCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisKKwkJcmVxLm4ubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZigqaWZpKSk7CisJCXJlcS5uLm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVDsKKwkJcmVxLm4ubmxtc2dfdHlwZSA9IFJUTV9HRVRMSU5LOworCQlyZXEuaS5pZmlfZmFtaWx5ID0gcHJlZmVycmVkX2ZhbWlseTsKKwkJcmVxLmkuaWZpX2luZGV4ID0gaWZpLT5pZmlfaW5kZXg7CisKKwkJaWYgKHJ0bmxfdGFsaygmcnRoLCAmcmVxLm4sICZyZXEubiwgc2l6ZW9mKHJlcSkpIDwgMCkgeworZ2V0X2ZhaWxlZDoKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJGYWlsZWQgdG8gZ2V0IGV4aXN0aW5nIHR1bm5lbCBpbmZvLlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlsZW4gPSByZXEubi5ubG1zZ19sZW47CisJCWxlbiAtPSBOTE1TR19MRU5HVEgoc2l6ZW9mKCppZmkpKTsKKwkJaWYgKGxlbiA8IDApCisJCQlnb3RvIGdldF9mYWlsZWQ7CisKKwkJcGFyc2VfcnRhdHRyKHRiLCBJRkxBX01BWCwgSUZMQV9SVEEoJnJlcS5pKSwgbGVuKTsKKworCQlpZiAoIXRiW0lGTEFfTElOS0lORk9dKQorCQkJZ290byBnZXRfZmFpbGVkOworCisJCXBhcnNlX3J0YXR0cl9uZXN0ZWQobGlua2luZm8sIElGTEFfSU5GT19NQVgsIHRiW0lGTEFfTElOS0lORk9dKTsKKworCQlpZiAoIWxpbmtpbmZvW0lGTEFfSU5GT19EQVRBXSkKKwkJCWdvdG8gZ2V0X2ZhaWxlZDsKKworCQlwYXJzZV9ydGF0dHJfbmVzdGVkKGlwdHVuaW5mbywgSUZMQV9JUFRVTl9NQVgsCisJCQkJICAgIGxpbmtpbmZvW0lGTEFfSU5GT19EQVRBXSk7CisKKwkJaWYgKGlwdHVuaW5mb1tJRkxBX0lQVFVOX0xPQ0FMXSkKKwkJCW1lbWNweSgmbGFkZHIsIFJUQV9EQVRBKGlwdHVuaW5mb1tJRkxBX0lQVFVOX0xPQ0FMXSksCisJCQkgICAgICAgc2l6ZW9mKGxhZGRyKSk7CisKKwkJaWYgKGlwdHVuaW5mb1tJRkxBX0lQVFVOX1JFTU9URV0pCisJCQltZW1jcHkoJnJhZGRyLCBSVEFfREFUQShpcHR1bmluZm9bSUZMQV9JUFRVTl9SRU1PVEVdKSwKKwkJCSAgICAgICBzaXplb2YocmFkZHIpKTsKKworCQlpZiAoaXB0dW5pbmZvW0lGTEFfSVBUVU5fVFRMXSkKKwkJCWhvcF9saW1pdCA9IHJ0YV9nZXRhdHRyX3U4KGlwdHVuaW5mb1tJRkxBX0lQVFVOX1RUTF0pOworCisJCWlmIChpcHR1bmluZm9bSUZMQV9JUFRVTl9FTkNBUF9MSU1JVF0pCisJCQllbmNhcF9saW1pdCA9IHJ0YV9nZXRhdHRyX3U4KGlwdHVuaW5mb1tJRkxBX0lQVFVOX0VOQ0FQX0xJTUlUXSk7CisKKwkJaWYgKGlwdHVuaW5mb1tJRkxBX0lQVFVOX0ZMT1dJTkZPXSkKKwkJCWZsb3dpbmZvID0gcnRhX2dldGF0dHJfdTMyKGlwdHVuaW5mb1tJRkxBX0lQVFVOX0ZMT1dJTkZPXSk7CisKKwkJaWYgKGlwdHVuaW5mb1tJRkxBX0lQVFVOX0ZMQUdTXSkKKwkJCWZsYWdzID0gcnRhX2dldGF0dHJfdTMyKGlwdHVuaW5mb1tJRkxBX0lQVFVOX0ZMQUdTXSk7CisKKwkJaWYgKGlwdHVuaW5mb1tJRkxBX0lQVFVOX0xJTktdKQorCQkJbGluayA9IHJ0YV9nZXRhdHRyX3UzMihpcHR1bmluZm9bSUZMQV9JUFRVTl9MSU5LXSk7CisKKwkJaWYgKGlwdHVuaW5mb1tJRkxBX0lQVFVOX1BST1RPXSkKKwkJCXByb3RvID0gcnRhX2dldGF0dHJfdTgoaXB0dW5pbmZvW0lGTEFfSVBUVU5fUFJPVE9dKTsKKwl9CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJtb2RlIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJpcHY2L2lwdjYiKSA9PSAwIHx8CisJCQkgICAgc3RyY21wKCphcmd2LCAiaXA2aXA2IikgPT0gMCkKKwkJCQlwcm90byA9IElQUFJPVE9fSVBWNjsKKwkJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImlwL2lwdjYiKSA9PSAwIHx8CisJCQkJIHN0cmNtcCgqYXJndiwgImlwdjQvaXB2NiIpID09IDAgfHwKKwkJCQkgc3RyY21wKCphcmd2LCAiaXBpcDYiKSA9PSAwIHx8CisJCQkJIHN0cmNtcCgqYXJndiwgImlwNGlwNiIpID09IDApCisJCQkJcHJvdG8gPSBJUFBST1RPX0lQSVA7CisJCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJhbnkvaXB2NiIpID09IDAgfHwKKwkJCQkgc3RyY21wKCphcmd2LCAiYW55IikgPT0gMCkKKwkJCQlwcm90byA9IDA7CisJCQllbHNlCisJCQkJaW52YXJnKCJDYW5ub3QgZ3Vlc3MgdHVubmVsIG1vZGUuIiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInJlbW90ZSIpID09IDApIHsKKwkJCWluZXRfcHJlZml4IGFkZHI7CisJCQlORVhUX0FSRygpOworCQkJZ2V0X3ByZWZpeCgmYWRkciwgKmFyZ3YsIHByZWZlcnJlZF9mYW1pbHkpOworCQkJaWYgKGFkZHIuZmFtaWx5ID09IEFGX1VOU1BFQykKKwkJCQlpbnZhcmcoIlwicmVtb3RlXCIgYWRkcmVzcyBmYW1pbHkgaXMgQUZfVU5TUEVDIiwgKmFyZ3YpOworCQkJbWVtY3B5KCZyYWRkciwgYWRkci5kYXRhLCBhZGRyLmJ5dGVsZW4pOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImxvY2FsIikgPT0gMCkgeworCQkJaW5ldF9wcmVmaXggYWRkcjsKKwkJCU5FWFRfQVJHKCk7CisJCQlnZXRfcHJlZml4KCZhZGRyLCAqYXJndiwgcHJlZmVycmVkX2ZhbWlseSk7CisJCQlpZiAoYWRkci5mYW1pbHkgPT0gQUZfVU5TUEVDKQorCQkJCWludmFyZygiXCJsb2NhbFwiIGFkZHJlc3MgZmFtaWx5IGlzIEFGX1VOU1BFQyIsICphcmd2KTsKKwkJCW1lbWNweSgmbGFkZHIsIGFkZHIuZGF0YSwgYWRkci5ieXRlbGVuKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiZGV2IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWxpbmsgPSBpZl9uYW1ldG9pbmRleCgqYXJndik7CisJCQlpZiAobGluayA9PSAwKQorCQkJCWludmFyZygiXCJkZXZcIiBpcyBpbnZhbGlkIiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImhvcGxpbWl0IikgPT0gMCB8fAorCQkJICAgc3RyY21wKCphcmd2LCAidHRsIikgPT0gMCB8fAorCQkJICAgc3RyY21wKCphcmd2LCAiaGxpbSIpID09IDApIHsKKwkJCV9fdTggdXZhbDsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3U4KCZ1dmFsLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJpbnZhbGlkIEhMSU0iLCAqYXJndik7CisJCQlob3BfbGltaXQgPSB1dmFsOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJlbmNhcGxpbWl0IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJub25lIikgPT0gMCkgeworCQkJCWZsYWdzIHw9IElQNl9UTkxfRl9JR05fRU5DQVBfTElNSVQ7CisJCQl9IGVsc2UgeworCQkJCV9fdTggdXZhbDsKKwkJCQlpZiAoZ2V0X3U4KCZ1dmFsLCAqYXJndiwgMCkgPCAtMSkKKwkJCQkJaW52YXJnKCJpbnZhbGlkIEVMSU0iLCAqYXJndik7CisJCQkJZW5jYXBfbGltaXQgPSB1dmFsOworCQkJCWZsYWdzICY9IH5JUDZfVE5MX0ZfSUdOX0VOQ0FQX0xJTUlUOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInRjbGFzcyIpID09IDAgfHwKKwkJCSAgIHN0cmNtcCgqYXJndiwgInRjIikgPT0gMCB8fAorCQkJICAgc3RyY21wKCphcmd2LCAidG9zIikgPT0gMCB8fAorCQkJICAgbWF0Y2hlcygqYXJndiwgImRzZmllbGQiKSA9PSAwKSB7CisJCQlfX3U4IHV2YWw7CisJCQlORVhUX0FSRygpOworCQkJZmxvd2luZm8gJj0gfklQNl9GTE9XSU5GT19UQ0xBU1M7CisJCQlpZiAoc3RyY21wKCphcmd2LCAiaW5oZXJpdCIpID09IDApCisJCQkJZmxhZ3MgfD0gSVA2X1ROTF9GX1VTRV9PUklHX1RDTEFTUzsKKwkJCWVsc2UgeworCQkJCWlmIChnZXRfdTgoJnV2YWwsICphcmd2LCAxNikpCisJCQkJCWludmFyZygiaW52YWxpZCBUQ2xhc3MiLCAqYXJndik7CisJCQkJZmxvd2luZm8gfD0gaHRvbmwoKF9fdTMyKXV2YWwgPDwgMjApICYgSVA2X0ZMT1dJTkZPX1RDTEFTUzsKKwkJCQlmbGFncyAmPSB+SVA2X1ROTF9GX1VTRV9PUklHX1RDTEFTUzsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJmbG93bGFiZWwiKSA9PSAwIHx8CisJCQkgICBzdHJjbXAoKmFyZ3YsICJmbCIpID09IDApIHsKKwkJCV9fdTMyIHV2YWw7CisJCQlORVhUX0FSRygpOworCQkJZmxvd2luZm8gJj0gfklQNl9GTE9XSU5GT19GTE9XTEFCRUw7CisJCQlpZiAoc3RyY21wKCphcmd2LCAiaW5oZXJpdCIpID09IDApCisJCQkJZmxhZ3MgfD0gSVA2X1ROTF9GX1VTRV9PUklHX0ZMT1dMQUJFTDsKKwkJCWVsc2UgeworCQkJCWlmIChnZXRfdTMyKCZ1dmFsLCAqYXJndiwgMTYpKQorCQkJCQlpbnZhcmcoImludmFsaWQgRmxvd2xhYmVsIiwgKmFyZ3YpOworCQkJCWlmICh1dmFsID4gMHhGRkZGRikKKwkJCQkJaW52YXJnKCJpbnZhbGlkIEZsb3dsYWJlbCIsICphcmd2KTsKKwkJCQlmbG93aW5mbyB8PSBodG9ubCh1dmFsKSAmIElQNl9GTE9XSU5GT19GTE9XTEFCRUw7CisJCQkJZmxhZ3MgJj0gfklQNl9UTkxfRl9VU0VfT1JJR19GTE9XTEFCRUw7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZHNjcCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoc3RyY21wKCphcmd2LCAiaW5oZXJpdCIpICE9IDApCisJCQkJaW52YXJnKCJub3QgaW5oZXJpdCIsICphcmd2KTsKKwkJCWZsYWdzIHw9IElQNl9UTkxfRl9SQ1ZfRFNDUF9DT1BZOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImZ3bWFyayIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoc3RyY21wKCphcmd2LCAiaW5oZXJpdCIpICE9IDApCisJCQkJaW52YXJnKCJub3QgaW5oZXJpdCIsICphcmd2KTsKKwkJCWZsYWdzIHw9IElQNl9UTkxfRl9VU0VfT1JJR19GV01BUks7CisJCX0gZWxzZQorCQkJdXNhZ2UoKTsKKwkJYXJnYy0tLCBhcmd2Kys7CisJfQorCisJYWRkYXR0cjgobiwgMTAyNCwgSUZMQV9JUFRVTl9QUk9UTywgcHJvdG8pOworCWFkZGF0dHJfbChuLCAxMDI0LCBJRkxBX0lQVFVOX0xPQ0FMLCAmbGFkZHIsIHNpemVvZihsYWRkcikpOworCWFkZGF0dHJfbChuLCAxMDI0LCBJRkxBX0lQVFVOX1JFTU9URSwgJnJhZGRyLCBzaXplb2YocmFkZHIpKTsKKwlhZGRhdHRyOChuLCAxMDI0LCBJRkxBX0lQVFVOX1RUTCwgaG9wX2xpbWl0KTsKKwlhZGRhdHRyOChuLCAxMDI0LCBJRkxBX0lQVFVOX0VOQ0FQX0xJTUlULCBlbmNhcF9saW1pdCk7CisJYWRkYXR0cjMyKG4sIDEwMjQsIElGTEFfSVBUVU5fRkxPV0lORk8sIGZsb3dpbmZvKTsKKwlhZGRhdHRyMzIobiwgMTAyNCwgSUZMQV9JUFRVTl9GTEFHUywgZmxhZ3MpOworCWFkZGF0dHIzMihuLCAxMDI0LCBJRkxBX0lQVFVOX0xJTkssIGxpbmspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlwNnR1bm5lbF9wcmludF9vcHQoc3RydWN0IGxpbmtfdXRpbCAqbHUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKnRiW10pCit7CisJY2hhciBzMVsyNTZdOworCWNoYXIgczJbNjRdOworCWludCBmbGFncyA9IDA7CisJX191MzIgZmxvd2luZm8gPSAwOworCisJaWYgKCF0YikKKwkJcmV0dXJuOworCisJaWYgKHRiW0lGTEFfSVBUVU5fRkxBR1NdKQorCQlmbGFncyA9IHJ0YV9nZXRhdHRyX3UzMih0YltJRkxBX0lQVFVOX0ZMQUdTXSk7CisKKwlpZiAodGJbSUZMQV9JUFRVTl9GTE9XSU5GT10pCisJCWZsb3dpbmZvID0gcnRhX2dldGF0dHJfdTMyKHRiW0lGTEFfSVBUVU5fRkxPV0lORk9dKTsKKworCWlmICh0YltJRkxBX0lQVFVOX1BST1RPXSkgeworCQlzd2l0Y2ggKHJ0YV9nZXRhdHRyX3U4KHRiW0lGTEFfSVBUVU5fUFJPVE9dKSkgeworCQljYXNlIElQUFJPVE9fSVBJUDoKKwkJCWZwcmludGYoZiwgImlwaXA2ICIpOworCQkJYnJlYWs7CisJCWNhc2UgSVBQUk9UT19JUFY2OgorCQkJZnByaW50ZihmLCAiaXA2aXA2ICIpOworCQkJYnJlYWs7CisJCWNhc2UgMDoKKwkJCWZwcmludGYoZiwgImFueSAiKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHRiW0lGTEFfSVBUVU5fUkVNT1RFXSkgeworCQlmcHJpbnRmKGYsICJyZW1vdGUgJXMgIiwKKwkJCXJ0X2FkZHJfbjJhKEFGX0lORVQ2LAorCQkJCSAgICBSVEFfUEFZTE9BRCh0YltJRkxBX0lQVFVOX1JFTU9URV0pLAorCQkJCSAgICBSVEFfREFUQSh0YltJRkxBX0lQVFVOX1JFTU9URV0pLAorCQkJCSAgICBzMSwgc2l6ZW9mKHMxKSkpOworCX0KKworCWlmICh0YltJRkxBX0lQVFVOX0xPQ0FMXSkgeworCQlmcHJpbnRmKGYsICJsb2NhbCAlcyAiLAorCQkJcnRfYWRkcl9uMmEoQUZfSU5FVDYsCisJCQkJICAgIFJUQV9QQVlMT0FEKHRiW0lGTEFfSVBUVU5fTE9DQUxdKSwKKwkJCQkgICAgUlRBX0RBVEEodGJbSUZMQV9JUFRVTl9MT0NBTF0pLAorCQkJCSAgICBzMSwgc2l6ZW9mKHMxKSkpOworCX0KKworCWlmICh0YltJRkxBX0lQVFVOX0xJTktdICYmIHJ0YV9nZXRhdHRyX3UzMih0YltJRkxBX0lQVFVOX0xJTktdKSkgeworCQl1bnNpZ25lZCBsaW5rID0gcnRhX2dldGF0dHJfdTMyKHRiW0lGTEFfSVBUVU5fTElOS10pOworCQljb25zdCBjaGFyICpuID0gaWZfaW5kZXh0b25hbWUobGluaywgczIpOworCisJCWlmIChuKQorCQkJZnByaW50ZihmLCAiZGV2ICVzICIsIG4pOworCQllbHNlCisJCQlmcHJpbnRmKGYsICJkZXYgJXUgIiwgbGluayk7CisJfQorCisJaWYgKGZsYWdzICYgSVA2X1ROTF9GX0lHTl9FTkNBUF9MSU1JVCkKKwkJcHJpbnRmKCJlbmNhcGxpbWl0IG5vbmUgIik7CisJZWxzZSBpZiAodGJbSUZMQV9JUFRVTl9FTkNBUF9MSU1JVF0pCisJCWZwcmludGYoZiwgImVuY2FwbGltaXQgJXUgIiwKKwkJCXJ0YV9nZXRhdHRyX3U4KHRiW0lGTEFfSVBUVU5fRU5DQVBfTElNSVRdKSk7CisKKwlpZiAodGJbSUZMQV9JUFRVTl9UVExdKQorCQlmcHJpbnRmKGYsICJob3BsaW1pdCAldSAiLCBydGFfZ2V0YXR0cl91OCh0YltJRkxBX0lQVFVOX1RUTF0pKTsKKworCWlmIChmbGFncyAmIElQNl9UTkxfRl9VU0VfT1JJR19UQ0xBU1MpCisJCXByaW50ZigidGNsYXNzIGluaGVyaXQgIik7CisJZWxzZSBpZiAodGJbSUZMQV9JUFRVTl9GTE9XSU5GT10pIHsKKwkJX191MzIgdmFsID0gbnRvaGwoZmxvd2luZm8gJiBJUDZfRkxPV0lORk9fVENMQVNTKTsKKworCQlwcmludGYoInRjbGFzcyAweCUwMnggIiwgKF9fdTgpKHZhbCA+PiAyMCkpOworCX0KKworCWlmIChmbGFncyAmIElQNl9UTkxfRl9VU0VfT1JJR19GTE9XTEFCRUwpCisJCXByaW50ZigiZmxvd2xhYmVsIGluaGVyaXQgIik7CisJZWxzZQorCQlwcmludGYoImZsb3dsYWJlbCAweCUwNXggIiwgbnRvaGwoZmxvd2luZm8gJiBJUDZfRkxPV0lORk9fRkxPV0xBQkVMKSk7CisKKwlwcmludGYoIihmbG93aW5mbyAweCUwOHgpICIsIG50b2hsKGZsb3dpbmZvKSk7CisKKwlpZiAoZmxhZ3MgJiBJUDZfVE5MX0ZfUkNWX0RTQ1BfQ09QWSkKKwkJcHJpbnRmKCJkc2NwIGluaGVyaXQgIik7CisKKwlpZiAoZmxhZ3MgJiBJUDZfVE5MX0ZfTUlQNl9ERVYpCisJCWZwcmludGYoZiwgIm1pcDYgIik7CisKKwlpZiAoZmxhZ3MgJiBJUDZfVE5MX0ZfVVNFX09SSUdfRldNQVJLKQorCQlmcHJpbnRmKGYsICJmd21hcmsgaW5oZXJpdCAiKTsKK30KKworc3RhdGljIHZvaWQgaXA2dHVubmVsX3ByaW50X2hlbHAoc3RydWN0IGxpbmtfdXRpbCAqbHUsIGludCBhcmdjLCBjaGFyICoqYXJndiwKKwlGSUxFICpmKQoreworCXByaW50X3VzYWdlKGYpOworfQorCitzdHJ1Y3QgbGlua191dGlsIGlwNnRubF9saW5rX3V0aWwgPSB7CisJLmlkID0gImlwNnRubCIsCisJLm1heGF0dHIgPSBJRkxBX0lQVFVOX01BWCwKKwkucGFyc2Vfb3B0ID0gaXA2dHVubmVsX3BhcnNlX29wdCwKKwkucHJpbnRfb3B0ID0gaXA2dHVubmVsX3ByaW50X29wdCwKKwkucHJpbnRfaGVscCA9IGlwNnR1bm5lbF9wcmludF9oZWxwLAorfTsKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2lwL2xpbmtfaXB0bmwuYyBiL2lwcm91dGUyL2lwL2xpbmtfaXB0bmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDZiYzk4Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaXAvbGlua19pcHRubC5jCkBAIC0wLDAgKzEsNDczIEBACisvKgorICogbGlua19pcHRubC5jCWlwaXAgYW5kIHNpdCBkcml2ZXIgbW9kdWxlCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJTmljb2xhcyBEaWNodGVsIDxuaWNvbGFzLmRpY2h0ZWxANndpbmQuY29tPgorICoKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl90dW5uZWwuaD4KKyNpbmNsdWRlICJydF9uYW1lcy5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiaXBfY29tbW9uLmgiCisjaW5jbHVkZSAidHVubmVsLmgiCisKK3N0YXRpYyB2b2lkIHByaW50X3VzYWdlKEZJTEUgKmYsIGludCBzaXQpCit7CisJZnByaW50ZihmLCAiVXNhZ2U6IGlwIGxpbmsgeyBhZGQgfCBzZXQgfCBjaGFuZ2UgfCByZXBsYWNlIHwgZGVsIH0gTkFNRVxuIik7CisJZnByaW50ZihmLCAiICAgICAgICAgIHR5cGUgeyBpcGlwIHwgc2l0IH0gWyByZW1vdGUgQUREUiBdIFsgbG9jYWwgQUREUiBdXG4iKTsKKwlmcHJpbnRmKGYsICIgICAgICAgICAgWyB0dGwgVFRMIF0gWyB0b3MgVE9TIF0gWyBbbm9dcG10dWRpc2MgXSBbIGRldiBQSFlTX0RFViBdXG4iKTsKKwlmcHJpbnRmKGYsICIgICAgICAgICAgWyA2cmQtcHJlZml4IEFERFIgXSBbIDZyZC1yZWxheV9wcmVmaXggQUREUiBdIFsgNnJkLXJlc2V0IF1cbiIpOworCWZwcmludGYoZiwgIiAgICAgICAgICBbIG5vZW5jYXAgXSBbIGVuY2FwIHsgZm91IHwgZ3VlIHwgbm9uZSB9IF1cbiIpOworCWZwcmludGYoZiwgIiAgICAgICAgICBbIGVuY2FwLXNwb3J0IFBPUlQgXSBbIGVuY2FwLWRwb3J0IFBPUlQgXVxuIik7CisJZnByaW50ZihmLCAiICAgICAgICAgIFsgW25vXWVuY2FwLWNzdW0gXSBbIFtub11lbmNhcC1jc3VtNiBdIFsgW25vXWVuY2FwLXJlbWNzdW0gXVxuIik7CisJaWYgKHNpdCkgeworCQlmcHJpbnRmKGYsICIgICAgICAgICAgWyBtb2RlIHsgaXA2aXAgfCBpcGlwIHwgYW55IH0gXVxuIik7CisJCWZwcmludGYoZiwgIiAgICAgICAgICBbIGlzYXRhcCBdXG4iKTsKKwl9CisJZnByaW50ZihmLCAiXG4iKTsKKwlmcHJpbnRmKGYsICJXaGVyZTogTkFNRSA6PSBTVFJJTkdcbiIpOworCWZwcmludGYoZiwgIiAgICAgICBBRERSIDo9IHsgSVBfQUREUkVTUyB8IGFueSB9XG4iKTsKKwlmcHJpbnRmKGYsICIgICAgICAgVE9TICA6PSB7IE5VTUJFUiB8IGluaGVyaXQgfVxuIik7CisJZnByaW50ZihmLCAiICAgICAgIFRUTCAgOj0geyAxLi4yNTUgfCBpbmhlcml0IH1cbiIpOworfQorCitzdGF0aWMgdm9pZCB1c2FnZShpbnQgc2l0KSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworc3RhdGljIHZvaWQgdXNhZ2UoaW50IHNpdCkKK3sKKwlwcmludF91c2FnZShzdGRlcnIsIHNpdCk7CisJZXhpdCgtMSk7Cit9CisKK3N0YXRpYyBpbnQgaXB0dW5uZWxfcGFyc2Vfb3B0KHN0cnVjdCBsaW5rX3V0aWwgKmx1LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCisJCQkgICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyIG47CisJCXN0cnVjdCBpZmluZm9tc2cgaTsKKwkJY2hhciBidWZbMjA0OF07CisJfSByZXE7CisJc3RydWN0IGlmaW5mb21zZyAqaWZpID0gKHN0cnVjdCBpZmluZm9tc2cgKikobiArIDEpOworCXN0cnVjdCBydGF0dHIgKnRiW0lGTEFfTUFYICsgMV07CisJc3RydWN0IHJ0YXR0ciAqbGlua2luZm9bSUZMQV9JTkZPX01BWCsxXTsKKwlzdHJ1Y3QgcnRhdHRyICppcHR1bmluZm9bSUZMQV9JUFRVTl9NQVggKyAxXTsKKwlpbnQgbGVuOworCV9fdTMyIGxpbmsgPSAwOworCV9fdTMyIGxhZGRyID0gMDsKKwlfX3UzMiByYWRkciA9IDA7CisJX191OCB0dGwgPSAwOworCV9fdTggdG9zID0gMDsKKwlfX3U4IHBtdHVkaXNjID0gMTsKKwlfX3UxNiBpZmxhZ3MgPSAwOworCV9fdTggcHJvdG8gPSAwOworCXN0cnVjdCBpbjZfYWRkciBpcDZyZHByZWZpeDsKKwlfX3UxNiBpcDZyZHByZWZpeGxlbiA9IDA7CisJX191MzIgaXA2cmRyZWxheXByZWZpeCA9IDA7CisJX191MTYgaXA2cmRyZWxheXByZWZpeGxlbiA9IDA7CisJX191MTYgZW5jYXB0eXBlID0gMDsKKwlfX3UxNiBlbmNhcGZsYWdzID0gMDsKKwlfX3UxNiBlbmNhcHNwb3J0ID0gMDsKKwlfX3UxNiBlbmNhcGRwb3J0ID0gMDsKKworCW1lbXNldCgmaXA2cmRwcmVmaXgsIDAsIHNpemVvZihpcDZyZHByZWZpeCkpOworCisJaWYgKCEobi0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9DUkVBVEUpKSB7CisJCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisKKwkJcmVxLm4ubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZigqaWZpKSk7CisJCXJlcS5uLm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVDsKKwkJcmVxLm4ubmxtc2dfdHlwZSA9IFJUTV9HRVRMSU5LOworCQlyZXEuaS5pZmlfZmFtaWx5ID0gcHJlZmVycmVkX2ZhbWlseTsKKwkJcmVxLmkuaWZpX2luZGV4ID0gaWZpLT5pZmlfaW5kZXg7CisKKwkJaWYgKHJ0bmxfdGFsaygmcnRoLCAmcmVxLm4sICZyZXEubiwgc2l6ZW9mKHJlcSkpIDwgMCkgeworZ2V0X2ZhaWxlZDoKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJGYWlsZWQgdG8gZ2V0IGV4aXN0aW5nIHR1bm5lbCBpbmZvLlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlsZW4gPSByZXEubi5ubG1zZ19sZW47CisJCWxlbiAtPSBOTE1TR19MRU5HVEgoc2l6ZW9mKCppZmkpKTsKKwkJaWYgKGxlbiA8IDApCisJCQlnb3RvIGdldF9mYWlsZWQ7CisKKwkJcGFyc2VfcnRhdHRyKHRiLCBJRkxBX01BWCwgSUZMQV9SVEEoJnJlcS5pKSwgbGVuKTsKKworCQlpZiAoIXRiW0lGTEFfTElOS0lORk9dKQorCQkJZ290byBnZXRfZmFpbGVkOworCisJCXBhcnNlX3J0YXR0cl9uZXN0ZWQobGlua2luZm8sIElGTEFfSU5GT19NQVgsIHRiW0lGTEFfTElOS0lORk9dKTsKKworCQlpZiAoIWxpbmtpbmZvW0lGTEFfSU5GT19EQVRBXSkKKwkJCWdvdG8gZ2V0X2ZhaWxlZDsKKworCQlwYXJzZV9ydGF0dHJfbmVzdGVkKGlwdHVuaW5mbywgSUZMQV9JUFRVTl9NQVgsCisJCQkJICAgIGxpbmtpbmZvW0lGTEFfSU5GT19EQVRBXSk7CisKKwkJaWYgKGlwdHVuaW5mb1tJRkxBX0lQVFVOX0xPQ0FMXSkKKwkJCWxhZGRyID0gcnRhX2dldGF0dHJfdTMyKGlwdHVuaW5mb1tJRkxBX0lQVFVOX0xPQ0FMXSk7CisKKwkJaWYgKGlwdHVuaW5mb1tJRkxBX0lQVFVOX1JFTU9URV0pCisJCQlyYWRkciA9IHJ0YV9nZXRhdHRyX3UzMihpcHR1bmluZm9bSUZMQV9JUFRVTl9SRU1PVEVdKTsKKworCQlpZiAoaXB0dW5pbmZvW0lGTEFfSVBUVU5fVFRMXSkKKwkJCXR0bCA9IHJ0YV9nZXRhdHRyX3U4KGlwdHVuaW5mb1tJRkxBX0lQVFVOX1RUTF0pOworCisJCWlmIChpcHR1bmluZm9bSUZMQV9JUFRVTl9UT1NdKQorCQkJdG9zID0gcnRhX2dldGF0dHJfdTgoaXB0dW5pbmZvW0lGTEFfSVBUVU5fVE9TXSk7CisKKwkJaWYgKGlwdHVuaW5mb1tJRkxBX0lQVFVOX1BNVFVESVNDXSkKKwkJCXBtdHVkaXNjID0KKwkJCQlydGFfZ2V0YXR0cl91OChpcHR1bmluZm9bSUZMQV9JUFRVTl9QTVRVRElTQ10pOworCisJCWlmIChpcHR1bmluZm9bSUZMQV9JUFRVTl9GTEFHU10pCisJCQlpZmxhZ3MgPSBydGFfZ2V0YXR0cl91MTYoaXB0dW5pbmZvW0lGTEFfSVBUVU5fRkxBR1NdKTsKKworCQlpZiAoaXB0dW5pbmZvW0lGTEFfSVBUVU5fTElOS10pCisJCQlsaW5rID0gcnRhX2dldGF0dHJfdTMyKGlwdHVuaW5mb1tJRkxBX0lQVFVOX0xJTktdKTsKKworCQlpZiAoaXB0dW5pbmZvW0lGTEFfSVBUVU5fUFJPVE9dKQorCQkJcHJvdG8gPSBydGFfZ2V0YXR0cl91OChpcHR1bmluZm9bSUZMQV9JUFRVTl9QUk9UT10pOworCisJCWlmIChpcHR1bmluZm9bSUZMQV9JUFRVTl9FTkNBUF9UWVBFXSkKKwkJCWVuY2FwdHlwZSA9IHJ0YV9nZXRhdHRyX3UxNihpcHR1bmluZm9bSUZMQV9JUFRVTl9FTkNBUF9UWVBFXSk7CisJCWlmIChpcHR1bmluZm9bSUZMQV9JUFRVTl9FTkNBUF9GTEFHU10pCisJCQllbmNhcGZsYWdzID0gcnRhX2dldGF0dHJfdTE2KGlwdHVuaW5mb1tJRkxBX0lQVFVOX0VOQ0FQX0ZMQUdTXSk7CisJCWlmIChpcHR1bmluZm9bSUZMQV9JUFRVTl9FTkNBUF9TUE9SVF0pCisJCQllbmNhcHNwb3J0ID0gcnRhX2dldGF0dHJfdTE2KGlwdHVuaW5mb1tJRkxBX0lQVFVOX0VOQ0FQX1NQT1JUXSk7CisJCWlmIChpcHR1bmluZm9bSUZMQV9JUFRVTl9FTkNBUF9EUE9SVF0pCisJCQllbmNhcGRwb3J0ID0gcnRhX2dldGF0dHJfdTE2KGlwdHVuaW5mb1tJRkxBX0lQVFVOX0VOQ0FQX0RQT1JUXSk7CisJCWlmIChpcHR1bmluZm9bSUZMQV9JUFRVTl82UkRfUFJFRklYXSkKKwkJCW1lbWNweSgmaXA2cmRwcmVmaXgsCisJCQkgICAgICAgUlRBX0RBVEEoaXB0dW5pbmZvW0lGTEFfSVBUVU5fNlJEX1BSRUZJWF0pLAorCQkJICAgICAgIHNpemVvZihsYWRkcikpOworCisJCWlmIChpcHR1bmluZm9bSUZMQV9JUFRVTl82UkRfUFJFRklYTEVOXSkKKwkJCWlwNnJkcHJlZml4bGVuID0KKwkJCQlydGFfZ2V0YXR0cl91MTYoaXB0dW5pbmZvW0lGTEFfSVBUVU5fNlJEX1BSRUZJWExFTl0pOworCisJCWlmIChpcHR1bmluZm9bSUZMQV9JUFRVTl82UkRfUkVMQVlfUFJFRklYXSkKKwkJCWlwNnJkcmVsYXlwcmVmaXggPQorCQkJCXJ0YV9nZXRhdHRyX3UzMihpcHR1bmluZm9bSUZMQV9JUFRVTl82UkRfUkVMQVlfUFJFRklYXSk7CisKKwkJaWYgKGlwdHVuaW5mb1tJRkxBX0lQVFVOXzZSRF9SRUxBWV9QUkVGSVhMRU5dKQorCQkJaXA2cmRyZWxheXByZWZpeGxlbiA9CisJCQkJcnRhX2dldGF0dHJfdTE2KGlwdHVuaW5mb1tJRkxBX0lQVFVOXzZSRF9SRUxBWV9QUkVGSVhMRU5dKTsKKwl9CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgInJlbW90ZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoc3RyY21wKCphcmd2LCAiYW55IikpCisJCQkJcmFkZHIgPSBnZXRfYWRkcjMyKCphcmd2KTsKKwkJCWVsc2UKKwkJCQlyYWRkciA9IDA7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibG9jYWwiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHN0cmNtcCgqYXJndiwgImFueSIpKQorCQkJCWxhZGRyID0gZ2V0X2FkZHIzMigqYXJndik7CisJCQllbHNlCisJCQkJbGFkZHIgPSAwOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJkZXYiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJbGluayA9IGlmX25hbWV0b2luZGV4KCphcmd2KTsKKwkJCWlmIChsaW5rID09IDApCisJCQkJaW52YXJnKCJcImRldlwiIGlzIGludmFsaWQiLCAqYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAidHRsIikgPT0gMCB8fAorCQkJICAgc3RyY21wKCphcmd2LCAiaG9wbGltaXQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHN0cmNtcCgqYXJndiwgImluaGVyaXQiKSAhPSAwKSB7CisJCQkJaWYgKGdldF91OCgmdHRsLCAqYXJndiwgMCkpCisJCQkJCWludmFyZygiaW52YWxpZCBUVExcbiIsICphcmd2KTsKKwkJCX0gZWxzZQorCQkJCXR0bCA9IDA7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAidG9zIikgPT0gMCB8fAorCQkJICAgc3RyY21wKCphcmd2LCAidGNsYXNzIikgPT0gMCB8fAorCQkJICAgbWF0Y2hlcygqYXJndiwgImRzZmllbGQiKSA9PSAwKSB7CisJCQlfX3UzMiB1dmFsOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJpbmhlcml0IikgIT0gMCkgeworCQkJCWlmIChydG5sX2RzZmllbGRfYTJuKCZ1dmFsLCAqYXJndikpCisJCQkJCWludmFyZygiYmFkIFRPUyB2YWx1ZSIsICphcmd2KTsKKwkJCQl0b3MgPSB1dmFsOworCQkJfSBlbHNlCisJCQkJdG9zID0gMTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJub3BtdHVkaXNjIikgPT0gMCkgeworCQkJcG10dWRpc2MgPSAwOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInBtdHVkaXNjIikgPT0gMCkgeworCQkJcG10dWRpc2MgPSAxOworCQl9IGVsc2UgaWYgKHN0cmNtcChsdS0+aWQsICJzaXQiKSA9PSAwICYmCisJCQkgICBzdHJjbXAoKmFyZ3YsICJpc2F0YXAiKSA9PSAwKSB7CisJCQlpZmxhZ3MgfD0gU0lUX0lTQVRBUDsKKwkJfSBlbHNlIGlmIChzdHJjbXAobHUtPmlkLCAic2l0IikgPT0gMCAmJgorCQkJICAgc3RyY21wKCphcmd2LCAibW9kZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoc3RyY21wKCphcmd2LCAiaXB2Ni9pcHY0IikgPT0gMCB8fAorCQkJICAgIHN0cmNtcCgqYXJndiwgImlwNmlwIikgPT0gMCkKKwkJCQlwcm90byA9IElQUFJPVE9fSVBWNjsKKwkJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImlwdjQvaXB2NCIpID09IDAgfHwKKwkJCQkgc3RyY21wKCphcmd2LCAiaXBpcCIpID09IDAgfHwKKwkJCQkgc3RyY21wKCphcmd2LCAiaXA0aXA0IikgPT0gMCkKKwkJCQlwcm90byA9IElQUFJPVE9fSVBJUDsKKwkJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImFueS9pcHY0IikgPT0gMCB8fAorCQkJCSBzdHJjbXAoKmFyZ3YsICJhbnkiKSA9PSAwKQorCQkJCXByb3RvID0gMDsKKwkJCWVsc2UKKwkJCQlpbnZhcmcoIkNhbm5vdCBndWVzcyB0dW5uZWwgbW9kZS4iLCAqYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibm9lbmNhcCIpID09IDApIHsKKwkJCWVuY2FwdHlwZSA9IFRVTk5FTF9FTkNBUF9OT05FOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImVuY2FwIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJmb3UiKSA9PSAwKQorCQkJCWVuY2FwdHlwZSA9IFRVTk5FTF9FTkNBUF9GT1U7CisJCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJndWUiKSA9PSAwKQorCQkJCWVuY2FwdHlwZSA9IFRVTk5FTF9FTkNBUF9HVUU7CisJCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJub25lIikgPT0gMCkKKwkJCQllbmNhcHR5cGUgPSBUVU5ORUxfRU5DQVBfTk9ORTsKKwkJCWVsc2UKKwkJCQlpbnZhcmcoIkludmFsaWQgZW5jYXAgdHlwZS4iLCAqYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZW5jYXAtc3BvcnQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHN0cmNtcCgqYXJndiwgImF1dG8iKSA9PSAwKQorCQkJCWVuY2Fwc3BvcnQgPSAwOworCQkJZWxzZSBpZiAoZ2V0X3UxNigmZW5jYXBzcG9ydCwgKmFyZ3YsIDApKQorCQkJCWludmFyZygiSW52YWxpZCBzb3VyY2UgcG9ydC4iLCAqYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZW5jYXAtZHBvcnQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MTYoJmVuY2FwZHBvcnQsICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoIkludmFsaWQgZGVzdGluYXRpb24gcG9ydC4iLCAqYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZW5jYXAtY3N1bSIpID09IDApIHsKKwkJCWVuY2FwZmxhZ3MgfD0gVFVOTkVMX0VOQ0FQX0ZMQUdfQ1NVTTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJub2VuY2FwLWNzdW0iKSA9PSAwKSB7CisJCQllbmNhcGZsYWdzICY9IH5UVU5ORUxfRU5DQVBfRkxBR19DU1VNOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImVuY2FwLXVkcDYtY3N1bSIpID09IDApIHsKKwkJCWVuY2FwZmxhZ3MgfD0gVFVOTkVMX0VOQ0FQX0ZMQUdfQ1NVTTY7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibm9lbmNhcC11ZHA2LWNzdW0iKSA9PSAwKSB7CisJCQllbmNhcGZsYWdzICY9IH5UVU5ORUxfRU5DQVBfRkxBR19DU1VNNjsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJlbmNhcC1yZW1jc3VtIikgPT0gMCkgeworCQkJZW5jYXBmbGFncyB8PSBUVU5ORUxfRU5DQVBfRkxBR19SRU1DU1VNOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm5vZW5jYXAtcmVtY3N1bSIpID09IDApIHsKKwkJCWVuY2FwZmxhZ3MgJj0gflRVTk5FTF9FTkNBUF9GTEFHX1JFTUNTVU07CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiNnJkLXByZWZpeCIpID09IDApIHsKKwkJCWluZXRfcHJlZml4IHByZWZpeDsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3ByZWZpeCgmcHJlZml4LCAqYXJndiwgQUZfSU5FVDYpKQorCQkJCWludmFyZygiaW52YWxpZCA2cmRfcHJlZml4XG4iLCAqYXJndik7CisJCQltZW1jcHkoJmlwNnJkcHJlZml4LCBwcmVmaXguZGF0YSwgMTYpOworCQkJaXA2cmRwcmVmaXhsZW4gPSBwcmVmaXguYml0bGVuOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIjZyZC1yZWxheV9wcmVmaXgiKSA9PSAwKSB7CisJCQlpbmV0X3ByZWZpeCBwcmVmaXg7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9wcmVmaXgoJnByZWZpeCwgKmFyZ3YsIEFGX0lORVQpKQorCQkJCWludmFyZygiaW52YWxpZCA2cmQtcmVsYXlfcHJlZml4XG4iLCAqYXJndik7CisJCQltZW1jcHkoJmlwNnJkcmVsYXlwcmVmaXgsIHByZWZpeC5kYXRhLCA0KTsKKwkJCWlwNnJkcmVsYXlwcmVmaXhsZW4gPSBwcmVmaXguYml0bGVuOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIjZyZC1yZXNldCIpID09IDApIHsKKwkJCWluZXRfcHJlZml4IHByZWZpeDsKKwkJCWdldF9wcmVmaXgoJnByZWZpeCwgIjIwMDI6OiIsIEFGX0lORVQ2KTsKKwkJCW1lbWNweSgmaXA2cmRwcmVmaXgsIHByZWZpeC5kYXRhLCAxNik7CisJCQlpcDZyZHByZWZpeGxlbiA9IDE2OworCQkJaXA2cmRyZWxheXByZWZpeCA9IDA7CisJCQlpcDZyZHJlbGF5cHJlZml4bGVuID0gMDsKKwkJfSBlbHNlCisJCQl1c2FnZShzdHJjbXAobHUtPmlkLCAic2l0IikgPT0gMCk7CisJCWFyZ2MtLSwgYXJndisrOworCX0KKworCWlmICh0dGwgJiYgcG10dWRpc2MgPT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInR0bCAhPSAwIGFuZCBub3BtdHVkaXNjIGFyZSBpbmNvbXBhdGlibGVcbiIpOworCQlleGl0KC0xKTsKKwl9CisKKwlhZGRhdHRyMzIobiwgMTAyNCwgSUZMQV9JUFRVTl9MSU5LLCBsaW5rKTsKKwlhZGRhdHRyMzIobiwgMTAyNCwgSUZMQV9JUFRVTl9MT0NBTCwgbGFkZHIpOworCWFkZGF0dHIzMihuLCAxMDI0LCBJRkxBX0lQVFVOX1JFTU9URSwgcmFkZHIpOworCWFkZGF0dHI4KG4sIDEwMjQsIElGTEFfSVBUVU5fVFRMLCB0dGwpOworCWFkZGF0dHI4KG4sIDEwMjQsIElGTEFfSVBUVU5fVE9TLCB0b3MpOworCWFkZGF0dHI4KG4sIDEwMjQsIElGTEFfSVBUVU5fUE1UVURJU0MsIHBtdHVkaXNjKTsKKworCWFkZGF0dHIxNihuLCAxMDI0LCBJRkxBX0lQVFVOX0VOQ0FQX1RZUEUsIGVuY2FwdHlwZSk7CisJYWRkYXR0cjE2KG4sIDEwMjQsIElGTEFfSVBUVU5fRU5DQVBfRkxBR1MsIGVuY2FwZmxhZ3MpOworCWFkZGF0dHIxNihuLCAxMDI0LCBJRkxBX0lQVFVOX0VOQ0FQX1NQT1JULCBodG9ucyhlbmNhcHNwb3J0KSk7CisJYWRkYXR0cjE2KG4sIDEwMjQsIElGTEFfSVBUVU5fRU5DQVBfRFBPUlQsIGh0b25zKGVuY2FwZHBvcnQpKTsKKworCWlmIChzdHJjbXAobHUtPmlkLCAic2l0IikgPT0gMCkgeworCQlhZGRhdHRyMTYobiwgMTAyNCwgSUZMQV9JUFRVTl9GTEFHUywgaWZsYWdzKTsKKwkJYWRkYXR0cjgobiwgMTAyNCwgSUZMQV9JUFRVTl9QUk9UTywgcHJvdG8pOworCQlpZiAoaXA2cmRwcmVmaXhsZW4pIHsKKwkJCWFkZGF0dHJfbChuLCAxMDI0LCBJRkxBX0lQVFVOXzZSRF9QUkVGSVgsCisJCQkJICAmaXA2cmRwcmVmaXgsIHNpemVvZihpcDZyZHByZWZpeCkpOworCQkJYWRkYXR0cjE2KG4sIDEwMjQsIElGTEFfSVBUVU5fNlJEX1BSRUZJWExFTiwKKwkJCQkgIGlwNnJkcHJlZml4bGVuKTsKKwkJCWFkZGF0dHIzMihuLCAxMDI0LCBJRkxBX0lQVFVOXzZSRF9SRUxBWV9QUkVGSVgsCisJCQkJICBpcDZyZHJlbGF5cHJlZml4KTsKKwkJCWFkZGF0dHIxNihuLCAxMDI0LCBJRkxBX0lQVFVOXzZSRF9SRUxBWV9QUkVGSVhMRU4sCisJCQkJICBpcDZyZHJlbGF5cHJlZml4bGVuKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpcHR1bm5lbF9wcmludF9vcHQoc3RydWN0IGxpbmtfdXRpbCAqbHUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKnRiW10pCit7CisJY2hhciBzMVsxMDI0XTsKKwljaGFyIHMyWzY0XTsKKwljb25zdCBjaGFyICpsb2NhbCA9ICJhbnkiOworCWNvbnN0IGNoYXIgKnJlbW90ZSA9ICJhbnkiOworCisJaWYgKCF0YikKKwkJcmV0dXJuOworCisJaWYgKHRiW0lGTEFfSVBUVU5fUkVNT1RFXSkgeworCQl1bnNpZ25lZCBhZGRyID0gcnRhX2dldGF0dHJfdTMyKHRiW0lGTEFfSVBUVU5fUkVNT1RFXSk7CisKKwkJaWYgKGFkZHIpCisJCQlyZW1vdGUgPSBmb3JtYXRfaG9zdChBRl9JTkVULCA0LCAmYWRkciwgczEsIHNpemVvZihzMSkpOworCX0KKworCWZwcmludGYoZiwgInJlbW90ZSAlcyAiLCByZW1vdGUpOworCisJaWYgKHRiW0lGTEFfSVBUVU5fTE9DQUxdKSB7CisJCXVuc2lnbmVkIGFkZHIgPSBydGFfZ2V0YXR0cl91MzIodGJbSUZMQV9JUFRVTl9MT0NBTF0pOworCisJCWlmIChhZGRyKQorCQkJbG9jYWwgPSBmb3JtYXRfaG9zdChBRl9JTkVULCA0LCAmYWRkciwgczEsIHNpemVvZihzMSkpOworCX0KKworCWZwcmludGYoZiwgImxvY2FsICVzICIsIGxvY2FsKTsKKworCWlmICh0YltJRkxBX0lQVFVOX0xJTktdICYmIHJ0YV9nZXRhdHRyX3UzMih0YltJRkxBX0lQVFVOX0xJTktdKSkgeworCQl1bnNpZ25lZCBsaW5rID0gcnRhX2dldGF0dHJfdTMyKHRiW0lGTEFfSVBUVU5fTElOS10pOworCQljb25zdCBjaGFyICpuID0gaWZfaW5kZXh0b25hbWUobGluaywgczIpOworCisJCWlmIChuKQorCQkJZnByaW50ZihmLCAiZGV2ICVzICIsIG4pOworCQllbHNlCisJCQlmcHJpbnRmKGYsICJkZXYgJXUgIiwgbGluayk7CisJfQorCisJaWYgKHRiW0lGTEFfSVBUVU5fVFRMXSAmJiBydGFfZ2V0YXR0cl91OCh0YltJRkxBX0lQVFVOX1RUTF0pKQorCQlmcHJpbnRmKGYsICJ0dGwgJWQgIiwgcnRhX2dldGF0dHJfdTgodGJbSUZMQV9JUFRVTl9UVExdKSk7CisJZWxzZQorCQlmcHJpbnRmKGYsICJ0dGwgaW5oZXJpdCAiKTsKKworCWlmICh0YltJRkxBX0lQVFVOX1RPU10gJiYgcnRhX2dldGF0dHJfdTgodGJbSUZMQV9JUFRVTl9UT1NdKSkgeworCQlpbnQgdG9zID0gcnRhX2dldGF0dHJfdTgodGJbSUZMQV9JUFRVTl9UT1NdKTsKKworCQlmcHV0cygidG9zICIsIGYpOworCQlpZiAodG9zID09IDEpCisJCQlmcHV0cygiaW5oZXJpdCAiLCBmKTsKKwkJZWxzZQorCQkJZnByaW50ZihmLCAiMHgleCAiLCB0b3MpOworCX0KKworCWlmICh0YltJRkxBX0lQVFVOX1BNVFVESVNDXSAmJiBydGFfZ2V0YXR0cl91OCh0YltJRkxBX0lQVFVOX1BNVFVESVNDXSkpCisJCWZwcmludGYoZiwgInBtdHVkaXNjICIpOworCWVsc2UKKwkJZnByaW50ZihmLCAibm9wbXR1ZGlzYyAiKTsKKworCWlmICh0YltJRkxBX0lQVFVOX0ZMQUdTXSkgeworCQlfX3UxNiBpZmxhZ3MgPSBydGFfZ2V0YXR0cl91MTYodGJbSUZMQV9JUFRVTl9GTEFHU10pOworCisJCWlmIChpZmxhZ3MgJiBTSVRfSVNBVEFQKQorCQkJZnByaW50ZihmLCAiaXNhdGFwICIpOworCX0KKworCWlmICh0YltJRkxBX0lQVFVOXzZSRF9QUkVGSVhMRU5dICYmCisJICAgICooX191MTYgKilSVEFfREFUQSh0YltJRkxBX0lQVFVOXzZSRF9QUkVGSVhMRU5dKSkgeworCQlfX3UxNiBwcmVmaXhsZW4gPSBydGFfZ2V0YXR0cl91MTYodGJbSUZMQV9JUFRVTl82UkRfUFJFRklYTEVOXSk7CisJCV9fdTE2IHJlbGF5cHJlZml4bGVuID0KKwkJCXJ0YV9nZXRhdHRyX3UxNih0YltJRkxBX0lQVFVOXzZSRF9SRUxBWV9QUkVGSVhMRU5dKTsKKwkJX191MzIgcmVsYXlwcmVmaXggPQorCQkJcnRhX2dldGF0dHJfdTMyKHRiW0lGTEFfSVBUVU5fNlJEX1JFTEFZX1BSRUZJWF0pOworCisJCXByaW50ZigiNnJkLXByZWZpeCAlcy8ldSAiLAorCQkgICAgICAgaW5ldF9udG9wKEFGX0lORVQ2LCBSVEFfREFUQSh0YltJRkxBX0lQVFVOXzZSRF9QUkVGSVhdKSwKKwkJCQkgczEsIHNpemVvZihzMSkpLAorCQkgICAgICAgcHJlZml4bGVuKTsKKwkJaWYgKHJlbGF5cHJlZml4KSB7CisJCQlwcmludGYoIjZyZC1yZWxheV9wcmVmaXggJXMvJXUgIiwKKwkJCSAgICAgICBmb3JtYXRfaG9zdChBRl9JTkVULCA0LCAmcmVsYXlwcmVmaXgsIHMxLAorCQkJCQkgICBzaXplb2YoczEpKSwKKwkJCSAgICAgICByZWxheXByZWZpeGxlbik7CisJCX0KKwl9CisKKwlpZiAodGJbSUZMQV9JUFRVTl9FTkNBUF9UWVBFXSAmJgorCSAgICAqKF9fdTE2ICopUlRBX0RBVEEodGJbSUZMQV9JUFRVTl9FTkNBUF9UWVBFXSkgIT0gVFVOTkVMX0VOQ0FQX05PTkUpIHsKKwkJX191MTYgdHlwZSA9IHJ0YV9nZXRhdHRyX3UxNih0YltJRkxBX0lQVFVOX0VOQ0FQX1RZUEVdKTsKKwkJX191MTYgZmxhZ3MgPSBydGFfZ2V0YXR0cl91MTYodGJbSUZMQV9JUFRVTl9FTkNBUF9GTEFHU10pOworCQlfX3UxNiBzcG9ydCA9IHJ0YV9nZXRhdHRyX3UxNih0YltJRkxBX0lQVFVOX0VOQ0FQX1NQT1JUXSk7CisJCV9fdTE2IGRwb3J0ID0gcnRhX2dldGF0dHJfdTE2KHRiW0lGTEFfSVBUVU5fRU5DQVBfRFBPUlRdKTsKKworCQlmcHV0cygiZW5jYXAgIiwgZik7CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIFRVTk5FTF9FTkNBUF9GT1U6CisJCQlmcHV0cygiZm91ICIsIGYpOworCQkJYnJlYWs7CisJCWNhc2UgVFVOTkVMX0VOQ0FQX0dVRToKKwkJCWZwdXRzKCJndWUgIiwgZik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZwdXRzKCJ1bmtub3duICIsIGYpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc3BvcnQgPT0gMCkKKwkJCWZwdXRzKCJlbmNhcC1zcG9ydCBhdXRvICIsIGYpOworCQllbHNlCisJCQlmcHJpbnRmKGYsICJlbmNhcC1zcG9ydCAldSIsIG50b2hzKHNwb3J0KSk7CisKKwkJZnByaW50ZihmLCAiZW5jYXAtZHBvcnQgJXUgIiwgbnRvaHMoZHBvcnQpKTsKKworCQlpZiAoZmxhZ3MgJiBUVU5ORUxfRU5DQVBfRkxBR19DU1VNKQorCQkJZnB1dHMoImVuY2FwLWNzdW0gIiwgZik7CisJCWVsc2UKKwkJCWZwdXRzKCJub2VuY2FwLWNzdW0gIiwgZik7CisKKwkJaWYgKGZsYWdzICYgVFVOTkVMX0VOQ0FQX0ZMQUdfQ1NVTTYpCisJCQlmcHV0cygiZW5jYXAtY3N1bTYgIiwgZik7CisJCWVsc2UKKwkJCWZwdXRzKCJub2VuY2FwLWNzdW02ICIsIGYpOworCisJCWlmIChmbGFncyAmIFRVTk5FTF9FTkNBUF9GTEFHX1JFTUNTVU0pCisJCQlmcHV0cygiZW5jYXAtcmVtY3N1bSAiLCBmKTsKKwkJZWxzZQorCQkJZnB1dHMoIm5vZW5jYXAtcmVtY3N1bSAiLCBmKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlwdHVubmVsX3ByaW50X2hlbHAoc3RydWN0IGxpbmtfdXRpbCAqbHUsIGludCBhcmdjLCBjaGFyICoqYXJndiwKKwlGSUxFICpmKQoreworCXByaW50X3VzYWdlKGYsIHN0cmNtcChsdS0+aWQsICJzaXQiKSA9PSAwKTsKK30KKworc3RydWN0IGxpbmtfdXRpbCBpcGlwX2xpbmtfdXRpbCA9IHsKKwkuaWQgPSAiaXBpcCIsCisJLm1heGF0dHIgPSBJRkxBX0lQVFVOX01BWCwKKwkucGFyc2Vfb3B0ID0gaXB0dW5uZWxfcGFyc2Vfb3B0LAorCS5wcmludF9vcHQgPSBpcHR1bm5lbF9wcmludF9vcHQsCisJLnByaW50X2hlbHAgPSBpcHR1bm5lbF9wcmludF9oZWxwLAorfTsKKworc3RydWN0IGxpbmtfdXRpbCBzaXRfbGlua191dGlsID0geworCS5pZCA9ICJzaXQiLAorCS5tYXhhdHRyID0gSUZMQV9JUFRVTl9NQVgsCisJLnBhcnNlX29wdCA9IGlwdHVubmVsX3BhcnNlX29wdCwKKwkucHJpbnRfb3B0ID0gaXB0dW5uZWxfcHJpbnRfb3B0LAorCS5wcmludF9oZWxwID0gaXB0dW5uZWxfcHJpbnRfaGVscCwKK307CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pcC9saW5rX3ZldGguYyBiL2lwcm91dGUyL2lwL2xpbmtfdmV0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNDIxNmMKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pcC9saW5rX3ZldGguYwpAQCAtMCwwICsxLDk3IEBACisvKgorICogbGlua192ZXRoLmMJdmV0aCBkcml2ZXIgbW9kdWxlCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJUGF2ZWwgRW1lbGlhbm92IDx4ZW11bEBvcGVudnoub3JnPgorICoKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bGludXgvdmV0aC5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJpcF9jb21tb24uaCIKKworc3RhdGljIHZvaWQgcHJpbnRfdXNhZ2UoRklMRSAqZikKK3sKKwlwcmludGYoIlVzYWdlOiBpcCBsaW5rIDxvcHRpb25zPiB0eXBlIHZldGggW3BlZXIgPG9wdGlvbnM+XVxuIgorCSAgICAgICAiVG8gZ2V0IDxvcHRpb25zPiB0eXBlICdpcCBsaW5rIGFkZCBoZWxwJ1xuIik7Cit9CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisJcHJpbnRfdXNhZ2Uoc3RkZXJyKTsKK30KKworc3RhdGljIGludCB2ZXRoX3BhcnNlX29wdChzdHJ1Y3QgbGlua191dGlsICpsdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCQkJICBzdHJ1Y3Qgbmxtc2doZHIgKmhkcikKK3sKKwljaGFyICpkZXYgPSBOVUxMOworCWNoYXIgKm5hbWUgPSBOVUxMOworCWNoYXIgKmxpbmsgPSBOVUxMOworCWNoYXIgKnR5cGUgPSBOVUxMOworCWludCBpbmRleCA9IDA7CisJaW50IGVyciwgbGVuOworCXN0cnVjdCBydGF0dHIgKiBkYXRhOworCWludCBncm91cDsKKwlzdHJ1Y3QgaWZpbmZvbXNnICppZm0sICpwZWVyX2lmbTsKKwl1bnNpZ25lZCBpbnQgaWZpX2ZsYWdzLCBpZmlfY2hhbmdlOworCisJaWYgKHN0cmNtcChhcmd2WzBdLCAicGVlciIpICE9IDApIHsKKwkJdXNhZ2UoKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmbSA9IE5MTVNHX0RBVEEoaGRyKTsKKwlpZmlfZmxhZ3MgPSBpZm0tPmlmaV9mbGFnczsKKwlpZmlfY2hhbmdlID0gaWZtLT5pZmlfY2hhbmdlOworCWlmbS0+aWZpX2ZsYWdzID0gMDsKKwlpZm0tPmlmaV9jaGFuZ2UgPSAwOworCisJZGF0YSA9IE5MTVNHX1RBSUwoaGRyKTsKKwlhZGRhdHRyX2woaGRyLCAxMDI0LCBWRVRIX0lORk9fUEVFUiwgTlVMTCwgMCk7CisKKwloZHItPm5sbXNnX2xlbiArPSBzaXplb2Yoc3RydWN0IGlmaW5mb21zZyk7CisKKwllcnIgPSBpcGxpbmtfcGFyc2UoYXJnYyAtIDEsIGFyZ3YgKyAxLCAoc3RydWN0IGlwbGlua19yZXEgKiloZHIsCisJCQkgICAmbmFtZSwgJnR5cGUsICZsaW5rLCAmZGV2LCAmZ3JvdXAsICZpbmRleCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlpZiAobmFtZSkgeworCQlsZW4gPSBzdHJsZW4obmFtZSkgKyAxOworCQlpZiAobGVuID4gSUZOQU1TSVopCisJCQlpbnZhcmcoIlwibmFtZVwiIHRvbyBsb25nXG4iLCAqYXJndik7CisJCWFkZGF0dHJfbChoZHIsIDEwMjQsIElGTEFfSUZOQU1FLCBuYW1lLCBsZW4pOworCX0KKworCXBlZXJfaWZtID0gUlRBX0RBVEEoZGF0YSk7CisJcGVlcl9pZm0tPmlmaV9pbmRleCA9IGluZGV4OworCXBlZXJfaWZtLT5pZmlfZmxhZ3MgPSBpZm0tPmlmaV9mbGFnczsKKwlwZWVyX2lmbS0+aWZpX2NoYW5nZSA9IGlmbS0+aWZpX2NoYW5nZTsKKwlpZm0tPmlmaV9mbGFncyA9IGlmaV9mbGFnczsKKwlpZm0tPmlmaV9jaGFuZ2UgPSBpZmlfY2hhbmdlOworCisJaWYgKGdyb3VwICE9IC0xKQorCQlhZGRhdHRyMzIoaGRyLCAxMDI0LCBJRkxBX0dST1VQLCBncm91cCk7CisKKwlkYXRhLT5ydGFfbGVuID0gKHZvaWQgKilOTE1TR19UQUlMKGhkcikgLSAodm9pZCAqKWRhdGE7CisJcmV0dXJuIGFyZ2MgLSAxIC0gZXJyOworfQorCitzdGF0aWMgdm9pZCB2ZXRoX3ByaW50X2hlbHAoc3RydWN0IGxpbmtfdXRpbCAqbHUsIGludCBhcmdjLCBjaGFyICoqYXJndiwKKwlGSUxFICpmKQoreworCXByaW50X3VzYWdlKGYpOworfQorCitzdHJ1Y3QgbGlua191dGlsIHZldGhfbGlua191dGlsID0geworCS5pZCA9ICJ2ZXRoIiwKKwkucGFyc2Vfb3B0ID0gdmV0aF9wYXJzZV9vcHQsCisJLnByaW50X2hlbHAgPSB2ZXRoX3ByaW50X2hlbHAsCit9OwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaXAvbGlua192dGkuYyBiL2lwcm91dGUyL2lwL2xpbmtfdnRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNmZWEzMwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2lwL2xpbmtfdnRpLmMKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiBsaW5rX3Z0aS5jCVZUSSBkcml2ZXIgbW9kdWxlCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgorICogICAgICAgICAgU2F1cmFiaCBNb2hhbiA8c2F1cmFiaC5tb2hhbkB2eWF0dGEuY29tPiBNb2RpZmllZCBsaW5rX2dyZS5jIGZvciBWVEkKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl90dW5uZWwuaD4KKyNpbmNsdWRlICJydF9uYW1lcy5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiaXBfY29tbW9uLmgiCisjaW5jbHVkZSAidHVubmVsLmgiCisKKworc3RhdGljIHZvaWQgcHJpbnRfdXNhZ2UoRklMRSAqZikKK3sKKwlmcHJpbnRmKGYsICJVc2FnZTogaXAgbGluayB7IGFkZCB8IHNldCB8IGNoYW5nZSB8IHJlcGxhY2UgfCBkZWwgfSBOQU1FXG4iKTsKKwlmcHJpbnRmKGYsICIgICAgICAgICAgdHlwZSB7IHZ0aSB9IFsgcmVtb3RlIEFERFIgXSBbIGxvY2FsIEFERFIgXVxuIik7CisJZnByaW50ZihmLCAiICAgICAgICAgIFsgW2l8b11rZXkgS0VZIF1cbiIpOworCWZwcmludGYoZiwgIiAgICAgICAgICBbIGRldiBQSFlTX0RFViBdXG4iKTsKKwlmcHJpbnRmKGYsICJcbiIpOworCWZwcmludGYoZiwgIldoZXJlOiBOQU1FIDo9IFNUUklOR1xuIik7CisJZnByaW50ZihmLCAiICAgICAgIEFERFIgOj0geyBJUF9BRERSRVNTIH1cbiIpOworCWZwcmludGYoZiwgIiAgICAgICBLRVkgIDo9IHsgRE9UVEVEX1FVQUQgfCBOVU1CRVIgfVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQoreworCXByaW50X3VzYWdlKHN0ZGVycik7CisJZXhpdCgtMSk7Cit9CisKK3N0YXRpYyBpbnQgdnRpX3BhcnNlX29wdChzdHJ1Y3QgbGlua191dGlsICpsdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCQkJIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgbmxtc2doZHIgbjsKKwkJc3RydWN0IGlmaW5mb21zZyBpOworCQljaGFyIGJ1ZlsxMDI0XTsKKwl9IHJlcTsKKwlzdHJ1Y3QgaWZpbmZvbXNnICppZmkgPSAoc3RydWN0IGlmaW5mb21zZyAqKShuICsgMSk7CisJc3RydWN0IHJ0YXR0ciAqdGJbSUZMQV9NQVggKyAxXTsKKwlzdHJ1Y3QgcnRhdHRyICpsaW5raW5mb1tJRkxBX0lORk9fTUFYKzFdOworCXN0cnVjdCBydGF0dHIgKnZ0aWluZm9bSUZMQV9WVElfTUFYICsgMV07CisJdW5zaWduZWQgaWtleSA9IDA7CisJdW5zaWduZWQgb2tleSA9IDA7CisJdW5zaWduZWQgc2FkZHIgPSAwOworCXVuc2lnbmVkIGRhZGRyID0gMDsKKwl1bnNpZ25lZCBsaW5rID0gMDsKKwlpbnQgbGVuOworCisJaWYgKCEobi0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9DUkVBVEUpKSB7CisJCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisKKwkJcmVxLm4ubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZigqaWZpKSk7CisJCXJlcS5uLm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVDsKKwkJcmVxLm4ubmxtc2dfdHlwZSA9IFJUTV9HRVRMSU5LOworCQlyZXEuaS5pZmlfZmFtaWx5ID0gcHJlZmVycmVkX2ZhbWlseTsKKwkJcmVxLmkuaWZpX2luZGV4ID0gaWZpLT5pZmlfaW5kZXg7CisKKwkJaWYgKHJ0bmxfdGFsaygmcnRoLCAmcmVxLm4sICZyZXEubiwgc2l6ZW9mKHJlcSkpIDwgMCkgeworZ2V0X2ZhaWxlZDoKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJGYWlsZWQgdG8gZ2V0IGV4aXN0aW5nIHR1bm5lbCBpbmZvLlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlsZW4gPSByZXEubi5ubG1zZ19sZW47CisJCWxlbiAtPSBOTE1TR19MRU5HVEgoc2l6ZW9mKCppZmkpKTsKKwkJaWYgKGxlbiA8IDApCisJCQlnb3RvIGdldF9mYWlsZWQ7CisKKwkJcGFyc2VfcnRhdHRyKHRiLCBJRkxBX01BWCwgSUZMQV9SVEEoJnJlcS5pKSwgbGVuKTsKKworCQlpZiAoIXRiW0lGTEFfTElOS0lORk9dKQorCQkJZ290byBnZXRfZmFpbGVkOworCisJCXBhcnNlX3J0YXR0cl9uZXN0ZWQobGlua2luZm8sIElGTEFfSU5GT19NQVgsIHRiW0lGTEFfTElOS0lORk9dKTsKKworCQlpZiAoIWxpbmtpbmZvW0lGTEFfSU5GT19EQVRBXSkKKwkJCWdvdG8gZ2V0X2ZhaWxlZDsKKworCQlwYXJzZV9ydGF0dHJfbmVzdGVkKHZ0aWluZm8sIElGTEFfVlRJX01BWCwKKwkJCQkgICAgbGlua2luZm9bSUZMQV9JTkZPX0RBVEFdKTsKKworCQlpZiAodnRpaW5mb1tJRkxBX1ZUSV9JS0VZXSkKKwkJCWlrZXkgPSAqKF9fdTMyICopUlRBX0RBVEEodnRpaW5mb1tJRkxBX1ZUSV9JS0VZXSk7CisKKwkJaWYgKHZ0aWluZm9bSUZMQV9WVElfT0tFWV0pCisJCQlva2V5ID0gKihfX3UzMiAqKVJUQV9EQVRBKHZ0aWluZm9bSUZMQV9WVElfT0tFWV0pOworCisJCWlmICh2dGlpbmZvW0lGTEFfVlRJX0xPQ0FMXSkKKwkJCXNhZGRyID0gKihfX3UzMiAqKVJUQV9EQVRBKHZ0aWluZm9bSUZMQV9WVElfTE9DQUxdKTsKKworCQlpZiAodnRpaW5mb1tJRkxBX1ZUSV9SRU1PVEVdKQorCQkJZGFkZHIgPSAqKF9fdTMyICopUlRBX0RBVEEodnRpaW5mb1tJRkxBX1ZUSV9SRU1PVEVdKTsKKworCQlpZiAodnRpaW5mb1tJRkxBX1ZUSV9MSU5LXSkKKwkJCWxpbmsgPSAqKF9fdTggKilSVEFfREFUQSh2dGlpbmZvW0lGTEFfVlRJX0xJTktdKTsKKwl9CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKCFtYXRjaGVzKCphcmd2LCAia2V5IikpIHsKKwkJCXVuc2lnbmVkIHV2YWw7CisKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoc3RyY2hyKCphcmd2LCAnLicpKQorCQkJCXV2YWwgPSBnZXRfYWRkcjMyKCphcmd2KTsKKwkJCWVsc2UgeworCQkJCWlmIChnZXRfdW5zaWduZWQoJnV2YWwsICphcmd2LCAwKSA8IDApIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCQkiSW52YWxpZCB2YWx1ZSBmb3IgXCJrZXlcIjogXCIlc1wiOyBpdCBzaG91bGQgYmUgYW4gdW5zaWduZWQgaW50ZWdlclxuIiwgKmFyZ3YpOworCQkJCQlleGl0KC0xKTsKKwkJCQl9CisJCQkJdXZhbCA9IGh0b25sKHV2YWwpOworCQkJfQorCisJCQlpa2V5ID0gb2tleSA9IHV2YWw7CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJpa2V5IikpIHsKKwkJCXVuc2lnbmVkIHV2YWw7CisKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoc3RyY2hyKCphcmd2LCAnLicpKQorCQkJCXV2YWwgPSBnZXRfYWRkcjMyKCphcmd2KTsKKwkJCWVsc2UgeworCQkJCWlmIChnZXRfdW5zaWduZWQoJnV2YWwsICphcmd2LCAwKSA8IDApIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIHZhbHVlIGZvciBcImlrZXlcIjogXCIlc1wiOyBpdCBzaG91bGQgYmUgYW4gdW5zaWduZWQgaW50ZWdlclxuIiwgKmFyZ3YpOworCQkJCQlleGl0KC0xKTsKKwkJCQl9CisJCQkJdXZhbCA9IGh0b25sKHV2YWwpOworCQkJfQorCQkJaWtleSA9IHV2YWw7CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJva2V5IikpIHsKKwkJCXVuc2lnbmVkIHV2YWw7CisKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoc3RyY2hyKCphcmd2LCAnLicpKQorCQkJCXV2YWwgPSBnZXRfYWRkcjMyKCphcmd2KTsKKwkJCWVsc2UgeworCQkJCWlmIChnZXRfdW5zaWduZWQoJnV2YWwsICphcmd2LCAwKSA8IDApIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIHZhbHVlIGZvciBcIm9rZXlcIjogXCIlc1wiOyBpdCBzaG91bGQgYmUgYW4gdW5zaWduZWQgaW50ZWdlclxuIiwgKmFyZ3YpOworCQkJCQlleGl0KC0xKTsKKwkJCQl9CisJCQkJdXZhbCA9IGh0b25sKHV2YWwpOworCQkJfQorCQkJb2tleSA9IHV2YWw7CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJyZW1vdGUiKSkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmICghc3RyY21wKCphcmd2LCAiYW55IikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgdmFsdWUgZm9yIFwicmVtb3RlXCI6IFwiJXNcIlxuIiwgKmFyZ3YpOworCQkJCWV4aXQoLTEpOworCQkJfSBlbHNlIHsKKwkJCQlkYWRkciA9IGdldF9hZGRyMzIoKmFyZ3YpOworCQkJfQorCQl9IGVsc2UgaWYgKCFtYXRjaGVzKCphcmd2LCAibG9jYWwiKSkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmICghc3RyY21wKCphcmd2LCAiYW55IikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgdmFsdWUgZm9yIFwibG9jYWxcIjogXCIlc1wiXG4iLCAqYXJndik7CisJCQkJZXhpdCgtMSk7CisJCQl9IGVsc2UgeworCQkJCXNhZGRyID0gZ2V0X2FkZHIzMigqYXJndik7CisJCQl9CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJkZXYiKSkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWxpbmsgPSBpZl9uYW1ldG9pbmRleCgqYXJndik7CisJCQlpZiAobGluayA9PSAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJDYW5ub3QgZmluZCBkZXZpY2UgXCIlc1wiXG4iLAorCQkJCQkqYXJndik7CisJCQkJZXhpdCgtMSk7CisJCQl9CisJCX0gZWxzZQorCQkJdXNhZ2UoKTsKKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJYWRkYXR0cjMyKG4sIDEwMjQsIElGTEFfVlRJX0lLRVksIGlrZXkpOworCWFkZGF0dHIzMihuLCAxMDI0LCBJRkxBX1ZUSV9PS0VZLCBva2V5KTsKKwlhZGRhdHRyX2wobiwgMTAyNCwgSUZMQV9WVElfTE9DQUwsICZzYWRkciwgNCk7CisJYWRkYXR0cl9sKG4sIDEwMjQsIElGTEFfVlRJX1JFTU9URSwgJmRhZGRyLCA0KTsKKwlpZiAobGluaykKKwkJYWRkYXR0cjMyKG4sIDEwMjQsIElGTEFfVlRJX0xJTkssIGxpbmspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZ0aV9wcmludF9vcHQoc3RydWN0IGxpbmtfdXRpbCAqbHUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKnRiW10pCit7CisJY2hhciBzMVsxMDI0XTsKKwljaGFyIHMyWzY0XTsKKwljb25zdCBjaGFyICpsb2NhbCA9ICJhbnkiOworCWNvbnN0IGNoYXIgKnJlbW90ZSA9ICJhbnkiOworCisJaWYgKCF0YikKKwkJcmV0dXJuOworCisJaWYgKHRiW0lGTEFfVlRJX1JFTU9URV0pIHsKKwkJdW5zaWduZWQgYWRkciA9ICooX191MzIgKilSVEFfREFUQSh0YltJRkxBX1ZUSV9SRU1PVEVdKTsKKworCQlpZiAoYWRkcikKKwkJCXJlbW90ZSA9IGZvcm1hdF9ob3N0KEFGX0lORVQsIDQsICZhZGRyLCBzMSwgc2l6ZW9mKHMxKSk7CisJfQorCisJZnByaW50ZihmLCAicmVtb3RlICVzICIsIHJlbW90ZSk7CisKKwlpZiAodGJbSUZMQV9WVElfTE9DQUxdKSB7CisJCXVuc2lnbmVkIGFkZHIgPSAqKF9fdTMyICopUlRBX0RBVEEodGJbSUZMQV9WVElfTE9DQUxdKTsKKworCQlpZiAoYWRkcikKKwkJCWxvY2FsID0gZm9ybWF0X2hvc3QoQUZfSU5FVCwgNCwgJmFkZHIsIHMxLCBzaXplb2YoczEpKTsKKwl9CisKKwlmcHJpbnRmKGYsICJsb2NhbCAlcyAiLCBsb2NhbCk7CisKKwlpZiAodGJbSUZMQV9WVElfTElOS10gJiYgKihfX3UzMiAqKVJUQV9EQVRBKHRiW0lGTEFfVlRJX0xJTktdKSkgeworCQl1bnNpZ25lZCBsaW5rID0gKihfX3UzMiAqKVJUQV9EQVRBKHRiW0lGTEFfVlRJX0xJTktdKTsKKwkJY29uc3QgY2hhciAqbiA9IGlmX2luZGV4dG9uYW1lKGxpbmssIHMyKTsKKworCQlpZiAobikKKwkJCWZwcmludGYoZiwgImRldiAlcyAiLCBuKTsKKwkJZWxzZQorCQkJZnByaW50ZihmLCAiZGV2ICV1ICIsIGxpbmspOworCX0KKworCWlmICh0YltJRkxBX1ZUSV9JS0VZXSkgeworCQlpbmV0X250b3AoQUZfSU5FVCwgUlRBX0RBVEEodGJbSUZMQV9WVElfSUtFWV0pLCBzMiwgc2l6ZW9mKHMyKSk7CisJCWZwcmludGYoZiwgImlrZXkgJXMgIiwgczIpOworCX0KKworCWlmICh0YltJRkxBX1ZUSV9PS0VZXSkgeworCQlpbmV0X250b3AoQUZfSU5FVCwgUlRBX0RBVEEodGJbSUZMQV9WVElfT0tFWV0pLCBzMiwgc2l6ZW9mKHMyKSk7CisJCWZwcmludGYoZiwgIm9rZXkgJXMgIiwgczIpOworCX0KK30KKworc3RhdGljIHZvaWQgdnRpX3ByaW50X2hlbHAoc3RydWN0IGxpbmtfdXRpbCAqbHUsIGludCBhcmdjLCBjaGFyICoqYXJndiwKKwlGSUxFICpmKQoreworCXByaW50X3VzYWdlKGYpOworfQorCitzdHJ1Y3QgbGlua191dGlsIHZ0aV9saW5rX3V0aWwgPSB7CisJLmlkID0gInZ0aSIsCisJLm1heGF0dHIgPSBJRkxBX1ZUSV9NQVgsCisJLnBhcnNlX29wdCA9IHZ0aV9wYXJzZV9vcHQsCisJLnByaW50X29wdCA9IHZ0aV9wcmludF9vcHQsCisJLnByaW50X2hlbHAgPSB2dGlfcHJpbnRfaGVscCwKK307CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pcC9saW5rX3Z0aTYuYyBiL2lwcm91dGUyL2lwL2xpbmtfdnRpNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNDZmNzkKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pcC9saW5rX3Z0aTYuYwpAQCAtMCwwICsxLDI1MCBAQAorLyoKKyAqIGxpbmtfdnRpNi5jCVZUSSBkcml2ZXIgbW9kdWxlCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgorICoJCVNhdXJhYmggTW9oYW4gPHNhdXJhYmgubW9oYW5AdnlhdHRhLmNvbT4gTW9kaWZpZWQgbGlua19ncmUuYyBmb3IgVlRJCisgKgkJU3RlZmZlbiBLbGFzc2VydCA8c3RlZmZlbi5rbGFzc2VydEBzZWN1bmV0LmNvbT4gTW9kaWZpZWQgbGlua192dGkuYyBmb3IgSVB2NgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3R1bm5lbC5oPgorI2luY2x1ZGUgInJ0X25hbWVzLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJpcF9jb21tb24uaCIKKyNpbmNsdWRlICJ0dW5uZWwuaCIKKworCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBpcCBsaW5rIHsgYWRkIHwgc2V0IHwgY2hhbmdlIHwgcmVwbGFjZSB8IGRlbCB9IE5BTUVcbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgIHR5cGUgeyB2dGk2IH0gWyByZW1vdGUgQUREUiBdIFsgbG9jYWwgQUREUiBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICBbIFtpfG9da2V5IEtFWSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICBbIGRldiBQSFlTX0RFViBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJZnByaW50ZihzdGRlcnIsICJXaGVyZTogTkFNRSA6PSBTVFJJTkdcbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgIEFERFIgOj0geyBJUFY2X0FERFJFU1MgfVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgS0VZICA6PSB7IERPVFRFRF9RVUFEIHwgTlVNQkVSIH1cbiIpOworCWV4aXQoLTEpOworfQorCitzdGF0aWMgaW50IHZ0aTZfcGFyc2Vfb3B0KHN0cnVjdCBsaW5rX3V0aWwgKmx1LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCisJCQkgIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgbmxtc2doZHIgbjsKKwkJc3RydWN0IGlmaW5mb21zZyBpOworCQljaGFyIGJ1ZlsxMDI0XTsKKwl9IHJlcTsKKwlzdHJ1Y3QgaWZpbmZvbXNnICppZmkgPSAoc3RydWN0IGlmaW5mb21zZyAqKShuICsgMSk7CisJc3RydWN0IHJ0YXR0ciAqdGJbSUZMQV9NQVggKyAxXTsKKwlzdHJ1Y3QgcnRhdHRyICpsaW5raW5mb1tJRkxBX0lORk9fTUFYKzFdOworCXN0cnVjdCBydGF0dHIgKnZ0aWluZm9bSUZMQV9WVElfTUFYICsgMV07CisJc3RydWN0IGluNl9hZGRyIHNhZGRyOworCXN0cnVjdCBpbjZfYWRkciBkYWRkcjsKKwl1bnNpZ25lZCBpa2V5ID0gMDsKKwl1bnNpZ25lZCBva2V5ID0gMDsKKwl1bnNpZ25lZCBsaW5rID0gMDsKKwlpbnQgbGVuOworCisJaWYgKCEobi0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9DUkVBVEUpKSB7CisJCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisKKwkJcmVxLm4ubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZigqaWZpKSk7CisJCXJlcS5uLm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVDsKKwkJcmVxLm4ubmxtc2dfdHlwZSA9IFJUTV9HRVRMSU5LOworCQlyZXEuaS5pZmlfZmFtaWx5ID0gcHJlZmVycmVkX2ZhbWlseTsKKwkJcmVxLmkuaWZpX2luZGV4ID0gaWZpLT5pZmlfaW5kZXg7CisKKwkJaWYgKHJ0bmxfdGFsaygmcnRoLCAmcmVxLm4sICZyZXEubiwgc2l6ZW9mKHJlcSkpIDwgMCkgeworZ2V0X2ZhaWxlZDoKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJGYWlsZWQgdG8gZ2V0IGV4aXN0aW5nIHR1bm5lbCBpbmZvLlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlsZW4gPSByZXEubi5ubG1zZ19sZW47CisJCWxlbiAtPSBOTE1TR19MRU5HVEgoc2l6ZW9mKCppZmkpKTsKKwkJaWYgKGxlbiA8IDApCisJCQlnb3RvIGdldF9mYWlsZWQ7CisKKwkJcGFyc2VfcnRhdHRyKHRiLCBJRkxBX01BWCwgSUZMQV9SVEEoJnJlcS5pKSwgbGVuKTsKKworCQlpZiAoIXRiW0lGTEFfTElOS0lORk9dKQorCQkJZ290byBnZXRfZmFpbGVkOworCisJCXBhcnNlX3J0YXR0cl9uZXN0ZWQobGlua2luZm8sIElGTEFfSU5GT19NQVgsIHRiW0lGTEFfTElOS0lORk9dKTsKKworCQlpZiAoIWxpbmtpbmZvW0lGTEFfSU5GT19EQVRBXSkKKwkJCWdvdG8gZ2V0X2ZhaWxlZDsKKworCQlwYXJzZV9ydGF0dHJfbmVzdGVkKHZ0aWluZm8sIElGTEFfVlRJX01BWCwKKwkJCQkgICAgbGlua2luZm9bSUZMQV9JTkZPX0RBVEFdKTsKKworCQlpZiAodnRpaW5mb1tJRkxBX1ZUSV9JS0VZXSkKKwkJCWlrZXkgPSBydGFfZ2V0YXR0cl91MzIodnRpaW5mb1tJRkxBX1ZUSV9JS0VZXSk7CisKKwkJaWYgKHZ0aWluZm9bSUZMQV9WVElfT0tFWV0pCisJCQlva2V5ID0gcnRhX2dldGF0dHJfdTMyKHZ0aWluZm9bSUZMQV9WVElfT0tFWV0pOworCisJCWlmICh2dGlpbmZvW0lGTEFfVlRJX0xPQ0FMXSkKKwkJCW1lbWNweSgmc2FkZHIsIFJUQV9EQVRBKHZ0aWluZm9bSUZMQV9WVElfTE9DQUxdKSwgc2l6ZW9mKHNhZGRyKSk7CisKKwkJaWYgKHZ0aWluZm9bSUZMQV9WVElfUkVNT1RFXSkKKwkJCW1lbWNweSgmZGFkZHIsIFJUQV9EQVRBKHZ0aWluZm9bSUZMQV9WVElfUkVNT1RFXSksIHNpemVvZihkYWRkcikpOworCisJCWlmICh2dGlpbmZvW0lGTEFfVlRJX0xJTktdKQorCQkJbGluayA9IHJ0YV9nZXRhdHRyX3U4KHZ0aWluZm9bSUZMQV9WVElfTElOS10pOworCX0KKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAoIW1hdGNoZXMoKmFyZ3YsICJrZXkiKSkgeworCQkJdW5zaWduZWQgdXZhbDsKKworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChzdHJjaHIoKmFyZ3YsICcuJykpCisJCQkJdXZhbCA9IGdldF9hZGRyMzIoKmFyZ3YpOworCQkJZWxzZSB7CisJCQkJaWYgKGdldF91bnNpZ25lZCgmdXZhbCwgKmFyZ3YsIDApIDwgMCkgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJCSJJbnZhbGlkIHZhbHVlIGZvciBcImtleVwiOiBcIiVzXCI7IGl0IHNob3VsZCBiZSBhbiB1bnNpZ25lZCBpbnRlZ2VyXG4iLCAqYXJndik7CisJCQkJCWV4aXQoLTEpOworCQkJCX0KKwkJCQl1dmFsID0gaHRvbmwodXZhbCk7CisJCQl9CisKKwkJCWlrZXkgPSBva2V5ID0gdXZhbDsKKwkJfSBlbHNlIGlmICghbWF0Y2hlcygqYXJndiwgImlrZXkiKSkgeworCQkJdW5zaWduZWQgdXZhbDsKKworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChzdHJjaHIoKmFyZ3YsICcuJykpCisJCQkJdXZhbCA9IGdldF9hZGRyMzIoKmFyZ3YpOworCQkJZWxzZSB7CisJCQkJaWYgKGdldF91bnNpZ25lZCgmdXZhbCwgKmFyZ3YsIDApIDwgMCkgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgdmFsdWUgZm9yIFwiaWtleVwiOiBcIiVzXCI7IGl0IHNob3VsZCBiZSBhbiB1bnNpZ25lZCBpbnRlZ2VyXG4iLCAqYXJndik7CisJCQkJCWV4aXQoLTEpOworCQkJCX0KKwkJCQl1dmFsID0gaHRvbmwodXZhbCk7CisJCQl9CisJCQlpa2V5ID0gdXZhbDsKKwkJfSBlbHNlIGlmICghbWF0Y2hlcygqYXJndiwgIm9rZXkiKSkgeworCQkJdW5zaWduZWQgdXZhbDsKKworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChzdHJjaHIoKmFyZ3YsICcuJykpCisJCQkJdXZhbCA9IGdldF9hZGRyMzIoKmFyZ3YpOworCQkJZWxzZSB7CisJCQkJaWYgKGdldF91bnNpZ25lZCgmdXZhbCwgKmFyZ3YsIDApIDwgMCkgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgdmFsdWUgZm9yIFwib2tleVwiOiBcIiVzXCI7IGl0IHNob3VsZCBiZSBhbiB1bnNpZ25lZCBpbnRlZ2VyXG4iLCAqYXJndik7CisJCQkJCWV4aXQoLTEpOworCQkJCX0KKwkJCQl1dmFsID0gaHRvbmwodXZhbCk7CisJCQl9CisJCQlva2V5ID0gdXZhbDsKKwkJfSBlbHNlIGlmICghbWF0Y2hlcygqYXJndiwgInJlbW90ZSIpKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKCFzdHJjbXAoKmFyZ3YsICJhbnkiKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiaW52YWxpZCB2YWx1ZSBmb3IgXCJyZW1vdGVcIjogXCIlc1wiXG4iLCAqYXJndik7CisJCQkJZXhpdCgtMSk7CisJCQl9IGVsc2UgeworCQkJCWluZXRfcHJlZml4IGFkZHI7CisJCQkJZ2V0X3ByZWZpeCgmYWRkciwgKmFyZ3YsIEFGX0lORVQ2KTsKKwkJCQltZW1jcHkoJmRhZGRyLCBhZGRyLmRhdGEsIGFkZHIuYnl0ZWxlbik7CisJCQl9CisJCX0gZWxzZSBpZiAoIW1hdGNoZXMoKmFyZ3YsICJsb2NhbCIpKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKCFzdHJjbXAoKmFyZ3YsICJhbnkiKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiaW52YWxpZCB2YWx1ZSBmb3IgXCJsb2NhbFwiOiBcIiVzXCJcbiIsICphcmd2KTsKKwkJCQlleGl0KC0xKTsKKwkJCX0gZWxzZSB7CisJCQkJaW5ldF9wcmVmaXggYWRkcjsKKwkJCQlnZXRfcHJlZml4KCZhZGRyLCAqYXJndiwgQUZfSU5FVDYpOworCQkJCW1lbWNweSgmc2FkZHIsIGFkZHIuZGF0YSwgYWRkci5ieXRlbGVuKTsKKwkJCX0KKwkJfSBlbHNlIGlmICghbWF0Y2hlcygqYXJndiwgImRldiIpKSB7CisJCQlORVhUX0FSRygpOworCQkJbGluayA9IGlmX25hbWV0b2luZGV4KCphcmd2KTsKKwkJCWlmIChsaW5rID09IDApCisJCQkJZXhpdCgtMSk7CisJCX0gZWxzZQorCQkJdXNhZ2UoKTsKKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJYWRkYXR0cjMyKG4sIDEwMjQsIElGTEFfVlRJX0lLRVksIGlrZXkpOworCWFkZGF0dHIzMihuLCAxMDI0LCBJRkxBX1ZUSV9PS0VZLCBva2V5KTsKKwlhZGRhdHRyX2wobiwgMTAyNCwgSUZMQV9WVElfTE9DQUwsICZzYWRkciwgc2l6ZW9mKHNhZGRyKSk7CisJYWRkYXR0cl9sKG4sIDEwMjQsIElGTEFfVlRJX1JFTU9URSwgJmRhZGRyLCBzaXplb2YoZGFkZHIpKTsKKwlpZiAobGluaykKKwkJYWRkYXR0cjMyKG4sIDEwMjQsIElGTEFfVlRJX0xJTkssIGxpbmspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZ0aTZfcHJpbnRfb3B0KHN0cnVjdCBsaW5rX3V0aWwgKmx1LCBGSUxFICpmLCBzdHJ1Y3QgcnRhdHRyICp0YltdKQoreworCWNoYXIgczFbMTAyNF07CisJY2hhciBzMls2NF07CisJY29uc3QgY2hhciAqbG9jYWwgPSAiYW55IjsKKwljb25zdCBjaGFyICpyZW1vdGUgPSAiYW55IjsKKwlzdHJ1Y3QgaW42X2FkZHIgc2FkZHI7CisJc3RydWN0IGluNl9hZGRyIGRhZGRyOworCisJaWYgKCF0YikKKwkJcmV0dXJuOworCisJaWYgKHRiW0lGTEFfVlRJX1JFTU9URV0pIHsKKwkJbWVtY3B5KCZkYWRkciwgUlRBX0RBVEEodGJbSUZMQV9WVElfUkVNT1RFXSksIHNpemVvZihkYWRkcikpOworCisJCXJlbW90ZSA9IGZvcm1hdF9ob3N0KEFGX0lORVQ2LCAxNiwgJmRhZGRyLCBzMSwgc2l6ZW9mKHMxKSk7CisJfQorCisJZnByaW50ZihmLCAicmVtb3RlICVzICIsIHJlbW90ZSk7CisKKwlpZiAodGJbSUZMQV9WVElfTE9DQUxdKSB7CisJCW1lbWNweSgmc2FkZHIsIFJUQV9EQVRBKHRiW0lGTEFfVlRJX0xPQ0FMXSksIHNpemVvZihzYWRkcikpOworCisJCWxvY2FsID0gZm9ybWF0X2hvc3QoQUZfSU5FVDYsIDE2LCAmc2FkZHIsIHMxLCBzaXplb2YoczEpKTsKKwl9CisKKwlmcHJpbnRmKGYsICJsb2NhbCAlcyAiLCBsb2NhbCk7CisKKwlpZiAodGJbSUZMQV9WVElfTElOS10gJiYgKihfX3UzMiAqKVJUQV9EQVRBKHRiW0lGTEFfVlRJX0xJTktdKSkgeworCQl1bnNpZ25lZCBsaW5rID0gKihfX3UzMiAqKVJUQV9EQVRBKHRiW0lGTEFfVlRJX0xJTktdKTsKKwkJY29uc3QgY2hhciAqbiA9IGlmX2luZGV4dG9uYW1lKGxpbmssIHMyKTsKKworCQlpZiAobikKKwkJCWZwcmludGYoZiwgImRldiAlcyAiLCBuKTsKKwkJZWxzZQorCQkJZnByaW50ZihmLCAiZGV2ICV1ICIsIGxpbmspOworCX0KKworCWlmICh0YltJRkxBX1ZUSV9JS0VZXSkgeworCQlpbmV0X250b3AoQUZfSU5FVCwgUlRBX0RBVEEodGJbSUZMQV9WVElfSUtFWV0pLCBzMiwgc2l6ZW9mKHMyKSk7CisJCWZwcmludGYoZiwgImlrZXkgJXMgIiwgczIpOworCX0KKworCWlmICh0YltJRkxBX1ZUSV9PS0VZXSkgeworCQlpbmV0X250b3AoQUZfSU5FVCwgUlRBX0RBVEEodGJbSUZMQV9WVElfT0tFWV0pLCBzMiwgc2l6ZW9mKHMyKSk7CisJCWZwcmludGYoZiwgIm9rZXkgJXMgIiwgczIpOworCX0KK30KKworc3RydWN0IGxpbmtfdXRpbCB2dGk2X2xpbmtfdXRpbCA9IHsKKwkuaWQgPSAidnRpNiIsCisJLm1heGF0dHIgPSBJRkxBX1ZUSV9NQVgsCisJLnBhcnNlX29wdCA9IHZ0aTZfcGFyc2Vfb3B0LAorCS5wcmludF9vcHQgPSB2dGk2X3ByaW50X29wdCwKK307CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pcC9yb3V0ZWYgYi9pcHJvdXRlMi9pcC9yb3V0ZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI2NmUyZAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2lwL3JvdXRlZgpAQCAtMCwwICsxLDkgQEAKKyMhIC9iaW4vc2gKKworaWYgWyAteiAiJCoiIF0gOyB0aGVuCisJZXhlYyBpcCAtNCBybyBmbHVzaCAgc2NvcGUgZ2xvYmFsICB0eXBlIHVuaWNhc3QKK2Vsc2UKKwllY2hvICJVc2FnZTogcm91dGVmIgorCWVjaG8KKwllY2hvICJUaGlzIHNjcmlwdCB3aWxsIGZsdXNoIHRoZSBJUHY0IHJvdXRpbmcgdGFibGUiCitmaQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaXAvcm91dGVsIGIvaXByb3V0ZTIvaXAvcm91dGVsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMWQzNTIKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pcC9yb3V0ZWwKQEAgLTAsMCArMSw2MCBAQAorIyEvYmluL3NoCisjJElkJAorCisjCisjIFNjcmlwdCBjcmVhdGVkIGJ5OiBTdGVwaGVuIFIuIHZhbiBkZW4gQmVyZyA8c3JiQGN1Y2kubmw+LCAxOTk5LzA0LzE4CisjIERvbmF0ZWQgdG8gdGhlIHB1YmxpYyBkb21haW4uCisjCisjIFRoaXMgc2NyaXB0IHRyYW5zZm9ybXMgdGhlIG91dHB1dCBvZiAiaXAiIGludG8gbW9yZSByZWFkYWJsZSB0ZXh0LgorIyAiaXAiIGlzIHRoZSBMaW51eC1hZHZhbmNlZC1yb3V0aW5nIGNvbmZpZ3VyYXRpb24gdG9vbCBwYXJ0IG9mIHRoZQorIyBpcHJvdXRlIHBhY2thZ2UuCisjCisKK3Rlc3QgIlgtaCIgPSAiWCQxIiAmJiBlY2hvICJVc2FnZTogJDAgW3RhYmxlbnIgW3JhdyBpcCBhcmdzLi4uXV0iICYmIGV4aXQgNjQKKwordGVzdCAteiAiJCoiICYmIHNldCAwCisKK2lwIHJvdXRlIGxpc3QgdGFibGUgIiRAIiB8Cisgd2hpbGUgcmVhZCBuZXR3b3JrIHJlc3QKKyBkbyBzZXQgeHggJHJlc3QKKyAgICBzaGlmdAorICAgIHByb3RvPSIiCisgICAgdmlhPSIiCisgICAgZGV2PSIiCisgICAgc2NvcGU9IiIKKyAgICBzcmM9IiIKKyAgICB0YWJsZT0iIgorICAgIGNhc2UgJG5ldHdvcmsgaW4KKyAgICAgICBicm9hZGNhc3R8bG9jYWx8dW5yZWFjaGFibGUpIHZpYT0kbmV0d29yaworICAgICAgICAgIG5ldHdvcms9JDEKKyAgICAgICAgICBzaGlmdAorICAgICAgICAgIDs7CisgICAgZXNhYworICAgIHdoaWxlIHRlc3QgJCMgIT0gMAorICAgIGRvCisgICAgICAga2V5PSQxCisgICAgICAgdmFsPSQyCisgICAgICAgZXZhbCAiJGtleT0kdmFsIgorICAgICAgIHNoaWZ0IDIKKyAgICBkb25lCisgICAgZWNobyAiJG5ldHdvcmsJJHZpYQkkc3JjCSRwcm90bwkkc2NvcGUJJGRldgkkdGFibGUiCisgZG9uZSB8IGF3ayAtRiAnCScgJworQkVHSU4geworICAgZm9ybWF0PSIlMTVzJS0zcyAlMTVzICUxNXMgJThzICU4cyU3cyAlc1xuIjsKKyAgIHByaW50Zihmb3JtYXQsInRhcmdldCIsIiIsImdhdGV3YXkiLCJzb3VyY2UiLCJwcm90byIsInNjb3BlIiwiZGV2IiwidGJsIik7CisgfQorIHsgbmV0d29yaz0kMTsKKyAgIG1hc2s9IiI7CisgICBpZihtYXRjaChuZXR3b3JrLCIvIikpCisgICAgeyBtYXNrPSIgInN1YnN0cihuZXR3b3JrLFJTVEFSVCsxKTsKKyAgICAgIG5ldHdvcms9c3Vic3RyKG5ldHdvcmssMCxSU1RBUlQpOworICAgIH0KKyAgIHZpYT0kMjsKKyAgIHNyYz0kMzsKKyAgIHByb3RvPSQ0OworICAgc2NvcGU9JDU7CisgICBkZXY9JDY7CisgICB0YWJsZT0kNzsKKyAgIHByaW50Zihmb3JtYXQsbmV0d29yayxtYXNrLHZpYSxzcmMscHJvdG8sc2NvcGUsZGV2LHRhYmxlKTsKKyB9CisnCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pcC9ydG1fbWFwLmMgYi9pcHJvdXRlMi9pcC9ydG1fbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ3ZDJjNwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2lwL3J0bV9tYXAuYwpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIHJ0bV9tYXAuYworICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCitjaGFyICpydG5sX3J0bnR5cGVfbjJhKGludCBpZCwgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCXN3aXRjaCAoaWQpIHsKKwljYXNlIFJUTl9VTlNQRUM6CisJCXJldHVybiAibm9uZSI7CisJY2FzZSBSVE5fVU5JQ0FTVDoKKwkJcmV0dXJuICJ1bmljYXN0IjsKKwljYXNlIFJUTl9MT0NBTDoKKwkJcmV0dXJuICJsb2NhbCI7CisJY2FzZSBSVE5fQlJPQURDQVNUOgorCQlyZXR1cm4gImJyb2FkY2FzdCI7CisJY2FzZSBSVE5fQU5ZQ0FTVDoKKwkJcmV0dXJuICJhbnljYXN0IjsKKwljYXNlIFJUTl9NVUxUSUNBU1Q6CisJCXJldHVybiAibXVsdGljYXN0IjsKKwljYXNlIFJUTl9CTEFDS0hPTEU6CisJCXJldHVybiAiYmxhY2tob2xlIjsKKwljYXNlIFJUTl9VTlJFQUNIQUJMRToKKwkJcmV0dXJuICJ1bnJlYWNoYWJsZSI7CisJY2FzZSBSVE5fUFJPSElCSVQ6CisJCXJldHVybiAicHJvaGliaXQiOworCWNhc2UgUlROX1RIUk9XOgorCQlyZXR1cm4gInRocm93IjsKKwljYXNlIFJUTl9OQVQ6CisJCXJldHVybiAibmF0IjsKKwljYXNlIFJUTl9YUkVTT0xWRToKKwkJcmV0dXJuICJ4cmVzb2x2ZSI7CisJZGVmYXVsdDoKKwkJc25wcmludGYoYnVmLCBsZW4sICIlZCIsIGlkKTsKKwkJcmV0dXJuIGJ1ZjsKKwl9Cit9CisKKworaW50IHJ0bmxfcnRudHlwZV9hMm4oaW50ICppZCwgY2hhciAqYXJnKQoreworCWNoYXIgKmVuZDsKKwl1bnNpZ25lZCBsb25nIHJlczsKKworCWlmIChzdHJjbXAoYXJnLCAibG9jYWwiKSA9PSAwKQorCQlyZXMgPSBSVE5fTE9DQUw7CisJZWxzZSBpZiAoc3RyY21wKGFyZywgIm5hdCIpID09IDApCisJCXJlcyA9IFJUTl9OQVQ7CisJZWxzZSBpZiAobWF0Y2hlcyhhcmcsICJicm9hZGNhc3QiKSA9PSAwIHx8CisJCSBzdHJjbXAoYXJnLCAiYnJkIikgPT0gMCkKKwkJcmVzID0gUlROX0JST0FEQ0FTVDsKKwllbHNlIGlmIChtYXRjaGVzKGFyZywgImFueWNhc3QiKSA9PSAwKQorCQlyZXMgPSBSVE5fQU5ZQ0FTVDsKKwllbHNlIGlmIChtYXRjaGVzKGFyZywgIm11bHRpY2FzdCIpID09IDApCisJCXJlcyA9IFJUTl9NVUxUSUNBU1Q7CisJZWxzZSBpZiAobWF0Y2hlcyhhcmcsICJwcm9oaWJpdCIpID09IDApCisJCXJlcyA9IFJUTl9QUk9ISUJJVDsKKwllbHNlIGlmIChtYXRjaGVzKGFyZywgInVucmVhY2hhYmxlIikgPT0gMCkKKwkJcmVzID0gUlROX1VOUkVBQ0hBQkxFOworCWVsc2UgaWYgKG1hdGNoZXMoYXJnLCAiYmxhY2tob2xlIikgPT0gMCkKKwkJcmVzID0gUlROX0JMQUNLSE9MRTsKKwllbHNlIGlmIChtYXRjaGVzKGFyZywgInhyZXNvbHZlIikgPT0gMCkKKwkJcmVzID0gUlROX1hSRVNPTFZFOworCWVsc2UgaWYgKG1hdGNoZXMoYXJnLCAidW5pY2FzdCIpID09IDApCisJCXJlcyA9IFJUTl9VTklDQVNUOworCWVsc2UgaWYgKHN0cmNtcChhcmcsICJ0aHJvdyIpID09IDApCisJCXJlcyA9IFJUTl9USFJPVzsKKwllbHNlIHsKKwkJcmVzID0gc3RydG91bChhcmcsICZlbmQsIDApOworCQlpZiAoIWVuZCB8fCBlbmQgPT0gYXJnIHx8ICplbmQgfHwgcmVzID4gMjU1KQorCQkJcmV0dXJuIC0xOworCX0KKwkqaWQgPSByZXM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3J0X3JlYWxtcyhfX3UzMiAqcmVhbG1zLCBjaGFyICphcmcpCit7CisJX191MzIgcmVhbG0gPSAwOworCWNoYXIgKnAgPSBzdHJjaHIoYXJnLCAnLycpOworCisJKnJlYWxtcyA9IDA7CisJaWYgKHApIHsKKwkJKnAgPSAwOworCQlpZiAocnRubF9ydHJlYWxtX2EybihyZWFsbXMsIGFyZykpIHsKKwkJCSpwID0gJy8nOworCQkJcmV0dXJuIC0xOworCQl9CisJCSpyZWFsbXMgPDw9IDE2OworCQkqcCA9ICcvJzsKKwkJYXJnID0gcCsxOworCX0KKwlpZiAoKmFyZyAmJiBydG5sX3J0cmVhbG1fYTJuKCZyZWFsbSwgYXJnKSkKKwkJcmV0dXJuIC0xOworCSpyZWFsbXMgfD0gcmVhbG07CisJcmV0dXJuIDA7Cit9CisKK2ludCBnZXRfcnRfcmVhbG1zX29yX3JhdyhfX3UzMiAqcmVhbG1zLCBjaGFyICphcmcpCit7CisJaWYgKCFnZXRfcnRfcmVhbG1zKHJlYWxtcywgYXJnKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZ2V0X3Vuc2lnbmVkKHJlYWxtcywgYXJnLCAwKTsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2lwL3J0bW9uLmMgYi9pcHJvdXRlMi9pcC9ydG1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYjI0ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pcC9ydG1vbi5jCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogcnRtb24uYwkJUlRuZXRsaW5rIGxpc3RlbmVyLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJTTkFQU0hPVC5oIgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJsaWJuZXRsaW5rLmgiCisKK2ludCByZXNvbHZlX2hvc3RzID0gMDsKK3N0YXRpYyBpbnQgaW5pdF9waGFzZSA9IDE7CisKK3N0YXRpYyB2b2lkIHdyaXRlX3N0YW1wKEZJTEUgKmZwKQoreworCWNoYXIgYnVmWzEyOF07CisJc3RydWN0IG5sbXNnaGRyICpuMSA9ICh2b2lkKilidWY7CisJc3RydWN0IHRpbWV2YWwgdHY7CisKKwluMS0+bmxtc2dfdHlwZSA9IE5MTVNHX1RTVEFNUDsKKwluMS0+bmxtc2dfZmxhZ3MgPSAwOworCW4xLT5ubG1zZ19zZXEgPSAwOworCW4xLT5ubG1zZ19waWQgPSAwOworCW4xLT5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoNCoyKTsKKwlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKwkoKF9fdTMyKilOTE1TR19EQVRBKG4xKSlbMF0gPSB0di50dl9zZWM7CisJKChfX3UzMiopTkxNU0dfREFUQShuMSkpWzFdID0gdHYudHZfdXNlYzsKKwlmd3JpdGUoKHZvaWQqKW4xLCAxLCBOTE1TR19BTElHTihuMS0+bmxtc2dfbGVuKSwgZnApOworfQorCitzdGF0aWMgaW50IGR1bXBfbXNnKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLCBzdHJ1Y3QgcnRubF9jdHJsX2RhdGEgKmN0cmwsCisJCSAgICBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZykKK3sKKwlGSUxFICpmcCA9IChGSUxFKilhcmc7CisJaWYgKCFpbml0X3BoYXNlKQorCQl3cml0ZV9zdGFtcChmcCk7CisJZndyaXRlKCh2b2lkKiluLCAxLCBOTE1TR19BTElHTihuLT5ubG1zZ19sZW4pLCBmcCk7CisJZmZsdXNoKGZwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkdW1wX21zZzIoY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8sCisJCSAgICAgc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcpCit7CisJcmV0dXJuIGR1bXBfbXNnKHdobywgTlVMTCwgbiwgYXJnKTsKK30KKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBydG1vbiBmaWxlIEZJTEUgWyBhbGwgfCBMSVNUb2ZPQkpFQ1RTXVxuIik7CisJZnByaW50ZihzdGRlcnIsICJMSVNUb2ZPQkpFQ1RTIDo9IFsgbGluayBdIFsgYWRkcmVzcyBdIFsgcm91dGUgXVxuIik7CisJZXhpdCgtMSk7Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJRklMRSAqZnA7CisJc3RydWN0IHJ0bmxfaGFuZGxlIHJ0aDsKKwlpbnQgZmFtaWx5ID0gQUZfVU5TUEVDOworCXVuc2lnbmVkIGdyb3VwcyA9IH4wVTsKKwlpbnQgbGxpbmsgPSAwOworCWludCBsYWRkciA9IDA7CisJaW50IGxyb3V0ZSA9IDA7CisJY2hhciAqZmlsZSA9IE5VTEw7CisKKwl3aGlsZSAoYXJnYyA+IDEpIHsKKwkJaWYgKG1hdGNoZXMoYXJndlsxXSwgIi1mYW1pbHkiKSA9PSAwKSB7CisJCQlhcmdjLS07CisJCQlhcmd2Kys7CisJCQlpZiAoYXJnYyA8PSAxKQorCQkJCXVzYWdlKCk7CisJCQlpZiAoc3RyY21wKGFyZ3ZbMV0sICJpbmV0IikgPT0gMCkKKwkJCQlmYW1pbHkgPSBBRl9JTkVUOworCQkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJpbmV0NiIpID09IDApCisJCQkJZmFtaWx5ID0gQUZfSU5FVDY7CisJCQllbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImxpbmsiKSA9PSAwKQorCQkJCWZhbWlseSA9IEFGX0lORVQ2OworCQkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJoZWxwIikgPT0gMCkKKwkJCQl1c2FnZSgpOworCQkJZWxzZSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJQcm90b2NvbCBJRCBcIiVzXCIgaXMgdW5rbm93biwgdHJ5IFwicnRtb24gaGVscFwiLlxuIiwgYXJndlsxXSk7CisJCQkJZXhpdCgtMSk7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICItNCIpID09IDApIHsKKwkJCWZhbWlseSA9IEFGX0lORVQ7CisJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICItNiIpID09IDApIHsKKwkJCWZhbWlseSA9IEFGX0lORVQ2OworCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiLTAiKSA9PSAwKSB7CisJCQlmYW1pbHkgPSBBRl9QQUNLRVQ7CisJCX0gZWxzZSBpZiAobWF0Y2hlcyhhcmd2WzFdLCAiLVZlcnNpb24iKSA9PSAwKSB7CisJCQlwcmludGYoInJ0bW9uIHV0aWxpdHksIGlwcm91dGUyLXNzJXNcbiIsIFNOQVBTSE9UKTsKKwkJCWV4aXQoMCk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcyhhcmd2WzFdLCAiZmlsZSIpID09IDApIHsKKwkJCWFyZ2MtLTsKKwkJCWFyZ3YrKzsKKwkJCWlmIChhcmdjIDw9IDEpCisJCQkJdXNhZ2UoKTsKKwkJCWZpbGUgPSBhcmd2WzFdOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoYXJndlsxXSwgImxpbmsiKSA9PSAwKSB7CisJCQlsbGluaz0xOworCQkJZ3JvdXBzID0gMDsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKGFyZ3ZbMV0sICJhZGRyZXNzIikgPT0gMCkgeworCQkJbGFkZHI9MTsKKwkJCWdyb3VwcyA9IDA7CisJCX0gZWxzZSBpZiAobWF0Y2hlcyhhcmd2WzFdLCAicm91dGUiKSA9PSAwKSB7CisJCQlscm91dGU9MTsKKwkJCWdyb3VwcyA9IDA7CisJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJhbGwiKSA9PSAwKSB7CisJCQlncm91cHMgPSB+MFU7CisJCX0gZWxzZSBpZiAobWF0Y2hlcyhhcmd2WzFdLCAiaGVscCIpID09IDApIHsKKwkJCXVzYWdlKCk7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkFyZ3VtZW50IFwiJXNcIiBpcyB1bmtub3duLCB0cnkgXCJydG1vbiBoZWxwXCIuXG4iLCBhcmd2WzFdKTsKKwkJCWV4aXQoLTEpOworCQl9CisJCWFyZ2MtLTsJYXJndisrOworCX0KKworCWlmIChmaWxlID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJOb3QgZW5vdWdoIGluZm9ybWF0aW9uOiBhcmd1bWVudCBcImZpbGVcIiBpcyByZXF1aXJlZFxuIik7CisJCWV4aXQoLTEpOworCX0KKwlpZiAobGxpbmspCisJCWdyb3VwcyB8PSBubF9tZ3JwKFJUTkxHUlBfTElOSyk7CisJaWYgKGxhZGRyKSB7CisJCWlmICghZmFtaWx5IHx8IGZhbWlseSA9PSBBRl9JTkVUKQorCQkJZ3JvdXBzIHw9IG5sX21ncnAoUlROTEdSUF9JUFY0X0lGQUREUik7CisJCWlmICghZmFtaWx5IHx8IGZhbWlseSA9PSBBRl9JTkVUNikKKwkJCWdyb3VwcyB8PSBubF9tZ3JwKFJUTkxHUlBfSVBWNl9JRkFERFIpOworCX0KKwlpZiAobHJvdXRlKSB7CisJCWlmICghZmFtaWx5IHx8IGZhbWlseSA9PSBBRl9JTkVUKQorCQkJZ3JvdXBzIHw9IG5sX21ncnAoUlROTEdSUF9JUFY0X1JPVVRFKTsKKwkJaWYgKCFmYW1pbHkgfHwgZmFtaWx5ID09IEFGX0lORVQ2KQorCQkJZ3JvdXBzIHw9IG5sX21ncnAoUlROTEdSUF9JUFY2X1JPVVRFKTsKKwl9CisKKwlmcCA9IGZvcGVuKGZpbGUsICJ3Iik7CisJaWYgKGZwID09IE5VTEwpIHsKKwkJcGVycm9yKCJDYW5ub3QgZm9wZW4iKTsKKwkJZXhpdCgtMSk7CisJfQorCisJaWYgKHJ0bmxfb3BlbigmcnRoLCBncm91cHMpIDwgMCkKKwkJZXhpdCgxKTsKKworCWlmIChydG5sX3dpbGRkdW1wX3JlcXVlc3QoJnJ0aCwgQUZfVU5TUEVDLCBSVE1fR0VUTElOSykgPCAwKSB7CisJCXBlcnJvcigiQ2Fubm90IHNlbmQgZHVtcCByZXF1ZXN0Iik7CisJCWV4aXQoMSk7CisJfQorCisJd3JpdGVfc3RhbXAoZnApOworCisJaWYgKHJ0bmxfZHVtcF9maWx0ZXIoJnJ0aCwgZHVtcF9tc2cyLCBmcCkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRHVtcCB0ZXJtaW5hdGVkXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaW5pdF9waGFzZSA9IDA7CisKKwlpZiAocnRubF9saXN0ZW4oJnJ0aCwgZHVtcF9tc2csICh2b2lkKilmcCkgPCAwKQorCQlleGl0KDIpOworCisJZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2lwL3J0cHIgYi9pcHJvdXRlMi9pcC9ydHByCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNjI5ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pcC9ydHByCkBAIC0wLDAgKzEsNCBAQAorIyEgL2Jpbi9iYXNoCisKK2V4ZWMgdHIgIltcXFxcXSIgIlsKK10iCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pcC9zdGF0aWMtc3ltcy5jIGIvaXByb3V0ZTIvaXAvc3RhdGljLXN5bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmM4MDc0Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvaXAvc3RhdGljLXN5bXMuYwpAQCAtMCwwICsxLDE0IEBACisvKgorICogVGhpcyBmaWxlIGNyZWF0ZXMgYSBkdW1teSB2ZXJzaW9uIG9mIGR5bmFtaWMgbG9hZGluZworICogZm9yIGVudmlyb25tZW50cyB3aGVyZSBkeW5hbWljIGxpbmtpbmcKKyAqIGlzIG5vdCB1c2VkIG9yIGF2YWlsYWJsZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZGxmY24uaCIKKwordm9pZCAqX2Rsc3ltKGNvbnN0IGNoYXIgKnN5bSkKK3sKKyNpbmNsdWRlICJzdGF0aWMtc3ltcy5oIgorCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaXAvdGNwX21ldHJpY3MuYyBiL2lwcm91dGUyL2lwL3RjcF9tZXRyaWNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdiNjA1ZgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2lwL3RjcF9tZXRyaWNzLmMKQEAgLTAsMCArMSw1MTAgQEAKKy8qCisgKiB0Y3BfbWV0cmljcy5jCSJpcCB0Y3BfbWV0cmljcy90Y3BtZXRyaWNzIgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQl2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisgKgorICogQXV0aG9yczoJSnVsaWFuIEFuYXN0YXNvdiA8amFAc3NpLmJnPiwgQXVndXN0IDIwMTIKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorCisjaW5jbHVkZSA8bGludXgvZ2VuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvdGNwX21ldHJpY3MuaD4KKworI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiaXBfY29tbW9uLmgiCisjaW5jbHVkZSAibGliZ2VubC5oIgorCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGlwIHRjcF9tZXRyaWNzL3RjcG1ldHJpY3MgeyBDT01NQU5EIHwgaGVscCB9XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBpcCB0Y3BfbWV0cmljcyB7IHNob3cgfCBmbHVzaCB9IFNFTEVDVE9SXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBpcCB0Y3BfbWV0cmljcyBkZWxldGUgWyBhZGRyZXNzIF0gQUREUkVTU1xuIik7CisJZnByaW50ZihzdGRlcnIsICJTRUxFQ1RPUiA6PSBbIFsgYWRkcmVzcyBdIFBSRUZJWCBdXG4iKTsKKwlleGl0KC0xKTsKK30KKworLyogbmV0bGluayBzb2NrZXQgKi8KK3N0YXRpYyBzdHJ1Y3QgcnRubF9oYW5kbGUgZ3J0aCA9IHsgLmZkID0gLTEgfTsKK3N0YXRpYyBpbnQgZ2VubF9mYW1pbHkgPSAtMTsKKworI2RlZmluZSBUQ1BNX1JFUVVFU1QoX3JlcSwgX2J1ZnNpeiwgX2NtZCwgX2ZsYWdzKSBcCisJR0VOTF9SRVFVRVNUKF9yZXEsIF9idWZzaXosIGdlbmxfZmFtaWx5LCAwLCBcCisJCSAgICAgVENQX01FVFJJQ1NfR0VOTF9WRVJTSU9OLCBfY21kLCBfZmxhZ3MpCisKKyNkZWZpbmUgQ01EX0xJU1QJMHgwMDAxCS8qIGxpc3QsIGxzdCwgc2hvdwkJKi8KKyNkZWZpbmUgQ01EX0RFTAkJMHgwMDAyCS8qIGRlbGV0ZSwgcmVtb3ZlCQkqLworI2RlZmluZSBDTURfRkxVU0gJMHgwMDA0CS8qIGZsdXNoCQkJKi8KKworc3RhdGljIHN0cnVjdCB7CisJY2hhcgkqbmFtZTsKKwlpbnQJY29kZTsKK30gY21kc1tdID0geworCXsJImxpc3QiLAkJQ01EX0xJU1QJfSwKKwl7CSJsc3QiLAkJQ01EX0xJU1QJfSwKKwl7CSJzaG93IiwJCUNNRF9MSVNUCX0sCisJewkiZGVsZXRlIiwJQ01EX0RFTAkJfSwKKwl7CSJyZW1vdmUiLAlDTURfREVMCQl9LAorCXsJImZsdXNoIiwJQ01EX0ZMVVNICX0sCit9OworCitzdGF0aWMgY2hhciAqbWV0cmljX25hbWVbVENQX01FVFJJQ19NQVggKyAxXSA9IHsKKwlbVENQX01FVFJJQ19SVFRdCQk9ICJydHQiLAorCVtUQ1BfTUVUUklDX1JUVFZBUl0JCT0gInJ0dHZhciIsCisJW1RDUF9NRVRSSUNfU1NUSFJFU0hdCQk9ICJzc3RocmVzaCIsCisJW1RDUF9NRVRSSUNfQ1dORF0JCT0gImN3bmQiLAorCVtUQ1BfTUVUUklDX1JFT1JERVJJTkddCQk9ICJyZW9yZGVyaW5nIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QKK3sKKwlpbnQgZmx1c2hlZDsKKwljaGFyICpmbHVzaGI7CisJaW50IGZsdXNocDsKKwlpbnQgZmx1c2hlOworCWludCBjbWQ7CisJaW5ldF9wcmVmaXggZGFkZHI7CisJaW5ldF9wcmVmaXggc2FkZHI7Cit9IGY7CisKK3N0YXRpYyBpbnQgZmx1c2hfdXBkYXRlKHZvaWQpCit7CisJaWYgKHJ0bmxfc2VuZF9jaGVjaygmZ3J0aCwgZi5mbHVzaGIsIGYuZmx1c2hwKSA8IDApIHsKKwkJcGVycm9yKCJGYWlsZWQgdG8gc2VuZCBmbHVzaCByZXF1ZXN0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlmLmZsdXNocCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19tc2coY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8sIHN0cnVjdCBubG1zZ2hkciAqbiwKKwkJICAgICAgIHZvaWQgKmFyZykKK3sKKwlGSUxFICpmcCA9IChGSUxFICopIGFyZzsKKwlzdHJ1Y3QgZ2VubG1zZ2hkciAqZ2hkcjsKKwlzdHJ1Y3QgcnRhdHRyICphdHRyc1tUQ1BfTUVUUklDU19BVFRSX01BWCArIDFdLCAqYTsKKwlpbnQgbGVuID0gbi0+bmxtc2dfbGVuOworCWNoYXIgYWJ1ZlsyNTZdOworCWluZXRfcHJlZml4IGRhZGRyLCBzYWRkcjsKKwlpbnQgZmFtaWx5LCBpLCBhdHlwZSwgc3R5cGUsIGRsZW4gPSAwLCBzbGVuID0gMDsKKworCWlmIChuLT5ubG1zZ190eXBlICE9IGdlbmxfZmFtaWx5KQorCQlyZXR1cm4gLTE7CisKKwlsZW4gLT0gTkxNU0dfTEVOR1RIKEdFTkxfSERSTEVOKTsKKwlpZiAobGVuIDwgMCkKKwkJcmV0dXJuIC0xOworCisJZ2hkciA9IE5MTVNHX0RBVEEobik7CisJaWYgKGdoZHItPmNtZCAhPSBUQ1BfTUVUUklDU19DTURfR0VUKQorCQlyZXR1cm4gMDsKKworCXBhcnNlX3J0YXR0cihhdHRycywgVENQX01FVFJJQ1NfQVRUUl9NQVgsICh2b2lkICopIGdoZHIgKyBHRU5MX0hEUkxFTiwKKwkJICAgICBsZW4pOworCisJYSA9IGF0dHJzW1RDUF9NRVRSSUNTX0FUVFJfQUREUl9JUFY0XTsKKwlpZiAoYSkgeworCQlpZiAoZi5kYWRkci5mYW1pbHkgJiYgZi5kYWRkci5mYW1pbHkgIT0gQUZfSU5FVCkKKwkJCXJldHVybiAwOworCQltZW1jcHkoJmRhZGRyLmRhdGEsIFJUQV9EQVRBKGEpLCA0KTsKKwkJZGFkZHIuYnl0ZWxlbiA9IDQ7CisJCWZhbWlseSA9IEFGX0lORVQ7CisJCWF0eXBlID0gVENQX01FVFJJQ1NfQVRUUl9BRERSX0lQVjQ7CisJCWRsZW4gPSBSVEFfUEFZTE9BRChhKTsKKwl9IGVsc2UgeworCQlhID0gYXR0cnNbVENQX01FVFJJQ1NfQVRUUl9BRERSX0lQVjZdOworCQlpZiAoYSkgeworCQkJaWYgKGYuZGFkZHIuZmFtaWx5ICYmIGYuZGFkZHIuZmFtaWx5ICE9IEFGX0lORVQ2KQorCQkJCXJldHVybiAwOworCQkJbWVtY3B5KCZkYWRkci5kYXRhLCBSVEFfREFUQShhKSwgMTYpOworCQkJZGFkZHIuYnl0ZWxlbiA9IDE2OworCQkJZmFtaWx5ID0gQUZfSU5FVDY7CisJCQlhdHlwZSA9IFRDUF9NRVRSSUNTX0FUVFJfQUREUl9JUFY2OworCQkJZGxlbiA9IFJUQV9QQVlMT0FEKGEpOworCQl9IGVsc2UKKwkJCXJldHVybiAwOworCX0KKworCWEgPSBhdHRyc1tUQ1BfTUVUUklDU19BVFRSX1NBRERSX0lQVjRdOworCWlmIChhKSB7CisJCWlmIChmLnNhZGRyLmZhbWlseSAmJiBmLnNhZGRyLmZhbWlseSAhPSBBRl9JTkVUKQorCQkJcmV0dXJuIDA7CisJCW1lbWNweSgmc2FkZHIuZGF0YSwgUlRBX0RBVEEoYSksIDQpOworCQlzYWRkci5ieXRlbGVuID0gNDsKKwkJc3R5cGUgPSBUQ1BfTUVUUklDU19BVFRSX1NBRERSX0lQVjQ7CisJCXNsZW4gPSBSVEFfUEFZTE9BRChhKTsKKwl9IGVsc2UgeworCQlhID0gYXR0cnNbVENQX01FVFJJQ1NfQVRUUl9TQUREUl9JUFY2XTsKKwkJaWYgKGEpIHsKKwkJCWlmIChmLnNhZGRyLmZhbWlseSAmJiBmLnNhZGRyLmZhbWlseSAhPSBBRl9JTkVUNikKKwkJCQlyZXR1cm4gMDsKKwkJCW1lbWNweSgmc2FkZHIuZGF0YSwgUlRBX0RBVEEoYSksIDE2KTsKKwkJCXNhZGRyLmJ5dGVsZW4gPSAxNjsKKwkJCXN0eXBlID0gVENQX01FVFJJQ1NfQVRUUl9TQUREUl9JUFY2OworCQkJc2xlbiA9IFJUQV9QQVlMT0FEKGEpOworCQl9CisJfQorCisJaWYgKGYuZGFkZHIuZmFtaWx5ICYmIGYuZGFkZHIuYml0bGVuID49IDAgJiYKKwkgICAgaW5ldF9hZGRyX21hdGNoKCZkYWRkciwgJmYuZGFkZHIsIGYuZGFkZHIuYml0bGVuKSkKKwkgICAgICAgcmV0dXJuIDA7CisJLyogT25seSBjaGVjayBmb3IgdGhlIHNvdXJjZS1hZGRyZXNzIGlmIHRoZSBrZXJuZWwgc3VwcG9ydHMgaXQsCisJICogbWVhbmluZyBzbGVuICE9IDAuCisJICovCisJaWYgKHNsZW4gJiYgZi5zYWRkci5mYW1pbHkgJiYgZi5zYWRkci5iaXRsZW4gPj0gMCAmJgorCSAgICBpbmV0X2FkZHJfbWF0Y2goJnNhZGRyLCAmZi5zYWRkciwgZi5zYWRkci5iaXRsZW4pKQorCQlyZXR1cm4gMDsKKworCWlmIChmLmZsdXNoYikgeworCQlzdHJ1Y3Qgbmxtc2doZHIgKmZuOworCQlUQ1BNX1JFUVVFU1QocmVxMiwgMTI4LCBUQ1BfTUVUUklDU19DTURfREVMLCBOTE1fRl9SRVFVRVNUKTsKKworCQlhZGRhdHRyX2woJnJlcTIubiwgc2l6ZW9mKHJlcTIpLCBhdHlwZSwgJmRhZGRyLmRhdGEsCisJCQkgIGRhZGRyLmJ5dGVsZW4pOworCQlpZiAoc2xlbikKKwkJCWFkZGF0dHJfbCgmcmVxMi5uLCBzaXplb2YocmVxMiksIHN0eXBlLCAmc2FkZHIuZGF0YSwKKwkJCQkgIHNhZGRyLmJ5dGVsZW4pOworCisJCWlmIChOTE1TR19BTElHTihmLmZsdXNocCkgKyByZXEyLm4ubmxtc2dfbGVuID4gZi5mbHVzaGUpIHsKKwkJCWlmIChmbHVzaF91cGRhdGUoKSkKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwkJZm4gPSAoc3RydWN0IG5sbXNnaGRyICopIChmLmZsdXNoYiArIE5MTVNHX0FMSUdOKGYuZmx1c2hwKSk7CisJCW1lbWNweShmbiwgJnJlcTIubiwgcmVxMi5uLm5sbXNnX2xlbik7CisJCWZuLT5ubG1zZ19zZXEgPSArK2dydGguc2VxOworCQlmLmZsdXNocCA9ICgoKGNoYXIgKikgZm4pICsgcmVxMi5uLm5sbXNnX2xlbikgLSBmLmZsdXNoYjsKKwkJZi5mbHVzaGVkKys7CisJCWlmIChzaG93X3N0YXRzIDwgMikKKwkJCXJldHVybiAwOworCX0KKworCWlmIChmLmNtZCAmIChDTURfREVMIHwgQ01EX0ZMVVNIKSkKKwkJZnByaW50ZihmcCwgIkRlbGV0ZWQgIik7CisKKwlmcHJpbnRmKGZwLCAiJXMiLAorCQlmb3JtYXRfaG9zdChmYW1pbHksIGRsZW4sICZkYWRkci5kYXRhLCBhYnVmLCBzaXplb2YoYWJ1ZikpKTsKKworCWEgPSBhdHRyc1tUQ1BfTUVUUklDU19BVFRSX0FHRV07CisJaWYgKGEpIHsKKwkJdW5zaWduZWQgbG9uZyBsb25nIHZhbCA9IHJ0YV9nZXRhdHRyX3U2NChhKTsKKworCQlmcHJpbnRmKGZwLCAiIGFnZSAlbGx1LiUwM2xsdXNlYyIsCisJCQl2YWwgLyAxMDAwLCB2YWwgJSAxMDAwKTsKKwl9CisKKwlhID0gYXR0cnNbVENQX01FVFJJQ1NfQVRUUl9UV19UU19TVEFNUF07CisJaWYgKGEpIHsKKwkJX19zMzIgdmFsID0gKF9fczMyKSBydGFfZ2V0YXR0cl91MzIoYSk7CisJCV9fdTMyIHRzdmFsOworCisJCWEgPSBhdHRyc1tUQ1BfTUVUUklDU19BVFRSX1RXX1RTVkFMXTsKKwkJdHN2YWwgPSBhID8gcnRhX2dldGF0dHJfdTMyKGEpIDogMDsKKwkJZnByaW50ZihmcCwgIiB0d190cyAldS8lZHNlYyBhZ28iLCB0c3ZhbCwgdmFsKTsKKwl9CisKKwlhID0gYXR0cnNbVENQX01FVFJJQ1NfQVRUUl9WQUxTXTsKKwlpZiAoYSkgeworCQlzdHJ1Y3QgcnRhdHRyICptW1RDUF9NRVRSSUNfTUFYICsgMSArIDFdOworCQl1bnNpZ25lZCBsb25nIHJ0dCA9IDAsIHJ0dHZhciA9IDA7CisKKwkJcGFyc2VfcnRhdHRyX25lc3RlZChtLCBUQ1BfTUVUUklDX01BWCArIDEsIGEpOworCisJCWZvciAoaSA9IDA7IGkgPCBUQ1BfTUVUUklDX01BWCArIDE7IGkrKykgeworCQkJdW5zaWduZWQgbG9uZyB2YWw7CisKKwkJCWEgPSBtW2kgKyAxXTsKKwkJCWlmICghYSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChpICE9IFRDUF9NRVRSSUNfUlRUICYmCisJCQkgICAgaSAhPSBUQ1BfTUVUUklDX1JUVF9VUyAmJgorCQkJICAgIGkgIT0gVENQX01FVFJJQ19SVFRWQVIgJiYKKwkJCSAgICBpICE9IFRDUF9NRVRSSUNfUlRUVkFSX1VTKSB7CisJCQkJaWYgKG1ldHJpY19uYW1lW2ldKQorCQkJCQlmcHJpbnRmKGZwLCAiICVzICIsIG1ldHJpY19uYW1lW2ldKTsKKwkJCQllbHNlCisJCQkJCWZwcmludGYoZnAsICIgbWV0cmljXyVkICIsIGkpOworCQkJfQorCQkJdmFsID0gcnRhX2dldGF0dHJfdTMyKGEpOworCQkJc3dpdGNoIChpKSB7CisJCQljYXNlIFRDUF9NRVRSSUNfUlRUOgorCQkJCWlmICghcnR0KQorCQkJCQlydHQgPSAodmFsICogMTAwMFVMKSA+PiAzOworCQkJCWJyZWFrOworCQkJY2FzZSBUQ1BfTUVUUklDX1JUVFZBUjoKKwkJCQlpZiAoIXJ0dHZhcikKKwkJCQkJcnR0dmFyID0gKHZhbCAqIDEwMDBVTCkgPj4gMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgVENQX01FVFJJQ19SVFRfVVM6CisJCQkJcnR0ID0gdmFsID4+IDM7CisJCQkJYnJlYWs7CisJCQljYXNlIFRDUF9NRVRSSUNfUlRUVkFSX1VTOgorCQkJCXJ0dHZhciA9IHZhbCA+PiAyOworCQkJCWJyZWFrOworCQkJY2FzZSBUQ1BfTUVUUklDX1NTVEhSRVNIOgorCQkJY2FzZSBUQ1BfTUVUUklDX0NXTkQ6CisJCQljYXNlIFRDUF9NRVRSSUNfUkVPUkRFUklORzoKKwkJCWRlZmF1bHQ6CisJCQkJZnByaW50ZihmcCwgIiVsdSIsIHZhbCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKHJ0dCkKKwkJCWZwcmludGYoZnAsICIgcnR0ICVsdXVzIiwgcnR0KTsKKwkJaWYgKHJ0dHZhcikKKwkJCWZwcmludGYoZnAsICIgcnR0dmFyICVsdXVzIiwgcnR0dmFyKTsKKwl9CisKKwlhID0gYXR0cnNbVENQX01FVFJJQ1NfQVRUUl9GT1BFTl9NU1NdOworCWlmIChhKQorCQlmcHJpbnRmKGZwLCAiIGZvX21zcyAldSIsIHJ0YV9nZXRhdHRyX3UxNihhKSk7CisKKwlhID0gYXR0cnNbVENQX01FVFJJQ1NfQVRUUl9GT1BFTl9TWU5fRFJPUFNdOworCWlmIChhKSB7CisJCV9fdTE2IHN5bl9sb3NzID0gcnRhX2dldGF0dHJfdTE2KGEpOworCQl1bnNpZ25lZCBsb25nIGxvbmcgdHM7CisKKwkJYSA9IGF0dHJzW1RDUF9NRVRSSUNTX0FUVFJfRk9QRU5fU1lOX0RST1BfVFNdOworCQl0cyA9IGEgPyBydGFfZ2V0YXR0cl91NjQoYSkgOiAwOworCisJCWZwcmludGYoZnAsICIgZm9fc3luX2Ryb3BzICV1LyVsbHUuJTAzbGx1c2VjIGFnbyIsCisJCQlzeW5fbG9zcywgdHMgLyAxMDAwLCB0cyAlIDEwMDApOworCX0KKworCWEgPSBhdHRyc1tUQ1BfTUVUUklDU19BVFRSX0ZPUEVOX0NPT0tJRV07CisJaWYgKGEpIHsKKwkJY2hhciBjb29raWVbMzIgKyAxXTsKKwkJdW5zaWduZWQgY2hhciAqcHRyID0gUlRBX0RBVEEoYSk7CisJCWludCBpLCBtYXggPSBSVEFfUEFZTE9BRChhKTsKKworCQlpZiAobWF4ID4gMTYpCisJCQltYXggPSAxNjsKKwkJY29va2llWzBdID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKQorCQkJc3ByaW50Zihjb29raWUgKyBpICsgaSwgIiUwMngiLCBwdHJbaV0pOworCQlmcHJpbnRmKGZwLCAiIGZvX2Nvb2tpZSAlcyIsIGNvb2tpZSk7CisJfQorCisJaWYgKHNsZW4pIHsKKwkJZnByaW50ZihmcCwgIiBzb3VyY2UgJXMiLAorCQkJZm9ybWF0X2hvc3QoZmFtaWx5LCBzbGVuLCAmc2FkZHIuZGF0YSwgYWJ1ZiwKKwkJCQkgICAgc2l6ZW9mKGFidWYpKSk7CisJfQorCisJZnByaW50ZihmcCwgIlxuIik7CisKKwlmZmx1c2goZnApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRjcG1fZG9fY21kKGludCBjbWQsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlUQ1BNX1JFUVVFU1QocmVxLCAxMDI0LCBUQ1BfTUVUUklDU19DTURfR0VULCBOTE1fRl9SRVFVRVNUKTsKKwlpbnQgYXR5cGUgPSAtMSwgc3R5cGUgPSAtMTsKKwlpbnQgYWNrOworCisJbWVtc2V0KCZmLCAwLCBzaXplb2YoZikpOworCWYuZGFkZHIuYml0bGVuID0gLTE7CisJZi5kYWRkci5mYW1pbHkgPSBwcmVmZXJyZWRfZmFtaWx5OworCWYuc2FkZHIuYml0bGVuID0gLTE7CisJZi5zYWRkci5mYW1pbHkgPSBwcmVmZXJyZWRfZmFtaWx5OworCisJc3dpdGNoIChwcmVmZXJyZWRfZmFtaWx5KSB7CisJY2FzZSBBRl9VTlNQRUM6CisJY2FzZSBBRl9JTkVUOgorCWNhc2UgQUZfSU5FVDY6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZwcmludGYoc3RkZXJyLCAiVW5zdXBwb3J0ZWQgcHJvdG9jb2wgZmFtaWx5OiAlZFxuIiwgcHJlZmVycmVkX2ZhbWlseSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlmb3IgKDsgYXJnYyA+IDA7IGFyZ2MtLSwgYXJndisrKSB7CisJCWlmIChzdHJjbXAoKmFyZ3YsICJzcmMiKSA9PSAwIHx8CisJCSAgICBzdHJjbXAoKmFyZ3YsICJzb3VyY2UiKSA9PSAwKSB7CisJCQljaGFyICp3aG8gPSAqYXJndjsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKQorCQkJCXVzYWdlKCk7CisJCQlpZiAoZi5zYWRkci5iaXRsZW4gPj0gMCkKKwkJCQlkdXBhcmcyKHdobywgKmFyZ3YpOworCisJCQlnZXRfcHJlZml4KCZmLnNhZGRyLCAqYXJndiwgcHJlZmVycmVkX2ZhbWlseSk7CisJCQlpZiAoZi5zYWRkci5ieXRlbGVuICYmIGYuc2FkZHIuYnl0ZWxlbiAqIDggPT0gZi5zYWRkci5iaXRsZW4pIHsKKwkJCQlpZiAoZi5zYWRkci5mYW1pbHkgPT0gQUZfSU5FVCkKKwkJCQkJc3R5cGUgPSBUQ1BfTUVUUklDU19BVFRSX1NBRERSX0lQVjQ7CisJCQkJZWxzZSBpZiAoZi5zYWRkci5mYW1pbHkgPT0gQUZfSU5FVDYpCisJCQkJCXN0eXBlID0gVENQX01FVFJJQ1NfQVRUUl9TQUREUl9JUFY2OworCQkJfQorCisJCQlpZiAoc3R5cGUgPCAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJFcnJvcjogYSBzcGVjaWZpYyBJUCBhZGRyZXNzIGlzIGV4cGVjdGVkIHJhdGhlciB0aGFuIFwiJXNcIlxuIiwKKwkJCQkJKmFyZ3YpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWNoYXIgKndobyA9ICJhZGRyZXNzIjsKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJhZGRyIikgPT0gMCB8fAorCQkJICAgIHN0cmNtcCgqYXJndiwgImFkZHJlc3MiKSA9PSAwKSB7CisJCQkJd2hvID0gKmFyZ3Y7CisJCQkJTkVYVF9BUkcoKTsKKwkJCX0KKwkJCWlmIChtYXRjaGVzKCphcmd2LCAiaGVscCIpID09IDApCisJCQkJdXNhZ2UoKTsKKwkJCWlmIChmLmRhZGRyLmJpdGxlbiA+PSAwKQorCQkJCWR1cGFyZzIod2hvLCAqYXJndik7CisKKwkJCWdldF9wcmVmaXgoJmYuZGFkZHIsICphcmd2LCBwcmVmZXJyZWRfZmFtaWx5KTsKKwkJCWlmIChmLmRhZGRyLmJ5dGVsZW4gJiYgZi5kYWRkci5ieXRlbGVuICogOCA9PSBmLmRhZGRyLmJpdGxlbikgeworCQkJCWlmIChmLmRhZGRyLmZhbWlseSA9PSBBRl9JTkVUKQorCQkJCQlhdHlwZSA9IFRDUF9NRVRSSUNTX0FUVFJfQUREUl9JUFY0OworCQkJCWVsc2UgaWYgKGYuZGFkZHIuZmFtaWx5ID09IEFGX0lORVQ2KQorCQkJCQlhdHlwZSA9IFRDUF9NRVRSSUNTX0FUVFJfQUREUl9JUFY2OworCQkJfQorCQkJaWYgKChDTURfREVMICYgY21kKSAmJiBhdHlwZSA8IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBhIHNwZWNpZmljIElQIGFkZHJlc3MgaXMgZXhwZWN0ZWQgcmF0aGVyIHRoYW4gXCIlc1wiXG4iLAorCQkJCQkqYXJndik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCWlmIChjbWQgPT0gQ01EX0RFTCAmJiBhdHlwZSA8IDApCisJCW1pc3NhcmcoImFkZHJlc3MiKTsKKworCS8qIGZsdXNoIGZvciBleGFjdCBhZGRyZXNzID8gU2luZ2xlIGRlbCAqLworCWlmIChjbWQgPT0gQ01EX0ZMVVNIICYmIGF0eXBlID49IDApCisJCWNtZCA9IENNRF9ERUw7CisKKwkvKiBmbHVzaCBmb3IgYWxsIGFkZHJlc3NlcyA/IFNpbmdsZSBkZWwgd2l0aG91dCBhZGRyZXNzICovCisJaWYgKGNtZCA9PSBDTURfRkxVU0ggJiYgZi5kYWRkci5iaXRsZW4gPD0gMCAmJgorCSAgICBmLnNhZGRyLmJpdGxlbiA8PSAwICYmIHByZWZlcnJlZF9mYW1pbHkgPT0gQUZfVU5TUEVDKSB7CisJCWNtZCA9IENNRF9ERUw7CisJCXJlcS5nLmNtZCA9IFRDUF9NRVRSSUNTX0NNRF9ERUw7CisJCWFjayA9IDE7CisJfSBlbHNlIGlmIChjbWQgPT0gQ01EX0RFTCkgeworCQlyZXEuZy5jbWQgPSBUQ1BfTUVUUklDU19DTURfREVMOworCQlhY2sgPSAxOworCX0gZWxzZSB7CS8qIENNRF9GTFVTSCwgQ01EX0xJU1QgKi8KKwkJYWNrID0gMDsKKwl9CisKKwlpZiAoZ2VubF9mYW1pbHkgPCAwKSB7CisJCWlmIChydG5sX29wZW5fYnlwcm90bygmZ3J0aCwgMCwgTkVUTElOS19HRU5FUklDKSA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9wZW4gZ2VuZXJpYyBuZXRsaW5rIHNvY2tldFxuIik7CisJCQlleGl0KDEpOworCQl9CisJCWdlbmxfZmFtaWx5ID0gZ2VubF9yZXNvbHZlX2ZhbWlseSgmZ3J0aCwKKwkJCQkJCSAgVENQX01FVFJJQ1NfR0VOTF9OQU1FKTsKKwkJaWYgKGdlbmxfZmFtaWx5IDwgMCkKKwkJCWV4aXQoMSk7CisJCXJlcS5uLm5sbXNnX3R5cGUgPSBnZW5sX2ZhbWlseTsKKwl9CisKKwlpZiAoIShjbWQgJiBDTURfRkxVU0gpICYmIChhdHlwZSA+PSAwIHx8IChjbWQgJiBDTURfREVMKSkpIHsKKwkJaWYgKGFjaykKKwkJCXJlcS5uLm5sbXNnX2ZsYWdzIHw9IE5MTV9GX0FDSzsKKwkJaWYgKGF0eXBlID49IDApCisJCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgYXR5cGUsICZmLmRhZGRyLmRhdGEsCisJCQkJICBmLmRhZGRyLmJ5dGVsZW4pOworCQlpZiAoc3R5cGUgPj0gMCkKKwkJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBzdHlwZSwgJmYuc2FkZHIuZGF0YSwKKwkJCQkgIGYuc2FkZHIuYnl0ZWxlbik7CisJfSBlbHNlIHsKKwkJcmVxLm4ubmxtc2dfZmxhZ3MgfD0gTkxNX0ZfRFVNUDsKKwl9CisKKwlmLmNtZCA9IGNtZDsKKwlpZiAoY21kICYgQ01EX0ZMVVNIKSB7CisJCWludCByb3VuZCA9IDA7CisJCWNoYXIgZmx1c2hiWzQwOTYtNTEyXTsKKworCQlmLmZsdXNoYiA9IGZsdXNoYjsKKwkJZi5mbHVzaHAgPSAwOworCQlmLmZsdXNoZSA9IHNpemVvZihmbHVzaGIpOworCisJCWZvciAoOzspIHsKKwkJCXJlcS5uLm5sbXNnX3NlcSA9IGdydGguZHVtcCA9ICsrZ3J0aC5zZXE7CisJCQlpZiAocnRubF9zZW5kKCZncnRoLCAmcmVxLCByZXEubi5ubG1zZ19sZW4pIDwgMCkgeworCQkJCXBlcnJvcigiRmFpbGVkIHRvIHNlbmQgZmx1c2ggcmVxdWVzdCIpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlmLmZsdXNoZWQgPSAwOworCQkJaWYgKHJ0bmxfZHVtcF9maWx0ZXIoJmdydGgsIHByb2Nlc3NfbXNnLCBzdGRvdXQpIDwgMCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiRmx1c2ggdGVybWluYXRlZFxuIik7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWlmIChmLmZsdXNoZWQgPT0gMCkgeworCQkJCWlmIChyb3VuZCA9PSAwKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiTm90aGluZyB0byBmbHVzaC5cbiIpOworCQkJCX0gZWxzZSBpZiAoc2hvd19zdGF0cykKKwkJCQkJcHJpbnRmKCIqKiogRmx1c2ggaXMgY29tcGxldGUgYWZ0ZXIgJWQgcm91bmQlcyAqKipcbiIsCisJCQkJCSAgICAgICByb3VuZCwgcm91bmQgPiAxID8gInMiIDogIiIpOworCQkJCWZmbHVzaChzdGRvdXQpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJcm91bmQrKzsKKwkJCWlmIChmbHVzaF91cGRhdGUoKSA8IDApCisJCQkJZXhpdCgxKTsKKwkJCWlmIChzaG93X3N0YXRzKSB7CisJCQkJcHJpbnRmKCJcbioqKiBSb3VuZCAlZCwgZGVsZXRpbmcgJWQgZW50cmllcyAqKipcbiIsCisJCQkJICAgICAgIHJvdW5kLCBmLmZsdXNoZWQpOworCQkJCWZmbHVzaChzdGRvdXQpOworCQkJfQorCQl9CisJCXJldHVybiAwOworCX0KKworCWlmIChhY2spIHsKKwkJaWYgKHJ0bmxfdGFsaygmZ3J0aCwgJnJlcS5uLCBOVUxMLCAwKSA8IDApCisJCQlyZXR1cm4gLTI7CisJfSBlbHNlIGlmIChhdHlwZSA+PSAwKSB7CisJCWlmIChydG5sX3RhbGsoJmdydGgsICZyZXEubiwgJnJlcS5uLCBzaXplb2YocmVxKSkgPCAwKQorCQkJcmV0dXJuIC0yOworCQlpZiAocHJvY2Vzc19tc2coTlVMTCwgJnJlcS5uLCBzdGRvdXQpIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJEdW1wIHRlcm1pbmF0ZWRcbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCX0gZWxzZSB7CisJCXJlcS5uLm5sbXNnX3NlcSA9IGdydGguZHVtcCA9ICsrZ3J0aC5zZXE7CisJCWlmIChydG5sX3NlbmQoJmdydGgsICZyZXEsIHJlcS5uLm5sbXNnX2xlbikgPCAwKSB7CisJCQlwZXJyb3IoIkZhaWxlZCB0byBzZW5kIGR1bXAgcmVxdWVzdCIpOworCQkJZXhpdCgxKTsKKwkJfQorCisJCWlmIChydG5sX2R1bXBfZmlsdGVyKCZncnRoLCBwcm9jZXNzX21zZywgc3Rkb3V0KSA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiRHVtcCB0ZXJtaW5hdGVkXG4iKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBkb190Y3BfbWV0cmljcyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGk7CisKKwlpZiAoYXJnYyA8IDEpCisJCXJldHVybiB0Y3BtX2RvX2NtZChDTURfTElTVCwgMCwgTlVMTCk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY21kcyk7IGkrKykgeworCQlpZiAobWF0Y2hlcyhhcmd2WzBdLCBjbWRzW2ldLm5hbWUpID09IDApCisJCQlyZXR1cm4gdGNwbV9kb19jbWQoY21kc1tpXS5jb2RlLCBhcmdjLTEsIGFyZ3YrMSk7CisJfQorCWlmIChtYXRjaGVzKGFyZ3ZbMF0sICJoZWxwIikgPT0gMCkKKwkJdXNhZ2UoKTsKKworCWZwcmludGYoc3RkZXJyLCAiQ29tbWFuZCBcIiVzXCIgaXMgdW5rbm93biwgIgorCQkJInRyeSBcImlwIHRjcF9tZXRyaWNzIGhlbHBcIi5cbiIsICphcmd2KTsKKwlleGl0KC0xKTsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2lwL3R1bm5lbC5jIGIvaXByb3V0ZTIvaXAvdHVubmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlmODI1YgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2lwL3R1bm5lbC5jCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogQ29weXJpZ2h0IChDKTIwMDYgVVNBR0kvV0lERSBQcm9qZWN0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcz4uCisgKi8KKy8qCisgKiBzcGxpdCBmcm9tIGlwX3R1bm5lbC5jCisgKi8KKy8qCisgKiBBdXRob3I6CisgKglNYXNhaGlkZSBOQUtBTVVSQSBAVVNBR0kKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3R1bm5lbC5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0dW5uZWwuaCIKKworY29uc3QgY2hhciAqdG5sX3N0cnByb3RvKF9fdTggcHJvdG8pCit7CisJc3RhdGljIGNoYXIgYnVmWzE2XTsKKworCXN3aXRjaCAocHJvdG8pIHsKKwljYXNlIElQUFJPVE9fSVBJUDoKKwkJc3RyY3B5KGJ1ZiwgImlwIik7CisJCWJyZWFrOworCWNhc2UgSVBQUk9UT19HUkU6CisJCXN0cmNweShidWYsICJncmUiKTsKKwkJYnJlYWs7CisJY2FzZSBJUFBST1RPX0lQVjY6CisJCXN0cmNweShidWYsICJpcHY2Iik7CisJCWJyZWFrOworCWNhc2UgSVBQUk9UT19FU1A6CisJCXN0cmNweShidWYsICJlc3AiKTsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQlzdHJjcHkoYnVmLCAiYW55Iik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0cmNweShidWYsICJ1bmtub3duIik7CisJCWJyZWFrOworCX0KKworCXJldHVybiBidWY7Cit9CisKK2ludCB0bmxfZ2V0X2lvY3RsKGNvbnN0IGNoYXIgKmJhc2VkZXYsIHZvaWQgKnApCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlpbnQgZmQ7CisJaW50IGVycjsKKworCXN0cm5jcHkoaWZyLmlmcl9uYW1lLCBiYXNlZGV2LCBJRk5BTVNJWik7CisJaWZyLmlmcl9pZnJ1LmlmcnVfZGF0YSA9ICh2b2lkKilwOworCisJZmQgPSBzb2NrZXQocHJlZmVycmVkX2ZhbWlseSwgU09DS19ER1JBTSwgMCk7CisJaWYgKGZkIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImNyZWF0ZSBzb2NrZXQgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWVyciA9IGlvY3RsKGZkLCBTSU9DR0VUVFVOTkVMLCAmaWZyKTsKKwlpZiAoZXJyKQorCQlmcHJpbnRmKHN0ZGVyciwgImdldCB0dW5uZWwgXCIlc1wiIGZhaWxlZDogJXNcbiIsIGJhc2VkZXYsCisJCQlzdHJlcnJvcihlcnJubykpOworCisJY2xvc2UoZmQpOworCXJldHVybiBlcnI7Cit9CisKK2ludCB0bmxfYWRkX2lvY3RsKGludCBjbWQsIGNvbnN0IGNoYXIgKmJhc2VkZXYsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnApCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlpbnQgZmQ7CisJaW50IGVycjsKKworCWlmIChjbWQgPT0gU0lPQ0NIR1RVTk5FTCAmJiBuYW1lWzBdKQorCQlzdHJuY3B5KGlmci5pZnJfbmFtZSwgbmFtZSwgSUZOQU1TSVopOworCWVsc2UKKwkJc3RybmNweShpZnIuaWZyX25hbWUsIGJhc2VkZXYsIElGTkFNU0laKTsKKwlpZnIuaWZyX2lmcnUuaWZydV9kYXRhID0gcDsKKworCWZkID0gc29ja2V0KHByZWZlcnJlZF9mYW1pbHksIFNPQ0tfREdSQU0sIDApOworCWlmIChmZCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJjcmVhdGUgc29ja2V0IGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwllcnIgPSBpb2N0bChmZCwgY21kLCAmaWZyKTsKKwlpZiAoZXJyKQorCQlmcHJpbnRmKHN0ZGVyciwgImFkZCB0dW5uZWwgXCIlc1wiIGZhaWxlZDogJXNcbiIsIGlmci5pZnJfbmFtZSwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJY2xvc2UoZmQpOworCXJldHVybiBlcnI7Cit9CisKK2ludCB0bmxfZGVsX2lvY3RsKGNvbnN0IGNoYXIgKmJhc2VkZXYsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnApCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlpbnQgZmQ7CisJaW50IGVycjsKKworCWlmIChuYW1lWzBdKQorCQlzdHJuY3B5KGlmci5pZnJfbmFtZSwgbmFtZSwgSUZOQU1TSVopOworCWVsc2UKKwkJc3RybmNweShpZnIuaWZyX25hbWUsIGJhc2VkZXYsIElGTkFNU0laKTsKKworCWlmci5pZnJfaWZydS5pZnJ1X2RhdGEgPSBwOworCisJZmQgPSBzb2NrZXQocHJlZmVycmVkX2ZhbWlseSwgU09DS19ER1JBTSwgMCk7CisJaWYgKGZkIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImNyZWF0ZSBzb2NrZXQgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWVyciA9IGlvY3RsKGZkLCBTSU9DREVMVFVOTkVMLCAmaWZyKTsKKwlpZiAoZXJyKQorCQlmcHJpbnRmKHN0ZGVyciwgImRlbGV0ZSB0dW5uZWwgXCIlc1wiIGZhaWxlZDogJXNcbiIsCisJCQlpZnIuaWZyX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJY2xvc2UoZmQpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdG5sX2dlbl9pb2N0bChpbnQgY21kLCBjb25zdCBjaGFyICpuYW1lLAorCQkJIHZvaWQgKnAsIGludCBza2lwZXJyKQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisJaW50IGZkOworCWludCBlcnI7CisKKwlzdHJuY3B5KGlmci5pZnJfbmFtZSwgbmFtZSwgSUZOQU1TSVopOworCWlmci5pZnJfaWZydS5pZnJ1X2RhdGEgPSBwOworCisJZmQgPSBzb2NrZXQocHJlZmVycmVkX2ZhbWlseSwgU09DS19ER1JBTSwgMCk7CisJaWYgKGZkIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImNyZWF0ZSBzb2NrZXQgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWVyciA9IGlvY3RsKGZkLCBjbWQsICZpZnIpOworCWlmIChlcnIgJiYgZXJybm8gIT0gc2tpcGVycikKKwkJZnByaW50ZihzdGRlcnIsICIlczogaW9jdGwgJXggZmFpbGVkOiAlc1xuIiwgbmFtZSwKKwkJCWNtZCwgc3RyZXJyb3IoZXJybm8pKTsKKwljbG9zZShmZCk7CisJcmV0dXJuIGVycjsKK30KKworaW50IHRubF9wcmxfaW9jdGwoaW50IGNtZCwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqcCkKK3sKKwlyZXR1cm4gdG5sX2dlbl9pb2N0bChjbWQsIG5hbWUsIHAsIC0xKTsKK30KKworaW50IHRubF82cmRfaW9jdGwoaW50IGNtZCwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqcCkKK3sKKwlyZXR1cm4gdG5sX2dlbl9pb2N0bChjbWQsIG5hbWUsIHAsIC0xKTsKK30KKworaW50IHRubF9pb2N0bF9nZXRfNnJkKGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnApCit7CisJcmV0dXJuIHRubF9nZW5faW9jdGwoU0lPQ0dFVDZSRCwgbmFtZSwgcCwgRUlOVkFMKTsKK30KKworX19iZTMyIHRubF9wYXJzZV9rZXkoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqa2V5KQoreworCXVuc2lnbmVkIHV2YWw7CisKKwlpZiAoc3RyY2hyKGtleSwgJy4nKSkKKwkJcmV0dXJuIGdldF9hZGRyMzIoa2V5KTsKKworCWlmIChnZXRfdW5zaWduZWQoJnV2YWwsIGtleSwgMCkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiaW52YWxpZCB2YWx1ZSBmb3IgXCIlc1wiOiBcIiVzXCI7IiwgbmFtZSwga2V5KTsKKwkJZnByaW50ZihzdGRlcnIsICIgaXQgc2hvdWxkIGJlIGFuIHVuc2lnbmVkIGludGVnZXJcbiIpOworCQlleGl0KC0xKTsKKwl9CisJcmV0dXJuIGh0b25sKHV2YWwpOworfQorCisvKiB0bmxfcHJpbnRfc3RhdHMgLSBwcmludCB0dW5uZWwgc3RhdGlzdGljcworICoKKyAqIEBidWYgLSB0dW5uZWwgaW50ZXJmYWNlJ3MgbGluZSBpbiAvcHJvYy9uZXQvZGV2LAorICogICAgICAgIHN0YXJ0aW5nIHBhc3QgdGhlIGludGVyZmFjZSBuYW1lIGFuZCBmb2xsb3dpbmcgY29sb24KKyAqLwordm9pZCB0bmxfcHJpbnRfc3RhdHMoY29uc3QgY2hhciAqYnVmKQoreworCXVuc2lnbmVkIGxvbmcgcnhfYnl0ZXMsIHJ4X3BhY2tldHMsIHJ4X2VycnMsIHJ4X2Ryb3BzLAorCQkgICAgICByeF9maWZvLCByeF9mcmFtZSwKKwkJICAgICAgdHhfYnl0ZXMsIHR4X3BhY2tldHMsIHR4X2VycnMsIHR4X2Ryb3BzLAorCQkgICAgICB0eF9maWZvLCB0eF9jb2xscywgdHhfY2FycmllciwgcnhfbXVsdGk7CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVsdSVsdSVsdSVsdSVsdSVsdSVsdSUqZCVsdSVsdSVsdSVsdSVsdSVsdSVsdSIsCisJICAgICAgICAgICAmcnhfYnl0ZXMsICZyeF9wYWNrZXRzLCAmcnhfZXJycywgJnJ4X2Ryb3BzLAorCSAgICAgICAgICAgJnJ4X2ZpZm8sICZyeF9mcmFtZSwgJnJ4X211bHRpLAorCSAgICAgICAgICAgJnR4X2J5dGVzLCAmdHhfcGFja2V0cywgJnR4X2VycnMsICZ0eF9kcm9wcywKKwkgICAgICAgICAgICZ0eF9maWZvLCAmdHhfY29sbHMsICZ0eF9jYXJyaWVyKSAhPSAxNCkKKwkJcmV0dXJuOworCisJcHJpbnRmKCIlcyIsIF9TTF8pOworCXByaW50ZigiUlg6IFBhY2tldHMgICAgQnl0ZXMgICAgICAgIEVycm9ycyBDc3VtRXJycyBPdXRPZlNlcSBNY2FzdHMlcyIsIF9TTF8pOworCXByaW50ZigiICAgICUtMTBsZCAlLTEybGQgJS02bGQgJS04bGQgJS04bGQgJS04bGQlcyIsCisJICAgICAgIHJ4X3BhY2tldHMsIHJ4X2J5dGVzLCByeF9lcnJzLCByeF9mcmFtZSwgcnhfZmlmbywgcnhfbXVsdGksIF9TTF8pOworCXByaW50ZigiVFg6IFBhY2tldHMgICAgQnl0ZXMgICAgICAgIEVycm9ycyBEZWFkTG9vcCBOb1JvdXRlICBOb0J1ZnMlcyIsIF9TTF8pOworCXByaW50ZigiICAgICUtMTBsZCAlLTEybGQgJS02bGQgJS04bGQgJS04bGQgJS02bGQiLAorCSAgICAgICB0eF9wYWNrZXRzLCB0eF9ieXRlcywgdHhfZXJycywgdHhfY29sbHMsIHR4X2NhcnJpZXIsIHR4X2Ryb3BzKTsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2lwL3R1bm5lbC5oIGIvaXByb3V0ZTIvaXAvdHVubmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEwM2MwZAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2lwL3R1bm5lbC5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpMjAwNiBVU0FHSS9XSURFIFByb2plY3QKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzPi4KKyAqLworLyoKKyAqIEF1dGhvcjoKKyAqCU1hc2FoaWRlIE5BS0FNVVJBIEBVU0FHSQorICovCisjaWZuZGVmIF9fVFVOTkVMX0hfXworI2RlZmluZSBfX1RVTk5FTF9IX18gMQorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworY29uc3QgY2hhciAqdG5sX3N0cnByb3RvKF9fdTggcHJvdG8pOworCitpbnQgdG5sX2dldF9pb2N0bChjb25zdCBjaGFyICpiYXNlZGV2LCB2b2lkICpwKTsKK2ludCB0bmxfYWRkX2lvY3RsKGludCBjbWQsIGNvbnN0IGNoYXIgKmJhc2VkZXYsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnApOworaW50IHRubF9kZWxfaW9jdGwoY29uc3QgY2hhciAqYmFzZWRldiwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqcCk7CitpbnQgdG5sX3BybF9pb2N0bChpbnQgY21kLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpwKTsKK2ludCB0bmxfNnJkX2lvY3RsKGludCBjbWQsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnApOworaW50IHRubF9pb2N0bF9nZXRfNnJkKGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnApOworX19iZTMyIHRubF9wYXJzZV9rZXkoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqa2V5KTsKK3ZvaWQgdG5sX3ByaW50X3N0YXRzKGNvbnN0IGNoYXIgKmJ1Zik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaXAveGZybS5oIGIvaXByb3V0ZTIvaXAveGZybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3M2M5MmUKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pcC94ZnJtLmgKQEAgLTAsMCArMSwxNTggQEAKKy8qICRVU0FHSTogJCAqLworCisvKgorICogQ29weXJpZ2h0IChDKTIwMDQgVVNBR0kvV0lERSBQcm9qZWN0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcz4uCisgKi8KKy8qCisgKiBBdXRob3JzOgorICoJTWFzYWhpZGUgTkFLQU1VUkEgQFVTQUdJCisgKi8KKworI2lmbmRlZiBfX1hGUk1fSF9fCisjZGVmaW5lIF9fWEZSTV9IX18gMQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgveGZybS5oPgorCisjaWZuZGVmIElQUFJPVE9fU0NUUAorIyBkZWZpbmUgSVBQUk9UT19TQ1RQCTEzMgorI2VuZGlmCisjaWZuZGVmIElQUFJPVE9fRENDUAorIyBkZWZpbmUgSVBQUk9UT19EQ0NQCTMzCisjZW5kaWYKKyNpZm5kZWYgSVBQUk9UT19NSAorIyBkZWZpbmUgSVBQUk9UT19NSAkxMzUKKyNlbmRpZgorCisjZGVmaW5lIFhGUk1TX1JUQSh4KSAgKChzdHJ1Y3QgcnRhdHRyKikoKChjaGFyKikoeCkpICsgTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJzYV9pbmZvKSkpKQorI2RlZmluZSBYRlJNU19QQVlMT0FEKG4pIE5MTVNHX1BBWUxPQUQobixzaXplb2Yoc3RydWN0IHhmcm1fdXNlcnNhX2luZm8pKQorCisjZGVmaW5lIFhGUk1QX1JUQSh4KSAgKChzdHJ1Y3QgcnRhdHRyKikoKChjaGFyKikoeCkpICsgTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfaW5mbykpKSkKKyNkZWZpbmUgWEZSTVBfUEFZTE9BRChuKSBOTE1TR19QQVlMT0FEKG4sc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJwb2lsY3lfaW5mbykpCisKKyNkZWZpbmUgWEZSTVNJRF9SVEEoeCkgICgoc3RydWN0IHJ0YXR0ciopKCgoY2hhciopKHgpKSArIE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgeGZybV91c2Vyc2FfaWQpKSkpCisjZGVmaW5lIFhGUk1TSURfUEFZTE9BRChuKSBOTE1TR19QQVlMT0FEKG4sc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJzYV9pZCkpCisKKyNkZWZpbmUgWEZSTVBJRF9SVEEoeCkgICgoc3RydWN0IHJ0YXR0ciopKCgoY2hhciopKHgpKSArIE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgeGZybV91c2VycG9saWN5X2lkKSkpKQorI2RlZmluZSBYRlJNUElEX1BBWUxPQUQobikgTkxNU0dfUEFZTE9BRChuLHNpemVvZihzdHJ1Y3QgeGZybV91c2VycG9pbGN5X2lkKSkKKworI2RlZmluZSBYRlJNQUNRX1JUQSh4KQkoKHN0cnVjdCBydGF0dHIqKSgoKGNoYXIqKSh4KSkgKyBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IHhmcm1fdXNlcl9hY3F1aXJlKSkpKQorI2RlZmluZSBYRlJNRVhQX1JUQSh4KQkoKHN0cnVjdCBydGF0dHIqKSgoKGNoYXIqKSh4KSkgKyBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IHhmcm1fdXNlcl9leHBpcmUpKSkpCisjZGVmaW5lIFhGUk1QRVhQX1JUQSh4KQkoKHN0cnVjdCBydGF0dHIqKSgoKGNoYXIqKSh4KSkgKyBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IHhmcm1fdXNlcl9wb2xleHBpcmUpKSkpCisKKyNkZWZpbmUgWEZSTVJFUF9SVEEoeCkJKChzdHJ1Y3QgcnRhdHRyKikoKChjaGFyKikoeCkpICsgTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJfcmVwb3J0KSkpKQorCisjZGVmaW5lIFhGUk1TQVBEX1JUQSh4KQkoKHN0cnVjdCBydGF0dHIqKSgoKGNoYXIqKSh4KSkgKyBOTE1TR19BTElHTihzaXplb2YoX191MzIpKSkpCisjZGVmaW5lIFhGUk1fRkxBR19QUklOVChmcCwgZmxhZ3MsIGYsIHMpIFwKKwlkbyB7IFwKKwkJaWYgKGZsYWdzICYgZikgeyBcCisJCQlmbGFncyAmPSB+ZjsgXAorCQkJZnByaW50ZihmcCwgcyAiJXMiLCAoZmxhZ3MgPyAiICIgOiAiIikpOyBcCisJCX0gXAorCX0gd2hpbGUoMCkKKworc3RydWN0IHhmcm1fYnVmZmVyIHsKKwljaGFyICpidWY7CisJaW50IHNpemU7CisJaW50IG9mZnNldDsKKworCWludCBubG1zZ19jb3VudDsKKwlzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0aDsKK307CisKK3N0cnVjdCB4ZnJtX2ZpbHRlciB7CisJaW50IHVzZTsKKworCXN0cnVjdCB4ZnJtX3VzZXJzYV9pbmZvIHhzaW5mbzsKKwlfX3U4IGlkX3NyY19tYXNrOworCV9fdTggaWRfZHN0X21hc2s7CisJX191OCBpZF9wcm90b19tYXNrOworCV9fdTMyIGlkX3NwaV9tYXNrOworCV9fdTggbW9kZV9tYXNrOworCV9fdTMyIHJlcWlkX21hc2s7CisJX191OCBzdGF0ZV9mbGFnc19tYXNrOworCisJc3RydWN0IHhmcm1fdXNlcnBvbGljeV9pbmZvIHhwaW5mbzsKKwlfX3U4IGRpcl9tYXNrOworCV9fdTggc2VsX3NyY19tYXNrOworCV9fdTggc2VsX2RzdF9tYXNrOworCV9fdTMyIHNlbF9kZXZfbWFzazsKKwlfX3U4IHVwc3BlY19wcm90b19tYXNrOworCV9fdTE2IHVwc3BlY19zcG9ydF9tYXNrOworCV9fdTE2IHVwc3BlY19kcG9ydF9tYXNrOworCV9fdTMyIGluZGV4X21hc2s7CisJX191OCBhY3Rpb25fbWFzazsKKwlfX3UzMiBwcmlvcml0eV9tYXNrOworCV9fdTggcG9saWN5X2ZsYWdzX21hc2s7CisKKwlfX3U4IHB0eXBlOworCV9fdTggcHR5cGVfbWFzazsKKworfTsKKyNkZWZpbmUgWEZSTV9GSUxURVJfTUFTS19GVUxMICh+MCkKKworZXh0ZXJuIHN0cnVjdCB4ZnJtX2ZpbHRlciBmaWx0ZXI7CisKK2ludCB4ZnJtX3N0YXRlX3ByaW50KGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sCisJCSAgICAgdm9pZCAqYXJnKTsKK2ludCB4ZnJtX3BvbGljeV9wcmludChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobywgc3RydWN0IG5sbXNnaGRyICpuLAorCQkgICAgICB2b2lkICphcmcpOworaW50IGRvX3hmcm1fc3RhdGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKK2ludCBkb194ZnJtX3BvbGljeShpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworaW50IGRvX3hmcm1fbW9uaXRvcihpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCitpbnQgeGZybV9hZGRyX21hdGNoKHhmcm1fYWRkcmVzc190ICp4MSwgeGZybV9hZGRyZXNzX3QgKngyLCBpbnQgYml0cyk7CitpbnQgeGZybV94ZnJtcHJvdG9faXNfaXBzZWMoX191OCBwcm90byk7CitpbnQgeGZybV94ZnJtcHJvdG9faXNfcm8oX191OCBwcm90byk7CitpbnQgeGZybV94ZnJtcHJvdG9fZ2V0YnluYW1lKGNoYXIgKm5hbWUpOworaW50IHhmcm1fYWxnb3R5cGVfZ2V0YnluYW1lKGNoYXIgKm5hbWUpOworaW50IHhmcm1fcGFyc2VfbWFyayhzdHJ1Y3QgeGZybV9tYXJrICptYXJrLCBpbnQgKmFyZ2NwLCBjaGFyICoqKmFyZ3ZwKTsKK2NvbnN0IGNoYXIgKnN0cnhmX3hmcm1wcm90byhfX3U4IHByb3RvKTsKK2NvbnN0IGNoYXIgKnN0cnhmX2FsZ290eXBlKGludCB0eXBlKTsKK2NvbnN0IGNoYXIgKnN0cnhmX21hc2s4KF9fdTggbWFzayk7Citjb25zdCBjaGFyICpzdHJ4Zl9tYXNrMzIoX191MzIgbWFzayk7Citjb25zdCBjaGFyICpzdHJ4Zl9zaGFyZShfX3U4IHNoYXJlKTsKK2NvbnN0IGNoYXIgKnN0cnhmX3Byb3RvKF9fdTggcHJvdG8pOworY29uc3QgY2hhciAqc3RyeGZfcHR5cGUoX191OCBwdHlwZSk7Cit2b2lkIHhmcm1faWRfaW5mb19wcmludCh4ZnJtX2FkZHJlc3NfdCAqc2FkZHIsIHN0cnVjdCB4ZnJtX2lkICppZCwKKwkJCV9fdTggbW9kZSwgX191MzIgcmVxaWQsIF9fdTE2IGZhbWlseSwgaW50IGZvcmNlX3NwaSwKKwkJCUZJTEUgKmZwLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKnRpdGxlKTsKK3ZvaWQgeGZybV9zdGF0c19wcmludChzdHJ1Y3QgeGZybV9zdGF0cyAqcywgRklMRSAqZnAsIGNvbnN0IGNoYXIgKnByZWZpeCk7Cit2b2lkIHhmcm1fbGlmZXRpbWVfcHJpbnQoc3RydWN0IHhmcm1fbGlmZXRpbWVfY2ZnICpjZmcsCisJCQkgc3RydWN0IHhmcm1fbGlmZXRpbWVfY3VyICpjdXIsCisJCQkgRklMRSAqZnAsIGNvbnN0IGNoYXIgKnByZWZpeCk7Cit2b2lkIHhmcm1fc2VsZWN0b3JfcHJpbnQoc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCwgX191MTYgZmFtaWx5LAorCQkJIEZJTEUgKmZwLCBjb25zdCBjaGFyICpwcmVmaXgpOwordm9pZCB4ZnJtX3hmcm1hX3ByaW50KHN0cnVjdCBydGF0dHIgKnRiW10sIF9fdTE2IGZhbWlseSwKKwkJICAgICAgRklMRSAqZnAsIGNvbnN0IGNoYXIgKnByZWZpeCk7Cit2b2lkIHhmcm1fc3RhdGVfaW5mb19wcmludChzdHJ1Y3QgeGZybV91c2Vyc2FfaW5mbyAqeHNpbmZvLAorCQkJICAgIHN0cnVjdCBydGF0dHIgKnRiW10sIEZJTEUgKmZwLCBjb25zdCBjaGFyICpwcmVmaXgsCisJCQkgICBjb25zdCBjaGFyICp0aXRsZSk7Cit2b2lkIHhmcm1fcG9saWN5X2luZm9fcHJpbnQoc3RydWN0IHhmcm1fdXNlcnBvbGljeV9pbmZvICp4cGluZm8sCisJCQkgICAgc3RydWN0IHJ0YXR0ciAqdGJbXSwgRklMRSAqZnAsIGNvbnN0IGNoYXIgKnByZWZpeCwKKwkJCSAgICBjb25zdCBjaGFyICp0aXRsZSk7CitpbnQgeGZybV9pZF9wYXJzZSh4ZnJtX2FkZHJlc3NfdCAqc2FkZHIsIHN0cnVjdCB4ZnJtX2lkICppZCwgX191MTYgKmZhbWlseSwKKwkJICBpbnQgbG9vc2UsIGludCAqYXJnY3AsIGNoYXIgKioqYXJndnApOworaW50IHhmcm1fbW9kZV9wYXJzZShfX3U4ICptb2RlLCBpbnQgKmFyZ2NwLCBjaGFyICoqKmFyZ3ZwKTsKK2ludCB4ZnJtX2VuY2FwX3R5cGVfcGFyc2UoX191MTYgKnR5cGUsIGludCAqYXJnY3AsIGNoYXIgKioqYXJndnApOworaW50IHhmcm1fcmVxaWRfcGFyc2UoX191MzIgKnJlcWlkLCBpbnQgKmFyZ2NwLCBjaGFyICoqKmFyZ3ZwKTsKK2ludCB4ZnJtX3NlbGVjdG9yX3BhcnNlKHN0cnVjdCB4ZnJtX3NlbGVjdG9yICpzZWwsIGludCAqYXJnY3AsIGNoYXIgKioqYXJndnApOworaW50IHhmcm1fbGlmZXRpbWVfY2ZnX3BhcnNlKHN0cnVjdCB4ZnJtX2xpZmV0aW1lX2NmZyAqbGZ0LAorCQkJICAgIGludCAqYXJnY3AsIGNoYXIgKioqYXJndnApOworaW50IHhmcm1fc2N0eF9wYXJzZShjaGFyICpjdHhzdHIsIGNoYXIgKmNvbnRleHQsCisJCSAgICBzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggKnNjdHgpOworI2VuZGlmCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9pcC94ZnJtX21vbml0b3IuYyBiL2lwcm91dGUyL2lwL3hmcm1fbW9uaXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZTk5MWEKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pcC94ZnJtX21vbml0b3IuYwpAQCAtMCwwICsxLDQzNSBAQAorLyogJFVTQUdJOiAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpMjAwNSBVU0FHSS9XSURFIFByb2plY3QKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzPi4KKyAqLworLyoKKyAqIGJhc2VkIG9uIGlwbW9uaXRvci5jCisgKi8KKy8qCisgKiBBdXRob3JzOgorICoJTWFzYWhpZGUgTkFLQU1VUkEgQFVTQUdJCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ4ZnJtLmgiCisjaW5jbHVkZSAiaXBfY29tbW9uLmgiCisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CitpbnQgbGlzdGVuX2FsbF9uc2lkOworCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGlwIHhmcm0gbW9uaXRvciBbYWxsLW5zaWRdIFsgYWxsIHwgT0JKRUNUUyB8IGhlbHAgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICJPQkpFQ1RTIDo9IHsgYWNxdWlyZSB8IGV4cGlyZSB8IFNBIHwgYWV2ZW50IHwgcG9saWN5IHwgcmVwb3J0IH1cbiIpOworCWV4aXQoLTEpOworfQorCitzdGF0aWMgaW50IHhmcm1fYWNxdWlyZV9wcmludChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobywKKwkJCSAgICAgIHN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqYXJnKQoreworCUZJTEUgKmZwID0gKEZJTEUqKWFyZzsKKwlzdHJ1Y3QgeGZybV91c2VyX2FjcXVpcmUgKnhhY3EgPSBOTE1TR19EQVRBKG4pOworCWludCBsZW4gPSBuLT5ubG1zZ19sZW47CisJc3RydWN0IHJ0YXR0ciAqIHRiW1hGUk1BX01BWCsxXTsKKwlfX3UxNiBmYW1pbHk7CisKKwlsZW4gLT0gTkxNU0dfTEVOR1RIKHNpemVvZigqeGFjcSkpOworCWlmIChsZW4gPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQlVHOiB3cm9uZyBubG1zZyBsZW4gJWRcbiIsIGxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlwYXJzZV9ydGF0dHIodGIsIFhGUk1BX01BWCwgWEZSTUFDUV9SVEEoeGFjcSksIGxlbik7CisKKwlmYW1pbHkgPSB4YWNxLT5zZWwuZmFtaWx5OworCWlmIChmYW1pbHkgPT0gQUZfVU5TUEVDKQorCQlmYW1pbHkgPSB4YWNxLT5wb2xpY3kuc2VsLmZhbWlseTsKKwlpZiAoZmFtaWx5ID09IEFGX1VOU1BFQykKKwkJZmFtaWx5ID0gcHJlZmVycmVkX2ZhbWlseTsKKworCWZwcmludGYoZnAsICJhY3F1aXJlICIpOworCisJZnByaW50ZihmcCwgInByb3RvICVzICIsIHN0cnhmX3hmcm1wcm90byh4YWNxLT5pZC5wcm90bykpOworCWlmIChzaG93X3N0YXRzID4gMCB8fCB4YWNxLT5pZC5zcGkpIHsKKwkJX191MzIgc3BpID0gbnRvaGwoeGFjcS0+aWQuc3BpKTsKKwkJZnByaW50ZihmcCwgInNwaSAweCUwOHgiLCBzcGkpOworCQlpZiAoc2hvd19zdGF0cyA+IDApCisJCQlmcHJpbnRmKGZwLCAiKCV1KSIsIHNwaSk7CisJCWZwcmludGYoZnAsICIgIik7CisJfQorCWZwcmludGYoZnAsICIlcyIsIF9TTF8pOworCisJeGZybV9zZWxlY3Rvcl9wcmludCgmeGFjcS0+c2VsLCBmYW1pbHksIGZwLCAiICBzZWwgIik7CisKKwl4ZnJtX3BvbGljeV9pbmZvX3ByaW50KCZ4YWNxLT5wb2xpY3ksIHRiLCBmcCwgIiAgICAiLCAiICBwb2xpY3kgIik7CisKKwlpZiAoc2hvd19zdGF0cyA+IDApCisJCWZwcmludGYoZnAsICIgIHNlcSAweCUwOHUgIiwgeGFjcS0+c2VxKTsKKwlpZiAoc2hvd19zdGF0cyA+IDApIHsKKwkJZnByaW50ZihmcCwgIiVzLW1hc2sgJXMgIiwKKwkJCXN0cnhmX2FsZ290eXBlKFhGUk1BX0FMR19DUllQVCksCisJCQlzdHJ4Zl9tYXNrMzIoeGFjcS0+ZWFsZ29zKSk7CisJCWZwcmludGYoZnAsICIlcy1tYXNrICVzICIsCisJCQlzdHJ4Zl9hbGdvdHlwZShYRlJNQV9BTEdfQVVUSCksCisJCQlzdHJ4Zl9tYXNrMzIoeGFjcS0+YWFsZ29zKSk7CisJCWZwcmludGYoZnAsICIlcy1tYXNrICVzIiwKKwkJCXN0cnhmX2FsZ290eXBlKFhGUk1BX0FMR19DT01QKSwKKwkJCXN0cnhmX21hc2szMih4YWNxLT5jYWxnb3MpKTsKKwl9CisJZnByaW50ZihmcCwgIiVzIiwgX1NMXyk7CisKKwlpZiAob25lbGluZSkKKwkJZnByaW50ZihmcCwgIlxuIik7CisJZmZsdXNoKGZwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhmcm1fc3RhdGVfZmx1c2hfcHJpbnQoY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8sCisJCQkJICBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZykKK3sKKwlGSUxFICpmcCA9IChGSUxFKilhcmc7CisJc3RydWN0IHhmcm1fdXNlcnNhX2ZsdXNoICp4c2YgPSBOTE1TR19EQVRBKG4pOworCWludCBsZW4gPSBuLT5ubG1zZ19sZW47CisJY29uc3QgY2hhciAqc3RyOworCisJbGVuIC09IE5MTVNHX1NQQUNFKHNpemVvZigqeHNmKSk7CisJaWYgKGxlbiA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJCVUc6IHdyb25nIG5sbXNnIGxlbiAlZFxuIiwgbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZwcmludGYoZnAsICJGbHVzaGVkIHN0YXRlICIpOworCisJc3RyID0gc3RyeGZfeGZybXByb3RvKHhzZi0+cHJvdG8pOworCWlmIChzdHIpCisJCWZwcmludGYoZnAsICJwcm90byAlcyIsIHN0cik7CisJZWxzZQorCQlmcHJpbnRmKGZwLCAicHJvdG8gJXUiLCB4c2YtPnByb3RvKTsKKwlmcHJpbnRmKGZwLCAiJXMiLCBfU0xfKTsKKworCWlmIChvbmVsaW5lKQorCQlmcHJpbnRmKGZwLCAiXG4iKTsKKwlmZmx1c2goZnApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGZybV9wb2xpY3lfZmx1c2hfcHJpbnQoY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8sCisJCQkJICAgc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcpCit7CisJc3RydWN0IHJ0YXR0ciAqIHRiW1hGUk1BX01BWCsxXTsKKwlGSUxFICpmcCA9IChGSUxFKilhcmc7CisJaW50IGxlbiA9IG4tPm5sbXNnX2xlbjsKKworCWxlbiAtPSBOTE1TR19TUEFDRSgwKTsKKwlpZiAobGVuIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkJVRzogd3Jvbmcgbmxtc2cgbGVuICVkXG4iLCBsZW4pOworCQlyZXR1cm4gLTE7CisJfQorCisJZnByaW50ZihmcCwgIkZsdXNoZWQgcG9saWN5ICIpOworCisJcGFyc2VfcnRhdHRyKHRiLCBYRlJNQV9NQVgsIE5MTVNHX0RBVEEobiksIGxlbik7CisKKwlpZiAodGJbWEZSTUFfUE9MSUNZX1RZUEVdKSB7CisJCXN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfdHlwZSAqdXB0OworCisJCWZwcmludGYoZnAsICJwdHlwZSAiKTsKKworCQlpZiAoUlRBX1BBWUxPQUQodGJbWEZSTUFfUE9MSUNZX1RZUEVdKSA8IHNpemVvZigqdXB0KSkKKwkJCWZwcmludGYoZnAsICIoRVJST1IgdHJ1bmNhdGVkKSIpOworCisJCXVwdCA9IChzdHJ1Y3QgeGZybV91c2VycG9saWN5X3R5cGUgKilSVEFfREFUQSh0YltYRlJNQV9QT0xJQ1lfVFlQRV0pOworCQlmcHJpbnRmKGZwLCAiJXMgIiwgc3RyeGZfcHR5cGUodXB0LT50eXBlKSk7CisJfQorCisJZnByaW50ZihmcCwgIiVzIiwgX1NMXyk7CisKKwlpZiAob25lbGluZSkKKwkJZnByaW50ZihmcCwgIlxuIik7CisJZmZsdXNoKGZwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhmcm1fcmVwb3J0X3ByaW50KGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLAorCQkJICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZykKK3sKKwlGSUxFICpmcCA9IChGSUxFKilhcmc7CisJc3RydWN0IHhmcm1fdXNlcl9yZXBvcnQgKnhyZXAgPSBOTE1TR19EQVRBKG4pOworCWludCBsZW4gPSBuLT5ubG1zZ19sZW47CisJc3RydWN0IHJ0YXR0ciAqIHRiW1hGUk1BX01BWCsxXTsKKwlfX3UxNiBmYW1pbHk7CisKKwlsZW4gLT0gTkxNU0dfTEVOR1RIKHNpemVvZigqeHJlcCkpOworCWlmIChsZW4gPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQlVHOiB3cm9uZyBubG1zZyBsZW4gJWRcbiIsIGxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlmYW1pbHkgPSB4cmVwLT5zZWwuZmFtaWx5OworCWlmIChmYW1pbHkgPT0gQUZfVU5TUEVDKQorCQlmYW1pbHkgPSBwcmVmZXJyZWRfZmFtaWx5OworCisJZnByaW50ZihmcCwgInJlcG9ydCAiKTsKKworCWZwcmludGYoZnAsICJwcm90byAlcyAiLCBzdHJ4Zl94ZnJtcHJvdG8oeHJlcC0+cHJvdG8pKTsKKwlmcHJpbnRmKGZwLCAiJXMiLCBfU0xfKTsKKworCXhmcm1fc2VsZWN0b3JfcHJpbnQoJnhyZXAtPnNlbCwgZmFtaWx5LCBmcCwgIiAgc2VsICIpOworCisJcGFyc2VfcnRhdHRyKHRiLCBYRlJNQV9NQVgsIFhGUk1SRVBfUlRBKHhyZXApLCBsZW4pOworCisJeGZybV94ZnJtYV9wcmludCh0YiwgZmFtaWx5LCBmcCwgIiAgIik7CisKKwlpZiAob25lbGluZSkKKwkJZnByaW50ZihmcCwgIlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgeGZybV9hZV9mbGFnc19wcmludChfX3UzMiBmbGFncywgdm9pZCAqYXJnKQoreworCUZJTEUgKmZwID0gKEZJTEUqKWFyZzsKKwlmcHJpbnRmKGZwLCAiICgweCV4KSAiLCBmbGFncyk7CisJaWYgKCFmbGFncykKKwkJcmV0dXJuOworCWlmIChmbGFncyAmIFhGUk1fQUVfQ1IpCisJCWZwcmludGYoZnAsICIgcmVwbGF5IHVwZGF0ZSAiKTsKKwlpZiAoZmxhZ3MgJiBYRlJNX0FFX0NFKQorCQlmcHJpbnRmKGZwLCAiIHRpbWVyIGV4cGlyZWQgIik7CisJaWYgKGZsYWdzICYgWEZSTV9BRV9DVSkKKwkJZnByaW50ZihmcCwgIiBwb2xpY3kgdXBkYXRlZCAiKTsKKworfQorCitzdGF0aWMgdm9pZCB4ZnJtX3VzZXJzYV9wcmludChjb25zdCBzdHJ1Y3QgeGZybV91c2Vyc2FfaWQgKnNhX2lkLCBfX3UzMiByZXFpZCwgRklMRSAqZnApCit7CisJY2hhciBidWZbMjU2XTsKKworCWJ1ZlswXSA9IDA7CisJZnByaW50ZihmcCwgImRzdCAlcyAiLAorCQlydF9hZGRyX24yYShzYV9pZC0+ZmFtaWx5LCBzaXplb2Yoc2FfaWQtPmRhZGRyKSwgJnNhX2lkLT5kYWRkciwKKwkJCSAgICBidWYsIHNpemVvZihidWYpKSk7CisKKwlmcHJpbnRmKGZwLCAiIHJlcWlkIDB4JXgiLCByZXFpZCk7CisKKwlmcHJpbnRmKGZwLCAiIHByb3RvY29sICVzICIsIHN0cnhmX3Byb3RvKHNhX2lkLT5wcm90bykpOworCWZwcmludGYoZnAsICIgU1BJIDB4JXgiLCBudG9obChzYV9pZC0+c3BpKSk7Cit9CisKK3N0YXRpYyBpbnQgeGZybV9hZV9wcmludChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobywKKwkJCSAgICAgc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcpCit7CisJRklMRSAqZnAgPSAoRklMRSopYXJnOworCXN0cnVjdCB4ZnJtX2FldmVudF9pZCAqaWQgPSBOTE1TR19EQVRBKG4pOworCWNoYXIgYWJ1ZlsyNTZdOworCisJZnByaW50ZihmcCwgIkFzeW5jIGV2ZW50ICIpOworCXhmcm1fYWVfZmxhZ3NfcHJpbnQoaWQtPmZsYWdzLCBhcmcpOworCWZwcmludGYoZnAsIlxuXHQiKTsKKwltZW1zZXQoYWJ1ZiwgJ1wwJywgc2l6ZW9mKGFidWYpKTsKKwlmcHJpbnRmKGZwLCAic3JjICVzICIsIHJ0X2FkZHJfbjJhKGlkLT5zYV9pZC5mYW1pbHksCisJCQkJCSAgIHNpemVvZihpZC0+c2FkZHIpLCAmaWQtPnNhZGRyLAorCQkJCQkgICBhYnVmLCBzaXplb2YoYWJ1ZikpKTsKKworCXhmcm1fdXNlcnNhX3ByaW50KCZpZC0+c2FfaWQsIGlkLT5yZXFpZCwgZnApOworCisJZnByaW50ZihmcCwgIlxuIik7CisJZmZsdXNoKGZwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB4ZnJtX3ByaW50X2FkZHIoRklMRSAqZnAsIGludCBmYW1pbHksIHhmcm1fYWRkcmVzc190ICphKQoreworCWNoYXIgYnVmWzI1Nl07CisKKwlidWZbMF0gPSAwOworCWZwcmludGYoZnAsICIlcyIsIHJ0X2FkZHJfbjJhKGZhbWlseSwgc2l6ZW9mKCphKSwgYSwgYnVmLCBzaXplb2YoYnVmKSkpOworfQorCitzdGF0aWMgaW50IHhmcm1fbWFwcGluZ19wcmludChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobywKKwkJCSAgICAgc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcpCit7CisJRklMRSAqZnAgPSAoRklMRSopYXJnOworCXN0cnVjdCB4ZnJtX3VzZXJfbWFwcGluZyAqbWFwID0gTkxNU0dfREFUQShuKTsKKworCWZwcmludGYoZnAsICJNYXBwaW5nIGNoYW5nZSAiKTsKKwl4ZnJtX3ByaW50X2FkZHIoZnAsIG1hcC0+aWQuZmFtaWx5LCAmbWFwLT5vbGRfc2FkZHIpOworCisJZnByaW50ZihmcCwgIjolZCAtPiAiLCBudG9ocyhtYXAtPm9sZF9zcG9ydCkpOworCXhmcm1fcHJpbnRfYWRkcihmcCwgbWFwLT5pZC5mYW1pbHksICZtYXAtPm5ld19zYWRkcik7CisJZnByaW50ZihmcCwgIjolZFxuXHQiLCBudG9ocyhtYXAtPm5ld19zcG9ydCkpOworCisJeGZybV91c2Vyc2FfcHJpbnQoJm1hcC0+aWQsIG1hcC0+cmVxaWQsIGZwKTsKKworCWZwcmludGYoZnAsICJcbiIpOworCWZmbHVzaChmcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGZybV9hY2NlcHRfbXNnKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLAorCQkJICAgc3RydWN0IHJ0bmxfY3RybF9kYXRhICpjdHJsLAorCQkJICAgc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcpCit7CisJRklMRSAqZnAgPSAoRklMRSopYXJnOworCisJaWYgKHRpbWVzdGFtcCkKKwkJcHJpbnRfdGltZXN0YW1wKGZwKTsKKworCWlmIChsaXN0ZW5fYWxsX25zaWQpIHsKKwkJaWYgKGN0cmwgPT0gTlVMTCB8fCBjdHJsLT5uc2lkIDwgMCkKKwkJCWZwcmludGYoZnAsICJbbnNpZCBjdXJyZW50XSIpOworCQllbHNlCisJCQlmcHJpbnRmKGZwLCAiW25zaWQgJWRdIiwgY3RybC0+bnNpZCk7CisJfQorCisJc3dpdGNoIChuLT5ubG1zZ190eXBlKSB7CisJY2FzZSBYRlJNX01TR19ORVdTQToKKwljYXNlIFhGUk1fTVNHX0RFTFNBOgorCWNhc2UgWEZSTV9NU0dfVVBEU0E6CisJY2FzZSBYRlJNX01TR19FWFBJUkU6CisJCXhmcm1fc3RhdGVfcHJpbnQod2hvLCBuLCBhcmcpOworCQlyZXR1cm4gMDsKKwljYXNlIFhGUk1fTVNHX05FV1BPTElDWToKKwljYXNlIFhGUk1fTVNHX0RFTFBPTElDWToKKwljYXNlIFhGUk1fTVNHX1VQRFBPTElDWToKKwljYXNlIFhGUk1fTVNHX1BPTEVYUElSRToKKwkJeGZybV9wb2xpY3lfcHJpbnQod2hvLCBuLCBhcmcpOworCQlyZXR1cm4gMDsKKwljYXNlIFhGUk1fTVNHX0FDUVVJUkU6CisJCXhmcm1fYWNxdWlyZV9wcmludCh3aG8sIG4sIGFyZyk7CisJCXJldHVybiAwOworCWNhc2UgWEZSTV9NU0dfRkxVU0hTQToKKwkJeGZybV9zdGF0ZV9mbHVzaF9wcmludCh3aG8sIG4sIGFyZyk7CisJCXJldHVybiAwOworCWNhc2UgWEZSTV9NU0dfRkxVU0hQT0xJQ1k6CisJCXhmcm1fcG9saWN5X2ZsdXNoX3ByaW50KHdobywgbiwgYXJnKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBYRlJNX01TR19SRVBPUlQ6CisJCXhmcm1fcmVwb3J0X3ByaW50KHdobywgbiwgYXJnKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBYRlJNX01TR19ORVdBRToKKwkJeGZybV9hZV9wcmludCh3aG8sIG4sIGFyZyk7CisJCXJldHVybiAwOworCWNhc2UgWEZSTV9NU0dfTUFQUElORzoKKwkJeGZybV9tYXBwaW5nX3ByaW50KHdobywgbiwgYXJnKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYgKG4tPm5sbXNnX3R5cGUgIT0gTkxNU0dfRVJST1IgJiYgbi0+bmxtc2dfdHlwZSAhPSBOTE1TR19OT09QICYmCisJICAgIG4tPm5sbXNnX3R5cGUgIT0gTkxNU0dfRE9ORSkgeworCQlmcHJpbnRmKGZwLCAiVW5rbm93biBtZXNzYWdlOiAlMDhkIDB4JTA4eCAweCUwOHhcbiIsCisJCQluLT5ubG1zZ19sZW4sIG4tPm5sbXNnX3R5cGUsIG4tPm5sbXNnX2ZsYWdzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiBzdHJ1Y3QgcnRubF9oYW5kbGUgcnRoOworCitpbnQgZG9feGZybV9tb25pdG9yKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpmaWxlID0gTlVMTDsKKwl1bnNpZ25lZCBncm91cHMgPSB+KCh1bnNpZ25lZCkwKTsgLyogWFhYICovCisJaW50IGxhY3F1aXJlPTA7CisJaW50IGxleHBpcmU9MDsKKwlpbnQgbGFldmVudD0wOworCWludCBscG9saWN5PTA7CisJaW50IGxzYT0wOworCWludCBscmVwb3J0PTA7CisKKwlydG5sX2Nsb3NlKCZydGgpOworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChtYXRjaGVzKCphcmd2LCAiZmlsZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlmaWxlID0gKmFyZ3Y7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImFsbC1uc2lkIikgPT0gMCkgeworCQkJbGlzdGVuX2FsbF9uc2lkID0gMTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiYWNxdWlyZSIpID09IDApIHsKKwkJCWxhY3F1aXJlPTE7CisJCQlncm91cHMgPSAwOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJleHBpcmUiKSA9PSAwKSB7CisJCQlsZXhwaXJlPTE7CisJCQlncm91cHMgPSAwOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJTQSIpID09IDApIHsKKwkJCWxzYT0xOworCQkJZ3JvdXBzID0gMDsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiYWV2ZW50IikgPT0gMCkgeworCQkJbGFldmVudD0xOworCQkJZ3JvdXBzID0gMDsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAicG9saWN5IikgPT0gMCkgeworCQkJbHBvbGljeT0xOworCQkJZ3JvdXBzID0gMDsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAicmVwb3J0IikgPT0gMCkgeworCQkJbHJlcG9ydD0xOworCQkJZ3JvdXBzID0gMDsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiaGVscCIpID09IDApIHsKKwkJCXVzYWdlKCk7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiYWxsIikpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQXJndW1lbnQgXCIlc1wiIGlzIHVua25vd24sIHRyeSBcImlwIHhmcm0gbW9uaXRvciBoZWxwXCIuXG4iLCAqYXJndik7CisJCQlleGl0KC0xKTsKKwkJfQorCQlhcmdjLS07CWFyZ3YrKzsKKwl9CisKKwlpZiAobGFjcXVpcmUpCisJCWdyb3VwcyB8PSBubF9tZ3JwKFhGUk1OTEdSUF9BQ1FVSVJFKTsKKwlpZiAobGV4cGlyZSkKKwkJZ3JvdXBzIHw9IG5sX21ncnAoWEZSTU5MR1JQX0VYUElSRSk7CisJaWYgKGxzYSkKKwkJZ3JvdXBzIHw9IG5sX21ncnAoWEZSTU5MR1JQX1NBKTsKKwlpZiAobHBvbGljeSkKKwkJZ3JvdXBzIHw9IG5sX21ncnAoWEZSTU5MR1JQX1BPTElDWSk7CisJaWYgKGxhZXZlbnQpCisJCWdyb3VwcyB8PSBubF9tZ3JwKFhGUk1OTEdSUF9BRVZFTlRTKTsKKwlpZiAobHJlcG9ydCkKKwkJZ3JvdXBzIHw9IG5sX21ncnAoWEZSTU5MR1JQX1JFUE9SVCk7CisKKwlpZiAoZmlsZSkgeworCQlGSUxFICpmcDsKKwkJaW50IGVycjsKKworCQlmcCA9IGZvcGVuKGZpbGUsICJyIik7CisJCWlmIChmcCA9PSBOVUxMKSB7CisJCQlwZXJyb3IoIkNhbm5vdCBmb3BlbiIpOworCQkJZXhpdCgtMSk7CisJCX0KKwkJZXJyID0gcnRubF9mcm9tX2ZpbGUoZnAsIHhmcm1fYWNjZXB0X21zZywgc3Rkb3V0KTsKKwkJZmNsb3NlKGZwKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAocnRubF9vcGVuX2J5cHJvdG8oJnJ0aCwgZ3JvdXBzLCBORVRMSU5LX1hGUk0pIDwgMCkKKwkJZXhpdCgxKTsKKwlpZiAobGlzdGVuX2FsbF9uc2lkICYmIHJ0bmxfbGlzdGVuX2FsbF9uc2lkKCZydGgpIDwgMCkKKwkJZXhpdCgxKTsKKworCWlmIChydG5sX2xpc3RlbigmcnRoLCB4ZnJtX2FjY2VwdF9tc2csICh2b2lkKilzdGRvdXQpIDwgMCkKKwkJZXhpdCgyKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaXAveGZybV9wb2xpY3kuYyBiL2lwcm91dGUyL2lwL3hmcm1fcG9saWN5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZlYTFlOAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2lwL3hmcm1fcG9saWN5LmMKQEAgLTAsMCArMSwxMTgzIEBACisvKiAkVVNBR0k6ICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykyMDA0IFVTQUdJL1dJREUgUHJvamVjdAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXM+LgorICovCisvKgorICogYmFzZWQgb24gaXByb3V0ZS5jCisgKi8KKy8qCisgKiBBdXRob3JzOgorICoJTWFzYWhpZGUgTkFLQU1VUkEgQFVTQUdJCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ4ZnJtLmgiCisjaW5jbHVkZSAiaXBfY29tbW9uLmgiCisKKy8vI2RlZmluZSBOTE1TR19ERUxFVEVBTExfQlVGX1NJWkUgKDQwOTYtNTEyKQorI2RlZmluZSBOTE1TR19ERUxFVEVBTExfQlVGX1NJWkUgODE5MgorCisvKgorICogUmVjZWl2aW5nIGJ1ZmZlciBkZWZpbmVzOgorICogbmxtc2cKKyAqICAgZGF0YSA9IHN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfaW5mbworICogICBydGF0dHIKKyAqICAgICBkYXRhID0gc3RydWN0IHhmcm1fdXNlcl90bXBsW10KKyAqLworI2RlZmluZSBOTE1TR19CVUZfU0laRSA0MDk2CisjZGVmaW5lIFJUQV9CVUZfU0laRSAyMDQ4CisjZGVmaW5lIFhGUk1fVE1QTFNfQlVGX1NJWkUgMTAyNAorI2RlZmluZSBDVFhfQlVGX1NJWkUgMjU2CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogaXAgeGZybSBwb2xpY3kgeyBhZGQgfCB1cGRhdGUgfSBTRUxFQ1RPUiBkaXIgRElSIFsgY3R4IENUWCBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgWyBtYXJrIE1BUksgWyBtYXNrIE1BU0sgXSBdIFsgaW5kZXggSU5ERVggXSBbIHB0eXBlIFBUWVBFIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICBbIGFjdGlvbiBBQ1RJT04gXSBbIHByaW9yaXR5IFBSSU9SSVRZIF0gWyBmbGFnIEZMQUctTElTVCBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgWyBMSU1JVC1MSVNUIF0gWyBUTVBMLUxJU1QgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogaXAgeGZybSBwb2xpY3kgeyBkZWxldGUgfCBnZXQgfSB7IFNFTEVDVE9SIHwgaW5kZXggSU5ERVggfSBkaXIgRElSXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgWyBjdHggQ1RYIF0gWyBtYXJrIE1BUksgWyBtYXNrIE1BU0sgXSBdIFsgcHR5cGUgUFRZUEUgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogaXAgeGZybSBwb2xpY3kgeyBkZWxldGVhbGwgfCBsaXN0IH0gWyBTRUxFQ1RPUiBdIFsgZGlyIERJUiBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgWyBpbmRleCBJTkRFWCBdIFsgcHR5cGUgUFRZUEUgXSBbIGFjdGlvbiBBQ1RJT04gXSBbIHByaW9yaXR5IFBSSU9SSVRZIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICBbIGZsYWcgRkxBRy1MSVNUIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGlwIHhmcm0gcG9saWN5IGZsdXNoIFsgcHR5cGUgUFRZUEUgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogaXAgeGZybSBwb2xpY3kgY291bnRcbiIpOworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGlwIHhmcm0gcG9saWN5IHNldCBbIGh0aHJlc2g0IExCSVRTIFJCSVRTIF0gWyBodGhyZXNoNiBMQklUUyBSQklUUyBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlNFTEVDVE9SIDo9IFsgc3JjIEFERFJbL1BMRU5dIF0gWyBkc3QgQUREUlsvUExFTl0gXSBbIGRldiBERVYgXSBbIFVQU1BFQyBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlVQU1BFQyA6PSBwcm90byB7IHsgIik7CisJZnByaW50ZihzdGRlcnIsICIlcyB8ICIsIHN0cnhmX3Byb3RvKElQUFJPVE9fVENQKSk7CisJZnByaW50ZihzdGRlcnIsICIlcyB8ICIsIHN0cnhmX3Byb3RvKElQUFJPVE9fVURQKSk7CisJZnByaW50ZihzdGRlcnIsICIlcyB8ICIsIHN0cnhmX3Byb3RvKElQUFJPVE9fU0NUUCkpOworCWZwcmludGYoc3RkZXJyLCAiJXMiLCBzdHJ4Zl9wcm90byhJUFBST1RPX0RDQ1ApKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiB9IFsgc3BvcnQgUE9SVCBdIFsgZHBvcnQgUE9SVCBdIHxcbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgICAgeyAiKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzIHwgIiwgc3RyeGZfcHJvdG8oSVBQUk9UT19JQ01QKSk7CisJZnByaW50ZihzdGRlcnIsICIlcyB8ICIsIHN0cnhmX3Byb3RvKElQUFJPVE9fSUNNUFY2KSk7CisJZnByaW50ZihzdGRlcnIsICIlcyIsIHN0cnhmX3Byb3RvKElQUFJPVE9fTUgpKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiB9IFsgdHlwZSBOVU1CRVIgXSBbIGNvZGUgTlVNQkVSIF0gfFxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgICAlcyIsIHN0cnhmX3Byb3RvKElQUFJPVE9fR1JFKSk7CisJZnByaW50ZihzdGRlcnIsICIgWyBrZXkgeyBET1RURUQtUVVBRCB8IE5VTUJFUiB9IF0gfCBQUk9UTyB9XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIkRJUiA6PSBpbiB8IG91dCB8IGZ3ZFxuIik7CisJZnByaW50ZihzdGRlcnIsICJQVFlQRSA6PSBtYWluIHwgc3ViXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIkFDVElPTiA6PSBhbGxvdyB8IGJsb2NrXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIkZMQUctTElTVCA6PSBbIEZMQUctTElTVCBdIEZMQUdcbiIpOworCWZwcmludGYoc3RkZXJyLCAiRkxBRyA6PSBsb2NhbG9rIHwgaWNtcFxuIik7CisJZnByaW50ZihzdGRlcnIsICJMSU1JVC1MSVNUIDo9IFsgTElNSVQtTElTVCBdIGxpbWl0IExJTUlUXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIkxJTUlUIDo9IHsgdGltZS1zb2Z0IHwgdGltZS1oYXJkIHwgdGltZS11c2Utc29mdCB8IHRpbWUtdXNlLWhhcmQgfSBTRUNPTkRTIHxcbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgeyBieXRlLXNvZnQgfCBieXRlLWhhcmQgfSBTSVpFIHwgeyBwYWNrZXQtc29mdCB8IHBhY2tldC1oYXJkIH0gQ09VTlRcbiIpOworCWZwcmludGYoc3RkZXJyLCAiVE1QTC1MSVNUIDo9IFsgVE1QTC1MSVNUIF0gdG1wbCBUTVBMXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlRNUEwgOj0gSUQgWyBtb2RlIE1PREUgXSBbIHJlcWlkIFJFUUlEIF0gWyBsZXZlbCBMRVZFTCBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIklEIDo9IFsgc3JjIEFERFIgXSBbIGRzdCBBRERSIF0gWyBwcm90byBYRlJNLVBST1RPIF0gWyBzcGkgU1BJIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiWEZSTS1QUk9UTyA6PSAiKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzIHwgIiwgc3RyeGZfeGZybXByb3RvKElQUFJPVE9fRVNQKSk7CisJZnByaW50ZihzdGRlcnIsICIlcyB8ICIsIHN0cnhmX3hmcm1wcm90byhJUFBST1RPX0FIKSk7CisJZnByaW50ZihzdGRlcnIsICIlcyB8ICIsIHN0cnhmX3hmcm1wcm90byhJUFBST1RPX0NPTVApKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzIHwgIiwgc3RyeGZfeGZybXByb3RvKElQUFJPVE9fUk9VVElORykpOworCWZwcmludGYoc3RkZXJyLCAiJXNcbiIsIHN0cnhmX3hmcm1wcm90byhJUFBST1RPX0RTVE9QVFMpKTsKKwlmcHJpbnRmKHN0ZGVyciwgIk1PREUgOj0gdHJhbnNwb3J0IHwgdHVubmVsIHwgYmVldCB8IHJvIHwgaW5fdHJpZ2dlclxuIik7CisJZnByaW50ZihzdGRlcnIsICJMRVZFTCA6PSByZXF1aXJlZCB8IHVzZVxuIik7CisKKwlleGl0KC0xKTsKK30KKworc3RhdGljIGludCB4ZnJtX3BvbGljeV9kaXJfcGFyc2UoX191OCAqZGlyLCBpbnQgKmFyZ2NwLCBjaGFyICoqKmFyZ3ZwKQoreworCWludCBhcmdjID0gKmFyZ2NwOworCWNoYXIgKiphcmd2ID0gKmFyZ3ZwOworCisJaWYgKHN0cmNtcCgqYXJndiwgImluIikgPT0gMCkKKwkJKmRpciA9IFhGUk1fUE9MSUNZX0lOOworCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm91dCIpID09IDApCisJCSpkaXIgPSBYRlJNX1BPTElDWV9PVVQ7CisJZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZndkIikgPT0gMCkKKwkJKmRpciA9IFhGUk1fUE9MSUNZX0ZXRDsKKwllbHNlCisJCWludmFyZygiRElSIHZhbHVlIGlzIGludmFsaWQiLCAqYXJndik7CisKKwkqYXJnY3AgPSBhcmdjOworCSphcmd2cCA9IGFyZ3Y7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4ZnJtX3BvbGljeV9wdHlwZV9wYXJzZShfX3U4ICpwdHlwZSwgaW50ICphcmdjcCwgY2hhciAqKiphcmd2cCkKK3sKKwlpbnQgYXJnYyA9ICphcmdjcDsKKwljaGFyICoqYXJndiA9ICphcmd2cDsKKworCWlmIChzdHJjbXAoKmFyZ3YsICJtYWluIikgPT0gMCkKKwkJKnB0eXBlID0gWEZSTV9QT0xJQ1lfVFlQRV9NQUlOOworCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInN1YiIpID09IDApCisJCSpwdHlwZSA9IFhGUk1fUE9MSUNZX1RZUEVfU1VCOworCWVsc2UKKwkJaW52YXJnKCJQVFlQRSB2YWx1ZSBpcyBpbnZhbGlkIiwgKmFyZ3YpOworCisJKmFyZ2NwID0gYXJnYzsKKwkqYXJndnAgPSBhcmd2OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGZybV9wb2xpY3lfZmxhZ19wYXJzZShfX3U4ICpmbGFncywgaW50ICphcmdjcCwgY2hhciAqKiphcmd2cCkKK3sKKwlpbnQgYXJnYyA9ICphcmdjcDsKKwljaGFyICoqYXJndiA9ICphcmd2cDsKKwlpbnQgbGVuID0gc3RybGVuKCphcmd2KTsKKworCWlmIChsZW4gPiAyICYmIHN0cm5jbXAoKmFyZ3YsICIweCIsIDIpID09IDApIHsKKwkJX191OCB2YWwgPSAwOworCisJCWlmIChnZXRfdTgoJnZhbCwgKmFyZ3YsIDE2KSkKKwkJCWludmFyZygiRkxBRyB2YWx1ZSBpcyBpbnZhbGlkIiwgKmFyZ3YpOworCQkqZmxhZ3MgPSB2YWw7CisJfSBlbHNlIHsKKwkJd2hpbGUgKDEpIHsKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJsb2NhbG9rIikgPT0gMCkKKwkJCQkqZmxhZ3MgfD0gWEZSTV9QT0xJQ1lfTE9DQUxPSzsKKwkJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImljbXAiKSA9PSAwKQorCQkJCSpmbGFncyB8PSBYRlJNX1BPTElDWV9JQ01QOworCQkJZWxzZSB7CisJCQkJUFJFVl9BUkcoKTsgLyogYmFjayB0cmFjayAqLworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoIU5FWFRfQVJHX09LKCkpCisJCQkJYnJlYWs7CisJCQlORVhUX0FSRygpOworCQl9CisJfQorCisJKmFyZ2NwID0gYXJnYzsKKwkqYXJndnAgPSBhcmd2OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGZybV90bXBsX3BhcnNlKHN0cnVjdCB4ZnJtX3VzZXJfdG1wbCAqdG1wbCwKKwkJCSAgIGludCAqYXJnY3AsIGNoYXIgKioqYXJndnApCit7CisJaW50IGFyZ2MgPSAqYXJnY3A7CisJY2hhciAqKmFyZ3YgPSAqYXJndnA7CisJY2hhciAqaWRwID0gTlVMTDsKKworCXdoaWxlICgxKSB7CisJCWlmIChzdHJjbXAoKmFyZ3YsICJtb2RlIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCXhmcm1fbW9kZV9wYXJzZSgmdG1wbC0+bW9kZSwgICZhcmdjLCAmYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAicmVxaWQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJeGZybV9yZXFpZF9wYXJzZSgmdG1wbC0+cmVxaWQsICZhcmdjLCAmYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibGV2ZWwiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCisJCQlpZiAoc3RyY21wKCphcmd2LCAicmVxdWlyZWQiKSA9PSAwKQorCQkJCXRtcGwtPm9wdGlvbmFsID0gMDsKKwkJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInVzZSIpID09IDApCisJCQkJdG1wbC0+b3B0aW9uYWwgPSAxOworCQkJZWxzZQorCQkJCWludmFyZygiTEVWRUwgdmFsdWUgaXMgaW52YWxpZFxuIiwgKmFyZ3YpOworCisJCX0gZWxzZSB7CisJCQlpZiAoaWRwKSB7CisJCQkJUFJFVl9BUkcoKTsgLyogYmFjayB0cmFjayAqLworCQkJCWJyZWFrOworCQkJfQorCQkJaWRwID0gKmFyZ3Y7CisJCQlwcmVmZXJyZWRfZmFtaWx5ID0gQUZfVU5TUEVDOworCQkJeGZybV9pZF9wYXJzZSgmdG1wbC0+c2FkZHIsICZ0bXBsLT5pZCwgJnRtcGwtPmZhbWlseSwKKwkJCQkgICAgICAwLCAmYXJnYywgJmFyZ3YpOworCQkJcHJlZmVycmVkX2ZhbWlseSA9IHRtcGwtPmZhbWlseTsKKwkJfQorCisJCWlmICghTkVYVF9BUkdfT0soKSkKKwkJCWJyZWFrOworCisJCU5FWFRfQVJHKCk7CisJfQorCWlmIChhcmdjID09ICphcmdjcCkKKwkJbWlzc2FyZygiVE1QTCIpOworCisJKmFyZ2NwID0gYXJnYzsKKwkqYXJndnAgPSBhcmd2OworCisJcmV0dXJuIDA7Cit9CisKK2ludCB4ZnJtX3NjdHhfcGFyc2UoY2hhciAqY3R4c3RyLCBjaGFyICpzLAorCQkJICAgc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICpzY3R4KQoreworCWludCBzbGVuOworCisJc2xlbiA9IHN0cmxlbihzKSArIDE7CisKKwlzY3R4LT5leHR0eXBlID0gWEZSTUFfU0VDX0NUWDsKKwlzY3R4LT5jdHhfZG9pID0gMTsKKwlzY3R4LT5jdHhfYWxnID0gMTsKKwlzY3R4LT5jdHhfbGVuID0gc2xlbjsKKwlzY3R4LT5sZW4gPSBzaXplb2Yoc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4KSArIHNsZW47CisJbWVtY3B5KGN0eHN0ciwgcywgc2xlbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4ZnJtX3BvbGljeV9tb2RpZnkoaW50IGNtZCwgdW5zaWduZWQgZmxhZ3MsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgcnRubF9oYW5kbGUgcnRoOworCXN0cnVjdCB7CisJCXN0cnVjdCBubG1zZ2hkcgkJCW47CisJCXN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfaW5mbwl4cGluZm87CisJCWNoYXIJCQkJYnVmW1JUQV9CVUZfU0laRV07CisJfSByZXE7CisJY2hhciAqZGlycCA9IE5VTEw7CisJY2hhciAqc2VscCA9IE5VTEw7CisJY2hhciAqcHR5cGVwID0gTlVMTDsKKwljaGFyICpzY3R4cCA9IE5VTEw7CisJc3RydWN0IHhmcm1fdXNlcnBvbGljeV90eXBlIHVwdDsKKwljaGFyIHRtcGxzX2J1ZltYRlJNX1RNUExTX0JVRl9TSVpFXTsKKwlpbnQgdG1wbHNfbGVuID0gMDsKKwlzdHJ1Y3QgeGZybV9tYXJrIG1hcmsgPSB7MCwgMH07CisJc3RydWN0IHsKKwkJc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4IHNjdHg7CisJCWNoYXIJc3RyW0NUWF9CVUZfU0laRV07CisJfSBjdHg7CisKKwltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCW1lbXNldCgmdXB0LCAwLCBzaXplb2YodXB0KSk7CisJbWVtc2V0KCZ0bXBsc19idWYsIDAsIHNpemVvZih0bXBsc19idWYpKTsKKwltZW1zZXQoJmN0eCwgMCwgc2l6ZW9mKGN0eCkpOworCisJcmVxLm4ubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihyZXEueHBpbmZvKSk7CisJcmVxLm4ubmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUfGZsYWdzOworCXJlcS5uLm5sbXNnX3R5cGUgPSBjbWQ7CisJcmVxLnhwaW5mby5zZWwuZmFtaWx5ID0gcHJlZmVycmVkX2ZhbWlseTsKKworCXJlcS54cGluZm8ubGZ0LnNvZnRfYnl0ZV9saW1pdCA9IFhGUk1fSU5GOworCXJlcS54cGluZm8ubGZ0LmhhcmRfYnl0ZV9saW1pdCA9IFhGUk1fSU5GOworCXJlcS54cGluZm8ubGZ0LnNvZnRfcGFja2V0X2xpbWl0ID0gWEZSTV9JTkY7CisJcmVxLnhwaW5mby5sZnQuaGFyZF9wYWNrZXRfbGltaXQgPSBYRlJNX0lORjsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAoc3RyY21wKCphcmd2LCAiZGlyIikgPT0gMCkgeworCQkJaWYgKGRpcnApCisJCQkJZHVwYXJnKCJkaXIiLCAqYXJndik7CisJCQlkaXJwID0gKmFyZ3Y7CisKKwkJCU5FWFRfQVJHKCk7CisJCQl4ZnJtX3BvbGljeV9kaXJfcGFyc2UoJnJlcS54cGluZm8uZGlyLCAmYXJnYywgJmFyZ3YpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImN0eCIpID09IDApIHsKKwkJCWNoYXIgKmNvbnRleHQ7CisKKwkJCWlmIChzY3R4cCkKKwkJCQlkdXBhcmcoImN0eCIsICphcmd2KTsKKwkJCXNjdHhwID0gKmFyZ3Y7CisJCQlORVhUX0FSRygpOworCQkJY29udGV4dCA9ICphcmd2OworCQkJeGZybV9zY3R4X3BhcnNlKChjaGFyICopJmN0eC5zdHIsIGNvbnRleHQsICZjdHguc2N0eCk7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibWFyayIpID09IDApIHsKKwkJCXhmcm1fcGFyc2VfbWFyaygmbWFyaywgJmFyZ2MsICZhcmd2KTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJpbmRleCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmcmVxLnhwaW5mby5pbmRleCwgKmFyZ3YsIDApKQorCQkJCWludmFyZygiSU5ERVggdmFsdWUgaXMgaW52YWxpZCIsICphcmd2KTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJwdHlwZSIpID09IDApIHsKKwkJCWlmIChwdHlwZXApCisJCQkJZHVwYXJnKCJwdHlwZSIsICphcmd2KTsKKwkJCXB0eXBlcCA9ICphcmd2OworCisJCQlORVhUX0FSRygpOworCQkJeGZybV9wb2xpY3lfcHR5cGVfcGFyc2UoJnVwdC50eXBlLCAmYXJnYywgJmFyZ3YpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImFjdGlvbiIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoc3RyY21wKCphcmd2LCAiYWxsb3ciKSA9PSAwKQorCQkJCXJlcS54cGluZm8uYWN0aW9uID0gWEZSTV9QT0xJQ1lfQUxMT1c7CisJCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJibG9jayIpID09IDApCisJCQkJcmVxLnhwaW5mby5hY3Rpb24gPSBYRlJNX1BPTElDWV9CTE9DSzsKKwkJCWVsc2UKKwkJCQlpbnZhcmcoIkFDVElPTiB2YWx1ZSBpcyBpbnZhbGlkXG4iLCAqYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAicHJpb3JpdHkiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJnJlcS54cGluZm8ucHJpb3JpdHksICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoIlBSSU9SSVRZIHZhbHVlIGlzIGludmFsaWQiLCAqYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZmxhZyIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQl4ZnJtX3BvbGljeV9mbGFnX3BhcnNlKCZyZXEueHBpbmZvLmZsYWdzLCAmYXJnYywKKwkJCQkJICAgICAgICZhcmd2KTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJsaW1pdCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQl4ZnJtX2xpZmV0aW1lX2NmZ19wYXJzZSgmcmVxLnhwaW5mby5sZnQsICZhcmdjLCAmYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAidG1wbCIpID09IDApIHsKKwkJCXN0cnVjdCB4ZnJtX3VzZXJfdG1wbCAqdG1wbDsKKworCQkJaWYgKHRtcGxzX2xlbiArIHNpemVvZigqdG1wbCkgPiBzaXplb2YodG1wbHNfYnVmKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiVG9vIG1hbnkgdG1wbHM6IGJ1ZmZlciBvdmVyZmxvd1xuIik7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCXRtcGwgPSAoc3RydWN0IHhmcm1fdXNlcl90bXBsICopKChjaGFyICopdG1wbHNfYnVmICsgdG1wbHNfbGVuKTsKKworCQkJdG1wbC0+ZmFtaWx5ID0gcHJlZmVycmVkX2ZhbWlseTsKKwkJCXRtcGwtPmFhbGdvcyA9ICh+KF9fdTMyKTApOworCQkJdG1wbC0+ZWFsZ29zID0gKH4oX191MzIpMCk7CisJCQl0bXBsLT5jYWxnb3MgPSAofihfX3UzMikwKTsKKworCQkJTkVYVF9BUkcoKTsKKwkJCXhmcm1fdG1wbF9wYXJzZSh0bXBsLCAmYXJnYywgJmFyZ3YpOworCisJCQl0bXBsc19sZW4gKz0gc2l6ZW9mKCp0bXBsKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChzZWxwKQorCQkJCWR1cGFyZygidW5rbm93biIsICphcmd2KTsKKwkJCXNlbHAgPSAqYXJndjsKKworCQkJeGZybV9zZWxlY3Rvcl9wYXJzZSgmcmVxLnhwaW5mby5zZWwsICZhcmdjLCAmYXJndik7CisJCQlpZiAocHJlZmVycmVkX2ZhbWlseSA9PSBBRl9VTlNQRUMpCisJCQkJcHJlZmVycmVkX2ZhbWlseSA9IHJlcS54cGluZm8uc2VsLmZhbWlseTsKKwkJfQorCisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCWlmICghZGlycCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vdCBlbm91Z2ggaW5mb3JtYXRpb246IERJUiBpcyByZXF1aXJlZC5cbiIpOworCQlleGl0KDEpOworCX0KKworCWlmIChwdHlwZXApIHsKKwkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIFhGUk1BX1BPTElDWV9UWVBFLAorCQkJICAodm9pZCAqKSZ1cHQsIHNpemVvZih1cHQpKTsKKwl9CisKKwlpZiAodG1wbHNfbGVuID4gMCkgeworCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgWEZSTUFfVE1QTCwKKwkJCSAgKHZvaWQgKil0bXBsc19idWYsIHRtcGxzX2xlbik7CisJfQorCisJaWYgKG1hcmsubSkgeworCQlpbnQgciA9IGFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEuYnVmKSwgWEZSTUFfTUFSSywKKwkJCQkgICh2b2lkICopJm1hcmssIHNpemVvZihtYXJrKSk7CisJCWlmIChyIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICIlczogWEZSTUFfTUFSSyBmYWlsZWRcbiIsX19mdW5jX18pOworCQkJZXhpdCgxKTsKKwkJfQorCX0KKworCWlmIChzY3R4cCkgeworCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgWEZSTUFfU0VDX0NUWCwKKwkJCSAgKHZvaWQgKikmY3R4LCBjdHguc2N0eC5sZW4pOworCX0KKworCWlmIChydG5sX29wZW5fYnlwcm90bygmcnRoLCAwLCBORVRMSU5LX1hGUk0pIDwgMCkKKwkJZXhpdCgxKTsKKworCWlmIChyZXEueHBpbmZvLnNlbC5mYW1pbHkgPT0gQUZfVU5TUEVDKQorCQlyZXEueHBpbmZvLnNlbC5mYW1pbHkgPSBBRl9JTkVUOworCisJaWYgKHJ0bmxfdGFsaygmcnRoLCAmcmVxLm4sIE5VTEwsIDApIDwgMCkKKwkJZXhpdCgyKTsKKworCXJ0bmxfY2xvc2UoJnJ0aCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4ZnJtX3BvbGljeV9maWx0ZXJfbWF0Y2goc3RydWN0IHhmcm1fdXNlcnBvbGljeV9pbmZvICp4cGluZm8sCisJCQkJICAgIF9fdTggcHR5cGUpCit7CisJaWYgKCFmaWx0ZXIudXNlKQorCQlyZXR1cm4gMTsKKworCWlmICgoeHBpbmZvLT5kaXJeZmlsdGVyLnhwaW5mby5kaXIpJmZpbHRlci5kaXJfbWFzaykKKwkJcmV0dXJuIDA7CisKKwlpZiAoKHB0eXBlXmZpbHRlci5wdHlwZSkmZmlsdGVyLnB0eXBlX21hc2spCisJCXJldHVybiAwOworCisJaWYgKGZpbHRlci5zZWxfc3JjX21hc2spIHsKKwkJaWYgKHhmcm1fYWRkcl9tYXRjaCgmeHBpbmZvLT5zZWwuc2FkZHIsICZmaWx0ZXIueHBpbmZvLnNlbC5zYWRkciwKKwkJCQkgICAgZmlsdGVyLnNlbF9zcmNfbWFzaykpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZmlsdGVyLnNlbF9kc3RfbWFzaykgeworCQlpZiAoeGZybV9hZGRyX21hdGNoKCZ4cGluZm8tPnNlbC5kYWRkciwgJmZpbHRlci54cGluZm8uc2VsLmRhZGRyLAorCQkJCSAgICBmaWx0ZXIuc2VsX2RzdF9tYXNrKSkKKwkJCXJldHVybiAwOworCX0KKworCWlmICgoeHBpbmZvLT5zZWwuaWZpbmRleF5maWx0ZXIueHBpbmZvLnNlbC5pZmluZGV4KSZmaWx0ZXIuc2VsX2Rldl9tYXNrKQorCQlyZXR1cm4gMDsKKworCWlmICgoeHBpbmZvLT5zZWwucHJvdG9eZmlsdGVyLnhwaW5mby5zZWwucHJvdG8pJmZpbHRlci51cHNwZWNfcHJvdG9fbWFzaykKKwkJcmV0dXJuIDA7CisKKwlpZiAoZmlsdGVyLnVwc3BlY19zcG9ydF9tYXNrKSB7CisJCWlmICgoeHBpbmZvLT5zZWwuc3BvcnReZmlsdGVyLnhwaW5mby5zZWwuc3BvcnQpJmZpbHRlci51cHNwZWNfc3BvcnRfbWFzaykKKwkJCXJldHVybiAwOworCX0KKworCWlmIChmaWx0ZXIudXBzcGVjX2Rwb3J0X21hc2spIHsKKwkJaWYgKCh4cGluZm8tPnNlbC5kcG9ydF5maWx0ZXIueHBpbmZvLnNlbC5kcG9ydCkmZmlsdGVyLnVwc3BlY19kcG9ydF9tYXNrKQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKCh4cGluZm8tPmluZGV4XmZpbHRlci54cGluZm8uaW5kZXgpJmZpbHRlci5pbmRleF9tYXNrKQorCQlyZXR1cm4gMDsKKworCWlmICgoeHBpbmZvLT5hY3Rpb25eZmlsdGVyLnhwaW5mby5hY3Rpb24pJmZpbHRlci5hY3Rpb25fbWFzaykKKwkJcmV0dXJuIDA7CisKKwlpZiAoKHhwaW5mby0+cHJpb3JpdHleZmlsdGVyLnhwaW5mby5wcmlvcml0eSkmZmlsdGVyLnByaW9yaXR5X21hc2spCisJCXJldHVybiAwOworCisJaWYgKGZpbHRlci5wb2xpY3lfZmxhZ3NfbWFzaykKKwkJaWYgKCh4cGluZm8tPmZsYWdzICYgZmlsdGVyLnhwaW5mby5mbGFncykgPT0gMCkKKwkJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK2ludCB4ZnJtX3BvbGljeV9wcmludChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobywgc3RydWN0IG5sbXNnaGRyICpuLAorCQkgICAgICB2b2lkICphcmcpCit7CisJc3RydWN0IHJ0YXR0ciAqIHRiW1hGUk1BX01BWCsxXTsKKwlzdHJ1Y3QgcnRhdHRyICogcnRhOworCXN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfaW5mbyAqeHBpbmZvID0gTlVMTDsKKwlzdHJ1Y3QgeGZybV91c2VyX3BvbGV4cGlyZSAqeHBleHAgPSBOVUxMOworCXN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfaWQgKnhwaWQgPSBOVUxMOworCV9fdTggcHR5cGUgPSBYRlJNX1BPTElDWV9UWVBFX01BSU47CisJRklMRSAqZnAgPSAoRklMRSopYXJnOworCWludCBsZW4gPSBuLT5ubG1zZ19sZW47CisKKwlpZiAobi0+bmxtc2dfdHlwZSAhPSBYRlJNX01TR19ORVdQT0xJQ1kgJiYKKwkgICAgbi0+bmxtc2dfdHlwZSAhPSBYRlJNX01TR19ERUxQT0xJQ1kgJiYKKwkgICAgbi0+bmxtc2dfdHlwZSAhPSBYRlJNX01TR19VUERQT0xJQ1kgJiYKKwkgICAgbi0+bmxtc2dfdHlwZSAhPSBYRlJNX01TR19QT0xFWFBJUkUpIHsKKwkJZnByaW50ZihzdGRlcnIsICJOb3QgYSBwb2xpY3k6ICUwOHggJTA4eCAlMDh4XG4iLAorCQkJbi0+bmxtc2dfbGVuLCBuLT5ubG1zZ190eXBlLCBuLT5ubG1zZ19mbGFncyk7CisJCXJldHVybiAwOworCX0KKworCWlmIChuLT5ubG1zZ190eXBlID09IFhGUk1fTVNHX0RFTFBPTElDWSkgIHsKKwkJeHBpZCA9IE5MTVNHX0RBVEEobik7CisJCWxlbiAtPSBOTE1TR19TUEFDRShzaXplb2YoKnhwaWQpKTsKKwl9IGVsc2UgaWYgKG4tPm5sbXNnX3R5cGUgPT0gWEZSTV9NU0dfUE9MRVhQSVJFKSB7CisJCXhwZXhwID0gTkxNU0dfREFUQShuKTsKKwkJeHBpbmZvID0gJnhwZXhwLT5wb2w7CisJCWxlbiAtPSBOTE1TR19TUEFDRShzaXplb2YoKnhwZXhwKSk7CisJfSBlbHNlIHsKKwkJeHBleHAgPSBOVUxMOworCQl4cGluZm8gPSBOTE1TR19EQVRBKG4pOworCQlsZW4gLT0gTkxNU0dfU1BBQ0Uoc2l6ZW9mKCp4cGluZm8pKTsKKwl9CisKKwlpZiAobGVuIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkJVRzogd3Jvbmcgbmxtc2cgbGVuICVkXG4iLCBsZW4pOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKG4tPm5sbXNnX3R5cGUgPT0gWEZSTV9NU0dfREVMUE9MSUNZKQorCQlydGEgPSBYRlJNUElEX1JUQSh4cGlkKTsKKwllbHNlIGlmIChuLT5ubG1zZ190eXBlID09IFhGUk1fTVNHX1BPTEVYUElSRSkKKwkJcnRhID0gWEZSTVBFWFBfUlRBKHhwZXhwKTsKKwllbHNlCisJCXJ0YSA9IFhGUk1QX1JUQSh4cGluZm8pOworCisJcGFyc2VfcnRhdHRyKHRiLCBYRlJNQV9NQVgsIHJ0YSwgbGVuKTsKKworCWlmICh0YltYRlJNQV9QT0xJQ1lfVFlQRV0pIHsKKwkJc3RydWN0IHhmcm1fdXNlcnBvbGljeV90eXBlICp1cHQ7CisKKwkJaWYgKFJUQV9QQVlMT0FEKHRiW1hGUk1BX1BPTElDWV9UWVBFXSkgPCBzaXplb2YoKnVwdCkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAidG9vIHNob3J0IFhGUk1BX1BPTElDWV9UWVBFIGxlblxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJdXB0ID0gKHN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfdHlwZSAqKVJUQV9EQVRBKHRiW1hGUk1BX1BPTElDWV9UWVBFXSk7CisJCXB0eXBlID0gdXB0LT50eXBlOworCX0KKworCWlmICh4cGluZm8gJiYgIXhmcm1fcG9saWN5X2ZpbHRlcl9tYXRjaCh4cGluZm8sIHB0eXBlKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobi0+bmxtc2dfdHlwZSA9PSBYRlJNX01TR19ERUxQT0xJQ1kpCisJCWZwcmludGYoZnAsICJEZWxldGVkICIpOworCWVsc2UgaWYgKG4tPm5sbXNnX3R5cGUgPT0gWEZSTV9NU0dfVVBEUE9MSUNZKQorCQlmcHJpbnRmKGZwLCAiVXBkYXRlZCAiKTsKKwllbHNlIGlmIChuLT5ubG1zZ190eXBlID09IFhGUk1fTVNHX1BPTEVYUElSRSkKKwkJZnByaW50ZihmcCwgIkV4cGlyZWQgIik7CisKKwlpZiAobi0+bmxtc2dfdHlwZSA9PSBYRlJNX01TR19ERUxQT0xJQ1kpIHsKKwkJLy94ZnJtX3BvbGljeV9pZF9wcmludCgpOworCQlpZiAoIXRiW1hGUk1BX1BPTElDWV0pIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQnVnZ3kgWEZSTV9NU0dfREVMUE9MSUNZOiBubyBYRlJNQV9QT0xJQ1lcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChSVEFfUEFZTE9BRCh0YltYRlJNQV9QT0xJQ1ldKSA8IHNpemVvZigqeHBpbmZvKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJCdWdneSBYRlJNX01TR19ERUxQT0xJQ1k6IHRvbyBzaG9ydCBYRlJNQV9QT0xJQ1kgbGVuXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQl4cGluZm8gPSAoc3RydWN0IHhmcm1fdXNlcnBvbGljeV9pbmZvICopUlRBX0RBVEEodGJbWEZSTUFfUE9MSUNZXSk7CisJfQorCisJeGZybV9wb2xpY3lfaW5mb19wcmludCh4cGluZm8sIHRiLCBmcCwgTlVMTCwgTlVMTCk7CisKKwlpZiAobi0+bmxtc2dfdHlwZSA9PSBYRlJNX01TR19QT0xFWFBJUkUpIHsKKwkJZnByaW50ZihmcCwgIlx0Iik7CisJCWZwcmludGYoZnAsICJoYXJkICV1IiwgeHBleHAtPmhhcmQpOworCQlmcHJpbnRmKGZwLCAiJXMiLCBfU0xfKTsKKwl9CisKKwlpZiAob25lbGluZSkKKwkJZnByaW50ZihmcCwgIlxuIik7CisJZmZsdXNoKGZwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhmcm1fcG9saWN5X2dldF9vcl9kZWxldGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBpbnQgZGVsZXRlLAorCQkJCSAgICAgdm9pZCAqcmVzX25sYnVmLCBzaXplX3QgcmVzX3NpemUpCit7CisJc3RydWN0IHJ0bmxfaGFuZGxlIHJ0aDsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgbmxtc2doZHIJCQluOworCQlzdHJ1Y3QgeGZybV91c2VycG9saWN5X2lkCXhwaWQ7CisJCWNoYXIJCQkJYnVmW1JUQV9CVUZfU0laRV07CisJfSByZXE7CisJY2hhciAqZGlycCA9IE5VTEw7CisJY2hhciAqc2VscCA9IE5VTEw7CisJY2hhciAqaW5kZXhwID0gTlVMTDsKKwljaGFyICpwdHlwZXAgPSBOVUxMOworCWNoYXIgKnNjdHhwID0gTlVMTDsKKwlzdHJ1Y3QgeGZybV91c2VycG9saWN5X3R5cGUgdXB0OworCXN0cnVjdCB4ZnJtX21hcmsgbWFyayA9IHswLCAwfTsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggc2N0eDsKKwkJY2hhciAgICBzdHJbQ1RYX0JVRl9TSVpFXTsKKwl9IGN0eDsKKworCisJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKwltZW1zZXQoJnVwdCwgMCwgc2l6ZW9mKHVwdCkpOworCW1lbXNldCgmY3R4LCAwLCBzaXplb2YoY3R4KSk7CisKKwlyZXEubi5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHJlcS54cGlkKSk7CisJcmVxLm4ubmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUOworCXJlcS5uLm5sbXNnX3R5cGUgPSBkZWxldGUgPyBYRlJNX01TR19ERUxQT0xJQ1kgOiBYRlJNX01TR19HRVRQT0xJQ1k7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgImRpciIpID09IDApIHsKKwkJCWlmIChkaXJwKQorCQkJCWR1cGFyZygiZGlyIiwgKmFyZ3YpOworCQkJZGlycCA9ICphcmd2OworCisJCQlORVhUX0FSRygpOworCQkJeGZybV9wb2xpY3lfZGlyX3BhcnNlKCZyZXEueHBpZC5kaXIsICZhcmdjLCAmYXJndik7CisKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJjdHgiKSA9PSAwKSB7CisJCQljaGFyICpjb250ZXh0OworCisJCQlpZiAoc2N0eHApCisJCQkJZHVwYXJnKCJjdHgiLCAqYXJndik7CisJCQlzY3R4cCA9ICphcmd2OworCQkJTkVYVF9BUkcoKTsKKwkJCWNvbnRleHQgPSAqYXJndjsKKwkJCXhmcm1fc2N0eF9wYXJzZSgoY2hhciAqKSZjdHguc3RyLCBjb250ZXh0LCAmY3R4LnNjdHgpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm1hcmsiKSA9PSAwKSB7CisJCQl4ZnJtX3BhcnNlX21hcmsoJm1hcmssICZhcmdjLCAmYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaW5kZXgiKSA9PSAwKSB7CisJCQlpZiAoaW5kZXhwKQorCQkJCWR1cGFyZygiaW5kZXgiLCAqYXJndik7CisJCQlpbmRleHAgPSAqYXJndjsKKworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTMyKCZyZXEueHBpZC5pbmRleCwgKmFyZ3YsIDApKQorCQkJCWludmFyZygiSU5ERVggdmFsdWUgaXMgaW52YWxpZCIsICphcmd2KTsKKworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInB0eXBlIikgPT0gMCkgeworCQkJaWYgKHB0eXBlcCkKKwkJCQlkdXBhcmcoInB0eXBlIiwgKmFyZ3YpOworCQkJcHR5cGVwID0gKmFyZ3Y7CisKKwkJCU5FWFRfQVJHKCk7CisJCQl4ZnJtX3BvbGljeV9wdHlwZV9wYXJzZSgmdXB0LnR5cGUsICZhcmdjLCAmYXJndik7CisKKwkJfSBlbHNlIHsKKwkJCWlmIChzZWxwKQorCQkJCWludmFyZygidW5rbm93biIsICphcmd2KTsKKwkJCXNlbHAgPSAqYXJndjsKKworCQkJeGZybV9zZWxlY3Rvcl9wYXJzZSgmcmVxLnhwaWQuc2VsLCAmYXJnYywgJmFyZ3YpOworCQkJaWYgKHByZWZlcnJlZF9mYW1pbHkgPT0gQUZfVU5TUEVDKQorCQkJCXByZWZlcnJlZF9mYW1pbHkgPSByZXEueHBpZC5zZWwuZmFtaWx5OworCisJCX0KKworCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisKKwlpZiAoIWRpcnApIHsKKwkJZnByaW50ZihzdGRlcnIsICJOb3QgZW5vdWdoIGluZm9ybWF0aW9uOiBESVIgaXMgcmVxdWlyZWQuXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKHB0eXBlcCkgeworCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgWEZSTUFfUE9MSUNZX1RZUEUsCisJCQkgICh2b2lkICopJnVwdCwgc2l6ZW9mKHVwdCkpOworCX0KKwlpZiAoIXNlbHAgJiYgIWluZGV4cCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vdCBlbm91Z2ggaW5mb3JtYXRpb246IGVpdGhlciBTRUxFQ1RPUiBvciBJTkRFWCBpcyByZXF1aXJlZC5cbiIpOworCQlleGl0KDEpOworCX0KKwlpZiAoc2VscCAmJiBpbmRleHApCisJCWR1cGFyZzIoIlNFTEVDVE9SIiwgIklOREVYIik7CisKKwlpZiAocnRubF9vcGVuX2J5cHJvdG8oJnJ0aCwgMCwgTkVUTElOS19YRlJNKSA8IDApCisJCWV4aXQoMSk7CisKKwlpZiAocmVxLnhwaWQuc2VsLmZhbWlseSA9PSBBRl9VTlNQRUMpCisJCXJlcS54cGlkLnNlbC5mYW1pbHkgPSBBRl9JTkVUOworCisJaWYgKG1hcmsubSAmIG1hcmsudikgeworCQlpbnQgciA9IGFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEuYnVmKSwgWEZSTUFfTUFSSywKKwkJCQkgICh2b2lkICopJm1hcmssIHNpemVvZihtYXJrKSk7CisJCWlmIChyIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICIlczogWEZSTUFfTUFSSyBmYWlsZWRcbiIsX19mdW5jX18pOworCQkJZXhpdCgxKTsKKwkJfQorCX0KKworCWlmIChzY3R4cCkgeworCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgWEZSTUFfU0VDX0NUWCwKKwkJCSAgKHZvaWQgKikmY3R4LCBjdHguc2N0eC5sZW4pOworCX0KKworCWlmIChydG5sX3RhbGsoJnJ0aCwgJnJlcS5uLCByZXNfbmxidWYsIHJlc19zaXplKSA8IDApCisJCWV4aXQoMik7CisKKwlydG5sX2Nsb3NlKCZydGgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGZybV9wb2xpY3lfZGVsZXRlKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlyZXR1cm4geGZybV9wb2xpY3lfZ2V0X29yX2RlbGV0ZShhcmdjLCBhcmd2LCAxLCBOVUxMLCAwKTsKK30KKworc3RhdGljIGludCB4ZnJtX3BvbGljeV9nZXQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgYnVmW05MTVNHX0JVRl9TSVpFXTsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm4gPSAoc3RydWN0IG5sbXNnaGRyICopYnVmOworCisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCisJeGZybV9wb2xpY3lfZ2V0X29yX2RlbGV0ZShhcmdjLCBhcmd2LCAwLCBuLCBzaXplb2YoYnVmKSk7CisKKwlpZiAoeGZybV9wb2xpY3lfcHJpbnQoTlVMTCwgbiwgKHZvaWQqKXN0ZG91dCkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQW4gZXJyb3IgOi0pXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdpdGggYW4gZXhpc3RpbmcgcG9saWN5IG9mIG5sbXNnLCBtYWtlIG5ldyBubG1zZyBmb3IgZGVsZXRpbmcgdGhlIHBvbGljeQorICogYW5kIHN0b3JlIGl0IHRvIGJ1ZmZlci4KKyAqLworc3RhdGljIGludCB4ZnJtX3BvbGljeV9rZWVwKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLAorCQkJICAgIHN0cnVjdCBubG1zZ2hkciAqbiwKKwkJCSAgICB2b2lkICphcmcpCit7CisJc3RydWN0IHhmcm1fYnVmZmVyICp4YiA9IChzdHJ1Y3QgeGZybV9idWZmZXIgKilhcmc7CisJc3RydWN0IHJ0bmxfaGFuZGxlICpydGggPSB4Yi0+cnRoOworCXN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfaW5mbyAqeHBpbmZvID0gTkxNU0dfREFUQShuKTsKKwlpbnQgbGVuID0gbi0+bmxtc2dfbGVuOworCXN0cnVjdCBydGF0dHIgKnRiW1hGUk1BX01BWCsxXTsKKwlfX3U4IHB0eXBlID0gWEZSTV9QT0xJQ1lfVFlQRV9NQUlOOworCXN0cnVjdCBubG1zZ2hkciAqbmV3X247CisJc3RydWN0IHhmcm1fdXNlcnBvbGljeV9pZCAqeHBpZDsKKworCWlmIChuLT5ubG1zZ190eXBlICE9IFhGUk1fTVNHX05FV1BPTElDWSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vdCBhIHBvbGljeTogJTA4eCAlMDh4ICUwOHhcbiIsCisJCQluLT5ubG1zZ19sZW4sIG4tPm5sbXNnX3R5cGUsIG4tPm5sbXNnX2ZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbGVuIC09IE5MTVNHX0xFTkdUSChzaXplb2YoKnhwaW5mbykpOworCWlmIChsZW4gPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQlVHOiB3cm9uZyBubG1zZyBsZW4gJWRcbiIsIGxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlwYXJzZV9ydGF0dHIodGIsIFhGUk1BX01BWCwgWEZSTVBfUlRBKHhwaW5mbyksIGxlbik7CisKKwlpZiAodGJbWEZSTUFfUE9MSUNZX1RZUEVdKSB7CisJCXN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfdHlwZSAqdXB0OworCisJCWlmIChSVEFfUEFZTE9BRCh0YltYRlJNQV9QT0xJQ1lfVFlQRV0pIDwgc2l6ZW9mKCp1cHQpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgInRvbyBzaG9ydCBYRlJNQV9QT0xJQ1lfVFlQRSBsZW5cbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXVwdCA9IChzdHJ1Y3QgeGZybV91c2VycG9saWN5X3R5cGUgKilSVEFfREFUQSh0YltYRlJNQV9QT0xJQ1lfVFlQRV0pOworCQlwdHlwZSA9IHVwdC0+dHlwZTsKKwl9CisKKwlpZiAoIXhmcm1fcG9saWN5X2ZpbHRlcl9tYXRjaCh4cGluZm8sIHB0eXBlKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoeGItPm9mZnNldCA+IHhiLT5zaXplKSB7CisJCWZwcmludGYoc3RkZXJyLCAiUG9saWN5IGJ1ZmZlciBvdmVyZmxvd1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwluZXdfbiA9IChzdHJ1Y3Qgbmxtc2doZHIgKikoeGItPmJ1ZiArIHhiLT5vZmZzZXQpOworCW5ld19uLT5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKCp4cGlkKSk7CisJbmV3X24tPm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVDsKKwluZXdfbi0+bmxtc2dfdHlwZSA9IFhGUk1fTVNHX0RFTFBPTElDWTsKKwluZXdfbi0+bmxtc2dfc2VxID0gKytydGgtPnNlcTsKKworCXhwaWQgPSBOTE1TR19EQVRBKG5ld19uKTsKKwltZW1jcHkoJnhwaWQtPnNlbCwgJnhwaW5mby0+c2VsLCBzaXplb2YoeHBpZC0+c2VsKSk7CisJeHBpZC0+ZGlyID0geHBpbmZvLT5kaXI7CisJeHBpZC0+aW5kZXggPSB4cGluZm8tPmluZGV4OworCisJeGItPm9mZnNldCArPSBuZXdfbi0+bmxtc2dfbGVuOworCXhiLT5ubG1zZ19jb3VudCArKzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhmcm1fcG9saWN5X2xpc3Rfb3JfZGVsZXRlYWxsKGludCBhcmdjLCBjaGFyICoqYXJndiwgaW50IGRlbGV0ZWFsbCkKK3sKKwljaGFyICpzZWxwID0gTlVMTDsKKwlzdHJ1Y3QgcnRubF9oYW5kbGUgcnRoOworCisJaWYgKGFyZ2MgPiAwKQorCQlmaWx0ZXIudXNlID0gMTsKKwlmaWx0ZXIueHBpbmZvLnNlbC5mYW1pbHkgPSBwcmVmZXJyZWRfZmFtaWx5OworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChzdHJjbXAoKmFyZ3YsICJkaXIiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJeGZybV9wb2xpY3lfZGlyX3BhcnNlKCZmaWx0ZXIueHBpbmZvLmRpciwgJmFyZ2MsICZhcmd2KTsKKworCQkJZmlsdGVyLmRpcl9tYXNrID0gWEZSTV9GSUxURVJfTUFTS19GVUxMOworCisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaW5kZXgiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJmZpbHRlci54cGluZm8uaW5kZXgsICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoIklOREVYIHZhbHVlIGlzIGludmFsaWQiLCAqYXJndik7CisKKwkJCWZpbHRlci5pbmRleF9tYXNrID0gWEZSTV9GSUxURVJfTUFTS19GVUxMOworCisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAicHR5cGUiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJeGZybV9wb2xpY3lfcHR5cGVfcGFyc2UoJmZpbHRlci5wdHlwZSwgJmFyZ2MsICZhcmd2KTsKKworCQkJZmlsdGVyLnB0eXBlX21hc2sgPSBYRlJNX0ZJTFRFUl9NQVNLX0ZVTEw7CisKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJhY3Rpb24iKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHN0cmNtcCgqYXJndiwgImFsbG93IikgPT0gMCkKKwkJCQlmaWx0ZXIueHBpbmZvLmFjdGlvbiA9IFhGUk1fUE9MSUNZX0FMTE9XOworCQkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiYmxvY2siKSA9PSAwKQorCQkJCWZpbHRlci54cGluZm8uYWN0aW9uID0gWEZSTV9QT0xJQ1lfQkxPQ0s7CisJCQllbHNlCisJCQkJaW52YXJnKCJBQ1RJT04gdmFsdWUgaXMgaW52YWxpZFxuIiwgKmFyZ3YpOworCisJCQlmaWx0ZXIuYWN0aW9uX21hc2sgPSBYRlJNX0ZJTFRFUl9NQVNLX0ZVTEw7CisKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJwcmlvcml0eSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmZmlsdGVyLnhwaW5mby5wcmlvcml0eSwgKmFyZ3YsIDApKQorCQkJCWludmFyZygiUFJJT1JJVFkgdmFsdWUgaXMgaW52YWxpZCIsICphcmd2KTsKKworCQkJZmlsdGVyLnByaW9yaXR5X21hc2sgPSBYRlJNX0ZJTFRFUl9NQVNLX0ZVTEw7CisKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJmbGFnIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCXhmcm1fcG9saWN5X2ZsYWdfcGFyc2UoJmZpbHRlci54cGluZm8uZmxhZ3MsICZhcmdjLAorCQkJCQkgICAgICAgJmFyZ3YpOworCisJCQlmaWx0ZXIucG9saWN5X2ZsYWdzX21hc2sgPSBYRlJNX0ZJTFRFUl9NQVNLX0ZVTEw7CisKKwkJfSBlbHNlIHsKKwkJCWlmIChzZWxwKQorCQkJCWludmFyZygidW5rbm93biIsICphcmd2KTsKKwkJCXNlbHAgPSAqYXJndjsKKworCQkJeGZybV9zZWxlY3Rvcl9wYXJzZSgmZmlsdGVyLnhwaW5mby5zZWwsICZhcmdjLCAmYXJndik7CisJCQlpZiAocHJlZmVycmVkX2ZhbWlseSA9PSBBRl9VTlNQRUMpCisJCQkJcHJlZmVycmVkX2ZhbWlseSA9IGZpbHRlci54cGluZm8uc2VsLmZhbWlseTsKKworCQl9CisKKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJaWYgKHJ0bmxfb3Blbl9ieXByb3RvKCZydGgsIDAsIE5FVExJTktfWEZSTSkgPCAwKQorCQlleGl0KDEpOworCisJaWYgKGRlbGV0ZWFsbCkgeworCQlzdHJ1Y3QgeGZybV9idWZmZXIgeGI7CisJCWNoYXIgYnVmW05MTVNHX0RFTEVURUFMTF9CVUZfU0laRV07CisJCWludCBpOworCisJCXhiLmJ1ZiA9IGJ1ZjsKKwkJeGIuc2l6ZSA9IHNpemVvZihidWYpOworCQl4Yi5ydGggPSAmcnRoOworCisJCWZvciAoaSA9IDA7IDsgaSsrKSB7CisJCQlzdHJ1Y3QgeworCQkJCXN0cnVjdCBubG1zZ2hkciBuOworCQkJCWNoYXIgYnVmW05MTVNHX0JVRl9TSVpFXTsKKwkJCX0gcmVxID0geworCQkJCS5uLm5sbXNnX2xlbiA9IE5MTVNHX0hEUkxFTiwKKwkJCQkubi5ubG1zZ19mbGFncyA9IE5MTV9GX0RVTVAgfCBOTE1fRl9SRVFVRVNULAorCQkJCS5uLm5sbXNnX3R5cGUgPSBYRlJNX01TR19HRVRQT0xJQ1ksCisJCQkJLm4ubmxtc2dfc2VxID0gcnRoLmR1bXAgPSArK3J0aC5zZXEsCisJCQl9OworCisJCQl4Yi5vZmZzZXQgPSAwOworCQkJeGIubmxtc2dfY291bnQgPSAwOworCisJCQlpZiAoc2hvd19zdGF0cyA+IDEpCisJCQkJZnByaW50ZihzdGRlcnIsICJEZWxldGUtYWxsIHJvdW5kID0gJWRcbiIsIGkpOworCisJCQlpZiAocnRubF9zZW5kKCZydGgsICh2b2lkICopJnJlcSwgcmVxLm4ubmxtc2dfbGVuKSA8IDApIHsKKwkJCQlwZXJyb3IoIkNhbm5vdCBzZW5kIGR1bXAgcmVxdWVzdCIpOworCQkJCWV4aXQoMSk7CisJCQl9CisKKwkJCWlmIChydG5sX2R1bXBfZmlsdGVyKCZydGgsIHhmcm1fcG9saWN5X2tlZXAsICZ4YikgPCAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJEZWxldGUtYWxsIHRlcm1pbmF0ZWRcbiIpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlpZiAoeGIubmxtc2dfY291bnQgPT0gMCkgeworCQkJCWlmIChzaG93X3N0YXRzID4gMSkKKwkJCQkJZnByaW50ZihzdGRlcnIsICJEZWxldGUtYWxsIGNvbXBsZXRlZFxuIik7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChydG5sX3NlbmRfY2hlY2soJnJ0aCwgeGIuYnVmLCB4Yi5vZmZzZXQpIDwgMCkgeworCQkJCXBlcnJvcigiRmFpbGVkIHRvIHNlbmQgZGVsZXRlLWFsbCByZXF1ZXN0Iik7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWlmIChzaG93X3N0YXRzID4gMSkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkRlbGV0ZS1hbGwgbmxtc2cgY291bnQgPSAlZFxuIiwgeGIubmxtc2dfY291bnQpOworCisJCQl4Yi5vZmZzZXQgPSAwOworCQkJeGIubmxtc2dfY291bnQgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBubG1zZ2hkciBuOworCQkJY2hhciBidWZbTkxNU0dfQlVGX1NJWkVdOworCQl9IHJlcSA9IHsKKwkJCS5uLm5sbXNnX2xlbiA9IE5MTVNHX0hEUkxFTiwKKwkJCS5uLm5sbXNnX2ZsYWdzID0gTkxNX0ZfRFVNUCB8IE5MTV9GX1JFUVVFU1QsCisJCQkubi5ubG1zZ190eXBlID0gWEZSTV9NU0dfR0VUUE9MSUNZLAorCQkJLm4ubmxtc2dfc2VxID0gcnRoLmR1bXAgPSArK3J0aC5zZXEsCisJCX07CisKKwkJaWYgKHJ0bmxfc2VuZCgmcnRoLCAodm9pZCAqKSZyZXEsIHJlcS5uLm5sbXNnX2xlbikgPCAwKSB7CisJCQlwZXJyb3IoIkNhbm5vdCBzZW5kIGR1bXAgcmVxdWVzdCIpOworCQkJZXhpdCgxKTsKKwkJfQorCisJCWlmIChydG5sX2R1bXBfZmlsdGVyKCZydGgsIHhmcm1fcG9saWN5X3ByaW50LCBzdGRvdXQpIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJEdW1wIHRlcm1pbmF0ZWRcbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCX0KKworCXJ0bmxfY2xvc2UoJnJ0aCk7CisKKwlleGl0KDApOworfQorCitzdGF0aWMgaW50IHByaW50X3NwZGluZm8oIHN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqYXJnKQoreworCUZJTEUgKmZwID0gKEZJTEUqKWFyZzsKKwlfX3UzMiAqZiA9IE5MTVNHX0RBVEEobik7CisJc3RydWN0IHJ0YXR0ciAqIHRiW1hGUk1BX1NQRF9NQVgrMV07CisJc3RydWN0IHJ0YXR0ciAqIHJ0YTsKKworCWludCBsZW4gPSBuLT5ubG1zZ19sZW47CisKKwlsZW4gLT0gTkxNU0dfTEVOR1RIKHNpemVvZihfX3UzMikpOworCWlmIChsZW4gPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiU1BEaW5mbzogV3JvbmcgbGVuICVkXG4iLCBsZW4pOworCQlyZXR1cm4gLTE7CisJfQorCisJcnRhID0gWEZSTVNBUERfUlRBKGYpOworCXBhcnNlX3J0YXR0cih0YiwgWEZSTUFfU1BEX01BWCwgcnRhLCBsZW4pOworCisJZnByaW50ZihmcCwiXHQgU1BEIik7CisJaWYgKHRiW1hGUk1BX1NQRF9JTkZPXSkgeworCQlzdHJ1Y3QgeGZybXVfc3BkaW5mbyAqc2k7CisKKwkJaWYgKFJUQV9QQVlMT0FEKHRiW1hGUk1BX1NQRF9JTkZPXSkgPCBzaXplb2YoKnNpKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJTUERpbmZvOiBXcm9uZyBsZW4gJWRcbiIsIGxlbik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJc2kgPSBSVEFfREFUQSh0YltYRlJNQV9TUERfSU5GT10pOworCQlmcHJpbnRmKGZwLCIgSU4gICVkIiwgc2ktPmluY250KTsKKwkJZnByaW50ZihmcCwiIE9VVCAlZCIsIHNpLT5vdXRjbnQpOworCQlmcHJpbnRmKGZwLCIgRldEICVkIiwgc2ktPmZ3ZGNudCk7CisKKwkJaWYgKHNob3dfc3RhdHMpIHsKKwkJCWZwcmludGYoZnAsIiAoU29jazoiKTsKKwkJCWZwcmludGYoZnAsIiBJTiAlZCIsIHNpLT5pbnNjbnQpOworCQkJZnByaW50ZihmcCwiIE9VVCAlZCIsIHNpLT5vdXRzY250KTsKKwkJCWZwcmludGYoZnAsIiBGV0QgJWQiLCBzaS0+Zndkc2NudCk7CisJCQlmcHJpbnRmKGZwLCIpIik7CisJCX0KKworCQlmcHJpbnRmKGZwLCAiJXMiLCBfU0xfKTsKKwl9CisJaWYgKHNob3dfc3RhdHMgPiAxKSB7CisJCXN0cnVjdCB4ZnJtdV9zcGRoaW5mbyAqc2g7CisKKwkJaWYgKHRiW1hGUk1BX1NQRF9ISU5GT10pIHsKKwkJCWlmIChSVEFfUEFZTE9BRCh0YltYRlJNQV9TUERfSElORk9dKSA8IHNpemVvZigqc2gpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJTUERpbmZvOiBXcm9uZyBsZW4gJWRcbiIsIGxlbik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJc2ggPSBSVEFfREFUQSh0YltYRlJNQV9TUERfSElORk9dKTsKKwkJCWZwcmludGYoZnAsIlx0IFNQRCBidWNrZXRzOiIpOworCQkJZnByaW50ZihmcCwiIGNvdW50ICVkIiwgc2gtPnNwZGhjbnQpOworCQkJZnByaW50ZihmcCwiIE1heCAlZCIsIHNoLT5zcGRobWNudCk7CisJCQlmcHJpbnRmKGZwLCAiJXMiLCBfU0xfKTsKKwkJfQorCQlpZiAodGJbWEZSTUFfU1BEX0lQVjRfSFRIUkVTSF0pIHsKKwkJCXN0cnVjdCB4ZnJtdV9zcGRodGhyZXNoICp0aDsKKwkJCWlmIChSVEFfUEFZTE9BRCh0YltYRlJNQV9TUERfSVBWNF9IVEhSRVNIXSkgPCBzaXplb2YoKnRoKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiU1BEaW5mbzogV3JvbmcgbGVuICVkXG4iLCBsZW4pOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXRoID0gUlRBX0RBVEEodGJbWEZSTUFfU1BEX0lQVjRfSFRIUkVTSF0pOworCQkJZnByaW50ZihmcCwiXHQgU1BEIElQdjQgdGhyZXNob2xkczoiKTsKKwkJCWZwcmludGYoZnAsIiBsb2NhbCAlZCIsIHRoLT5sYml0cyk7CisJCQlmcHJpbnRmKGZwLCIgcmVtb3RlICVkIiwgdGgtPnJiaXRzKTsKKwkJCWZwcmludGYoZnAsICIlcyIsIF9TTF8pOworCisJCX0KKwkJaWYgKHRiW1hGUk1BX1NQRF9JUFY2X0hUSFJFU0hdKSB7CisJCQlzdHJ1Y3QgeGZybXVfc3BkaHRocmVzaCAqdGg7CisJCQlpZiAoUlRBX1BBWUxPQUQodGJbWEZSTUFfU1BEX0lQVjZfSFRIUkVTSF0pIDwgc2l6ZW9mKCp0aCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlNQRGluZm86IFdyb25nIGxlbiAlZFxuIiwgbGVuKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQl0aCA9IFJUQV9EQVRBKHRiW1hGUk1BX1NQRF9JUFY2X0hUSFJFU0hdKTsKKwkJCWZwcmludGYoZnAsIlx0IFNQRCBJUHY2IHRocmVzaG9sZHM6Iik7CisJCQlmcHJpbnRmKGZwLCIgbG9jYWwgJWQiLCB0aC0+bGJpdHMpOworCQkJZnByaW50ZihmcCwiIHJlbW90ZSAlZCIsIHRoLT5yYml0cyk7CisJCQlmcHJpbnRmKGZwLCAiJXMiLCBfU0xfKTsKKwkJfQorCX0KKworCWlmIChvbmVsaW5lKQorCQlmcHJpbnRmKGZwLCAiXG4iKTsKKworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4ZnJtX3NwZF9zZXRpbmZvKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgcnRubF9oYW5kbGUgcnRoOworCXN0cnVjdCB7CisJCXN0cnVjdCBubG1zZ2hkcgkJCW47CisJCV9fdTMyCQkJCWZsYWdzOworCQljaGFyCQkJCWJ1ZltSVEFfQlVGX1NJWkVdOworCX0gcmVxOworCisJY2hhciAqdGhyNCA9IE5VTEw7CisJY2hhciAqdGhyNiA9IE5VTEw7CisKKwltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCisJcmVxLm4ubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihfX3UzMikpOworCXJlcS5uLm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVDsKKwlyZXEubi5ubG1zZ190eXBlID0gWEZSTV9NU0dfTkVXU1BESU5GTzsKKwlyZXEuZmxhZ3MgPSAwWEZGRkZGRkZGOworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChzdHJjbXAoKmFyZ3YsICJodGhyZXNoNCIpID09IDApIHsKKwkJCXN0cnVjdCB4ZnJtdV9zcGRodGhyZXNoIHRocjsKKworCQkJaWYgKHRocjQpCisJCQkJZHVwYXJnKCJodGhyZXNoNCIsICphcmd2KTsKKwkJCXRocjQgPSAqYXJndjsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3U4KCZ0aHIubGJpdHMsICphcmd2LCAwKSB8fCB0aHIubGJpdHMgPiAzMikKKwkJCQlpbnZhcmcoImh0aHJlc2g0IExCSVRTIHZhbHVlIGlzIGludmFsaWQiLCAqYXJndik7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91OCgmdGhyLnJiaXRzLCAqYXJndiwgMCkgfHwgdGhyLnJiaXRzID4gMzIpCisJCQkJaW52YXJnKCJodGhyZXNoNCBSQklUUyB2YWx1ZSBpcyBpbnZhbGlkIiwgKmFyZ3YpOworCisJCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgWEZSTUFfU1BEX0lQVjRfSFRIUkVTSCwKKwkJCQkgICh2b2lkICopJnRociwgc2l6ZW9mKHRocikpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImh0aHJlc2g2IikgPT0gMCkgeworCQkJc3RydWN0IHhmcm11X3NwZGh0aHJlc2ggdGhyOworCisJCQlpZiAodGhyNikKKwkJCQlkdXBhcmcoImh0aHJlc2g2IiwgKmFyZ3YpOworCQkJdGhyNiA9ICphcmd2OworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTgoJnRoci5sYml0cywgKmFyZ3YsIDApIHx8IHRoci5sYml0cyA+IDEyOCkKKwkJCQlpbnZhcmcoImh0aHJlc2g2IExCSVRTIHZhbHVlIGlzIGludmFsaWQiLCAqYXJndik7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91OCgmdGhyLnJiaXRzLCAqYXJndiwgMCkgfHwgdGhyLnJiaXRzID4gMTI4KQorCQkJCWludmFyZygiaHRocmVzaDYgUkJJVFMgdmFsdWUgaXMgaW52YWxpZCIsICphcmd2KTsKKworCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIFhGUk1BX1NQRF9JUFY2X0hUSFJFU0gsCisJCQkJICAodm9pZCAqKSZ0aHIsIHNpemVvZih0aHIpKTsKKwkJfSBlbHNlIHsKKwkJCWludmFyZygidW5rbm93biIsICphcmd2KTsKKwkJfQorCisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCWlmIChydG5sX29wZW5fYnlwcm90bygmcnRoLCAwLCBORVRMSU5LX1hGUk0pIDwgMCkKKwkJZXhpdCgxKTsKKworCWlmIChydG5sX3RhbGsoJnJ0aCwgJnJlcS5uLCBOVUxMLCAwKSA8IDApCisJCWV4aXQoMik7CisKKwlydG5sX2Nsb3NlKCZydGgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGZybV9zcGRfZ2V0aW5mbyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHJ0bmxfaGFuZGxlIHJ0aDsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgbmxtc2doZHIJCQluOworCQlfX3UzMgkJCQlmbGFnczsKKwkJY2hhcgkJCQlhbnNbMTI4XTsKKwl9IHJlcTsKKworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisKKwlyZXEubi5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKF9fdTMyKSk7CisJcmVxLm4ubmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUOworCXJlcS5uLm5sbXNnX3R5cGUgPSBYRlJNX01TR19HRVRTUERJTkZPOworCXJlcS5mbGFncyA9IDBYRkZGRkZGRkY7CisKKwlpZiAocnRubF9vcGVuX2J5cHJvdG8oJnJ0aCwgMCwgTkVUTElOS19YRlJNKSA8IDApCisJCWV4aXQoMSk7CisKKwlpZiAocnRubF90YWxrKCZydGgsICZyZXEubiwgJnJlcS5uLCBzaXplb2YocmVxKSkgPCAwKQorCQlleGl0KDIpOworCisJcHJpbnRfc3BkaW5mbygmcmVxLm4sICh2b2lkKilzdGRvdXQpOworCisJcnRubF9jbG9zZSgmcnRoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhmcm1fcG9saWN5X2ZsdXNoKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgcnRubF9oYW5kbGUgcnRoOworCXN0cnVjdCB7CisJCXN0cnVjdCBubG1zZ2hkcgluOworCQljaGFyCQlidWZbUlRBX0JVRl9TSVpFXTsKKwl9IHJlcTsKKwljaGFyICpwdHlwZXAgPSBOVUxMOworCXN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfdHlwZSB1cHQ7CisKKwltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCW1lbXNldCgmdXB0LCAwLCBzaXplb2YodXB0KSk7CisKKwlyZXEubi5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoMCk7IC8qIG5sbXNnIGRhdGEgaXMgbm90aGluZyAqLworCXJlcS5uLm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVDsKKwlyZXEubi5ubG1zZ190eXBlID0gWEZSTV9NU0dfRkxVU0hQT0xJQ1k7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgInB0eXBlIikgPT0gMCkgeworCQkJaWYgKHB0eXBlcCkKKwkJCQlkdXBhcmcoInB0eXBlIiwgKmFyZ3YpOworCQkJcHR5cGVwID0gKmFyZ3Y7CisKKwkJCU5FWFRfQVJHKCk7CisJCQl4ZnJtX3BvbGljeV9wdHlwZV9wYXJzZSgmdXB0LnR5cGUsICZhcmdjLCAmYXJndik7CisJCX0gZWxzZQorCQkJaW52YXJnKCJ1bmtub3duIiwgKmFyZ3YpOworCisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCWlmIChwdHlwZXApIHsKKwkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIFhGUk1BX1BPTElDWV9UWVBFLAorCQkJICAodm9pZCAqKSZ1cHQsIHNpemVvZih1cHQpKTsKKwl9CisKKwlpZiAocnRubF9vcGVuX2J5cHJvdG8oJnJ0aCwgMCwgTkVUTElOS19YRlJNKSA8IDApCisJCWV4aXQoMSk7CisKKwlpZiAoc2hvd19zdGF0cyA+IDEpCisJCWZwcmludGYoc3RkZXJyLCAiRmx1c2ggcG9saWN5XG4iKTsKKworCWlmIChydG5sX3RhbGsoJnJ0aCwgJnJlcS5uLCBOVUxMLCAwKSA8IDApCisJCWV4aXQoMik7CisKKwlydG5sX2Nsb3NlKCZydGgpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkb194ZnJtX3BvbGljeShpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaWYgKGFyZ2MgPCAxKQorCQlyZXR1cm4geGZybV9wb2xpY3lfbGlzdF9vcl9kZWxldGVhbGwoMCwgTlVMTCwgMCk7CisKKwlpZiAobWF0Y2hlcygqYXJndiwgImFkZCIpID09IDApCisJCXJldHVybiB4ZnJtX3BvbGljeV9tb2RpZnkoWEZSTV9NU0dfTkVXUE9MSUNZLCAwLAorCQkJCQkgIGFyZ2MtMSwgYXJndisxKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgInVwZGF0ZSIpID09IDApCisJCXJldHVybiB4ZnJtX3BvbGljeV9tb2RpZnkoWEZSTV9NU0dfVVBEUE9MSUNZLCAwLAorCQkJCQkgIGFyZ2MtMSwgYXJndisxKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgImRlbGV0ZSIpID09IDApCisJCXJldHVybiB4ZnJtX3BvbGljeV9kZWxldGUoYXJnYy0xLCBhcmd2KzEpOworCWlmIChtYXRjaGVzKCphcmd2LCAiZGVsZXRlYWxsIikgPT0gMCB8fCBtYXRjaGVzKCphcmd2LCAiZGVsYWxsIikgPT0gMCkKKwkJcmV0dXJuIHhmcm1fcG9saWN5X2xpc3Rfb3JfZGVsZXRlYWxsKGFyZ2MtMSwgYXJndisxLCAxKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgImxpc3QiKSA9PSAwIHx8IG1hdGNoZXMoKmFyZ3YsICJzaG93IikgPT0gMAorCSAgICB8fCBtYXRjaGVzKCphcmd2LCAibHN0IikgPT0gMCkKKwkJcmV0dXJuIHhmcm1fcG9saWN5X2xpc3Rfb3JfZGVsZXRlYWxsKGFyZ2MtMSwgYXJndisxLCAwKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgImdldCIpID09IDApCisJCXJldHVybiB4ZnJtX3BvbGljeV9nZXQoYXJnYy0xLCBhcmd2KzEpOworCWlmIChtYXRjaGVzKCphcmd2LCAiZmx1c2giKSA9PSAwKQorCQlyZXR1cm4geGZybV9wb2xpY3lfZmx1c2goYXJnYy0xLCBhcmd2KzEpOworCWlmIChtYXRjaGVzKCphcmd2LCAiY291bnQiKSA9PSAwKQorCQlyZXR1cm4geGZybV9zcGRfZ2V0aW5mbyhhcmdjLCBhcmd2KTsKKwlpZiAobWF0Y2hlcygqYXJndiwgInNldCIpID09IDApCisJCXJldHVybiB4ZnJtX3NwZF9zZXRpbmZvKGFyZ2MtMSwgYXJndisxKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKQorCQl1c2FnZSgpOworCWZwcmludGYoc3RkZXJyLCAiQ29tbWFuZCBcIiVzXCIgaXMgdW5rbm93biwgdHJ5IFwiaXAgeGZybSBwb2xpY3kgaGVscFwiLlxuIiwgKmFyZ3YpOworCWV4aXQoLTEpOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvaXAveGZybV9zdGF0ZS5jIGIvaXByb3V0ZTIvaXAveGZybV9zdGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NzM0ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9pcC94ZnJtX3N0YXRlLmMKQEAgLTAsMCArMSwxMzkyIEBACisvKiAkVVNBR0k6ICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykyMDA0IFVTQUdJL1dJREUgUHJvamVjdAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXM+LgorICovCisvKgorICogYmFzZWQgb24gaXByb3V0ZS5jCisgKi8KKy8qCisgKiBBdXRob3JzOgorICoJTWFzYWhpZGUgTkFLQU1VUkEgQFVTQUdJCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInhmcm0uaCIKKyNpbmNsdWRlICJpcF9jb21tb24uaCIKKworLy8jZGVmaW5lIE5MTVNHX0RFTEVURUFMTF9CVUZfU0laRSAoNDA5Ni01MTIpCisjZGVmaW5lIE5MTVNHX0RFTEVURUFMTF9CVUZfU0laRSA4MTkyCisKKy8qCisgKiBSZWNlaXZpbmcgYnVmZmVyIGRlZmluZXM6CisgKiBubG1zZworICogICBkYXRhID0gc3RydWN0IHhmcm1fdXNlcnNhX2luZm8KKyAqICAgcnRhdHRyCisgKiAgIHJ0YXR0cgorICogICAuLi4gKG1heCBjb3VudCBvZiBydGF0dHIgaXMgWEZSTV9NQVgrMQorICoKKyAqICBlYWNoIHJ0YXR0ciBkYXRhID0gc3RydWN0IHhmcm1fYWxnbyhkeW5hbWljIHNpemUpIG9yIHhmcm1fYWRkcmVzc190CisgKi8KKyNkZWZpbmUgTkxNU0dfQlVGX1NJWkUgNDA5NgorI2RlZmluZSBSVEFfQlVGX1NJWkUgMjA0OAorI2RlZmluZSBYRlJNX0FMR09fS0VZX0JVRl9TSVpFIDUxMgorI2RlZmluZSBDVFhfQlVGX1NJWkUgMjU2CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogaXAgeGZybSBzdGF0ZSB7IGFkZCB8IHVwZGF0ZSB9IElEIFsgQUxHTy1MSVNUIF0gWyBtb2RlIE1PREUgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgIFsgbWFyayBNQVJLIFsgbWFzayBNQVNLIF0gXSBbIHJlcWlkIFJFUUlEIF0gWyBzZXEgU0VRIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICBbIHJlcGxheS13aW5kb3cgU0laRSBdIFsgcmVwbGF5LXNlcSBTRVEgXSBbIHJlcGxheS1vc2VxIFNFUSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgWyByZXBsYXktc2VxLWhpIFNFUSBdIFsgcmVwbGF5LW9zZXEtaGkgU0VRIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICBbIGZsYWcgRkxBRy1MSVNUIF0gWyBzZWwgU0VMRUNUT1IgXSBbIExJTUlULUxJU1QgXSBbIGVuY2FwIEVOQ0FQIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICBbIGNvYSBBRERSWy9QTEVOXSBdIFsgY3R4IENUWCBdIFsgZXh0cmEtZmxhZyBFWFRSQS1GTEFHLUxJU1QgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogaXAgeGZybSBzdGF0ZSBhbGxvY3NwaSBJRCBbIG1vZGUgTU9ERSBdIFsgbWFyayBNQVJLIFsgbWFzayBNQVNLIF0gXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgIFsgcmVxaWQgUkVRSUQgXSBbIHNlcSBTRVEgXSBbIG1pbiBTUEkgbWF4IFNQSSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBpcCB4ZnJtIHN0YXRlIHsgZGVsZXRlIHwgZ2V0IH0gSUQgWyBtYXJrIE1BUksgWyBtYXNrIE1BU0sgXSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBpcCB4ZnJtIHN0YXRlIHsgZGVsZXRlYWxsIHwgbGlzdCB9IFsgSUQgXSBbIG1vZGUgTU9ERSBdIFsgcmVxaWQgUkVRSUQgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgIFsgZmxhZyBGTEFHLUxJU1QgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogaXAgeGZybSBzdGF0ZSBmbHVzaCBbIHByb3RvIFhGUk0tUFJPVE8gXVxuIik7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogaXAgeGZybSBzdGF0ZSBjb3VudFxuIik7CisJZnByaW50ZihzdGRlcnIsICJJRCA6PSBbIHNyYyBBRERSIF0gWyBkc3QgQUREUiBdIFsgcHJvdG8gWEZSTS1QUk9UTyBdIFsgc3BpIFNQSSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlhGUk0tUFJPVE8gOj0gIik7CisJZnByaW50ZihzdGRlcnIsICIlcyB8ICIsIHN0cnhmX3hmcm1wcm90byhJUFBST1RPX0VTUCkpOworCWZwcmludGYoc3RkZXJyLCAiJXMgfCAiLCBzdHJ4Zl94ZnJtcHJvdG8oSVBQUk9UT19BSCkpOworCWZwcmludGYoc3RkZXJyLCAiJXMgfCAiLCBzdHJ4Zl94ZnJtcHJvdG8oSVBQUk9UT19DT01QKSk7CisJZnByaW50ZihzdGRlcnIsICIlcyB8ICIsIHN0cnhmX3hmcm1wcm90byhJUFBST1RPX1JPVVRJTkcpKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBzdHJ4Zl94ZnJtcHJvdG8oSVBQUk9UT19EU1RPUFRTKSk7CisJZnByaW50ZihzdGRlcnIsICJBTEdPLUxJU1QgOj0gWyBBTEdPLUxJU1QgXSBBTEdPXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIkFMR08gOj0geyAiKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzIHwgIiwgc3RyeGZfYWxnb3R5cGUoWEZSTUFfQUxHX0NSWVBUKSk7CisJZnByaW50ZihzdGRlcnIsICIlcyIsIHN0cnhmX2FsZ290eXBlKFhGUk1BX0FMR19BVVRIKSk7CisJZnByaW50ZihzdGRlcnIsICIgfSBBTEdPLU5BTUUgQUxHTy1LRVlNQVQgfFxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICVzIiwgc3RyeGZfYWxnb3R5cGUoWEZSTUFfQUxHX0FVVEhfVFJVTkMpKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiBBTEdPLU5BTUUgQUxHTy1LRVlNQVQgQUxHTy1UUlVOQy1MRU4gfFxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICVzIiwgc3RyeGZfYWxnb3R5cGUoWEZSTUFfQUxHX0FFQUQpKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiBBTEdPLU5BTUUgQUxHTy1LRVlNQVQgQUxHTy1JQ1YtTEVOIHxcbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAlcyIsIHN0cnhmX2FsZ290eXBlKFhGUk1BX0FMR19DT01QKSk7CisJZnByaW50ZihzdGRlcnIsICIgQUxHTy1OQU1FXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIk1PREUgOj0gdHJhbnNwb3J0IHwgdHVubmVsIHwgYmVldCB8IHJvIHwgaW5fdHJpZ2dlclxuIik7CisJZnByaW50ZihzdGRlcnIsICJGTEFHLUxJU1QgOj0gWyBGTEFHLUxJU1QgXSBGTEFHXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIkZMQUcgOj0gbm9lY24gfCBkZWNhcC1kc2NwIHwgbm9wbXR1ZGlzYyB8IHdpbGRyZWN2IHwgaWNtcCB8IGFmLXVuc3BlYyB8IGFsaWduNCB8IGVzblxuIik7CisJZnByaW50ZihzdGRlcnIsICJFWFRSQS1GTEFHLUxJU1QgOj0gWyBFWFRSQS1GTEFHLUxJU1QgXSBFWFRSQS1GTEFHXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIkVYVFJBLUZMQUcgOj0gZG9udC1lbmNhcC1kc2NwXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlNFTEVDVE9SIDo9IFsgc3JjIEFERFJbL1BMRU5dIF0gWyBkc3QgQUREUlsvUExFTl0gXSBbIGRldiBERVYgXSBbIFVQU1BFQyBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlVQU1BFQyA6PSBwcm90byB7IHsgIik7CisJZnByaW50ZihzdGRlcnIsICIlcyB8ICIsIHN0cnhmX3Byb3RvKElQUFJPVE9fVENQKSk7CisJZnByaW50ZihzdGRlcnIsICIlcyB8ICIsIHN0cnhmX3Byb3RvKElQUFJPVE9fVURQKSk7CisJZnByaW50ZihzdGRlcnIsICIlcyB8ICIsIHN0cnhmX3Byb3RvKElQUFJPVE9fU0NUUCkpOworCWZwcmludGYoc3RkZXJyLCAiJXMiLCBzdHJ4Zl9wcm90byhJUFBST1RPX0RDQ1ApKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiB9IFsgc3BvcnQgUE9SVCBdIFsgZHBvcnQgUE9SVCBdIHxcbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgICAgeyAiKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzIHwgIiwgc3RyeGZfcHJvdG8oSVBQUk9UT19JQ01QKSk7CisJZnByaW50ZihzdGRlcnIsICIlcyB8ICIsIHN0cnhmX3Byb3RvKElQUFJPVE9fSUNNUFY2KSk7CisJZnByaW50ZihzdGRlcnIsICIlcyIsIHN0cnhmX3Byb3RvKElQUFJPVE9fTUgpKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiB9IFsgdHlwZSBOVU1CRVIgXSBbIGNvZGUgTlVNQkVSIF0gfFxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgICAlcyIsIHN0cnhmX3Byb3RvKElQUFJPVE9fR1JFKSk7CisJZnByaW50ZihzdGRlcnIsICIgWyBrZXkgeyBET1RURUQtUVVBRCB8IE5VTUJFUiB9IF0gfCBQUk9UTyB9XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIkxJTUlULUxJU1QgOj0gWyBMSU1JVC1MSVNUIF0gbGltaXQgTElNSVRcbiIpOworCWZwcmludGYoc3RkZXJyLCAiTElNSVQgOj0geyB0aW1lLXNvZnQgfCB0aW1lLWhhcmQgfCB0aW1lLXVzZS1zb2Z0IHwgdGltZS11c2UtaGFyZCB9IFNFQ09ORFMgfFxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICB7IGJ5dGUtc29mdCB8IGJ5dGUtaGFyZCB9IFNJWkUgfCB7IHBhY2tldC1zb2Z0IHwgcGFja2V0LWhhcmQgfSBDT1VOVFxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRU5DQVAgOj0geyBlc3BpbnVkcCB8IGVzcGludWRwLW5vbmlrZSB9IFNQT1JUIERQT1JUIE9BRERSXG4iKTsKKworCWV4aXQoLTEpOworfQorCitzdGF0aWMgaW50IHhmcm1fYWxnb19wYXJzZShzdHJ1Y3QgeGZybV9hbGdvICphbGcsIGVudW0geGZybV9hdHRyX3R5cGVfdCB0eXBlLAorCQkJICAgY2hhciAqbmFtZSwgY2hhciAqa2V5LCBjaGFyICpidWYsIGludCBtYXgpCit7CisJaW50IGxlbjsKKwlpbnQgc2xlbiA9IHN0cmxlbihrZXkpOworCisjaWYgMAorCS8qIFhYWDogdmVyaWZ5aW5nIGJvdGggbmFtZSBhbmQga2V5IGlzIHJlcXVpcmVkISAqLworCWZwcmludGYoc3RkZXJyLCAid2FybmluZzogQUxHTy1OQU1FL0FMR08tS0VZTUFUIHZhbHVlcyB3aWxsIGJlIHNlbnQgdG8gdGhlIGtlcm5lbCBwcm9taXNjdW91c2x5ISAodmVyaWZ5aW5nIHRoZW0gaXNuJ3QgaW1wbGVtZW50ZWQgeWV0KVxuIik7CisjZW5kaWYKKworCXN0cm5jcHkoYWxnLT5hbGdfbmFtZSwgbmFtZSwgc2l6ZW9mKGFsZy0+YWxnX25hbWUpKTsKKworCWlmIChzbGVuID4gMiAmJiBzdHJuY21wKGtleSwgIjB4IiwgMikgPT0gMCkgeworCQkvKiBzcGxpdCB0d28gY2hhcnMgIjB4IiBmcm9tIHRoZSB0b3AgKi8KKwkJY2hhciAqcCA9IGtleSArIDI7CisJCWludCBwbGVuID0gc2xlbiAtIDI7CisJCWludCBpOworCQlpbnQgajsKKworCQkvKiBDb252ZXJ0aW5nIGhleGFkZWNpbWFsIG51bWJlcmVkIHN0cmluZyBpbnRvIHJlYWwga2V5OworCQkgKiBDb252ZXJ0IGVhY2ggdHdvIGNoYXJzIGludG8gb25lIGNoYXIodmFsdWUpLiBJZiBudW1iZXIKKwkJICogb2YgdGhlIGxlbmd0aCBpcyBvZGQsIGFkZCB6ZXJvIG9uIHRoZSB0b3AgZm9yIHJvdW5kaW5nLgorCQkgKi8KKworCQkvKiBjYWxjdWxhdGUgbGVuZ3RoIG9mIHRoZSBjb252ZXJ0ZWQgdmFsdWVzKHJlYWwga2V5KSAqLworCQlsZW4gPSAocGxlbiArIDEpIC8gMjsKKwkJaWYgKGxlbiA+IG1heCkKKwkJCWludmFyZygiQUxHTy1LRVlNQVQgdmFsdWUgbWFrZXMgYnVmZmVyIG92ZXJmbG93XG4iLCBrZXkpOworCisJCWZvciAoaSA9IC0gKHBsZW4gJSAyKSwgaiA9IDA7IGogPCBsZW47IGkgKz0gMiwgaisrKSB7CisJCQljaGFyIHZidWZbM107CisJCQlfX3U4IHZhbDsKKworCQkJdmJ1ZlswXSA9IGkgPj0gMCA/IHBbaV0gOiAnMCc7CisJCQl2YnVmWzFdID0gcFtpICsgMV07CisJCQl2YnVmWzJdID0gJ1wwJzsKKworCQkJaWYgKGdldF91OCgmdmFsLCB2YnVmLCAxNikpCisJCQkJaW52YXJnKCJBTEdPLUtFWU1BVCB2YWx1ZSBpcyBpbnZhbGlkIiwga2V5KTsKKworCQkJYnVmW2pdID0gdmFsOworCQl9CisJfSBlbHNlIHsKKwkJbGVuID0gc2xlbjsKKwkJaWYgKGxlbiA+IDApIHsKKwkJCWlmIChsZW4gPiBtYXgpCisJCQkJaW52YXJnKCJBTEdPLUtFWU1BVCB2YWx1ZSBtYWtlcyBidWZmZXIgb3ZlcmZsb3dcbiIsIGtleSk7CisKKwkJCW1lbWNweShidWYsIGtleSwgbGVuKTsKKwkJfQorCX0KKworCWFsZy0+YWxnX2tleV9sZW4gPSBsZW4gKiA4OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGZybV9zZXFfcGFyc2UoX191MzIgKnNlcSwgaW50ICphcmdjcCwgY2hhciAqKiphcmd2cCkKK3sKKwlpbnQgYXJnYyA9ICphcmdjcDsKKwljaGFyICoqYXJndiA9ICphcmd2cDsKKworCWlmIChnZXRfdTMyKHNlcSwgKmFyZ3YsIDApKQorCQlpbnZhcmcoIlNFUSB2YWx1ZSBpcyBpbnZhbGlkIiwgKmFyZ3YpOworCisJKnNlcSA9IGh0b25sKCpzZXEpOworCisJKmFyZ2NwID0gYXJnYzsKKwkqYXJndnAgPSBhcmd2OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGZybV9zdGF0ZV9mbGFnX3BhcnNlKF9fdTggKmZsYWdzLCBpbnQgKmFyZ2NwLCBjaGFyICoqKmFyZ3ZwKQoreworCWludCBhcmdjID0gKmFyZ2NwOworCWNoYXIgKiphcmd2ID0gKmFyZ3ZwOworCWludCBsZW4gPSBzdHJsZW4oKmFyZ3YpOworCisJaWYgKGxlbiA+IDIgJiYgc3RybmNtcCgqYXJndiwgIjB4IiwgMikgPT0gMCkgeworCQlfX3U4IHZhbCA9IDA7CisKKwkJaWYgKGdldF91OCgmdmFsLCAqYXJndiwgMTYpKQorCQkJaW52YXJnKCJGTEFHIHZhbHVlIGlzIGludmFsaWQiLCAqYXJndik7CisJCSpmbGFncyA9IHZhbDsKKwl9IGVsc2UgeworCQl3aGlsZSAoMSkgeworCQkJaWYgKHN0cmNtcCgqYXJndiwgIm5vZWNuIikgPT0gMCkKKwkJCQkqZmxhZ3MgfD0gWEZSTV9TVEFURV9OT0VDTjsKKwkJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImRlY2FwLWRzY3AiKSA9PSAwKQorCQkJCSpmbGFncyB8PSBYRlJNX1NUQVRFX0RFQ0FQX0RTQ1A7CisJCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJub3BtdHVkaXNjIikgPT0gMCkKKwkJCQkqZmxhZ3MgfD0gWEZSTV9TVEFURV9OT1BNVFVESVNDOworCQkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCAid2lsZHJlY3YiKSA9PSAwKQorCQkJCSpmbGFncyB8PSBYRlJNX1NUQVRFX1dJTERSRUNWOworCQkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaWNtcCIpID09IDApCisJCQkJKmZsYWdzIHw9IFhGUk1fU1RBVEVfSUNNUDsKKwkJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImFmLXVuc3BlYyIpID09IDApCisJCQkJKmZsYWdzIHw9IFhGUk1fU1RBVEVfQUZfVU5TUEVDOworCQkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiYWxpZ240IikgPT0gMCkKKwkJCQkqZmxhZ3MgfD0gWEZSTV9TVEFURV9BTElHTjQ7CisJCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJlc24iKSA9PSAwKQorCQkJCSpmbGFncyB8PSBYRlJNX1NUQVRFX0VTTjsKKwkJCWVsc2UgeworCQkJCVBSRVZfQVJHKCk7IC8qIGJhY2sgdHJhY2sgKi8KKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKCFORVhUX0FSR19PSygpKQorCQkJCWJyZWFrOworCQkJTkVYVF9BUkcoKTsKKwkJfQorCX0KKworCSphcmdjcCA9IGFyZ2M7CisJKmFyZ3ZwID0gYXJndjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhmcm1fc3RhdGVfZXh0cmFfZmxhZ19wYXJzZShfX3UzMiAqZXh0cmFfZmxhZ3MsIGludCAqYXJnY3AsIGNoYXIgKioqYXJndnApCit7CisJaW50IGFyZ2MgPSAqYXJnY3A7CisJY2hhciAqKmFyZ3YgPSAqYXJndnA7CisJaW50IGxlbiA9IHN0cmxlbigqYXJndik7CisKKwlpZiAobGVuID4gMiAmJiBzdHJuY21wKCphcmd2LCAiMHgiLCAyKSA9PSAwKSB7CisJCV9fdTMyIHZhbCA9IDA7CisKKwkJaWYgKGdldF91MzIoJnZhbCwgKmFyZ3YsIDE2KSkKKwkJCWludmFyZygiXCJFWFRSQS1GTEFHXCIgaXMgaW52YWxpZCIsICphcmd2KTsKKwkJKmV4dHJhX2ZsYWdzID0gdmFsOworCX0gZWxzZSB7CisJCXdoaWxlICgxKSB7CisJCQlpZiAoc3RyY21wKCphcmd2LCAiZG9udC1lbmNhcC1kc2NwIikgPT0gMCkKKwkJCQkqZXh0cmFfZmxhZ3MgfD0gWEZSTV9TQV9YRkxBR19ET05UX0VOQ0FQX0RTQ1A7CisJCQllbHNlIHsKKwkJCQlQUkVWX0FSRygpOyAvKiBiYWNrIHRyYWNrICovCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICghTkVYVF9BUkdfT0soKSkKKwkJCQlicmVhazsKKwkJCU5FWFRfQVJHKCk7CisJCX0KKwl9CisKKwkqYXJnY3AgPSBhcmdjOworCSphcmd2cCA9IGFyZ3Y7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4ZnJtX3N0YXRlX21vZGlmeShpbnQgY21kLCB1bnNpZ25lZCBmbGFncywgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBydG5sX2hhbmRsZSBydGg7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyCW47CisJCXN0cnVjdCB4ZnJtX3VzZXJzYV9pbmZvIHhzaW5mbzsKKwkJY2hhciAgCQkJYnVmW1JUQV9CVUZfU0laRV07CisJfSByZXE7CisJc3RydWN0IHhmcm1fcmVwbGF5X3N0YXRlIHJlcGxheTsKKwlzdHJ1Y3QgeGZybV9yZXBsYXlfc3RhdGVfZXNuIHJlcGxheV9lc247CisJX191MzIgcmVwbGF5X3dpbmRvdyA9IDA7CisJX191MzIgc2VxID0gMCwgb3NlcSA9IDAsIHNlcV9oaSA9IDAsIG9zZXFfaGkgPSAwOworCWNoYXIgKmlkcCA9IE5VTEw7CisJY2hhciAqYWVhZG9wID0gTlVMTDsKKwljaGFyICplYWxnb3AgPSBOVUxMOworCWNoYXIgKmFhbGdvcCA9IE5VTEw7CisJY2hhciAqY2FsZ29wID0gTlVMTDsKKwljaGFyICpjb2FwID0gTlVMTDsKKwljaGFyICpzY3R4cCA9IE5VTEw7CisJX191MzIgZXh0cmFfZmxhZ3MgPSAwOworCXN0cnVjdCB4ZnJtX21hcmsgbWFyayA9IHswLCAwfTsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggc2N0eDsKKwkJY2hhciAgICBzdHJbQ1RYX0JVRl9TSVpFXTsKKwl9IGN0eDsKKworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisJbWVtc2V0KCZyZXBsYXksIDAsIHNpemVvZihyZXBsYXkpKTsKKwltZW1zZXQoJnJlcGxheV9lc24sIDAsIHNpemVvZihyZXBsYXlfZXNuKSk7CisJbWVtc2V0KCZjdHgsIDAsIHNpemVvZihjdHgpKTsKKworCXJlcS5uLm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2YocmVxLnhzaW5mbykpOworCXJlcS5uLm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVHxmbGFnczsKKwlyZXEubi5ubG1zZ190eXBlID0gY21kOworCXJlcS54c2luZm8uZmFtaWx5ID0gcHJlZmVycmVkX2ZhbWlseTsKKworCXJlcS54c2luZm8ubGZ0LnNvZnRfYnl0ZV9saW1pdCA9IFhGUk1fSU5GOworCXJlcS54c2luZm8ubGZ0LmhhcmRfYnl0ZV9saW1pdCA9IFhGUk1fSU5GOworCXJlcS54c2luZm8ubGZ0LnNvZnRfcGFja2V0X2xpbWl0ID0gWEZSTV9JTkY7CisJcmVxLnhzaW5mby5sZnQuaGFyZF9wYWNrZXRfbGltaXQgPSBYRlJNX0lORjsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAoc3RyY21wKCphcmd2LCAibW9kZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQl4ZnJtX21vZGVfcGFyc2UoJnJlcS54c2luZm8ubW9kZSwgJmFyZ2MsICZhcmd2KTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJtYXJrIikgPT0gMCkgeworCQkJeGZybV9wYXJzZV9tYXJrKCZtYXJrLCAmYXJnYywgJmFyZ3YpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInJlcWlkIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCXhmcm1fcmVxaWRfcGFyc2UoJnJlcS54c2luZm8ucmVxaWQsICZhcmdjLCAmYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAic2VxIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCXhmcm1fc2VxX3BhcnNlKCZyZXEueHNpbmZvLnNlcSwgJmFyZ2MsICZhcmd2KTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJyZXBsYXktd2luZG93IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTMyKCZyZXBsYXlfd2luZG93LCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJ2YWx1ZSBhZnRlciBcInJlcGxheS13aW5kb3dcIiBpcyBpbnZhbGlkIiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInJlcGxheS1zZXEiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJnNlcSwgKmFyZ3YsIDApKQorCQkJCWludmFyZygidmFsdWUgYWZ0ZXIgXCJyZXBsYXktc2VxXCIgaXMgaW52YWxpZCIsICphcmd2KTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJyZXBsYXktc2VxLWhpIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTMyKCZzZXFfaGksICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoInZhbHVlIGFmdGVyIFwicmVwbGF5LXNlcS1oaVwiIGlzIGludmFsaWQiLCAqYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAicmVwbGF5LW9zZXEiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJm9zZXEsICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoInZhbHVlIGFmdGVyIFwicmVwbGF5LW9zZXFcIiBpcyBpbnZhbGlkIiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInJlcGxheS1vc2VxLWhpIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTMyKCZvc2VxX2hpLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJ2YWx1ZSBhZnRlciBcInJlcGxheS1vc2VxLWhpXCIgaXMgaW52YWxpZCIsICphcmd2KTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJmbGFnIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCXhmcm1fc3RhdGVfZmxhZ19wYXJzZSgmcmVxLnhzaW5mby5mbGFncywgJmFyZ2MsICZhcmd2KTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJleHRyYS1mbGFnIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCXhmcm1fc3RhdGVfZXh0cmFfZmxhZ19wYXJzZSgmZXh0cmFfZmxhZ3MsICZhcmdjLCAmYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAic2VsIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCXByZWZlcnJlZF9mYW1pbHkgPSBBRl9VTlNQRUM7CisJCQl4ZnJtX3NlbGVjdG9yX3BhcnNlKCZyZXEueHNpbmZvLnNlbCwgJmFyZ2MsICZhcmd2KTsKKwkJCXByZWZlcnJlZF9mYW1pbHkgPSByZXEueHNpbmZvLnNlbC5mYW1pbHk7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibGltaXQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJeGZybV9saWZldGltZV9jZmdfcGFyc2UoJnJlcS54c2luZm8ubGZ0LCAmYXJnYywgJmFyZ3YpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImVuY2FwIikgPT0gMCkgeworCQkJc3RydWN0IHhmcm1fZW5jYXBfdG1wbCBlbmNhcDsKKwkJCWluZXRfcHJlZml4IG9hOworCQkgICAgICAgIE5FWFRfQVJHKCk7CisJCQl4ZnJtX2VuY2FwX3R5cGVfcGFyc2UoJmVuY2FwLmVuY2FwX3R5cGUsICZhcmdjLCAmYXJndik7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MTYoJmVuY2FwLmVuY2FwX3Nwb3J0LCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJTUE9SVCB2YWx1ZSBhZnRlciBcImVuY2FwXCIgaXMgaW52YWxpZCIsICphcmd2KTsKKwkJCWVuY2FwLmVuY2FwX3Nwb3J0ID0gaHRvbnMoZW5jYXAuZW5jYXBfc3BvcnQpOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTE2KCZlbmNhcC5lbmNhcF9kcG9ydCwgKmFyZ3YsIDApKQorCQkJCWludmFyZygiRFBPUlQgdmFsdWUgYWZ0ZXIgXCJlbmNhcFwiIGlzIGludmFsaWQiLCAqYXJndik7CisJCQllbmNhcC5lbmNhcF9kcG9ydCA9IGh0b25zKGVuY2FwLmVuY2FwX2Rwb3J0KTsKKwkJCU5FWFRfQVJHKCk7CisJCQlnZXRfYWRkcigmb2EsICphcmd2LCBBRl9VTlNQRUMpOworCQkJbWVtY3B5KCZlbmNhcC5lbmNhcF9vYSwgJm9hLmRhdGEsIHNpemVvZihlbmNhcC5lbmNhcF9vYSkpOworCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcS5idWYpLCBYRlJNQV9FTkNBUCwKKwkJCQkgICh2b2lkICopJmVuY2FwLCBzaXplb2YoZW5jYXApKTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJjb2EiKSA9PSAwKSB7CisJCQlpbmV0X3ByZWZpeCBjb2E7CisJCQl4ZnJtX2FkZHJlc3NfdCB4Y29hOworCisJCQlpZiAoY29hcCkKKwkJCQlkdXBhcmcoImNvYSIsICphcmd2KTsKKwkJCWNvYXAgPSAqYXJndjsKKworCQkJTkVYVF9BUkcoKTsKKworCQkJZ2V0X3ByZWZpeCgmY29hLCAqYXJndiwgcHJlZmVycmVkX2ZhbWlseSk7CisJCQlpZiAoY29hLmZhbWlseSA9PSBBRl9VTlNQRUMpCisJCQkJaW52YXJnKCJ2YWx1ZSBhZnRlciBcImNvYVwiIGhhcyBhbiB1bnJlY29nbml6ZWQgYWRkcmVzcyBmYW1pbHkiLCAqYXJndik7CisJCQlpZiAoY29hLmJ5dGVsZW4gPiBzaXplb2YoeGNvYSkpCisJCQkJaW52YXJnKCJ2YWx1ZSBhZnRlciBcImNvYVwiIGlzIHRvbyBsYXJnZSIsICphcmd2KTsKKworCQkJbWVtc2V0KCZ4Y29hLCAwLCBzaXplb2YoeGNvYSkpOworCQkJbWVtY3B5KCZ4Y29hLCAmY29hLmRhdGEsIGNvYS5ieXRlbGVuKTsKKworCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcS5idWYpLCBYRlJNQV9DT0FERFIsCisJCQkJICAodm9pZCAqKSZ4Y29hLCBzaXplb2YoeGNvYSkpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImN0eCIpID09IDApIHsKKwkJCWNoYXIgKmNvbnRleHQ7CisKKwkJCWlmIChzY3R4cCkKKwkJCQlkdXBhcmcoImN0eCIsICphcmd2KTsKKwkJCXNjdHhwID0gKmFyZ3Y7CisKKwkJCU5FWFRfQVJHKCk7CisJCQljb250ZXh0ID0gKmFyZ3Y7CisKKwkJCXhmcm1fc2N0eF9wYXJzZSgoY2hhciAqKSZjdHguc3RyLCBjb250ZXh0LCAmY3R4LnNjdHgpOworCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcS5idWYpLCBYRlJNQV9TRUNfQ1RYLAorCQkJCSAgKHZvaWQgKikmY3R4LCBjdHguc2N0eC5sZW4pOworCQl9IGVsc2UgeworCQkJLyogdHJ5IHRvIGFzc3VtZSBBTEdPICovCisJCQlpbnQgdHlwZSA9IHhmcm1fYWxnb3R5cGVfZ2V0YnluYW1lKCphcmd2KTsKKwkJCXN3aXRjaCAodHlwZSkgeworCQkJY2FzZSBYRlJNQV9BTEdfQUVBRDoKKwkJCWNhc2UgWEZSTUFfQUxHX0NSWVBUOgorCQkJY2FzZSBYRlJNQV9BTEdfQVVUSDoKKwkJCWNhc2UgWEZSTUFfQUxHX0FVVEhfVFJVTkM6CisJCQljYXNlIFhGUk1BX0FMR19DT01QOgorCQkJeworCQkJCS8qIEFMR08gKi8KKwkJCQlzdHJ1Y3QgeworCQkJCQl1bmlvbiB7CisJCQkJCQlzdHJ1Y3QgeGZybV9hbGdvIGFsZzsKKwkJCQkJCXN0cnVjdCB4ZnJtX2FsZ29fYWVhZCBhZWFkOworCQkJCQkJc3RydWN0IHhmcm1fYWxnb19hdXRoIGF1dGg7CisJCQkJCX0gdTsKKwkJCQkJY2hhciBidWZbWEZSTV9BTEdPX0tFWV9CVUZfU0laRV07CisJCQkJfSBhbGcgPSB7fTsKKwkJCQlpbnQgbGVuOworCQkJCV9fdTMyIGljdmxlbiwgdHJ1bmNsZW47CisJCQkJY2hhciAqbmFtZTsKKwkJCQljaGFyICprZXkgPSAiIjsKKwkJCQljaGFyICpidWY7CisKKwkJCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCQljYXNlIFhGUk1BX0FMR19BRUFEOgorCQkJCQlpZiAoZWFsZ29wIHx8IGFhbGdvcCB8fCBhZWFkb3ApCisJCQkJCQlkdXBhcmcoIkFMR08tVFlQRSIsICphcmd2KTsKKwkJCQkJYWVhZG9wID0gKmFyZ3Y7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgWEZSTUFfQUxHX0NSWVBUOgorCQkJCQlpZiAoZWFsZ29wIHx8IGFlYWRvcCkKKwkJCQkJCWR1cGFyZygiQUxHTy1UWVBFIiwgKmFyZ3YpOworCQkJCQllYWxnb3AgPSAqYXJndjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBYRlJNQV9BTEdfQVVUSDoKKwkJCQljYXNlIFhGUk1BX0FMR19BVVRIX1RSVU5DOgorCQkJCQlpZiAoYWFsZ29wIHx8IGFlYWRvcCkKKwkJCQkJCWR1cGFyZygiQUxHTy1UWVBFIiwgKmFyZ3YpOworCQkJCQlhYWxnb3AgPSAqYXJndjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBYRlJNQV9BTEdfQ09NUDoKKwkJCQkJaWYgKGNhbGdvcCkKKwkJCQkJCWR1cGFyZygiQUxHTy1UWVBFIiwgKmFyZ3YpOworCQkJCQljYWxnb3AgPSAqYXJndjsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJLyogbm90IHJlYWNoZWQgKi8KKwkJCQkJaW52YXJnKCJBTEdPLVRZUEUgdmFsdWUgaXMgaW52YWxpZFxuIiwgKmFyZ3YpOworCQkJCX0KKworCQkJCWlmICghTkVYVF9BUkdfT0soKSkKKwkJCQkJbWlzc2FyZygiQUxHTy1OQU1FIik7CisJCQkJTkVYVF9BUkcoKTsKKwkJCQluYW1lID0gKmFyZ3Y7CisKKwkJCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCQljYXNlIFhGUk1BX0FMR19BRUFEOgorCQkJCWNhc2UgWEZSTUFfQUxHX0NSWVBUOgorCQkJCWNhc2UgWEZSTUFfQUxHX0FVVEg6CisJCQkJY2FzZSBYRlJNQV9BTEdfQVVUSF9UUlVOQzoKKwkJCQkJaWYgKCFORVhUX0FSR19PSygpKQorCQkJCQkJbWlzc2FyZygiQUxHTy1LRVlNQVQiKTsKKwkJCQkJTkVYVF9BUkcoKTsKKwkJCQkJa2V5ID0gKmFyZ3Y7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWJ1ZiA9IGFsZy51LmFsZy5hbGdfa2V5OworCQkJCWxlbiA9IHNpemVvZihhbGcudS5hbGcpOworCisJCQkJc3dpdGNoICh0eXBlKSB7CisJCQkJY2FzZSBYRlJNQV9BTEdfQUVBRDoKKwkJCQkJaWYgKCFORVhUX0FSR19PSygpKQorCQkJCQkJbWlzc2FyZygiQUxHTy1JQ1YtTEVOIik7CisJCQkJCU5FWFRfQVJHKCk7CisJCQkJCWlmIChnZXRfdTMyKCZpY3ZsZW4sICphcmd2LCAwKSkKKwkJCQkJCWludmFyZygiQUxHTy1JQ1YtTEVOIHZhbHVlIGlzIGludmFsaWQiLAorCQkJCQkJICAgICAgICphcmd2KTsKKwkJCQkJYWxnLnUuYWVhZC5hbGdfaWN2X2xlbiA9IGljdmxlbjsKKworCQkJCQlidWYgPSBhbGcudS5hZWFkLmFsZ19rZXk7CisJCQkJCWxlbiA9IHNpemVvZihhbGcudS5hZWFkKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBYRlJNQV9BTEdfQVVUSF9UUlVOQzoKKwkJCQkJaWYgKCFORVhUX0FSR19PSygpKQorCQkJCQkJbWlzc2FyZygiQUxHTy1UUlVOQy1MRU4iKTsKKwkJCQkJTkVYVF9BUkcoKTsKKwkJCQkJaWYgKGdldF91MzIoJnRydW5jbGVuLCAqYXJndiwgMCkpCisJCQkJCQlpbnZhcmcoIkFMR08tVFJVTkMtTEVOIHZhbHVlIGlzIGludmFsaWQiLAorCQkJCQkJICAgICAgICphcmd2KTsKKwkJCQkJYWxnLnUuYXV0aC5hbGdfdHJ1bmNfbGVuID0gdHJ1bmNsZW47CisKKwkJCQkJYnVmID0gYWxnLnUuYXV0aC5hbGdfa2V5OworCQkJCQlsZW4gPSBzaXplb2YoYWxnLnUuYXV0aCk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCXhmcm1fYWxnb19wYXJzZSgodm9pZCAqKSZhbGcsIHR5cGUsIG5hbWUsIGtleSwKKwkJCQkJCWJ1Ziwgc2l6ZW9mKGFsZy5idWYpKTsKKwkJCQlsZW4gKz0gYWxnLnUuYWxnLmFsZ19rZXlfbGVuOworCisJCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcS5idWYpLCB0eXBlLAorCQkJCQkgICh2b2lkICopJmFsZywgbGVuKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQkJLyogdHJ5IHRvIGFzc3VtZSBJRCAqLworCQkJCWlmIChpZHApCisJCQkJCWludmFyZygidW5rbm93biIsICphcmd2KTsKKwkJCQlpZHAgPSAqYXJndjsKKworCQkJCS8qIElEICovCisJCQkJeGZybV9pZF9wYXJzZSgmcmVxLnhzaW5mby5zYWRkciwgJnJlcS54c2luZm8uaWQsCisJCQkJCSAgICAgICZyZXEueHNpbmZvLmZhbWlseSwgMCwgJmFyZ2MsICZhcmd2KTsKKwkJCQlpZiAocHJlZmVycmVkX2ZhbWlseSA9PSBBRl9VTlNQRUMpCisJCQkJCXByZWZlcnJlZF9mYW1pbHkgPSByZXEueHNpbmZvLmZhbWlseTsKKwkJCX0KKwkJfQorCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisKKwlpZiAocmVxLnhzaW5mby5mbGFncyAmIFhGUk1fU1RBVEVfRVNOICYmCisJICAgIHJlcGxheV93aW5kb3cgPT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBlc24gZmxhZyBzZXQgd2l0aG91dCByZXBsYXktd2luZG93LlxuIik7CisJCWV4aXQoLTEpOworCX0KKworCWlmIChyZXBsYXlfd2luZG93ID4gWEZSTUFfUkVQTEFZX0VTTl9NQVgpIHsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiRXJyb3I6IHJlcGxheS13aW5kb3cgKCV1KSA+IFhGUk1BX1JFUExBWV9FU05fTUFYICgldSkuXG4iLAorCQkJcmVwbGF5X3dpbmRvdywgWEZSTUFfUkVQTEFZX0VTTl9NQVgpOworCQlleGl0KC0xKTsKKwl9CisKKwlpZiAocmVxLnhzaW5mby5mbGFncyAmIFhGUk1fU1RBVEVfRVNOIHx8CisJICAgIHJlcGxheV93aW5kb3cgPiAoc2l6ZW9mKHJlcGxheS5iaXRtYXApICogOCkpIHsKKwkJcmVwbGF5X2Vzbi5zZXEgPSBzZXE7CisJCXJlcGxheV9lc24ub3NlcSA9IG9zZXE7CisJCXJlcGxheV9lc24uc2VxX2hpID0gc2VxX2hpOworCQlyZXBsYXlfZXNuLm9zZXFfaGkgPSBvc2VxX2hpOworCQlyZXBsYXlfZXNuLnJlcGxheV93aW5kb3cgPSByZXBsYXlfd2luZG93OworCQlyZXBsYXlfZXNuLmJtcF9sZW4gPSAocmVwbGF5X3dpbmRvdyArIHNpemVvZihfX3UzMikgKiA4IC0gMSkgLworCQkJCSAgICAgKHNpemVvZihfX3UzMikgKiA4KTsKKwkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcS5idWYpLCBYRlJNQV9SRVBMQVlfRVNOX1ZBTCwKKwkJCSAgJnJlcGxheV9lc24sIHNpemVvZihyZXBsYXlfZXNuKSk7CisJfSBlbHNlIHsKKwkJaWYgKHNlcSB8fCBvc2VxKSB7CisJCQlyZXBsYXkuc2VxID0gc2VxOworCQkJcmVwbGF5Lm9zZXEgPSBvc2VxOworCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcS5idWYpLCBYRlJNQV9SRVBMQVlfVkFMLAorCQkJCSAgJnJlcGxheSwgc2l6ZW9mKHJlcGxheSkpOworCQl9CisJCXJlcS54c2luZm8ucmVwbGF5X3dpbmRvdyA9IHJlcGxheV93aW5kb3c7CisJfQorCisJaWYgKGV4dHJhX2ZsYWdzKQorCQlhZGRhdHRyMzIoJnJlcS5uLCBzaXplb2YocmVxLmJ1ZiksIFhGUk1BX1NBX0VYVFJBX0ZMQUdTLAorCQkJICBleHRyYV9mbGFncyk7CisKKwlpZiAoIWlkcCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vdCBlbm91Z2ggaW5mb3JtYXRpb246IElEIGlzIHJlcXVpcmVkXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAobWFyay5tKSB7CisJCWludCByID0gYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcS5idWYpLCBYRlJNQV9NQVJLLAorCQkJCSAgKHZvaWQgKikmbWFyaywgc2l6ZW9mKG1hcmspKTsKKwkJaWYgKHIgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlhGUk1BX01BUksgZmFpbGVkXG4iKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisKKwlpZiAoeGZybV94ZnJtcHJvdG9faXNfaXBzZWMocmVxLnhzaW5mby5pZC5wcm90bykpIHsKKwkJc3dpdGNoIChyZXEueHNpbmZvLm1vZGUpIHsKKwkJY2FzZSBYRlJNX01PREVfVFJBTlNQT1JUOgorCQljYXNlIFhGUk1fTU9ERV9UVU5ORUw6CisJCQlicmVhazsKKwkJY2FzZSBYRlJNX01PREVfQkVFVDoKKwkJCWlmIChyZXEueHNpbmZvLmlkLnByb3RvID09IElQUFJPVE9fRVNQKQorCQkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZnByaW50ZihzdGRlcnIsICJNT0RFIHZhbHVlIGlzIGludmFsaWQgd2l0aCBYRlJNLVBST1RPIHZhbHVlIFwiJXNcIlxuIiwKKwkJCQlzdHJ4Zl94ZnJtcHJvdG8ocmVxLnhzaW5mby5pZC5wcm90bykpOworCQkJZXhpdCgxKTsKKwkJfQorCisJCXN3aXRjaCAocmVxLnhzaW5mby5pZC5wcm90bykgeworCQljYXNlIElQUFJPVE9fRVNQOgorCQkJaWYgKGNhbGdvcCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiQUxHTy1UWVBFIHZhbHVlIFwiJXNcIiBpcyBpbnZhbGlkIHdpdGggWEZSTS1QUk9UTyB2YWx1ZSBcIiVzXCJcbiIsCisJCQkJCXN0cnhmX2FsZ290eXBlKFhGUk1BX0FMR19DT01QKSwKKwkJCQkJc3RyeGZfeGZybXByb3RvKHJlcS54c2luZm8uaWQucHJvdG8pKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQkJaWYgKCFlYWxnb3AgJiYgIWFlYWRvcCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiQUxHTy1UWVBFIHZhbHVlIFwiJXNcIiBvciBcIiVzXCIgaXMgcmVxdWlyZWQgd2l0aCBYRlJNLVBST1RPIHZhbHVlIFwiJXNcIlxuIiwKKwkJCQkJc3RyeGZfYWxnb3R5cGUoWEZSTUFfQUxHX0NSWVBUKSwKKwkJCQkJc3RyeGZfYWxnb3R5cGUoWEZSTUFfQUxHX0FFQUQpLAorCQkJCQlzdHJ4Zl94ZnJtcHJvdG8ocmVxLnhzaW5mby5pZC5wcm90bykpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBJUFBST1RPX0FIOgorCQkJaWYgKGVhbGdvcCB8fCBhZWFkb3AgfHwgY2FsZ29wKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJBTEdPLVRZUEUgdmFsdWVzIFwiJXNcIiwgXCIlc1wiLCBhbmQgXCIlc1wiIGFyZSBpbnZhbGlkIHdpdGggWEZSTS1QUk9UTyB2YWx1ZSBcIiVzXCJcbiIsCisJCQkJCXN0cnhmX2FsZ290eXBlKFhGUk1BX0FMR19DUllQVCksCisJCQkJCXN0cnhmX2FsZ290eXBlKFhGUk1BX0FMR19BRUFEKSwKKwkJCQkJc3RyeGZfYWxnb3R5cGUoWEZSTUFfQUxHX0NPTVApLAorCQkJCQlzdHJ4Zl94ZnJtcHJvdG8ocmVxLnhzaW5mby5pZC5wcm90bykpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlpZiAoIWFhbGdvcCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiQUxHTy1UWVBFIHZhbHVlIFwiJXNcIiBvciBcIiVzXCIgaXMgcmVxdWlyZWQgd2l0aCBYRlJNLVBST1RPIHZhbHVlIFwiJXNcIlxuIiwKKwkJCQkJc3RyeGZfYWxnb3R5cGUoWEZSTUFfQUxHX0FVVEgpLAorCQkJCQlzdHJ4Zl9hbGdvdHlwZShYRlJNQV9BTEdfQVVUSF9UUlVOQyksCisJCQkJCXN0cnhmX3hmcm1wcm90byhyZXEueHNpbmZvLmlkLnByb3RvKSk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIElQUFJPVE9fQ09NUDoKKwkJCWlmIChlYWxnb3AgfHwgYWFsZ29wIHx8IGFlYWRvcCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiQUxHTy1UWVBFIHZhbHVlcyBcIiVzXCIsIFwiJXNcIiwgXCIlc1wiLCBhbmQgXCIlc1wiIGFyZSBpbnZhbGlkIHdpdGggWEZSTS1QUk9UTyB2YWx1ZSBcIiVzXCJcbiIsCisJCQkJCXN0cnhmX2FsZ290eXBlKFhGUk1BX0FMR19DUllQVCksCisJCQkJCXN0cnhmX2FsZ290eXBlKFhGUk1BX0FMR19BVVRIKSwKKwkJCQkJc3RyeGZfYWxnb3R5cGUoWEZSTUFfQUxHX0FVVEhfVFJVTkMpLAorCQkJCQlzdHJ4Zl9hbGdvdHlwZShYRlJNQV9BTEdfQUVBRCksCisJCQkJCXN0cnhmX3hmcm1wcm90byhyZXEueHNpbmZvLmlkLnByb3RvKSk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWlmICghY2FsZ29wKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJBTEdPLVRZUEUgdmFsdWUgXCIlc1wiIGlzIHJlcXVpcmVkIHdpdGggWEZSTS1QUk9UTyB2YWx1ZSBcIiVzXCJcbiIsCisJCQkJCXN0cnhmX2FsZ290eXBlKFhGUk1BX0FMR19DT01QKSwKKwkJCQkJc3RyeGZfeGZybXByb3RvKHJlcS54c2luZm8uaWQucHJvdG8pKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZWFsZ29wIHx8IGFhbGdvcCB8fCBhZWFkb3AgfHwgY2FsZ29wKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkFMR08gaXMgaW52YWxpZCB3aXRoIFhGUk0tUFJPVE8gdmFsdWUgXCIlc1wiXG4iLAorCQkJCXN0cnhmX3hmcm1wcm90byhyZXEueHNpbmZvLmlkLnByb3RvKSk7CisJCQlleGl0KDEpOworCQl9CisJfQorCisJaWYgKHhmcm1feGZybXByb3RvX2lzX3JvKHJlcS54c2luZm8uaWQucHJvdG8pKSB7CisJCXN3aXRjaCAocmVxLnhzaW5mby5tb2RlKSB7CisJCWNhc2UgWEZSTV9NT0RFX1JPVVRFT1BUSU1JWkFUSU9OOgorCQljYXNlIFhGUk1fTU9ERV9JTl9UUklHR0VSOgorCQkJYnJlYWs7CisJCWNhc2UgMDoKKwkJCWZwcmludGYoc3RkZXJyLCAiXCJtb2RlXCIgaXMgcmVxdWlyZWQgd2l0aCBYRlJNLVBST1RPIHZhbHVlIFwiJXNcIlxuIiwKKwkJCQlzdHJ4Zl94ZnJtcHJvdG8ocmVxLnhzaW5mby5pZC5wcm90bykpOworCQkJZXhpdCgxKTsKKwkJZGVmYXVsdDoKKwkJCWZwcmludGYoc3RkZXJyLCAiTU9ERSB2YWx1ZSBpcyBpbnZhbGlkIHdpdGggWEZSTS1QUk9UTyB2YWx1ZSBcIiVzXCJcbiIsCisJCQkJc3RyeGZfeGZybXByb3RvKHJlcS54c2luZm8uaWQucHJvdG8pKTsKKwkJCWV4aXQoMSk7CisJCX0KKworCQlpZiAoIWNvYXApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiXCJjb2FcIiBpcyByZXF1aXJlZCB3aXRoIFhGUk0tUFJPVE8gdmFsdWUgXCIlc1wiXG4iLAorCQkJCXN0cnhmX3hmcm1wcm90byhyZXEueHNpbmZvLmlkLnByb3RvKSk7CisJCQlleGl0KDEpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGNvYXApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiXCJjb2FcIiBpcyBpbnZhbGlkIHdpdGggWEZSTS1QUk9UTyB2YWx1ZSBcIiVzXCJcbiIsCisJCQkJc3RyeGZfeGZybXByb3RvKHJlcS54c2luZm8uaWQucHJvdG8pKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisKKwlpZiAocnRubF9vcGVuX2J5cHJvdG8oJnJ0aCwgMCwgTkVUTElOS19YRlJNKSA8IDApCisJCWV4aXQoMSk7CisKKwlpZiAocmVxLnhzaW5mby5mYW1pbHkgPT0gQUZfVU5TUEVDKQorCQlyZXEueHNpbmZvLmZhbWlseSA9IEFGX0lORVQ7CisKKwlpZiAocnRubF90YWxrKCZydGgsICZyZXEubiwgTlVMTCwgMCkgPCAwKQorCQlleGl0KDIpOworCisJcnRubF9jbG9zZSgmcnRoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhmcm1fc3RhdGVfYWxsb2NzcGkoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBydG5sX2hhbmRsZSBydGg7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyCW47CisJCXN0cnVjdCB4ZnJtX3VzZXJzcGlfaW5mbyB4c3BpOworCQljaGFyICAJCQlidWZbUlRBX0JVRl9TSVpFXTsKKwl9IHJlcTsKKwljaGFyICppZHAgPSBOVUxMOworCWNoYXIgKm1pbnAgPSBOVUxMOworCWNoYXIgKm1heHAgPSBOVUxMOworCXN0cnVjdCB4ZnJtX21hcmsgbWFyayA9IHswLCAwfTsKKwljaGFyIHJlc19idWZbTkxNU0dfQlVGX1NJWkVdOworCXN0cnVjdCBubG1zZ2hkciAqcmVzX24gPSAoc3RydWN0IG5sbXNnaGRyICopcmVzX2J1ZjsKKworCW1lbXNldChyZXNfYnVmLCAwLCBzaXplb2YocmVzX2J1ZikpOworCisJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKworCXJlcS5uLm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2YocmVxLnhzcGkpKTsKKwlyZXEubi5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1Q7CisJcmVxLm4ubmxtc2dfdHlwZSA9IFhGUk1fTVNHX0FMTE9DU1BJOworCXJlcS54c3BpLmluZm8uZmFtaWx5ID0gcHJlZmVycmVkX2ZhbWlseTsKKworI2lmIDAKKwlyZXEueHNpbmZvLmxmdC5zb2Z0X2J5dGVfbGltaXQgPSBYRlJNX0lORjsKKwlyZXEueHNpbmZvLmxmdC5oYXJkX2J5dGVfbGltaXQgPSBYRlJNX0lORjsKKwlyZXEueHNpbmZvLmxmdC5zb2Z0X3BhY2tldF9saW1pdCA9IFhGUk1fSU5GOworCXJlcS54c2luZm8ubGZ0LmhhcmRfcGFja2V0X2xpbWl0ID0gWEZSTV9JTkY7CisjZW5kaWYKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAoc3RyY21wKCphcmd2LCAibW9kZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQl4ZnJtX21vZGVfcGFyc2UoJnJlcS54c3BpLmluZm8ubW9kZSwgJmFyZ2MsICZhcmd2KTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJtYXJrIikgPT0gMCkgeworCQkJeGZybV9wYXJzZV9tYXJrKCZtYXJrLCAmYXJnYywgJmFyZ3YpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInJlcWlkIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCXhmcm1fcmVxaWRfcGFyc2UoJnJlcS54c3BpLmluZm8ucmVxaWQsICZhcmdjLCAmYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAic2VxIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCXhmcm1fc2VxX3BhcnNlKCZyZXEueHNwaS5pbmZvLnNlcSwgJmFyZ2MsICZhcmd2KTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJtaW4iKSA9PSAwKSB7CisJCQlpZiAobWlucCkKKwkJCQlkdXBhcmcoIm1pbiIsICphcmd2KTsKKwkJCW1pbnAgPSAqYXJndjsKKworCQkJTkVYVF9BUkcoKTsKKworCQkJaWYgKGdldF91MzIoJnJlcS54c3BpLm1pbiwgKmFyZ3YsIDApKQorCQkJCWludmFyZygidmFsdWUgYWZ0ZXIgXCJtaW5cIiBpcyBpbnZhbGlkIiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm1heCIpID09IDApIHsKKwkJCWlmIChtYXhwKQorCQkJCWR1cGFyZygibWF4IiwgKmFyZ3YpOworCQkJbWF4cCA9ICphcmd2OworCisJCQlORVhUX0FSRygpOworCisJCQlpZiAoZ2V0X3UzMigmcmVxLnhzcGkubWF4LCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJ2YWx1ZSBhZnRlciBcIm1heFwiIGlzIGludmFsaWQiLCAqYXJndik7CisJCX0gZWxzZSB7CisJCQkvKiB0cnkgdG8gYXNzdW1lIElEICovCisJCQlpZiAoaWRwKQorCQkJCWludmFyZygidW5rbm93biIsICphcmd2KTsKKwkJCWlkcCA9ICphcmd2OworCisJCQkvKiBJRCAqLworCQkJeGZybV9pZF9wYXJzZSgmcmVxLnhzcGkuaW5mby5zYWRkciwgJnJlcS54c3BpLmluZm8uaWQsCisJCQkJICAgICAgJnJlcS54c3BpLmluZm8uZmFtaWx5LCAwLCAmYXJnYywgJmFyZ3YpOworCQkJaWYgKHJlcS54c3BpLmluZm8uaWQuc3BpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJcInNwaVwiIGlzIGludmFsaWRcbiIpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlpZiAocHJlZmVycmVkX2ZhbWlseSA9PSBBRl9VTlNQRUMpCisJCQkJcHJlZmVycmVkX2ZhbWlseSA9IHJlcS54c3BpLmluZm8uZmFtaWx5OworCQl9CisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCWlmICghaWRwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm90IGVub3VnaCBpbmZvcm1hdGlvbjogSUQgaXMgcmVxdWlyZWRcbiIpOworCQlleGl0KDEpOworCX0KKworCWlmIChtaW5wKSB7CisJCWlmICghbWF4cCkgeworCQkJZnByaW50ZihzdGRlcnIsICJcIm1heFwiIGlzIG1pc3NpbmdcbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCQlpZiAocmVxLnhzcGkubWluID4gcmVxLnhzcGkubWF4KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgInZhbHVlIGFmdGVyIFwibWluXCIgaXMgbGFyZ2VyIHRoYW4gdmFsdWUgYWZ0ZXIgXCJtYXhcIlxuIik7CisJCQlleGl0KDEpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKG1heHApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiXCJtaW5cIiBpcyBtaXNzaW5nXG4iKTsKKwkJCWV4aXQoMSk7CisJCX0KKworCQkvKiBYWFg6IERlZmF1bHQgdmFsdWUgZGVmaW5lZCBpbiBQRl9LRVk7CisJCSAqIFNlZSBrZXJuZWwncyBuZXQva2V5L2FmX2tleS5jKHBma2V5X2dldHNwaSkuCisJCSAqLworCQlyZXEueHNwaS5taW4gPSAweDEwMDsKKwkJcmVxLnhzcGkubWF4ID0gMHgwZmZmZmZmZjsKKworCQkvKiBYWFg6IElQQ09NUCBzcGkgaXMgMTYtYml0czsKKwkJICogU2VlIGtlcm5lbCdzIG5ldC94ZnJtL3hmcm1fdXNlcih2ZXJpZnlfdXNlcnNwaV9pbmZvKS4KKwkJICovCisJCWlmIChyZXEueHNwaS5pbmZvLmlkLnByb3RvID09IElQUFJPVE9fQ09NUCkKKwkJCXJlcS54c3BpLm1heCA9IDB4ZmZmZjsKKwl9CisKKwlpZiAobWFyay5tICYgbWFyay52KSB7CisJCWludCByID0gYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcS5idWYpLCBYRlJNQV9NQVJLLAorCQkJCSAgKHZvaWQgKikmbWFyaywgc2l6ZW9mKG1hcmspKTsKKwkJaWYgKHIgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlhGUk1BX01BUksgZmFpbGVkXG4iKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisKKwlpZiAocnRubF9vcGVuX2J5cHJvdG8oJnJ0aCwgMCwgTkVUTElOS19YRlJNKSA8IDApCisJCWV4aXQoMSk7CisKKwlpZiAocmVxLnhzcGkuaW5mby5mYW1pbHkgPT0gQUZfVU5TUEVDKQorCQlyZXEueHNwaS5pbmZvLmZhbWlseSA9IEFGX0lORVQ7CisKKworCWlmIChydG5sX3RhbGsoJnJ0aCwgJnJlcS5uLCByZXNfbiwgc2l6ZW9mKHJlc19idWYpKSA8IDApCisJCWV4aXQoMik7CisKKwlpZiAoeGZybV9zdGF0ZV9wcmludChOVUxMLCByZXNfbiwgKHZvaWQqKXN0ZG91dCkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQW4gZXJyb3IgOi0pXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlydG5sX2Nsb3NlKCZydGgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGZybV9zdGF0ZV9maWx0ZXJfbWF0Y2goc3RydWN0IHhmcm1fdXNlcnNhX2luZm8gKnhzaW5mbykKK3sKKwlpZiAoIWZpbHRlci51c2UpCisJCXJldHVybiAxOworCisJaWYgKGZpbHRlci5pZF9zcmNfbWFzaykKKwkJaWYgKHhmcm1fYWRkcl9tYXRjaCgmeHNpbmZvLT5zYWRkciwgJmZpbHRlci54c2luZm8uc2FkZHIsCisJCQkJICAgIGZpbHRlci5pZF9zcmNfbWFzaykpCisJCQlyZXR1cm4gMDsKKwlpZiAoZmlsdGVyLmlkX2RzdF9tYXNrKQorCQlpZiAoeGZybV9hZGRyX21hdGNoKCZ4c2luZm8tPmlkLmRhZGRyLCAmZmlsdGVyLnhzaW5mby5pZC5kYWRkciwKKwkJCQkgICAgZmlsdGVyLmlkX2RzdF9tYXNrKSkKKwkJCXJldHVybiAwOworCWlmICgoeHNpbmZvLT5pZC5wcm90b15maWx0ZXIueHNpbmZvLmlkLnByb3RvKSZmaWx0ZXIuaWRfcHJvdG9fbWFzaykKKwkJcmV0dXJuIDA7CisJaWYgKCh4c2luZm8tPmlkLnNwaV5maWx0ZXIueHNpbmZvLmlkLnNwaSkmZmlsdGVyLmlkX3NwaV9tYXNrKQorCQlyZXR1cm4gMDsKKwlpZiAoKHhzaW5mby0+bW9kZV5maWx0ZXIueHNpbmZvLm1vZGUpJmZpbHRlci5tb2RlX21hc2spCisJCXJldHVybiAwOworCWlmICgoeHNpbmZvLT5yZXFpZF5maWx0ZXIueHNpbmZvLnJlcWlkKSZmaWx0ZXIucmVxaWRfbWFzaykKKwkJcmV0dXJuIDA7CisJaWYgKGZpbHRlci5zdGF0ZV9mbGFnc19tYXNrKQorCQlpZiAoKHhzaW5mby0+ZmxhZ3MgJiBmaWx0ZXIueHNpbmZvLmZsYWdzKSA9PSAwKQorCQkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworaW50IHhmcm1fc3RhdGVfcHJpbnQoY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8sIHN0cnVjdCBubG1zZ2hkciAqbiwKKwkJICAgICB2b2lkICphcmcpCit7CisJRklMRSAqZnAgPSAoRklMRSopYXJnOworCXN0cnVjdCBydGF0dHIgKiB0YltYRlJNQV9NQVgrMV07CisJc3RydWN0IHJ0YXR0ciAqIHJ0YTsKKwlzdHJ1Y3QgeGZybV91c2Vyc2FfaW5mbyAqeHNpbmZvID0gTlVMTDsKKwlzdHJ1Y3QgeGZybV91c2VyX2V4cGlyZSAqeGV4cCA9IE5VTEw7CisJc3RydWN0IHhmcm1fdXNlcnNhX2lkCSp4c2lkID0gTlVMTDsKKwlpbnQgbGVuID0gbi0+bmxtc2dfbGVuOworCisJaWYgKG4tPm5sbXNnX3R5cGUgIT0gWEZSTV9NU0dfTkVXU0EgJiYKKwkgICAgbi0+bmxtc2dfdHlwZSAhPSBYRlJNX01TR19ERUxTQSAmJgorCSAgICBuLT5ubG1zZ190eXBlICE9IFhGUk1fTVNHX1VQRFNBICYmCisJICAgIG4tPm5sbXNnX3R5cGUgIT0gWEZSTV9NU0dfRVhQSVJFKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm90IGEgc3RhdGU6ICUwOHggJTA4eCAlMDh4XG4iLAorCQkJbi0+bmxtc2dfbGVuLCBuLT5ubG1zZ190eXBlLCBuLT5ubG1zZ19mbGFncyk7CisJCXJldHVybiAwOworCX0KKworCWlmIChuLT5ubG1zZ190eXBlID09IFhGUk1fTVNHX0RFTFNBKSB7CisJCS8qIERvbnQgYmxhbWUgbWUgZm9yIHRoaXMgLi4gSGVyYmVydCBtYWRlIG1lIGRvIGl0ICovCisJCXhzaWQgPSBOTE1TR19EQVRBKG4pOworCQlsZW4gLT0gTkxNU0dfU1BBQ0Uoc2l6ZW9mKCp4c2lkKSk7CisJfSBlbHNlIGlmIChuLT5ubG1zZ190eXBlID09IFhGUk1fTVNHX0VYUElSRSkgeworCQl4ZXhwID0gTkxNU0dfREFUQShuKTsKKwkJeHNpbmZvID0gJnhleHAtPnN0YXRlOworCQlsZW4gLT0gTkxNU0dfU1BBQ0Uoc2l6ZW9mKCp4ZXhwKSk7CisJfSBlbHNlIHsKKwkJeGV4cCA9IE5VTEw7CisJCXhzaW5mbyA9IE5MTVNHX0RBVEEobik7CisJCWxlbiAtPSBOTE1TR19TUEFDRShzaXplb2YoKnhzaW5mbykpOworCX0KKworCWlmIChsZW4gPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQlVHOiB3cm9uZyBubG1zZyBsZW4gJWRcbiIsIGxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoeHNpbmZvICYmICF4ZnJtX3N0YXRlX2ZpbHRlcl9tYXRjaCh4c2luZm8pKQorCQlyZXR1cm4gMDsKKworCWlmIChuLT5ubG1zZ190eXBlID09IFhGUk1fTVNHX0RFTFNBKQorCQlmcHJpbnRmKGZwLCAiRGVsZXRlZCAiKTsKKwllbHNlIGlmIChuLT5ubG1zZ190eXBlID09IFhGUk1fTVNHX1VQRFNBKQorCQlmcHJpbnRmKGZwLCAiVXBkYXRlZCAiKTsKKwllbHNlIGlmIChuLT5ubG1zZ190eXBlID09IFhGUk1fTVNHX0VYUElSRSkKKwkJZnByaW50ZihmcCwgIkV4cGlyZWQgIik7CisKKwlpZiAobi0+bmxtc2dfdHlwZSA9PSBYRlJNX01TR19ERUxTQSkKKwkJcnRhID0gWEZSTVNJRF9SVEEoeHNpZCk7CisJZWxzZSBpZiAobi0+bmxtc2dfdHlwZSA9PSBYRlJNX01TR19FWFBJUkUpCisJCXJ0YSA9IFhGUk1FWFBfUlRBKHhleHApOworCWVsc2UKKwkJcnRhID0gWEZSTVNfUlRBKHhzaW5mbyk7CisKKwlwYXJzZV9ydGF0dHIodGIsIFhGUk1BX01BWCwgcnRhLCBsZW4pOworCisJaWYgKG4tPm5sbXNnX3R5cGUgPT0gWEZSTV9NU0dfREVMU0EpIHsKKwkJLy94ZnJtX3BvbGljeV9pZF9wcmludCgpOworCisJCWlmICghdGJbWEZSTUFfU0FdKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkJ1Z2d5IFhGUk1fTVNHX0RFTFNBOiBubyBYRlJNQV9TQVxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKFJUQV9QQVlMT0FEKHRiW1hGUk1BX1NBXSkgPCBzaXplb2YoKnhzaW5mbykpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQnVnZ3kgWEZSTV9NU0dfREVMUE9MSUNZOiB0b28gc2hvcnQgWEZSTUFfUE9MSUNZIGxlblxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJeHNpbmZvID0gUlRBX0RBVEEodGJbWEZSTUFfU0FdKTsKKwl9CisKKwl4ZnJtX3N0YXRlX2luZm9fcHJpbnQoeHNpbmZvLCB0YiwgZnAsIE5VTEwsIE5VTEwpOworCisJaWYgKG4tPm5sbXNnX3R5cGUgPT0gWEZSTV9NU0dfRVhQSVJFKSB7CisJCWZwcmludGYoZnAsICJcdCIpOworCQlmcHJpbnRmKGZwLCAiaGFyZCAldSIsIHhleHAtPmhhcmQpOworCQlmcHJpbnRmKGZwLCAiJXMiLCBfU0xfKTsKKwl9CisKKwlpZiAob25lbGluZSkKKwkJZnByaW50ZihmcCwgIlxuIik7CisJZmZsdXNoKGZwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhmcm1fc3RhdGVfZ2V0X29yX2RlbGV0ZShpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGludCBkZWxldGUpCit7CisJc3RydWN0IHJ0bmxfaGFuZGxlIHJ0aDsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgbmxtc2doZHIJbjsKKwkJc3RydWN0IHhmcm1fdXNlcnNhX2lkCXhzaWQ7CisJCWNoYXIgIAkJCWJ1ZltSVEFfQlVGX1NJWkVdOworCX0gcmVxOworCXN0cnVjdCB4ZnJtX2lkIGlkOworCWNoYXIgKmlkcCA9IE5VTEw7CisJc3RydWN0IHhmcm1fbWFyayBtYXJrID0gezAsIDB9OworCisJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKworCXJlcS5uLm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2YocmVxLnhzaWQpKTsKKwlyZXEubi5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1Q7CisJcmVxLm4ubmxtc2dfdHlwZSA9IGRlbGV0ZSA/IFhGUk1fTVNHX0RFTFNBIDogWEZSTV9NU0dfR0VUU0E7CisJcmVxLnhzaWQuZmFtaWx5ID0gcHJlZmVycmVkX2ZhbWlseTsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQl4ZnJtX2FkZHJlc3NfdCBzYWRkcjsKKworCQlpZiAoc3RyY21wKCphcmd2LCAibWFyayIpID09IDApIHsKKwkJCXhmcm1fcGFyc2VfbWFyaygmbWFyaywgJmFyZ2MsICZhcmd2KTsKKwkJfSBlbHNlIHsKKwkJCWlmIChpZHApCisJCQkJaW52YXJnKCJ1bmtub3duIiwgKmFyZ3YpOworCQkJaWRwID0gKmFyZ3Y7CisKKwkJCS8qIElEICovCisJCQltZW1zZXQoJmlkLCAwLCBzaXplb2YoaWQpKTsKKwkJCW1lbXNldCgmc2FkZHIsIDAsIHNpemVvZihzYWRkcikpOworCQkJeGZybV9pZF9wYXJzZSgmc2FkZHIsICZpZCwgJnJlcS54c2lkLmZhbWlseSwgMCwKKwkJCQkgICAgICAmYXJnYywgJmFyZ3YpOworCisJCQltZW1jcHkoJnJlcS54c2lkLmRhZGRyLCAmaWQuZGFkZHIsIHNpemVvZihyZXEueHNpZC5kYWRkcikpOworCQkJcmVxLnhzaWQuc3BpID0gaWQuc3BpOworCQkJcmVxLnhzaWQucHJvdG8gPSBpZC5wcm90bzsKKworCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcS5idWYpLCBYRlJNQV9TUkNBRERSLAorCQkJCSAgKHZvaWQgKikmc2FkZHIsIHNpemVvZihzYWRkcikpOworCQl9CisKKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJaWYgKG1hcmsubSAmIG1hcmsudikgeworCQlpbnQgciA9IGFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEuYnVmKSwgWEZSTUFfTUFSSywKKwkJCQkgICh2b2lkICopJm1hcmssIHNpemVvZihtYXJrKSk7CisJCWlmIChyIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJYRlJNQV9NQVJLIGZhaWxlZFxuIik7CisJCQlleGl0KDEpOworCQl9CisJfQorCisJaWYgKHJ0bmxfb3Blbl9ieXByb3RvKCZydGgsIDAsIE5FVExJTktfWEZSTSkgPCAwKQorCQlleGl0KDEpOworCisJaWYgKHJlcS54c2lkLmZhbWlseSA9PSBBRl9VTlNQRUMpCisJCXJlcS54c2lkLmZhbWlseSA9IEFGX0lORVQ7CisKKwlpZiAoZGVsZXRlKSB7CisJCWlmIChydG5sX3RhbGsoJnJ0aCwgJnJlcS5uLCBOVUxMLCAwKSA8IDApCisJCQlleGl0KDIpOworCX0gZWxzZSB7CisJCWNoYXIgYnVmW05MTVNHX0JVRl9TSVpFXTsKKwkJc3RydWN0IG5sbXNnaGRyICpyZXNfbiA9IChzdHJ1Y3Qgbmxtc2doZHIgKilidWY7CisKKwkJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCisJCWlmIChydG5sX3RhbGsoJnJ0aCwgJnJlcS5uLCByZXNfbiwgc2l6ZW9mKHJlcSkpIDwgMCkKKwkJCWV4aXQoMik7CisKKwkJaWYgKHhmcm1fc3RhdGVfcHJpbnQoTlVMTCwgcmVzX24sICh2b2lkKilzdGRvdXQpIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJBbiBlcnJvciA6LSlcbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCX0KKworCXJ0bmxfY2xvc2UoJnJ0aCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdpdGggYW4gZXhpc3Rpbmcgc3RhdGUgb2Ygbmxtc2csIG1ha2UgbmV3IG5sbXNnIGZvciBkZWxldGluZyB0aGUgc3RhdGUKKyAqIGFuZCBzdG9yZSBpdCB0byBidWZmZXIuCisgKi8KK3N0YXRpYyBpbnQgeGZybV9zdGF0ZV9rZWVwKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLAorCQkJICAgc3RydWN0IG5sbXNnaGRyICpuLAorCQkJICAgdm9pZCAqYXJnKQoreworCXN0cnVjdCB4ZnJtX2J1ZmZlciAqeGIgPSAoc3RydWN0IHhmcm1fYnVmZmVyICopYXJnOworCXN0cnVjdCBydG5sX2hhbmRsZSAqcnRoID0geGItPnJ0aDsKKwlzdHJ1Y3QgeGZybV91c2Vyc2FfaW5mbyAqeHNpbmZvID0gTkxNU0dfREFUQShuKTsKKwlpbnQgbGVuID0gbi0+bmxtc2dfbGVuOworCXN0cnVjdCBubG1zZ2hkciAqbmV3X247CisJc3RydWN0IHhmcm1fdXNlcnNhX2lkICp4c2lkOworCisJaWYgKG4tPm5sbXNnX3R5cGUgIT0gWEZSTV9NU0dfTkVXU0EpIHsKKwkJZnByaW50ZihzdGRlcnIsICJOb3QgYSBzdGF0ZTogJTA4eCAlMDh4ICUwOHhcbiIsCisJCQluLT5ubG1zZ19sZW4sIG4tPm5sbXNnX3R5cGUsIG4tPm5sbXNnX2ZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbGVuIC09IE5MTVNHX0xFTkdUSChzaXplb2YoKnhzaW5mbykpOworCWlmIChsZW4gPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQlVHOiB3cm9uZyBubG1zZyBsZW4gJWRcbiIsIGxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoIXhmcm1fc3RhdGVfZmlsdGVyX21hdGNoKHhzaW5mbykpCisJCXJldHVybiAwOworCisJaWYgKHhiLT5vZmZzZXQgPiB4Yi0+c2l6ZSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlN0YXRlIGJ1ZmZlciBvdmVyZmxvd1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwluZXdfbiA9IChzdHJ1Y3Qgbmxtc2doZHIgKikoeGItPmJ1ZiArIHhiLT5vZmZzZXQpOworCW5ld19uLT5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKCp4c2lkKSk7CisJbmV3X24tPm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVDsKKwluZXdfbi0+bmxtc2dfdHlwZSA9IFhGUk1fTVNHX0RFTFNBOworCW5ld19uLT5ubG1zZ19zZXEgPSArK3J0aC0+c2VxOworCisJeHNpZCA9IE5MTVNHX0RBVEEobmV3X24pOworCXhzaWQtPmZhbWlseSA9IHhzaW5mby0+ZmFtaWx5OworCW1lbWNweSgmeHNpZC0+ZGFkZHIsICZ4c2luZm8tPmlkLmRhZGRyLCBzaXplb2YoeHNpZC0+ZGFkZHIpKTsKKwl4c2lkLT5zcGkgPSB4c2luZm8tPmlkLnNwaTsKKwl4c2lkLT5wcm90byA9IHhzaW5mby0+aWQucHJvdG87CisKKwlhZGRhdHRyX2wobmV3X24sIHhiLT5zaXplLCBYRlJNQV9TUkNBRERSLCAmeHNpbmZvLT5zYWRkciwKKwkJICBzaXplb2YoeHNpZC0+ZGFkZHIpKTsKKworCXhiLT5vZmZzZXQgKz0gbmV3X24tPm5sbXNnX2xlbjsKKwl4Yi0+bmxtc2dfY291bnQgKys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4ZnJtX3N0YXRlX2xpc3Rfb3JfZGVsZXRlYWxsKGludCBhcmdjLCBjaGFyICoqYXJndiwgaW50IGRlbGV0ZWFsbCkKK3sKKwljaGFyICppZHAgPSBOVUxMOworCXN0cnVjdCBydG5sX2hhbmRsZSBydGg7CisKKwlpZihhcmdjID4gMCkKKwkJZmlsdGVyLnVzZSA9IDE7CisJZmlsdGVyLnhzaW5mby5mYW1pbHkgPSBwcmVmZXJyZWRfZmFtaWx5OworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChzdHJjbXAoKmFyZ3YsICJtb2RlIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCXhmcm1fbW9kZV9wYXJzZSgmZmlsdGVyLnhzaW5mby5tb2RlLCAmYXJnYywgJmFyZ3YpOworCisJCQlmaWx0ZXIubW9kZV9tYXNrID0gWEZSTV9GSUxURVJfTUFTS19GVUxMOworCisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAicmVxaWQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJeGZybV9yZXFpZF9wYXJzZSgmZmlsdGVyLnhzaW5mby5yZXFpZCwgJmFyZ2MsICZhcmd2KTsKKworCQkJZmlsdGVyLnJlcWlkX21hc2sgPSBYRlJNX0ZJTFRFUl9NQVNLX0ZVTEw7CisKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJmbGFnIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCXhmcm1fc3RhdGVfZmxhZ19wYXJzZSgmZmlsdGVyLnhzaW5mby5mbGFncywgJmFyZ2MsICZhcmd2KTsKKworCQkJZmlsdGVyLnN0YXRlX2ZsYWdzX21hc2sgPSBYRlJNX0ZJTFRFUl9NQVNLX0ZVTEw7CisKKwkJfSBlbHNlIHsKKwkJCWlmIChpZHApCisJCQkJaW52YXJnKCJ1bmtub3duIiwgKmFyZ3YpOworCQkJaWRwID0gKmFyZ3Y7CisKKwkJCS8qIElEICovCisJCQl4ZnJtX2lkX3BhcnNlKCZmaWx0ZXIueHNpbmZvLnNhZGRyLCAmZmlsdGVyLnhzaW5mby5pZCwKKwkJCQkgICAgICAmZmlsdGVyLnhzaW5mby5mYW1pbHksIDEsICZhcmdjLCAmYXJndik7CisJCQlpZiAocHJlZmVycmVkX2ZhbWlseSA9PSBBRl9VTlNQRUMpCisJCQkJcHJlZmVycmVkX2ZhbWlseSA9IGZpbHRlci54c2luZm8uZmFtaWx5OworCQl9CisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCWlmIChydG5sX29wZW5fYnlwcm90bygmcnRoLCAwLCBORVRMSU5LX1hGUk0pIDwgMCkKKwkJZXhpdCgxKTsKKworCWlmIChkZWxldGVhbGwpIHsKKwkJc3RydWN0IHhmcm1fYnVmZmVyIHhiOworCQljaGFyIGJ1ZltOTE1TR19ERUxFVEVBTExfQlVGX1NJWkVdOworCQlpbnQgaTsKKworCQl4Yi5idWYgPSBidWY7CisJCXhiLnNpemUgPSBzaXplb2YoYnVmKTsKKwkJeGIucnRoID0gJnJ0aDsKKworCQlmb3IgKGkgPSAwOyA7IGkrKykgeworCQkJc3RydWN0IHsKKwkJCQlzdHJ1Y3Qgbmxtc2doZHIgbjsKKwkJCQljaGFyIGJ1ZltOTE1TR19CVUZfU0laRV07CisJCQl9IHJlcSA9IHsKKwkJCQkubi5ubG1zZ19sZW4gPSBOTE1TR19IRFJMRU4sCisJCQkJLm4ubmxtc2dfZmxhZ3MgPSBOTE1fRl9EVU1QIHwgTkxNX0ZfUkVRVUVTVCwKKwkJCQkubi5ubG1zZ190eXBlID0gWEZSTV9NU0dfR0VUU0EsCisJCQkJLm4ubmxtc2dfc2VxID0gcnRoLmR1bXAgPSArK3J0aC5zZXEsCisJCQl9OworCisJCQl4Yi5vZmZzZXQgPSAwOworCQkJeGIubmxtc2dfY291bnQgPSAwOworCisJCQlpZiAoc2hvd19zdGF0cyA+IDEpCisJCQkJZnByaW50ZihzdGRlcnIsICJEZWxldGUtYWxsIHJvdW5kID0gJWRcbiIsIGkpOworCisJCQlpZiAocnRubF9zZW5kKCZydGgsICh2b2lkICopJnJlcSwgcmVxLm4ubmxtc2dfbGVuKSA8IDApIHsKKwkJCQlwZXJyb3IoIkNhbm5vdCBzZW5kIGR1bXAgcmVxdWVzdCIpOworCQkJCWV4aXQoMSk7CisJCQl9CisKKwkJCWlmIChydG5sX2R1bXBfZmlsdGVyKCZydGgsIHhmcm1fc3RhdGVfa2VlcCwgJnhiKSA8IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkRlbGV0ZS1hbGwgdGVybWluYXRlZFxuIik7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWlmICh4Yi5ubG1zZ19jb3VudCA9PSAwKSB7CisJCQkJaWYgKHNob3dfc3RhdHMgPiAxKQorCQkJCQlmcHJpbnRmKHN0ZGVyciwgIkRlbGV0ZS1hbGwgY29tcGxldGVkXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKHJ0bmxfc2VuZF9jaGVjaygmcnRoLCB4Yi5idWYsIHhiLm9mZnNldCkgPCAwKSB7CisJCQkJcGVycm9yKCJGYWlsZWQgdG8gc2VuZCBkZWxldGUtYWxsIHJlcXVlc3RcbiIpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlpZiAoc2hvd19zdGF0cyA+IDEpCisJCQkJZnByaW50ZihzdGRlcnIsICJEZWxldGUtYWxsIG5sbXNnIGNvdW50ID0gJWRcbiIsIHhiLm5sbXNnX2NvdW50KTsKKworCQkJeGIub2Zmc2V0ID0gMDsKKwkJCXhiLm5sbXNnX2NvdW50ID0gMDsKKwkJfQorCisJfSBlbHNlIHsKKwkJc3RydWN0IHhmcm1fYWRkcmVzc19maWx0ZXIgYWRkcmZpbHRlciA9IHsKKwkJCS5zYWRkciA9IGZpbHRlci54c2luZm8uc2FkZHIsCisJCQkuZGFkZHIgPSBmaWx0ZXIueHNpbmZvLmlkLmRhZGRyLAorCQkJLmZhbWlseSA9IGZpbHRlci54c2luZm8uZmFtaWx5LAorCQkJLnNwbGVuID0gZmlsdGVyLmlkX3NyY19tYXNrLAorCQkJLmRwbGVuID0gZmlsdGVyLmlkX2RzdF9tYXNrLAorCQl9OworCQlzdHJ1Y3QgeworCQkJc3RydWN0IG5sbXNnaGRyIG47CisJCQljaGFyIGJ1ZltOTE1TR19CVUZfU0laRV07CisJCX0gcmVxID0geworCQkJLm4ubmxtc2dfbGVuID0gTkxNU0dfSERSTEVOLAorCQkJLm4ubmxtc2dfZmxhZ3MgPSBOTE1fRl9EVU1QIHwgTkxNX0ZfUkVRVUVTVCwKKwkJCS5uLm5sbXNnX3R5cGUgPSBYRlJNX01TR19HRVRTQSwKKwkJCS5uLm5sbXNnX3NlcSA9IHJ0aC5kdW1wID0gKytydGguc2VxLAorCQl9OworCisJCWlmIChmaWx0ZXIueHNpbmZvLmlkLnByb3RvKQorCQkJYWRkYXR0cjgoJnJlcS5uLCBzaXplb2YocmVxKSwgWEZSTUFfUFJPVE8sCisJCQkJIGZpbHRlci54c2luZm8uaWQucHJvdG8pOworCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgWEZSTUFfQUREUkVTU19GSUxURVIsCisJCQkgICZhZGRyZmlsdGVyLCBzaXplb2YoYWRkcmZpbHRlcikpOworCisJCWlmIChydG5sX3NlbmQoJnJ0aCwgKHZvaWQgKikmcmVxLCByZXEubi5ubG1zZ19sZW4pIDwgMCkgeworCQkJcGVycm9yKCJDYW5ub3Qgc2VuZCBkdW1wIHJlcXVlc3QiKTsKKwkJCWV4aXQoMSk7CisJCX0KKworCQlpZiAocnRubF9kdW1wX2ZpbHRlcigmcnRoLCB4ZnJtX3N0YXRlX3ByaW50LCBzdGRvdXQpIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJEdW1wIHRlcm1pbmF0ZWRcbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCX0KKworCXJ0bmxfY2xvc2UoJnJ0aCk7CisKKwlleGl0KDApOworfQorCitzdGF0aWMgaW50IHByaW50X3NhZGluZm8oc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcpCit7CisJRklMRSAqZnAgPSAoRklMRSopYXJnOworCV9fdTMyICpmID0gTkxNU0dfREFUQShuKTsKKwlzdHJ1Y3QgcnRhdHRyICp0YltYRlJNQV9TQURfTUFYKzFdOworCXN0cnVjdCBydGF0dHIgKnJ0YTsKKwlfX3UzMiAqY250OworCisJaW50IGxlbiA9IG4tPm5sbXNnX2xlbjsKKworCWxlbiAtPSBOTE1TR19MRU5HVEgoc2l6ZW9mKF9fdTMyKSk7CisJaWYgKGxlbiA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJTQURpbmZvOiBXcm9uZyBsZW4gJWRcbiIsIGxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlydGEgPSBYRlJNU0FQRF9SVEEoZik7CisJcGFyc2VfcnRhdHRyKHRiLCBYRlJNQV9TQURfTUFYLCBydGEsIGxlbik7CisKKwlpZiAodGJbWEZSTUFfU0FEX0NOVF0pIHsKKwkJZnByaW50ZihmcCwiXHQgU0FEIik7CisJCWNudCA9IChfX3UzMiAqKVJUQV9EQVRBKHRiW1hGUk1BX1NBRF9DTlRdKTsKKwkJZnByaW50ZihmcCwiIGNvdW50ICVkIiwgKmNudCk7CisJfSBlbHNlIHsKKwkJZnByaW50ZihmcCwiQkFEIFNBRCBpbmZvIHJldHVybmVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChzaG93X3N0YXRzKSB7CisJCWlmICh0YltYRlJNQV9TQURfSElORk9dKSB7CisJCQlzdHJ1Y3QgeGZybXVfc2FkaGluZm8gKnNpOworCisJCQlpZiAoUlRBX1BBWUxPQUQodGJbWEZSTUFfU0FEX0hJTkZPXSkgPCBzaXplb2YoKnNpKSkgeworCQkJCWZwcmludGYoZnAsIkJBRCBTQUQgbGVuZ3RoIHJldHVybmVkXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJCXNpID0gUlRBX0RBVEEodGJbWEZSTUFfU0FEX0hJTkZPXSk7CisJCQlmcHJpbnRmKGZwLCIgKGJ1Y2tldHMgIik7CisJCQlmcHJpbnRmKGZwLCJjb3VudCAlZCIsIHNpLT5zYWRoY250KTsKKwkJCWZwcmludGYoZnAsIiBNYXggJWQiLCBzaS0+c2FkaG1jbnQpOworCQkJZnByaW50ZihmcCwiKSIpOworCQl9CisJfQorCWZwcmludGYoZnAsIlxuIik7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGZybV9zYWRfZ2V0aW5mbyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHJ0bmxfaGFuZGxlIHJ0aDsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgbmxtc2doZHIJCQluOworCQlfX3UzMgkJCQlmbGFnczsKKwkJY2hhcgkJCQlhbnNbNjRdOworCX0gcmVxOworCisJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKwlyZXEubi5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHJlcS5mbGFncykpOworCXJlcS5uLm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVDsKKwlyZXEubi5ubG1zZ190eXBlID0gWEZSTV9NU0dfR0VUU0FESU5GTzsKKwlyZXEuZmxhZ3MgPSAwWEZGRkZGRkZGOworCisJaWYgKHJ0bmxfb3Blbl9ieXByb3RvKCZydGgsIDAsIE5FVExJTktfWEZSTSkgPCAwKQorCQlleGl0KDEpOworCisJaWYgKHJ0bmxfdGFsaygmcnRoLCAmcmVxLm4sICZyZXEubiwgc2l6ZW9mKHJlcSkpIDwgMCkKKwkJZXhpdCgyKTsKKworCXByaW50X3NhZGluZm8oJnJlcS5uLCAodm9pZCopc3Rkb3V0KTsKKworCXJ0bmxfY2xvc2UoJnJ0aCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4ZnJtX3N0YXRlX2ZsdXNoKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgcnRubF9oYW5kbGUgcnRoOworCXN0cnVjdCB7CisJCXN0cnVjdCBubG1zZ2hkcgkJCW47CisJCXN0cnVjdCB4ZnJtX3VzZXJzYV9mbHVzaAl4c2Y7CisJfSByZXE7CisJY2hhciAqcHJvdG9wID0gTlVMTDsKKworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisKKwlyZXEubi5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHJlcS54c2YpKTsKKwlyZXEubi5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1Q7CisJcmVxLm4ubmxtc2dfdHlwZSA9IFhGUk1fTVNHX0ZMVVNIU0E7CisJcmVxLnhzZi5wcm90byA9IDA7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgInByb3RvIikgPT0gMCkgeworCQkJaW50IHJldDsKKworCQkJaWYgKHByb3RvcCkKKwkJCQlkdXBhcmcoInByb3RvIiwgKmFyZ3YpOworCQkJcHJvdG9wID0gKmFyZ3Y7CisKKwkJCU5FWFRfQVJHKCk7CisKKwkJCXJldCA9IHhmcm1feGZybXByb3RvX2dldGJ5bmFtZSgqYXJndik7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlpbnZhcmcoIlhGUk0tUFJPVE8gdmFsdWUgaXMgaW52YWxpZCIsICphcmd2KTsKKworCQkJcmVxLnhzZi5wcm90byA9IChfX3U4KXJldDsKKwkJfSBlbHNlCisJCQlpbnZhcmcoInVua25vd24iLCAqYXJndik7CisKKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJaWYgKHJ0bmxfb3Blbl9ieXByb3RvKCZydGgsIDAsIE5FVExJTktfWEZSTSkgPCAwKQorCQlleGl0KDEpOworCisJaWYgKHNob3dfc3RhdHMgPiAxKQorCQlmcHJpbnRmKHN0ZGVyciwgIkZsdXNoIHN0YXRlIHdpdGggWEZSTS1QUk9UTyB2YWx1ZSBcIiVzXCJcbiIsCisJCQlzdHJ4Zl94ZnJtcHJvdG8ocmVxLnhzZi5wcm90bykpOworCisJaWYgKHJ0bmxfdGFsaygmcnRoLCAmcmVxLm4sIE5VTEwsIDApIDwgMCkKKwkJZXhpdCgyKTsKKworCXJ0bmxfY2xvc2UoJnJ0aCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRvX3hmcm1fc3RhdGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWlmIChhcmdjIDwgMSkKKwkJcmV0dXJuIHhmcm1fc3RhdGVfbGlzdF9vcl9kZWxldGVhbGwoMCwgTlVMTCwgMCk7CisKKwlpZiAobWF0Y2hlcygqYXJndiwgImFkZCIpID09IDApCisJCXJldHVybiB4ZnJtX3N0YXRlX21vZGlmeShYRlJNX01TR19ORVdTQSwgMCwKKwkJCQkJIGFyZ2MtMSwgYXJndisxKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgInVwZGF0ZSIpID09IDApCisJCXJldHVybiB4ZnJtX3N0YXRlX21vZGlmeShYRlJNX01TR19VUERTQSwgMCwKKwkJCQkJIGFyZ2MtMSwgYXJndisxKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgImFsbG9jc3BpIikgPT0gMCkKKwkJcmV0dXJuIHhmcm1fc3RhdGVfYWxsb2NzcGkoYXJnYy0xLCBhcmd2KzEpOworCWlmIChtYXRjaGVzKCphcmd2LCAiZGVsZXRlIikgPT0gMCkKKwkJcmV0dXJuIHhmcm1fc3RhdGVfZ2V0X29yX2RlbGV0ZShhcmdjLTEsIGFyZ3YrMSwgMSk7CisJaWYgKG1hdGNoZXMoKmFyZ3YsICJkZWxldGVhbGwiKSA9PSAwIHx8IG1hdGNoZXMoKmFyZ3YsICJkZWxhbGwiKSA9PSAwKQorCQlyZXR1cm4geGZybV9zdGF0ZV9saXN0X29yX2RlbGV0ZWFsbChhcmdjLTEsIGFyZ3YrMSwgMSk7CisJaWYgKG1hdGNoZXMoKmFyZ3YsICJsaXN0IikgPT0gMCB8fCBtYXRjaGVzKCphcmd2LCAic2hvdyIpID09IDAKKwkgICAgfHwgbWF0Y2hlcygqYXJndiwgImxzdCIpID09IDApCisJCXJldHVybiB4ZnJtX3N0YXRlX2xpc3Rfb3JfZGVsZXRlYWxsKGFyZ2MtMSwgYXJndisxLCAwKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgImdldCIpID09IDApCisJCXJldHVybiB4ZnJtX3N0YXRlX2dldF9vcl9kZWxldGUoYXJnYy0xLCBhcmd2KzEsIDApOworCWlmIChtYXRjaGVzKCphcmd2LCAiZmx1c2giKSA9PSAwKQorCQlyZXR1cm4geGZybV9zdGF0ZV9mbHVzaChhcmdjLTEsIGFyZ3YrMSk7CisJaWYgKG1hdGNoZXMoKmFyZ3YsICJjb3VudCIpID09IDApIHsKKwkJcmV0dXJuIHhmcm1fc2FkX2dldGluZm8oYXJnYywgYXJndik7CisJfQorCWlmIChtYXRjaGVzKCphcmd2LCAiaGVscCIpID09IDApCisJCXVzYWdlKCk7CisJZnByaW50ZihzdGRlcnIsICJDb21tYW5kIFwiJXNcIiBpcyB1bmtub3duLCB0cnkgXCJpcCB4ZnJtIHN0YXRlIGhlbHBcIi5cbiIsICphcmd2KTsKKwlleGl0KC0xKTsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2xpYi9BbmRyb2lkLm1rIGIvaXByb3V0ZTIvbGliL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZhNWE1ZQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2xpYi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNzcgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIGNvbG9yLmMgdXRpbHMuYyBydF9uYW1lcy5jIGxsX3R5cGVzLmMgbGxfcHJvdG8uYyBsbF9hZGRyLmMgaW5ldF9wcm90by5jIFwKKyAgICBtcGxzX3B0b24uYyBuYW1lc3BhY2UuYyBuYW1lcy5jIGxpYmdlbmwuYyBsaWJuZXRsaW5rLmMKK0xPQ0FMX01PRFVMRSA6PSBsaWJpcHJvdXRldXRpbAorTE9DQUxfU1lTVEVNX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYworTE9DQUxfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpLy4uL2luY2x1ZGUKK0xPQ0FMX0NGTEFHUyA6PSAtTzIgLWcgLVcgLVdhbGwgXAorCS1EQ09ORkRJUj1cIi9kYXRhL21pc2MvbmV0XCIgXAorCS1ESEFWRV9VTklTVERfSCBcCisJLURIQVZFX0VSUk5PX0ggXAorCS1ESEFWRV9ORVRJTkVUX0lOX0ggXAorCS1ESEFWRV9TWVNfSU9DVExfSCBcCisJLURIQVZFX1NZU19NTUFOX0ggXAorCS1ESEFWRV9TWVNfTU9VTlRfSCBcCisJLURIQVZFX1NZU19QUkNUTF9IIFwKKwktREhBVkVfU1lTX1JFU09VUkNFX0ggXAorCS1ESEFWRV9TWVNfU0VMRUNUX0ggXAorCS1ESEFWRV9TWVNfU1RBVF9IIFwKKwktREhBVkVfU1lTX1RZUEVTX0ggXAorCS1ESEFWRV9TVERMSUJfSCBcCisJLURIQVZFX1NUUkRVUCBcCisJLURIQVZFX01NQVAgXAorCS1ESEFWRV9VVElNRV9IIFwKKwktREhBVkVfR0VUUEFHRVNJWkUgXAorCS1ESEFWRV9MU0VFSzY0IFwKKwktREhBVkVfTFNFRUs2NF9QUk9UT1RZUEUgXAorCS1ESEFWRV9FWFQyX0lPQ1RMUyBcCisJLURIQVZFX0xJTlVYX0ZEX0ggXAorCS1ESEFWRV9UWVBFX1NTSVpFX1QgXAorCS1ESEFWRV9TRVROUyBcCisJLURfR05VX1NPVVJDRSBcCisJLVduby1wb2ludGVyLWFyaXRoIFwKKwktV25vLXNpZ24tY29tcGFyZSBcCisJLVduby11bnVzZWQtcGFyYW1ldGVyIFwKKwktV2Vycm9yCisKKyMgVGhpcyBpcyBhIHdvcmsgYXJvdW5kIGZvciBiLzE4NDAzOTIwCitMT0NBTF9MREZMQUdTIDo9IC1XbCwtLW5vLWdjLXNlY3Rpb25zCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9TUkNfRklMRVMgOj0gbGxfbWFwLmMgbGlibmV0bGluay5jCitMT0NBTF9NT0RVTEUgOj0gbGlibmV0bGluaworTE9DQUxfU1lTVEVNX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYworTE9DQUxfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpLy4uL2luY2x1ZGUKK0xPQ0FMX0NGTEFHUyA6PSAtTzIgLWcgLVcgLVdhbGwgXAorCS1ESEFWRV9VTklTVERfSCBcCisJLURIQVZFX0VSUk5PX0ggXAorCS1ESEFWRV9ORVRJTkVUX0lOX0ggXAorCS1ESEFWRV9TWVNfSU9DVExfSCBcCisJLURIQVZFX1NZU19NTUFOX0ggXAorCS1ESEFWRV9TWVNfTU9VTlRfSCBcCisJLURIQVZFX1NZU19QUkNUTF9IIFwKKwktREhBVkVfU1lTX1JFU09VUkNFX0ggXAorCS1ESEFWRV9TWVNfU0VMRUNUX0ggXAorCS1ESEFWRV9TWVNfU1RBVF9IIFwKKwktREhBVkVfU1lTX1RZUEVTX0ggXAorCS1ESEFWRV9TVERMSUJfSCBcCisJLURIQVZFX1NUUkRVUCBcCisJLURIQVZFX01NQVAgXAorCS1ESEFWRV9VVElNRV9IIFwKKwktREhBVkVfR0VUUEFHRVNJWkUgXAorCS1ESEFWRV9MU0VFSzY0IFwKKwktREhBVkVfTFNFRUs2NF9QUk9UT1RZUEUgXAorCS1ESEFWRV9FWFQyX0lPQ1RMUyBcCisJLURIQVZFX0xJTlVYX0ZEX0ggXAorCS1ESEFWRV9UWVBFX1NTSVpFX1QgXAorCS1Xbm8tcG9pbnRlci1hcml0aCBcCisJLVduby1zaWduLWNvbXBhcmUgXAorCS1Xbm8tdW51c2VkLXBhcmFtZXRlciBcCisJLVdlcnJvcgorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9saWIvTU9EVUxFX0xJQ0VOU0VfR1BMIGIvaXByb3V0ZTIvbGliL01PRFVMRV9MSUNFTlNFX0dQTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbGliL01PRFVMRV9MSUNFTlNFX0dQTApkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbGliL01ha2VmaWxlIGIvaXByb3V0ZTIvbGliL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMTMwN2QKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9saWIvTWFrZWZpbGUKQEAgLTAsMCArMSwyNyBAQAoraW5jbHVkZSAuLi9Db25maWcKKworaWZlcSAoJChJUF9DT05GSUdfU0VUTlMpLHkpCisJQ0ZMQUdTICs9IC1ESEFWRV9TRVROUworZW5kaWYKKworQ0ZMQUdTICs9IC1mUElDCisKK1VUSUxPQkogPSB1dGlscy5vIHJ0X25hbWVzLm8gbGxfdHlwZXMubyBsbF9wcm90by5vIGxsX2FkZHIubyBcCisJaW5ldF9wcm90by5vIG5hbWVzcGFjZS5vIGpzb25fd3JpdGVyLm8gXAorCW5hbWVzLm8gY29sb3IubworCitOTE9CSj1saWJnZW5sLm8gbGxfbWFwLm8gbGlibmV0bGluay5vCisKK2FsbDogbGlibmV0bGluay5hIGxpYnV0aWwuYQorCitsaWJuZXRsaW5rLmE6ICQoTkxPQkopCisJJChBUikgcmNzICRAICQoTkxPQkopCisKK2xpYnV0aWwuYTogJChVVElMT0JKKSAkKEFERExJQikKKwkkKEFSKSByY3MgJEAgJChVVElMT0JKKSAkKEFERExJQikKKworaW5zdGFsbDoKKworY2xlYW46CisJcm0gLWYgJChOTE9CSikgJChVVElMT0JKKSAkKEFERExJQikgbGlibmV0bGluay5hIGxpYnV0aWwuYQorCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9saWIvTk9USUNFIGIvaXByb3V0ZTIvbGliL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTEyMTA5Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbGliL05PVElDRQpAQCAtMCwwICsxLDM0MCBAQAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKKyBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgICAgICAgICAgICAgICAgICAgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKKwkJCSAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCitzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcworR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KK3VzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKK3RoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bworeW91ciBwcm9ncmFtcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAoraWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCithbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCitUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQorZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKK2dyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoreW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKK3NvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKK3JpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCisoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAorZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KKworICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgordGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKK3NvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQord2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KK3RoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCithdXRob3JzJyByZXB1dGF0aW9ucy4KKworICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQorcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQorcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQorcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55CitwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LgorDAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKK2Egbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCit1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCityZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKK21lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Cit0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAorZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKK2xhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KK3RoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCitBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQoraXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCitXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KKworICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKK3NvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQorY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQorY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQorbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OworYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCit5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KKyAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKKyAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAorICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKKyAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCisgICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgorICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQorICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQorICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKKyAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcworICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0CisgICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgorICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQorDAorVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQord2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKK3VuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgorU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisgICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQorICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucworICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKKyAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgorICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKKyAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KKyAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgorICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCisgICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKKyAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCisgICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCisKK1RoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCitjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQorYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCitjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCitzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKK2FueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Citmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQorb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKK2l0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KKworSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZworYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAorYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCitkaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisMCisgIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAorb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCit2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCitIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgordGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKK3BhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCit0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KK3RoaXMgTGljZW5zZS4KKworICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCithbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCithcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgorY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisMCisgIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKK21heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwordGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZworY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCit0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucworb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCitiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KK2FkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQorbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKK3RoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24uCisKKyAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgordG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKK21ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCitvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCitvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCitGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KK09USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKK1BST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECitPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUworVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQorUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCitSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCitSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAorSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCitPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECitUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKK1lPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCitQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorCSAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0CitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KKworICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAordG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKK3RoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcword2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKKworICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgeWVhciBuYW1lIG9mIGF1dGhvcgorICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KKyAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0CisgICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKK3BhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKK2JlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQorbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCituZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQorICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KKworICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKKyAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKworVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCitwcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQorY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCitsaWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbGliL2NvbG9yLmMgYi9pcHJvdXRlMi9saWIvY29sb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzlhNDhiCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbGliL2NvbG9yLmMKQEAgLTAsMCArMSw2NCBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICJjb2xvci5oIgorCitlbnVtIGNvbG9yIHsKKwlDX1JFRCwKKwlDX0dSRUVOLAorCUNfWUVMTE9XLAorCUNfQkxVRSwKKwlDX01BR0VOVEEsCisJQ19DWUFOLAorCUNfV0hJVEUsCisJQ19DTEVBUgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjb2xvcl9jb2Rlc1tdID0geworCSJcZVszMW0iLAorCSJcZVszMm0iLAorCSJcZVszM20iLAorCSJcZVszNG0iLAorCSJcZVszNW0iLAorCSJcZVszNm0iLAorCSJcZVszN20iLAorCSJcZVswbSIsCisJTlVMTCwKK307CisKK3N0YXRpYyBlbnVtIGNvbG9yIGF0dHJfY29sb3JzW10gPSB7CisJQ19DWUFOLAorCUNfWUVMTE9XLAorCUNfTUFHRU5UQSwKKwlDX0JMVUUsCisJQ19HUkVFTiwKKwlDX1JFRAorfTsKKworc3RhdGljIGludCBjb2xvcl9pc19lbmFibGVkOworCit2b2lkIGVuYWJsZV9jb2xvcih2b2lkKQoreworCWNvbG9yX2lzX2VuYWJsZWQgPSAxOworfQorCitpbnQgY29sb3JfZnByaW50ZihGSUxFICpmcCwgZW51bSBjb2xvcl9hdHRyIGF0dHIsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCWludCByZXQgPSAwOworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisKKwlpZiAoIWNvbG9yX2lzX2VuYWJsZWQpIHsKKwkJcmV0ID0gdmZwcmludGYoZnAsIGZtdCwgYXJncyk7CisJCWdvdG8gZW5kOworCX0KKworCXJldCArPSBmcHJpbnRmKGZwLCAiJXMiLCBjb2xvcl9jb2Rlc1thdHRyX2NvbG9yc1thdHRyXV0pOworCXJldCArPSB2ZnByaW50ZihmcCwgZm10LCBhcmdzKTsKKwlyZXQgKz0gZnByaW50ZihmcCwgIiVzIiwgY29sb3JfY29kZXNbQ19DTEVBUl0pOworCitlbmQ6CisJdmFfZW5kKGFyZ3MpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9saWIvY292ZXJpdHlfbW9kZWwuYyBiL2lwcm91dGUyL2xpYi9jb3Zlcml0eV9tb2RlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4OTYzMDIKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9saWIvY292ZXJpdHlfbW9kZWwuYwpAQCAtMCwwICsxLDE5IEBACisvKgorICogQ292ZXJpdHkgU2NhbiBtb2RlbAorICoKKyAqIFRoaXMgaXMgYSBtb2RlbGluZyBmaWxlIGZvciBDb3Zlcml0eSBTY2FuLiBNb2RlbGluZyBoZWxwcyB0byBhdm9pZCBmYWxzZQorICogcG9zaXRpdmVzLgorICoKKyAqIC0gQSBtb2RlbCBmaWxlIGNhbid0IGltcG9ydCBhbnkgaGVhZGVyIGZpbGVzLgorICogLSBUaGVyZWZvcmUgb25seSBzb21lIGJ1aWx0LWluIHByaW1pdGl2ZXMgbGlrZSBpbnQsIGNoYXIgYW5kIHZvaWQgYXJlCisgKiAgIGF2YWlsYWJsZSBidXQgbm90IHdjaGFyX3QsIE5VTEwgZXRjLgorICogLSBNb2RlbGluZyBkb2Vzbid0IG5lZWQgZnVsbCBzdHJ1Y3RzIGFuZCB0eXBlZGVmcy4gUnVkaW1lbnRhcnkgc3RydWN0cworICogICBhbmQgc2ltaWxhciB0eXBlcyBhcmUgc3VmZmljaWVudC4KKyAqIC0gQW4gdW5pbml0aWFsaXplZCBsb2NhbCBwb2ludGVyIGlzIG5vdCBhbiBlcnJvci4gSXQgc2lnbmlmaWVzIHRoYXQgdGhlCisgKiAgIHZhcmlhYmxlIGNvdWxkIGJlIGVpdGhlciBOVUxMIG9yIGhhdmUgc29tZSBkYXRhLgorICoKKyAqIENvdmVyaXR5IFNjYW4gZG9lc24ndCBwaWNrIHVwIG1vZGlmaWNhdGlvbnMgYXV0b21hdGljYWxseS4gVGhlIG1vZGVsIGZpbGUKKyAqIG11c3QgYmUgdXBsb2FkZWQgYnkgYW4gYWRtaW4uCisgKi8KKworCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9saWIvZG5ldF9udG9wLmMgYi9pcHJvdXRlMi9saWIvZG5ldF9udG9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA3YTdlYgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2xpYi9kbmV0X250b3AuYwpAQCAtMCwwICsxLDEwMiBAQAorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKworc3RhdGljIF9faW5saW5lX18gdV9pbnQxNl90IGRuX250b2hzKHVfaW50MTZfdCBhZGRyKQoreworCXVuaW9uIHsKKwkJdV9pbnQ4X3QgYnl0ZVsyXTsKKwkJdV9pbnQxNl90IHdvcmQ7CisJfSB1OworCisJdS53b3JkID0gYWRkcjsKKwlyZXR1cm4gKCh1X2ludDE2X3QpdS5ieXRlWzBdKSB8ICgoKHVfaW50MTZfdCl1LmJ5dGVbMV0pIDw8IDgpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgZG9fZGlnaXQoY2hhciAqc3RyLCB1X2ludDE2X3QgKmFkZHIsIHVfaW50MTZfdCBzY2FsZSwgc2l6ZV90ICpwb3MsIHNpemVfdCBsZW4sIGludCAqc3RhcnRlZCkKK3sKKwl1X2ludDE2X3QgdG1wID0gKmFkZHIgLyBzY2FsZTsKKworCWlmICgqcG9zID09IGxlbikKKwkJcmV0dXJuIDE7CisKKwlpZiAoKCh0bXApID4gMCkgfHwgKnN0YXJ0ZWQgfHwgKHNjYWxlID09IDEpKSB7CisJCSpzdHIgPSB0bXAgKyAnMCc7CisJCSpzdGFydGVkID0gMTsKKwkJKCpwb3MpKys7CisJCSphZGRyIC09ICh0bXAgKiBzY2FsZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKmRuZXRfbnRvcDEoY29uc3Qgc3RydWN0IGRuX25hZGRyICpkbmEsIGNoYXIgKnN0ciwgc2l6ZV90IGxlbikKK3sKKwl1X2ludDE2X3QgYWRkciwgYXJlYTsKKwlzaXplX3QgcG9zID0gMDsKKwlpbnQgc3RhcnRlZCA9IDA7CisKKwltZW1jcHkoJmFkZHIsIGRuYS0+YV9hZGRyLCBzaXplb2YoYWRkcikpOworCWFkZHIgPSBkbl9udG9ocyhhZGRyKTsKKwlhcmVhID0gYWRkciA+PiAxMDsKKworCWlmIChkbmEtPmFfbGVuICE9IDIpCisJCXJldHVybiBOVUxMOworCisJYWRkciAmPSAweDAzZmY7CisKKwlpZiAobGVuID09IDApCisJCXJldHVybiBzdHI7CisKKwlpZiAoZG9fZGlnaXQoc3RyICsgcG9zLCAmYXJlYSwgMTAsICZwb3MsIGxlbiwgJnN0YXJ0ZWQpKQorCQlyZXR1cm4gc3RyOworCisJaWYgKGRvX2RpZ2l0KHN0ciArIHBvcywgJmFyZWEsIDEsICZwb3MsIGxlbiwgJnN0YXJ0ZWQpKQorCQlyZXR1cm4gc3RyOworCisJaWYgKHBvcyA9PSBsZW4pCisJCXJldHVybiBzdHI7CisKKwkqKHN0ciArIHBvcykgPSAnLic7CisJcG9zKys7CisJc3RhcnRlZCA9IDA7CisKKwlpZiAoZG9fZGlnaXQoc3RyICsgcG9zLCAmYWRkciwgMTAwMCwgJnBvcywgbGVuLCAmc3RhcnRlZCkpCisJCXJldHVybiBzdHI7CisKKwlpZiAoZG9fZGlnaXQoc3RyICsgcG9zLCAmYWRkciwgMTAwLCAmcG9zLCBsZW4sICZzdGFydGVkKSkKKwkJcmV0dXJuIHN0cjsKKworCWlmIChkb19kaWdpdChzdHIgKyBwb3MsICZhZGRyLCAxMCwgJnBvcywgbGVuLCAmc3RhcnRlZCkpCisJCXJldHVybiBzdHI7CisKKwlpZiAoZG9fZGlnaXQoc3RyICsgcG9zLCAmYWRkciwgMSwgJnBvcywgbGVuLCAmc3RhcnRlZCkpCisJCXJldHVybiBzdHI7CisKKwlpZiAocG9zID09IGxlbikKKwkJcmV0dXJuIHN0cjsKKworCSooc3RyICsgcG9zKSA9IDA7CisKKwlyZXR1cm4gc3RyOworfQorCisKK2NvbnN0IGNoYXIgKmRuZXRfbnRvcChpbnQgYWYsIGNvbnN0IHZvaWQgKmFkZHIsIGNoYXIgKnN0ciwgc2l6ZV90IGxlbikKK3sKKwlzd2l0Y2goYWYpIHsKKwkJY2FzZSBBRl9ERUNuZXQ6CisJCQllcnJubyA9IDA7CisJCQlyZXR1cm4gZG5ldF9udG9wMSgoc3RydWN0IGRuX25hZGRyICopYWRkciwgc3RyLCBsZW4pOworCQlkZWZhdWx0OgorCQkJZXJybm8gPSBFQUZOT1NVUFBPUlQ7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbGliL2RuZXRfcHRvbi5jIGIvaXByb3V0ZTIvbGliL2RuZXRfcHRvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczODU3NTYKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9saWIvZG5ldF9wdG9uLmMKQEAgLTAsMCArMSw3NCBAQAorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKworc3RhdGljIF9faW5saW5lX18gdV9pbnQxNl90IGRuX2h0b25zKHVfaW50MTZfdCBhZGRyKQoreworICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICAgICAgdV9pbnQ4X3QgYnl0ZVsyXTsKKyAgICAgICAgICAgICAgICB1X2ludDE2X3Qgd29yZDsKKyAgICAgICAgfSB1OworCisgICAgICAgIHUud29yZCA9IGFkZHI7CisgICAgICAgIHJldHVybiAoKHVfaW50MTZfdCl1LmJ5dGVbMF0pIHwgKCgodV9pbnQxNl90KXUuYnl0ZVsxXSkgPDwgOCk7Cit9CisKKworc3RhdGljIGludCBkbmV0X251bShjb25zdCBjaGFyICpzcmMsIHVfaW50MTZfdCAqIGRzdCkKK3sKKwlpbnQgcnYgPSAwOworCWludCB0bXA7CisJKmRzdCA9IDA7CisKKwl3aGlsZSAoKHRtcCA9ICpzcmMrKykgIT0gMCkgeworCQl0bXAgLT0gJzAnOworCQlpZiAoKHRtcCA8IDApIHx8ICh0bXAgPiA5KSkKKwkJCXJldHVybiBydjsKKworCQlydisrOworCQkoKmRzdCkgKj0gMTA7CisJCSgqZHN0KSArPSB0bXA7CisJfQorCisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgaW50IGRuZXRfcHRvbjEoY29uc3QgY2hhciAqc3JjLCBzdHJ1Y3QgZG5fbmFkZHIgKmRuYSkKK3sKKwl1X2ludDE2X3QgYWRkcjsKKwl1X2ludDE2X3QgYXJlYSA9IDA7CisJdV9pbnQxNl90IG5vZGUgPSAwOworCWludCBwb3M7CisKKwlwb3MgPSBkbmV0X251bShzcmMsICZhcmVhKTsKKwlpZiAoKHBvcyA9PSAwKSB8fCAoYXJlYSA+IDYzKSB8fCAoKihzcmMgKyBwb3MpICE9ICcuJykpCisJCXJldHVybiAwOworCXBvcyA9IGRuZXRfbnVtKHNyYyArIHBvcyArIDEsICZub2RlKTsKKwlpZiAoKHBvcyA9PSAwKSB8fCAobm9kZSA+IDEwMjMpKQorCQlyZXR1cm4gMDsKKwlkbmEtPmFfbGVuID0gMjsKKwlhZGRyID0gZG5faHRvbnMoKGFyZWEgPDwgMTApIHwgbm9kZSk7CisJbWVtY3B5KGRuYS0+YV9hZGRyLCAmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKworCXJldHVybiAxOworfQorCitpbnQgZG5ldF9wdG9uKGludCBhZiwgY29uc3QgY2hhciAqc3JjLCB2b2lkICphZGRyKQoreworCWludCBlcnI7CisKKwlzd2l0Y2ggKGFmKSB7CisJY2FzZSBBRl9ERUNuZXQ6CisJCWVycm5vID0gMDsKKwkJZXJyID0gZG5ldF9wdG9uMShzcmMsIChzdHJ1Y3QgZG5fbmFkZHIgKilhZGRyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJybm8gPSBFQUZOT1NVUFBPUlQ7CisJCWVyciA9IC0xOworCX0KKworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9saWIvaW5ldF9wcm90by5jIGIvaXByb3V0ZTIvbGliL2luZXRfcHJvdG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2E4MzUxCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbGliL2luZXRfcHJvdG8uYwpAQCAtMCwwICsxLDcxIEBACisvKgorICogaW5ldF9wcm90by5jCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInJ0X25hbWVzLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKworY29uc3QgY2hhciAqaW5ldF9wcm90b19uMmEoaW50IHByb3RvLCBjaGFyICpidWYsIGludCBsZW4pCit7CisJc3RhdGljIGNoYXIgbmNhY2hlWzE2XTsKKwlzdGF0aWMgaW50IGljYWNoZSA9IC0xOworCXN0cnVjdCBwcm90b2VudCAqcGU7CisKKwlpZiAocHJvdG8gPT0gaWNhY2hlKQorCQlyZXR1cm4gbmNhY2hlOworCisJcGUgPSBnZXRwcm90b2J5bnVtYmVyKHByb3RvKTsKKwlpZiAocGUpIHsKKwkJaWNhY2hlID0gcHJvdG87CisJCXN0cm5jcHkobmNhY2hlLCBwZS0+cF9uYW1lLCAxNik7CisJCXN0cm5jcHkoYnVmLCBwZS0+cF9uYW1lLCBsZW4pOworCQlyZXR1cm4gYnVmOworCX0KKwlzbnByaW50ZihidWYsIGxlbiwgImlwcHJvdG8tJWQiLCBwcm90byk7CisJcmV0dXJuIGJ1ZjsKK30KKworaW50IGluZXRfcHJvdG9fYTJuKGNvbnN0IGNoYXIgKmJ1ZikKK3sKKwlzdGF0aWMgY2hhciBuY2FjaGVbMTZdOworCXN0YXRpYyBpbnQgaWNhY2hlID0gLTE7CisJc3RydWN0IHByb3RvZW50ICpwZTsKKworCWlmIChpY2FjaGU+PTAgJiYgc3RyY21wKG5jYWNoZSwgYnVmKSA9PSAwKQorCQlyZXR1cm4gaWNhY2hlOworCisJaWYgKGJ1ZlswXSA+PSAnMCcgJiYgYnVmWzBdIDw9ICc5JykgeworCQlfX3U4IHJldDsKKwkJaWYgKGdldF91OCgmcmV0LCBidWYsIDEwKSkKKwkJCXJldHVybiAtMTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwZSA9IGdldHByb3RvYnluYW1lKGJ1Zik7CisJaWYgKHBlKSB7CisJCWljYWNoZSA9IHBlLT5wX3Byb3RvOworCQlzdHJuY3B5KG5jYWNoZSwgcGUtPnBfbmFtZSwgMTYpOworCQlyZXR1cm4gcGUtPnBfcHJvdG87CisJfQorCXJldHVybiAtMTsKK30KKworCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9saWIvaXB4X250b3AuYyBiL2lwcm91dGUyL2xpYi9pcHhfbnRvcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNDZiYzIKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9saWIvaXB4X250b3AuYwpAQCAtMCwwICsxLDcyIEBACisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKworc3RhdGljIF9faW5saW5lX18gaW50IGRvX2RpZ2l0KGNoYXIgKnN0ciwgdV9pbnQzMl90IGFkZHIsIHVfaW50MzJfdCBzY2FsZSwgc2l6ZV90ICpwb3MsIHNpemVfdCBsZW4pCit7CisJdV9pbnQzMl90IHRtcCA9IGFkZHIgPj4gKHNjYWxlICogNCk7CisKKwlpZiAoKnBvcyA9PSBsZW4pCisJCXJldHVybiAxOworCisJdG1wICY9IDB4MGY7CisJaWYgKHRtcCA+IDkpCisJCSpzdHIgPSB0bXAgKyAnQScgLSAxMDsKKwllbHNlCisJCSpzdHIgPSB0bXAgKyAnMCc7CisJKCpwb3MpKys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmlweF9udG9wMShjb25zdCBzdHJ1Y3QgaXB4X2FkZHIgKmFkZHIsIGNoYXIgKnN0ciwgc2l6ZV90IGxlbikKK3sKKwlpbnQgaTsKKwlzaXplX3QgcG9zID0gMDsKKworCWlmIChsZW4gPT0gMCkKKwkJcmV0dXJuIHN0cjsKKworCWZvcihpID0gNzsgaSA+PSAwOyBpLS0pCisJCWlmIChkb19kaWdpdChzdHIgKyBwb3MsIG50b2hsKGFkZHItPmlweF9uZXQpLCBpLCAmcG9zLCBsZW4pKQorCQkJcmV0dXJuIHN0cjsKKworCWlmIChwb3MgPT0gbGVuKQorCQlyZXR1cm4gc3RyOworCisJKihzdHIgKyBwb3MpID0gJy4nOworCXBvcysrOworCisJZm9yKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCWlmIChkb19kaWdpdChzdHIgKyBwb3MsIGFkZHItPmlweF9ub2RlW2ldLCAxLCAmcG9zLCBsZW4pKQorCQkJcmV0dXJuIHN0cjsKKwkJaWYgKGRvX2RpZ2l0KHN0ciArIHBvcywgYWRkci0+aXB4X25vZGVbaV0sIDAsICZwb3MsIGxlbikpCisJCQlyZXR1cm4gc3RyOworCX0KKworCWlmIChwb3MgPT0gbGVuKQorCQlyZXR1cm4gc3RyOworCisJKihzdHIgKyBwb3MpID0gMDsKKworCXJldHVybiBzdHI7Cit9CisKKworY29uc3QgY2hhciAqaXB4X250b3AoaW50IGFmLCBjb25zdCB2b2lkICphZGRyLCBjaGFyICpzdHIsIHNpemVfdCBsZW4pCit7CisJc3dpdGNoKGFmKSB7CisJCWNhc2UgQUZfSVBYOgorCQkJZXJybm8gPSAwOworCQkJcmV0dXJuIGlweF9udG9wMSgoc3RydWN0IGlweF9hZGRyICopYWRkciwgc3RyLCBsZW4pOworCQlkZWZhdWx0OgorCQkJZXJybm8gPSBFQUZOT1NVUFBPUlQ7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbGliL2lweF9wdG9uLmMgYi9pcHJvdXRlMi9saWIvaXB4X3B0b24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGNhMjcxCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbGliL2lweF9wdG9uLmMKQEAgLTAsMCArMSwxMDggQEAKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorCitzdGF0aWMgdV9pbnQzMl90IGhleGdldChjaGFyIGMpCit7CisJaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKQorCQlyZXR1cm4gYyAtICdBJyArIDEwOworCWlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKKwkJcmV0dXJuIGMgLSAnYScgKyAxMDsKKwlpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisJCXJldHVybiBjIC0gJzAnOworCisJcmV0dXJuIDB4ZjA7Cit9CisKK3N0YXRpYyBpbnQgaXB4X2dldG5ldCh1X2ludDMyX3QgKm5ldCwgY29uc3QgY2hhciAqc3RyKQoreworCWludCBpOworCXVfaW50MzJfdCB0bXA7CisKKwlmb3IoaSA9IDA7ICpzdHIgJiYgKGkgPCA4KTsgaSsrKSB7CisKKwkJaWYgKCh0bXAgPSBoZXhnZXQoKnN0cikpICYgMHhmMCkgeworCQkJaWYgKCpzdHIgPT0gJy4nKQorCQkJCXJldHVybiAwOworCQkJZWxzZQorCQkJCXJldHVybiAtMTsKKwkJfQorCisJCXN0cisrOworCQkoKm5ldCkgPDw9IDQ7CisJCSgqbmV0KSB8PSB0bXA7CisJfQorCisJaWYgKCpzdHIgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgaXB4X2dldG5vZGUodV9pbnQ4X3QgKm5vZGUsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpbnQgaTsKKwl1X2ludDMyX3QgdG1wOworCisJZm9yKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCWlmICgodG1wID0gaGV4Z2V0KCpzdHIrKykpICYgMHhmMCkKKwkJCXJldHVybiAtMTsKKwkJbm9kZVtpXSA9ICh1X2ludDhfdCl0bXA7CisJCW5vZGVbaV0gPDw9IDQ7CisJCWlmICgodG1wID0gaGV4Z2V0KCpzdHIrKykpICYgMHhmMCkKKwkJCXJldHVybiAtMTsKKwkJbm9kZVtpXSB8PSAodV9pbnQ4X3QpdG1wOworCQlpZiAoKnN0ciA9PSAnOicpCisJCQlzdHIrKzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHhfcHRvbjEoY29uc3QgY2hhciAqc3JjLCBzdHJ1Y3QgaXB4X2FkZHIgKmFkZHIpCit7CisJY2hhciAqc2VwID0gKGNoYXIgKilzcmM7CisJaW50IG5vX25vZGUgPSAwOworCisJbWVtc2V0KGFkZHIsIDAsIHNpemVvZihzdHJ1Y3QgaXB4X2FkZHIpKTsKKworCXdoaWxlKCpzZXAgJiYgKCpzZXAgIT0gJy4nKSkKKwkJc2VwKys7CisKKwlpZiAoKnNlcCAhPSAnLicpCisJCW5vX25vZGUgPSAxOworCisJaWYgKGlweF9nZXRuZXQoJmFkZHItPmlweF9uZXQsIHNyYykpCisJCXJldHVybiAwOworCisJYWRkci0+aXB4X25ldCA9IGh0b25sKGFkZHItPmlweF9uZXQpOworCisJaWYgKG5vX25vZGUpCisJCXJldHVybiAxOworCisJaWYgKGlweF9nZXRub2RlKGFkZHItPmlweF9ub2RlLCBzZXAgKyAxKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGlweF9wdG9uKGludCBhZiwgY29uc3QgY2hhciAqc3JjLCB2b2lkICphZGRyKQoreworCWludCBlcnI7CisKKwlzd2l0Y2ggKGFmKSB7CisJY2FzZSBBRl9JUFg6CisJCWVycm5vID0gMDsKKwkJZXJyID0gaXB4X3B0b24xKHNyYywgKHN0cnVjdCBpcHhfYWRkciAqKWFkZHIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnJubyA9IEVBRk5PU1VQUE9SVDsKKwkJZXJyID0gLTE7CisJfQorCisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2xpYi9qc29uX3dyaXRlci5jIGIvaXByb3V0ZTIvbGliL2pzb25fd3JpdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFmMTZlMQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2xpYi9qc29uX3dyaXRlci5jCkBAIC0wLDAgKzEsMzEyIEBACisvKgorICogU2ltcGxlIHN0cmVhbWluZyBKU09OIHdyaXRlcgorICoKKyAqIFRoaXMgdGFrZXMgY2FyZSBvZiB0aGUgYW5ub3lpbmcgYml0cyBvZiBKU09OIHN5bnRheCBsaWtlIHRoZSBjb21tYXMKKyAqIGFmdGVyIGVsZW1lbnRzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglTdGVwaGVuIEhlbW1pbmdlciA8c3RlcGhlbkBuZXR3b3JrcGx1bWJlci5vcmc+CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJqc29uX3dyaXRlci5oIgorCitzdHJ1Y3QganNvbl93cml0ZXIgeworCUZJTEUJCSpvdXQ7CS8qIG91dHB1dCBmaWxlICovCisJdW5zaWduZWQJZGVwdGg7ICAvKiBuZXN0aW5nICovCisJYm9vbAkJcHJldHR5OyAvKiBvcHRpb25hbCB3aGl0ZXBhY2UgKi8KKwljaGFyCQlzZXA7CS8qIGVpdGhlciBudWwgb3IgY29tbWEgKi8KK307CisKKy8qIGluZGVudGF0aW9uIGZvciBwcmV0dHkgcHJpbnQgKi8KK3N0YXRpYyB2b2lkIGpzb253X2luZGVudChqc29uX3dyaXRlcl90ICpzZWxmKQoreworCXVuc2lnbmVkIGk7CisJZm9yIChpID0gMDsgaSA8PSBzZWxmLT5kZXB0aDsgKytpKQorCQlmcHV0cygiICAgICIsIHNlbGYtPm91dCk7Cit9CisKKy8qIGVuZCBjdXJyZW50IGxpbmUgYW5kIGluZGVudCBpZiBwcmV0dHkgcHJpbnRpbmcgKi8KK3N0YXRpYyB2b2lkIGpzb253X2VvbChqc29uX3dyaXRlcl90ICpzZWxmKQoreworCWlmICghc2VsZi0+cHJldHR5KQorCQlyZXR1cm47CisKKwlwdXRjKCdcbicsIHNlbGYtPm91dCk7CisJanNvbndfaW5kZW50KHNlbGYpOworfQorCisvKiBJZiBjdXJyZW50IG9iamVjdCBpcyBub3QgZW1wdHkgcHJpbnQgYSBjb21tYSAqLworc3RhdGljIHZvaWQganNvbndfZW9yKGpzb25fd3JpdGVyX3QgKnNlbGYpCit7CisJaWYgKHNlbGYtPnNlcCAhPSAnXDAnKQorCQlwdXRjKHNlbGYtPnNlcCwgc2VsZi0+b3V0KTsKKwlzZWxmLT5zZXAgPSAnLCc7Cit9CisKKworLyogT3V0cHV0IEpTT04gZW5jb2RlZCBzdHJpbmcgKi8KKy8qIEhhbmRsZXMgQyBlc2NhcGVzLCBkb2VzIG5vdCBkbyBVbmljb2RlICovCitzdGF0aWMgdm9pZCBqc29ud19wdXRzKGpzb25fd3JpdGVyX3QgKnNlbGYsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlwdXRjKCciJywgc2VsZi0+b3V0KTsKKwlmb3IgKDsgKnN0cjsgKytzdHIpCisJCXN3aXRjaCAoKnN0cikgeworCQljYXNlICdcdCc6CisJCQlmcHV0cygiXFx0Iiwgc2VsZi0+b3V0KTsKKwkJCWJyZWFrOworCQljYXNlICdcbic6CisJCQlmcHV0cygiXFxuIiwgc2VsZi0+b3V0KTsKKwkJCWJyZWFrOworCQljYXNlICdccic6CisJCQlmcHV0cygiXFxyIiwgc2VsZi0+b3V0KTsKKwkJCWJyZWFrOworCQljYXNlICdcZic6CisJCQlmcHV0cygiXFxmIiwgc2VsZi0+b3V0KTsKKwkJCWJyZWFrOworCQljYXNlICdcYic6CisJCQlmcHV0cygiXFxiIiwgc2VsZi0+b3V0KTsKKwkJCWJyZWFrOworCQljYXNlICdcXCc6CisJCQlmcHV0cygiXFxuIiwgc2VsZi0+b3V0KTsKKwkJCWJyZWFrOworCQljYXNlICciJzoKKwkJCWZwdXRzKCJcXFwiIiwgc2VsZi0+b3V0KTsKKwkJCWJyZWFrOworCQljYXNlICdcJyc6CisJCQlmcHV0cygiXFxcJyIsIHNlbGYtPm91dCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXB1dGMoKnN0ciwgc2VsZi0+b3V0KTsKKwkJfQorCXB1dGMoJyInLCBzZWxmLT5vdXQpOworfQorCisvKiBDcmVhdGUgYSBuZXcgSlNPTiBzdHJlYW0gKi8KK2pzb25fd3JpdGVyX3QgKmpzb253X25ldyhGSUxFICpmKQoreworCWpzb25fd3JpdGVyX3QgKnNlbGYgPSBtYWxsb2Moc2l6ZW9mKCpzZWxmKSk7CisJaWYgKHNlbGYpIHsKKwkJc2VsZi0+b3V0ID0gZjsKKwkJc2VsZi0+ZGVwdGggPSAwOworCQlzZWxmLT5wcmV0dHkgPSBmYWxzZTsKKwkJc2VsZi0+c2VwID0gJ1wwJzsKKwkJcHV0YygneycsIHNlbGYtPm91dCk7CisJfQorCXJldHVybiBzZWxmOworfQorCisvKiBFbmQgb3V0cHV0IHRvIEpTT04gc3RyZWFtICovCit2b2lkIGpzb253X2Rlc3Ryb3koanNvbl93cml0ZXJfdCAqKnNlbGZfcCkKK3sKKwlqc29uX3dyaXRlcl90ICpzZWxmID0gKnNlbGZfcDsKKworCWFzc2VydChzZWxmLT5kZXB0aCA9PSAwKTsKKwlqc29ud19lb2woc2VsZik7CisJZnB1dHMoIn1cbiIsIHNlbGYtPm91dCk7CisJZmZsdXNoKHNlbGYtPm91dCk7CisJZnJlZShzZWxmKTsKKwkqc2VsZl9wID0gTlVMTDsKK30KKwordm9pZCBqc29ud19wcmV0dHkoanNvbl93cml0ZXJfdCAqc2VsZiwgYm9vbCBvbikKK3sKKwlzZWxmLT5wcmV0dHkgPSBvbjsKK30KKworLyogQmFzaWMgYmxvY2tzICovCitzdGF0aWMgdm9pZCBqc29ud19iZWdpbihqc29uX3dyaXRlcl90ICpzZWxmLCBpbnQgYykKK3sKKwlqc29ud19lb3Ioc2VsZik7CisJcHV0YyhjLCBzZWxmLT5vdXQpOworCSsrc2VsZi0+ZGVwdGg7CisJc2VsZi0+c2VwID0gJ1wwJzsKK30KKworc3RhdGljIHZvaWQganNvbndfZW5kKGpzb25fd3JpdGVyX3QgKnNlbGYsIGludCBjKQoreworCWFzc2VydChzZWxmLT5kZXB0aCA+IDApOworCisJLS1zZWxmLT5kZXB0aDsKKwlpZiAoc2VsZi0+c2VwICE9ICdcMCcpCisJCWpzb253X2VvbChzZWxmKTsKKwlwdXRjKGMsIHNlbGYtPm91dCk7CisJc2VsZi0+c2VwID0gJywnOworfQorCisKKy8qIEFkZCBhIEpTT04gcHJvcGVydHkgbmFtZSAqLwordm9pZCBqc29ud19uYW1lKGpzb25fd3JpdGVyX3QgKnNlbGYsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJanNvbndfZW9yKHNlbGYpOworCWpzb253X2VvbChzZWxmKTsKKwlzZWxmLT5zZXAgPSAnXDAnOworCWpzb253X3B1dHMoc2VsZiwgbmFtZSk7CisJcHV0YygnOicsIHNlbGYtPm91dCk7CisJaWYgKHNlbGYtPnByZXR0eSkKKwkJcHV0YygnICcsIHNlbGYtPm91dCk7Cit9CisKK3N0YXRpYyB2b2lkIGpzb253X3ByaW50Zihqc29uX3dyaXRlcl90ICpzZWxmLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJanNvbndfZW9yKHNlbGYpOworCXZmcHJpbnRmKHNlbGYtPm91dCwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKK30KKworLyogQ29sbGVjdGlvbnMgKi8KK3ZvaWQganNvbndfc3RhcnRfb2JqZWN0KGpzb25fd3JpdGVyX3QgKnNlbGYpCit7CisJanNvbndfYmVnaW4oc2VsZiwgJ3snKTsKK30KKwordm9pZCBqc29ud19lbmRfb2JqZWN0KGpzb25fd3JpdGVyX3QgKnNlbGYpCit7CisJanNvbndfZW5kKHNlbGYsICd9Jyk7Cit9CisKK3ZvaWQganNvbndfc3RhcnRfYXJyYXkoanNvbl93cml0ZXJfdCAqc2VsZikKK3sKKwlqc29ud19iZWdpbihzZWxmLCAnWycpOworfQorCit2b2lkIGpzb253X2VuZF9hcnJheShqc29uX3dyaXRlcl90ICpzZWxmKQoreworCWpzb253X2VuZChzZWxmLCAnXScpOworfQorCisvKiBKU09OIHZhbHVlIHR5cGVzICovCit2b2lkIGpzb253X3N0cmluZyhqc29uX3dyaXRlcl90ICpzZWxmLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlqc29ud19lb3Ioc2VsZik7CisJanNvbndfcHV0cyhzZWxmLCB2YWx1ZSk7Cit9CisKK3ZvaWQganNvbndfYm9vbChqc29uX3dyaXRlcl90ICpzZWxmLCBib29sIHZhbCkKK3sKKwlqc29ud19wcmludGYoc2VsZiwgIiVzIiwgdmFsID8gInRydWUiIDogImZhbHNlIik7Cit9CisKKyNpZmRlZiBub3R1c2VkCit2b2lkIGpzb253X251bGwoanNvbl93cml0ZXJfdCAqc2VsZikKK3sKKwlqc29ud19wcmludGYoc2VsZiwgIm51bGwiKTsKK30KKwordm9pZCBqc29ud19mbG9hdChqc29uX3dyaXRlcl90ICpzZWxmLCBkb3VibGUgbnVtKQoreworCWpzb253X3ByaW50ZihzZWxmLCAiJWciLCBudW0pOworfQorI2VuZGlmCisKK3ZvaWQganNvbndfdWludChqc29uX3dyaXRlcl90ICpzZWxmLCB1aW50NjRfdCBudW0pCit7CisJanNvbndfcHJpbnRmKHNlbGYsICIlIlBSSXU2NCwgbnVtKTsKK30KKwordm9pZCBqc29ud19pbnQoanNvbl93cml0ZXJfdCAqc2VsZiwgaW50NjRfdCBudW0pCit7CisJanNvbndfcHJpbnRmKHNlbGYsICIlIlBSSWQ2NCwgbnVtKTsKK30KKworLyogQmFzaWMgbmFtZS92YWx1ZSBvYmplY3RzICovCit2b2lkIGpzb253X3N0cmluZ19maWVsZChqc29uX3dyaXRlcl90ICpzZWxmLCBjb25zdCBjaGFyICpwcm9wLCBjb25zdCBjaGFyICp2YWwpCit7CisJanNvbndfbmFtZShzZWxmLCBwcm9wKTsKKwlqc29ud19zdHJpbmcoc2VsZiwgdmFsKTsKK30KKwordm9pZCBqc29ud19ib29sX2ZpZWxkKGpzb25fd3JpdGVyX3QgKnNlbGYsIGNvbnN0IGNoYXIgKnByb3AsIGJvb2wgdmFsKQoreworCWpzb253X25hbWUoc2VsZiwgcHJvcCk7CisJanNvbndfYm9vbChzZWxmLCB2YWwpOworfQorCisjaWZkZWYgbm90dXNlZAordm9pZCBqc29ud19mbG9hdF9maWVsZChqc29uX3dyaXRlcl90ICpzZWxmLCBjb25zdCBjaGFyICpwcm9wLCBkb3VibGUgdmFsKQoreworCWpzb253X25hbWUoc2VsZiwgcHJvcCk7CisJanNvbndfZmxvYXQoc2VsZiwgdmFsKTsKK30KKyNlbmRpZgorCit2b2lkIGpzb253X3VpbnRfZmllbGQoanNvbl93cml0ZXJfdCAqc2VsZiwgY29uc3QgY2hhciAqcHJvcCwgdWludDY0X3QgbnVtKQoreworCWpzb253X25hbWUoc2VsZiwgcHJvcCk7CisJanNvbndfdWludChzZWxmLCBudW0pOworfQorCit2b2lkIGpzb253X2ludF9maWVsZChqc29uX3dyaXRlcl90ICpzZWxmLCBjb25zdCBjaGFyICpwcm9wLCBpbnQ2NF90IG51bSkKK3sKKwlqc29ud19uYW1lKHNlbGYsIHByb3ApOworCWpzb253X2ludChzZWxmLCBudW0pOworfQorCisjaWZkZWYgbm90dXNlZAordm9pZCBqc29ud19udWxsX2ZpZWxkKGpzb25fd3JpdGVyX3QgKnNlbGYsIGNvbnN0IGNoYXIgKnByb3ApCit7CisJanNvbndfbmFtZShzZWxmLCBwcm9wKTsKKwlqc29ud19udWxsKHNlbGYpOworfQorI2VuZGlmCisKKyNpZmRlZiBURVNUCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJanNvbl93cml0ZXJfdCAqd3IgPSBqc29ud19uZXcoc3Rkb3V0KTsKKworCWpzb253X3ByZXR0eSh3ciwgdHJ1ZSk7CisJanNvbndfbmFtZSh3ciwgIlZ5YXR0YSIpOworCWpzb253X3N0YXJ0X29iamVjdCh3cik7CisJanNvbndfc3RyaW5nX2ZpZWxkKHdyLCAidXJsIiwgImh0dHA6Ly92eWF0dGEuY29tIik7CisJanNvbndfdWludF9maWVsZCh3ciwgImRvd25sb2FkcyIsIDIwMDAwMDB1bCk7CisJanNvbndfZmxvYXRfZmllbGQod3IsICJzdG9jayIsIDguMTYpOworCisJanNvbndfbmFtZSh3ciwgIkFSR1YiKTsKKwlqc29ud19zdGFydF9hcnJheSh3cik7CisJd2hpbGUgKC0tYXJnYykKKwkJanNvbndfc3RyaW5nKHdyLCAqKythcmd2KTsKKwlqc29ud19lbmRfYXJyYXkod3IpOworCisJanNvbndfbmFtZSh3ciwgImVtcHR5Iik7CisJanNvbndfc3RhcnRfYXJyYXkod3IpOworCWpzb253X2VuZF9hcnJheSh3cik7CisKKwlqc29ud19uYW1lKHdyLCAiTklMIik7CisJanNvbndfc3RhcnRfb2JqZWN0KHdyKTsKKwlqc29ud19lbmRfb2JqZWN0KHdyKTsKKworCWpzb253X251bGxfZmllbGQod3IsICJteV9udWxsIik7CisKKwlqc29ud19uYW1lKHdyLCAic3BlY2lhbCBjaGFycyIpOworCWpzb253X3N0YXJ0X2FycmF5KHdyKTsKKwlqc29ud19zdHJpbmdfZmllbGQod3IsICJzbGFzaCIsICIvIik7CisJanNvbndfc3RyaW5nX2ZpZWxkKHdyLCAibmV3bGluZSIsICJcbiIpOworCWpzb253X3N0cmluZ19maWVsZCh3ciwgInRhYiIsICJcdCIpOworCWpzb253X3N0cmluZ19maWVsZCh3ciwgImZmIiwgIlxmIik7CisJanNvbndfc3RyaW5nX2ZpZWxkKHdyLCAicXVvdGUiLCAiXCIiKTsKKwlqc29ud19zdHJpbmdfZmllbGQod3IsICJ0aWNrIiwgIlwnIik7CisJanNvbndfc3RyaW5nX2ZpZWxkKHdyLCAiYmFja3NsYXNoIiwgIlxcIik7CisJanNvbndfZW5kX2FycmF5KHdyKTsKKworCWpzb253X2VuZF9vYmplY3Qod3IpOworCisJanNvbndfZGVzdHJveSgmd3IpOworCXJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2xpYi9saWJnZW5sLmMgYi9pcHJvdXRlMi9saWIvbGliZ2VubC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYjE0NzgKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9saWIvbGliZ2VubC5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBsaWJnZW5sLmMJR0VOTCBsaWJyYXJ5CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxsaW51eC9nZW5ldGxpbmsuaD4KKyNpbmNsdWRlICJsaWJnZW5sLmgiCisKK3N0YXRpYyBpbnQgZ2VubF9wYXJzZV9nZXRmYW1pbHkoc3RydWN0IG5sbXNnaGRyICpubGgpCit7CisJc3RydWN0IHJ0YXR0ciAqdGJbQ1RSTF9BVFRSX01BWCArIDFdOworCXN0cnVjdCBnZW5sbXNnaGRyICpnaGRyID0gTkxNU0dfREFUQShubGgpOworCWludCBsZW4gPSBubGgtPm5sbXNnX2xlbjsKKwlzdHJ1Y3QgcnRhdHRyICphdHRyczsKKworCWlmIChubGgtPm5sbXNnX3R5cGUgIT0gR0VOTF9JRF9DVFJMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm90IGEgY29udHJvbGxlciBtZXNzYWdlLCBubG1zZ19sZW49JWQgIgorCQkJIm5sbXNnX3R5cGU9MHgleFxuIiwgbmxoLT5ubG1zZ19sZW4sIG5saC0+bmxtc2dfdHlwZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlsZW4gLT0gTkxNU0dfTEVOR1RIKEdFTkxfSERSTEVOKTsKKworCWlmIChsZW4gPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAid3JvbmcgY29udHJvbGxlciBtZXNzYWdlIGxlbiAlZFxuIiwgbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChnaGRyLT5jbWQgIT0gQ1RSTF9DTURfTkVXRkFNSUxZKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5rbm93biBjb250cm9sbGVyIGNvbW1hbmQgJWRcbiIsIGdoZHItPmNtZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlhdHRycyA9IChzdHJ1Y3QgcnRhdHRyICopICgoY2hhciAqKSBnaGRyICsgR0VOTF9IRFJMRU4pOworCXBhcnNlX3J0YXR0cih0YiwgQ1RSTF9BVFRSX01BWCwgYXR0cnMsIGxlbik7CisKKwlpZiAodGJbQ1RSTF9BVFRSX0ZBTUlMWV9JRF0gPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgZmFtaWx5IGlkIFRMVlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gcnRhX2dldGF0dHJfdTE2KHRiW0NUUkxfQVRUUl9GQU1JTFlfSURdKTsKK30KKworaW50IGdlbmxfcmVzb2x2ZV9mYW1pbHkoc3RydWN0IHJ0bmxfaGFuZGxlICpncnRoLCBjb25zdCBjaGFyICpmYW1pbHkpCit7CisJR0VOTF9SRVFVRVNUKHJlcSwgMTAyNCwgR0VOTF9JRF9DVFJMLCAwLCAwLCBDVFJMX0NNRF9HRVRGQU1JTFksCisJCSAgICAgTkxNX0ZfUkVRVUVTVCk7CisKKwlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgQ1RSTF9BVFRSX0ZBTUlMWV9OQU1FLAorCQkgIGZhbWlseSwgc3RybGVuKGZhbWlseSkgKyAxKTsKKworCWlmIChydG5sX3RhbGsoZ3J0aCwgJnJlcS5uLCAmcmVxLm4sIHNpemVvZihyZXEpKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJFcnJvciB0YWxraW5nIHRvIHRoZSBrZXJuZWxcbiIpOworCQlyZXR1cm4gLTI7CisJfQorCisJcmV0dXJuIGdlbmxfcGFyc2VfZ2V0ZmFtaWx5KCZyZXEubik7Cit9CisKZGlmZiAtLWdpdCBhL2lwcm91dGUyL2xpYi9saWJuZXRsaW5rLmMgYi9pcHJvdXRlMi9saWIvbGlibmV0bGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YjVmZDMKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9saWIvbGlibmV0bGluay5jCkBAIC0wLDAgKzEsODQwIEBACisvKgorICogbGlibmV0bGluay5jCVJUbmV0bGluayBzZXJ2aWNlIHJvdXRpbmVzLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxuZXQvaWZfYXJwLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisKKyNpbmNsdWRlICJsaWJuZXRsaW5rLmgiCisKKyNpZm5kZWYgU09MX05FVExJTksKKyNkZWZpbmUgU09MX05FVExJTksgMjcwCisjZW5kaWYKKworI2lmbmRlZiBNSU4KKyNkZWZpbmUgTUlOKGEsIGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCisjZW5kaWYKKworaW50IHJjdmJ1ZiA9IDEwMjQgKiAxMDI0OworCit2b2lkIHJ0bmxfY2xvc2Uoc3RydWN0IHJ0bmxfaGFuZGxlICpydGgpCit7CisJaWYgKHJ0aC0+ZmQgPj0gMCkgeworCQljbG9zZShydGgtPmZkKTsKKwkJcnRoLT5mZCA9IC0xOworCX0KK30KKworaW50IHJ0bmxfb3Blbl9ieXByb3RvKHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoLCB1bnNpZ25lZCBzdWJzY3JpcHRpb25zLAorCQkgICAgICBpbnQgcHJvdG9jb2wpCit7CisJc29ja2xlbl90IGFkZHJfbGVuOworCWludCBzbmRidWYgPSAzMjc2ODsKKworCW1lbXNldChydGgsIDAsIHNpemVvZigqcnRoKSk7CisKKwlydGgtPnByb3RvID0gcHJvdG9jb2w7CisJcnRoLT5mZCA9IHNvY2tldChBRl9ORVRMSU5LLCBTT0NLX1JBVyB8IFNPQ0tfQ0xPRVhFQywgcHJvdG9jb2wpOworCWlmIChydGgtPmZkIDwgMCkgeworCQlwZXJyb3IoIkNhbm5vdCBvcGVuIG5ldGxpbmsgc29ja2V0Iik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoc2V0c29ja29wdChydGgtPmZkLFNPTF9TT0NLRVQsU09fU05EQlVGLCZzbmRidWYsc2l6ZW9mKHNuZGJ1ZikpIDwgMCkgeworCQlwZXJyb3IoIlNPX1NOREJVRiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHNldHNvY2tvcHQocnRoLT5mZCxTT0xfU09DS0VULFNPX1JDVkJVRiwmcmN2YnVmLHNpemVvZihyY3ZidWYpKSA8IDApIHsKKwkJcGVycm9yKCJTT19SQ1ZCVUYiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW1lbXNldCgmcnRoLT5sb2NhbCwgMCwgc2l6ZW9mKHJ0aC0+bG9jYWwpKTsKKwlydGgtPmxvY2FsLm5sX2ZhbWlseSA9IEFGX05FVExJTks7CisJcnRoLT5sb2NhbC5ubF9ncm91cHMgPSBzdWJzY3JpcHRpb25zOworCisJaWYgKGJpbmQocnRoLT5mZCwgKHN0cnVjdCBzb2NrYWRkciopJnJ0aC0+bG9jYWwsIHNpemVvZihydGgtPmxvY2FsKSkgPCAwKSB7CisJCXBlcnJvcigiQ2Fubm90IGJpbmQgbmV0bGluayBzb2NrZXQiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlhZGRyX2xlbiA9IHNpemVvZihydGgtPmxvY2FsKTsKKwlpZiAoZ2V0c29ja25hbWUocnRoLT5mZCwgKHN0cnVjdCBzb2NrYWRkciopJnJ0aC0+bG9jYWwsICZhZGRyX2xlbikgPCAwKSB7CisJCXBlcnJvcigiQ2Fubm90IGdldHNvY2tuYW1lIik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKGFkZHJfbGVuICE9IHNpemVvZihydGgtPmxvY2FsKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIldyb25nIGFkZHJlc3MgbGVuZ3RoICVkXG4iLCBhZGRyX2xlbik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHJ0aC0+bG9jYWwubmxfZmFtaWx5ICE9IEFGX05FVExJTkspIHsKKwkJZnByaW50ZihzdGRlcnIsICJXcm9uZyBhZGRyZXNzIGZhbWlseSAlZFxuIiwgcnRoLT5sb2NhbC5ubF9mYW1pbHkpOworCQlyZXR1cm4gLTE7CisJfQorCXJ0aC0+c2VxID0gdGltZShOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0bmxfb3BlbihzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0aCwgdW5zaWduZWQgc3Vic2NyaXB0aW9ucykKK3sKKwlyZXR1cm4gcnRubF9vcGVuX2J5cHJvdG8ocnRoLCBzdWJzY3JpcHRpb25zLCBORVRMSU5LX1JPVVRFKTsKK30KKworaW50IHJ0bmxfd2lsZGR1bXBfcmVxdWVzdChzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0aCwgaW50IGZhbWlseSwgaW50IHR5cGUpCit7CisJcmV0dXJuIHJ0bmxfd2lsZGR1bXBfcmVxX2ZpbHRlcihydGgsIGZhbWlseSwgdHlwZSwgUlRFWFRfRklMVEVSX1ZGKTsKK30KKworaW50IHJ0bmxfd2lsZGR1bXBfcmVxX2ZpbHRlcihzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0aCwgaW50IGZhbWlseSwgaW50IHR5cGUsCisJCQkgICAgX191MzIgZmlsdF9tYXNrKQoreworCXN0cnVjdCB7CisJCXN0cnVjdCBubG1zZ2hkciBubGg7CisJCXN0cnVjdCBpZmluZm9tc2cgaWZtOworCQkvKiBhdHRyaWJ1dGUgaGFzIHRvIGJlIE5MTVNHIGFsaWduZWQgKi8KKwkJc3RydWN0IHJ0YXR0ciBleHRfcmVxIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKE5MTVNHX0FMSUdOVE8pKSk7CisJCV9fdTMyIGV4dF9maWx0ZXJfbWFzazsKKwl9IHJlcTsKKworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisJcmVxLm5saC5ubG1zZ19sZW4gPSBzaXplb2YocmVxKTsKKwlyZXEubmxoLm5sbXNnX3R5cGUgPSB0eXBlOworCXJlcS5ubGgubmxtc2dfZmxhZ3MgPSBOTE1fRl9EVU1QfE5MTV9GX1JFUVVFU1Q7CisJcmVxLm5saC5ubG1zZ19waWQgPSAwOworCXJlcS5ubGgubmxtc2dfc2VxID0gcnRoLT5kdW1wID0gKytydGgtPnNlcTsKKwlyZXEuaWZtLmlmaV9mYW1pbHkgPSBmYW1pbHk7CisKKwlyZXEuZXh0X3JlcS5ydGFfdHlwZSA9IElGTEFfRVhUX01BU0s7CisJcmVxLmV4dF9yZXEucnRhX2xlbiA9IFJUQV9MRU5HVEgoc2l6ZW9mKF9fdTMyKSk7CisJcmVxLmV4dF9maWx0ZXJfbWFzayA9IGZpbHRfbWFzazsKKworCXJldHVybiBzZW5kKHJ0aC0+ZmQsICh2b2lkKikmcmVxLCBzaXplb2YocmVxKSwgMCk7Cit9CisKK2ludCBydG5sX3NlbmQoc3RydWN0IHJ0bmxfaGFuZGxlICpydGgsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKwlyZXR1cm4gc2VuZChydGgtPmZkLCBidWYsIGxlbiwgMCk7Cit9CisKK2ludCBydG5sX3NlbmRfY2hlY2soc3RydWN0IHJ0bmxfaGFuZGxlICpydGgsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgbmxtc2doZHIgKmg7CisJaW50IHN0YXR1czsKKwljaGFyIHJlc3BbMTAyNF07CisKKwlzdGF0dXMgPSBzZW5kKHJ0aC0+ZmQsIGJ1ZiwgbGVuLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qIENoZWNrIGZvciBpbW1lZGlhdGUgZXJyb3JzICovCisJc3RhdHVzID0gcmVjdihydGgtPmZkLCByZXNwLCBzaXplb2YocmVzcCksIE1TR19ET05UV0FJVHxNU0dfUEVFSyk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJaWYgKGVycm5vID09IEVBR0FJTikKKwkJCXJldHVybiAwOworCQlyZXR1cm4gLTE7CisJfQorCisJZm9yIChoID0gKHN0cnVjdCBubG1zZ2hkciAqKXJlc3A7IE5MTVNHX09LKGgsIHN0YXR1cyk7CisJICAgICBoID0gTkxNU0dfTkVYVChoLCBzdGF0dXMpKSB7CisJCWlmIChoLT5ubG1zZ190eXBlID09IE5MTVNHX0VSUk9SKSB7CisJCQlzdHJ1Y3Qgbmxtc2dlcnIgKmVyciA9IChzdHJ1Y3Qgbmxtc2dlcnIqKU5MTVNHX0RBVEEoaCk7CisJCQlpZiAoaC0+bmxtc2dfbGVuIDwgTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3Qgbmxtc2dlcnIpKSkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIHRydW5jYXRlZFxuIik7CisJCQllbHNlIAorCQkJCWVycm5vID0gLWVyci0+ZXJyb3I7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0bmxfZHVtcF9yZXF1ZXN0KHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoLCBpbnQgdHlwZSwgdm9pZCAqcmVxLCBpbnQgbGVuKQoreworCXN0cnVjdCBubG1zZ2hkciBubGg7CisJc3RydWN0IHNvY2thZGRyX25sIG5sYWRkciA9IHsgLm5sX2ZhbWlseSA9IEFGX05FVExJTksgfTsKKwlzdHJ1Y3QgaW92ZWMgaW92WzJdID0geworCQl7IC5pb3ZfYmFzZSA9ICZubGgsIC5pb3ZfbGVuID0gc2l6ZW9mKG5saCkgfSwKKwkJeyAuaW92X2Jhc2UgPSByZXEsIC5pb3ZfbGVuID0gbGVuIH0KKwl9OworCXN0cnVjdCBtc2doZHIgbXNnID0geworCQkubXNnX25hbWUgPSAmbmxhZGRyLAorCQkubXNnX25hbWVsZW4gPSAJc2l6ZW9mKG5sYWRkciksCisJCS5tc2dfaW92ID0gaW92LAorCQkubXNnX2lvdmxlbiA9IDIsCisJfTsKKworCW5saC5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgobGVuKTsKKwlubGgubmxtc2dfdHlwZSA9IHR5cGU7CisJbmxoLm5sbXNnX2ZsYWdzID0gTkxNX0ZfRFVNUHxOTE1fRl9SRVFVRVNUOworCW5saC5ubG1zZ19waWQgPSAwOworCW5saC5ubG1zZ19zZXEgPSBydGgtPmR1bXAgPSArK3J0aC0+c2VxOworCisJcmV0dXJuIHNlbmRtc2cocnRoLT5mZCwgJm1zZywgMCk7Cit9CisKK2ludCBydG5sX2R1bXBfcmVxdWVzdF9uKHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoLCBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJc3RydWN0IHNvY2thZGRyX25sIG5sYWRkciA9IHsgLm5sX2ZhbWlseSA9IEFGX05FVExJTksgfTsKKwlzdHJ1Y3QgaW92ZWMgaW92ID0geworCQkuaW92X2Jhc2UgPSAodm9pZCopIG4sCisJCS5pb3ZfbGVuID0gbi0+bmxtc2dfbGVuCisJfTsKKwlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsKKwkJLm1zZ19uYW1lID0gJm5sYWRkciwKKwkJLm1zZ19uYW1lbGVuID0gc2l6ZW9mKG5sYWRkciksCisJCS5tc2dfaW92ID0gJmlvdiwKKwkJLm1zZ19pb3ZsZW4gPSAxLAorCX07CisKKwluLT5ubG1zZ19mbGFncyA9IE5MTV9GX0RVTVB8TkxNX0ZfUkVRVUVTVDsKKwluLT5ubG1zZ19waWQgPSAwOworCW4tPm5sbXNnX3NlcSA9IHJ0aC0+ZHVtcCA9ICsrcnRoLT5zZXE7CisKKwlyZXR1cm4gc2VuZG1zZyhydGgtPmZkLCAmbXNnLCAwKTsKK30KKworaW50IHJ0bmxfZHVtcF9maWx0ZXJfbChzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0aCwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBydG5sX2R1bXBfZmlsdGVyX2FyZyAqYXJnKQoreworCXN0cnVjdCBzb2NrYWRkcl9ubCBubGFkZHI7CisJc3RydWN0IGlvdmVjIGlvdjsKKwlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsKKwkJLm1zZ19uYW1lID0gJm5sYWRkciwKKwkJLm1zZ19uYW1lbGVuID0gc2l6ZW9mKG5sYWRkciksCisJCS5tc2dfaW92ID0gJmlvdiwKKwkJLm1zZ19pb3ZsZW4gPSAxLAorCX07CisJY2hhciBidWZbMTYzODRdOworCWludCBkdW1wX2ludHIgPSAwOworCisJaW92Lmlvdl9iYXNlID0gYnVmOworCXdoaWxlICgxKSB7CisJCWludCBzdGF0dXM7CisJCWNvbnN0IHN0cnVjdCBydG5sX2R1bXBfZmlsdGVyX2FyZyAqYTsKKwkJaW50IGZvdW5kX2RvbmUgPSAwOworCQlpbnQgbXNnbGVuID0gMDsKKworCQlpb3YuaW92X2xlbiA9IHNpemVvZihidWYpOworCQlzdGF0dXMgPSByZWN2bXNnKHJ0aC0+ZmQsICZtc2csIDApOworCisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUFHQUlOKQorCQkJCWNvbnRpbnVlOworCQkJZnByaW50ZihzdGRlcnIsICJuZXRsaW5rIHJlY2VpdmUgZXJyb3IgJXMgKCVkKVxuIiwKKwkJCQlzdHJlcnJvcihlcnJubyksIGVycm5vKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmIChzdGF0dXMgPT0gMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJFT0Ygb24gbmV0bGlua1xuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAocnRoLT5kdW1wX2ZwKQorCQkJZndyaXRlKGJ1ZiwgMSwgTkxNU0dfQUxJR04oc3RhdHVzKSwgcnRoLT5kdW1wX2ZwKTsKKworCQlmb3IgKGEgPSBhcmc7IGEtPmZpbHRlcjsgYSsrKSB7CisJCQlzdHJ1Y3Qgbmxtc2doZHIgKmggPSAoc3RydWN0IG5sbXNnaGRyKilidWY7CisJCQltc2dsZW4gPSBzdGF0dXM7CisKKwkJCXdoaWxlIChOTE1TR19PSyhoLCBtc2dsZW4pKSB7CisJCQkJaW50IGVyciA9IDA7CisKKwkJCQloLT5ubG1zZ19mbGFncyAmPSB+YS0+bmNfZmxhZ3M7CisKKwkJCQlpZiAobmxhZGRyLm5sX3BpZCAhPSAwIHx8CisJCQkJICAgIGgtPm5sbXNnX3BpZCAhPSBydGgtPmxvY2FsLm5sX3BpZCB8fAorCQkJCSAgICBoLT5ubG1zZ19zZXEgIT0gcnRoLT5kdW1wKQorCQkJCQlnb3RvIHNraXBfaXQ7CisKKwkJCQlpZiAoaC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9EVU1QX0lOVFIpCisJCQkJCWR1bXBfaW50ciA9IDE7CisKKwkJCQlpZiAoaC0+bmxtc2dfdHlwZSA9PSBOTE1TR19ET05FKSB7CisJCQkJCWZvdW5kX2RvbmUgPSAxOworCQkJCQlicmVhazsgLyogcHJvY2VzcyBuZXh0IGZpbHRlciAqLworCQkJCX0KKwkJCQlpZiAoaC0+bmxtc2dfdHlwZSA9PSBOTE1TR19FUlJPUikgeworCQkJCQlzdHJ1Y3Qgbmxtc2dlcnIgKmVyciA9IChzdHJ1Y3Qgbmxtc2dlcnIqKU5MTVNHX0RBVEEoaCk7CisJCQkJCWlmIChoLT5ubG1zZ19sZW4gPCBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBubG1zZ2VycikpKSB7CisJCQkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJCQkiRVJST1IgdHJ1bmNhdGVkXG4iKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWVycm5vID0gLWVyci0+ZXJyb3I7CisJCQkJCQlpZiAocnRoLT5wcm90byA9PSBORVRMSU5LX1NPQ0tfRElBRyAmJgorCQkJCQkJICAgIChlcnJubyA9PSBFTk9FTlQgfHwKKwkJCQkJCSAgICAgZXJybm8gPT0gRU9QTk9UU1VQUCkpCisJCQkJCQkJcmV0dXJuIC0xOworCisJCQkJCQlwZXJyb3IoIlJUTkVUTElOSyBhbnN3ZXJzIik7CisJCQkJCX0KKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKworCQkJCWlmICghcnRoLT5kdW1wX2ZwKSB7CisJCQkJCWVyciA9IGEtPmZpbHRlcigmbmxhZGRyLCBoLCBhLT5hcmcxKTsKKwkJCQkJaWYgKGVyciA8IDApCisJCQkJCQlyZXR1cm4gZXJyOworCQkJCX0KKworc2tpcF9pdDoKKwkJCQloID0gTkxNU0dfTkVYVChoLCBtc2dsZW4pOworCQkJfQorCQl9CisKKwkJaWYgKGZvdW5kX2RvbmUpIHsKKwkJCWlmIChkdW1wX2ludHIpCisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCSJEdW1wIHdhcyBpbnRlcnJ1cHRlZCBhbmQgbWF5IGJlIGluY29uc2lzdGVudC5cbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAobXNnLm1zZ19mbGFncyAmIE1TR19UUlVOQykgeworCQkJZnByaW50ZihzdGRlcnIsICJNZXNzYWdlIHRydW5jYXRlZFxuIik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobXNnbGVuKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiEhIVJlbW5hbnQgb2Ygc2l6ZSAlZFxuIiwgbXNnbGVuKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9Cit9CisKK2ludCBydG5sX2R1bXBfZmlsdGVyX25jKHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoLAorCQkgICAgIHJ0bmxfZmlsdGVyX3QgZmlsdGVyLAorCQkgICAgIHZvaWQgKmFyZzEsIF9fdTE2IG5jX2ZsYWdzKQoreworCWNvbnN0IHN0cnVjdCBydG5sX2R1bXBfZmlsdGVyX2FyZyBhWzJdID0geworCQl7IC5maWx0ZXIgPSBmaWx0ZXIsIC5hcmcxID0gYXJnMSwgLm5jX2ZsYWdzID0gbmNfZmxhZ3MsIH0sCisJCXsgLmZpbHRlciA9IE5VTEwsICAgLmFyZzEgPSBOVUxMLCAubmNfZmxhZ3MgPSAwLCB9LAorCX07CisKKwlyZXR1cm4gcnRubF9kdW1wX2ZpbHRlcl9sKHJ0aCwgYSk7Cit9CisKK2ludCBydG5sX3RhbGsoc3RydWN0IHJ0bmxfaGFuZGxlICpydG5sLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sCisJICAgICAgc3RydWN0IG5sbXNnaGRyICphbnN3ZXIsIHNpemVfdCBtYXhsZW4pCit7CisJaW50IHN0YXR1czsKKwl1bnNpZ25lZCBzZXE7CisJc3RydWN0IG5sbXNnaGRyICpoOworCXN0cnVjdCBzb2NrYWRkcl9ubCBubGFkZHI7CisJc3RydWN0IGlvdmVjIGlvdiA9IHsKKwkJLmlvdl9iYXNlID0gKHZvaWQqKSBuLAorCQkuaW92X2xlbiA9IG4tPm5sbXNnX2xlbgorCX07CisJc3RydWN0IG1zZ2hkciBtc2cgPSB7CisJCS5tc2dfbmFtZSA9ICZubGFkZHIsCisJCS5tc2dfbmFtZWxlbiA9IHNpemVvZihubGFkZHIpLAorCQkubXNnX2lvdiA9ICZpb3YsCisJCS5tc2dfaW92bGVuID0gMSwKKwl9OworCWNoYXIgICBidWZbMzI3NjhdOworCisJbWVtc2V0KCZubGFkZHIsIDAsIHNpemVvZihubGFkZHIpKTsKKwlubGFkZHIubmxfZmFtaWx5ID0gQUZfTkVUTElOSzsKKworCW4tPm5sbXNnX3NlcSA9IHNlcSA9ICsrcnRubC0+c2VxOworCisJaWYgKGFuc3dlciA9PSBOVUxMKQorCQluLT5ubG1zZ19mbGFncyB8PSBOTE1fRl9BQ0s7CisKKwlzdGF0dXMgPSBzZW5kbXNnKHJ0bmwtPmZkLCAmbXNnLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlwZXJyb3IoIkNhbm5vdCB0YWxrIHRvIHJ0bmV0bGluayIpOworCQlyZXR1cm4gLTE7CisJfQorCisJbWVtc2V0KGJ1ZiwwLHNpemVvZihidWYpKTsKKworCWlvdi5pb3ZfYmFzZSA9IGJ1ZjsKKwl3aGlsZSAoMSkgeworCQlpb3YuaW92X2xlbiA9IHNpemVvZihidWYpOworCQlzdGF0dXMgPSByZWN2bXNnKHJ0bmwtPmZkLCAmbXNnLCAwKTsKKworCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVBR0FJTikKKwkJCQljb250aW51ZTsKKwkJCWZwcmludGYoc3RkZXJyLCAibmV0bGluayByZWNlaXZlIGVycm9yICVzICglZClcbiIsCisJCQkJc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKHN0YXR1cyA9PSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkVPRiBvbiBuZXRsaW5rXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAobXNnLm1zZ19uYW1lbGVuICE9IHNpemVvZihubGFkZHIpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgInNlbmRlciBhZGRyZXNzIGxlbmd0aCA9PSAlZFxuIiwgbXNnLm1zZ19uYW1lbGVuKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJZm9yIChoID0gKHN0cnVjdCBubG1zZ2hkciopYnVmOyBzdGF0dXMgPj0gc2l6ZW9mKCpoKTsgKSB7CisJCQlpbnQgbGVuID0gaC0+bmxtc2dfbGVuOworCQkJaW50IGwgPSBsZW4gLSBzaXplb2YoKmgpOworCisJCQlpZiAobCA8IDAgfHwgbGVuPnN0YXR1cykgeworCQkJCWlmIChtc2cubXNnX2ZsYWdzICYgTVNHX1RSVU5DKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiVHJ1bmNhdGVkIG1lc3NhZ2VcbiIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCWZwcmludGYoc3RkZXJyLCAiISEhbWFsZm9ybWVkIG1lc3NhZ2U6IGxlbj0lZFxuIiwgbGVuKTsKKwkJCQlleGl0KDEpOworCQkJfQorCisJCQlpZiAobmxhZGRyLm5sX3BpZCAhPSAwIHx8CisJCQkgICAgaC0+bmxtc2dfcGlkICE9IHJ0bmwtPmxvY2FsLm5sX3BpZCB8fAorCQkJICAgIGgtPm5sbXNnX3NlcSAhPSBzZXEpIHsKKwkJCQkvKiBEb24ndCBmb3JnZXQgdG8gc2tpcCB0aGF0IG1lc3NhZ2UuICovCisJCQkJc3RhdHVzIC09IE5MTVNHX0FMSUdOKGxlbik7CisJCQkJaCA9IChzdHJ1Y3Qgbmxtc2doZHIqKSgoY2hhciopaCArIE5MTVNHX0FMSUdOKGxlbikpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoaC0+bmxtc2dfdHlwZSA9PSBOTE1TR19FUlJPUikgeworCQkJCXN0cnVjdCBubG1zZ2VyciAqZXJyID0gKHN0cnVjdCBubG1zZ2VyciopTkxNU0dfREFUQShoKTsKKwkJCQlpZiAobCA8IHNpemVvZihzdHJ1Y3Qgbmxtc2dlcnIpKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiRVJST1IgdHJ1bmNhdGVkXG4iKTsKKwkJCQl9IGVsc2UgaWYgKCFlcnItPmVycm9yKSB7CisJCQkJCWlmIChhbnN3ZXIpCisJCQkJCQltZW1jcHkoYW5zd2VyLCBoLAorCQkJCQkJICAgICAgIE1JTihtYXhsZW4sIGgtPm5sbXNnX2xlbikpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisKKwkJCQlpZiAocnRubC0+cHJvdG8gIT0gTkVUTElOS19TT0NLX0RJQUcpCisJCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkJIlJUTkVUTElOSyBhbnN3ZXJzOiAlc1xuIiwKKwkJCQkJCXN0cmVycm9yKC1lcnItPmVycm9yKSk7CisJCQkJZXJybm8gPSAtZXJyLT5lcnJvcjsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJCWlmIChhbnN3ZXIpIHsKKwkJCQltZW1jcHkoYW5zd2VyLCBoLAorCQkJCSAgICAgICBNSU4obWF4bGVuLCBoLT5ubG1zZ19sZW4pKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJZnByaW50ZihzdGRlcnIsICJVbmV4cGVjdGVkIHJlcGx5ISEhXG4iKTsKKworCQkJc3RhdHVzIC09IE5MTVNHX0FMSUdOKGxlbik7CisJCQloID0gKHN0cnVjdCBubG1zZ2hkciopKChjaGFyKiloICsgTkxNU0dfQUxJR04obGVuKSk7CisJCX0KKworCQlpZiAobXNnLm1zZ19mbGFncyAmIE1TR19UUlVOQykgeworCQkJZnByaW50ZihzdGRlcnIsICJNZXNzYWdlIHRydW5jYXRlZFxuIik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChzdGF0dXMpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiISEhUmVtbmFudCBvZiBzaXplICVkXG4iLCBzdGF0dXMpOworCQkJZXhpdCgxKTsKKwkJfQorCX0KK30KKworaW50IHJ0bmxfbGlzdGVuX2FsbF9uc2lkKHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoKQoreworCXVuc2lnbmVkIGludCBvbiA9IDE7CisKKwlpZiAoc2V0c29ja29wdChydGgtPmZkLCBTT0xfTkVUTElOSywgTkVUTElOS19MSVNURU5fQUxMX05TSUQsICZvbiwKKwkJICAgICAgIHNpemVvZihvbikpIDwgMCkgeworCQlwZXJyb3IoIk5FVExJTktfTElTVEVOX0FMTF9OU0lEIik7CisJCXJldHVybiAtMTsKKwl9CisJcnRoLT5mbGFncyB8PSBSVE5MX0hBTkRMRV9GX0xJU1RFTl9BTExfTlNJRDsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0bmxfbGlzdGVuKHN0cnVjdCBydG5sX2hhbmRsZSAqcnRubCwKKwkJcnRubF9saXN0ZW5fZmlsdGVyX3QgaGFuZGxlciwKKwkJdm9pZCAqamFyZykKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBubG1zZ2hkciAqaDsKKwlzdHJ1Y3Qgc29ja2FkZHJfbmwgbmxhZGRyOworCXN0cnVjdCBpb3ZlYyBpb3Y7CisJc3RydWN0IG1zZ2hkciBtc2cgPSB7CisJCS5tc2dfbmFtZSA9ICZubGFkZHIsCisJCS5tc2dfbmFtZWxlbiA9IHNpemVvZihubGFkZHIpLAorCQkubXNnX2lvdiA9ICZpb3YsCisJCS5tc2dfaW92bGVuID0gMSwKKwl9OworCWNoYXIgICBidWZbMTYzODRdOworCWNoYXIgICBjbXNnYnVmW0JVRlNJWl07CisKKwlpZiAocnRubC0+ZmxhZ3MgJiBSVE5MX0hBTkRMRV9GX0xJU1RFTl9BTExfTlNJRCkgeworCQltc2cubXNnX2NvbnRyb2wgPSAmY21zZ2J1ZjsKKwkJbXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGNtc2didWYpOworCX0KKworCW1lbXNldCgmbmxhZGRyLCAwLCBzaXplb2YobmxhZGRyKSk7CisJbmxhZGRyLm5sX2ZhbWlseSA9IEFGX05FVExJTks7CisJbmxhZGRyLm5sX3BpZCA9IDA7CisJbmxhZGRyLm5sX2dyb3VwcyA9IDA7CisKKwlpb3YuaW92X2Jhc2UgPSBidWY7CisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IHJ0bmxfY3RybF9kYXRhIGN0cmw7CisJCXN0cnVjdCBjbXNnaGRyICpjbXNnOworCisJCWlvdi5pb3ZfbGVuID0gc2l6ZW9mKGJ1Zik7CisJCXN0YXR1cyA9IHJlY3Ztc2cocnRubC0+ZmQsICZtc2csIDApOworCisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUFHQUlOKQorCQkJCWNvbnRpbnVlOworCQkJZnByaW50ZihzdGRlcnIsICJuZXRsaW5rIHJlY2VpdmUgZXJyb3IgJXMgKCVkKVxuIiwKKwkJCQlzdHJlcnJvcihlcnJubyksIGVycm5vKTsKKwkJCWlmIChlcnJubyA9PSBFTk9CVUZTKQorCQkJCWNvbnRpbnVlOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChzdGF0dXMgPT0gMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJFT0Ygb24gbmV0bGlua1xuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKG1zZy5tc2dfbmFtZWxlbiAhPSBzaXplb2YobmxhZGRyKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJTZW5kZXIgYWRkcmVzcyBsZW5ndGggPT0gJWRcbiIsIG1zZy5tc2dfbmFtZWxlbik7CisJCQlleGl0KDEpOworCQl9CisKKwkJaWYgKHJ0bmwtPmZsYWdzICYgUlROTF9IQU5ETEVfRl9MSVNURU5fQUxMX05TSUQpIHsKKwkJCW1lbXNldCgmY3RybCwgMCwgc2l6ZW9mKGN0cmwpKTsKKwkJCWN0cmwubnNpZCA9IC0xOworCQkJZm9yIChjbXNnID0gQ01TR19GSVJTVEhEUigmbXNnKTsgY21zZzsKKwkJCSAgICAgY21zZyA9IENNU0dfTlhUSERSKCZtc2csIGNtc2cpKQorCQkJCWlmIChjbXNnLT5jbXNnX2xldmVsID09IFNPTF9ORVRMSU5LICYmCisJCQkJICAgIGNtc2ctPmNtc2dfdHlwZSA9PSBORVRMSU5LX0xJU1RFTl9BTExfTlNJRCAmJgorCQkJCSAgICBjbXNnLT5jbXNnX2xlbiA9PSBDTVNHX0xFTihzaXplb2YoaW50KSkpIHsKKwkJCQkJaW50ICpkYXRhID0gKGludCAqKUNNU0dfREFUQShjbXNnKTsKKworCQkJCQljdHJsLm5zaWQgPSAqZGF0YTsKKwkJCQl9CisJCX0KKworCQlmb3IgKGggPSAoc3RydWN0IG5sbXNnaGRyKilidWY7IHN0YXR1cyA+PSBzaXplb2YoKmgpOyApIHsKKwkJCWludCBlcnI7CisJCQlpbnQgbGVuID0gaC0+bmxtc2dfbGVuOworCQkJaW50IGwgPSBsZW4gLSBzaXplb2YoKmgpOworCisJCQlpZiAobDwwIHx8IGxlbj5zdGF0dXMpIHsKKwkJCQlpZiAobXNnLm1zZ19mbGFncyAmIE1TR19UUlVOQykgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlRydW5jYXRlZCBtZXNzYWdlXG4iKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiEhIW1hbGZvcm1lZCBtZXNzYWdlOiBsZW49JWRcbiIsIGxlbik7CisJCQkJZXhpdCgxKTsKKwkJCX0KKworCQkJZXJyID0gaGFuZGxlcigmbmxhZGRyLCAmY3RybCwgaCwgamFyZyk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCisJCQlzdGF0dXMgLT0gTkxNU0dfQUxJR04obGVuKTsKKwkJCWggPSAoc3RydWN0IG5sbXNnaGRyKikoKGNoYXIqKWggKyBOTE1TR19BTElHTihsZW4pKTsKKwkJfQorCQlpZiAobXNnLm1zZ19mbGFncyAmIE1TR19UUlVOQykgeworCQkJZnByaW50ZihzdGRlcnIsICJNZXNzYWdlIHRydW5jYXRlZFxuIik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc3RhdHVzKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiEhIVJlbW5hbnQgb2Ygc2l6ZSAlZFxuIiwgc3RhdHVzKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9Cit9CisKK2ludCBydG5sX2Zyb21fZmlsZShGSUxFICpydG5sLCBydG5sX2xpc3Rlbl9maWx0ZXJfdCBoYW5kbGVyLAorCQkgICB2b2lkICpqYXJnKQoreworCWludCBzdGF0dXM7CisJc3RydWN0IHNvY2thZGRyX25sIG5sYWRkcjsKKwljaGFyICAgYnVmWzE2Mzg0XTsKKwlzdHJ1Y3Qgbmxtc2doZHIgKmggPSAodm9pZCopYnVmOworCisJbWVtc2V0KCZubGFkZHIsIDAsIHNpemVvZihubGFkZHIpKTsKKwlubGFkZHIubmxfZmFtaWx5ID0gQUZfTkVUTElOSzsKKwlubGFkZHIubmxfcGlkID0gMDsKKwlubGFkZHIubmxfZ3JvdXBzID0gMDsKKworCXdoaWxlICgxKSB7CisJCWludCBlcnIsIGxlbjsKKwkJaW50IGw7CisKKwkJc3RhdHVzID0gZnJlYWQoJmJ1ZiwgMSwgc2l6ZW9mKCpoKSwgcnRubCk7CisKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCQljb250aW51ZTsKKwkJCXBlcnJvcigicnRubF9mcm9tX2ZpbGU6IGZyZWFkIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKHN0YXR1cyA9PSAwKQorCQkJcmV0dXJuIDA7CisKKwkJbGVuID0gaC0+bmxtc2dfbGVuOworCQlsID0gbGVuIC0gc2l6ZW9mKCpoKTsKKworCQlpZiAobDwwIHx8IGxlbj5zaXplb2YoYnVmKSkgeworCQkJZnByaW50ZihzdGRlcnIsICIhISFtYWxmb3JtZWQgbWVzc2FnZTogbGVuPSVkIEAlbHVcbiIsCisJCQkJbGVuLCBmdGVsbChydG5sKSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlzdGF0dXMgPSBmcmVhZChOTE1TR19EQVRBKGgpLCAxLCBOTE1TR19BTElHTihsKSwgcnRubCk7CisKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCXBlcnJvcigicnRubF9mcm9tX2ZpbGU6IGZyZWFkIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKHN0YXR1cyA8IGwpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAicnRubC1mcm9tX2ZpbGU6IHRydW5jYXRlZCBtZXNzYWdlXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWVyciA9IGhhbmRsZXIoJm5sYWRkciwgTlVMTCwgaCwgamFyZyk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9Cit9CisKK2ludCBhZGRhdHRyKHN0cnVjdCBubG1zZ2hkciAqbiwgaW50IG1heGxlbiwgaW50IHR5cGUpCit7CisJcmV0dXJuIGFkZGF0dHJfbChuLCBtYXhsZW4sIHR5cGUsIE5VTEwsIDApOworfQorCitpbnQgYWRkYXR0cjgoc3RydWN0IG5sbXNnaGRyICpuLCBpbnQgbWF4bGVuLCBpbnQgdHlwZSwgX191OCBkYXRhKQoreworCXJldHVybiBhZGRhdHRyX2wobiwgbWF4bGVuLCB0eXBlLCAmZGF0YSwgc2l6ZW9mKF9fdTgpKTsKK30KKworaW50IGFkZGF0dHIxNihzdHJ1Y3Qgbmxtc2doZHIgKm4sIGludCBtYXhsZW4sIGludCB0eXBlLCBfX3UxNiBkYXRhKQoreworCXJldHVybiBhZGRhdHRyX2wobiwgbWF4bGVuLCB0eXBlLCAmZGF0YSwgc2l6ZW9mKF9fdTE2KSk7Cit9CisKK2ludCBhZGRhdHRyMzIoc3RydWN0IG5sbXNnaGRyICpuLCBpbnQgbWF4bGVuLCBpbnQgdHlwZSwgX191MzIgZGF0YSkKK3sKKwlyZXR1cm4gYWRkYXR0cl9sKG4sIG1heGxlbiwgdHlwZSwgJmRhdGEsIHNpemVvZihfX3UzMikpOworfQorCitpbnQgYWRkYXR0cjY0KHN0cnVjdCBubG1zZ2hkciAqbiwgaW50IG1heGxlbiwgaW50IHR5cGUsIF9fdTY0IGRhdGEpCit7CisJcmV0dXJuIGFkZGF0dHJfbChuLCBtYXhsZW4sIHR5cGUsICZkYXRhLCBzaXplb2YoX191NjQpKTsKK30KKworaW50IGFkZGF0dHJzdHJ6KHN0cnVjdCBubG1zZ2hkciAqbiwgaW50IG1heGxlbiwgaW50IHR5cGUsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlyZXR1cm4gYWRkYXR0cl9sKG4sIG1heGxlbiwgdHlwZSwgc3RyLCBzdHJsZW4oc3RyKSsxKTsKK30KKworaW50IGFkZGF0dHJfbChzdHJ1Y3Qgbmxtc2doZHIgKm4sIGludCBtYXhsZW4sIGludCB0eXBlLCBjb25zdCB2b2lkICpkYXRhLAorCSAgICAgIGludCBhbGVuKQoreworCWludCBsZW4gPSBSVEFfTEVOR1RIKGFsZW4pOworCXN0cnVjdCBydGF0dHIgKnJ0YTsKKworCWlmIChOTE1TR19BTElHTihuLT5ubG1zZ19sZW4pICsgUlRBX0FMSUdOKGxlbikgPiBtYXhsZW4pIHsKKwkJZnByaW50ZihzdGRlcnIsICJhZGRhdHRyX2wgRVJST1I6IG1lc3NhZ2UgZXhjZWVkZWQgYm91bmQgb2YgJWRcbiIsbWF4bGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKwlydGEgPSBOTE1TR19UQUlMKG4pOworCXJ0YS0+cnRhX3R5cGUgPSB0eXBlOworCXJ0YS0+cnRhX2xlbiA9IGxlbjsKKwltZW1jcHkoUlRBX0RBVEEocnRhKSwgZGF0YSwgYWxlbik7CisJbi0+bmxtc2dfbGVuID0gTkxNU0dfQUxJR04obi0+bmxtc2dfbGVuKSArIFJUQV9BTElHTihsZW4pOworCXJldHVybiAwOworfQorCitpbnQgYWRkcmF3X2woc3RydWN0IG5sbXNnaGRyICpuLCBpbnQgbWF4bGVuLCBjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKQoreworCWlmIChOTE1TR19BTElHTihuLT5ubG1zZ19sZW4pICsgTkxNU0dfQUxJR04obGVuKSA+IG1heGxlbikgeworCQlmcHJpbnRmKHN0ZGVyciwgImFkZHJhd19sIEVSUk9SOiBtZXNzYWdlIGV4Y2VlZGVkIGJvdW5kIG9mICVkXG4iLG1heGxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwltZW1jcHkoTkxNU0dfVEFJTChuKSwgZGF0YSwgbGVuKTsKKwltZW1zZXQoKHZvaWQgKikgTkxNU0dfVEFJTChuKSArIGxlbiwgMCwgTkxNU0dfQUxJR04obGVuKSAtIGxlbik7CisJbi0+bmxtc2dfbGVuID0gTkxNU0dfQUxJR04obi0+bmxtc2dfbGVuKSArIE5MTVNHX0FMSUdOKGxlbik7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBydGF0dHIgKmFkZGF0dHJfbmVzdChzdHJ1Y3Qgbmxtc2doZHIgKm4sIGludCBtYXhsZW4sIGludCB0eXBlKQoreworCXN0cnVjdCBydGF0dHIgKm5lc3QgPSBOTE1TR19UQUlMKG4pOworCisJYWRkYXR0cl9sKG4sIG1heGxlbiwgdHlwZSwgTlVMTCwgMCk7CisJcmV0dXJuIG5lc3Q7Cit9CisKK2ludCBhZGRhdHRyX25lc3RfZW5kKHN0cnVjdCBubG1zZ2hkciAqbiwgc3RydWN0IHJ0YXR0ciAqbmVzdCkKK3sKKwluZXN0LT5ydGFfbGVuID0gKHZvaWQgKilOTE1TR19UQUlMKG4pIC0gKHZvaWQgKiluZXN0OworCXJldHVybiBuLT5ubG1zZ19sZW47Cit9CisKK3N0cnVjdCBydGF0dHIgKmFkZGF0dHJfbmVzdF9jb21wYXQoc3RydWN0IG5sbXNnaGRyICpuLCBpbnQgbWF4bGVuLCBpbnQgdHlwZSwKKwkJCQkgICBjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKQoreworCXN0cnVjdCBydGF0dHIgKnN0YXJ0ID0gTkxNU0dfVEFJTChuKTsKKworCWFkZGF0dHJfbChuLCBtYXhsZW4sIHR5cGUsIGRhdGEsIGxlbik7CisJYWRkYXR0cl9uZXN0KG4sIG1heGxlbiwgdHlwZSk7CisJcmV0dXJuIHN0YXJ0OworfQorCitpbnQgYWRkYXR0cl9uZXN0X2NvbXBhdF9lbmQoc3RydWN0IG5sbXNnaGRyICpuLCBzdHJ1Y3QgcnRhdHRyICpzdGFydCkKK3sKKwlzdHJ1Y3QgcnRhdHRyICpuZXN0ID0gKHZvaWQgKilzdGFydCArIE5MTVNHX0FMSUdOKHN0YXJ0LT5ydGFfbGVuKTsKKworCXN0YXJ0LT5ydGFfbGVuID0gKHZvaWQgKilOTE1TR19UQUlMKG4pIC0gKHZvaWQgKilzdGFydDsKKwlhZGRhdHRyX25lc3RfZW5kKG4sIG5lc3QpOworCXJldHVybiBuLT5ubG1zZ19sZW47Cit9CisKK2ludCBydGFfYWRkYXR0cjMyKHN0cnVjdCBydGF0dHIgKnJ0YSwgaW50IG1heGxlbiwgaW50IHR5cGUsIF9fdTMyIGRhdGEpCit7CisJaW50IGxlbiA9IFJUQV9MRU5HVEgoNCk7CisJc3RydWN0IHJ0YXR0ciAqc3VicnRhOworCisJaWYgKFJUQV9BTElHTihydGEtPnJ0YV9sZW4pICsgbGVuID4gbWF4bGVuKSB7CisJCWZwcmludGYoc3RkZXJyLCJydGFfYWRkYXR0cjMyOiBFcnJvciEgbWF4IGFsbG93ZWQgYm91bmQgJWQgZXhjZWVkZWRcbiIsbWF4bGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzdWJydGEgPSAoc3RydWN0IHJ0YXR0ciopKCgoY2hhciopcnRhKSArIFJUQV9BTElHTihydGEtPnJ0YV9sZW4pKTsKKwlzdWJydGEtPnJ0YV90eXBlID0gdHlwZTsKKwlzdWJydGEtPnJ0YV9sZW4gPSBsZW47CisJbWVtY3B5KFJUQV9EQVRBKHN1YnJ0YSksICZkYXRhLCA0KTsKKwlydGEtPnJ0YV9sZW4gPSBOTE1TR19BTElHTihydGEtPnJ0YV9sZW4pICsgbGVuOworCXJldHVybiAwOworfQorCitpbnQgcnRhX2FkZGF0dHJfbChzdHJ1Y3QgcnRhdHRyICpydGEsIGludCBtYXhsZW4sIGludCB0eXBlLAorCQkgIGNvbnN0IHZvaWQgKmRhdGEsIGludCBhbGVuKQoreworCXN0cnVjdCBydGF0dHIgKnN1YnJ0YTsKKwlpbnQgbGVuID0gUlRBX0xFTkdUSChhbGVuKTsKKworCWlmIChSVEFfQUxJR04ocnRhLT5ydGFfbGVuKSArIFJUQV9BTElHTihsZW4pID4gbWF4bGVuKSB7CisJCWZwcmludGYoc3RkZXJyLCJydGFfYWRkYXR0cl9sOiBFcnJvciEgbWF4IGFsbG93ZWQgYm91bmQgJWQgZXhjZWVkZWRcbiIsbWF4bGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzdWJydGEgPSAoc3RydWN0IHJ0YXR0ciopKCgoY2hhciopcnRhKSArIFJUQV9BTElHTihydGEtPnJ0YV9sZW4pKTsKKwlzdWJydGEtPnJ0YV90eXBlID0gdHlwZTsKKwlzdWJydGEtPnJ0YV9sZW4gPSBsZW47CisJbWVtY3B5KFJUQV9EQVRBKHN1YnJ0YSksIGRhdGEsIGFsZW4pOworCXJ0YS0+cnRhX2xlbiA9IE5MTVNHX0FMSUdOKHJ0YS0+cnRhX2xlbikgKyBSVEFfQUxJR04obGVuKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0YV9hZGRhdHRyOChzdHJ1Y3QgcnRhdHRyICpydGEsIGludCBtYXhsZW4sIGludCB0eXBlLCBfX3U4IGRhdGEpCit7CisJcmV0dXJuIHJ0YV9hZGRhdHRyX2wocnRhLCBtYXhsZW4sIHR5cGUsICZkYXRhLCBzaXplb2YoX191OCkpOworfQorCitpbnQgcnRhX2FkZGF0dHIxNihzdHJ1Y3QgcnRhdHRyICpydGEsIGludCBtYXhsZW4sIGludCB0eXBlLCBfX3UxNiBkYXRhKQoreworCXJldHVybiBydGFfYWRkYXR0cl9sKHJ0YSwgbWF4bGVuLCB0eXBlLCAmZGF0YSwgc2l6ZW9mKF9fdTE2KSk7Cit9CisKK2ludCBydGFfYWRkYXR0cjY0KHN0cnVjdCBydGF0dHIgKnJ0YSwgaW50IG1heGxlbiwgaW50IHR5cGUsIF9fdTY0IGRhdGEpCit7CisJcmV0dXJuIHJ0YV9hZGRhdHRyX2wocnRhLCBtYXhsZW4sIHR5cGUsICZkYXRhLCBzaXplb2YoX191NjQpKTsKK30KKworc3RydWN0IHJ0YXR0ciAqcnRhX25lc3Qoc3RydWN0IHJ0YXR0ciAqcnRhLCBpbnQgbWF4bGVuLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgcnRhdHRyICpuZXN0ID0gUlRBX1RBSUwocnRhKTsKKworCXJ0YV9hZGRhdHRyX2wocnRhLCBtYXhsZW4sIHR5cGUsIE5VTEwsIDApOworCisJcmV0dXJuIG5lc3Q7Cit9CisKK2ludCBydGFfbmVzdF9lbmQoc3RydWN0IHJ0YXR0ciAqcnRhLCBzdHJ1Y3QgcnRhdHRyICpuZXN0KQoreworCW5lc3QtPnJ0YV9sZW4gPSAodm9pZCAqKVJUQV9UQUlMKHJ0YSkgLSAodm9pZCAqKW5lc3Q7CisKKwlyZXR1cm4gcnRhLT5ydGFfbGVuOworfQorCitpbnQgcGFyc2VfcnRhdHRyKHN0cnVjdCBydGF0dHIgKnRiW10sIGludCBtYXgsIHN0cnVjdCBydGF0dHIgKnJ0YSwgaW50IGxlbikKK3sKKwlyZXR1cm4gcGFyc2VfcnRhdHRyX2ZsYWdzKHRiLCBtYXgsIHJ0YSwgbGVuLCAwKTsKK30KKworaW50IHBhcnNlX3J0YXR0cl9mbGFncyhzdHJ1Y3QgcnRhdHRyICp0YltdLCBpbnQgbWF4LCBzdHJ1Y3QgcnRhdHRyICpydGEsCisJCSAgICAgICBpbnQgbGVuLCB1bnNpZ25lZCBzaG9ydCBmbGFncykKK3sKKwl1bnNpZ25lZCBzaG9ydCB0eXBlOworCisJbWVtc2V0KHRiLCAwLCBzaXplb2Yoc3RydWN0IHJ0YXR0ciAqKSAqIChtYXggKyAxKSk7CisJd2hpbGUgKFJUQV9PSyhydGEsIGxlbikpIHsKKwkJdHlwZSA9IHJ0YS0+cnRhX3R5cGUgJiB+ZmxhZ3M7CisJCWlmICgodHlwZSA8PSBtYXgpICYmICghdGJbdHlwZV0pKQorCQkJdGJbdHlwZV0gPSBydGE7CisJCXJ0YSA9IFJUQV9ORVhUKHJ0YSxsZW4pOworCX0KKwlpZiAobGVuKQorCQlmcHJpbnRmKHN0ZGVyciwgIiEhIURlZmljaXQgJWQsIHJ0YV9sZW49JWRcbiIsIGxlbiwgcnRhLT5ydGFfbGVuKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHBhcnNlX3J0YXR0cl9ieWluZGV4KHN0cnVjdCBydGF0dHIgKnRiW10sIGludCBtYXgsIHN0cnVjdCBydGF0dHIgKnJ0YSwgaW50IGxlbikKK3sKKwlpbnQgaSA9IDA7CisKKwltZW1zZXQodGIsIDAsIHNpemVvZihzdHJ1Y3QgcnRhdHRyICopICogbWF4KTsKKwl3aGlsZSAoUlRBX09LKHJ0YSwgbGVuKSkgeworCQlpZiAocnRhLT5ydGFfdHlwZSA8PSBtYXggJiYgaSA8IG1heCkKKwkJCXRiW2krK10gPSBydGE7CisJCXJ0YSA9IFJUQV9ORVhUKHJ0YSxsZW4pOworCX0KKwlpZiAobGVuKQorCQlmcHJpbnRmKHN0ZGVyciwgIiEhIURlZmljaXQgJWQsIHJ0YV9sZW49JWRcbiIsIGxlbiwgcnRhLT5ydGFfbGVuKTsKKwlyZXR1cm4gaTsKK30KKworc3RydWN0IHJ0YXR0ciAqcGFyc2VfcnRhdHRyX29uZShpbnQgdHlwZSwgc3RydWN0IHJ0YXR0ciAqcnRhLCBpbnQgbGVuKQoreworCXdoaWxlIChSVEFfT0socnRhLCBsZW4pKSB7CisJCWlmIChydGEtPnJ0YV90eXBlID09IHR5cGUpCisJCQlyZXR1cm4gcnRhOworCQlydGEgPSBSVEFfTkVYVChydGEsIGxlbik7CisJfQorCWlmIChsZW4pCisJCWZwcmludGYoc3RkZXJyLCAiISEhRGVmaWNpdCAlZCwgcnRhX2xlbj0lZFxuIiwgbGVuLCBydGEtPnJ0YV9sZW4pOworCXJldHVybiBOVUxMOworfQorCitpbnQgX19wYXJzZV9ydGF0dHJfbmVzdGVkX2NvbXBhdChzdHJ1Y3QgcnRhdHRyICp0YltdLCBpbnQgbWF4LCBzdHJ1Y3QgcnRhdHRyICpydGEsCisJCQkgICAgICAgICBpbnQgbGVuKQoreworCWlmIChSVEFfUEFZTE9BRChydGEpIDwgbGVuKQorCQlyZXR1cm4gLTE7CisJaWYgKFJUQV9QQVlMT0FEKHJ0YSkgPj0gUlRBX0FMSUdOKGxlbikgKyBzaXplb2Yoc3RydWN0IHJ0YXR0cikpIHsKKwkJcnRhID0gUlRBX0RBVEEocnRhKSArIFJUQV9BTElHTihsZW4pOworCQlyZXR1cm4gcGFyc2VfcnRhdHRyX25lc3RlZCh0YiwgbWF4LCBydGEpOworCX0KKwltZW1zZXQodGIsIDAsIHNpemVvZihzdHJ1Y3QgcnRhdHRyICopICogKG1heCArIDEpKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2xpYi9sbF9hZGRyLmMgYi9pcHJvdXRlMi9saWIvbGxfYWRkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZTlhYmYKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9saWIvbGxfYWRkci5jCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBsbF9hZGRyLmMKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorCisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCisKK2NvbnN0IGNoYXIgKmxsX2FkZHJfbjJhKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsIGludCBhbGVuLCBpbnQgdHlwZSwgY2hhciAqYnVmLCBpbnQgYmxlbikKK3sKKwlpbnQgaTsKKwlpbnQgbDsKKworCWlmIChhbGVuID09IDQgJiYKKwkgICAgKHR5cGUgPT0gQVJQSFJEX1RVTk5FTCB8fCB0eXBlID09IEFSUEhSRF9TSVQgfHwgdHlwZSA9PSBBUlBIUkRfSVBHUkUpKSB7CisJCXJldHVybiBpbmV0X250b3AoQUZfSU5FVCwgYWRkciwgYnVmLCBibGVuKTsKKwl9CisJaWYgKGFsZW4gPT0gMTYgJiYgdHlwZSA9PSBBUlBIUkRfVFVOTkVMNikgeworCQlyZXR1cm4gaW5ldF9udG9wKEFGX0lORVQ2LCBhZGRyLCBidWYsIGJsZW4pOworCX0KKwlsID0gMDsKKwlmb3IgKGk9MDsgaTxhbGVuOyBpKyspIHsKKwkJaWYgKGk9PTApIHsKKwkJCXNucHJpbnRmKGJ1ZitsLCBibGVuLCAiJTAyeCIsIGFkZHJbaV0pOworCQkJYmxlbiAtPSAyOworCQkJbCArPSAyOworCQl9IGVsc2UgeworCQkJc25wcmludGYoYnVmK2wsIGJsZW4sICI6JTAyeCIsIGFkZHJbaV0pOworCQkJYmxlbiAtPSAzOworCQkJbCArPSAzOworCQl9CisJfQorCXJldHVybiBidWY7Cit9CisKKy8qTkI6IGxsYWRkciBpcyBjaGFyICogKHJhdGhlciB0aGFuIHU4ICopIGJlY2F1c2Ugc2FfZGF0YSBpcyBjaGFyICogKDEwMDMuMWcpICovCitpbnQgbGxfYWRkcl9hMm4oY2hhciAqbGxhZGRyLCBpbnQgbGVuLCBjb25zdCBjaGFyICphcmcpCit7CisJaWYgKHN0cmNocihhcmcsICcuJykpIHsKKwkJaW5ldF9wcmVmaXggcGZ4OworCQlpZiAoZ2V0X2FkZHJfMSgmcGZ4LCBhcmcsIEFGX0lORVQpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlwiJXNcIiBpcyBpbnZhbGlkIGxsYWRkci5cbiIsIGFyZyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKGxlbiA8IDQpCisJCQlyZXR1cm4gLTE7CisJCW1lbWNweShsbGFkZHIsIHBmeC5kYXRhLCA0KTsKKwkJcmV0dXJuIDQ7CisJfSBlbHNlIHsKKwkJaW50IGk7CisKKwkJZm9yIChpPTA7IGk8bGVuOyBpKyspIHsKKwkJCWludCB0ZW1wOworCQkJY2hhciAqY3AgPSBzdHJjaHIoYXJnLCAnOicpOworCQkJaWYgKGNwKSB7CisJCQkJKmNwID0gMDsKKwkJCQljcCsrOworCQkJfQorCQkJaWYgKHNzY2FuZihhcmcsICIleCIsICZ0ZW1wKSAhPSAxKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJcIiVzXCIgaXMgaW52YWxpZCBsbGFkZHIuXG4iLCBhcmcpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmICh0ZW1wIDwgMCB8fCB0ZW1wID4gMjU1KSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJcIiVzXCIgaXMgaW52YWxpZCBsbGFkZHIuXG4iLCBhcmcpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWxsYWRkcltpXSA9IHRlbXA7CisJCQlpZiAoIWNwKQorCQkJCWJyZWFrOworCQkJYXJnID0gY3A7CisJCX0KKwkJcmV0dXJuIGkrMTsKKwl9Cit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9saWIvbGxfbWFwLmMgYi9pcHJvdXRlMi9saWIvbGxfbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZmNzAyNwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2xpYi9sbF9tYXAuYwpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIGxsX21hcC5jCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisKKyNpbmNsdWRlICJsaWJuZXRsaW5rLmgiCisjaW5jbHVkZSAibGxfbWFwLmgiCisjaW5jbHVkZSAiaGxpc3QuaCIKKworc3RydWN0IGxsX2NhY2hlIHsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBpZHhfaGFzaDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBuYW1lX2hhc2g7CisJdW5zaWduZWQJZmxhZ3M7CisJdW5zaWduZWQgCWluZGV4OworCXVuc2lnbmVkIHNob3J0CXR5cGU7CisJY2hhcgkJbmFtZVtJRk5BTVNJWl07Cit9OworCisjZGVmaW5lIElEWE1BUF9TSVpFCTEwMjQKK3N0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCBpZHhfaGVhZFtJRFhNQVBfU0laRV07CitzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQgbmFtZV9oZWFkW0lEWE1BUF9TSVpFXTsKKworc3RhdGljIHN0cnVjdCBsbF9jYWNoZSAqbGxfZ2V0X2J5X2luZGV4KHVuc2lnbmVkIGluZGV4KQoreworCXN0cnVjdCBobGlzdF9ub2RlICpuOworCXVuc2lnbmVkIGggPSBpbmRleCAmIChJRFhNQVBfU0laRSAtIDEpOworCisJaGxpc3RfZm9yX2VhY2gobiwgJmlkeF9oZWFkW2hdKSB7CisJCXN0cnVjdCBsbF9jYWNoZSAqaW0KKwkJCT0gY29udGFpbmVyX29mKG4sIHN0cnVjdCBsbF9jYWNoZSwgaWR4X2hhc2gpOworCQlpZiAoaW0tPmluZGV4ID09IGluZGV4KQorCQkJcmV0dXJuIGltOworCX0KKworCXJldHVybiBOVUxMOworfQorCit1bnNpZ25lZCBuYW1laGFzaChjb25zdCBjaGFyICpzdHIpCit7CisJdW5zaWduZWQgaGFzaCA9IDUzODE7CisKKwl3aGlsZSAoKnN0cikKKwkJaGFzaCA9ICgoaGFzaCA8PCA1KSArIGhhc2gpICsgKnN0cisrOyAvKiBoYXNoICogMzMgKyBjICovCisKKwlyZXR1cm4gaGFzaDsKK30KKworc3RhdGljIHN0cnVjdCBsbF9jYWNoZSAqbGxfZ2V0X2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbjsKKwl1bnNpZ25lZCBoID0gbmFtZWhhc2gobmFtZSkgJiAoSURYTUFQX1NJWkUgLSAxKTsKKworCWhsaXN0X2Zvcl9lYWNoKG4sICZuYW1lX2hlYWRbaF0pIHsKKwkJc3RydWN0IGxsX2NhY2hlICppbQorCQkJPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGxsX2NhY2hlLCBuYW1lX2hhc2gpOworCisJCWlmIChzdHJuY21wKGltLT5uYW1lLCBuYW1lLCBJRk5BTVNJWikgPT0gMCkKKwkJCXJldHVybiBpbTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IGxsX3JlbWVtYmVyX2luZGV4KGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLAorCQkgICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZykKK3sKKwl1bnNpZ25lZCBpbnQgaDsKKwljb25zdCBjaGFyICppZm5hbWU7CisJc3RydWN0IGlmaW5mb21zZyAqaWZpID0gTkxNU0dfREFUQShuKTsKKwlzdHJ1Y3QgbGxfY2FjaGUgKmltOworCXN0cnVjdCBydGF0dHIgKnRiW0lGTEFfTUFYKzFdOworCisJaWYgKG4tPm5sbXNnX3R5cGUgIT0gUlRNX05FV0xJTksgJiYgbi0+bmxtc2dfdHlwZSAhPSBSVE1fREVMTElOSykKKwkJcmV0dXJuIDA7CisKKwlpZiAobi0+bmxtc2dfbGVuIDwgTkxNU0dfTEVOR1RIKHNpemVvZihpZmkpKSkKKwkJcmV0dXJuIC0xOworCisJaW0gPSBsbF9nZXRfYnlfaW5kZXgoaWZpLT5pZmlfaW5kZXgpOworCWlmIChuLT5ubG1zZ190eXBlID09IFJUTV9ERUxMSU5LKSB7CisJCWlmIChpbSkgeworCQkJaGxpc3RfZGVsKCZpbS0+bmFtZV9oYXNoKTsKKwkJCWhsaXN0X2RlbCgmaW0tPmlkeF9oYXNoKTsKKwkJCWZyZWUoaW0pOworCQl9CisJCXJldHVybiAwOworCX0KKworCW1lbXNldCh0YiwgMCwgc2l6ZW9mKHRiKSk7CisJcGFyc2VfcnRhdHRyKHRiLCBJRkxBX01BWCwgSUZMQV9SVEEoaWZpKSwgSUZMQV9QQVlMT0FEKG4pKTsKKwlpZm5hbWUgPSBydGFfZ2V0YXR0cl9zdHIodGJbSUZMQV9JRk5BTUVdKTsKKwlpZiAoaWZuYW1lID09IE5VTEwpCisJCXJldHVybiAwOworCisJaWYgKGltKSB7CisJCS8qIGNoYW5nZSB0byBleGlzdGluZyBlbnRyeSAqLworCQlpZiAoc3RyY21wKGltLT5uYW1lLCBpZm5hbWUpICE9IDApIHsKKwkJCWhsaXN0X2RlbCgmaW0tPm5hbWVfaGFzaCk7CisJCQloID0gbmFtZWhhc2goaWZuYW1lKSAmIChJRFhNQVBfU0laRSAtIDEpOworCQkJaGxpc3RfYWRkX2hlYWQoJmltLT5uYW1lX2hhc2gsICZuYW1lX2hlYWRbaF0pOworCQl9CisKKwkJaW0tPmZsYWdzID0gaWZpLT5pZmlfZmxhZ3M7CisJCXJldHVybiAwOworCX0KKworCWltID0gbWFsbG9jKHNpemVvZigqaW0pKTsKKwlpZiAoaW0gPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJaW0tPmluZGV4ID0gaWZpLT5pZmlfaW5kZXg7CisJc3RyY3B5KGltLT5uYW1lLCBpZm5hbWUpOworCWltLT50eXBlID0gaWZpLT5pZmlfdHlwZTsKKwlpbS0+ZmxhZ3MgPSBpZmktPmlmaV9mbGFnczsKKworCWggPSBpZmktPmlmaV9pbmRleCAmIChJRFhNQVBfU0laRSAtIDEpOworCWhsaXN0X2FkZF9oZWFkKCZpbS0+aWR4X2hhc2gsICZpZHhfaGVhZFtoXSk7CisKKwloID0gbmFtZWhhc2goaWZuYW1lKSAmIChJRFhNQVBfU0laRSAtIDEpOworCWhsaXN0X2FkZF9oZWFkKCZpbS0+bmFtZV9oYXNoLCAmbmFtZV9oZWFkW2hdKTsKKworCXJldHVybiAwOworfQorCitjb25zdCBjaGFyICpsbF9pZHhfbjJhKHVuc2lnbmVkIGlkeCwgY2hhciAqYnVmKQoreworCWNvbnN0IHN0cnVjdCBsbF9jYWNoZSAqaW07CisKKwlpZiAoaWR4ID09IDApCisJCXJldHVybiAiKiI7CisKKwlpbSA9IGxsX2dldF9ieV9pbmRleChpZHgpOworCWlmIChpbSkKKwkJcmV0dXJuIGltLT5uYW1lOworCisJaWYgKGlmX2luZGV4dG9uYW1lKGlkeCwgYnVmKSA9PSBOVUxMKQorCQlzbnByaW50ZihidWYsIElGTkFNU0laLCAiaWYlZCIsIGlkeCk7CisKKwlyZXR1cm4gYnVmOworfQorCitjb25zdCBjaGFyICpsbF9pbmRleF90b19uYW1lKHVuc2lnbmVkIGlkeCkKK3sKKwlzdGF0aWMgY2hhciBuYnVmW0lGTkFNU0laXTsKKworCXJldHVybiBsbF9pZHhfbjJhKGlkeCwgbmJ1Zik7Cit9CisKK2ludCBsbF9pbmRleF90b190eXBlKHVuc2lnbmVkIGlkeCkKK3sKKwljb25zdCBzdHJ1Y3QgbGxfY2FjaGUgKmltOworCisJaWYgKGlkeCA9PSAwKQorCQlyZXR1cm4gLTE7CisKKwlpbSA9IGxsX2dldF9ieV9pbmRleChpZHgpOworCXJldHVybiBpbSA/IGltLT50eXBlIDogLTE7Cit9CisKK2ludCBsbF9pbmRleF90b19mbGFncyh1bnNpZ25lZCBpZHgpCit7CisJY29uc3Qgc3RydWN0IGxsX2NhY2hlICppbTsKKworCWlmIChpZHggPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpbSA9IGxsX2dldF9ieV9pbmRleChpZHgpOworCXJldHVybiBpbSA/IGltLT5mbGFncyA6IC0xOworfQorCit1bnNpZ25lZCBsbF9uYW1lX3RvX2luZGV4KGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY29uc3Qgc3RydWN0IGxsX2NhY2hlICppbTsKKwl1bnNpZ25lZCBpZHg7CisKKwlpZiAobmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWltID0gbGxfZ2V0X2J5X25hbWUobmFtZSk7CisJaWYgKGltKQorCQlyZXR1cm4gaW0tPmluZGV4OworCisJaWR4ID0gaWZfbmFtZXRvaW5kZXgobmFtZSk7CisJaWYgKGlkeCA9PSAwKQorCQlzc2NhbmYobmFtZSwgImlmJXUiLCAmaWR4KTsKKwlyZXR1cm4gaWR4OworfQorCit2b2lkIGxsX2luaXRfbWFwKHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoKQoreworCXN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CisKKwlpZiAoaW5pdGlhbGl6ZWQpCisJCXJldHVybjsKKworCWlmIChydG5sX3dpbGRkdW1wX3JlcXVlc3QocnRoLCBBRl9VTlNQRUMsIFJUTV9HRVRMSU5LKSA8IDApIHsKKwkJcGVycm9yKCJDYW5ub3Qgc2VuZCBkdW1wIHJlcXVlc3QiKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAocnRubF9kdW1wX2ZpbHRlcihydGgsIGxsX3JlbWVtYmVyX2luZGV4LCBOVUxMKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJEdW1wIHRlcm1pbmF0ZWRcbiIpOworCQlleGl0KDEpOworCX0KKworCWluaXRpYWxpemVkID0gMTsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2xpYi9sbF9wcm90by5jIGIvaXByb3V0ZTIvbGliL2xsX3Byb3RvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhkZjY4YwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2xpYi9sbF9wcm90by5jCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogbGxfcHJvdG8uYworICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInJ0X25hbWVzLmgiCisKKworI2RlZmluZSBfX1BGKGYsbikgeyBFVEhfUF8jI2YsICNuIH0sCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwlpbnQgaWQ7CisJY29uc3QgY2hhciAqbmFtZTsKK30gbGxwcm90b19uYW1lc1tdID0geworX19QRihMT09QLGxvb3ApCitfX1BGKFBVUCxwdXApCitfX1BGKFBVUEFULHB1cGF0KQorX19QRihJUCxpcCkKK19fUEYoWDI1LHgyNSkKK19fUEYoQVJQLGFycCkKK19fUEYoQlBRLGJwcSkKK19fUEYoSUVFRVBVUCxpZWVlcHVwKQorX19QRihJRUVFUFVQQVQsaWVlZXB1cGF0KQorX19QRihERUMsZGVjKQorX19QRihETkFfREwsZG5hX2RsKQorX19QRihETkFfUkMsZG5hX3JjKQorX19QRihETkFfUlQsZG5hX3J0KQorX19QRihMQVQsbGF0KQorX19QRihESUFHLGRpYWcpCitfX1BGKENVU1QsY3VzdCkKK19fUEYoU0NBLHNjYSkKK19fUEYoUkFSUCxyYXJwKQorX19QRihBVEFMSyxhdGFsaykKK19fUEYoQUFSUCxhYXJwKQorX19QRihJUFgsaXB4KQorX19QRihJUFY2LGlwdjYpCitfX1BGKFBQUF9ESVNDLHBwcF9kaXNjKQorX19QRihQUFBfU0VTLHBwcF9zZXMpCitfX1BGKEFUTU1QT0EsYXRtbXBvYSkKK19fUEYoQVRNRkFURSxhdG1mYXRlKQorX19QRig4MDJfMyw4MDJfMykKK19fUEYoQVgyNSxheDI1KQorX19QRihBTEwsYWxsKQorX19QRig4MDJfMiw4MDJfMikKK19fUEYoU05BUCxzbmFwKQorX19QRihERENNUCxkZGNtcCkKK19fUEYoV0FOX1BQUCx3YW5fcHBwKQorX19QRihQUFBfTVAscHBwX21wKQorX19QRihMT0NBTFRBTEssbG9jYWx0YWxrKQorX19QRihDQU4sY2FuKQorX19QRihQUFBUQUxLLHBwcHRhbGspCitfX1BGKFRSXzgwMl8yLHRyXzgwMl8yKQorX19QRihNT0JJVEVYLG1vYml0ZXgpCitfX1BGKENPTlRST0wsY29udHJvbCkKK19fUEYoSVJEQSxpcmRhKQorX19QRihFQ09ORVQsZWNvbmV0KQorX19QRihUSVBDLHRpcGMpCitfX1BGKEFPRSxhb2UpCitfX1BGKDgwMjFRLDgwMi4xUSkKK19fUEYoODAyMUFELDgwMi4xYWQpCisKK3sgMHg4MTAwLCAiODAyLjFRIiB9LAoreyAweDg4Y2MsICJMTERQIiB9LAoreyBFVEhfUF9JUCwgImlwdjQiIH0sCit9OworI3VuZGVmIF9fUEYKKworCitjb25zdCBjaGFyICogbGxfcHJvdG9fbjJhKHVuc2lnbmVkIHNob3J0IGlkLCBjaGFyICpidWYsIGludCBsZW4pCit7CisgICAgICAgIGludCBpOworCisJaWQgPSBudG9ocyhpZCk7CisKKyAgICAgICAgZm9yIChpPTA7IGk8c2l6ZW9mKGxscHJvdG9fbmFtZXMpL3NpemVvZihsbHByb3RvX25hbWVzWzBdKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgIGlmIChsbHByb3RvX25hbWVzW2ldLmlkID09IGlkKQorCQkJcmV0dXJuIGxscHJvdG9fbmFtZXNbaV0ubmFtZTsKKwl9CisgICAgICAgIHNucHJpbnRmKGJ1ZiwgbGVuLCAiWyVkXSIsIGlkKTsKKyAgICAgICAgcmV0dXJuIGJ1ZjsKK30KKworaW50IGxsX3Byb3RvX2Eybih1bnNpZ25lZCBzaG9ydCAqaWQsIGNvbnN0IGNoYXIgKmJ1ZikKK3sKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaT0wOyBpIDwgc2l6ZW9mKGxscHJvdG9fbmFtZXMpL3NpemVvZihsbHByb3RvX25hbWVzWzBdKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgIGlmIChzdHJjYXNlY21wKGxscHJvdG9fbmFtZXNbaV0ubmFtZSwgYnVmKSA9PSAwKSB7CisJCQkgKmlkID0gaHRvbnMobGxwcm90b19uYW1lc1tpXS5pZCk7CisJCQkgcmV0dXJuIDA7CisJCSB9CisJfQorCWlmIChnZXRfdTE2KGlkLCBidWYsIDApKQorCQlyZXR1cm4gLTE7CisJKmlkID0gaHRvbnMoKmlkKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2xpYi9sbF90eXBlcy5jIGIvaXByb3V0ZTIvbGliL2xsX3R5cGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM1YmY4YgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2xpYi9sbF90eXBlcy5jCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogbGxfdHlwZXMuYworICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisKKyNpbmNsdWRlICJydF9uYW1lcy5oIgorCitjb25zdCBjaGFyICogbGxfdHlwZV9uMmEoaW50IHR5cGUsIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKyNkZWZpbmUgX19QRihmLG4pIHsgQVJQSFJEXyMjZiwgI24gfSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCWludCB0eXBlOworCWNvbnN0IGNoYXIgKm5hbWU7Cit9IGFycGhyZF9uYW1lc1tdID0geworeyAwLCAiZ2VuZXJpYyIgfSwKK19fUEYoRVRIRVIsZXRoZXIpCitfX1BGKEVFVEhFUixlZXRoZXIpCitfX1BGKEFYMjUsYXgyNSkKK19fUEYoUFJPTkVULHByb25ldCkKK19fUEYoQ0hBT1MsY2hhb3MpCitfX1BGKElFRUU4MDIsaWVlZTgwMikKK19fUEYoQVJDTkVULGFyY25ldCkKK19fUEYoQVBQTEVUTEssYXRhbGspCitfX1BGKERMQ0ksZGxjaSkKK19fUEYoQVRNLGF0bSkKK19fUEYoTUVUUklDT00sbWV0cmljb20pCitfX1BGKElFRUUxMzk0LGllZWUxMzk0KQorX19QRihJTkZJTklCQU5ELGluZmluaWJhbmQpCitfX1BGKFNMSVAsc2xpcCkKK19fUEYoQ1NMSVAsY3NsaXApCitfX1BGKFNMSVA2LHNsaXA2KQorX19QRihDU0xJUDYsY3NsaXA2KQorX19QRihSU1JWRCxyc3J2ZCkKK19fUEYoQURBUFQsYWRhcHQpCitfX1BGKFJPU0Uscm9zZSkKK19fUEYoWDI1LHgyNSkKK19fUEYoSFdYMjUsaHd4MjUpCitfX1BGKENBTixjYW4pCitfX1BGKFBQUCxwcHApCitfX1BGKEhETEMsaGRsYykKK19fUEYoTEFQQixsYXBiKQorX19QRihERENNUCxkZGNtcCkKK19fUEYoUkFXSERMQyxyYXdoZGxjKQorX19QRihUVU5ORUwsaXBpcCkKK19fUEYoVFVOTkVMNix0dW5uZWw2KQorX19QRihGUkFELGZyYWQpCitfX1BGKFNLSVAsc2tpcCkKK19fUEYoTE9PUEJBQ0ssbG9vcGJhY2spCitfX1BGKExPQ0FMVExLLGx0YWxrKQorX19QRihGRERJLGZkZGkpCitfX1BGKEJJRixiaWYpCitfX1BGKFNJVCxzaXQpCitfX1BGKElQRERQLGlwL2RkcCkKK19fUEYoSVBHUkUsZ3JlKQorX19QRihQSU1SRUcscGltcmVnKQorX19QRihISVBQSSxoaXBwaSkKK19fUEYoQVNILGFzaCkKK19fUEYoRUNPTkVULGVjb25ldCkKK19fUEYoSVJEQSxpcmRhKQorX19QRihGQ1BQLGZjcHApCitfX1BGKEZDQUwsZmNhbCkKK19fUEYoRkNQTCxmY3BsKQorX19QRihGQ0ZBQlJJQyxmY2ZiMCkKK19fUEYoRkNGQUJSSUMrMSxmY2ZiMSkKK19fUEYoRkNGQUJSSUMrMixmY2ZiMikKK19fUEYoRkNGQUJSSUMrMyxmY2ZiMykKK19fUEYoRkNGQUJSSUMrNCxmY2ZiNCkKK19fUEYoRkNGQUJSSUMrNSxmY2ZiNSkKK19fUEYoRkNGQUJSSUMrNixmY2ZiNikKK19fUEYoRkNGQUJSSUMrNyxmY2ZiNykKK19fUEYoRkNGQUJSSUMrOCxmY2ZiOCkKK19fUEYoRkNGQUJSSUMrOSxmY2ZiOSkKK19fUEYoRkNGQUJSSUMrMTAsZmNmYjEwKQorX19QRihGQ0ZBQlJJQysxMSxmY2ZiMTEpCitfX1BGKEZDRkFCUklDKzEyLGZjZmIxMikKK19fUEYoSUVFRTgwMl9UUix0cikKK19fUEYoSUVFRTgwMjExLGllZWU4MDIuMTEpCitfX1BGKElFRUU4MDIxMV9QUklTTSxpZWVlODAyLjExL3ByaXNtKQorX19QRihJRUVFODAyMTFfUkFESU9UQVAsaWVlZTgwMi4xMS9yYWRpb3RhcCkKK19fUEYoSUVFRTgwMjE1NCwgaWVlZTgwMi4xNS40KQorX19QRihQSE9ORVQsIHBob25ldCkKK19fUEYoUEhPTkVUX1BJUEUsIHBob25ldF9waXBlKQorX19QRihDQUlGLCBjYWlmKQorX19QRihJUDZHUkUsIGdyZTYpCitfX1BGKE5FVExJTkssIG5ldGxpbmspCisKK19fUEYoTk9ORSwgbm9uZSkKK19fUEYoVk9JRCx2b2lkKQorfTsKKyN1bmRlZiBfX1BGCisKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaT0wOyBpPHNpemVvZihhcnBocmRfbmFtZXMpL3NpemVvZihhcnBocmRfbmFtZXNbMF0pOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgaWYgKGFycGhyZF9uYW1lc1tpXS50eXBlID09IHR5cGUpCisJCQlyZXR1cm4gYXJwaHJkX25hbWVzW2ldLm5hbWU7CisJfQorICAgICAgICBzbnByaW50ZihidWYsIGxlbiwgIlslZF0iLCB0eXBlKTsKKyAgICAgICAgcmV0dXJuIGJ1ZjsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2xpYi9tcGxzX250b3AuYyBiL2lwcm91dGUyL2xpYi9tcGxzX250b3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDVkNmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbGliL21wbHNfbnRvcC5jCkBAIC0wLDAgKzEsNDggQEAKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9tcGxzLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqbXBsc19udG9wMShjb25zdCBzdHJ1Y3QgbXBsc19sYWJlbCAqYWRkciwgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQoreworCXNpemVfdCBkZXN0bGVuID0gYnVmbGVuOworCWNoYXIgKmRlc3QgPSBidWY7CisJaW50IGNvdW50OworCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgTVBMU19NQVhfTEFCRUxTOyBjb3VudCsrKSB7CisJCXVpbnQzMl90IGVudHJ5ID0gbnRvaGwoYWRkcltjb3VudF0uZW50cnkpOworCQl1aW50MzJfdCBsYWJlbCA9IChlbnRyeSAmIE1QTFNfTFNfTEFCRUxfTUFTSykgPj4gTVBMU19MU19MQUJFTF9TSElGVDsKKwkJaW50IGxlbiA9IHNucHJpbnRmKGRlc3QsIGRlc3RsZW4sICIldSIsIGxhYmVsKTsKKworCQkvKiBJcyB0aGlzIHRoZSBlbmQ/ICovCisJCWlmIChlbnRyeSAmIE1QTFNfTFNfU19NQVNLKQorCQkJcmV0dXJuIGJ1ZjsKKworCisJCWRlc3QgKz0gbGVuOworCQlkZXN0bGVuIC09IGxlbjsKKwkJaWYgKGRlc3RsZW4pIHsKKwkJCSpkZXN0ID0gJy8nOworCQkJZGVzdCsrOworCQkJZGVzdGxlbi0tOworCQl9CisJfQorCWVycm5vID0gLUUyQklHOworCXJldHVybiBOVUxMOworfQorCitjb25zdCBjaGFyICptcGxzX250b3AoaW50IGFmLCBjb25zdCB2b2lkICphZGRyLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pCit7CisJc3dpdGNoKGFmKSB7CisJY2FzZSBBRl9NUExTOgorCQllcnJubyA9IDA7CisJCXJldHVybiBtcGxzX250b3AxKChzdHJ1Y3QgbXBsc19sYWJlbCAqKWFkZHIsIGJ1ZiwgYnVmbGVuKTsKKwlkZWZhdWx0OgorCQllcnJubyA9IEVBRk5PU1VQUE9SVDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2xpYi9tcGxzX3B0b24uYyBiL2lwcm91dGUyL2xpYi9tcGxzX3B0b24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDQ0OGNmCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbGliL21wbHNfcHRvbi5jCkBAIC0wLDAgKzEsNTggQEAKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9tcGxzLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorCisKK3N0YXRpYyBpbnQgbXBsc19wdG9uMShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgbXBsc19sYWJlbCAqYWRkcikKK3sKKwljaGFyICplbmRwOworCXVuc2lnbmVkIGNvdW50OworCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgTVBMU19NQVhfTEFCRUxTOyBjb3VudCsrKSB7CisJCXVuc2lnbmVkIGxvbmcgbGFiZWw7CisKKwkJbGFiZWwgPSBzdHJ0b3VsKG5hbWUsICZlbmRwLCAwKTsKKwkJLyogRmFpbCB3aGVuIHRoZSBsYWJlbCB2YWx1ZSBpcyBvdXQgb3IgcmFuZ2UgKi8KKwkJaWYgKGxhYmVsID49ICgxIDw8IDIwKSkKKwkJCXJldHVybiAwOworCisJCWlmIChlbmRwID09IG5hbWUpIC8qIG5vIGRpZ2l0cyAqLworCQkJcmV0dXJuIDA7CisKKwkJYWRkci0+ZW50cnkgPSBodG9ubChsYWJlbCA8PCBNUExTX0xTX0xBQkVMX1NISUZUKTsKKwkJaWYgKCplbmRwID09ICdcMCcpIHsKKwkJCWFkZHItPmVudHJ5IHw9IGh0b25sKDEgPDwgTVBMU19MU19TX1NISUZUKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJLyogQmFkIGNoYXJhY3RlciBpbiB0aGUgYWRkcmVzcyAqLworCQlpZiAoKmVuZHAgIT0gJy8nKQorCQkJcmV0dXJuIDA7CisKKwkJbmFtZSA9IGVuZHAgKyAxOworCQlhZGRyICs9IDE7CisJfQorCS8qIFRoZSBhZGRyZXNzIHdhcyB0b28gbG9uZyAqLworCXJldHVybiAwOworfQorCitpbnQgbXBsc19wdG9uKGludCBhZiwgY29uc3QgY2hhciAqc3JjLCB2b2lkICphZGRyKQoreworCWludCBlcnI7CisKKwlzd2l0Y2goYWYpIHsKKwljYXNlIEFGX01QTFM6CisJCWVycm5vID0gMDsKKwkJZXJyID0gbXBsc19wdG9uMShzcmMsIChzdHJ1Y3QgbXBsc19sYWJlbCAqKWFkZHIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnJubyA9IEVBRk5PU1VQUE9SVDsKKwkJZXJyID0gLTE7CisJfQorCisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2xpYi9uYW1lcy5jIGIvaXByb3V0ZTIvbGliL25hbWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I1YjBiMQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2xpYi9uYW1lcy5jCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogbmFtZXMuYwkJZGIgbmFtZXMKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgIm5hbWVzLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKworI2RlZmluZSBNQVhfRU5UUklFUyAgMjU2CisjZGVmaW5lIE5BTUVfTUFYX0xFTiA1MTIKKworc3RhdGljIGludCByZWFkX2lkX25hbWUoRklMRSAqZnAsIGludCAqaWQsIGNoYXIgKm5hbWUpCit7CisJY2hhciBidWZbTkFNRV9NQVhfTEVOXTsKKwlpbnQgbWluLCBtYWo7CisKKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApKSB7CisJCWNoYXIgKnAgPSBidWY7CisKKwkJd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKQorCQkJcCsrOworCisJCWlmICgqcCA9PSAnIycgfHwgKnAgPT0gJ1xuJyB8fCAqcCA9PSAwKQorCQkJY29udGludWU7CisKKwkJaWYgKHNzY2FuZihwLCAiJXg6JXggJXNcbiIsICZtYWosICZtaW4sIG5hbWUpID09IDMpIHsKKwkJCSppZCA9IChtYWogPDwgMTYpIHwgbWluOworCQl9IGVsc2UgaWYgKHNzY2FuZihwLCAiJXg6JXggJXMgIyIsICZtYWosICZtaW4sIG5hbWUpID09IDMpIHsKKwkJCSppZCA9IChtYWogPDwgMTYpIHwgbWluOworCQl9IGVsc2UgaWYgKHNzY2FuZihwLCAiMHgleCAlc1xuIiwgaWQsIG5hbWUpICE9IDIgJiYKKwkJCQlzc2NhbmYocCwgIjB4JXggJXMgIyIsIGlkLCBuYW1lKSAhPSAyICYmCisJCQkJc3NjYW5mKHAsICIlZCAlc1xuIiwgaWQsIG5hbWUpICE9IDIgJiYKKwkJCQlzc2NhbmYocCwgIiVkICVzICMiLCBpZCwgbmFtZSkgIT0gMikgeworCQkJc3RyY3B5KG5hbWUsIHApOworCQkJcmV0dXJuIC0xOworCQl9CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZGJfbmFtZXMgKmRiX25hbWVzX2FsbG9jKHZvaWQpCit7CisJc3RydWN0IGRiX25hbWVzICpkYjsKKworCWRiID0gbWFsbG9jKHNpemVvZigqZGIpKTsKKwlpZiAoIWRiKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbXNldChkYiwgMCwgc2l6ZW9mKCpkYikpOworCisJZGItPnNpemUgPSBNQVhfRU5UUklFUzsKKwlkYi0+aGFzaCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGRiX2VudHJ5ICopICogZGItPnNpemUpOworCW1lbXNldChkYi0+aGFzaCwgMCwgc2l6ZW9mKHN0cnVjdCBkYl9lbnRyeSAqKSAqIGRiLT5zaXplKTsKKworCXJldHVybiBkYjsKK30KKworaW50IGRiX25hbWVzX2xvYWQoc3RydWN0IGRiX25hbWVzICpkYiwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3QgZGJfZW50cnkgKmVudHJ5OworCUZJTEUgKmZwOworCWludCBpZDsKKwljaGFyIG5hbWVidWZbTkFNRV9NQVhfTEVOXSA9IHswfTsKKwlpbnQgcmV0ID0gLTE7CisKKwlmcCA9IGZvcGVuKHBhdGgsICJyIik7CisJaWYgKCFmcCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwl3aGlsZSAoKHJldCA9IHJlYWRfaWRfbmFtZShmcCwgJmlkLCAmbmFtZWJ1ZlswXSkpKSB7CisJCWlmIChyZXQgPT0gLTEpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiRGF0YWJhc2UgJXMgaXMgY29ycnVwdGVkIGF0ICVzXG4iLAorCQkJCQlwYXRoLCBuYW1lYnVmKTsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlyZXQgPSAtMTsKKworCQlpZiAoaWQgPCAwKQorCQkJY29udGludWU7CisKKwkJZW50cnkgPSBtYWxsb2Moc2l6ZW9mKCplbnRyeSkpOworCQlpZiAoIWVudHJ5KQorCQkJZ290byBFeGl0OworCisJCWVudHJ5LT5uYW1lID0gc3RyZHVwKG5hbWVidWYpOworCQlpZiAoIWVudHJ5LT5uYW1lKSB7CisJCQlmcmVlKGVudHJ5KTsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCisJCWVudHJ5LT5pZCAgID0gaWQ7CisJCWVudHJ5LT5uZXh0ID0gZGItPmhhc2hbaWQgJiAoZGItPnNpemUgLSAxKV07CisJCWRiLT5oYXNoW2lkICYgKGRiLT5zaXplIC0gMSldID0gZW50cnk7CisJfQorCXJldCA9IDA7CisKK0V4aXQ6CisJZmNsb3NlKGZwKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGRiX25hbWVzX2ZyZWUoc3RydWN0IGRiX25hbWVzICpkYikKK3sKKwlpbnQgaTsKKworCWlmICghZGIpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBkYi0+c2l6ZTsgaSsrKSB7CisJCXN0cnVjdCBkYl9lbnRyeSAqZW50cnkgPSBkYi0+aGFzaFtpXTsKKworCQl3aGlsZSAoZW50cnkpIHsKKwkJCXN0cnVjdCBkYl9lbnRyeSAqbmV4dCA9IGVudHJ5LT5uZXh0OworCisJCQlmcmVlKGVudHJ5LT5uYW1lKTsKKwkJCWZyZWUoZW50cnkpOworCQkJZW50cnkgPSBuZXh0OworCQl9CisJfQorCisJZnJlZShkYi0+aGFzaCk7CisJZnJlZShkYik7Cit9CisKK2NoYXIgKmlkX3RvX25hbWUoc3RydWN0IGRiX25hbWVzICpkYiwgaW50IGlkLCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBkYl9lbnRyeSAqZW50cnk7CisKKwlpZiAoIWRiKQorCQlyZXR1cm4gTlVMTDsKKworCWVudHJ5ID0gZGItPmhhc2hbaWQgJiAoZGItPnNpemUgLSAxKV07CisJd2hpbGUgKGVudHJ5ICYmIGVudHJ5LT5pZCAhPSBpZCkKKwkJZW50cnkgPSBlbnRyeS0+bmV4dDsKKworCWlmIChlbnRyeSkgeworCQlzdHJuY3B5KG5hbWUsIGVudHJ5LT5uYW1lLCBJRE5BTUVfTUFYKTsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJc25wcmludGYobmFtZSwgSUROQU1FX01BWCwgIiVkIiwgaWQpOworCXJldHVybiBOVUxMOworfQorCitpbnQgbmFtZV90b19pZChzdHJ1Y3QgZGJfbmFtZXMgKmRiLCBpbnQgKmlkLCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBkYl9lbnRyeSAqZW50cnk7CisJaW50IGk7CisKKwlpZiAoIWRiKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoZGItPmNhY2hlZCAmJiBzdHJjbXAoZGItPmNhY2hlZC0+bmFtZSwgbmFtZSkgPT0gMCkgeworCQkqaWQgPSBkYi0+Y2FjaGVkLT5pZDsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGRiLT5zaXplOyBpKyspIHsKKwkJZW50cnkgPSBkYi0+aGFzaFtpXTsKKwkJd2hpbGUgKGVudHJ5ICYmIHN0cmNtcChlbnRyeS0+bmFtZSwgbmFtZSkpCisJCQllbnRyeSA9IGVudHJ5LT5uZXh0OworCisJCWlmIChlbnRyeSkgeworCQkJZGItPmNhY2hlZCA9IGVudHJ5OworCQkJKmlkID0gZW50cnktPmlkOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9saWIvbmFtZXNwYWNlLmMgYi9pcHJvdXRlMi9saWIvbmFtZXNwYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBiNTEzOAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2xpYi9uYW1lc3BhY2UuYwpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIG5hbWVzcGFjZS5jCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgIm5hbWVzcGFjZS5oIgorCitzdGF0aWMgdm9pZCBiaW5kX2V0Yyhjb25zdCBjaGFyICpuYW1lKQoreworCWNoYXIgZXRjX25ldG5zX3BhdGhbUEFUSF9NQVhdOworCWNoYXIgbmV0bnNfbmFtZVtQQVRIX01BWF07CisJY2hhciBldGNfbmFtZVtQQVRIX01BWF07CisJc3RydWN0IGRpcmVudCAqZW50cnk7CisJRElSICpkaXI7CisKKwlzbnByaW50ZihldGNfbmV0bnNfcGF0aCwgc2l6ZW9mKGV0Y19uZXRuc19wYXRoKSwgIiVzLyVzIiwgTkVUTlNfRVRDX0RJUiwgbmFtZSk7CisJZGlyID0gb3BlbmRpcihldGNfbmV0bnNfcGF0aCk7CisJaWYgKCFkaXIpCisJCXJldHVybjsKKworCXdoaWxlICgoZW50cnkgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKKwkJaWYgKHN0cmNtcChlbnRyeS0+ZF9uYW1lLCAiLiIpID09IDApCisJCQljb250aW51ZTsKKwkJaWYgKHN0cmNtcChlbnRyeS0+ZF9uYW1lLCAiLi4iKSA9PSAwKQorCQkJY29udGludWU7CisJCXNucHJpbnRmKG5ldG5zX25hbWUsIHNpemVvZihuZXRuc19uYW1lKSwgIiVzLyVzIiwgZXRjX25ldG5zX3BhdGgsIGVudHJ5LT5kX25hbWUpOworCQlzbnByaW50ZihldGNfbmFtZSwgc2l6ZW9mKGV0Y19uYW1lKSwgIi9ldGMvJXMiLCBlbnRyeS0+ZF9uYW1lKTsKKwkJaWYgKG1vdW50KG5ldG5zX25hbWUsIGV0Y19uYW1lLCAibm9uZSIsIE1TX0JJTkQsIE5VTEwpIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJCaW5kICVzIC0+ICVzIGZhaWxlZDogJXNcbiIsCisJCQkJbmV0bnNfbmFtZSwgZXRjX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCX0KKwl9CisJY2xvc2VkaXIoZGlyKTsKK30KKworaW50IG5ldG5zX3N3aXRjaChjaGFyICpuYW1lKQoreworCWNoYXIgbmV0X3BhdGhbUEFUSF9NQVhdOworCWludCBuZXRuczsKKworCXNucHJpbnRmKG5ldF9wYXRoLCBzaXplb2YobmV0X3BhdGgpLCAiJXMvJXMiLCBORVROU19SVU5fRElSLCBuYW1lKTsKKwluZXRucyA9IG9wZW4obmV0X3BhdGgsIE9fUkRPTkxZIHwgT19DTE9FWEVDKTsKKwlpZiAobmV0bnMgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9wZW4gbmV0d29yayBuYW1lc3BhY2UgXCIlc1wiOiAlc1xuIiwKKwkJCW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoc2V0bnMobmV0bnMsIENMT05FX05FV05FVCkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAic2V0dGluZyB0aGUgbmV0d29yayBuYW1lc3BhY2UgXCIlc1wiIGZhaWxlZDogJXNcbiIsCisJCQluYW1lLCBzdHJlcnJvcihlcnJubykpOworCQljbG9zZShuZXRucyk7CisJCXJldHVybiAtMTsKKwl9CisJY2xvc2UobmV0bnMpOworCisJaWYgKHVuc2hhcmUoQ0xPTkVfTkVXTlMpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInVuc2hhcmUgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKwkvKiBEb24ndCBsZXQgYW55IG1vdW50cyBwcm9wYWdhdGUgYmFjayB0byB0aGUgcGFyZW50ICovCisJaWYgKG1vdW50KCIiLCAiLyIsICJub25lIiwgTVNfU0xBVkUgfCBNU19SRUMsIE5VTEwpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiXCJtb3VudCAtLW1ha2UtcnNsYXZlIC9cIiBmYWlsZWQ6ICVzXG4iLAorCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKwkvKiBNb3VudCBhIHZlcnNpb24gb2YgL3N5cyB0aGF0IGRlc2NyaWJlcyB0aGUgbmV0d29yayBuYW1lc3BhY2UgKi8KKwlpZiAodW1vdW50MigiL3N5cyIsIE1OVF9ERVRBQ0gpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInVtb3VudCBvZiAvc3lzIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKG1vdW50KG5hbWUsICIvc3lzIiwgInN5c2ZzIiwgMCwgTlVMTCkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAibW91bnQgb2YgL3N5cyBmYWlsZWQ6ICVzXG4iLHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBTZXR1cCBiaW5kIG1vdW50cyBmb3IgY29uZmlnIGZpbGVzIGluIC9ldGMgKi8KKwliaW5kX2V0YyhuYW1lKTsKKwlyZXR1cm4gMDsKK30KKworaW50IG5ldG5zX2dldF9mZChjb25zdCBjaGFyICpuYW1lKQoreworCWNoYXIgcGF0aGJ1ZltQQVRIX01BWF07CisJY29uc3QgY2hhciAqcGF0aCwgKnB0cjsKKworCXBhdGggPSBuYW1lOworCXB0ciA9IHN0cmNocihuYW1lLCAnLycpOworCWlmICghcHRyKSB7CisJCXNucHJpbnRmKHBhdGhidWYsIHNpemVvZihwYXRoYnVmKSwgIiVzLyVzIiwKKwkJCU5FVE5TX1JVTl9ESVIsIG5hbWUgKTsKKwkJcGF0aCA9IHBhdGhidWY7CisJfQorCXJldHVybiBvcGVuKHBhdGgsIE9fUkRPTkxZKTsKK30KKworaW50IG5ldG5zX2ZvcmVhY2goaW50ICgqZnVuYykoY2hhciAqbnNuYW1lLCB2b2lkICphcmcpLCB2b2lkICphcmcpCit7CisJRElSICpkaXI7CisJc3RydWN0IGRpcmVudCAqZW50cnk7CisKKwlkaXIgPSBvcGVuZGlyKE5FVE5TX1JVTl9ESVIpOworCWlmICghZGlyKQorCQlyZXR1cm4gLTE7CisKKwl3aGlsZSAoKGVudHJ5ID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCWlmIChzdHJjbXAoZW50cnktPmRfbmFtZSwgIi4iKSA9PSAwKQorCQkJY29udGludWU7CisJCWlmIChzdHJjbXAoZW50cnktPmRfbmFtZSwgIi4uIikgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoZnVuYyhlbnRyeS0+ZF9uYW1lLCBhcmcpKQorCQkJYnJlYWs7CisJfQorCisJY2xvc2VkaXIoZGlyKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL2xpYi9ydF9uYW1lcy5jIGIvaXByb3V0ZTIvbGliL3J0X25hbWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZkMTdjMAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL2xpYi9ydF9uYW1lcy5jCkBAIC0wLDAgKzEsNjQ5IEBACisvKgorICogcnRfbmFtZXMuYwkJcnRuZXRsaW5rIG5hbWVzIERCLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisKKyNpbmNsdWRlICJydF9uYW1lcy5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKKyNkZWZpbmUgTkFNRV9NQVhfTEVOIDUxMgorCitzdHJ1Y3QgcnRubF9oYXNoX2VudHJ5IHsKKwlzdHJ1Y3QgcnRubF9oYXNoX2VudHJ5CSpuZXh0OworCWNvbnN0IGNoYXIJCSpuYW1lOworCXVuc2lnbmVkIGludAkJaWQ7Cit9OworCitzdGF0aWMgaW50IGZyZWFkX2lkX25hbWUoRklMRSAqZnAsIGludCAqaWQsIGNoYXIgKm5hbWVidWYpCit7CisJY2hhciBidWZbTkFNRV9NQVhfTEVOXTsKKworCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkpIHsKKwkJY2hhciAqcCA9IGJ1ZjsKKworCQl3aGlsZSAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcpCisJCQlwKys7CisKKwkJaWYgKCpwID09ICcjJyB8fCAqcCA9PSAnXG4nIHx8ICpwID09IDApCisJCQljb250aW51ZTsKKworCQlpZiAoc3NjYW5mKHAsICIweCV4ICVzXG4iLCBpZCwgbmFtZWJ1ZikgIT0gMiAmJgorCQkJCXNzY2FuZihwLCAiMHgleCAlcyAjIiwgaWQsIG5hbWVidWYpICE9IDIgJiYKKwkJCQlzc2NhbmYocCwgIiVkICVzXG4iLCBpZCwgbmFtZWJ1ZikgIT0gMiAmJgorCQkJCXNzY2FuZihwLCAiJWQgJXMgIyIsIGlkLCBuYW1lYnVmKSAhPSAyKSB7CisJCQlzdHJjcHkobmFtZWJ1ZiwgcCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorcnRubF9oYXNoX2luaXRpYWxpemUoY29uc3QgY2hhciAqZmlsZSwgc3RydWN0IHJ0bmxfaGFzaF9lbnRyeSAqKmhhc2gsIGludCBzaXplKQoreworCXN0cnVjdCBydG5sX2hhc2hfZW50cnkgKmVudHJ5OworCUZJTEUgKmZwOworCWludCBpZDsKKwljaGFyIG5hbWVidWZbTkFNRV9NQVhfTEVOXSA9IHswfTsKKwlpbnQgcmV0OworCisJZnAgPSBmb3BlbihmaWxlLCAiciIpOworCWlmICghZnApCisJCXJldHVybjsKKworCXdoaWxlICgocmV0ID0gZnJlYWRfaWRfbmFtZShmcCwgJmlkLCAmbmFtZWJ1ZlswXSkpKSB7CisJCWlmIChyZXQgPT0gLTEpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiRGF0YWJhc2UgJXMgaXMgY29ycnVwdGVkIGF0ICVzXG4iLAorCQkJCQlmaWxlLCBuYW1lYnVmKTsKKwkJCWZjbG9zZShmcCk7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoaWQgPCAwKQorCQkJY29udGludWU7CisKKwkJZW50cnkgPSBtYWxsb2Moc2l6ZW9mKCplbnRyeSkpOworCQllbnRyeS0+aWQgICA9IGlkOworCQllbnRyeS0+bmFtZSA9IHN0cmR1cChuYW1lYnVmKTsKKwkJZW50cnktPm5leHQgPSBoYXNoW2lkICYgKHNpemUgLSAxKV07CisJCWhhc2hbaWQgJiAoc2l6ZSAtIDEpXSA9IGVudHJ5OworCX0KKwlmY2xvc2UoZnApOworfQorCitzdGF0aWMgdm9pZCBydG5sX3RhYl9pbml0aWFsaXplKGNvbnN0IGNoYXIgKmZpbGUsIGNoYXIgKip0YWIsIGludCBzaXplKQoreworCUZJTEUgKmZwOworCWludCBpZDsKKwljaGFyIG5hbWVidWZbTkFNRV9NQVhfTEVOXSA9IHswfTsKKwlpbnQgcmV0OworCisJZnAgPSBmb3BlbihmaWxlLCAiciIpOworCWlmICghZnApCisJCXJldHVybjsKKworCXdoaWxlICgocmV0ID0gZnJlYWRfaWRfbmFtZShmcCwgJmlkLCAmbmFtZWJ1ZlswXSkpKSB7CisJCWlmIChyZXQgPT0gLTEpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiRGF0YWJhc2UgJXMgaXMgY29ycnVwdGVkIGF0ICVzXG4iLAorCQkJCQlmaWxlLCBuYW1lYnVmKTsKKwkJCWZjbG9zZShmcCk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGlkIDwgMCB8fCBpZCA+IHNpemUpCisJCQljb250aW51ZTsKKworCQl0YWJbaWRdID0gc3RyZHVwKG5hbWVidWYpOworCX0KKwlmY2xvc2UoZnApOworfQorCitzdGF0aWMgY2hhciAqcnRubF9ydHByb3RfdGFiWzI1Nl0gPSB7CisJW1JUUFJPVF9VTlNQRUNdICAgPSAibm9uZSIsCisJW1JUUFJPVF9SRURJUkVDVF0gPSAicmVkaXJlY3QiLAorCVtSVFBST1RfS0VSTkVMXQkgID0gImtlcm5lbCIsCisJW1JUUFJPVF9CT09UXQkgID0gImJvb3QiLAorCVtSVFBST1RfU1RBVElDXQkgID0gInN0YXRpYyIsCisKKwlbUlRQUk9UX0dBVEVEXQkgID0gImdhdGVkIiwKKwlbUlRQUk9UX1JBXQkgID0gInJhIiwKKwlbUlRQUk9UX01SVF0JICA9ICJtcnQiLAorCVtSVFBST1RfWkVCUkFdCSAgPSAiemVicmEiLAorCVtSVFBST1RfQklSRF0JICA9ICJiaXJkIiwKKwlbUlRQUk9UX0JBQkVMXQkgID0gImJhYmVsIiwKKwlbUlRQUk9UX0ROUk9VVEVEXSA9ICJkbnJvdXRlZCIsCisJW1JUUFJPVF9YT1JQXQkgID0gInhvcnAiLAorCVtSVFBST1RfTlRLXQkgID0gIm50ayIsCisJW1JUUFJPVF9ESENQXQkgID0gImRoY3AiLAorfTsKKworCitzdGF0aWMgaW50IHJ0bmxfcnRwcm90X2luaXQ7CisKK3N0YXRpYyB2b2lkIHJ0bmxfcnRwcm90X2luaXRpYWxpemUodm9pZCkKK3sKKwlydG5sX3J0cHJvdF9pbml0ID0gMTsKKwlydG5sX3RhYl9pbml0aWFsaXplKENPTkZESVIgIi9ydF9wcm90b3MiLAorCQkJICAgIHJ0bmxfcnRwcm90X3RhYiwgMjU2KTsKK30KKworY29uc3QgY2hhciAqcnRubF9ydHByb3RfbjJhKGludCBpZCwgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCWlmIChpZCA8IDAgfHwgaWQgPj0gMjU2KSB7CisJCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJXUiLCBpZCk7CisJCXJldHVybiBidWY7CisJfQorCWlmICghcnRubF9ydHByb3RfdGFiW2lkXSkgeworCQlpZiAoIXJ0bmxfcnRwcm90X2luaXQpCisJCQlydG5sX3J0cHJvdF9pbml0aWFsaXplKCk7CisJfQorCWlmIChydG5sX3J0cHJvdF90YWJbaWRdKQorCQlyZXR1cm4gcnRubF9ydHByb3RfdGFiW2lkXTsKKwlzbnByaW50ZihidWYsIGxlbiwgIiV1IiwgaWQpOworCXJldHVybiBidWY7Cit9CisKK2ludCBydG5sX3J0cHJvdF9hMm4oX191MzIgKmlkLCBjb25zdCBjaGFyICphcmcpCit7CisJc3RhdGljIGNoYXIgKmNhY2hlOworCXN0YXRpYyB1bnNpZ25lZCBsb25nIHJlczsKKwljaGFyICplbmQ7CisJaW50IGk7CisKKwlpZiAoY2FjaGUgJiYgc3RyY21wKGNhY2hlLCBhcmcpID09IDApIHsKKwkJKmlkID0gcmVzOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXJ0bmxfcnRwcm90X2luaXQpCisJCXJ0bmxfcnRwcm90X2luaXRpYWxpemUoKTsKKworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlpZiAocnRubF9ydHByb3RfdGFiW2ldICYmCisJCSAgICBzdHJjbXAocnRubF9ydHByb3RfdGFiW2ldLCBhcmcpID09IDApIHsKKwkJCWNhY2hlID0gcnRubF9ydHByb3RfdGFiW2ldOworCQkJcmVzID0gaTsKKwkJCSppZCA9IHJlczsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmVzID0gc3RydG91bChhcmcsICZlbmQsIDApOworCWlmICghZW5kIHx8IGVuZCA9PSBhcmcgfHwgKmVuZCB8fCByZXMgPiAyNTUpCisJCXJldHVybiAtMTsKKwkqaWQgPSByZXM7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGNoYXIgKnJ0bmxfcnRzY29wZV90YWJbMjU2XSA9IHsKKwlbUlRfU0NPUEVfVU5JVkVSU0VdCT0gImdsb2JhbCIsCisJW1JUX1NDT1BFX05PV0hFUkVdCT0gIm5vd2hlcmUiLAorCVtSVF9TQ09QRV9IT1NUXQkJPSAiaG9zdCIsCisJW1JUX1NDT1BFX0xJTktdCQk9ICJsaW5rIiwKKwlbUlRfU0NPUEVfU0lURV0JCT0gInNpdGUiLAorfTsKKworc3RhdGljIGludCBydG5sX3J0c2NvcGVfaW5pdDsKKworc3RhdGljIHZvaWQgcnRubF9ydHNjb3BlX2luaXRpYWxpemUodm9pZCkKK3sKKwlydG5sX3J0c2NvcGVfaW5pdCA9IDE7CisJcnRubF90YWJfaW5pdGlhbGl6ZShDT05GRElSICIvcnRfc2NvcGVzIiwKKwkJCSAgICBydG5sX3J0c2NvcGVfdGFiLCAyNTYpOworfQorCitjb25zdCBjaGFyICpydG5sX3J0c2NvcGVfbjJhKGludCBpZCwgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCWlmIChpZCA8IDAgfHwgaWQgPj0gMjU2KSB7CisJCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJWQiLCBpZCk7CisJCXJldHVybiBidWY7CisJfQorCisJaWYgKCFydG5sX3J0c2NvcGVfdGFiW2lkXSkgeworCQlpZiAoIXJ0bmxfcnRzY29wZV9pbml0KQorCQkJcnRubF9ydHNjb3BlX2luaXRpYWxpemUoKTsKKwl9CisKKwlpZiAocnRubF9ydHNjb3BlX3RhYltpZF0pCisJCXJldHVybiBydG5sX3J0c2NvcGVfdGFiW2lkXTsKKworCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJWQiLCBpZCk7CisJcmV0dXJuIGJ1ZjsKK30KKworaW50IHJ0bmxfcnRzY29wZV9hMm4oX191MzIgKmlkLCBjb25zdCBjaGFyICphcmcpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmNhY2hlOworCXN0YXRpYyB1bnNpZ25lZCBsb25nIHJlczsKKwljaGFyICplbmQ7CisJaW50IGk7CisKKwlpZiAoY2FjaGUgJiYgc3RyY21wKGNhY2hlLCBhcmcpID09IDApIHsKKwkJKmlkID0gcmVzOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXJ0bmxfcnRzY29wZV9pbml0KQorCQlydG5sX3J0c2NvcGVfaW5pdGlhbGl6ZSgpOworCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCWlmIChydG5sX3J0c2NvcGVfdGFiW2ldICYmCisJCSAgICBzdHJjbXAocnRubF9ydHNjb3BlX3RhYltpXSwgYXJnKSA9PSAwKSB7CisJCQljYWNoZSA9IHJ0bmxfcnRzY29wZV90YWJbaV07CisJCQlyZXMgPSBpOworCQkJKmlkID0gcmVzOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXMgPSBzdHJ0b3VsKGFyZywgJmVuZCwgMCk7CisJaWYgKCFlbmQgfHwgZW5kID09IGFyZyB8fCAqZW5kIHx8IHJlcyA+IDI1NSkKKwkJcmV0dXJuIC0xOworCSppZCA9IHJlczsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgY2hhciAqcnRubF9ydHJlYWxtX3RhYlsyNTZdID0geworCSJ1bmtub3duIiwKK307CisKK3N0YXRpYyBpbnQgcnRubF9ydHJlYWxtX2luaXQ7CisKK3N0YXRpYyB2b2lkIHJ0bmxfcnRyZWFsbV9pbml0aWFsaXplKHZvaWQpCit7CisJcnRubF9ydHJlYWxtX2luaXQgPSAxOworCXJ0bmxfdGFiX2luaXRpYWxpemUoQ09ORkRJUiAiL3J0X3JlYWxtcyIsCisJCQkgICAgcnRubF9ydHJlYWxtX3RhYiwgMjU2KTsKK30KKworY29uc3QgY2hhciAqcnRubF9ydHJlYWxtX24yYShpbnQgaWQsIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpZiAoaWQgPCAwIHx8IGlkID49IDI1NikgeworCQlzbnByaW50ZihidWYsIGxlbiwgIiVkIiwgaWQpOworCQlyZXR1cm4gYnVmOworCX0KKwlpZiAoIXJ0bmxfcnRyZWFsbV90YWJbaWRdKSB7CisJCWlmICghcnRubF9ydHJlYWxtX2luaXQpCisJCQlydG5sX3J0cmVhbG1faW5pdGlhbGl6ZSgpOworCX0KKwlpZiAocnRubF9ydHJlYWxtX3RhYltpZF0pCisJCXJldHVybiBydG5sX3J0cmVhbG1fdGFiW2lkXTsKKwlzbnByaW50ZihidWYsIGxlbiwgIiVkIiwgaWQpOworCXJldHVybiBidWY7Cit9CisKKworaW50IHJ0bmxfcnRyZWFsbV9hMm4oX191MzIgKmlkLCBjb25zdCBjaGFyICphcmcpCit7CisJc3RhdGljIGNoYXIgKmNhY2hlOworCXN0YXRpYyB1bnNpZ25lZCBsb25nIHJlczsKKwljaGFyICplbmQ7CisJaW50IGk7CisKKwlpZiAoY2FjaGUgJiYgc3RyY21wKGNhY2hlLCBhcmcpID09IDApIHsKKwkJKmlkID0gcmVzOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXJ0bmxfcnRyZWFsbV9pbml0KQorCQlydG5sX3J0cmVhbG1faW5pdGlhbGl6ZSgpOworCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCWlmIChydG5sX3J0cmVhbG1fdGFiW2ldICYmCisJCSAgICBzdHJjbXAocnRubF9ydHJlYWxtX3RhYltpXSwgYXJnKSA9PSAwKSB7CisJCQljYWNoZSA9IHJ0bmxfcnRyZWFsbV90YWJbaV07CisJCQlyZXMgPSBpOworCQkJKmlkID0gcmVzOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXMgPSBzdHJ0b3VsKGFyZywgJmVuZCwgMCk7CisJaWYgKCFlbmQgfHwgZW5kID09IGFyZyB8fCAqZW5kIHx8IHJlcyA+IDI1NSkKKwkJcmV0dXJuIC0xOworCSppZCA9IHJlczsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IHJ0bmxfaGFzaF9lbnRyeSBkZmx0X3RhYmxlX2VudHJ5ICA9IHsgLm5hbWUgPSAiZGVmYXVsdCIgfTsKK3N0YXRpYyBzdHJ1Y3QgcnRubF9oYXNoX2VudHJ5IG1haW5fdGFibGVfZW50cnkgID0geyAubmFtZSA9ICJtYWluIiB9Oworc3RhdGljIHN0cnVjdCBydG5sX2hhc2hfZW50cnkgbG9jYWxfdGFibGVfZW50cnkgPSB7IC5uYW1lID0gImxvY2FsIiB9OworCitzdGF0aWMgc3RydWN0IHJ0bmxfaGFzaF9lbnRyeSAqcnRubF9ydHRhYmxlX2hhc2hbMjU2XSA9IHsKKwlbUlRfVEFCTEVfREVGQVVMVF0gPSAmZGZsdF90YWJsZV9lbnRyeSwKKwlbUlRfVEFCTEVfTUFJTl0gICAgPSAmbWFpbl90YWJsZV9lbnRyeSwKKwlbUlRfVEFCTEVfTE9DQUxdICAgPSAmbG9jYWxfdGFibGVfZW50cnksCit9OworCitzdGF0aWMgaW50IHJ0bmxfcnR0YWJsZV9pbml0OworCitzdGF0aWMgdm9pZCBydG5sX3J0dGFibGVfaW5pdGlhbGl6ZSh2b2lkKQoreworCXN0cnVjdCBkaXJlbnQgKmRlOworCURJUiAqZDsKKwlpbnQgaTsKKworCXJ0bmxfcnR0YWJsZV9pbml0ID0gMTsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJaWYgKHJ0bmxfcnR0YWJsZV9oYXNoW2ldKQorCQkJcnRubF9ydHRhYmxlX2hhc2hbaV0tPmlkID0gaTsKKwl9CisJcnRubF9oYXNoX2luaXRpYWxpemUoQ09ORkRJUiAiL3J0X3RhYmxlcyIsCisJCQkgICAgIHJ0bmxfcnR0YWJsZV9oYXNoLCAyNTYpOworCisJZCA9IG9wZW5kaXIoQ09ORkRJUiAiL3J0X3RhYmxlcy5kIik7CisJaWYgKCFkKQorCQlyZXR1cm47CisKKwl3aGlsZSAoKGRlID0gcmVhZGRpcihkKSkgIT0gTlVMTCkgeworCQljaGFyIHBhdGhbUEFUSF9NQVhdOworCQlzaXplX3QgbGVuOworCisJCWlmICgqZGUtPmRfbmFtZSA9PSAnLicpCisJCQljb250aW51ZTsKKworCQkvKiBvbmx5IGNvbnNpZGVyIGZpbGVuYW1lcyBlbmRpbmcgaW4gJy5jb25mJyAqLworCQlsZW4gPSBzdHJsZW4oZGUtPmRfbmFtZSk7CisJCWlmIChsZW4gPD0gNSkKKwkJCWNvbnRpbnVlOworCQlpZiAoc3RyY21wKGRlLT5kX25hbWUgKyBsZW4gLSA1LCAiLmNvbmYiKSkKKwkJCWNvbnRpbnVlOworCisJCXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwKKwkJCSBDT05GRElSICIvcnRfdGFibGVzLmQvJXMiLCBkZS0+ZF9uYW1lKTsKKwkJcnRubF9oYXNoX2luaXRpYWxpemUocGF0aCwgcnRubF9ydHRhYmxlX2hhc2gsIDI1Nik7CisJfQorCWNsb3NlZGlyKGQpOworfQorCitjb25zdCBjaGFyICpydG5sX3J0dGFibGVfbjJhKF9fdTMyIGlkLCBjaGFyICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IHJ0bmxfaGFzaF9lbnRyeSAqZW50cnk7CisKKwlpZiAoaWQgPiBSVF9UQUJMRV9NQVgpIHsKKwkJc25wcmludGYoYnVmLCBsZW4sICIldSIsIGlkKTsKKwkJcmV0dXJuIGJ1ZjsKKwl9CisJaWYgKCFydG5sX3J0dGFibGVfaW5pdCkKKwkJcnRubF9ydHRhYmxlX2luaXRpYWxpemUoKTsKKwllbnRyeSA9IHJ0bmxfcnR0YWJsZV9oYXNoW2lkICYgMjU1XTsKKwl3aGlsZSAoZW50cnkgJiYgZW50cnktPmlkICE9IGlkKQorCQllbnRyeSA9IGVudHJ5LT5uZXh0OworCWlmIChlbnRyeSkKKwkJcmV0dXJuIGVudHJ5LT5uYW1lOworCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJXUiLCBpZCk7CisJcmV0dXJuIGJ1ZjsKK30KKworaW50IHJ0bmxfcnR0YWJsZV9hMm4oX191MzIgKmlkLCBjb25zdCBjaGFyICphcmcpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmNhY2hlOworCXN0YXRpYyB1bnNpZ25lZCBsb25nIHJlczsKKwlzdHJ1Y3QgcnRubF9oYXNoX2VudHJ5ICplbnRyeTsKKwljaGFyICplbmQ7CisJX191MzIgaTsKKworCWlmIChjYWNoZSAmJiBzdHJjbXAoY2FjaGUsIGFyZykgPT0gMCkgeworCQkqaWQgPSByZXM7CisJCXJldHVybiAwOworCX0KKworCWlmICghcnRubF9ydHRhYmxlX2luaXQpCisJCXJ0bmxfcnR0YWJsZV9pbml0aWFsaXplKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJZW50cnkgPSBydG5sX3J0dGFibGVfaGFzaFtpXTsKKwkJd2hpbGUgKGVudHJ5ICYmIHN0cmNtcChlbnRyeS0+bmFtZSwgYXJnKSkKKwkJCWVudHJ5ID0gZW50cnktPm5leHQ7CisJCWlmIChlbnRyeSkgeworCQkJY2FjaGUgPSBlbnRyeS0+bmFtZTsKKwkJCXJlcyA9IGVudHJ5LT5pZDsKKwkJCSppZCA9IHJlczsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaSA9IHN0cnRvdWwoYXJnLCAmZW5kLCAwKTsKKwlpZiAoIWVuZCB8fCBlbmQgPT0gYXJnIHx8ICplbmQgfHwgaSA+IFJUX1RBQkxFX01BWCkKKwkJcmV0dXJuIC0xOworCSppZCA9IGk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGNoYXIgKnJ0bmxfcnRkc2ZpZWxkX3RhYlsyNTZdID0geworCSIwIiwKK307CisKK3N0YXRpYyBpbnQgcnRubF9ydGRzZmllbGRfaW5pdDsKKworc3RhdGljIHZvaWQgcnRubF9ydGRzZmllbGRfaW5pdGlhbGl6ZSh2b2lkKQoreworCXJ0bmxfcnRkc2ZpZWxkX2luaXQgPSAxOworCXJ0bmxfdGFiX2luaXRpYWxpemUoQ09ORkRJUiAiL3J0X2RzZmllbGQiLAorCQkJICAgIHJ0bmxfcnRkc2ZpZWxkX3RhYiwgMjU2KTsKK30KKworY29uc3QgY2hhciAqcnRubF9kc2ZpZWxkX24yYShpbnQgaWQsIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpZiAoaWQgPCAwIHx8IGlkID49IDI1NikgeworCQlzbnByaW50ZihidWYsIGxlbiwgIiVkIiwgaWQpOworCQlyZXR1cm4gYnVmOworCX0KKwlpZiAoIXJ0bmxfcnRkc2ZpZWxkX3RhYltpZF0pIHsKKwkJaWYgKCFydG5sX3J0ZHNmaWVsZF9pbml0KQorCQkJcnRubF9ydGRzZmllbGRfaW5pdGlhbGl6ZSgpOworCX0KKwlpZiAocnRubF9ydGRzZmllbGRfdGFiW2lkXSkKKwkJcmV0dXJuIHJ0bmxfcnRkc2ZpZWxkX3RhYltpZF07CisJc25wcmludGYoYnVmLCBsZW4sICIweCUwMngiLCBpZCk7CisJcmV0dXJuIGJ1ZjsKK30KKworCitpbnQgcnRubF9kc2ZpZWxkX2EybihfX3UzMiAqaWQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKwlzdGF0aWMgY2hhciAqY2FjaGU7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVzOworCWNoYXIgKmVuZDsKKwlpbnQgaTsKKworCWlmIChjYWNoZSAmJiBzdHJjbXAoY2FjaGUsIGFyZykgPT0gMCkgeworCQkqaWQgPSByZXM7CisJCXJldHVybiAwOworCX0KKworCWlmICghcnRubF9ydGRzZmllbGRfaW5pdCkKKwkJcnRubF9ydGRzZmllbGRfaW5pdGlhbGl6ZSgpOworCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCWlmIChydG5sX3J0ZHNmaWVsZF90YWJbaV0gJiYKKwkJICAgIHN0cmNtcChydG5sX3J0ZHNmaWVsZF90YWJbaV0sIGFyZykgPT0gMCkgeworCQkJY2FjaGUgPSBydG5sX3J0ZHNmaWVsZF90YWJbaV07CisJCQlyZXMgPSBpOworCQkJKmlkID0gcmVzOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXMgPSBzdHJ0b3VsKGFyZywgJmVuZCwgMTYpOworCWlmICghZW5kIHx8IGVuZCA9PSBhcmcgfHwgKmVuZCB8fCByZXMgPiAyNTUpCisJCXJldHVybiAtMTsKKwkqaWQgPSByZXM7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBydG5sX2hhc2hfZW50cnkgZGZsdF9ncm91cF9lbnRyeSA9IHsKKwkuaWQgPSAwLCAubmFtZSA9ICJkZWZhdWx0IgorfTsKKworc3RhdGljIHN0cnVjdCBydG5sX2hhc2hfZW50cnkgKnJ0bmxfZ3JvdXBfaGFzaFsyNTZdID0geworCVswXSA9ICZkZmx0X2dyb3VwX2VudHJ5LAorfTsKKworc3RhdGljIGludCBydG5sX2dyb3VwX2luaXQ7CisKK3N0YXRpYyB2b2lkIHJ0bmxfZ3JvdXBfaW5pdGlhbGl6ZSh2b2lkKQoreworCXJ0bmxfZ3JvdXBfaW5pdCA9IDE7CisJcnRubF9oYXNoX2luaXRpYWxpemUoQ09ORkRJUiAiL2dyb3VwIiwKKwkJCSAgICAgcnRubF9ncm91cF9oYXNoLCAyNTYpOworfQorCitpbnQgcnRubF9ncm91cF9hMm4oaW50ICppZCwgY29uc3QgY2hhciAqYXJnKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpjYWNoZTsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyByZXM7CisJc3RydWN0IHJ0bmxfaGFzaF9lbnRyeSAqZW50cnk7CisJY2hhciAqZW5kOworCWludCBpOworCisJaWYgKGNhY2hlICYmIHN0cmNtcChjYWNoZSwgYXJnKSA9PSAwKSB7CisJCSppZCA9IHJlczsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFydG5sX2dyb3VwX2luaXQpCisJCXJ0bmxfZ3JvdXBfaW5pdGlhbGl6ZSgpOworCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCWVudHJ5ID0gcnRubF9ncm91cF9oYXNoW2ldOworCQl3aGlsZSAoZW50cnkgJiYgc3RyY21wKGVudHJ5LT5uYW1lLCBhcmcpKQorCQkJZW50cnkgPSBlbnRyeS0+bmV4dDsKKwkJaWYgKGVudHJ5KSB7CisJCQljYWNoZSA9IGVudHJ5LT5uYW1lOworCQkJcmVzID0gZW50cnktPmlkOworCQkJKmlkID0gcmVzOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpID0gc3RydG9sKGFyZywgJmVuZCwgMCk7CisJaWYgKCFlbmQgfHwgZW5kID09IGFyZyB8fCAqZW5kIHx8IGkgPCAwKQorCQlyZXR1cm4gLTE7CisJKmlkID0gaTsKKwlyZXR1cm4gMDsKK30KKworY29uc3QgY2hhciAqcnRubF9ncm91cF9uMmEoaW50IGlkLCBjaGFyICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IHJ0bmxfaGFzaF9lbnRyeSAqZW50cnk7CisJaW50IGk7CisKKwlpZiAoIXJ0bmxfZ3JvdXBfaW5pdCkKKwkJcnRubF9ncm91cF9pbml0aWFsaXplKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJZW50cnkgPSBydG5sX2dyb3VwX2hhc2hbaV07CisJCWlmIChlbnRyeSAmJiBlbnRyeS0+aWQgPT0gaWQpCisJCQlyZXR1cm4gZW50cnktPm5hbWU7CisJfQorCisJc25wcmludGYoYnVmLCBsZW4sICIlZCIsIGlkKTsKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgY2hhciAqbmxfcHJvdG9fdGFiWzI1Nl0gPSB7CisJW05FVExJTktfUk9VVEVdICAgICAgICAgID0gInJ0bmwiLAorCVtORVRMSU5LX1VOVVNFRF0gICAgICAgICA9ICJ1bnVzZWQiLAorCVtORVRMSU5LX1VTRVJTT0NLXSAgICAgICA9ICJ1c2Vyc29jayIsCisJW05FVExJTktfRklSRVdBTExdICAgICAgID0gImZ3IiwKKwlbTkVUTElOS19TT0NLX0RJQUddICAgICAgPSAidGNwZGlhZyIsCisJW05FVExJTktfTkZMT0ddICAgICAgICAgID0gIm5mbG9nIiwKKwlbTkVUTElOS19YRlJNXSAgICAgICAgICAgPSAieGZybSIsCisJW05FVExJTktfU0VMSU5VWF0gICAgICAgID0gInNlbGludXgiLAorCVtORVRMSU5LX0lTQ1NJXSAgICAgICAgICA9ICJpc2NzaSIsCisJW05FVExJTktfQVVESVRdICAgICAgICAgID0gImF1ZGl0IiwKKwlbTkVUTElOS19GSUJfTE9PS1VQXSAgICAgPSAiZmlibG9va3VwIiwKKwlbTkVUTElOS19DT05ORUNUT1JdICAgICAgPSAiY29ubmVjdG9yIiwKKwlbTkVUTElOS19ORVRGSUxURVJdICAgICAgPSAibmZ0IiwKKwlbTkVUTElOS19JUDZfRlddICAgICAgICAgPSAiaXA2ZnciLAorCVtORVRMSU5LX0ROUlRNU0ddICAgICAgICA9ICJkZWMtcnQiLAorCVtORVRMSU5LX0tPQkpFQ1RfVUVWRU5UXSA9ICJ1ZXZlbnQiLAorCVtORVRMSU5LX0dFTkVSSUNdICAgICAgICA9ICJnZW5sIiwKKwlbTkVUTElOS19TQ1NJVFJBTlNQT1JUXSAgPSAic2NzaS10cmFucyIsCisJW05FVExJTktfRUNSWVBURlNdICAgICAgID0gImVjcnlwdGZzIiwKKwlbTkVUTElOS19SRE1BXSAgICAgICAgICAgPSAicmRtYSIsCisJW05FVExJTktfQ1JZUFRPXSAgICAgICAgID0gImNyeXB0byIsCit9OworCitzdGF0aWMgaW50IG5sX3Byb3RvX2luaXQ7CisKK3N0YXRpYyB2b2lkIG5sX3Byb3RvX2luaXRpYWxpemUodm9pZCkKK3sKKwlubF9wcm90b19pbml0ID0gMTsKKwlydG5sX3RhYl9pbml0aWFsaXplKENPTkZESVIgIi9ubF9wcm90b3MiLAorCQkJICAgIG5sX3Byb3RvX3RhYiwgMjU2KTsKK30KKworY29uc3QgY2hhciAqbmxfcHJvdG9fbjJhKGludCBpZCwgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCWlmIChpZCA8IDAgfHwgaWQgPj0gMjU2KSB7CisJCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJXUiLCBpZCk7CisJCXJldHVybiBidWY7CisJfQorCisJaWYgKCFubF9wcm90b19pbml0KQorCQlubF9wcm90b19pbml0aWFsaXplKCk7CisKKwlpZiAobmxfcHJvdG9fdGFiW2lkXSkKKwkJcmV0dXJuIG5sX3Byb3RvX3RhYltpZF07CisKKwlzbnByaW50ZihidWYsIGxlbiwgIiV1IiwgaWQpOworCXJldHVybiBidWY7Cit9CisKK2ludCBubF9wcm90b19hMm4oX191MzIgKmlkLCBjb25zdCBjaGFyICphcmcpCit7CisJc3RhdGljIGNoYXIgKmNhY2hlOworCXN0YXRpYyB1bnNpZ25lZCBsb25nIHJlczsKKwljaGFyICplbmQ7CisJaW50IGk7CisKKwlpZiAoY2FjaGUgJiYgc3RyY21wKGNhY2hlLCBhcmcpID09IDApIHsKKwkJKmlkID0gcmVzOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIW5sX3Byb3RvX2luaXQpCisJCW5sX3Byb3RvX2luaXRpYWxpemUoKTsKKworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlpZiAobmxfcHJvdG9fdGFiW2ldICYmCisJCSAgICBzdHJjbXAobmxfcHJvdG9fdGFiW2ldLCBhcmcpID09IDApIHsKKwkJCWNhY2hlID0gbmxfcHJvdG9fdGFiW2ldOworCQkJcmVzID0gaTsKKwkJCSppZCA9IHJlczsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmVzID0gc3RydG91bChhcmcsICZlbmQsIDApOworCWlmICghZW5kIHx8IGVuZCA9PSBhcmcgfHwgKmVuZCB8fCByZXMgPiAyNTUpCisJCXJldHVybiAtMTsKKwkqaWQgPSByZXM7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9saWIvdXRpbHMuYyBiL2lwcm91dGUyL2xpYi91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YTIwZGUKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9saWIvdXRpbHMuYwpAQCAtMCwwICsxLDEwNjIgQEAKKy8qCisgKiB1dGlscy5jCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGt0X3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9tcGxzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgInJ0X25hbWVzLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJuYW1lc3BhY2UuaCIKKworaW50IHRpbWVzdGFtcF9zaG9ydCA9IDA7CisKK2ludCBnZXRfaW50ZWdlcihpbnQgKnZhbCwgY29uc3QgY2hhciAqYXJnLCBpbnQgYmFzZSkKK3sKKwlsb25nIHJlczsKKwljaGFyICpwdHI7CisKKwlpZiAoIWFyZyB8fCAhKmFyZykKKwkJcmV0dXJuIC0xOworCisJcmVzID0gc3RydG9sKGFyZywgJnB0ciwgYmFzZSk7CisKKwkvKiBJZiB0aGVyZSB3ZXJlIG5vIGRpZ2l0cyBhdCBhbGwsIHN0cnRvbCgpICBzdG9yZXMKKyAgICAgICAgICogdGhlIG9yaWdpbmFsIHZhbHVlIG9mIG5wdHIgaW4gKmVuZHB0ciAoYW5kIHJldHVybnMgMCkuCisJICogSW4gcGFydGljdWxhciwgaWYgKm5wdHIgaXMgbm90ICdcMCcgYnV0ICoqZW5kcHRyIGlzICdcMCcgb24gcmV0dXJuLAorCSAqIHRoZSBlbnRpcmUgc3RyaW5nIGlzIHZhbGlkLgorCSAqLworCWlmICghcHRyIHx8IHB0ciA9PSBhcmcgfHwgKnB0cikKKwkJcmV0dXJuIC0xOworCisJLyogSWYgYW4gdW5kZXJmbG93IG9jY3Vycywgc3RydG9sKCkgcmV0dXJucyBMT05HX01JTi4KKwkgKiBJZiBhbiBvdmVyZmxvdyBvY2N1cnMsICBzdHJ0b2woKSByZXR1cm5zIExPTkdfTUFYLgorCSAqIEluIGJvdGggY2FzZXMsIGVycm5vIGlzIHNldCB0byBFUkFOR0UuCisJICovCisJaWYgKChyZXMgPT0gTE9OR19NQVggfHwgcmVzID09IExPTkdfTUlOKSAmJiBlcnJubyA9PSBFUkFOR0UpCisJCXJldHVybiAtMTsKKworCS8qIE91dHNpZGUgcmFuZ2Ugb2YgaW50ICovCisJaWYgKHJlcyA8IElOVF9NSU4gfHwgcmVzID4gSU5UX01BWCkKKwkJcmV0dXJuIC0xOworCisJKnZhbCA9IHJlczsKKwlyZXR1cm4gMDsKK30KKworaW50IG1hc2syYml0cyhfX3UzMiBuZXRtYXNrKQoreworCXVuc2lnbmVkIGJpdHMgPSAwOworCV9fdTMyIG1hc2sgPSBudG9obChuZXRtYXNrKTsKKwlfX3UzMiBob3N0ID0gfm1hc2s7CisKKwkvKiBhIHZhbGlkIG5ldG1hc2sgbXVzdCBiZSAyXm4gLSAxICovCisJaWYgKChob3N0ICYgKGhvc3QgKyAxKSkgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJZm9yICg7IG1hc2s7IG1hc2sgPDw9IDEpCisJCSsrYml0czsKKwlyZXR1cm4gYml0czsKK30KKworc3RhdGljIGludCBnZXRfbmV0bWFzayh1bnNpZ25lZCAqdmFsLCBjb25zdCBjaGFyICphcmcsIGludCBiYXNlKQoreworCWluZXRfcHJlZml4IGFkZHI7CisKKwlpZiAoIWdldF91bnNpZ25lZCh2YWwsIGFyZywgYmFzZSkpCisJCXJldHVybiAwOworCisJLyogdHJ5IGNvdmVydGluZyBkb3R0ZWQgcXVhZCB0byBDSURSICovCisJaWYgKCFnZXRfYWRkcl8xKCZhZGRyLCBhcmcsIEFGX0lORVQpICYmIGFkZHIuZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJaW50IGIgPSBtYXNrMmJpdHMoYWRkci5kYXRhWzBdKTsKKwkJCisJCWlmIChiID49IDApIHsKKwkJCSp2YWwgPSBiOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK2ludCBnZXRfdW5zaWduZWQodW5zaWduZWQgKnZhbCwgY29uc3QgY2hhciAqYXJnLCBpbnQgYmFzZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlczsKKwljaGFyICpwdHI7CisKKwlpZiAoIWFyZyB8fCAhKmFyZykKKwkJcmV0dXJuIC0xOworCisJcmVzID0gc3RydG91bChhcmcsICZwdHIsIGJhc2UpOworCisJLyogZW1wdHkgc3RyaW5nIG9yIHRyYWlsaW5nIG5vbi1kaWdpdHMgKi8KKwlpZiAoIXB0ciB8fCBwdHIgPT0gYXJnIHx8ICpwdHIpCisJCXJldHVybiAtMTsKKworCS8qIG92ZXJmbG93ICovCisJaWYgKHJlcyA9PSBVTE9OR19NQVggJiYgZXJybm8gPT0gRVJBTkdFKQorCQlyZXR1cm4gLTE7CisKKwkvKiBvdXQgc2lkZSByYW5nZSBvZiB1bnNpZ25lZCAqLworCWlmIChyZXMgPiBVSU5UX01BWCkKKwkJcmV0dXJuIC0xOworCisJKnZhbCA9IHJlczsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGdldF90aW1lX3J0dCBpcyAidHJhbnNsYXRlZCIgZnJvbSBhIHNpbWlsYXIgcm91dGluZSAiZ2V0X3RpbWUiIGluCisgKiB0Y191dGlsLmMuICBXZSBkb24ndCB1c2UgdGhlIGV4YWN0IHNhbWUgcm91dGluZSBiZWNhdXNlIHRjIHBhc3NlcworICogbWljcm9zZWNvbmRzIHRvIHRoZSBrZXJuZWwgYW5kIHRoZSBjYWxsZXJzIG9mIGdldF90aW1lX3J0dCB3YW50IHRvCisgKiBwYXNzIG1pbGxpc2Vjb25kcyAoc3RhbmRhcmQgdW5pdCBmb3IgcnR0IHZhbHVlcyBzaW5jZSAyLjYuMjcpLCBhbmQKKyAqIGhhdmUgYSBkaWZmZXJlbnQgYXNzdW1wdGlvbiBmb3IgdGhlIHVuaXRzIG9mIGEgInJhdyIgbnVtYmVyLgorICovCitpbnQgZ2V0X3RpbWVfcnR0KHVuc2lnbmVkICp2YWwsIGNvbnN0IGNoYXIgKmFyZywgaW50ICpyYXcpCit7CisJZG91YmxlIHQ7CisJdW5zaWduZWQgbG9uZyByZXM7CisJY2hhciAqcDsKKworCWlmIChzdHJjaHIoYXJnLCAnLicpICE9IE5VTEwpIHsKKwkJdCA9IHN0cnRvZChhcmcsICZwKTsKKwkJaWYgKHQgPCAwLjApCisJCQlyZXR1cm4gLTE7CisKKwkJLyogbm8gZGlnaXRzPyAqLworCQlpZiAoIXAgfHwgcCA9PSBhcmcpCisJCQlyZXR1cm4gLTE7CisKKwkJLyogb3Zlci91bmRlcmZsb3cgKi8KKwkJaWYgKCh0ID09IEhVR0VfVkFMRiB8fCB0ID09IEhVR0VfVkFMTCkgJiYgZXJybm8gPT0gRVJBTkdFKQorCQkJcmV0dXJuIC0xOworCX0gZWxzZSB7CisJCXJlcyA9IHN0cnRvdWwoYXJnLCAmcCwgMCk7CisKKwkJLyogZW1wdHkgc3RyaW5nPyAqLworCQlpZiAoIXAgfHwgcCA9PSBhcmcpCisJCQlyZXR1cm4gLTE7CisKKwkJLyogb3ZlcmZsb3cgKi8KKwkJaWYgKHJlcyA9PSBVTE9OR19NQVggJiYgZXJybm8gPT0gRVJBTkdFKQorCQkJcmV0dXJuIC0xOworCisJCXQgPSAoZG91YmxlKXJlczsKKwl9CisKKwlpZiAocCA9PSBhcmcpCisJCXJldHVybiAtMTsKKwkqcmF3ID0gMTsKKworCWlmICgqcCkgeworCQkqcmF3ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoc3RyY2FzZWNtcChwLCAicyIpID09IDAgfHwgc3RyY2FzZWNtcChwLCAic2VjIik9PTAgfHwKKyAgICAgICAgICAgICAgICAgICAgc3RyY2FzZWNtcChwLCAic2VjcyIpPT0wKQorICAgICAgICAgICAgICAgICAgICAgICAgdCAqPSAxMDAwOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAocCwgIm1zIikgPT0gMCB8fCBzdHJjYXNlY21wKHAsICJtc2VjIik9PTAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjYXNlY21wKHAsICJtc2VjcyIpID09IDApCisJCQl0ICo9IDEuMDsgLyogYWxsb3cgc3VmZml4LCBkbyBub3RoaW5nICovCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKwkvKiBlbXVsYXRlIGNlaWwoKSB3aXRob3V0IGhhdmluZyB0byBicmluZy1pbiAtbG0gYW5kIGFsd2F5cyBiZSA+PSAxICovCisKKwkqdmFsID0gdDsKKwlpZiAoKnZhbCA8IHQpCisJCSp2YWwgKz0gMTsKKwkKKyAgICAgICAgcmV0dXJuIDA7CisKK30KKworaW50IGdldF91NjQoX191NjQgKnZhbCwgY29uc3QgY2hhciAqYXJnLCBpbnQgYmFzZSkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgcmVzOworCWNoYXIgKnB0cjsKKworCWlmICghYXJnIHx8ICEqYXJnKQorCQlyZXR1cm4gLTE7CisKKwlyZXMgPSBzdHJ0b3VsbChhcmcsICZwdHIsIGJhc2UpOworCisJLyogZW1wdHkgc3RyaW5nIG9yIHRyYWlsaW5nIG5vbi1kaWdpdHMgKi8KKwlpZiAoIXB0ciB8fCBwdHIgPT0gYXJnIHx8ICpwdHIpCisJCXJldHVybiAtMTsKKworCS8qIG92ZXJmbG93ICovCisJaWYgKHJlcyA9PSBVTExPTkdfTUFYICYmIGVycm5vID09IEVSQU5HRSkKKwkJcmV0dXJuIC0xOworCisJLyogaW4gY2FzZSBVTEwgaXMgMTI4IGJpdHMgKi8KKwlpZiAocmVzID4gMHhGRkZGRkZGRkZGRkZGRkZGVUxMKQorCQlyZXR1cm4gLTE7CisKKyAJKnZhbCA9IHJlczsKKyAJcmV0dXJuIDA7Cit9CisKK2ludCBnZXRfdTMyKF9fdTMyICp2YWwsIGNvbnN0IGNoYXIgKmFyZywgaW50IGJhc2UpCit7CisJdW5zaWduZWQgbG9uZyByZXM7CisJY2hhciAqcHRyOworCisJaWYgKCFhcmcgfHwgISphcmcpCisJCXJldHVybiAtMTsKKwlyZXMgPSBzdHJ0b3VsKGFyZywgJnB0ciwgYmFzZSk7CisKKwkvKiBlbXB0eSBzdHJpbmcgb3IgdHJhaWxpbmcgbm9uLWRpZ2l0cyAqLworCWlmICghcHRyIHx8IHB0ciA9PSBhcmcgfHwgKnB0cikKKwkJcmV0dXJuIC0xOworCisJLyogb3ZlcmZsb3cgKi8KKwlpZiAocmVzID09IFVMT05HX01BWCAmJiBlcnJubyA9PSBFUkFOR0UpCisJCXJldHVybiAtMTsKKworCS8qIGluIGNhc2UgVUwgPiAzMiBiaXRzICovCisJaWYgKHJlcyA+IDB4RkZGRkZGRkZVTCkKKwkJcmV0dXJuIC0xOworCisJKnZhbCA9IHJlczsKKwlyZXR1cm4gMDsKK30KKworaW50IGdldF91MTYoX191MTYgKnZhbCwgY29uc3QgY2hhciAqYXJnLCBpbnQgYmFzZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlczsKKwljaGFyICpwdHI7CisKKwlpZiAoIWFyZyB8fCAhKmFyZykKKwkJcmV0dXJuIC0xOworCXJlcyA9IHN0cnRvdWwoYXJnLCAmcHRyLCBiYXNlKTsKKworCS8qIGVtcHR5IHN0cmluZyBvciB0cmFpbGluZyBub24tZGlnaXRzICovCisJaWYgKCFwdHIgfHwgcHRyID09IGFyZyB8fCAqcHRyKQorCQlyZXR1cm4gLTE7CisKKwkvKiBvdmVyZmxvdyAqLworCWlmIChyZXMgPT0gVUxPTkdfTUFYICYmIGVycm5vID09IEVSQU5HRSkKKwkJcmV0dXJuIC0xOworCisJaWYgKHJlcyA+IDB4RkZGRlVMKQorCQlyZXR1cm4gLTE7CisKKwkqdmFsID0gcmVzOworCXJldHVybiAwOworfQorCitpbnQgZ2V0X3U4KF9fdTggKnZhbCwgY29uc3QgY2hhciAqYXJnLCBpbnQgYmFzZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlczsKKwljaGFyICpwdHI7CisKKwlpZiAoIWFyZyB8fCAhKmFyZykKKwkJcmV0dXJuIC0xOworCisJcmVzID0gc3RydG91bChhcmcsICZwdHIsIGJhc2UpOworCS8qIGVtcHR5IHN0cmluZyBvciB0cmFpbGluZyBub24tZGlnaXRzICovCisJaWYgKCFwdHIgfHwgcHRyID09IGFyZyB8fCAqcHRyKQorCQlyZXR1cm4gLTE7CisKKwkvKiBvdmVyZmxvdyAqLworCWlmIChyZXMgPT0gVUxPTkdfTUFYICYmIGVycm5vID09IEVSQU5HRSkKKwkJcmV0dXJuIC0xOworCisJaWYgKHJlcyA+IDB4RkZVTCkKKwkJcmV0dXJuIC0xOworCisJKnZhbCA9IHJlczsKKwlyZXR1cm4gMDsKK30KKworaW50IGdldF9zMzIoX19zMzIgKnZhbCwgY29uc3QgY2hhciAqYXJnLCBpbnQgYmFzZSkKK3sKKwlsb25nIHJlczsKKwljaGFyICpwdHI7CisKKwllcnJubyA9IDA7CisKKwlpZiAoIWFyZyB8fCAhKmFyZykKKwkJcmV0dXJuIC0xOworCXJlcyA9IHN0cnRvbChhcmcsICZwdHIsIGJhc2UpOworCWlmICghcHRyIHx8IHB0ciA9PSBhcmcgfHwgKnB0cikKKwkJcmV0dXJuIC0xOworCWlmICgocmVzID09IExPTkdfTUlOIHx8IHJlcyA9PSBMT05HX01BWCkgJiYgZXJybm8gPT0gRVJBTkdFKQorCQlyZXR1cm4gLTE7CisJaWYgKHJlcyA+IElOVDMyX01BWCB8fCByZXMgPCBJTlQzMl9NSU4pCisJCXJldHVybiAtMTsKKworCSp2YWwgPSByZXM7CisJcmV0dXJuIDA7Cit9CisKK2ludCBnZXRfczE2KF9fczE2ICp2YWwsIGNvbnN0IGNoYXIgKmFyZywgaW50IGJhc2UpCit7CisJbG9uZyByZXM7CisJY2hhciAqcHRyOworCisJaWYgKCFhcmcgfHwgISphcmcpCisJCXJldHVybiAtMTsKKwlyZXMgPSBzdHJ0b2woYXJnLCAmcHRyLCBiYXNlKTsKKwlpZiAoIXB0ciB8fCBwdHIgPT0gYXJnIHx8ICpwdHIpCisJCXJldHVybiAtMTsKKwlpZiAoKHJlcyA9PSBMT05HX01JTiB8fCByZXMgPT0gTE9OR19NQVgpICYmIGVycm5vID09IEVSQU5HRSkKKwkJcmV0dXJuIC0xOworCWlmIChyZXMgPiAweDdGRkYgfHwgcmVzIDwgLTB4ODAwMCkKKwkJcmV0dXJuIC0xOworCisJKnZhbCA9IHJlczsKKwlyZXR1cm4gMDsKK30KKworaW50IGdldF9zOChfX3M4ICp2YWwsIGNvbnN0IGNoYXIgKmFyZywgaW50IGJhc2UpCit7CisJbG9uZyByZXM7CisJY2hhciAqcHRyOworCisJaWYgKCFhcmcgfHwgISphcmcpCisJCXJldHVybiAtMTsKKwlyZXMgPSBzdHJ0b2woYXJnLCAmcHRyLCBiYXNlKTsKKwlpZiAoIXB0ciB8fCBwdHIgPT0gYXJnIHx8ICpwdHIpCisJCXJldHVybiAtMTsKKwlpZiAoKHJlcyA9PSBMT05HX01JTiB8fCByZXMgPT0gTE9OR19NQVgpICYmIGVycm5vID09IEVSQU5HRSkKKwkJcmV0dXJuIC0xOworCWlmIChyZXMgPiAweDdGIHx8IHJlcyA8IC0weDgwKQorCQlyZXR1cm4gLTE7CisJKnZhbCA9IHJlczsKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyB1c2VzIGEgbm9uLXN0YW5kYXJkIHBhcnNpbmcgKGllIG5vdCBpbmV0X2F0b24sIG9yIGluZXRfcHRvbikKKyAqIGJlY2F1c2Ugb2YgbGVnYWN5IGNob2ljZSB0byBwYXJzZSAxMC44IGFzIDEwLjguMC4wIG5vdCAxMC4wLjAuOAorICovCitzdGF0aWMgaW50IGdldF9hZGRyX2lwdjQoX191OCAqYXAsIGNvbnN0IGNoYXIgKmNwKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQl1bnNpZ25lZCBsb25nIG47CisJCWNoYXIgKmVuZHA7CisJCQorCQluID0gc3RydG91bChjcCwgJmVuZHAsIDApOworCQlpZiAobiA+IDI1NSkKKwkJCXJldHVybiAtMTsJLyogYm9ndXMgbmV0d29yayB2YWx1ZSAqLworCisJCWlmIChlbmRwID09IGNwKSAvKiBubyBkaWdpdHMgKi8KKwkJCXJldHVybiAtMTsKKworCQlhcFtpXSA9IG47CisKKwkJaWYgKCplbmRwID09ICdcMCcpCisJCQlicmVhazsKKworCQlpZiAoaSA9PSAzIHx8ICplbmRwICE9ICcuJykKKwkJCXJldHVybiAtMTsgCS8qIGV4dHJhIGNoYXJhY3RlcnMgKi8KKwkJY3AgPSBlbmRwICsgMTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworaW50IGdldF9hZGRyNjQoX191NjQgKmFwLCBjb25zdCBjaGFyICpjcCkKK3sKKwlpbnQgaTsKKworCXVuaW9uIHsKKwkJX191MTYgdjE2WzRdOworCQlfX3U2NCB2NjQ7CisJfSB2YWw7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgbjsKKwkJY2hhciAqZW5kcDsKKworCQluID0gc3RydG91bChjcCwgJmVuZHAsIDE2KTsKKwkJaWYgKG4gPiAweGZmZmYpCisJCQlyZXR1cm4gLTE7CS8qIGJvZ3VzIG5ldHdvcmsgdmFsdWUgKi8KKworCQlpZiAoZW5kcCA9PSBjcCkgLyogbm8gZGlnaXRzICovCisJCQlyZXR1cm4gLTE7CisKKwkJdmFsLnYxNltpXSA9IGh0b25zKG4pOworCisJCWlmICgqZW5kcCA9PSAnXDAnKQorCQkJYnJlYWs7CisKKwkJaWYgKGkgPT0gMyB8fCAqZW5kcCAhPSAnOicpCisJCQlyZXR1cm4gLTE7CS8qIGV4dHJhIGNoYXJhY3RlcnMgKi8KKwkJY3AgPSBlbmRwICsgMTsKKwl9CisKKwkqYXAgPSB2YWwudjY0OworCisJcmV0dXJuIDE7Cit9CisKK2ludCBnZXRfYWRkcl8xKGluZXRfcHJlZml4ICphZGRyLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgZmFtaWx5KQoreworCW1lbXNldChhZGRyLCAwLCBzaXplb2YoKmFkZHIpKTsKKworCWlmIChzdHJjbXAobmFtZSwgImRlZmF1bHQiKSA9PSAwIHx8CisJICAgIHN0cmNtcChuYW1lLCAiYWxsIikgPT0gMCB8fAorCSAgICBzdHJjbXAobmFtZSwgImFueSIpID09IDApIHsKKwkJaWYgKChmYW1pbHkgPT0gQUZfREVDbmV0KSB8fCAoZmFtaWx5ID09IEFGX01QTFMpKQorCQkJcmV0dXJuIC0xOworCQlhZGRyLT5mYW1pbHkgPSBmYW1pbHk7CisJCWFkZHItPmJ5dGVsZW4gPSAoZmFtaWx5ID09IEFGX0lORVQ2ID8gMTYgOiA0KTsKKwkJYWRkci0+Yml0bGVuID0gLTE7CisJCXJldHVybiAwOworCX0KKworCWlmIChmYW1pbHkgPT0gQUZfUEFDS0VUKSB7CisJCWludCBsZW47CisJCWxlbiA9IGxsX2FkZHJfYTJuKChjaGFyICopJmFkZHItPmRhdGEsIHNpemVvZihhZGRyLT5kYXRhKSwgbmFtZSk7CisJCWlmIChsZW4gPCAwKQorCQkJcmV0dXJuIC0xOworCisJCWFkZHItPmZhbWlseSA9IEFGX1BBQ0tFVDsKKwkJYWRkci0+Ynl0ZWxlbiA9IGxlbjsKKwkJYWRkci0+Yml0bGVuID0gbGVuICogODsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHN0cmNocihuYW1lLCAnOicpKSB7CisJCWFkZHItPmZhbWlseSA9IEFGX0lORVQ2OworCQlpZiAoZmFtaWx5ICE9IEFGX1VOU1BFQyAmJiBmYW1pbHkgIT0gQUZfSU5FVDYpCisJCQlyZXR1cm4gLTE7CisJCWlmIChpbmV0X3B0b24oQUZfSU5FVDYsIG5hbWUsIGFkZHItPmRhdGEpIDw9IDApCisJCQlyZXR1cm4gLTE7CisJCWFkZHItPmJ5dGVsZW4gPSAxNjsKKwkJYWRkci0+Yml0bGVuID0gLTE7CisJCXJldHVybiAwOworCX0KKworI2lmbmRlZiBBTkRST0lECisJaWYgKGZhbWlseSA9PSBBRl9ERUNuZXQpIHsKKwkJc3RydWN0IGRuX25hZGRyIGRuYTsKKwkJYWRkci0+ZmFtaWx5ID0gQUZfREVDbmV0OworCQlpZiAoZG5ldF9wdG9uKEFGX0RFQ25ldCwgbmFtZSwgJmRuYSkgPD0gMCkKKwkJCXJldHVybiAtMTsKKwkJbWVtY3B5KGFkZHItPmRhdGEsIGRuYS5hX2FkZHIsIDIpOworCQlhZGRyLT5ieXRlbGVuID0gMjsKKwkJYWRkci0+Yml0bGVuID0gLTE7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCisJaWYgKGZhbWlseSA9PSBBRl9NUExTKSB7CisJCWludCBpOworCQlhZGRyLT5mYW1pbHkgPSBBRl9NUExTOworCQlpZiAobXBsc19wdG9uKEFGX01QTFMsIG5hbWUsIGFkZHItPmRhdGEpIDw9IDApCisJCQlyZXR1cm4gLTE7CisJCWFkZHItPmJ5dGVsZW4gPSA0OworCQlhZGRyLT5iaXRsZW4gPSAyMDsKKwkJLyogSG93IG1hbnkgYnl0ZXMgZG8gSSBuZWVkPyAqLworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlpZiAobnRvaGwoYWRkci0+ZGF0YVtpXSkgJiBNUExTX0xTX1NfTUFTSykgeworCQkJCWFkZHItPmJ5dGVsZW4gPSAoaSArIDEpKjQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJYWRkci0+ZmFtaWx5ID0gQUZfSU5FVDsKKwlpZiAoZmFtaWx5ICE9IEFGX1VOU1BFQyAmJiBmYW1pbHkgIT0gQUZfSU5FVCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGdldF9hZGRyX2lwdjQoKF9fdTggKilhZGRyLT5kYXRhLCBuYW1lKSA8PSAwKQorCQlyZXR1cm4gLTE7CisKKwlhZGRyLT5ieXRlbGVuID0gNDsKKwlhZGRyLT5iaXRsZW4gPSAtMTsKKwlyZXR1cm4gMDsKK30KKworaW50IGFmX2JpdF9sZW4oaW50IGFmKQoreworCXN3aXRjaCAoYWYpIHsKKwljYXNlIEFGX0lORVQ2OgorCQlyZXR1cm4gMTI4OworCWNhc2UgQUZfSU5FVDoKKwkJcmV0dXJuIDMyOworCWNhc2UgQUZfREVDbmV0OgorCQlyZXR1cm4gMTY7CisJY2FzZSBBRl9JUFg6CisJCXJldHVybiA4MDsKKwljYXNlIEFGX01QTFM6CisJCXJldHVybiAyMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGFmX2J5dGVfbGVuKGludCBhZikKK3sKKwlyZXR1cm4gYWZfYml0X2xlbihhZikgLyA4OworfQorCitpbnQgZ2V0X3ByZWZpeF8xKGluZXRfcHJlZml4ICpkc3QsIGNoYXIgKmFyZywgaW50IGZhbWlseSkKK3sKKwlpbnQgZXJyOworCXVuc2lnbmVkIHBsZW47CisJY2hhciAqc2xhc2g7CisKKwltZW1zZXQoZHN0LCAwLCBzaXplb2YoKmRzdCkpOworCisJaWYgKHN0cmNtcChhcmcsICJkZWZhdWx0IikgPT0gMCB8fAorCSAgICBzdHJjbXAoYXJnLCAiYW55IikgPT0gMCB8fAorCSAgICBzdHJjbXAoYXJnLCAiYWxsIikgPT0gMCkgeworCQlpZiAoKGZhbWlseSA9PSBBRl9ERUNuZXQpIHx8IChmYW1pbHkgPT0gQUZfTVBMUykpCisJCQlyZXR1cm4gLTE7CisJCWRzdC0+ZmFtaWx5ID0gZmFtaWx5OworCQlkc3QtPmJ5dGVsZW4gPSAwOworCQlkc3QtPmJpdGxlbiA9IDA7CisJCXJldHVybiAwOworCX0KKworCXNsYXNoID0gc3RyY2hyKGFyZywgJy8nKTsKKwlpZiAoc2xhc2gpCisJCSpzbGFzaCA9IDA7CisKKwllcnIgPSBnZXRfYWRkcl8xKGRzdCwgYXJnLCBmYW1pbHkpOworCWlmIChlcnIgPT0gMCkgeworCQlkc3QtPmJpdGxlbiA9IGFmX2JpdF9sZW4oZHN0LT5mYW1pbHkpOworCisJCWlmIChzbGFzaCkgeworCQkJaWYgKGdldF9uZXRtYXNrKCZwbGVuLCBzbGFzaCsxLCAwKQorCQkJICAgIHx8IHBsZW4gPiBkc3QtPmJpdGxlbikgeworCQkJCWVyciA9IC0xOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCWRzdC0+ZmxhZ3MgfD0gUFJFRklYTEVOX1NQRUNJRklFRDsKKwkJCWRzdC0+Yml0bGVuID0gcGxlbjsKKwkJfQorCX0KK2RvbmU6CisJaWYgKHNsYXNoKQorCQkqc2xhc2ggPSAnLyc7CisJcmV0dXJuIGVycjsKK30KKworaW50IGdldF9hZGRyKGluZXRfcHJlZml4ICpkc3QsIGNvbnN0IGNoYXIgKmFyZywgaW50IGZhbWlseSkKK3sKKwlpZiAoZ2V0X2FkZHJfMShkc3QsIGFyZywgZmFtaWx5KSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiAlcyBhZGRyZXNzIGlzIGV4cGVjdGVkIHJhdGhlciB0aGFuIFwiJXNcIi5cbiIsCisJCQkJZmFtaWx5X25hbWUoZmFtaWx5KSAsYXJnKTsKKwkJZXhpdCgxKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBnZXRfcHJlZml4KGluZXRfcHJlZml4ICpkc3QsIGNoYXIgKmFyZywgaW50IGZhbWlseSkKK3sKKwlpZiAoZmFtaWx5ID09IEFGX1BBQ0tFVCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBcIiVzXCIgbWF5IGJlIGluZXQgcHJlZml4LCBidXQgaXQgaXMgbm90IGFsbG93ZWQgaW4gdGhpcyBjb250ZXh0LlxuIiwgYXJnKTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKGdldF9wcmVmaXhfMShkc3QsIGFyZywgZmFtaWx5KSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiAlcyBwcmVmaXggaXMgZXhwZWN0ZWQgcmF0aGVyIHRoYW4gXCIlc1wiLlxuIiwKKwkJCQlmYW1pbHlfbmFtZShmYW1pbHkpICxhcmcpOworCQlleGl0KDEpOworCX0KKwlyZXR1cm4gMDsKK30KKworX191MzIgZ2V0X2FkZHIzMihjb25zdCBjaGFyICpuYW1lKQoreworCWluZXRfcHJlZml4IGFkZHI7CisJaWYgKGdldF9hZGRyXzEoJmFkZHIsIG5hbWUsIEFGX0lORVQpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRXJyb3I6IGFuIElQIGFkZHJlc3MgaXMgZXhwZWN0ZWQgcmF0aGVyIHRoYW4gXCIlc1wiXG4iLCBuYW1lKTsKKwkJZXhpdCgxKTsKKwl9CisJcmV0dXJuIGFkZHIuZGF0YVswXTsKK30KKwordm9pZCBpbmNvbXBsZXRlX2NvbW1hbmQodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIkNvbW1hbmQgbGluZSBpcyBub3QgY29tcGxldGUuIFRyeSBvcHRpb24gXCJoZWxwXCJcbiIpOworCWV4aXQoLTEpOworfQorCit2b2lkIG1pc3NhcmcoY29uc3QgY2hhciAqa2V5KQoreworCWZwcmludGYoc3RkZXJyLCAiRXJyb3I6IGFyZ3VtZW50IFwiJXNcIiBpcyByZXF1aXJlZFxuIiwga2V5KTsKKwlleGl0KC0xKTsKK30KKwordm9pZCBpbnZhcmcoY29uc3QgY2hhciAqbXNnLCBjb25zdCBjaGFyICphcmcpCit7CisJZnByaW50ZihzdGRlcnIsICJFcnJvcjogYXJndW1lbnQgXCIlc1wiIGlzIHdyb25nOiAlc1xuIiwgYXJnLCBtc2cpOworCWV4aXQoLTEpOworfQorCit2b2lkIGR1cGFyZyhjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKmFyZykKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBkdXBsaWNhdGUgXCIlc1wiOiBcIiVzXCIgaXMgdGhlIHNlY29uZCB2YWx1ZS5cbiIsIGtleSwgYXJnKTsKKwlleGl0KC0xKTsKK30KKwordm9pZCBkdXBhcmcyKGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqYXJnKQoreworCWZwcmludGYoc3RkZXJyLCAiRXJyb3I6IGVpdGhlciBcIiVzXCIgaXMgZHVwbGljYXRlLCBvciBcIiVzXCIgaXMgYSBnYXJiYWdlLlxuIiwga2V5LCBhcmcpOworCWV4aXQoLTEpOworfQorCitpbnQgbWF0Y2hlcyhjb25zdCBjaGFyICpjbWQsIGNvbnN0IGNoYXIgKnBhdHRlcm4pCit7CisJaW50IGxlbiA9IHN0cmxlbihjbWQpOworCWlmIChsZW4gPiBzdHJsZW4ocGF0dGVybikpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gbWVtY21wKHBhdHRlcm4sIGNtZCwgbGVuKTsKK30KKworaW50IGluZXRfYWRkcl9tYXRjaChjb25zdCBpbmV0X3ByZWZpeCAqYSwgY29uc3QgaW5ldF9wcmVmaXggKmIsIGludCBiaXRzKQoreworCWNvbnN0IF9fdTMyICphMSA9IGEtPmRhdGE7CisJY29uc3QgX191MzIgKmEyID0gYi0+ZGF0YTsKKwlpbnQgd29yZHMgPSBiaXRzID4+IDB4MDU7CisKKwliaXRzICY9IDB4MWY7CisKKwlpZiAod29yZHMpCisJCWlmIChtZW1jbXAoYTEsIGEyLCB3b3JkcyA8PCAyKSkKKwkJCXJldHVybiAtMTsKKworCWlmIChiaXRzKSB7CisJCV9fdTMyIHcxLCB3MjsKKwkJX191MzIgbWFzazsKKworCQl3MSA9IGExW3dvcmRzXTsKKwkJdzIgPSBhMlt3b3Jkc107CisKKwkJbWFzayA9IGh0b25sKCgweGZmZmZmZmZmKSA8PCAoMHgyMCAtIGJpdHMpKTsKKworCQlpZiAoKHcxIF4gdzIpICYgbWFzaykKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgX19pcHJvdXRlMl9oel9pbnRlcm5hbDsKKworaW50IF9fZ2V0X2h6KHZvaWQpCit7CisJY2hhciBuYW1lWzEwMjRdOworCWludCBoeiA9IDA7CisJRklMRSAqZnA7CisKKwlpZiAoZ2V0ZW52KCJIWiIpKQorCQlyZXR1cm4gYXRvaShnZXRlbnYoIkhaIikpID8gOiBIWjsKKworCWlmIChnZXRlbnYoIlBST0NfTkVUX1BTQ0hFRCIpKSB7CisJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKS0xLCAiJXMiLCBnZXRlbnYoIlBST0NfTkVUX1BTQ0hFRCIpKTsKKwl9IGVsc2UgaWYgKGdldGVudigiUFJPQ19ST09UIikpIHsKKwkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLTEsICIlcy9uZXQvcHNjaGVkIiwgZ2V0ZW52KCJQUk9DX1JPT1QiKSk7CisJfSBlbHNlIHsKKwkJc3RyY3B5KG5hbWUsICIvcHJvYy9uZXQvcHNjaGVkIik7CisJfQorCWZwID0gZm9wZW4obmFtZSwgInIiKTsKKworCWlmIChmcCkgeworCQl1bnNpZ25lZCBub20sIGRlbm9tOworCQlpZiAoZnNjYW5mKGZwLCAiJSowOHglKjA4eCUwOHglMDh4IiwgJm5vbSwgJmRlbm9tKSA9PSAyKQorCQkJaWYgKG5vbSA9PSAxMDAwMDAwKQorCQkJCWh6ID0gZGVub207CisJCWZjbG9zZShmcCk7CisJfQorCWlmIChoeikKKwkJcmV0dXJuIGh6OworCXJldHVybiBIWjsKK30KKworaW50IF9faXByb3V0ZTJfdXNlcl9oel9pbnRlcm5hbDsKKworaW50IF9fZ2V0X3VzZXJfaHoodm9pZCkKK3sKKwlyZXR1cm4gc3lzY29uZihfU0NfQ0xLX1RDSyk7Cit9CisKK2NvbnN0IGNoYXIgKnJ0X2FkZHJfbjJhKGludCBhZiwgaW50IGxlbiwgY29uc3Qgdm9pZCAqYWRkciwgY2hhciAqYnVmLCBpbnQgYnVmbGVuKQoreworCXN3aXRjaCAoYWYpIHsKKwljYXNlIEFGX0lORVQ6CisJY2FzZSBBRl9JTkVUNjoKKwkJcmV0dXJuIGluZXRfbnRvcChhZiwgYWRkciwgYnVmLCBidWZsZW4pOworI2lmbmRlZiBBTkRST0lECisJY2FzZSBBRl9NUExTOgorCQlyZXR1cm4gbXBsc19udG9wKGFmLCBhZGRyLCBidWYsIGJ1Zmxlbik7CisJY2FzZSBBRl9JUFg6CisJCXJldHVybiBpcHhfbnRvcChhZiwgYWRkciwgYnVmLCBidWZsZW4pOworCWNhc2UgQUZfREVDbmV0OgorCXsKKwkJc3RydWN0IGRuX25hZGRyIGRuYSA9IHsgMiwgeyAwLCAwLCB9fTsKKwkJbWVtY3B5KGRuYS5hX2FkZHIsIGFkZHIsIDIpOworCQlyZXR1cm4gZG5ldF9udG9wKGFmLCAmZG5hLCBidWYsIGJ1Zmxlbik7CisJfQorI2VuZGlmCisJY2FzZSBBRl9QQUNLRVQ6CisJCXJldHVybiBsbF9hZGRyX24yYShhZGRyLCBsZW4sIEFSUEhSRF9WT0lELCBidWYsIGJ1Zmxlbik7CisJZGVmYXVsdDoKKwkJcmV0dXJuICI/Pz8iOworCX0KK30KKworaW50IHJlYWRfZmFtaWx5KGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGZhbWlseSA9IEFGX1VOU1BFQzsKKwlpZiAoc3RyY21wKG5hbWUsICJpbmV0IikgPT0gMCkKKwkJZmFtaWx5ID0gQUZfSU5FVDsKKwllbHNlIGlmIChzdHJjbXAobmFtZSwgImluZXQ2IikgPT0gMCkKKwkJZmFtaWx5ID0gQUZfSU5FVDY7CisJZWxzZSBpZiAoc3RyY21wKG5hbWUsICJkbmV0IikgPT0gMCkKKwkJZmFtaWx5ID0gQUZfREVDbmV0OworCWVsc2UgaWYgKHN0cmNtcChuYW1lLCAibGluayIpID09IDApCisJCWZhbWlseSA9IEFGX1BBQ0tFVDsKKwllbHNlIGlmIChzdHJjbXAobmFtZSwgImlweCIpID09IDApCisJCWZhbWlseSA9IEFGX0lQWDsKKwllbHNlIGlmIChzdHJjbXAobmFtZSwgIm1wbHMiKSA9PSAwKQorCQlmYW1pbHkgPSBBRl9NUExTOworCWVsc2UgaWYgKHN0cmNtcChuYW1lLCAiYnJpZGdlIikgPT0gMCkKKwkJZmFtaWx5ID0gQUZfQlJJREdFOworCXJldHVybiBmYW1pbHk7Cit9CisKK2NvbnN0IGNoYXIgKmZhbWlseV9uYW1lKGludCBmYW1pbHkpCit7CisJaWYgKGZhbWlseSA9PSBBRl9JTkVUKQorCQlyZXR1cm4gImluZXQiOworCWlmIChmYW1pbHkgPT0gQUZfSU5FVDYpCisJCXJldHVybiAiaW5ldDYiOworCWlmIChmYW1pbHkgPT0gQUZfREVDbmV0KQorCQlyZXR1cm4gImRuZXQiOworCWlmIChmYW1pbHkgPT0gQUZfUEFDS0VUKQorCQlyZXR1cm4gImxpbmsiOworCWlmIChmYW1pbHkgPT0gQUZfSVBYKQorCQlyZXR1cm4gImlweCI7CisJaWYgKGZhbWlseSA9PSBBRl9NUExTKQorCQlyZXR1cm4gIm1wbHMiOworCWlmIChmYW1pbHkgPT0gQUZfQlJJREdFKQorCQlyZXR1cm4gImJyaWRnZSI7CisJcmV0dXJuICI/Pz8iOworfQorCisjaWZkZWYgUkVTT0xWRV9IT1NUTkFNRVMKK3N0cnVjdCBuYW1lcmVjCit7CisJc3RydWN0IG5hbWVyZWMgKm5leHQ7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbmV0X3ByZWZpeCBhZGRyOworfTsKKworI2RlZmluZSBOSEFTSCAyNTcKK3N0YXRpYyBzdHJ1Y3QgbmFtZXJlYyAqbmh0W05IQVNIXTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnJlc29sdmVfYWRkcmVzcyhjb25zdCB2b2lkICphZGRyLCBpbnQgbGVuLCBpbnQgYWYpCit7CisJc3RydWN0IG5hbWVyZWMgKm47CisJc3RydWN0IGhvc3RlbnQgKmhfZW50OworCXVuc2lnbmVkIGhhc2g7CisJc3RhdGljIGludCBub3RmaXJzdDsKKworCisJaWYgKGFmID09IEFGX0lORVQ2ICYmICgoX191MzIqKWFkZHIpWzBdID09IDAgJiYKKwkgICAgKChfX3UzMiopYWRkcilbMV0gPT0gMCAmJiAoKF9fdTMyKilhZGRyKVsyXSA9PSBodG9ubCgweGZmZmYpKSB7CisJCWFmID0gQUZfSU5FVDsKKwkJYWRkciArPSAxMjsKKwkJbGVuID0gNDsKKwl9CisKKwloYXNoID0gKihfX3UzMiAqKShhZGRyICsgbGVuIC0gNCkgJSBOSEFTSDsKKworCWZvciAobiA9IG5odFtoYXNoXTsgbjsgbiA9IG4tPm5leHQpIHsKKwkJaWYgKG4tPmFkZHIuZmFtaWx5ID09IGFmICYmCisJCSAgICBuLT5hZGRyLmJ5dGVsZW4gPT0gbGVuICYmCisJCSAgICBtZW1jbXAobi0+YWRkci5kYXRhLCBhZGRyLCBsZW4pID09IDApCisJCQlyZXR1cm4gbi0+bmFtZTsKKwl9CisJaWYgKChuID0gbWFsbG9jKHNpemVvZigqbikpKSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwluLT5hZGRyLmZhbWlseSA9IGFmOworCW4tPmFkZHIuYnl0ZWxlbiA9IGxlbjsKKwluLT5uYW1lID0gTlVMTDsKKwltZW1jcHkobi0+YWRkci5kYXRhLCBhZGRyLCBsZW4pOworCW4tPm5leHQgPSBuaHRbaGFzaF07CisJbmh0W2hhc2hdID0gbjsKKwlpZiAoKytub3RmaXJzdCA9PSAxKQorCQlzZXRob3N0ZW50KDEpOworCWZmbHVzaChzdGRvdXQpOworCisJaWYgKChoX2VudCA9IGdldGhvc3RieWFkZHIoYWRkciwgbGVuLCBhZikpICE9IE5VTEwpCisJCW4tPm5hbWUgPSBzdHJkdXAoaF9lbnQtPmhfbmFtZSk7CisKKwkvKiBFdmVuIGlmIHdlIGZhaWwsICJuZWdhdGl2ZSIgZW50cnkgaXMgcmVtZW1iZXJlZC4gKi8KKwlyZXR1cm4gbi0+bmFtZTsKK30KKyNlbmRpZgorCitjb25zdCBjaGFyICpmb3JtYXRfaG9zdChpbnQgYWYsIGludCBsZW4sIGNvbnN0IHZvaWQgKmFkZHIsCisJCQljaGFyICpidWYsIGludCBidWZsZW4pCit7CisjaWZkZWYgUkVTT0xWRV9IT1NUTkFNRVMKKwlpZiAocmVzb2x2ZV9ob3N0cykgeworCQljb25zdCBjaGFyICpuOworCisJCWxlbiA9IGxlbiA8PSAwID8gYWZfYnl0ZV9sZW4oYWYpIDogbGVuOworCisJCWlmIChsZW4gPiAwICYmCisJCSAgICAobiA9IHJlc29sdmVfYWRkcmVzcyhhZGRyLCBsZW4sIGFmKSkgIT0gTlVMTCkKKwkJCXJldHVybiBuOworCX0KKyNlbmRpZgorCXJldHVybiBydF9hZGRyX24yYShhZiwgbGVuLCBhZGRyLCBidWYsIGJ1Zmxlbik7Cit9CisKKworY2hhciAqaGV4c3RyaW5nX24yYShjb25zdCBfX3U4ICpzdHIsIGludCBsZW4sIGNoYXIgKmJ1ZiwgaW50IGJsZW4pCit7CisJY2hhciAqcHRyID0gYnVmOworCWludCBpOworCisJZm9yIChpPTA7IGk8bGVuOyBpKyspIHsKKwkJaWYgKGJsZW4gPCAzKQorCQkJYnJlYWs7CisJCXNwcmludGYocHRyLCAiJTAyeCIsIHN0cltpXSk7CisJCXB0ciArPSAyOworCQlibGVuIC09IDI7CisJfQorCXJldHVybiBidWY7Cit9CisKK19fdTgqIGhleHN0cmluZ19hMm4oY29uc3QgY2hhciAqc3RyLCBfX3U4ICpidWYsIGludCBibGVuKQoreworCWludCBjbnQgPSAwOworCWNoYXIgKmVuZHB0cjsKKworCWlmIChzdHJsZW4oc3RyKSAlIDIpCisJCXJldHVybiBOVUxMOworCXdoaWxlIChjbnQgPCBibGVuICYmIHN0cmxlbihzdHIpID4gMSkgeworCQl1bnNpZ25lZCBpbnQgdG1wOworCQljaGFyIHRtcHN0clszXTsKKworCQlzdHJuY3B5KHRtcHN0ciwgc3RyLCAyKTsKKwkJdG1wc3RyWzJdID0gJ1wwJzsKKwkJdG1wID0gc3RydG91bCh0bXBzdHIsICZlbmRwdHIsIDE2KTsKKwkJaWYgKGVycm5vICE9IDAgfHwgdG1wID4gMHhGRiB8fCAqZW5kcHRyICE9ICdcMCcpCisJCQlyZXR1cm4gTlVMTDsKKwkJYnVmW2NudCsrXSA9IHRtcDsKKwkJc3RyICs9IDI7CisJfQorCXJldHVybiBidWY7Cit9CisKK2ludCBhZGRyNjRfbjJhKF9fdTY0IGFkZHIsIGNoYXIgKmJ1ZmYsIHNpemVfdCBsZW4pCit7CisJX191MTYgKndvcmRzID0gKF9fdTE2ICopJmFkZHI7CisJX191MTYgdjsKKwlpbnQgaSwgcmV0OworCXNpemVfdCB3cml0dGVuID0gMDsKKwljaGFyICpzZXAgPSAiOiI7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXYgPSBudG9ocyh3b3Jkc1tpXSk7CisKKwkJaWYgKGkgPT0gMykKKwkJCXNlcCA9ICIiOworCisJCXJldCA9IHNucHJpbnRmKCZidWZmW3dyaXR0ZW5dLCBsZW4gLSB3cml0dGVuLCAiJXglcyIsIHYsIHNlcCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQl3cml0dGVuICs9IHJldDsKKwl9CisKKwlyZXR1cm4gd3JpdHRlbjsKK30KKworaW50IHByaW50X3RpbWVzdGFtcChGSUxFICpmcCkKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlzdHJ1Y3QgdG0gKnRtOworCisJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisJdG0gPSBsb2NhbHRpbWUoJnR2LnR2X3NlYyk7CisKKwlpZiAodGltZXN0YW1wX3Nob3J0KSB7CisJCWNoYXIgdHNob3J0WzQwXTsKKworCQlzdHJmdGltZSh0c2hvcnQsIHNpemVvZih0c2hvcnQpLCAiJVktJW0tJWRUJUg6JU06JVMiLCB0bSk7CisJCWZwcmludGYoZnAsICJbJXMuJTA2bGRdICIsIHRzaG9ydCwgdHYudHZfdXNlYyk7CisJfSBlbHNlIHsKKwkJY2hhciAqdHN0ciA9IGFzY3RpbWUodG0pOworCisJCXRzdHJbc3RybGVuKHRzdHIpLTFdID0gMDsKKwkJZnByaW50ZihmcCwgIlRpbWVzdGFtcDogJXMgJWxkIHVzZWNcbiIsCisJCQl0c3RyLCB0di50dl91c2VjKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGNtZGxpbmVubzsKKworLyogTGlrZSBnbGliYyBnZXRsaW5lIGJ1dCBoYW5kbGUgY29udGludWF0aW9uIGxpbmVzIGFuZCBjb21tZW50cyAqLworc3NpemVfdCBnZXRjbWRsaW5lKGNoYXIgKipsaW5lcCwgc2l6ZV90ICpsZW5wLCBGSUxFICppbikKK3sKKwlzc2l6ZV90IGNjOworCWNoYXIgKmNwOworCisJaWYgKChjYyA9IGdldGxpbmUobGluZXAsIGxlbnAsIGluKSkgPCAwKQorCQlyZXR1cm4gY2M7CS8qIGVvZiBvciBlcnJvciAqLworCSsrY21kbGluZW5vOworCisJY3AgPSBzdHJjaHIoKmxpbmVwLCAnIycpOworCWlmIChjcCkKKwkJKmNwID0gJ1wwJzsKKworCXdoaWxlICgoY3AgPSBzdHJzdHIoKmxpbmVwLCAiXFxcbiIpKSAhPSBOVUxMKSB7CisJCWNoYXIgKmxpbmUxID0gTlVMTDsKKwkJc2l6ZV90IGxlbjEgPSAwOworCQlzc2l6ZV90IGNjMTsKKworCQlpZiAoKGNjMSA9IGdldGxpbmUoJmxpbmUxLCAmbGVuMSwgaW4pKSA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBjb250aW51YXRpb24gbGluZVxuIik7CisJCQlyZXR1cm4gY2MxOworCQl9CisKKwkJKytjbWRsaW5lbm87CisJCSpjcCA9IDA7CisKKwkJY3AgPSBzdHJjaHIobGluZTEsICcjJyk7CisJCWlmIChjcCkKKwkJCSpjcCA9ICdcMCc7CisKKwkJKmxlbnAgPSBzdHJsZW4oKmxpbmVwKSArIHN0cmxlbihsaW5lMSkgKyAxOworCQkqbGluZXAgPSByZWFsbG9jKCpsaW5lcCwgKmxlbnApOworCQlpZiAoISpsaW5lcCkgeworCQkJZnByaW50ZihzdGRlcnIsICJPdXQgb2YgbWVtb3J5XG4iKTsKKwkJCSpsZW5wID0gMDsKKwkJCXJldHVybiAtMTsKKwkJfQorCQljYyArPSBjYzEgLSAyOworCQlzdHJjYXQoKmxpbmVwLCBsaW5lMSk7CisJCWZyZWUobGluZTEpOworCX0KKwlyZXR1cm4gY2M7Cit9CisKKy8qIHNwbGl0IGNvbW1hbmQgbGluZSBpbnRvIGFyZ3VtZW50IHZlY3RvciAqLworaW50IG1ha2VhcmdzKGNoYXIgKmxpbmUsIGNoYXIgKmFyZ3ZbXSwgaW50IG1heGFyZ3MpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgd3NbXSA9ICIgXHRcclxuIjsKKwljaGFyICpjcDsKKwlpbnQgYXJnYyA9IDA7CisKKwlmb3IgKGNwID0gbGluZSArIHN0cnNwbihsaW5lLCB3cyk7ICpjcDsgY3AgKz0gc3Ryc3BuKGNwLCB3cykpIHsKKwkJaWYgKGFyZ2MgPj0gKG1heGFyZ3MgLSAxKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJUb28gbWFueSBhcmd1bWVudHMgdG8gY29tbWFuZFxuIik7CisJCQlleGl0KDEpOworCQl9CisKKwkJLyogd29yZCBiZWdpbnMgd2l0aCBxdW90ZSAqLworCQlpZiAoKmNwID09ICdcJycgfHwgKmNwID09ICciJykgeworCQkJY2hhciBxdW90ZSA9ICpjcCsrOworCisJCQlhcmd2W2FyZ2MrK10gPSBjcDsKKwkJCS8qIGZpbmQgZW5kaW5nIHF1b3RlICovCisJCQljcCA9IHN0cmNocihjcCwgcXVvdGUpOworCQkJaWYgKGNwID09IE5VTEwpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlVudGVybWluYXRlZCBxdW90ZWQgc3RyaW5nXG4iKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQkJKmNwKysgPSAwOworCQkJY29udGludWU7CisJCX0KKworCQlhcmd2W2FyZ2MrK10gPSBjcDsKKwkJLyogZmluZCBlbmQgb2Ygd29yZCAqLworCQljcCArPSBzdHJjc3BuKGNwLCB3cyk7CisJCSpjcCsrID0gMDsKKwl9CisJYXJndlthcmdjXSA9IE5VTEw7CisKKwlyZXR1cm4gYXJnYzsKK30KKworaW50IGluZXRfZ2V0X2FkZHIoY29uc3QgY2hhciAqc3JjLCBfX3UzMiAqZHN0LCBzdHJ1Y3QgaW42X2FkZHIgKmRzdDYpCit7CisJaWYgKHN0cmNocihzcmMsICc6JykpCisJCXJldHVybiBpbmV0X3B0b24oQUZfSU5FVDYsIHNyYywgZHN0Nik7CisJZWxzZQorCQlyZXR1cm4gaW5ldF9wdG9uKEFGX0lORVQsIHNyYywgZHN0KTsKK30KKwordm9pZCBwcmludF9ubG1zZ190aW1lc3RhbXAoRklMRSAqZnAsIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwljaGFyICp0c3RyOworCXRpbWVfdCBzZWNzID0gKChfX3UzMiopTkxNU0dfREFUQShuKSlbMF07CisJbG9uZyB1c2VjcyA9ICgoX191MzIqKU5MTVNHX0RBVEEobikpWzFdOworCXRzdHIgPSBhc2N0aW1lKGxvY2FsdGltZSgmc2VjcykpOworCXRzdHJbc3RybGVuKHRzdHIpLTFdID0gMDsKKwlmcHJpbnRmKGZwLCAiVGltZXN0YW1wOiAlcyAlbHUgdXNcbiIsIHRzdHIsIHVzZWNzKTsKK30KKworc3RhdGljIGludCBvbl9uZXRucyhjaGFyICpuc25hbWUsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbmV0bnNfZnVuYyAqZiA9IGFyZzsKKworCWlmIChuZXRuc19zd2l0Y2gobnNuYW1lKSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIGYtPmZ1bmMobnNuYW1lLCBmLT5hcmcpOworfQorCitzdGF0aWMgaW50IG9uX25ldG5zX2xhYmVsKGNoYXIgKm5zbmFtZSwgdm9pZCAqYXJnKQoreworCXByaW50ZigiXG5uZXRuczogJXNcbiIsIG5zbmFtZSk7CisJcmV0dXJuIG9uX25ldG5zKG5zbmFtZSwgYXJnKTsKK30KKworaW50IGRvX2VhY2hfbmV0bnMoaW50ICgqZnVuYykoY2hhciAqbnNuYW1lLCB2b2lkICphcmcpLCB2b2lkICphcmcsCisJCWJvb2wgc2hvd19sYWJlbCkKK3sKKwlzdHJ1Y3QgbmV0bnNfZnVuYyBuc2YgPSB7IC5mdW5jID0gZnVuYywgLmFyZyA9IGFyZyB9OworCisJaWYgKHNob3dfbGFiZWwpCisJCXJldHVybiBuZXRuc19mb3JlYWNoKG9uX25ldG5zX2xhYmVsLCAmbnNmKTsKKworCXJldHVybiBuZXRuc19mb3JlYWNoKG9uX25ldG5zLCAmbnNmKTsKK30KKworY2hhciAqaW50X3RvX3N0cihpbnQgdmFsLCBjaGFyICpidWYpCit7CisJc3ByaW50ZihidWYsICIlZCIsIHZhbCk7CisJcmV0dXJuIGJ1ZjsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9NYWtlZmlsZSBiL2lwcm91dGUyL21hbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDlmYWExCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbWFuL01ha2VmaWxlCkBAIC0wLDAgKzEsMTQgQEAKK0lOU1RBTEw9aW5zdGFsbAorSU5TVEFMTERJUj1pbnN0YWxsIC1tIDA3NTUgLWQKK0lOU1RBTExNQU49aW5zdGFsbCAtbSAwNjQ0CisKK1NVQkRJUlMgPSBtYW4zIG1hbjcgbWFuOAorCithbGwgY2xlYW4gaW5zdGFsbDoKKwlAZm9yIHN1YmRpciBpbiAkKFNVQkRJUlMpOyBkbyAkKE1BS0UpIC1DICQkc3ViZGlyICRAIHx8IGV4aXQgJCQ/OyBkb25lCisKK2Rpc3RjbGVhbjogY2xlYW4KKworLlBIT05ZOiBpbnN0YWxsIGNsZWFuIGRpc3RjbGVhbgorCisuRVhQT1JUX0FMTF9WQVJJQUJMRVM6CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9tYW4vbWFuMy9NYWtlZmlsZSBiL2lwcm91dGUyL21hbi9tYW4zL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNTU2NTgKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9tYW4vbWFuMy9NYWtlZmlsZQpAQCAtMCwwICsxLDEzIEBACitNQU4zUEFHRVM9bGlibmV0bGluay4zCisKK2FsbDoKKworZGlzdGNsZWFuOiBjbGVhbgorCitjbGVhbjoKKworaW5zdGFsbDoKKwkkKElOU1RBTExESVIpICQoREVTVERJUikkKE1BTkRJUikvbWFuMworCSQoSU5TVEFMTE1BTikgJChNQU4zUEFHRVMpICQoREVTVERJUikkKE1BTkRJUikvbWFuMworCisuUEhPTlk6IGluc3RhbGwgY2xlYW4gZGlzdGNsZWFuCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9tYW4vbWFuMy9saWJuZXRsaW5rLjMgYi9pcHJvdXRlMi9tYW4vbWFuMy9saWJuZXRsaW5rLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTliZTljYwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW4zL2xpYm5ldGxpbmsuMwpAQCAtMCwwICsxLDIwMCBAQAorLlRIIGxpYm5ldGxpbmsgMworLlNIIE5BTUUKK2xpYm5ldGxpbmsgXC0gQSBsaWJyYXJ5IGZvciBhY2Nlc3NpbmcgdGhlIG5ldGxpbmsgc2VydmljZQorLlNIIFNZTk9QU0lTCisubmYKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKy5icgorI2luY2x1ZGUgPGxpYm5ldGxpbmsuaD4KKy5icgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKy5icgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorLnNwCitpbnQgcnRubF9vcGVuKHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoLCB1bnNpZ25lZCBzdWJzY3JpcHRpb25zKQorLnNwCitpbnQgcnRubF93aWxkZHVtcF9yZXF1ZXN0KHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoLCBpbnQgZmFtaWx5LCBpbnQgdHlwZSkKKy5zcAoraW50IHJ0bmxfc2VuZChzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0aCwgY2hhciAqYnVmLCBpbnQgbGVuKQorLnNwCitpbnQgcnRubF9kdW1wX3JlcXVlc3Qoc3RydWN0IHJ0bmxfaGFuZGxlICpydGgsIGludCB0eXBlLCB2b2lkICpyZXEsIGludCBsZW4pCisuc3AKK2ludCBydG5sX2R1bXBfZmlsdGVyKHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoLAorCQkgICAgIGludCAoKmZpbHRlcikoc3RydWN0IHNvY2thZGRyX25sICosIHN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqKSwKKwkJICAgICB2b2lkICphcmcxLAorCQkgICAgIGludCAoKmp1bmspKHN0cnVjdCBzb2NrYWRkcl9ubCAqLHN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqKSwKKwkJICAgICB2b2lkICphcmcyKQorLnNwCitpbnQgcnRubF90YWxrKHN0cnVjdCBydG5sX2hhbmRsZSAqcnRubCwgc3RydWN0IG5sbXNnaGRyICpuLCBwaWRfdCBwZWVyLAorCSAgICAgIHVuc2lnbmVkIGdyb3Vwcywgc3RydWN0IG5sbXNnaGRyICphbnN3ZXIsCisuYnIKKwkgICAgICBpbnQgKCpqdW5rKShzdHJ1Y3Qgc29ja2FkZHJfbmwgKixzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKiksCisuYnIKKwkgICAgICB2b2lkICpqYXJnKQorLnNwCitpbnQgcnRubF9saXN0ZW4oc3RydWN0IHJ0bmxfaGFuZGxlICpydG5sLCAKKwkgICAgICBpbnQgKCpoYW5kbGVyKShzdHJ1Y3Qgc29ja2FkZHJfbmwgKiwgc3RydWN0IHJ0bmxfY3RybF9kYXRhICosCisJCQkgICAgIHN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqKSwKKwkgICAgICB2b2lkICpqYXJnKQorLnNwCitpbnQgcnRubF9mcm9tX2ZpbGUoRklMRSAqcnRubCwgCisJICAgICAgaW50ICgqaGFuZGxlcikoc3RydWN0IHNvY2thZGRyX25sICosc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICopLAorCSAgICAgIHZvaWQgKmphcmcpCisuc3AKK2ludCBhZGRhdHRyMzIoc3RydWN0IG5sbXNnaGRyICpuLCBpbnQgbWF4bGVuLCBpbnQgdHlwZSwgX191MzIgZGF0YSkKKy5zcAoraW50IGFkZGF0dHJfbChzdHJ1Y3Qgbmxtc2doZHIgKm4sIGludCBtYXhsZW4sIGludCB0eXBlLCB2b2lkICpkYXRhLCBpbnQgYWxlbikKKy5zcAoraW50IHJ0YV9hZGRhdHRyMzIoc3RydWN0IHJ0YXR0ciAqcnRhLCBpbnQgbWF4bGVuLCBpbnQgdHlwZSwgX191MzIgZGF0YSkKKy5zcAoraW50IHJ0YV9hZGRhdHRyX2woc3RydWN0IHJ0YXR0ciAqcnRhLCBpbnQgbWF4bGVuLCBpbnQgdHlwZSwgdm9pZCAqZGF0YSwgaW50IGFsZW4pCisuU0ggREVTQ1JJUFRJT04KK2xpYm5ldGxpbmsgcHJvdmlkZXMgYSBoaWdoZXIgbGV2ZWwgaW50ZXJmYWNlIHRvIAorLkJSIHJ0bmV0bGluayg3KS4gCitUaGUgcmVhZCBmdW5jdGlvbnMgcmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlLgorVGhlIHNlbmQgZnVuY3Rpb25zIHJldHVybiB0aGUgYW1vdW50IG9mIGRhdGEgc2VudCwgb3IgLTEgb24gZXJyb3IuCisuVFAgCitydG5sX29wZW4KK09wZW4gYSBydG5ldGxpbmsgc29ja2V0IGFuZCBzYXZlIHRoZSBzdGF0ZSBpbnRvIHRoZQorLkIgcnRoCitoYW5kbGUuIFRoaXMgaGFuZGxlIGlzIHBhc3NlZCB0byBhbGwgc3Vic2VxdWVudCBjYWxscy4gCisuQiBzdWJzY3JpcHRpb25zCitpcyBhIGJpdG1hcCBvZiB0aGUgcnRuZXRsaW5rIG11bHRpY2FzdCBncm91cHMgdGhlIHNvY2tldCB3aWxsIGJlCithIG1lbWJlciBvZi4KKworLlRQCitydG5sX3dpbGRkdW1wX3JlcXVlc3QKK1JlcXVlc3QgYSBmdWxsIGR1bXAgb2YgdGhlIAorLkIgdHlwZQorZGF0YWJhc2UgZm9yCisuQiBmYW1pbHkKK2FkZHJlc3Nlcy4KKy5CIHR5cGUKK2lzIGEgcnRuZXRsaW5rIG1lc3NhZ2UgdHlwZS4gCisuXCIgWFhYCisKKy5UUAorcnRubF9kdW1wX3JlcXVlc3QKK1JlcXVlc3QgYSBmdWxsIGR1bXAgb2YgdGhlIAorLkIgdHlwZSAKK2RhdGEgYnVmZmVyIGludG8gCisuQiBidWYKK3dpdGggbWF4aW11bSBsZW5ndGggb2YKKy5CIGxlbi4KKy5CIHR5cGUKK2lzIGEgcnRuZXRsaW5rIG1lc3NhZ2UgdHlwZS4KKworLlRQCitydG5sX2R1bXBfZmlsdGVyCitSZWNlaXZlIG5ldGxpbmsgZGF0YSBhZnRlciBhIHJlcXVlc3QgYW5kIGZpbHRlciBpdC4KK1RoZQorLkIgZmlsdGVyCitjYWxsYmFjayBjaGVja3MgaWYgdGhlIHJlY2VpdmVkIG1lc3NhZ2UgaXMgd2FudGVkLiBJdCBnZXRzIHRoZSBzb3VyY2UKK2FkZHJlc3Mgb2YgdGhlIG1lc3NhZ2UsIHRoZSBtZXNzYWdlIGl0c2VsZiBhbmQKKy5CIGFyZzEgCithcyBhcmd1bWVudHMuIDAgYXMgcmV0dXJuIG1lYW5zIHRoYXQgdGhlIGZpbHRlciBwYXNzZWQsIGEgbmVnYXRpdmUKK3ZhbHVlIGlzIHJldHVybmVkCitieQorLkkgcnRubF9kdW1wX2ZpbHRlciAKK2luIGNhc2Ugb2YgZXJyb3IuIE5VTEwgZm9yIAorLkkgZmlsdGVyCittZWFucyB0byBub3QgdXNlIGEgZmlsdGVyLgorLkIganVuaworaXMgdXNlZCB0byBmaWx0ZXIgbWVzc2FnZXMgbm90IGRlc3RpbmVkIHRvIHRoZSBsb2NhbCBzb2NrZXQuCitPbmx5IG9uZSBtZXNzYWdlIGJ1bmRsZSBpcyByZWNlaXZlZC4gSWYgdGhlcmUgaXMgYSBtZXNzYWdlCitwZW5kaW5nLCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGJsb2NrLgorCisuVFAKK3J0bmxfbGlzdGVuCitSZWNlaXZlIG5ldGxpbmsgZGF0YSBhZnRlciBhIHJlcXVlc3QgYW5kIHBhc3MgaXQgdG8gCisuSSBoYW5kbGVyLgorLkIgaGFuZGxlcgoraXMgYSBjYWxsYmFjayB0aGF0IGdldHMgdGhlIG1lc3NhZ2Ugc291cmNlIGFkZHJlc3MsIGFuc2NpbGxhcnkgZGF0YSwgdGhlIG1lc3NhZ2UKK2l0c2VsZiwgYW5kIHRoZQorLkIgamFyZworY29va2llIGFzIGFyZ3VtZW50cy4gSXQgd2lsbCBnZXQgY2FsbGVkIGZvciBhbGwgcmVjZWl2ZWQgbWVzc2FnZXMuCitPbmx5IG9uZSBtZXNzYWdlIGJ1bmRsZSBpcyByZWNlaXZlZC4gSWYgdGhlcmUgaXMgYSBtZXNzYWdlCitwZW5kaW5nIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYmxvY2suCisKKy5UUAorcnRubF9mcm9tX2ZpbGUKK1dvcmtzIGxpa2UgCisuSSBydG5sX2xpc3RlbiwgCitidXQgcmVhZHMgYSBuZXRsaW5rIG1lc3NhZ2UgYnVuZGxlIGZyb20gdGhlIGZpbGUKKy5CIGZpbGUKK2FuZCBwYXNzZXMgdGhlIG1lc3NhZ2VzIHRvCisuQiBoYW5kbGVyCitmb3IgcGFyc2luZy4gVGhlIGZpbGUgc2hvdWxkIGNvbnRhaW4gcmF3IGRhdGEgYXMgcmVjZWl2ZWQgZnJvbSBhIHJ0bmV0bGluayBzb2NrZXQuCisuUFAKK1RoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSB1c2VmdWwgdG8gY29uc3RydWN0IGN1c3RvbSBydG5ldGxpbmsgbWVzc2FnZXMuIEZvcgorc2ltcGxlIGRhdGFiYXNlIGR1bXBpbmcgd2l0aCBmaWx0ZXJpbmcgaXQgaXMgYmV0dGVyIHRvIHVzZSB0aGUgaGlnaGVyIGxldmVsCitmdW5jdGlvbnMgYWJvdmUuIFNlZQorLkJSIHJ0bmV0bGluaygzKQorYW5kCisuQlIgbmV0bGluaygzKQorb24gaG93IHRvIGdlbmVyYXRlIGEgcnRuZXRsaW5rIG1lc3NhZ2UuIFRoZSBmb2xsb3dpbmcgdXRpbGl0eSBmdW5jdGlvbnMKK3JlcXVpcmUgYSBjb250aW51b3VzIGJ1ZmZlciB0aGF0IGFscmVhZHkgY29udGFpbnMgYSBuZXRsaW5rIG1lc3NhZ2UgaGVhZGVyCithbmQgYSBydG5ldGxpbmsgcmVxdWVzdC4gCisKKy5UUAorcnRubF9zZW5kCitTZW5kIHRoZSBydG5ldGxpbmsgbWVzc2FnZSBpbgorLkIgYnVmCitvZiBsZW5ndGgKKy5CIGxlbgordG8gaGFuZGxlCisuQiBydGguCisKKy5UUAorYWRkYXR0cjMyCitBZGQgYSBfX3UzMiBhdHRyaWJ1dGUgb2YgdHlwZQorLkIgdHlwZQorYW5kIHdpdGggdmFsdWUKKy5CIGRhdGEKK3RvIG5ldGxpbmsgbWVzc2FnZQorLkIgbiwKK3doaWNoIGlzIHBhcnQgb2YgYSBidWZmZXIgb2YgbGVuZ3RoCisuQiBtYXhsZW4uCisKKy5UUAorYWRkYXR0cl9sCitBZGQgYSB2YXJpYWJsZSBsZW5ndGggYXR0cmlidXRlIG9mIHR5cGUKKy5CIHR5cGUKK2FuZCB3aXRoIHZhbHVlCisuQiBkYXRhCithbmQKKy5CIGFsZW4KK2xlbmd0aCB0byBuZXRsaW5rIG1lc3NhZ2UKKy5CIG4sCit3aGljaCBpcyBwYXJ0IG9mIGEgYnVmZmVyIG9mIGxlbmd0aAorLkIgbWF4bGVuLgorLkIgZGF0YSAKK2lzIGNvcGllZC4KKworLlRQCitydGFfYWRkYXR0cjMyCitJbml0aWFsaXplIHRoZSBydG5ldGxpbmsgYXR0cmlidXRlCisuQiBydGEKK3dpdGggYSBfX3UzMiBkYXRhIHZhbHVlLgorCisuVFAKK3J0YV9hZGRhdHRyMzIKK0luaXRpYWxpemUgdGhlIHJ0bmV0bGluayBhdHRyaWJ1dGUKKy5CIHJ0YQord2l0aCBhIHZhcmlhYmxlIGxlbmd0aCBkYXRhIHZhbHVlLgorCisuU0ggQlVHUworVGhpcyBsaWJyYXJ5IGlzIG1lYW50IGZvciBpbnRlcm5hbCB1c2UsIHVzZSBsaWJtbmwgZm9yIG5ldyBwcm9ncmFtcy4KKworVGhlIGZ1bmN0aW9ucyBzb21ldGltZXMgdXNlIGZwcmludGYgYW5kIGV4aXQgd2hlbiBhIGZhdGFsIGVycm9yIG9jY3Vycy4KK1RoaXMgbGlicmFyeSBzaG91bGQgYmUgbmFtZWQgbGlicnRuZXRsaW5rLgorCisuU0ggQVVUSE9SUworbmV0bGluay9ydG5ldGxpbmsgd2FzIGRlc2lnbmVkIGFuZCB3cml0dGVuIGJ5IEFsZXhleSBLdXpuZXRzb3YuCitBbmRpIEtsZWVuIHdyb3RlIHRoZSBtYW4gcGFnZS4KKworLlNIIFNFRSBBTFNPCisuQlIgbmV0bGluayg3KSwKKy5CUiBydG5ldGxpbmsoNykKKy5icgorL3Vzci9pbmNsdWRlL2xpbnV4L3J0bmV0bGluay5oCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9tYW4vbWFuNy9NYWtlZmlsZSBiL2lwcm91dGUyL21hbi9tYW43L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZmQ4MzkKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9tYW4vbWFuNy9NYWtlZmlsZQpAQCAtMCwwICsxLDEzIEBACitNQU43UEFHRVMgPSB0Yy1oZnNjLjcKKworYWxsOgorCitkaXN0Y2xlYW46IGNsZWFuCisKK2NsZWFuOgorCitpbnN0YWxsOgorCSQoSU5TVEFMTERJUikgJChERVNURElSKSQoTUFORElSKS9tYW43CisJJChJTlNUQUxMTUFOKSAkKE1BTjdQQUdFUykgJChERVNURElSKSQoTUFORElSKS9tYW43CisKKy5QSE9OWTogaW5zdGFsbCBjbGVhbiBkaXN0Y2xlYW4KZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW43L3RjLWhmc2MuNyBiL2lwcm91dGUyL21hbi9tYW43L3RjLWhmc2MuNwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTA0OTYxCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbWFuL21hbjcvdGMtaGZzYy43CkBAIC0wLDAgKzEsNTYyIEBACisuVEggIlRDXC1IRlNDIiA3ICIzMSBPY3RvYmVyIDIwMTEiIGlwcm91dGUyIExpbnV4CisuU0ggIk5BTUUiCit0Yy1oZmNzIFwtIEhpZXJhcmNoaWNhbCBGYWlyIFNlcnZpY2UgQ3VydmUKKy4KKy5TSCAiSElTVE9SWSAmIElOVFJPRFVDVElPTiIKKy4KK0hGU0MgKEhpZXJhcmNoaWNhbCBGYWlyIFNlcnZpY2UgQ3VydmUpIGlzIGEgbmV0d29yayBwYWNrZXQgc2NoZWR1bGluZyBhbGdvcml0aG0gdGhhdCB3YXMgZmlyc3QgcHJlc2VudGVkIGF0CitTSUdDT01NJzk3LiBEZXZlbG9wZWQgYXMgYSBwYXJ0IG9mIEFMVFEgKEFMVGVybmF0aXZlIFF1ZXVpbmcpIG9uIE5ldEJTRCwgZm91bmQKK2l0cyB3YXkgcXVpY2tseSB0byBvdGhlciBCU0Qgc3lzdGVtcywgYW5kIHRoZW4gYSBmZXcgeWVhcnMgYWdvIGJlY2FtZSBwYXJ0IG9mCit0aGUgbGludXgga2VybmVsLiBTdGlsbCwgaXQncyBub3QgdGhlIG1vc3QgcG9wdWxhciBzY2hlZHVsaW5nIGFsZ29yaXRobSBcLQorZXNwZWNpYWxseSBpZiBjb21wYXJlZCB0byBIVEIgXC0gYW5kIGl0J3Mgbm90IHdlbGwgZG9jdW1lbnRlZCBmb3IgdGhlIGVuZHVzZXIuIFRoaXMgaW50cm9kdWN0aW9uIGFpbXMgdG8gZXhwbGFpbiBob3cgSEZTQyB3b3JrcyB3aXRob3V0IHVzaW5nCit0b28gbXVjaCBtYXRoIChhbHRob3VnaCBzb21lIG1hdGggaXQgd2lsbCBiZQoraW5ldml0YWJsZSkuCisKK0luIHNob3J0IEhGU0MgYWltcyB0bzoKKy4KKy5SUyA0CisuSVAgXGZCMSlcZlIgNAorZ3VhcmFudGVlIHByZWNpc2UgYmFuZHdpZHRoIGFuZCBkZWxheSBhbGxvY2F0aW9uIGZvciBhbGwgbGVhZiBjbGFzc2VzIChyZWFsdGltZQorY3JpdGVyaW9uKQorLklQIFxmQjIpXGZSCithbGxvY2F0ZSBleGNlc3MgYmFuZHdpZHRoIGZhaXJseSBhcyBzcGVjaWZpZWQgYnkgY2xhc3MgaGllcmFyY2h5IChsaW5rc2hhcmUgJgordXBwZXJsaW1pdCBjcml0ZXJpb24pCisuSVAgXGZCMylcZlIKK21pbmltaXplIGFueSBkaXNjcmVwYW5jeSBiZXR3ZWVuIHRoZSBzZXJ2aWNlIGN1cnZlIGFuZCB0aGUgYWN0dWFsIGFtb3VudCBvZgorc2VydmljZSBwcm92aWRlZCBkdXJpbmcgbGlua3NoYXJpbmcKKy5SRQorLlBQCisuCitUaGUgbWFpbiAic2VsbGluZyIgcG9pbnQgb2YgSEZTQyBpcyBmZWF0dXJlIFxmQigxKVxmUiwgd2hpY2ggaXMgYWNoaWV2ZWQgYnkKK3VzaW5nIG5vbmxpbmVhciBzZXJ2aWNlIGN1cnZlcyAobW9yZSBhYm91dCB3aGF0IGl0IGFjdHVhbGx5IGlzIGxhdGVyKS4gVGhpcyBpcworcGFydGljdWxhcmx5IHVzZWZ1bCBpbiBWb0lQIG9yIGdhbWVzLCB3aGVyZSBub3Qgb25seSBhIGd1YXJhbnRlZSBvZiBjb25zaXN0ZW50CitiYW5kd2lkdGggaXMgaW1wb3J0YW50LCBidXQgYWxzbyBsaW1pdGluZyB0aGUgaW5pdGlhbCBkZWxheSBvZiBhIGRhdGEgc3RyZWFtLiBOb3RlIHRoYXQKK2l0IG1hdHRlcnMgb25seSBmb3IgbGVhZiBjbGFzc2VzICh3aGVyZSB0aGUgYWN0dWFsIHF1ZXVlcyBhcmUpIFwtIHRodXMgY2xhc3MKK2hpZXJhcmNoeSBpcyBpZ25vcmVkIGluIHRoZSByZWFsdGltZSBjYXNlLgorCitGZWF0dXJlIFxmQigyKVxmUiBpcyB3ZWxsLCBvYnZpb3VzIFwtIGFueSBhbGdvcml0aG0gZmVhdHVyaW5nIGNsYXNzIGhpZXJhcmNoeQorKHN1Y2ggYXMgSFRCIG9yIENCUSkgc3RyaXZlcyB0byBhY2hpZXZlIHRoYXQuIEhGU0MgZG9lcyB0aGF0IHdlbGwsIGFsdGhvdWdoCit5b3UgbWlnaHQgZW5kIHdpdGggdW51c3VhbCBzaXR1YXRpb25zLCBpZiB5b3UgZGVmaW5lIHNlcnZpY2UgY3VydmVzIGNhcmVsZXNzbHkKK1wtIHNlZSBzZWN0aW9uIENPUk5FUiBDQVNFUyBmb3IgZXhhbXBsZXMuCisKK0ZlYXR1cmUgXGZCKDMpXGZSIGlzIG1lbnRpb25lZCBkdWUgdG8gdGhlIG5hdHVyZSBvZiB0aGUgcHJvYmxlbS4gVGhlcmUgbWF5IGJlCitzaXR1YXRpb25zIHdoZXJlIGl0J3MgZWl0aGVyIG5vdCBwb3NzaWJsZSB0byBndWFyYW50ZWUgc2VydmljZSBvZiBhbGwgY3VydmVzIGF0Cit0aGUgc2FtZSB0aW1lLCBhbmQvb3IgaXQncyBpbXBvc3NpYmxlIHRvIGRvIHNvIGZhaXJseS4gQm90aCB3aWxsIGJlIGV4cGxhaW5lZAorbGF0ZXIuIE5vdGUgdGhhdCB0aGlzIGlzIG1haW5seSByZWxhdGVkIHRvIGludGVyaW9yIChha2EgYWdncmVnYXRlKSBjbGFzc2VzLCBhcwordGhlIGxlYWZzIGFyZSBhbHJlYWR5IGhhbmRsZWQgYnkgXGZCKDEpXGZSLiBTdGlsbCwgaXQncyBwZXJmZWN0bHkgcG9zc2libGUgdG8KK2NyZWF0ZSBhIGxlYWYgY2xhc3Mgd2l0aG91dCByZWFsdGltZSBzZXJ2aWNlLCBhbmQgaW4gc3VjaCBhIGNhc2UgdGhlIGNhdmVhdHMgd2lsbAorbmF0dXJhbGx5IGV4dGVuZCB0byBsZWFmIGNsYXNzZXMgYXMgd2VsbC4KKworLlNIIEFCQlJFVklBVElPTlMKK0ZvciB0aGUgcmVtYWluaW5nIHBhcnQgb2YgdGhlIGRvY3VtZW50LCB3ZSdsbCB1c2UgZm9sbG93aW5nIHNob3J0Y3V0czoKKy5uZgorLlJTIDQKKworUlQgXC0gcmVhbHRpbWUKK0xTIFwtIGxpbmtzaGFyZQorVUwgXC0gdXBwZXJsaW1pdAorU0MgXC0gc2VydmljZSBjdXJ2ZQorLmZpCisuCisuU0ggIkJBU0lDUyBPRiBIRlNDIgorLgorVG8gdW5kZXJzdGFuZCBob3cgSEZTQyB3b3Jrcywgd2UgbXVzdCBmaXJzdCBpbnRyb2R1Y2UgYSBzZXJ2aWNlIGN1cnZlLgorT3ZlcmFsbCwgaXQncyBhIG5vbmRlY3JlYXNpbmcgZnVuY3Rpb24gb2Ygc29tZSB0aW1lIHVuaXQsIHJldHVybmluZyB0aGUgYW1vdW50CitvZgorc2VydmljZSAoYW4gYWxsb3dlZCBvciBhbGxvY2F0ZWQgYW1vdW50IG9mIGJhbmR3aWR0aCkgYXQgc29tZSBzcGVjaWZpYyBwb2ludCBpbgordGltZS4gVGhlIHB1cnBvc2Ugb2YgaXQgc2hvdWxkIGJlIHN1YmNvbnNjaW91c2x5IG9idmlvdXM6IGlmIGEgY2xhc3Mgd2FzCithbGxvd2VkIHRvIHRyYW5zZmVyIG5vdCBsZXNzIHRoYW4gdGhlIGFtb3VudCBzcGVjaWZpZWQgYnkgaXRzIHNlcnZpY2UgY3VydmUsCit0aGVuIHRoZSBzZXJ2aWNlIGN1cnZlIGlzIG5vdCB2aW9sYXRlZC4KKworU3RpbGwsIHdlIG5lZWQgbW9yZSBlbGFib3JhdGUgY3JpdGVyaW9uIHRoYW4ganVzdCB0aGUgYWJvdmUgKGFsdGhvdWdoIGluCit0aGUgbW9zdCBnZW5lcmljIGNhc2UgaXQgY2FuIGJlIHJlZHVjZWQgdG8gaXQpLiBUaGUgY3JpdGVyaW9uIGhhcyB0byB0YWtlIHR3bwordGhpbmdzIGludG8gYWNjb3VudDoKKy4KKy5SUyA0CisuSVAgXChidSA0CitpZGxpbmcgcGVyaW9kcworLklQIFwoYnUKK3RoZSBhYmlsaXR5IHRvICJsb29rIGJhY2siLCBzbyBpZiBkdXJpbmcgY3VycmVudCBhY3RpdmUgcGVyaW9kIHRoZSBzZXJ2aWNlIGN1cnZlIGlzIHZpb2xhdGVkLCBtYXliZSBpdAoraXNuJ3QgaWYgd2UgY291bnQgZXhjZXNzIGJhbmR3aWR0aCByZWNlaXZlZCBkdXJpbmcgZWFybGllciBhY3RpdmUgcGVyaW9kKHMpCisuUkUKKy5QUAorTGV0J3MgZGVmaW5lIHRoZSBjcml0ZXJpb24gYXMgZm9sbG93czoKKy5SUyA0CisubmYKKy5JUCAiXGZCKDEpXGZSIiA0CitGb3IgZWFjaCB0MSwgdGhlcmUgbXVzdCBleGlzdCB0MCBpbiBzZXQgQiwgc28gUyh0MVwtdDApXH48PVx+dyh0MCx0MSkKKy5maQorLlJFCisuCisuUFAKK0hlcmUgJ3cnIGRlbm90ZXMgdGhlIGFtb3VudCBvZiBzZXJ2aWNlIHJlY2VpdmVkIGR1cmluZyBzb21lIHRpbWUgcGVyaW9kIGJldHdlZW4gdDAKK2FuZCB0MS4gQiBpcyBhIHNldCBvZiBhbGwgdGltZXMsIHdoZXJlIGEgc2Vzc2lvbiBiZWNvbWVzIGFjdGl2ZSBhZnRlciBpZGxpbmcKK3BlcmlvZCAoZnVydGhlciBkZW5vdGVkIGFzICdiZWNvbWluZyBiYWNrbG9nZ2VkJykuIEZvciBhIGNsZWFyZXIgcGljdHVyZSwKK2ltYWdpbmUgdHdvIHNpdHVhdGlvbnM6CisuCisuUlMgNAorLklQIFxmQmEpXGZSIDQKK291ciBzZXNzaW9uIHdhcyBhY3RpdmUgZHVyaW5nIHR3byBwZXJpb2RzLCB3aXRoIGEgc21hbGwgdGltZSBnYXAgYmV0d2VlbiB0aGVtCisuSVAgXGZCYilcZlIKK2FzIGluIChhKSwgYnV0IHdpdGggYSBsYXJnZXIgZ2FwCisuUkUKKy4KKy5QUAorQ29uc2lkZXIgXGZCKGEpXGZSOiBpZiB0aGUgc2VydmljZSByZWNlaXZlZCBkdXJpbmcgYm90aCBwZXJpb2RzIG1lZXRzCitcZkIoMSlcZlIsIHRoZW4gYWxsIGlzIHdlbGwuIEJ1dCB3aGF0IGlmIGl0IGRvZXNuJ3QgZG8gc28gZHVyaW5nIHRoZSAybmQKK3BlcmlvZD8gSWYgdGhlIGFtb3VudCBvZiBzZXJ2aWNlIHJlY2VpdmVkIGR1cmluZyB0aGUgMXN0IHBlcmlvZCBpcyBsYXJnZXIKK3RoYW4gdGhlIHNlcnZpY2UgY3VydmUsIHRoZW4gaXQgbWlnaHQgY29tcGVuc2F0ZSBmb3Igc21hbGxlciBzZXJ2aWNlIGR1cmluZwordGhlIDJuZCBwZXJpb2QgXGZJYW5kXGZSIHRoZSBnYXAgXC0gaWYgdGhlIGdhcCBpcyBzbWFsbCBlbm91Z2guCisKK0lmIHRoZSBnYXAgaXMgbGFyZ2VyIFxmQihiKVxmUiBcLSB0aGVuIGl0J3MgbGVzcyBsaWtlbHkgdG8gaGFwcGVuICh1bmxlc3MgdGhlCitleGNlc3MgYmFuZHdpZHRoIGFsbG9jYXRlZCBkdXJpbmcgdGhlIDFzdCBwYXJ0IHdhcyByZWFsbHkgbGFyZ2UpLiBTdGlsbCwgdGhlCitsYXJnZXIgdGhlIGdhcCBcLSB0aGUgbGVzcyBpbnRlcmVzdGluZyBpcyB3aGF0IGhhcHBlbmVkIGluIHRoZSBwYXN0IChlLmcuIDEwCittaW51dGVzIGFnbykgXC0gd2hhdCBtYXR0ZXJzIGlzIHRoZSBjdXJyZW50IHRyYWZmaWMgdGhhdCBqdXN0IHN0YXJ0ZWQuCisKK0Zyb20gSEZTQydzIHBlcnNwZWN0aXZlLCBtb3JlIGludGVyZXN0aW5nIGlzIGFuc3dlcmluZyB0aGUgZm9sbG93aW5nIHF1ZXN0aW9uOgord2hlbiBzaG91bGQgd2Ugc3RhcnQgdHJhbnNmZXJyaW5nIHBhY2tldHMsIHNvIGEgc2VydmljZSBjdXJ2ZSBvZiBhIGNsYXNzIGlzIG5vdAordmlvbGF0ZWQuIE9yIHJlcGhyYXNpbmcgaXQ6IEhvdyBtdWNoIFgoKSBhbW91bnQgb2Ygc2VydmljZSBzaG91bGQgYSBzZXNzaW9uCityZWNlaXZlIGJ5IHRpbWUgdCwgc28gdGhlIHNlcnZpY2UgY3VydmUgaXMgbm90IHZpb2xhdGVkLiBGdW5jdGlvbiBYKCkgZGVmaW5lZAorYXMgYmVsb3cgaXMgdGhlIGJhc2ljIGJ1aWxkaW5nIGJsb2NrIG9mIEhGU0MsIHVzZWQgaW46IGVsaWdpYmxlLCBkZWFkbGluZSwKK3ZpcnR1YWxcLXRpbWUgYW5kIGZpdFwtdGltZSBjdXJ2ZXMuIE9mIGNvdXJzZSwgWCgpIGlzIGJhc2VkIG9uIGVxdWF0aW9uCitcZkIoMSlcZlIgYW5kIGlzIGRlZmluZWQgcmVjdXJzaXZlbHk6CisKKy5SUyA0CisuSVAgXChidSA0CitBdCB0aGUgMXN0IGJhY2tsb2dnZWQgcGVyaW9kIGJlZ2lubmluZyBmdW5jdGlvbiBYIGlzIGluaXRpYWxpemVkIHRvIGdlbmVyaWMKK3NlcnZpY2UgY3VydmUgYXNzaWduZWQgdG8gYSBjbGFzcworLklQIFwoYnUKK0F0IGFueSBzdWJzZXF1ZW50IGJhY2tsb2dnZWQgcGVyaW9kLCBYKCkgaXM6CisubmYKK1xmQm1pbihYKCkgZnJvbSBwcmV2aW91cyBwZXJpb2QgOyB3KHQwKStTKHRcLXQwKSBmb3IgdD49dDApLFxmUgorLmZpCitcJi4uLiB3aGVyZSB0MCBkZW5vdGVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgYmFja2xvZ2dlZCBwZXJpb2QuCisuUkUKKy4KKy5QUAorSEZTQyB1c2VzIGVpdGhlciBsaW5lYXIsIG9yIHR3b1wtcGllY2UgbGluZWFyIHNlcnZpY2UgY3VydmVzLiBJbiBjYXNlIG9mCitsaW5lYXIgb3IgdHdvXC1waWVjZSBsaW5lYXIgY29udmV4IGZ1bmN0aW9ucyAoZmlyc3Qgc2xvcGUgPCBzZWNvbmQgc2xvcGUpLAorbWluKCkgaW4gWCdzIGRlZmluaXRpb24gcmVkdWNlcyB0byB0aGUgMm5kIGFyZ3VtZW50LiBCdXQgaW4gY2FzZSBvZiB0d29cLXBpZWNlCitjb25jYXZlIGZ1bmN0aW9ucywgdGhlIDFzdCBhcmd1bWVudCBtaWdodCBxdWlja2x5IGJlY29tZSBsZXNzZXIgZm9yIHNvbWUKK3Q+PXQwLiBOb3RlLCB0aGF0IGZvciBzb21lIGJhY2tsb2dnZWQgcGVyaW9kLCBYKCkgaXMgZGVmaW5lZCBvbmx5IGZyb20gdGhhdAorcGVyaW9kJ3MgYmVnaW5uaW5nLiBXZSBhbHNvIGRlZmluZSBYXihcLTEpKHcpIGFzIHNtYWxsZXN0IHQ+PXQwLCBmb3Igd2hpY2gKK1godClcfj1cfncuIFdlIGhhdmUgdG8gZGVmaW5lIGl0IHRoaXMgd2F5LCBhcyBYKCkgaXMgdXN1YWxseSBub3QgYW4gaW5qZWN0aW9uLgorCitUaGUgYWJvdmUgZ2VuZXJpYyBYKCkgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorLgorLlJTIDQKKy5JUCAiRSgpIiA0CitJbiByZWFsdGltZSBjcml0ZXJpb24sIHNlbGVjdHMgcGFja2V0cyBlbGlnaWJsZSBmb3Igc2VuZGluZy4gSWYgbm9uZSBhcmUKK2VsaWdpYmxlLCBIRlNDIHdpbGwgdXNlIGxpbmtzaGFyZSBjcml0ZXJpb24uIEVsaWdpYmxlIHRpbWUgXCYnZXQnIGlzIGNhbGN1bGF0ZWQKK3dpdGggcmVmZXJlbmNlIHRvIHBhY2tldHMnIGhlYWRzICggZXRcfj1cfkVeKFwtMSkodykgKS4gSXQncyBiYXNlZCBvbiBSVAorc2VydmljZSBjdXJ2ZSwgXGZJYnV0IGluIGNhc2Ugb2YgYSBjb252ZXggY3VydmUsIHVzZXMgaXRzIDJuZCBzbG9wZSBvbmx5LlxmUgorLklQICJEKCkiCitJbiByZWFsdGltZSBjcml0ZXJpb24sIHNlbGVjdHMgdGhlIG1vc3Qgc3VpdGFibGUgcGFja2V0IGZyb20gdGhlIG9uZXMgY2hvc2VuCitieSBFKCkuIERlYWRsaW5lIHRpbWUgXCYnZHQnIGNvcnJlc3BvbmRzIHRvIHBhY2tldHMnIHRhaWxzCisoZHRcfj1cfkReKFwtMSkodytsKSwgd2hlcmUgXCYnbCcgaXMgcGFja2V0J3MgbGVuZ3RoKS4gQmFzZWQgb24gUlQgc2VydmljZQorY3VydmUuCisuSVAgIlYoKSIKK0luIGxpbmtzaGFyZSBjcml0ZXJpb24sIGFyYml0cmF0ZXMgd2hpY2ggcGFja2V0IHRvIHNlbmQgbmV4dC4gTm90ZSB0aGF0IFYoKSBpcworZnVuY3Rpb24gb2YgYSB2aXJ0dWFsIHRpbWUgXC0gc2VlIFxmQkxJTktTSEFSRSBDUklURVJJT05cZlIgc2VjdGlvbiBmb3IKK2RldGFpbHMuIFZpcnR1YWwgdGltZSBcJid2dCcgY29ycmVzcG9uZHMgdG8gcGFja2V0cycgaGVhZHMKKyh2dFx+PVx+Vl4oXC0xKSh3KSkuIEJhc2VkIG9uIExTIHNlcnZpY2UgY3VydmUuCisuSVAgIkYoKSIKK0FuIGV4dGVuc2lvbiB0byBsaW5rc2hhcmUgY3JpdGVyaW9uLCB1c2VkIHRvIGxpbWl0IGF0IHdoaWNoIHNwZWVkIGxpbmtzaGFyZQorY3JpdGVyaW9uIGlzIGFsbG93ZWQgdG8gZGVxdWV1ZS4gRml0XC10aW1lICdmdCcgY29ycmVzcG9uZHMgdG8gcGFja2V0cycgaGVhZHMKK2FzIHdlbGwgKGZ0XH49XH5GXihcLTEpKHcpKS4gQmFzZWQgb24gVUwgc2VydmljZSBjdXJ2ZS4KKy5SRQorCitCZSBzdXJlIHRvIG1ha2UgY2xlYW4gZGlzdGluY3Rpb24gYmV0d2VlbiBzZXNzaW9uJ3MgUlQsIExTIGFuZCBVTCBzZXJ2aWNlCitjdXJ2ZXMgYW5kIHRoZSBhYm92ZSAidXRpbGl0eSIgZnVuY3Rpb25zLgorLgorLlNIICJSRUFMVElNRSBDUklURVJJT04iCisuCitSVCBjcml0ZXJpb24gXGZJaWdub3JlcyBjbGFzcyBoaWVyYXJjaHlcZlIgYW5kIGd1YXJhbnRlZXMgcHJlY2lzZSBiYW5kd2lkdGggYW5kCitkZWxheSBhbGxvY2F0aW9uLiBXZSBzYXkgdGhhdCBhIHBhY2tldCBpcyBlbGlnaWJsZSBmb3Igc2VuZGluZywgd2hlbiB0aGUKK2N1cnJlbnQgcmVhbAordGltZSBpcyBsYXRlciB0aGFuIHRoZSBlbGlnaWJsZSB0aW1lIG9mIHRoZSBwYWNrZXQuIEZyb20gYWxsIGVsaWdpYmxlIHBhY2tldHMsIHRoZSBvbmUgbW9zdAorc3VpdGVkIGZvciBzZW5kaW5nIGlzIHRoZSBvbmUgd2l0aCB0aGUgc2hvcnRlc3QgZGVhZGxpbmUgdGltZS4gVGhpcyBzb3VuZHMKK3NpbXBsZSwgYnV0IGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKworSW50ZXJmYWNlIDEwTWJpdCwgdHdvIGNsYXNzZXMsIGJvdGggd2l0aCB0d29cLXBpZWNlIGxpbmVhciBzZXJ2aWNlIGN1cnZlczoKKy5SUyA0CisuSVAgXChidSA0Cisxc3QgY2xhc3MgXC0gMk1iaXQgZm9yIDEwMG1zLCB0aGVuIDdNYml0IChjb252ZXggXC0gMXN0IHNsb3BlIDwgMm5kIHNsb3BlKQorLklQIFwoYnUKKzJuZCBjbGFzcyBcLSA3TWJpdCBmb3IgMTAwbXMsIHRoZW4gMk1iaXQgKGNvbmNhdmUgXC0gMXN0IHNsb3BlID4gMm5kIHNsb3BlKQorLlJFCisuUFAKK0Fzc3VtZSBmb3IgYSBtb21lbnQsIHRoYXQgd2Ugb25seSB1c2UgRCgpIGZvciBib3RoIGZpbmRpbmcgZWxpZ2libGUgcGFja2V0cywKK2FuZCBjaG9vc2luZyB0aGUgbW9zdCBmaXR0aW5nIG9uZSwgdGh1cyBlbGlnaWJsZSB0aW1lIHdvdWxkIGJlIGNvbXB1dGVkIGFzCitEXihcLTEpKHcpIGFuZCBkZWFkbGluZSB0aW1lIHdvdWxkIGJlIGNvbXB1dGVkIGFzIEReKFwtMSkodytsKS4gSWYgdGhlIDJuZAorY2xhc3Mgc3RhcnRzIHNlbmRpbmcgcGFja2V0cyAxIHNlY29uZCBhZnRlciB0aGUgMXN0IGNsYXNzLCBpdCdzIG9mIGNvdXJzZQoraW1wb3NzaWJsZSB0byBndWFyYW50ZWUgMTRNYml0LCBhcyB0aGUgaW50ZXJmYWNlIGNhcGFiaWxpdHkgaXMgb25seSAxME1iaXQuCitUaGUgb25seSB3b3JrYXJvdW5kIGluIHRoaXMgc2NlbmFyaW8gaXMgdG8gYWxsb3cgdGhlIDFzdCBjbGFzcyB0byBzZW5kIHRoZQorcGFja2V0cyBlYXJsaWVyIHRoYXQgd291bGQgbm9ybWFsbHkgYmUgYWxsb3dlZC4gVGhhdCdzIHdoZXJlIHNlcGFyYXRlIEUoKSBjb21lcwordG8gaGVscC4gUHV0dGluZyBhbGwgdGhlIG1hdGggYXNpZGUgKHNlZSBIRlNDIHBhcGVyIGZvciBkZXRhaWxzKSwgRSgpIGZvciBSVAorY29uY2F2ZSBzZXJ2aWNlIGN1cnZlIGlzIGp1c3QgbGlrZSBEKCksIGJ1dCBmb3IgdGhlIFJUIGNvbnZleCBzZXJ2aWNlIGN1cnZlIFwtCitpdCdzIGNvbnN0cnVjdGVkIHVzaW5nIFxmSW9ubHlcZlIgUlQgc2VydmljZSBjdXJ2ZSdzIDJuZCBzbG9wZSAoaW4gb3VyIGV4YW1wbGUKKyA3TWJpdCkuCisKK1RoZSBlZmZlY3Qgb2Ygc3VjaCBFKCkgXC0gcGFja2V0cyB3aWxsIGJlIHNlbnQgZWFybGllciwgYW5kIGF0IHRoZSBzYW1lIHRpbWUKK0QoKSBcZkl3aWxsXGZSIGJlIHVwZGF0ZWQgXC0gc28gdGhlIGN1cnJlbnQgZGVhZGxpbmUgdGltZSBjYWxjdWxhdGVkIGZyb20gaXQKK3dpbGwgYmUgbGF0ZXIuIFRodXMsIHdoZW4gdGhlIDJuZCBjbGFzcyBzdGFydHMgc2VuZGluZyBwYWNrZXRzIGxhdGVyLCBib3RoCit0aGUgMXN0IGFuZCB0aGUgMm5kIGNsYXNzIHdpbGwgYmUgZWxpZ2libGUsIGJ1dCB0aGUgMm5kIHNlc3Npb24ncyBkZWFkbGluZQordGltZSB3aWxsIGJlIHNtYWxsZXIgYW5kIGl0cyBwYWNrZXRzIHdpbGwgYmUgc2VudCBmaXJzdC4gV2hlbiB0aGUgMXN0IGNsYXNzCitiZWNvbWVzIGlkbGUgYXQgc29tZSBsYXRlciBwb2ludCwgdGhlIDJuZCBjbGFzcyB3aWxsIGJlIGFibGUgdG8gImJ1ZmZlciIgdXAKK2FnYWluIGZvciBsYXRlciBhY3RpdmUgcGVyaW9kIG9mIHRoZSAxc3QgY2xhc3MuCisKK0Egc2hvcnQgcmVtYXJrIFwtIGluIGEgc2l0dWF0aW9uLCB3aGVyZSB0aGUgdG90YWwgYW1vdW50IG9mIGJhbmR3aWR0aAorYXZhaWxhYmxlIG9uIHRoZSBpbnRlcmZhY2UgaXMgbGFyZ2VyIHRoYW4gdGhlIGFsbG9jYXRlZCB0b3RhbCByZWFsdGltZSBwYXJ0cworKGltYWdpbmUgYSAxMCBNYml0IGludGVyZmFjZSwgYnV0IDFNYml0LzJNYml0IGFuZCAyTWJpdC8xTWJpdCBjbGFzc2VzKSwgdGhlIHNvbGUKK3NwZWVkIG9mIHRoZSBpbnRlcmZhY2UgY291bGQgc3VmZmljZSB0byBndWFyYW50ZWUgdGhlIHRpbWVzLgorCitJbXBvcnRhbnQgcGFydCBvZiBSVCBjcml0ZXJpb24gaXMgdGhhdCBhcGFydCBmcm9tIHVwZGF0aW5nIGl0cyBEKCkgYW5kIEUoKSwKK2Fsc28gVigpIHVzZWQgYnkgTFMgY3JpdGVyaW9uIGlzIHVwZGF0ZWQuIEdlbmVyYWxseSB0aGUgUlQgY3JpdGVyaW9uIGlzCitzZWNvbmRhcnkgdG8gTFMgb25lLCBhbmQgdXNlZCBcZklvbmx5XGZSIGlmIHRoZXJlJ3MgYSByaXNrIG9mIHZpb2xhdGluZyBwcmVjaXNlCityZWFsdGltZSByZXF1aXJlbWVudHMuIFN0aWxsLCB0aGUgInBhcnRpY2lwYXRpb24iIGluIGJhbmR3aWR0aCBkaXN0cmlidXRlZCBieQorTFMgY3JpdGVyaW9uIGlzIHRoZXJlLCBzbyBWKCkgaGFzIHRvIGJlIHVwZGF0ZWQgYWxvbmcgdGhlIHdheS4gTFMgY3JpdGVyaW9uIGNhbgordGhhbiBwcm9wZXJseSBjb21wZW5zYXRlIGZvciBub25cLWlkZWFsIGZhaXIgc2hhcmluZyBzaXR1YXRpb24sIGNhdXNlZCBieSBSVAorc2NoZWR1bGluZy4gSWYgeW91IHVzZSBVTCBzZXJ2aWNlIGN1cnZlIGl0cyBGKCkgd2lsbCBiZSB1cGRhdGVkIGFzIHdlbGwgKFVMCitzZXJ2aWNlIGN1cnZlIGlzIGFuIGV4dGVuc2lvbiB0byBMUyBvbmUgXC0gc2VlIFxmQlVQUEVSTElNSVQgQ1JJVEVSSU9OXGZSCitzZWN0aW9uKS4KKworQW55d2F5IFwtIGNhcmVsZXNzIHNwZWNpZmljYXRpb24gb2YgTFMgYW5kIFJUIHNlcnZpY2UgY3VydmVzIGNhbiBsZWFkIHRvCitwb3RlbnRpYWxseSB1bmRlc2lyZWQgc2l0dWF0aW9ucyAoc2VlIENPUk5FUiBDQVNFUyBmb3IgZXhhbXBsZXMpLiBUaGlzIHdhc24ndAordGhlIGNhc2UgaW4gSEZTQyBwYXBlciB3aGVyZSBMUyBhbmQgUlQgc2VydmljZSBjdXJ2ZXMgY291bGRuJ3QgYmUgc3BlY2lmaWVkCitzZXBhcmF0ZWx5LgorCisuU0ggIkxJTktTSEFSSU5HIENSSVRFUklPTiIKKy4KK0xTIGNyaXRlcmlvbidzIHRhc2sgaXMgdG8gZGlzdHJpYnV0ZSBiYW5kd2lkdGggYWNjb3JkaW5nIHRvIHNwZWNpZmllZCBjbGFzcworaGllcmFyY2h5LiBDb250cmFyeSB0byBSVCBjcml0ZXJpb24sIHRoZXJlJ3JlIG5vIGNvbXBhcmlzb25zIGJldHdlZW4gY3VycmVudAorcmVhbCB0aW1lIGFuZCB2aXJ0dWFsIHRpbWUgXC0gdGhlIGRlY2lzaW9uIGlzIGJhc2VkIHNvbGVseSBvbiBkaXJlY3QgY29tcGFyaXNvbgorb2YgdmlydHVhbCB0aW1lcyBvZiBhbGwgYWN0aXZlIHN1YmNsYXNzZXMgXC0gdGhlIG9uZSB3aXRoIHRoZSBzbWFsbGVzdCB2dCB3aW5zCithbmQgZ2V0cyBzY2hlZHVsZWQuIE9uZSBpbW1lZGlhdGUgY29uY2x1c2lvbiBmcm9tIHRoaXMgZmFjdCBpcyB0aGF0IGFic29sdXRlCit2YWx1ZXMgZG9uJ3QgbWF0dGVyIFwtIG9ubHkgcmF0aW9zIGJldHdlZW4gdGhlbSAoc28gZm9yIGV4YW1wbGUsIHR3byBjaGlsZHJlbgorY2xhc3NlcyB3aXRoIHNpbXBsZSBsaW5lYXIgMU1iaXQgc2VydmljZSBjdXJ2ZXMgd2lsbCBnZXQgdGhlIHNhbWUgdHJlYXRtZW50Citmcm9tIExTIGNyaXRlcmlvbidzIHBlcnNwZWN0aXZlLCBhcyBpZiB0aGV5IHdlcmUgNU1iaXQpLiBUaGUgb3RoZXIgY29uY2x1c2lvbgoraXMsIHRoYXQgaW4gcGVyZmVjdGx5IGZsdWlkIHN5c3RlbSB3aXRoIGxpbmVhciBjdXJ2ZXMsIGFsbCB2aXJ0dWFsIHRpbWVzIGFjcm9zcword2hvbGUgY2xhc3MgaGllcmFyY2h5IHdvdWxkIGJlIGVxdWFsLgorCitXaHkgaXMgVkMgZGVmaW5lZCBpbiB0ZXJtIG9mIHZpcnR1YWwgdGltZSAoYW5kIHdoYXQgaXMgaXQpPworCitJbWFnaW5lIGFuIGV4YW1wbGU6IGNsYXNzIEEgd2l0aCB0d28gY2hpbGRyZW4gXC0gQTEgYW5kIEEyLCBib3RoIHdpdGggbGV0J3Mgc2F5CisxME1iaXQgU0NzLiBJZiBBMiBpcyBpZGxlLCBBMSByZWNlaXZlcyBhbGwgdGhlIGJhbmR3aWR0aCBvZiBBIChhbmQgdXBkYXRlIGl0cworVigpIGluIHRoZSBwcm9jZXNzKS4gV2hlbiBBMiBiZWNvbWVzIGFjdGl2ZSwgQTEncyB2aXJ0dWFsIHRpbWUgaXMgYWxyZWFkeQorXGZJZmFyXGZSIGxhdGVyIHRoYW4gQTIncyBvbmUuIENvbnNpZGVyaW5nIHRoZSB0eXBlIG9mIGRlY2lzaW9uIG1hZGUgYnkgTFMKK2NyaXRlcmlvbiwgQTEgd291bGQgYmVjb21lIGlkbGUgZm9yIGEgbG9uZyB0aW1lLiBXZSBjYW4gd29ya2Fyb3VuZCB0aGlzCitzaXR1YXRpb24gYnkgYWRqdXN0aW5nIHZpcnR1YWwgdGltZSBvZiB0aGUgY2xhc3MgYmVjb21pbmcgYWN0aXZlIFwtIHdlIGRvIHRoYXQKK2J5IGdldHRpbmcgc3VjaCB0aW1lICJ1cCB0byBkYXRlIi4gSEZTQyB1c2VzIGEgbWVhbiBvZiB0aGUgc21hbGxlc3QgYW5kIHRoZQorYmlnZ2VzdCB2aXJ0dWFsIHRpbWUgb2YgY3VycmVudGx5IGFjdGl2ZSBjaGlsZHJlbiBmaXQgZm9yIHNlbmRpbmcuIEFzIGl0J3Mgbm90CityZWFsIHRpbWUgYW55bW9yZSAoZXhjbHVkaW5nIHRyaXZpYWwgY2FzZSBvZiBzaXR1YXRpb24gd2hlcmUgYWxsIGNsYXNzZXMgYmVjb21lCithY3RpdmUgYXQgdGhlIHNhbWUgdGltZSwgYW5kIG5ldmVyIGJlY29tZSBpZGxlKSwgaXQncyBjYWxsZWQgdmlydHVhbCB0aW1lLgorCitTdWNoIGFwcHJvYWNoIGhhcyBpdHMgcHJpY2UgdGhvdWdoLiBUaGUgcHJvYmxlbSBpcyBhbmFsb2dvdXMgdG8gd2hhdCB3YXMKK3ByZXNlbnRlZCBpbiBwcmV2aW91cyBzZWN0aW9uIGFuZCBpcyBjYXVzZWQgYnkgbm9uXC1saW5lYXJpdHkgb2Ygc2VydmljZQorY3VydmVzOgorLklQIDEpIDQKK2VpdGhlciBpdCdzIGltcG9zc2libGUgdG8gZ3VhcmFudGVlIHNlcnZpY2UgY3VydmVzIGFuZCBzYXRpc2Z5IGZhaXJuZXNzCitkdXJpbmcgY2VydGFpbiB0aW1lIHBlcmlvZHM6CisKKy5SUyA0CitSZWNhbGwgdGhlIGV4YW1wbGUgZnJvbSBSVCBzZWN0aW9uLCBzbGlnaHRseSBtb2RpZmllZCAod2l0aCAzTWJpdCBzbG9wZXMKK2luc3RlYWQgb2YgMk1iaXQgb25lcyk6CisKKy5JUCBcKGJ1IDQKKzFzdCBjbGFzcyBcLSAzTWJpdCBmb3IgMTAwbXMsIHRoZW4gN01iaXQgKGNvbnZleCBcLSAxc3Qgc2xvcGUgPCAybmQgc2xvcGUpCisuSVAgXChidQorMm5kIGNsYXNzIFwtIDdNYml0IGZvciAxMDBtcywgdGhlbiAzTWJpdCAoY29uY2F2ZSBcLSAxc3Qgc2xvcGUgPiAybmQgc2xvcGUpCisKKy5QUAorVGhleSBzdW0gdXAgbmljZWx5IHRvIDEwTWJpdCBcLSB0aGUgaW50ZXJmYWNlJ3MgY2FwYWNpdHkuIEJ1dCBpZiB3ZSB3YW50ZWQgdG8gb25seQordXNlIExTIGZvciBndWFyYW50ZWVzIGFuZCBmYWlybmVzcyBcLSBpdCBzaW1wbHkgd29uJ3Qgd29yay4gSW4gTFMgY29udGV4dCwKK29ubHkgVigpIGlzIHVzZWQgZm9yIG1ha2luZyBkZWNpc2lvbiB3aGljaCBjbGFzcyB0byBzY2hlZHVsZS4gSWYgdGhlIDJuZCBjbGFzcworYmVjb21lcyBhY3RpdmUgd2hlbiB0aGUgMXN0IG9uZSBpcyBpbiBpdHMgc2Vjb25kIHNsb3BlLCB0aGUgZmFpcm5lc3Mgd2lsbCBiZQorcHJlc2VydmVkIFwtIHJhdGlvIHdpbGwgYmUgMToxICg3TWJpdDo3TWJpdCksIGJ1dCBMUyBpdHNlbGYgaXMgb2YgY291cnNlCit1bmFibGUgdG8gZ3VhcmFudGVlIHRoZSBhYnNvbHV0ZSB2YWx1ZXMgdGhlbXNlbHZlcyBcLSBhcyBpdCB3b3VsZCBoYXZlIHRvIGdvCitiZXlvbmQgb2Ygd2hhdCB0aGUgaW50ZXJmYWNlIGlzIGNhcGFibGUgb2YuCisuUkUKKworLklQIDIpIDQKK2FuZC9vciBpdCdzIGltcG9zc2libGUgdG8gZ3VhcmFudGVlIHNlcnZpY2UgY3VydmVzIG9mIGFsbCBjbGFzc2VzIGF0IHRoZSBzYW1lCit0aW1lIFtmYWlybHkgb3Igbm90XToKKworLlJTIDQKKworVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBhYm92ZSBjYXNlLCBidXQgYSBiaXQgbW9yZSBzdWJ0bGUuIFdlIHdpbGwgY29uc2lkZXIgdHdvCitzdWJ0cmVlcywgYXJiaXRyYXRlZCBieSB0aGVpciBjb21tb24gKHJvb3QgaGVyZSkgcGFyZW50OgorCisubmYKK1IgKHJvb3QpIC1cIDEwTWJpdAorCitBICBcLSA3TWJpdCwgdGhlbiAzTWJpdAorQTEgXC0gNU1iaXQsIHRoZW4gMk1iaXQKK0EyIFwtIDJNYml0LCB0aGVuIDFNYml0CisKK0IgIFwtIDNNYml0LCB0aGVuIDdNYml0CisuZmkKKworUiBhcmJpdHJhdGVzIGJldHdlZW4gbGVmdCBzdWJ0cmVlIChBKSBhbmQgcmlnaHQgKEIpLiBBc3N1bWUgdGhhdCBBMiBhbmQgQiBhcmUKK2NvbnN0YW50bHkgYmFja2xvZ2dlZCwgYW5kIGF0IHNvbWUgbGF0ZXIgcG9pbnQgQTEgYmVjb21lcyBiYWNrbG9nZ2VkICh3aGVuIGFsbAorb3RoZXIgY2xhc3NlcyBhcmUgaW4gdGhlaXIgMm5kIGxpbmVhciBwYXJ0KS4KKworV2hhdCBoYXBwZW5zIG5vdz8gQiAoY2hvaWNlIG1hZGUgYnkgUikgd2lsbCBcZklhbHdheXNcZlIgZ2V0IDcgTWJpdCBhcyBSIGlzCitvbmx5IChvYnZpb3VzbHkpIGNvbmNlcm5lZCB3aXRoIHRoZSByYXRpbyBiZXR3ZWVuIGl0cyBkaXJlY3QgY2hpbGRyZW4uIFRodXMgQQorc3VidHJlZSBnZXRzIDNNYml0LCBidXQgaXRzIGNoaWxkcmVuIHdvdWxkIHdhbnQgKGF0IHRoZSBwb2ludCB3aGVuIEExIGJlY2FtZQorYmFja2xvZ2dlZCkgNU1iaXQgKyAxTWJpdC4gVGhhdCdzIG9mIGNvdXJzZSBpbXBvc3NpYmxlLCBhcyB0aGV5IGNhbiBvbmx5IGdldAorM01iaXQgZHVlIHRvIGludGVyZmFjZSBsaW1pdGF0aW9uLgorCitJbiB0aGUgbGVmdCBzdWJ0cmVlIFwtIHdlIGhhdmUgdGhlIHNhbWUgc2l0dWF0aW9uIGFzIHByZXZpb3VzbHkgKGZhaXIgc3BsaXQKK2JldHdlZW4gQTEgYW5kIEEyLCBidXQgdmlvbGF0ZWQgZ3VhcmFudGVlcyksIGJ1dCBpbiB0aGUgd2hvbGUgdHJlZSBcLSB0aGVyZSdzCitubyBmYWlybmVzcyAoQiBnb3QgN01iaXQsIGJ1dCBBMSBhbmQgQTIgaGF2ZSB0byBmaXQgdG9nZXRoZXIgaW4gM01iaXQpIGFuZAordGhlcmUncyBubyBndWFyYW50ZWVzIGZvciBhbGwgY2xhc3NlcyAob25seSBCIGdvdCB3aGF0IGl0IHdhbnRlZCkuIEV2ZW4gaWYgd2UKK3Zpb2xhdGVkIGZhaXJuZXNzIGluIHRoZSBBIHN1YnRyZWUgYW5kIHNldCBBMidzIHNlcnZpY2UgY3VydmUgdG8gMCwgQTEgd291bGQKK3N0aWxsIG5vdCBnZXQgdGhlIHJlcXVpcmVkIGJhbmR3aWR0aC4KKy5SRQorLgorLlNIICJVUFBFUkxJTUlUIENSSVRFUklPTiIKKy4KK1VMIGNyaXRlcmlvbiBpcyBhbiBleHRlbnNpb25zIHRvIExTIG9uZSwgdGhhdCBwZXJtaXRzIHNlbmRpbmcgcGFja2V0cyBvbmx5CitpZiBjdXJyZW50IHJlYWwgdGltZSBpcyBsYXRlciB0aGFuIGZpdFwtdGltZSAoJ2Z0JykuIFNvIHRoZSBtb2RpZmllZCBMUworY3JpdGVyaW9uIGJlY29tZXM6IGNob29zZSB0aGUgc21hbGxlc3QgdmlydHVhbCB0aW1lIGZyb20gYWxsIGFjdGl2ZSBjaGlsZHJlbiwKK3N1Y2ggdGhhdCBmaXRcLXRpbWUgPCBjdXJyZW50IHJlYWwgdGltZSBhbHNvIGhvbGRzLiBGaXRcLXRpbWUgaXMgY2FsY3VsYXRlZAorZnJvbSBGKCksIHdoaWNoIGlzIGJhc2VkIG9uIFVMIHNlcnZpY2UgY3VydmUuIEFzIHlvdSBjYW4gc2VlLCBpdHMgcm9sZSBpcwora2luZGEgc2ltaWxhciB0byBFKCkgdXNlZCBpbiBSVCBjcml0ZXJpb24uIEFsc28sIGZvciBvYnZpb3VzIHJlYXNvbnMgXC0geW91CitjYW4ndCBzcGVjaWZ5IFVMIHNlcnZpY2UgY3VydmUgd2l0aG91dCBMUyBvbmUuCisKK1RoZSBtYWluIHB1cnBvc2Ugb2YgdGhlIFVMIHNlcnZpY2UgY3VydmUgaXMgdG8gbGltaXQgSEZTQyB0byBiYW5kd2lkdGggYXZhaWxhYmxlIG9uIHRoZQordXBzdHJlYW0gcm91dGVyICh0aGluayBhZHNsIGhvbWUgbW9kZW0vcm91dGVyLCBhbmQgbGludXggc2VydmVyIGFzCitOQVQvZmlyZXdhbGwvZXRjLiB3aXRoIDEwME1iaXQrIGNvbm5lY3Rpb24gdG8gbWVudGlvbmVkIG1vZGVtL3JvdXRlcikuCitUeXBpY2FsbHksIGl0J3MgdXNlZCB0byBjcmVhdGUgYSBzaW5nbGUgY2xhc3MgZGlyZWN0bHkgdW5kZXIgcm9vdCwgc2V0dGluZworYSBsaW5lYXIgVUwgc2VydmljZSBjdXJ2ZSB0byBhdmFpbGFibGUgYmFuZHdpZHRoIFwtIGFuZCB0aGVuIGNyZWF0aW5nIHlvdXIgY2xhc3MKK3N0cnVjdHVyZSBmcm9tIHRoYXQgY2xhc3MgZG93bndhcmRzLiBPZiBjb3Vyc2UsIHlvdSdyZSBmcmVlIHRvIGFkZCBhIFVMIHNlcnZpY2UKK2N1cnZlIChsaW5lYXIgb3Igbm90KSB0byBhbnkgY2xhc3Mgd2l0aCBMUyBjcml0ZXJpb24uCisKK0FuIGltcG9ydGFudCBwYXJ0IGFib3V0IHRoZSBVTCBzZXJ2aWNlIGN1cnZlIGlzIHRoYXQgd2hlbmV2ZXIgYXQgc29tZSBwb2ludCBpbiB0aW1lCithIGNsYXNzIGRvZXNuJ3QgcXVhbGlmeSBmb3IgbGlua3NoYXJpbmcgZHVlIHRvIGl0cyBmaXRcLXRpbWUsIHRoZSBuZXh0IHRpbWUgaXQKK2RvZXMgcXVhbGlmeSBpdCB3aWxsIHVwZGF0ZSBpdHMgdmlydHVhbCB0aW1lIHRvIHRoZSBzbWFsbGVzdCB2aXJ0dWFsIHRpbWUgb2YKK2FsbCBhY3RpdmUgY2hpbGRyZW4gZml0IGZvciBsaW5rc2hhcmluZy4gVGhpcyB3YXksIG9uZSBvZiB0aGUgbWFpbiB0aGluZ3MgdGhlIExTCitjcml0ZXJpb24gdHJpZXMgdG8gYWNoaWV2ZSBcLSBlcXVhbGl0eSBvZiBhbGwgdmlydHVhbCB0aW1lcyBhY3Jvc3Mgd2hvbGUKK2hpZXJhcmNoeSBcLSBpcyBwcmVzZXJ2ZWQgKGluIHBlcmZlY3RseSBmbHVpZCBzeXN0ZW0gd2l0aCBvbmx5IGxpbmVhciBjdXJ2ZXMsCithbGwgdmlydHVhbCB0aW1lcyB3b3VsZCBiZSBlcXVhbCkuCisKK1dpdGhvdXQgdGhhdCwgJ3Z0JyB3b3VsZCBsYWcgYmVoaW5kIG90aGVyIHZpcnR1YWwgdGltZXMsIGFuZCBjb3VsZCBjYXVzZQorcHJvYmxlbXMuIENvbnNpZGVyIGFuIGludGVyZmFjZSB3aXRoIGEgY2FwYWNpdHkgb2YgMTBNYml0LCBhbmQgdGhlIGZvbGxvd2luZyBsZWFmIGNsYXNzZXMKKyhqdXN0IGluIGNhc2UgeW91J3JlIHNraXBwaW5nIHRoaXMgdGV4dCBxdWlja2x5IFwtIHRoaXMgZXhhbXBsZSBzaG93cyBiZWhhdmlvcgordGhhdCBcZihCSWRvZXNuJ3QgaGFwcGVuXGZSKToKKworLm5mCitBIFwtIGxzIDUuME1iaXQKK0IgXC0gbHMgMi41TWJpdAorQyBcLSBscyAyLjVNYml0LCB1bCAyLjVNYml0CisuZmkKKworSWYgQiB3YXMgaWRsZSwgd2hpbGUgQSBhbmQgQyB3ZXJlIGNvbnN0YW50bHkgYmFja2xvZ2dlZCwgQSBhbmQgQyB3b3VsZCBub3JtYWxseQorKGFzIGZhciBhcyBMUyBjcml0ZXJpb24gaXMgY29uY2VybmVkKSBkaXZpZGUgYmFuZHdpZHRoIGluIDI6MSByYXRpby4gQnV0IGR1ZQordG8gVUwgc2VydmljZSBjdXJ2ZSBpbiBwbGFjZSwgQyB3b3VsZCBnZXQgYXQgbW9zdCAyLjVNYml0LCBhbmQgQSB3b3VsZCBnZXQgdGhlCityZW1haW5pbmcgNy41TWJpdC4gVGhlIGxvbmdlciB0aGUgYmFja2xvZ2dlZCBwZXJpb2QsIHRoZSBtb3JlIHRoZSB2aXJ0dWFsIHRpbWVzIG9mCitBIGFuZCBDIHdvdWxkIGRyaWZ0IGFwYXJ0LiBJZiBCIGJlY2FtZSBiYWNrbG9nZ2VkIGF0IHNvbWUgbGF0ZXIgcG9pbnQgaW4gdGltZSwKK2l0cyB2aXJ0dWFsIHRpbWUgd291bGQgYmUgc2V0IHRvIChBJ3NcfnZ0XH4rXH5DJ3NcfnZ0KS8yLCB0aHVzIGJsb2NraW5nIEEgZnJvbQorc2VuZGluZyBhbnkgdHJhZmZpYyB1bnRpbCBCJ3MgdmlydHVhbCB0aW1lIGNhdGNoZXMgdXAgd2l0aCBBLgorLgorLlNIICJTRVBBUkFURSBMUyAvIFJUIFNDcyIKKy4KK0Fub3RoZXIgZGlmZmVyZW5jZSBmcm9tIHRoZSBvcmlnaW5hbCBIRlNDIHBhcGVyIGlzIHRoYXQgUlQgYW5kIExTIFNDcyBjYW4gYmUKK3NwZWNpZmllZCBzZXBhcmF0ZWx5LiBNb3Jlb3ZlciwgbGVhZiBjbGFzc2VzIGFyZSBhbGxvd2VkIHRvIGhhdmUgb25seSBlaXRoZXIKK1JUIFNDIG9yIExTIFNDLiBGb3IgaW50ZXJpb3IgY2xhc3Nlcywgb25seSBMUyBTQ3MgbWFrZSBzZW5zZTogYW55IFJUIFNDIHdpbGwKK2JlIGlnbm9yZWQuCisuCisuU0ggIkNPUk5FUiBDQVNFUyIKKy4KK1NlcGFyYXRlIHNlcnZpY2UgY3VydmVzIGZvciBMUyBhbmQgUlQgY3JpdGVyaWEgY2FuIGxlYWQgdG8gY2VydGFpbiB0cmFwcwordGhhdCBjb21lIGZyb20gImZpZ2h0aW5nIiBiZXR3ZWVuIGlkZWFsIGxpbmtzaGFyaW5nIGFuZCBlbmZvcmNlZCByZWFsdGltZQorZ3VhcmFudGVlcy4gVGhvc2Ugc2l0dWF0aW9ucyBkaWRuJ3QgZXhpc3QgaW4gb3JpZ2luYWwgSEZTQyBwYXBlciwgd2hlcmUKK3NwZWNpZnlpbmcgc2VwYXJhdGUgTFMgLyBSVCBzZXJ2aWNlIGN1cnZlcyB3YXMgbm90IGRpc2N1c3NlZC4KKworQ29uc2lkZXIgYW4gaW50ZXJmYWNlIHdpdGggYSAxME1iaXQgY2FwYWNpdHksIHdpdGggdGhlIGZvbGxvd2luZyBsZWFmIGNsYXNzZXM6CisKKy5uZgorQSBcLSBscyA1LjBNYml0LCBydCA4TWJpdAorQiBcLSBscyAyLjVNYml0CitDIFwtIGxzIDIuNU1iaXQKKy5maQorCitJbWFnaW5lIEEgYW5kIEMgYXJlIGNvbnN0YW50bHkgYmFja2xvZ2dlZC4gQXMgQiBpcyBpZGxlLCBBIGFuZCBDIHdvdWxkIGRpdmlkZQorYmFuZHdpZHRoIGluIDI6MSByYXRpbywgY29uc2lkZXJpbmcgTFMgc2VydmljZSBjdXJ2ZSAoc28gaW4gdGhlb3J5IFwtIDYuNjYgYW5kCiszLjMzKS4gQWxhcyBSVCBjcml0ZXJpb24gdGFrZXMgcHJpb3JpdHksIHNvIEEgd2lsbCBnZXQgOE1iaXQgYW5kIExTIHdpbGwgYmUKK2FibGUgdG8gY29tcGVuc2F0ZSBjbGFzcyBDIGZvciBvbmx5IDIgTWJpdCBcLSB0aGlzIHdpbGwgY2F1c2UgZGlzY3JlcGFuY3kKK2JldHdlZW4gdmlydHVhbCB0aW1lcyBvZiBBIGFuZCBDLgorCitBc3N1bWUgdGhpcyBzaXR1YXRpb24gbGFzdHMgZm9yIGEgbG9uZyB0aW1lIHdpdGggbm8gaWRsZSBwZXJpb2RzLCBhbmQKK3N1ZGRlbmx5IEIgYmVjb21lcyBhY3RpdmUuIEIncyB2aXJ0dWFsIHRpbWUgd2lsbCBiZSB1cGRhdGVkIHRvCisoQSdzXH52dFx+K1x+QydzXH52dCkvMiwgZWZmZWN0aXZlbHkgbGFuZGluZyBpbiB0aGUgbWlkZGxlIGJldHdlZW4gQSdzIGFuZCBDJ3MKK3ZpcnR1YWwgdGltZS4gVGhlIGVmZmVjdCBcLSBCLCBoYXZpbmcgbm8gUlQgZ3VhcmFudGVlcywgd2lsbCBiZSBwdW5pc2hlZCBhbmQKK3dpbGwgbm90IGJlIGFsbG93ZWQgdG8gdHJhbnNmZXIgdW50aWwgQydzIHZpcnR1YWwgdGltZSBjYXRjaGVzIHVwLgorCitJZiB0aGUgaW50ZXJmYWNlIGhhZCBhIGhpZ2hlciBjYXBhY2l0eSwgZm9yIGV4YW1wbGUgMTAwTWJpdCwgdGhpcyBleGFtcGxlCit3b3VsZCBiZWhhdmUgcGVyZmVjdGx5IGZpbmUgdGhvdWdoLgorCitMZXQncyBsb29rIGEgYml0IGNsb3NlciBhdCB0aGUgYWJvdmUgZXhhbXBsZSBcLSBpdCAiY2xldmVybHkiIGludmFsaWRhdGVzIG9uZQorb2YgdGhlIGJhc2ljIHRoaW5ncyBMUyBjcml0ZXJpb24gdHJpZXMgdG8gYWNoaWV2ZSBcLSBlcXVhbGl0eSBvZiBhbGwgdmlydHVhbAordGltZXMgYWNyb3NzIGNsYXNzIGhpZXJhcmNoeS4gTGVhZiBjbGFzc2VzIHdpdGhvdXQgUlQgc2VydmljZSBjdXJ2ZXMgYXJlCitsaXRlcmFsbHkgbGVmdCB0byB0aGVpciBvd24gZmF0ZSAoZ292ZXJuZWQgYnkgbWVzc2VkIHVwIHZpcnR1YWwgdGltZXMpLgorCitBbHNvLCBpdCBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZS4gQ2xhc3MgQSB3aWxsIGFsd2F5cyBiZSBndWFyYW50ZWVkIHVwIHRvCis4TWJpdCwgYW5kIHRoaXMgaXMgbW9yZSB0aGFuIGFueSBhYnNvbHV0ZSBiYW5kd2lkdGggdGhhdCBjb3VsZCBoYXBwZW4gZnJvbSBpdHMKK0xTIGNyaXRlcmlvbiAoZXhjbHVkaW5nIHRyaXZpYWwgY2FzZSBvZiBvbmx5IEEgYmVpbmcgYWN0aXZlKS4gSWYgdGhlIGJhbmR3aWR0aAordGFrZW4gYnkgQSBpcyBzbWFsbGVyIHRoYW4gYWJzb2x1dGUgdmFsdWUgZnJvbSBMUyBjcml0ZXJpb24sIHRoZSB1bnVzZWQgcGFydAord2lsbCBiZSBhdXRvbWF0aWNhbGx5IGFzc2lnbmVkIHRvIG90aGVyIGFjdGl2ZSBjbGFzc2VzIChhcyBBIGhhcyBpZGxpbmcgcGVyaW9kcworaW4gc3VjaCBjYXNlKS4gVGhlIG9ubHkgImFkdmFudGFnZSIgaXMsIHRoYXQgZXZlbiBpbiBjYXNlIG9mIGxvdyBiYW5kd2lkdGggb24KK2F2ZXJhZ2UsIGJ1cnN0cyB3b3VsZCBiZSBoYW5kbGVkIGF0IHRoZSBzcGVlZCBkZWZpbmVkIGJ5IFJUIGNyaXRlcmlvbi4gU3RpbGwsCitpZiBleHRyYSBzcGVlZCBpcyBuZWVkZWQgKGUuZy4gZHVlIHRvIGxhdGVuY3kpLCBub24gbGluZWFyIHNlcnZpY2UgY3VydmVzCitzaG91bGQgYmUgdXNlZCBpbiBzdWNoIGNhc2UuCisKK0luIHRoZSBvdGhlciB3b3JkczogdGhlIExTIGNyaXRlcmlvbiBpcyBtZWFuaW5nbGVzcyBpbiB0aGUgYWJvdmUgZXhhbXBsZS4KKworWW91IGNhbiBxdWlja2x5ICJ3b3JrYXJvdW5kIiBpdCBieSBtYWtpbmcgc3VyZSBlYWNoIGxlYWYgY2xhc3MgaGFzIFJUIHNlcnZpY2UKK2N1cnZlIGFzc2lnbmVkICh0aHVzIGd1YXJhbnRlZWluZyBhbGwgb2YgdGhlbSB3aWxsIGdldCBzb21lIGJhbmR3aWR0aCksIGJ1dCBpdAorZG9lc24ndCBtYWtlIGl0IGFueSBtb3JlIHZhbGlkLgorCitLZWVwIGluIG1pbmQgLSBpZiB5b3UgdXNlIG5vbmxpbmVhciBjdXJ2ZXMgYW5kIGlycmVndWxhcml0aWVzIGV4cGxhaW5lZCBhYm92ZQoraGFwcGVuIFxmSW9ubHlcZlIgaW4gdGhlIGZpcnN0IHNlZ21lbnQsIHRoZW4gdGhlcmUncyBsaXR0bGUgd3Jvbmcgd2l0aAorIm92ZXJ1c2luZyIgUlQgY3VydmUgYSBiaXQ6CisKKy5uZgorQSBcLSBscyA1LjBNYml0LCBydCA5TWJpdC8zMG1zLCB0aGVuIDFNYml0CitCIFwtIGxzIDIuNU1iaXQKK0MgXC0gbHMgMi41TWJpdAorLmZpCisKK0hlcmUsIHRoZSB2dCBvZiBBIHdpbGwgInNwaWtlIiBpbiB0aGUgaW5pdGlhbCBwZXJpb2QsIGJ1dCB0aGVuIEEgd2lsbCBuZXZlciBnZXQgbW9yZQordGhhbiAxTWJpdCB1bnRpbCBCICYgQyBjYXRjaCB1cC4gVGhlbiBldmVyeXRoaW5nIHdpbGwgYmUgYmFjayB0byBub3JtYWwuCisuCisuU0ggIkxJTlVYIEFORCBUSU1FUiBSRVNPTFVUSU9OIgorLgorSW4gY2VydGFpbiBzaXR1YXRpb25zLCB0aGUgc2NoZWR1bGVyIGNhbiB0aHJvdHRsZSBpdHNlbGYgYW5kIHNldHVwIHNvCitjYWxsZWQgd2F0Y2hkb2cgdG8gd2FrZXVwIGRlcXVldWUgZnVuY3Rpb24gYXQgc29tZSB0aW1lIGxhdGVyLiBJbiBjYXNlIG9mIEhGU0MKK2l0IGhhcHBlbnMgd2hlbiBmb3IgZXhhbXBsZSBubyBwYWNrZXQgaXMgZWxpZ2libGUgZm9yIHNjaGVkdWxpbmcsIGFuZCBVTAorc2VydmljZSBjdXJ2ZSBpcyB1c2VkIHRvIGxpbWl0IHRoZSBzcGVlZCBhdCB3aGljaCBMUyBjcml0ZXJpb24gaXMgYWxsb3dlZCB0bworZGVxdWV1ZSBwYWNrZXRzLiBJdCdzIGNhbGxlZCB0aHJvdHRsaW5nLCBhbmQgYWNjdXJhY3kgb2YgaXQgaXMgZGVwZW5kZW50IG9uCitob3cgdGhlIGtlcm5lbCBpcyBjb21waWxlZC4KKworVGhlcmUncmUgMyBpbXBvcnRhbnQgb3B0aW9ucyBpbiBtb2Rlcm4ga2VybmVscywgYXMgZmFyIGFzIHRpbWVycycgcmVzb2x1dGlvbgorZ29lczogXCYndGlja2xlc3Mgc3lzdGVtJywgXCYnaGlnaCByZXNvbHV0aW9uIHRpbWVyIHN1cHBvcnQnIGFuZCBcJid0aW1lcgorZnJlcXVlbmN5Jy4KKworSWYgeW91IGhhdmUgXCYndGlja2xlc3Mgc3lzdGVtJyBlbmFibGVkLCB0aGVuIHRoZSB0aW1lciBpbnRlcnJ1cHQgd2lsbCB0cmlnZ2VyCithcyBzbG93bHkgYXMgcG9zc2libGUsIGJ1dCBlYWNoIHRpbWUgYSBzY2hlZHVsZXIgdGhyb3R0bGVzIGl0c2VsZiAob3IgYW55CitvdGhlciBwYXJ0IG9mIHRoZSBrZXJuZWwgbmVlZHMgYmV0dGVyIGFjY3VyYWN5KSwgdGhlIHJhdGUgd2lsbCBiZSBpbmNyZWFzZWQgYXMKK25lZWRlZCAvIHBvc3NpYmxlLiBUaGUgY2VpbGluZyBpcyBlaXRoZXIgXCYndGltZXIgZnJlcXVlbmN5JyBpZiBcJidoaWdoCityZXNvbHV0aW9uIHRpbWVyIHN1cHBvcnQnIGlzIG5vdCBhdmFpbGFibGUgb3Igbm90IGNvbXBpbGVkIGluLCBvciBpdCdzCitoYXJkd2FyZSBkZXBlbmRlbnQgYW5kIGNhbiBnbyBcZklmYXJcZlIgYmV5b25kIHRoZSBoaWdoZXN0IFwmJ3RpbWVyIGZyZXF1ZW5jeScKK3NldHRpbmcgYXZhaWxhYmxlLgorCitJZiBcJid0aWNrbGVzcyBzeXN0ZW0nIGlzIG5vdCBlbmFibGVkLCB0aGUgdGltZXIgd2lsbCB0cmlnZ2VyIGF0IGEgZml4ZWQgcmF0ZQorc3BlY2lmaWVkIGJ5IFwmJ3RpbWVyIGZyZXF1ZW5jeScgXC0gcmVnYXJkbGVzcyBpZiBoaWdoIHJlc29sdXRpb24gdGltZXJzIGFyZQorb3IgYXJlbid0IGF2YWlsYWJsZS4KKworVGhpcyBpcyBpbXBvcnRhbnQgdG8ga2VlcCB0aG9zZSBzZXR0aW5ncyBpbiBtaW5kLCBhcyBpbiBzY2VuYXJpbyBsaWtlOiBubwordGlja2xlc3MsIG5vIEhSIHRpbWVycywgZnJlcXVlbmN5IHNldCB0byAxMDBoeiBcLSB0aHJvdHRsaW5nIGFjY3VyYWN5IHdvdWxkIGJlCithdCAxMG1zLiBJdCBkb2Vzbid0IGF1dG9tYXRpY2FsbHkgbWVhbiB5b3Ugd291bGQgYmUgbGltaXRlZCB0byB+MC44TWJpdC9zCisoYXNzdW1pbmcgcGFja2V0cyBhdCB+MUtCKSBcLSBhcyBsb25nIGFzIHlvdXIgcXVldWVzIGFyZSBwcmVwYXJlZCB0byBjb3ZlciBmb3IKK3RpbWVyIGluYWNjdXJhY3kuIE9mIGNvdXJzZSwgaW4gY2FzZSBvZiBlLmcuIGxvY2FsbHkgZ2VuZXJhdGVkIFVEUCB0cmFmZmljIFwtCithcHByb3ByaWF0ZSBzb2NrZXQgc2l6ZSBpcyBuZWVkZWQgYXMgd2VsbC4gU2hvcnQgZXhhbXBsZSB0byBtYWtlIGl0IG1vcmUKK3VuZGVyc3RhbmRhYmxlIChhc3N1bWUgaGFyZGNvcmUgYW50aVwtc2NoZWR1bGUgc2V0dGluZ3MgXC0gSFo9MTAwLCBubyBIUgordGltZXJzLCBubyB0aWNrbGVzcyk6CisKKy5uZgordGMgcWRpc2MgYWRkIGRldiBldGgwIHJvb3QgaGFuZGxlIDE6MCBoZnNjIGRlZmF1bHQgMQordGMgY2xhc3MgYWRkIGRldiBldGgwIHBhcmVudCAxOjAgY2xhc3NpZCAxOjEgaGZzYyBydCBtMiAxME1iaXQKKy5maQorCitBc3N1bWluZyBwYWNrZXQgb2YgfjFLQiBzaXplIGFuZCBIWj0xMDAsIHRoYXQgYXZlcmFnZXMgdG8gfjAuOE1iaXQgXC0gYW55dGhpbmcKK2JleW9uZCBpdCAoZS5nLiB0aGUgYWJvdmUgZXhhbXBsZSB3aXRoIHNwZWNpZmllZCByYXRlIG92ZXIgMTB4IGxhcmdlcikgd2lsbAorcmVxdWlyZSBhcHByb3ByaWF0ZSBxdWV1aW5nIGFuZCBjYXVzZSBidXJzdHMgZXZlcnkgfjEwIG1zLiBBcyB5b3UgY2FuCitpbWFnaW5lLCBhbnkgSEZTQydzIFJUIGd1YXJhbnRlZXMgd2lsbCBiZSBzZXJpb3VzbHkgaW52YWxpZGF0ZWQgYnkgdGhhdC4KK0Fmb3JlbWVudGlvbmVkIGV4YW1wbGUgaXMgbWFpbmx5IGltcG9ydGFudCBpZiB5b3UgZGVhbCB3aXRoIG9sZCBoYXJkd2FyZSBcLSBhcworaXMgcGFydGljdWxhcmx5IHBvcHVsYXIgZm9yIGhvbWUgc2VydmVyIGNob3Jlcy4gRXZlbiB0aGVuLCB5b3UgY2FuIGVhc2lseQorc2V0IEhaPTEwMDAgYW5kIGhhdmUgdmVyeSBhY2N1cmF0ZSBzY2hlZHVsaW5nIGZvciB0eXBpY2FsIGFkc2wgc3BlZWRzLgorCitBbnl0aGluZyBtb2Rlcm4gKGFwaWMgb3IgZXZlbiBocGV0IG1zaSBiYXNlZCB0aW1lcnMgKyBcJid0aWNrbGVzcyBzeXN0ZW0nKQord2lsbCBwcm92aWRlIGVub3VnaCBhY2N1cmFjeSBmb3Igc3VwZXJiIDFHYml0IHNjaGVkdWxpbmcuIEZvciBleGFtcGxlLCBvbiBvbmUKK29mIG15IGNoZWFwIGR1YWwtY29yZSBBTUQgYm9hcmRzIEkgaGF2ZSB0aGUgZm9sbG93aW5nIHNldHRpbmdzOgorCisubmYKK3RjIHFkaXNjIGFkZCBkZXYgZXRoMCBwYXJlbnQgcm9vdCBoYW5kbGUgMTowIGhmc2MgZGVmYXVsdCAxCit0YyBjbGFzcyBhZGQgZGV2IGV0aDAgcGFyZW50IDE6MCBjbGFzc2lkIDE6MSBoZnNjIHJ0IG0yIDMwMG1iaXQKKy5maQorCitBbmQgYSBzaW1wbGU6CisKKy5uZgorbmMgXC11IGRzdC5ob3N0LmNvbSA1NDMyMSA8L2Rldi96ZXJvCituYyBcLWwgXC1wIDU0MzIxID4vZGV2L251bGwKKy5maQorCitcJi4uLndpbGwgeWllbGQgdGhlIGZvbGxvd2luZyBlZmZlY3RzIG92ZXIgYSBwZXJpb2Qgb2YgfjEwIHNlY29uZHMgKHRha2VuIGZyb20KKy9wcm9jL2ludGVycnVwdHMpOgorCisubmYKKzMxOTogNDIxMjQyMjkgICAwICBIUEVUX01TSVwtZWRnZSAgaHBldDIgKGJlZm9yZSkKKzMxOTogNDI0MzYyMTQgICAwICBIUEVUX01TSVwtZWRnZSAgaHBldDIgKGFmdGVyIDEwcy4pCisuZmkKKworVGhhdCdzIHJvdWdobHkgMzEwMDAvcy4gTm93IGNvbXBhcmUgaXQgd2l0aCBIWj0xMDAwIHNldHRpbmcuIFRoZSBvYnZpb3VzCitkcmF3YmFjayBvZiBpdCBpcyB0aGF0IGNwdSBsb2FkIGNhbiBiZSByYXRoZXIgaGlnaCB3aXRoIHNlcnZpY2luZyB0aGF0CittYW55IHRpbWVyIGludGVycnVwdHMuIFRoZSBleGFtcGxlIHdpdGggMzAwTWJpdCBSVCBzZXJ2aWNlIGN1cnZlIG9uIDFHYml0IGxpbmsgaXMKK3BhcnRpY3VsYXJseSB1Z2x5LCBhcyBpdCByZXF1aXJlcyBhIGxvdCBvZiB0aHJvdHRsaW5nIHdpdGggbWludXNjdWxlIGRlbGF5cy4KKworQWxzbyBub3RlIHRoYXQgaXQncyBqdXN0IGFuIGV4YW1wbGUgc2hvd2luZyB0aGUgY2FwYWJpbGl0aWVzIG9mIGN1cnJlbnQgaGFyZHdhcmUuCitUaGUgYWJvdmUgZXhhbXBsZSAoZXNzZW50aWFsbHkgYSAzMDBNYml0IFRCRiBlbXVsYXRvcikgaXMgcG9pbnRsZXNzIG9uIGFuIGludGVybmFsCitpbnRlcmZhY2UgdG8gYmVnaW4gd2l0aDogeW91IHdpbGwgcHJldHR5IG11Y2ggYWx3YXlzIHdhbnQgYSByZWd1bGFyIExTIHNlcnZpY2UKK2N1cnZlIHRoZXJlLCBhbmQgaW4gc3VjaCBhIHNjZW5hcmlvIEhGU0Mgc2ltcGx5IGRvZXNuJ3QgdGhyb3R0bGUgYXQgYWxsLgorCiszMDBNYml0IFJUIHNlcnZpY2UgY3VydmUgKHNlbGVjdGVkIGNvbHVtbnMgZnJvbSBtcHN0YXQgXC1QIEFMTCAxKToKKworLm5mCisxMDo1Njo0MyBQTSAgQ1BVICAlc3lzICAgICAlaXJxICAgJXNvZnQgICAlaWRsZQorMTA6NTY6NDQgUE0gIGFsbCAgMjAuMTAgICAgNi41MyAgIDM0LjY3ICAgMzcuMTkKKzEwOjU2OjQ0IFBNICAgIDAgIDM1LjAwICAgIDAuMDAgICA2My4wMCAgICAwLjAwCisxMDo1Njo0NCBQTSAgICAxICAgNC45NSAgIDEyLjg3ICAgIDYuOTMgICA3My4yNworLmZpCisKK1NvLCBpbiB0aGUgcmFyZSBjYXNlIHlvdSBuZWVkIHRob3NlIHNwZWVkcyB3aXRoIG9ubHkgYSBSVCBzZXJ2aWNlIGN1cnZlLCBvciB3aXRoIGEgVUwKK3NlcnZpY2UgY3VydmU6IHJlbWVtYmVyIHRoZSBkcmF3YmFja3MuCisuCisuU0ggIkNBVkVBVDogUkFORE9NIE9OTElORSBFWEFNUExFUyIKKy4KK0ZvciByZWFzb25zIHVua25vd24gKHRob3VnaCB3ZWxsIGd1ZXNzZWQpLCBtYW55IGV4YW1wbGVzIHlvdSBjYW4gZ29vZ2xlIGxvdmUgdG8KK292ZXJ1c2UgVUwgY3JpdGVyaW9uIGFuZCBzdHVmZiBpdCBpbiBldmVyeSBub2RlIHBvc3NpYmxlLiBUaGlzIG1ha2VzIG5vIHNlbnNlCithbmQgd29ya3MgYWdhaW5zdCB3aGF0IEhGU0MgdHJpZXMgdG8gZG8gKGFuZCBkb2VzIHByZXR0eSBkYW1uIHdlbGwpLiBVc2UgVUwKK3doZXJlIGl0IG1ha2VzIHNlbnNlOiBvbiB0aGUgdXBwZXJtb3N0IG5vZGUgdG8gbWF0Y2ggdXBzdHJlYW0gcm91dGVyJ3MgdXBsaW5rCitjYXBhY2l0eS4gT3IgaW4gc3BlY2lhbCBjYXNlcywgc3VjaCBhcyB0ZXN0aW5nIChsaW1pdCBjZXJ0YWluIHN1YnRyZWUgdG8gc29tZQorc3BlZWQpLCBvciBjdXN0b21lcnMgdGhhdCBtdXN0IG5ldmVyIGdldCBtb3JlIHRoYW4gY2VydGFpbiBzcGVlZC4gSW4gdGhlIGxhc3QKK2Nhc2UgeW91IGNhbiB1c3VhbGx5IGFjaGlldmUgdGhlIHNhbWUgYnkganVzdCB1c2luZyBhIFJUIGNyaXRlcmlvbiB3aXRob3V0IExTK1VMCitvbiBsZWFmIG5vZGVzLgorCitBcyBmb3IgdGhlIHJvdXRlciBjYXNlIC0gcmVtZW1iZXIgaXQncyBnb29kIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiAidHJhZmZpYyB0bworcm91dGVyIiAocmVtb3RlIGNvbnNvbGUsIHdlYiBjb25maWcsIGV0Yy4pIGFuZCAib3V0Z29pbmcgdHJhZmZpYyIsIHNvIGZvcgorZXhhbXBsZToKKworLm5mCit0YyBxZGlzYyBhZGQgZGV2IGV0aDAgcm9vdCBoYW5kbGUgMTowIGhmc2MgZGVmYXVsdCAweDgwMDIKK3RjIGNsYXNzIGFkZCBkZXYgZXRoMCBwYXJlbnQgMTowIGNsYXNzaWQgMTo5OTkgaGZzYyBydCBtMiA1ME1iaXQKK3RjIGNsYXNzIGFkZCBkZXYgZXRoMCBwYXJlbnQgMTowIGNsYXNzaWQgMToxIGhmc2MgbHMgbTIgMk1iaXQgdWwgbTIgMk1iaXQKKy5maQorCitcJi4uLiBzbyAiaW50ZXJuZXQiIHRyZWUgdW5kZXIgMToxIGFuZCAicm91dGVyIGl0c2VsZiIgYXMgMTo5OTkKKy4KKy5TSCAiTEFZRVIyIEFEQVBUQVRJT04iCisuCitQbGVhc2UgcmVmZXIgdG8gXGZCdGNcLXN0YWJcZlIoOCkKKy4KKy5TSCAiU0VFIEFMU08iCisuCitcZkJ0Y1xmUig4KSwgXGZCdGNcLWhmc2NcZlIoOCksIFxmQnRjXC1zdGFiXGZSKDgpCisKK1BsZWFzZSBkaXJlY3QgYnVncmVwb3J0cyBhbmQgcGF0Y2hlcyB0bzogPG5ldC4uLkB2Z2VyLmtlcm5lbC5vcmc+CisuCisuU0ggIkFVVEhPUiIKKy4KK01hbnBhZ2UgY3JlYXRlZCBieSBNaWNoYWwgU29sdHlzIChzb2wuLi5Aeml1LmluZm8pCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9tYW4vbWFuOC9NYWtlZmlsZSBiL2lwcm91dGUyL21hbi9tYW44L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNzc2NDAKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9tYW4vbWFuOC9NYWtlZmlsZQpAQCAtMCwwICsxLDM5IEBACitUQVJHRVRTID0gaXAtYWRkcmVzcy44IGlwLWxpbmsuOCBpcC1yb3V0ZS44CisKK01BTjhQQUdFUyA9ICQoVEFSR0VUUykgaXAuOCBhcnBkLjggbG5zdGF0Ljggcm91dGVsLjggcnRhY2N0LjggcnRtb24uOCBydHByLjggc3MuOCBcCisJdGMuOCB0Yy1iZmlmby44IHRjLWJwZi44IHRjLWNicS44IHRjLWNicS1kZXRhaWxzLjggdGMtY2hva2UuOCB0Yy1jb2RlbC44IFwKKwl0Yy1mcS44IFwKKwl0Yy1kcnIuOCB0Yy1lbWF0Y2guOCB0Yy1mcV9jb2RlbC44IHRjLWhmc2MuOCB0Yy1odGIuOCB0Yy1waWUuOCBcCisJdGMtbXFwcmlvLjggdGMtbmV0ZW0uOCB0Yy1wZmlmby44IHRjLXBmaWZvX2Zhc3QuOCB0Yy1wcmlvLjggdGMtcmVkLjggXAorCXRjLXNmYi44IHRjLXNmcS44IHRjLXN0YWIuOCB0Yy10YmYuOCBcCisJYnJpZGdlLjggcnRzdGF0LjggY3RzdGF0LjggbnN0YXQuOCByb3V0ZWYuOCBcCisJaXAtYWRkcmxhYmVsLjggaXAtZm91LjggaXAtZ3VlLjggaXAtbDJ0cC44IFwKKwlpcC1tYWRkcmVzcy44IGlwLW1vbml0b3IuOCBpcC1tcm91dGUuOCBpcC1uZWlnaGJvdXIuOCBcCisJaXAtbmV0bnMuOCBpcC1udGFibGUuOCBpcC1ydWxlLjggaXAtdHVubmVsLjggaXAteGZybS44IFwKKwlpcC10Y3BfbWV0cmljcy44IGlwLW5ldGNvbmYuOCBpcC10b2tlbi44IFwKKwl0aXBjLjggdGlwYy1iZWFyZXIuOCB0aXBjLWxpbmsuOCB0aXBjLW1lZGlhLjggdGlwYy1uYW1ldGFibGUuOCBcCisJdGlwYy1ub2RlLjggdGlwYy1zb2NrZXQuOCBcCisJdGMtYmFzaWMuOCB0Yy1jZ3JvdXAuOCB0Yy1mbG93LjggdGMtZmxvd2VyLjggdGMtZncuOCB0Yy1yb3V0ZS44IFwKKwl0Yy10Y2luZGV4LjggdGMtdTMyLjgKKworYWxsOiAkKFRBUkdFVFMpCisKK2lwLWFkZHJlc3MuODogaXAtYWRkcmVzcy44LmluCisJc2VkICJzfEBTWVNDT05GRElSQHwkKENPTkZESVIpfGciICQ8ID4gJEAKKworaXAtbGluay44OiBpcC1saW5rLjguaW4KKwlzZWQgInN8QFNZU0NPTkZESVJAfCQoQ09ORkRJUil8ZyIgJDwgPiAkQAorCitpcC1yb3V0ZS44OiBpcC1yb3V0ZS44LmluCisJc2VkICJzfEBTWVNDT05GRElSQHwkKENPTkZESVIpfGciICQ8ID4gJEAKKworZGlzdGNsZWFuOiBjbGVhbgorCitjbGVhbjoKKwlAcm0gLWYgJChUQVJHRVRTKQorCitpbnN0YWxsOgorCSQoSU5TVEFMTERJUikgJChERVNURElSKSQoTUFORElSKS9tYW44CisJJChJTlNUQUxMTUFOKSAkKE1BTjhQQUdFUykgJChERVNURElSKSQoTUFORElSKS9tYW44CisKKy5QSE9OWTogaW5zdGFsbCBjbGVhbiBkaXN0Y2xlYW4KZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L2FycGQuOCBiL2lwcm91dGUyL21hbi9tYW44L2FycGQuOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDUwYTk4Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbWFuL21hbjgvYXJwZC44CkBAIC0wLDAgKzEsNjkgQEAKKy5USCBBUlBEIDggIjI4IEp1bmUsIDIwMDciCisKKy5TSCBOQU1FCithcnBkIFwtIHVzZXJzcGFjZSBhcnAgZGFlbW9uLgorCisuU0ggU1lOT1BTSVMKK1VzYWdlOiBhcnBkIFsgLWxraD8gXSBbIC1hIE4gXSBbIC1iIGRiYXNlIF0gWyAtQiBudW1iZXIgXSBbIC1mIGZpbGUgXSBbLXAgaW50ZXJ2YWwgXSBbIC1uIHRpbWUgXSBbIC1SIHJhdGUgXSBbIDxJTlRFUkZBQ0VTPiBdCisKKy5TSCBERVNDUklQVElPTgorVGhlCisuQiBhcnBkCitkYWVtb24gY29sbGVjdHMgZ3JhdHVpdG91cyBBUlAgaW5mb3JtYXRpb24sIHNhdmluZyBpdCBvbiBsb2NhbCBkaXNrIGFuZCBmZWVkaW5nIGl0IHRvIHRoZSBrZXJuZWwgb24gZGVtYW5kIHRvIGF2b2lkIHJlZHVuZGFudCBicm9hZGNhc3RpbmcgZHVlIHRvIGxpbWl0ZWQgc2l6ZSBvZiB0aGUga2VybmVsIEFSUCBjYWNoZS4KKworLlNIIE9QVElPTlMKKy5UUAorLWggLT8KK1ByaW50IGhlbHAKKy5UUAorLWwKK0R1bXAgdGhlIGFycGQgZGF0YWJhc2UgdG8gc3Rkb3V0IGFuZCBleGl0LiBUaGUgb3V0cHV0IGNvbnNpc3RzIG9mIHRocmVlIGNvbHVtbnM6IHRoZSBpbnRlcmZhY2UgaW5kZXgsIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBpbnRlcmZhY2UsIGFuZCB0aGUgTUFDIGFkZHJlc3Mgb2YgdGhlIGludGVyZmFjZS4gTmVnYXRpdmUgZW50cmllcyBmb3IgZGVhZCBob3N0cyBhcmUgYWxzbyBzaG93biwgaW4gdGhpcyBjYXNlIHRoZSBNQUMgYWRkcmVzcyBpcyByZXBsYWNlZCBieSB0aGUgd29yZCBGQUlMRUQgZm9sbG93ZWQgYnkgYSBjb2xvbiBhbmQgdGhlIG1vc3QgcmVjZW50IHRpbWUgd2hlbiB0aGUgZmFjdCB0aGF0IHRoZSBob3N0IGlzIGRlYWQgd2FzIHByb3Zlbi4KKy5UUAorLWYgPEZJTEU+CitSZWFkIGFuZCBsb2FkIGFuIGFycGQgZGF0YWJhc2UgZnJvbSBGSUxFIGluIGEgdGV4dCBmb3JtYXQgc2ltaWxhciB0byB0aGF0IGR1bXBlZCBieSBvcHRpb24gLWwuIEV4aXQgYWZ0ZXIgbG9hZCwgcG9zc2libHkgbGlzdGluZyByZXN1bHRpbmcgZGF0YWJhc2UsIGlmIG9wdGlvbiAtbCBpcyBhbHNvIGdpdmVuLiBJZiBGSUxFIGlzIC0sIHN0ZGluIGlzIHJlYWQgdG8gZ2V0IHRoZSBBUlAgdGFibGUuCisuVFAKKy1iIDxEQVRBQkFTRT4KK3RoZSBsb2NhdGlvbiBvZiB0aGUgZGF0YWJhc2UgZmlsZS4gVGhlIGRlZmF1bHQgbG9jYXRpb24gaXMgL3Zhci9saWIvYXJwZC9hcnBkLmRiCisuVFAKKy1hIDxOVU1CRVI+CitXaXRoIHRoaXMgb3B0aW9uLCBhcnBkIG5vdCBvbmx5IHBhc3NpdmVseSBsaXN0ZW5zIGZvciBBUlAgcGFja2V0cyBvbiB0aGUgaW50ZXJmYWNlLCBidXQgYWxzbyBzZW5kcyBicm9hZGNhc3QgcXVlcmllcyBpdHNlbGYuIE5VTUJFUiBpcyB0aGUgbnVtYmVyIG9mIHN1Y2ggcXVlcmllcyB0byBtYWtlIGJlZm9yZSBhIGRlc3RpbmF0aW9uIGlzIGNvbnNpZGVyZWQgZGVhZC4gV2hlbiBhcnBkIGlzIHN0YXJ0ZWQgYXMga2VybmVsIGhlbHBlciAoaS5lLiB3aXRoIGFwcF9zb2xpY2l0IGVuYWJsZWQgaW4gc3lzY3RsIG9yIGV2ZW4gd2l0aCBvcHRpb24gLWspIHdpdGhvdXQgdGhpcyBvcHRpb24gYW5kIHN0aWxsIGRpZCBub3QgbGVhcm4gZW5vdWdoIGluZm9ybWF0aW9uLCB5b3UgY2FuIG9ic2VydmUgMSBzZWNvbmQgZ2FwcyBpbiBzZXJ2aWNlLiBOb3QgZmF0YWwsIGJ1dCBub3QgZ29vZC4KKy5UUAorLWsKK1N1cHByZXNzIHNlbmRpbmcgYnJvYWRjYXN0IHF1ZXJpZXMgYnkgdGhlIGtlcm5lbC4gVGhpcyBvcHRpb24gb25seSBtYWtlcyBzZW5zZSB0b2dldGhlciB3aXRoIG9wdGlvbiAtYS4KKy5UUAorLW4gPFRJTUU+CitTcGVjaWZpZXMgdGhlIHRpbWVvdXQgb2YgdGhlIG5lZ2F0aXZlIGNhY2hlLiBXaGVuIHJlc29sdXRpb24gZmFpbHMsIGFycGQgc3VwcHJlc3NlcyBmdXJ0aGVyIGF0dGVtcHRzIHRvIHJlc29sdmUgZm9yIHRoaXMgcGVyaW9kLiBUaGlzIG9wdGlvbiBvbmx5IG1ha2VzIHNlbnNlIHRvZ2V0aGVyIHdpdGggb3B0aW9uICctaycuIFRoaXMgdGltZW91dCBzaG91bGQgbm90IGJlIHRvbyBtdWNoIGxvbmdlciB0aGFuIHRoZSBib290IHRpbWUgb2YgYSB0eXBpY2FsIGhvc3Qgbm90IHN1cHBvcnRpbmcgZ3JhdHVpdG91cyBBUlAuIERlZmF1bHQgdmFsdWUgaXMgNjAgc2Vjb25kcy4KKy5UUAorLXAgPFRJTUU+CitUaGUgdGltZSB0byB3YWl0IGluIHNlY29uZHMgYmV0d2VlbiBwb2xsaW5nIGF0dGVtcHRzIHRvIHRoZSBrZXJuZWwgQVJQIHRhYmxlLiBUSU1FIG1heSBiZSBhIGZsb2F0aW5nIHBvaW50IG51bWJlci4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMzAuCisuVFAKKy1SIDxSQVRFPgorTWF4aW1hbCBzdGVhZHkgcmF0ZSBvZiBicm9hZGNhc3RzIHNlbnQgYnkgYXJwZCBpbiBwYWNrZXRzIHBlciBzZWNvbmQuIERlZmF1bHQgdmFsdWUgaXMgMS4KKy5UUAorLUIgPE5VTUJFUj4KK1RoZSBudW1iZXIgb2YgYnJvYWRjYXN0cyBzZW50IGJ5IGFycGQgYmFjayB0byBiYWNrLiBEZWZhdWx0IHZhbHVlIGlzIDMuIFRvZ2V0aGVyIHdpdGggdGhlIC1SIG9wdGlvbiwgdGhpcyBvcHRpb24gZW5zdXJlcyB0aGF0IHRoZSBudW1iZXIgb2YgQVJQIHF1ZXJpZXMgdGhhdCBhcmUgYnJvYWRjYXN0IGRvZXMgbm90IGV4Y2VlZCBCK1IqVCBvdmVyIGFueSBpbnRlcnZhbCBvZiB0aW1lIFQuCisuUAorPElOVEVSRkFDRVM+IGlzIGEgbGlzdCBvZiBuYW1lcyBvZiBuZXR3b3JraW5nIGludGVyZmFjZXMgdG8gd2F0Y2guIElmIG5vIGludGVyZmFjZXMgYXJlIGdpdmVuLCBhcnBkIG1vbml0b3JzIGFsbCB0aGUgaW50ZXJmYWNlcy4gSW4gdGhpcyBjYXNlIGFycGQgZG9lcyBub3QgYWRqdXN0IHN5c2N0bCBwYXJhbWV0ZXJzLCBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlIHVzZXIgZG9lcyB0aGlzIGhpbXNlbGYgYWZ0ZXIgYXJwZCBpcyBzdGFydGVkLgorLlAKKy5TSCBTSUdOQUxTCisuVFAKK1doZW4gYXJwZCByZWNlaXZlcyBhIFNJR0lOVCBvciBTSUdURVJNIHNpZ25hbCwgaXQgZXhpdHMgZ3JhY2VmdWxseSwgc3luY2luZyB0aGUgZGF0YWJhc2UgYW5kIHJlc3RvcmluZyBhZGp1c3RlZCBzeXNjdGwgcGFyYW1ldGVycy4gT24gYSBTSUdIVVAgaXQgc3luY3MgdGhlIGRhdGFiYXNlIHRvIGRpc2suIFdpdGggU0lHVVNSMSBpdCBzZW5kcyBzb21lIHN0YXRpc3RpY3MgdG8gc3lzbG9nLiBUaGUgZWZmZWN0IG9mIGFueSBvdGhlciBzaWduYWxzIGlzIHVuZGVmaW5lZC4gSW4gcGFydGljdWxhciwgdGhleSBtYXkgY29ycnVwdCB0aGUgZGF0YWJhc2UgYW5kIGxlYXZlIHRoZSBzeXNjdGwgcGFyYW1ldGVycyBpbiBhbiB1bnByZWRpY3RhYmxlIHN0YXRlLgorLlAKKy5TSCBOT1RFCisuVFAKK0luIG9yZGVyIGZvciBhcnBkIHRvIGJlIGFibGUgdG8gc2VydmUgYXMgQVJQIHJlc29sdmVyLCB0aGUga2VybmVsIG11c3QgYmUgY29tcGlsZWQgd2l0aCB0aGUgb3B0aW9uIENPTkZJR19BUlBEIGFuZCwgaW4gdGhlIGNhc2Ugd2hlbiBpbnRlcmZhY2UgbGlzdCBpbiBub3QgZ2l2ZW4gb24gY29tbWFuZCBsaW5lLCB2YXJpYWJsZSBhcHBfc29saWNpdCBvbiBpbnRlcmZhY2VzIG9mIGludGVyZXN0IHNob3VsZCBiZSBpbiAvcHJvYy9zeXMvbmV0L2lwdjQvbmVpZ2gvKi4gSWYgdGhpcyBpcyBub3QgbWFkZSBhcnBkIHN0aWxsIGNvbGxlY3RzIGdyYXR1aXRvdXMgQVJQIGluZm9ybWF0aW9uIGluIGl0cyBkYXRhYmFzZS4KKy5TSCBFWEFNUExFUworLlRQCithcnBkIC1iIC92YXIvdG1wL2FycGQuZGIKK1N0YXJ0IGFycGQgdG8gY29sbGVjdCBncmF0dWl0b3VzIEFSUCwgYnV0IG5vdCBtZXNzaW5nIHdpdGgga2VybmVsIGZ1bmN0aW9uYWxpdHkuCisuVFAKK2tpbGxhbGwgYXJwZCA7IGFycGQgLWwgLWIgL3Zhci90bXAvYXJwZC5kYgorTG9vayBhdCByZXN1bHQgYWZ0ZXIgc29tZSB0aW1lLgorLlRQCithcnBkIC1iIC92YXIvdG1wL2FycGQuZGIgLWEgMSBldGgwIGV0aDEKK0VuYWJsZSBrZXJuZWwgaGVscGVyLCBsZWF2aW5nIGxlYWRpbmcgcm9sZSB0byBrZXJuZWwuCisuVFAKK2FycGQgLWIgL3Zhci90bXAvYXJwZC5kYiAtYSAzIC1rIGV0aDAgZXRoMQorQ29tcGxldGVseSByZXBsYWNlIGtlcm5lbCByZXNvbHV0aW9uIG9uIGludGVyZmFjZXMgZXRoMCBhbmQgZXRoMS4gSW4gdGhpcyBjYXNlIHRoZSBrZXJuZWwgc3RpbGwgZG9lcyB1bmljYXN0IHByb2JpbmcgdG8gdmFsaWRhdGUgZW50cmllcywgYnV0IGFsbCB0aGUgYnJvYWRjYXN0IGFjdGl2aXR5IGlzIHN1cHByZXNzZWQgYW5kIG1hZGUgdW5kZXIgYXV0aG9yaXR5IG9mIGFycGQuCisuUFAKK1RoaXMgaXMgdGhlIG1vZGUgaW4gd2hpY2ggYXJwZCBub3JtYWxseSBpcyBzdXBwb3NlZCB0byB3b3JrLiBJdCBpcyBub3QgdGhlIGRlZmF1bHQgdG8gcHJldmVudCBvY2Nhc2lvbmFsIGVuYWJsaW5nIG9mIHRvbyBhZ2dyZXNzaXZlIGEgbW9kZS4KZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L2JyaWRnZS44IGIvaXByb3V0ZTIvbWFuL21hbjgvYnJpZGdlLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVjNmYxNwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L2JyaWRnZS44CkBAIC0wLDAgKzEsNTkzIEBACisuVEggQlJJREdFIDggIjEgQXVndXN0IDIwMTIiICJpcHJvdXRlMiIgIkxpbnV4IgorLlNIIE5BTUUKK2JyaWRnZSBcLSBzaG93IC8gbWFuaXB1bGF0ZSBicmlkZ2UgYWRkcmVzc2VzIGFuZCBkZXZpY2VzCisuU0ggU1lOT1BTSVMKKworLmFkIGwKKy5pbiArOAorLnRpIC04CisuQiBicmlkZ2UKKy5SSSAiWyAiIE9QVElPTlMgIiBdICIgT0JKRUNUICIgeyAiIENPTU1BTkQgIiB8ICIKKy5CUiBoZWxwICIgfSIKKy5zcAorCisudGkgLTgKKy5JUiBPQkpFQ1QgIiA6PSB7ICIKKy5CUiBsaW5rICIgfCAiIGZkYiAiIHwgIiBtZGIgIiB8ICIgdmxhbiAiIHwgIiBtb25pdG9yICIgfSIKKy5zcAorCisudGkgLTgKKy5JUiBPUFRJT05TICIgOj0geyAiCitcZkJcLVZcZlJbXGZJZXJzaW9uXGZSXSB8CitcZkJcLXNcZlJbXGZJdGF0aXN0aWNzXGZSXSB8CitcZkJcLW5cZlJbXGZJZXRuc1xmUl0gbmFtZSB9CitcZkJcLWJcZlJbXGZJYXRjaFxmUl0gZmlsZW5hbWUgfQorCisudGkgLTgKKy5CUiAiYnJpZGdlIGxpbmsgc2V0IgorLkIgZGV2CisuSVIgREVWCisuSVIgIiBbICIKKy5CIGNvc3QKKy5JUiBDT1NUICIgXSBbICIKKy5CIHByaW9yaXR5CisuSVIgUFJJTyAiIF0gWyAiCisuQiBzdGF0ZQorLklSIFNUQVRFICJdIFsiCisuQlIgZ3VhcmQgIiB7ICIgb24gIiB8ICIgb2ZmICIgfSBdIFsgIgorLkJSIGhhaXJwaW4gIiB7ICIgb24gIiB8ICIgb2ZmICIgfSBdIFsgIgorLkJSIGZhc3RsZWF2ZSAiIHsgIiBvbiAiIHwgIiBvZmYgIiB9IF0gWyAiCisuQlIgcm9vdF9ibG9jayAiIHsgIiBvbiAiIHwgIiBvZmYgIiB9IF0gWyAiCisuQlIgbGVhcm5pbmcgIiB7ICIgb24gIiB8ICIgb2ZmICIgfSBdIFsgIgorLkJSIGxlYXJuaW5nX3N5bmMgIiB7ICIgb24gIiB8ICIgb2ZmICIgfSBdIFsgIgorLkJSIGZsb29kICIgeyAiIG9uICIgfCAiIG9mZiAiIH0gXSBbICIKKy5CUiBod21vZGUgIiB7ICIgdmVwYSAiIHwgIiB2ZWIgIiB9IF0gWyAiCisuQlIgc2VsZiAiIF0gWyAiIG1hc3RlciAiIF0gIgorCisudGkgLTgKKy5CUiAiYnJpZGdlIGxpbmsiICIgWyAiIHNob3cgIiBdIFsgIgorLkIgZGV2CisuSVIgREVWICIgXSIKKworLnRpIC04CisuQlIgImJyaWRnZSBmZGIiICIgeyAiIGFkZCAiIHwgIiBhcHBlbmQgIiB8ICIgZGVsICIgfCAiIHJlcGxhY2UgIiB9ICIKKy5JIExMQUREUgorLkIgZGV2CisuSVIgREVWICIgeyAiCisuQlIgbG9jYWwgIiB8ICIgdGVtcCAiIH0gWyAiCisuQlIgc2VsZiAiIF0gWyAiIG1hc3RlciAiIF0gWyAiIHJvdXRlciAiIF0gWyAiIHVzZSAiIF0gWyAiCisuQiBkc3QKKy5JUiBJUEFERFIgIiBdIFsgIgorLkIgdm5pCisuSVIgVk5JICIgXSBbIgorLkIgcG9ydAorLklSIFBPUlQgIiBdIFsiCisuQiB2aWEKKy5JUiBERVZJQ0UgIiBdIgorCisudGkgLTgKKy5CUiAiYnJpZGdlIGZkYiIgIiBbICIgc2hvdyAiIF0gWyAiCisuQiBkZXYKKy5JUiBERVYgIiBdIgorCisudGkgLTgKKy5CUiAiYnJpZGdlIG1kYiIgIiB7ICIgYWRkICIgfCAiIGRlbCAiIH0gIgorLkIgZGV2CisuSVIgREVWCisuQiBwb3J0CisuSVIgUE9SVAorLkIgZ3JwCisuSVIgR1JPVVAgIiBbICIKKy5CUiBwZXJtYW5lbnQgIiB8ICIgdGVtcCAiIF0gWyAiCisuQiB2aWQKKy5JUiBWSUQgIiBdICIKKworLnRpIC04CisuQlIgImJyaWRnZSBtZGIgc2hvdyAiIFsgIgorLkIgZGV2CisuSVIgREVWICIgXSIKKworLnRpIC04CisuQlIgImJyaWRnZSB2bGFuIiAiIHsgIiBhZGQgIiB8ICIgZGVsICIgfSAiCisuQiBkZXYKKy5JUiBERVYKKy5CIHZpZAorLklSIFZJRCAiIFsgIgorLkJSIHB2aWQgIiBdIFsgIiB1bnRhZ2dlZCAiIF0gWyAiCisuQlIgc2VsZiAiIF0gWyAiIG1hc3RlciAiIF0gIgorCisudGkgLTgKKy5CUiAiYnJpZGdlIHZsYW4iICIgWyAiIHNob3cgIiBdIFsgIgorLkIgZGV2CisuSVIgREVWICIgXSIKKworLnRpIC04CisuQlIgImJyaWRnZSBtb25pdG9yIiAiIFsgIiBhbGwgIiB8ICIgbmVpZ2ggIiB8ICIgbGluayAiIHwgIiBtZGIgIiBdIgorCisuU0ggT1BUSU9OUworCisuVFAKKy5CUiAiXC1WIiAsICIgLVZlcnNpb24iCitwcmludCB0aGUgdmVyc2lvbiBvZiB0aGUKKy5CIGJyaWRnZQordXRpbGl0eSBhbmQgZXhpdC4KKworLlRQCisuQlIgIlwtcyIgLCAiIFwtc3RhdHMiLCAiIFwtc3RhdGlzdGljcyIKK291dHB1dCBtb3JlIGluZm9ybWF0aW9uLiBJZiB0aGlzIG9wdGlvbgoraXMgZ2l2ZW4gbXVsdGlwbGUgdGltZXMsIHRoZSBhbW91bnQgb2YgaW5mb3JtYXRpb24gaW5jcmVhc2VzLgorQXMgYSBydWxlLCB0aGUgaW5mb3JtYXRpb24gaXMgc3RhdGlzdGljcyBvciBzb21lIHRpbWUgdmFsdWVzLgorCisuVFAKKy5CUiAiXC1uIiAsICIgXC1uZXQiICwgIiBcLW5ldG5zICIgPE5FVE5TPgorc3dpdGNoZXMKKy5CIGJyaWRnZQordG8gdGhlIHNwZWNpZmllZCBuZXR3b3JrIG5hbWVzcGFjZQorLklSIE5FVE5TIC4KK0FjdHVhbGx5IGl0IGp1c3Qgc2ltcGxpZmllcyBleGVjdXRpbmcgb2Y6CisKKy5CIGlwIG5ldG5zIGV4ZWMKKy5JUiBORVROUworLkIgYnJpZGdlCisuUkkgIlsgIiBPUFRJT05TICIgXSAiIE9CSkVDVCAiIHsgIiBDT01NQU5EICIgfCAiCisuQlIgaGVscCAiIH0iCisKK3RvCisKKy5CIGJyaWRnZQorLlJJICItbltldG5zXSAiIE5FVE5TICIgWyAiIE9QVElPTlMgIiBdICIgT0JKRUNUICIgeyAiIENPTU1BTkQgIiB8ICIKKy5CUiBoZWxwICIgfSIKKworLlRQCisuQlIgIlwtYiIsICIgXC1iYXRjaCAiIDxGSUxFTkFNRT4KK1JlYWQgY29tbWFuZHMgZnJvbSBwcm92aWRlZCBmaWxlIG9yIHN0YW5kYXJkIGlucHV0IGFuZCBpbnZva2UgdGhlbS4KK0ZpcnN0IGZhaWx1cmUgd2lsbCBjYXVzZSB0ZXJtaW5hdGlvbiBvZiBicmlkZ2UgY29tbWFuZC4KKworLlRQCisuQlIgIlwtZm9yY2UiCitEb24ndCB0ZXJtaW5hdGUgYnJpZGdlIGNvbW1hbmQgb24gZXJyb3JzIGluIGJhdGNoIG1vZGUuCitJZiB0aGVyZSB3ZXJlIGFueSBlcnJvcnMgZHVyaW5nIGV4ZWN1dGlvbiBvZiB0aGUgY29tbWFuZHMsIHRoZSBhcHBsaWNhdGlvbgorcmV0dXJuIGNvZGUgd2lsbCBiZSBub24gemVyby4KKworLlNIIEJSSURHRSAtIENPTU1BTkQgU1lOVEFYCisKKy5TUworLkkgT0JKRUNUCisKKy5UUAorLkIgbGluaworLSBCcmlkZ2UgcG9ydC4KKworLlRQCisuQiBmZGIKKy0gRm9yd2FyZGluZyBEYXRhYmFzZSBlbnRyeS4KKworLlRQCisuQiBtZGIKKy0gTXVsdGljYXN0IGdyb3VwIGRhdGFiYXNlIGVudHJ5LgorCisuVFAKKy5CIHZsYW4KKy0gVkxBTiBmaWx0ZXIgbGlzdC4KKworLlNTCisuSSBDT01NQU5ECisKK1NwZWNpZmllcyB0aGUgYWN0aW9uIHRvIHBlcmZvcm0gb24gdGhlIG9iamVjdC4KK1RoZSBzZXQgb2YgcG9zc2libGUgYWN0aW9ucyBkZXBlbmRzIG9uIHRoZSBvYmplY3QgdHlwZS4KK0FzIGEgcnVsZSwgaXQgaXMgcG9zc2libGUgdG8KKy5CUiAiYWRkIiAsICIgZGVsZXRlIgorYW5kCisuQiBzaG93Cisob3IKKy5CIGxpc3QKKykgb2JqZWN0cywgYnV0IHNvbWUgb2JqZWN0cyBkbyBub3QgYWxsb3cgYWxsIG9mIHRoZXNlIG9wZXJhdGlvbnMKK29yIGhhdmUgc29tZSBhZGRpdGlvbmFsIGNvbW1hbmRzLiBUaGUKKy5CIGhlbHAKK2NvbW1hbmQgaXMgYXZhaWxhYmxlIGZvciBhbGwgb2JqZWN0cy4gSXQgcHJpbnRzCitvdXQgYSBsaXN0IG9mIGF2YWlsYWJsZSBjb21tYW5kcyBhbmQgYXJndW1lbnQgc3ludGF4IGNvbnZlbnRpb25zLgorLnNwCitJZiBubyBjb21tYW5kIGlzIGdpdmVuLCBzb21lIGRlZmF1bHQgY29tbWFuZCBpcyBhc3N1bWVkLgorVXN1YWxseSBpdCBpcworLkIgbGlzdAorb3IsIGlmIHRoZSBvYmplY3RzIG9mIHRoaXMgY2xhc3MgY2Fubm90IGJlIGxpc3RlZCwKKy5CUiAiaGVscCIgLgorCisuU0ggYnJpZGdlIGxpbmsgLSBicmlkZ2UgcG9ydAorCisuQiBsaW5rCitvYmplY3RzIGNvcnJlc3BvbmQgdG8gdGhlIHBvcnQgZGV2aWNlcyBvZiB0aGUgYnJpZGdlLgorCisuUAorVGhlIGNvcnJlc3BvbmRpbmcgY29tbWFuZHMgc2V0IGFuZCBkaXNwbGF5IHBvcnQgc3RhdHVzIGFuZCBicmlkZ2Ugc3BlY2lmaWMKK2F0dHJpYnV0ZXMuCisKKy5TUyBicmlkZ2UgbGluayBzZXQgLSBzZXQgYnJpZGdlIHNwZWNpZmljIGF0dHJpYnV0ZXMgb24gYSBwb3J0CisKKy5UUAorLkJJIGRldiAiIE5BTUUgIgoraW50ZXJmYWNlIG5hbWUgb2YgdGhlIGJyaWRnZSBwb3J0CisKKy5UUAorLkJJIGNvc3QgIiBDT1NUICIKK3RoZSBTVFAgcGF0aCBjb3N0IG9mIHRoZSBzcGVjaWZpZWQgcG9ydC4KKworLlRQCisuQkkgcHJpb3JpdHkgIiBQUklPICIKK3RoZSBTVFAgcG9ydCBwcmlvcml0eS4gVGhlIHByaW9yaXR5IHZhbHVlIGlzIGFuIHVuc2lnbmVkIDgtYml0IHF1YW50aXR5CisobnVtYmVyIGJldHdlZW4gMCBhbmQgMjU1KS4gVGhpcyBtZXRyaWMgaXMgdXNlZCBpbiB0aGUgZGVzaWduYXRlZCBwb3J0IGFuCitkcm9vdCBwb3J0IHNlbGVjdGlvIGFsZ29yaXRobXMuCisKKy5UUAorLkJJIHN0YXRlICIgU1RBVEUgIgordGhlIG9wZXJhdGlvbiBzdGF0ZSBvZiB0aGUgcG9ydC4gVGhpcyBpcyBwcmltYXJpbHkgdXNlZCBieSB1c2VyIHNwYWNlIFNUUC9SU1RQCitpbXBsZW1lbnRhdGlvbi4gT25lIG1heSBlbnRlciBhIGxvd2VyY2FzZWQgcG9ydCBzdGF0ZSBuYW1lLCBvciBvbmUgb2YgdGhlCitudW1iZXJzIGJlbG93LiBOZWdhdGl2ZSBpbnB1dHMgYXJlIGlnbm9yZWQsIGFuZCB1bnJlY29nbml6ZWQgbmFtZXMgcmV0dXJuIGFuCitlcnJvci4KKworLkIgMAorLSBwb3J0IGlzIERJU0FCTEVELiBNYWtlIHRoaXMgcG9ydCBjb21wbGV0ZWx5IGluYWN0aXZlLgorLnNwCisKKy5CIDEKKy0gU1RQIExJU1RFTklORyBzdGF0ZS4gT25seSB2YWxpZCBpZiBTVFAgaXMgZW5hYmxlZCBvbiB0aGUgYnJpZ2UuIEluIHRoaXMKK3N0YXRlIHRoZSBwb3J0IGZvciBsaXN0IGZvciBTVFAgQlBEVXMgYW5kIGRyb3AgYWxsIG90aGVyIHRyYWZmaWMuCisuc3AKKworLkIgMgorLSBTVFAgTEVBUk5JTkcgc3RhdGUuIE9ubHkgdmFsaWQgaWYgU1RQIGlzIGVuYWJsZWQgb24gdGhlIGJyaWRnZS4gSW4gdGhpcworc3RhdGUgdGhlIHBvcnQgd2lsbCBhY2NlcHQgdHJhZmZpYyBvbmx5IGZvciB0aGUgcHVycG9zZSBvZiB1cGRhdGluZyBNQUMKK2FkZHJlc3MgdGFibGVzLgorLnNwCisKKy5CIDMKKy0gU1RQIEZPUldBUkRJTkcgc3RhdGUuIFBvcnQgaXMgZnVsbHkgYWN0aXZlLgorLnNwCisKKy5CIDQKKy0gU1RQIEJMT0NLSU5HIHN0YXRlLiBPbmx5IHZhbGlkIGlmIFNUUCBpcyBlbmFibGVkIG9uIHRoZSBicmlkZ2UuIFRoaXMgc3RhdGUKK2lzIHVzZWQgZHVyaW5nIHRoZSBTVFAgZWxlY3Rpb24gcHJvY2Vzcy4gSW4gdGhpcyBzdGF0ZSwgcG9ydCB3aWxsIG9ubHkgcHJvY2VzcworU1RQIEJQRFVzLgorLnNwCisKKy5UUAorLkJSICJndWFyZCBvbiAiIG9yICIgZ3VhcmQgb2ZmICIKK0NvbnRyb2xzIHdoZXRoZXIgU1RQIEJQVURzIHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IHRoZSBicmlkZ2UgcG9ydC4gQnkgZGVmYXVsdCwKK3RoZSBmbGFnIGlzIHR1cm5lZCBvZmYgYWxsb3dlZCBCUERVIHByb2Nlc3NpbmcuIFR1cm5pbmcgdGhpcyBmbGFnIG9uIHdpbGwKK2NhdXNlIHRoZSBwb3J0IHRvIHN0b3AgcHJvY2Vzc2luZyBTVFAgQlBEVXMuCisKKy5UUAorLkJSICJoYWlycGluIG9uICIgb3IgIiBoYWlycGluIG9mZiAiCitDb250cm9scyB3aGV0aGVyIHRyYWZmaWMgbWF5IGJlIHNlbmQgYmFjayBvdXQgb2YgdGhlIHBvcnQgb24gd2hpY2ggaXQgd2FzCityZWNlaXZlZC4gQnkgZGVmYXVsdCwgdGhpcyBmbGFnIGlzIHR1cm5lZCBvZmYgYW5kIHRoZSBicmlkZ2Ugd2lsbCBub3QgZm9yd2FyZAordHJhZmZpYyBiYWNrIG91dCBvZiB0aGUgcmVjZWl2aW5nIHBvcnQuCisKKy5UUAorLkJSICJmYXN0bGVhdmUgb24gIiBvciAiIGZhc3RsZWF2ZSBvZmYgIgorVGhpcyBmbGFnIGFsbG93cyB0aGUgYnJpZGdlIHRvIGltbWVkaWF0ZWx5IHN0b3AgbXVsdGljYXN0IHRyYWZmaWMgb24gYSBwb3J0Cit0aGF0IHJlY2VpdmVzIElHTVAgTGVhdmUgbWVzc2FnZS4gSXQgaXMgb25seSB1c2VkIHdpdGggSUdNUCBzbm9vcGluZyBpcworZW5hYmxlZCBvbiB0aGUgYnJpZGdlLiBCeSBkZWZhdWx0IHRoZSBmbGFnIGlzIG9mZi4KKworLlRQCisuQlIgInJvb3RfYmxvY2sgb24gIiBvciAiIHJvb3RfYmxvY2sgb2ZmICIKK0NvbnRyb2xzIHdoZXRoZXIgYSBnaXZlbiBwb3J0IGlzIGFsbG93ZWQgdG8gYmVjb21lIHJvb3QgcG9ydCBvciBub3QuIE9ubHkgdXNlZAord2hlbiBTVFAgaXMgZW5hYmxlZCBvbiB0aGUgYnJpZGdlLiBCeSBkZWZhdWx0IHRoZSBmbGFnIGlzIG9mZi4KKworLlRQCisuQlIgImxlYXJuaW5nIG9uICIgb3IgIiBsZWFybmluZyBvZmYgIgorQ29udHJvbHMgd2hldGhlciBhIGdpdmVuIHBvcnQgd2lsbCBsZWFybiBNQUMgYWRkcmVzc2VzIGZyb20gcmVjZWl2ZWQgdHJhZmZpYyBvcgorbm90LiBJZiBsZWFybmluZyBpZiBvZmYsIHRoZSBicmlkZ2Ugd2lsbCBlbmQgdXAgZmxvb2RpbmcgYW55IHRyYWZmaWMgZm9yIHdoaWNoCitpdCBoYXMgbm8gRkRCIGVudHJ5LiBCeSBkZWZhdWx0IHRoaXMgZmxhZyBpcyBvbi4KKworLlRQCisuQlIgImxlYXJuaW5nX3N5bmMgb24gIiBvciAiIGxlYXJuaW5nX3N5bmMgb2ZmICIKK0NvbnRyb2xzIHdoZXRoZXIgYSBnaXZlbiBwb3J0IHdpbGwgc3luYyBNQUMgYWRkcmVzc2VzIGxlYXJuZWQgb24gZGV2aWNlIHBvcnQgdG8KK2JyaWRnZSBGREIuCisKKy5UUAorLkJSICJmbG9vZGluZyBvbiAiIG9yICIgZmxvb2Rpbmcgb2ZmICIKK0NvbnRyb2xzIHdoZXRoZXIgYSBnaXZlbiBwb3J0IHdpbGwgZmxvb2QgdW5pY2FzdCB0cmFmZmljIGZvciB3aGljaCB0aGVyZSBpcyBubyBGREIgZW50cnkuIEJ5IGRlZmF1bHQgdGhpcyBmbGFnIGlzIG9uLgorCisuVFAKKy5CSSBod21vZGUKK1NvbWUgbmV0d29yayBpbnRlcmZhY2UgY2FyZHMgc3VwcG9ydCBIVyBicmlkZ2UgZnVuY3Rpb25hbGl0eSBhbmQgdGhleSBtYXkgYmUKK2NvbmZpZ3VyZWQgaW4gZGlmZmVyZW50IG1vZGVzLiBDdXJyZW50bHkgc3VwcG9ydCBtb2RlcyBhcmU6CisKKy5CIHZlcGEKKy0gRGF0YSBzZW50IGJldHdlZW4gSFcgcG9ydHMgaXMgc2VudCBvbiB0aGUgd2lyZSB0byB0aGUgZXh0ZXJuYWwKK3N3aXRjaC4KKworLkIgdmViCistIGJyaWRnaW5nIGhhcHBlbnMgaW4gaGFyZHdhcmUuCisKKy5UUAorLkJJIHNlbGYKK2xpbmsgc2V0dGluZyBpcyBjb25maWd1cmVkIG9uIHNwZWNpZmllZCBwaHlzaWNhbCBkZXZpY2UKKworLlRQCisuQkkgbWFzdGVyCitsaW5rIHNldHRpbmcgaXMgY29uZmlndXJlZCBvbiB0aGUgc29mdHdhcmUgYnJpZGdlIChkZWZhdWx0KQorCisuVFAKKy5CUiAiXC10IiAsICIgXC10aW1lc3RhbXAiCitkaXNwbGF5IGN1cnJlbnQgdGltZSB3aGVuIHVzaW5nIG1vbml0b3Igb3B0aW9uLgorCisuU1MgYnJpZGdlIGxpbmsgc2hvdyAtIGxpc3QgYnJpZGdlIHBvcnQgY29uZmlndXJhdGlvbi4KKworVGhpcyBjb21tYW5kIGRpc3BsYXlzIHRoZSBjdXJyZW50IGJyaWRnZSBwb3J0IGNvbmZpZ3VyYXRpb24gYW5kIGZsYWdzLgorCisuU0ggYnJpZGdlIGZkYiAtIGZvcndhcmRpbmcgZGF0YWJhc2UgbWFuYWdlbWVudAorCisuQiBmZGIKK29iamVjdHMgY29udGFpbiBrbm93biBFdGhlcm5ldCBhZGRyZXNzZXMgb24gYSBsaW5rLgorCisuUAorVGhlIGNvcnJlc3BvbmRpbmcgY29tbWFuZHMgZGlzcGxheSBmZGIgZW50cmllcywgYWRkIG5ldyBlbnRyaWVzLAorYXBwZW5kIGVudHJpZXMsCithbmQgZGVsZXRlIG9sZCBvbmVzLgorCisuU1MgYnJpZGdlIGZkYiBhZGQgLSBhZGQgYSBuZXcgZmRiIGVudHJ5CisKK1RoaXMgY29tbWFuZCBjcmVhdGVzIGEgbmV3IGZkYiBlbnRyeS4KKworLlRQCisuQkkgIkxMQUREUiIKK3RoZSBFdGhlcm5ldCBNQUMgYWRkcmVzcy4KKworLlRQCisuQkkgZGV2ICIgREVWIgordGhlIGludGVyZmFjZSB0byB3aGljaCB0aGlzIGFkZHJlc3MgaXMgYXNzb2NpYXRlZC4KKworLkIgc2VsZgorLSB0aGUgYWRkcmVzcyBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHBvcnQgZHJpdmVycyBmZGIuIFVzdWFsbHkgaGFyZHdhcmUuCisuc3AKKworLkIgbWFzdGVyCistIHRoZSBhZGRyZXNzIGlzIGFzc29jaWF0ZWQgd2l0aCBtYXN0ZXIgZGV2aWNlcyBmZGIuIFVzdWFsbHkgc29mdHdhcmUgKGRlZmF1bHQpLgorLnNwCisKKy5CIHJvdXRlcgorLSB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBpcyBhc3NvY2lhdGVkIHdpdGggYSByb3V0ZXIuCitWYWxpZCBpZiB0aGUgcmVmZXJlbmNlZCBkZXZpY2UgaXMgYSBWWExBTiB0eXBlIGRldmljZSBhbmQgaGFzCityb3V0ZSBzaG9ydGNpcmN1aXQgZW5hYmxlZC4KKy5zcAorCisuQiB1c2UKKy0gdGhlIGFkZHJlc3MgaXMgaW4gdXNlLiBVc2VyIHNwYWNlIGNhbiB1c2UgdGhpcyBvcHRpb24gdG8KK2luZGljYXRlIHRvIHRoZSBrZXJuZWwgdGhhdCB0aGUgZmRiIGVudHJ5IGlzIGluIHVzZS4KKy5zcAorCisuaW4gLTgKK1RoZSBuZXh0IGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIGFwcGx5IG9ubHkKK3doZW4gdGhlIHNwZWNpZmllZCBkZXZpY2UKKy5JIERFVgoraXMgb2YgdHlwZSBWWExBTi4KKy5UUAorLkJJIGRzdCAiIElQQUREUiIKK3RoZSBJUCBhZGRyZXNzIG9mIHRoZSBkZXN0aW5hdGlvbgorVlhMQU4gdHVubmVsIGVuZHBvaW50IHdoZXJlIHRoZSBFdGhlcm5ldCBNQUMgQUREUkVTUyByZXNpZGVzLgorCisuVFAKKy5CSSB2bmkgIiBWTkkiCit0aGUgVlhMQU4gVk5JIE5ldHdvcmsgSWRlbnRpZmllciAob3IgVlhMQU4gU2VnbWVudCBJRCkKK3RvIHVzZSB0byBjb25uZWN0IHRvIHRoZSByZW1vdGUgVlhMQU4gdHVubmVsIGVuZHBvaW50LgorSWYgb21pdHRlZCB0aGUgdmFsdWUgc3BlY2lmaWVkIGF0IHZ4bGFuIGRldmljZSBjcmVhdGlvbgord2lsbCBiZSB1c2VkLgorCisuVFAKKy5CSSBwb3J0ICIgUE9SVCIKK3RoZSBVRFAgZGVzdGluYXRpb24gUE9SVCBudW1iZXIgdG8gdXNlIHRvIGNvbm5lY3QgdG8gdGhlCityZW1vdGUgVlhMQU4gdHVubmVsIGVuZHBvaW50LgorSWYgb21pdHRlZCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyB1c2VkLgorCisuVFAKKy5CSSB2aWEgIiBERVZJQ0UiCitkZXZpY2UgbmFtZSBvZiB0aGUgb3V0Z29pbmcgaW50ZXJmYWNlIGZvciB0aGUKK1ZYTEFOIGRldmljZSBkcml2ZXIgdG8gcmVhY2ggdGhlCityZW1vdGUgVlhMQU4gdHVubmVsIGVuZHBvaW50LgorCisuU1MgYnJpZGdlIGZkYiBhcHBlbmQgLSBhcHBlbmQgYSBmb3J3YXJkaW5nIGRhdGFiYXNlIGVudHJ5CitUaGlzIGNvbW1hbmQgYWRkcyBhIG5ldyBmZGIgZW50cnkgd2l0aCBhbiBhbHJlYWR5IGtub3duCisuSVIgTExBRERSIC4KK1ZhbGlkIG9ubHkgZm9yIG11bHRpY2FzdCBsaW5rIGxheWVyIGFkZHJlc3Nlcy4KK1RoZSBjb21tYW5kIGFkZHMgc3VwcG9ydCBmb3IgYnJvYWRjYXN0IGFuZCBtdWx0aWNhc3QKK0V0aGVybmV0IE1BQyBhZGRyZXNzZXMuCitUaGUgRXRoZXJuZXQgTUFDIGFkZHJlc3MgaXMgYWRkZWQgbXVsdGlwbGUgdGltZXMgaW50bwordGhlIGZvcndhcmRpbmcgZGF0YWJhc2UgYW5kIHRoZSB2eGxhbiBkZXZpY2UgZHJpdmVyCitzZW5kcyBhIGNvcHkgb2YgdGhlIGRhdGEgcGFja2V0IHRvIGVhY2ggZW50cnkgZm91bmQuCisKKy5QUAorVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgd2l0aAorLkJSICJicmlkZ2UgZmRiIGFkZCIgLgorCisuU1MgYnJpZGdlIGZkYiBkZWxldGUgLSBkZWxldGUgYSBmb3J3YXJkaW5nIGRhdGFiYXNlIGVudHJ5CitUaGlzIGNvbW1hbmQgcmVtb3ZlcyBhbiBleGlzdGluZyBmZGIgZW50cnkuCisKKy5QUAorVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgd2l0aAorLkJSICJicmlkZ2UgZmRiIGFkZCIgLgorCisuU1MgYnJpZGdlIGZkYiByZXBsYWNlIC0gcmVwbGFjZSBhIGZvcndhcmRpbmcgZGF0YWJhc2UgZW50cnkKK0lmIG5vIG1hdGNoaW5nIGVudHJ5IGlzIGZvdW5kLCBhIG5ldyBvbmUgd2lsbCBiZSBjcmVhdGVkIGluc3RlYWQuCisKKy5QUAorVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgd2l0aAorLkJSICJicmlkZ2UgZmRiIGFkZCIgLgorCisuU1MgYnJpZGdlIGZkYiBzaG93IC0gbGlzdCBmb3J3YXJkaW5nIGVudHJpZXMuCisKK1RoaXMgY29tbWFuZCBkaXNwbGF5cyB0aGUgY3VycmVudCBmb3J3YXJkaW5nIHRhYmxlLgorCisuUFAKK1dpdGggdGhlCisuQiAtc3RhdGlzdGljcworb3B0aW9uLCB0aGUgY29tbWFuZCBiZWNvbWVzIHZlcmJvc2UuIEl0IHByaW50cyBvdXQgdGhlIGxhc3QgdXBkYXRlZAorYW5kIGxhc3QgdXNlZCB0aW1lIGZvciBlYWNoIGVudHJ5LgorCisuU0ggYnJpZGdlIG1kYiAtIG11bHRpY2FzdCBncm91cCBkYXRhYmFzZSBtYW5hZ2VtZW50CisKKy5CIG1kYgorb2JqZWN0cyBjb250YWluIGtub3duIElQIG11bHRpY2FzdCBncm91cCBhZGRyZXNzZXMgb24gYSBsaW5rLgorCisuUAorVGhlIGNvcnJlc3BvbmRpbmcgY29tbWFuZHMgZGlzcGxheSBtZGIgZW50cmllcywgYWRkIG5ldyBlbnRyaWVzLAorYW5kIGRlbGV0ZSBvbGQgb25lcy4KKworLlNTIGJyaWRnZSBtZGIgYWRkIC0gYWRkIGEgbmV3IG11bHRpY2FzdCBncm91cCBkYXRhYmFzZSBlbnRyeQorCitUaGlzIGNvbW1hbmQgY3JlYXRlcyBhIG5ldyBtZGIgZW50cnkuCisKKy5UUAorLkJJIGRldiAiIERFViIKK3RoZSBpbnRlcmZhY2Ugd2hlcmUgdGhpcyBncm91cCBhZGRyZXNzIGlzIGFzc29jaWF0ZWQuCisKKy5UUAorLkJJIHBvcnQgIiBQT1JUIgordGhlIHBvcnQgd2hvc2UgbGluayBpcyBrbm93biB0byBoYXZlIG1lbWJlcnMgb2YgdGhpcyBtdWx0aWNhc3QgZ3JvdXAuCisKKy5UUAorLkJJIGdycCAiIEdST1VQIgordGhlIElQIG11bHRpY2FzdCBncm91cCBhZGRyZXNzIHdob3NlIG1lbWJlcnMgcmVzaWRlIG9uIHRoZSBsaW5rIGNvbm5lY3RlZCB0bwordGhlIHBvcnQuCisKKy5CIHBlcm1hbmVudAorLSB0aGUgbWRiIGVudHJ5IGlzIHBlcm1hbmVudAorLnNwCisKKy5CIHRlbXAKKy0gdGhlIG1kYiBlbnRyeSBpcyB0ZW1wb3JhcnkgKGRlZmF1bHQpCisuc3AKKworLlRQCisuQkkgdmlkICIgVklEIgordGhlIFZMQU4gSUQgd2hpY2ggaXMga25vd24gdG8gaGF2ZSBtZW1iZXJzIG9mIHRoaXMgbXVsdGljYXN0IGdyb3VwLgorCisuaW4gLTgKKy5TUyBicmlkZ2UgbWRiIGRlbGV0ZSAtIGRlbGV0ZSBhIG11bHRpY2FzdCBncm91cCBkYXRhYmFzZSBlbnRyeQorVGhpcyBjb21tYW5kIHJlbW92ZXMgYW4gZXhpc3RpbmcgbWRiIGVudHJ5LgorCisuUFAKK1RoZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIHdpdGgKKy5CUiAiYnJpZGdlIG1kYiBhZGQiIC4KKworLlNTIGJyaWRnZSBtZGIgc2hvdyAtIGxpc3QgbXVsdGljYXN0IGdyb3VwIGRhdGFiYXNlIGVudHJpZXMKKworVGhpcyBjb21tYW5kIGRpc3BsYXlzIHRoZSBjdXJyZW50IG11bHRpY2FzdCBncm91cCBtZW1iZXJzaGlwIHRhYmxlLiBUaGUgdGFibGUKK2lzIHBvcHVsYXRlZCBieSBJR01QIGFuZCBNTEQgc25vb3BpbmcgaW4gdGhlIGJyaWRnZSBkcml2ZXIgYXV0b21hdGljYWxseS4gSXQKK2NhbiBiZSBhbHRlcmVkIGJ5CisuQiBicmlkZ2UgbWRiIGFkZAorYW5kCisuQiBicmlkZ2UgbWRiIGRlbAorY29tbWFuZHMgbWFudWFsbHkgdG9vLgorCisuVFAKKy5CSSBkZXYgIiBERVYiCit0aGUgaW50ZXJmYWNlIG9ubHkgd2hvc2UgZW50cmllcyBzaG91bGQgYmUgbGlzdGVkLiBEZWZhdWx0IGlzIHRvIGxpc3QgYWxsCiticmlkZ2UgaW50ZXJmYWNlcy4KKworLlBQCitXaXRoIHRoZQorLkIgLWRldGFpbHMKK29wdGlvbiwgdGhlIGNvbW1hbmQgYmVjb21lcyB2ZXJib3NlLiBJdCBwcmludHMgb3V0IHRoZSBwb3J0cyBrbm93biB0byBoYXZlCithIGNvbm5lY3RlZCByb3V0ZXIuCisKKy5TSCBicmlkZ2UgdmxhbiAtIFZMQU4gZmlsdGVyIGxpc3QKKworLkIgdmxhbgorb2JqZWN0cyBjb250YWluIGtub3duIFZMQU4gSURzIGZvciBhIGxpbmsuCisKKy5QCitUaGUgY29ycmVzcG9uZGluZyBjb21tYW5kcyBkaXNwbGF5IHZsYW4gZmlsdGVyIGVudHJpZXMsIGFkZCBuZXcgZW50cmllcywKK2FuZCBkZWxldGUgb2xkIG9uZXMuCisKKy5TUyBicmlkZ2UgdmxhbiBhZGQgLSBhZGQgYSBuZXcgdmxhbiBmaWx0ZXIgZW50cnkKKworVGhpcyBjb21tYW5kIGNyZWF0ZXMgYSBuZXcgdmxhbiBmaWx0ZXIgZW50cnkuCisKKy5UUAorLkJJIGRldiAiIE5BTUUiCit0aGUgaW50ZXJmYWNlIHdpdGggd2hpY2ggdGhpcyB2bGFuIGlzIGFzc29jaWF0ZWQuCisKKy5UUAorLkJJIHZpZCAiIFZJRCIKK3RoZSBWTEFOIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgdmxhbi4KKworLlRQCisuQkkgcHZpZAordGhlIHZsYW4gc3BlY2lmaWVkIGlzIHRvIGJlIGNvbnNpZGVyZWQgYSBQVklEIGF0IGluZ3Jlc3MuCitBbnkgdW50YWdnZWQgZnJhbWVzIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhpcyBWTEFOLgorCisuVFAKKy5CSSB1bnRhZ2dlZAordGhlIHZsYW4gc3BlY2lmaWVkIGlzIHRvIGJlIHRyZWF0ZWQgYXMgdW50YWdnZWQgb24gZWdyZXNzLgorCisuVFAKKy5CSSBzZWxmCit0aGUgdmxhbiBpcyBjb25maWd1cmVkIG9uIHRoZSBzcGVjaWZpZWQgcGh5c2ljYWwgZGV2aWNlLiBSZXF1aXJlZCBpZiB0aGUKK2RldmljZSBpcyB0aGUgYnJpZGdlIGRldmljZS4KKworLlRQCisuQkkgbWFzdGVyCit0aGUgdmxhbiBpcyBjb25maWd1cmVkIG9uIHRoZSBzb2Z0d2FyZSBicmlkZ2UgKGRlZmF1bHQpLgorCisuU1MgYnJpZGdlIHZsYW4gZGVsZXRlIC0gZGVsZXRlIGEgZm9yd2FyZGluZyBkYXRhYmFzZSBlbnRyeQorVGhpcyBjb21tYW5kIHJlbW92ZXMgYW4gZXhpc3RpbmcgZmRiIGVudHJ5LgorCisuUFAKK1RoZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIHdpdGgKKy5CUiAiYnJpZGdlIHZsYW4gYWRkIi4KK1RoZQorLkJSICJwdmlkICIgYW5kICIgdW50YWdnZWQiCitmbGFncyBhcmUgaWdub3JlZC4KKworLlNTIGJyaWRnZSB2bGFuIHNob3cgLSBsaXN0IHZsYW4gY29uZmlndXJhdGlvbi4KKworVGhpcyBjb21tYW5kIGRpc3BsYXlzIHRoZSBjdXJyZW50IFZMQU4gZmlsdGVyIHRhYmxlLgorCisuU0ggYnJpZGdlIG1vbml0b3IgLSBzdGF0ZSBtb25pdG9yaW5nCisKK1RoZQorLkIgYnJpZGdlCit1dGlsaXR5IGNhbiBtb25pdG9yIHRoZSBzdGF0ZSBvZiBkZXZpY2VzIGFuZCBhZGRyZXNzZXMKK2NvbnRpbnVvdXNseS4gVGhpcyBvcHRpb24gaGFzIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGZvcm1hdC4KK05hbWVseSwgdGhlCisuQiBtb25pdG9yCitjb21tYW5kIGlzIHRoZSBmaXJzdCBpbiB0aGUgY29tbWFuZCBsaW5lIGFuZCB0aGVuIHRoZSBvYmplY3QgbGlzdCBmb2xsb3dzOgorCisuQlIgImJyaWRnZSBtb25pdG9yIiAiIFsgIiBhbGwgIiB8IgorLklSIE9CSkVDVC1MSVNUICIgXSIKKworLkkgT0JKRUNULUxJU1QKK2lzIHRoZSBsaXN0IG9mIG9iamVjdCB0eXBlcyB0aGF0IHdlIHdhbnQgdG8gbW9uaXRvci4KK0l0IG1heSBjb250YWluCisuQlIgbGluayAiLCAiIGZkYiAiLCBhbmQgIiBtZGIgIi4iCitJZiBubworLkIgZmlsZQorYXJndW1lbnQgaXMgZ2l2ZW4sCisuQiBicmlkZ2UKK29wZW5zIFJUTkVUTElOSywgbGlzdGVucyBvbiBpdCBhbmQgZHVtcHMgc3RhdGUgY2hhbmdlcyBpbiB0aGUgZm9ybWF0CitkZXNjcmliZWQgaW4gcHJldmlvdXMgc2VjdGlvbnMuCisKKy5QCitJZiBhIGZpbGUgbmFtZSBpcyBnaXZlbiwgaXQgZG9lcyBub3QgbGlzdGVuIG9uIFJUTkVUTElOSywKK2J1dCBvcGVucyB0aGUgZmlsZSBjb250YWluaW5nIFJUTkVUTElOSyBtZXNzYWdlcyBzYXZlZCBpbiBiaW5hcnkgZm9ybWF0CithbmQgZHVtcHMgdGhlbS4KKworLlNIIE5PVEVTCitUaGlzIGNvbW1hbmQgdXNlcyBmYWNpbGl0aWVzIGFkZGVkIGluIExpbnV4IDMuMC4KKworQWx0aG91Z2ggdGhlIGZvcndhcmRpbmcgdGFibGUgaXMgbWFpbnRhaW5lZCBvbiBhIHBlci1icmlkZ2UgZGV2aWNlIGJhc2lzCit0aGUgYnJpZGdlIGRldmljZSBpcyBub3QgcGFydCBvZiB0aGUgc3ludGF4LiBUaGlzIGlzIGEgbGltaXRhdGlvbiBvZiB0aGUKK3VuZGVybHlpbmcgbmV0bGluayBuZWlnaGJvdXIgbWVzc2FnZSBwcm90b2NvbC4gV2hlbiBkaXNwbGF5aW5nIHRoZQorZm9yd2FyZGluZyB0YWJsZSwgZW50cmllcyBmb3IgYWxsIGJyaWRnZXMgYXJlIGRpc3BsYXllZC4KK0FkZC9kZWxldGUvbW9kaWZ5IGNvbW1hbmRzIGRldGVybWluZSB0aGUgdW5kZXJseWluZyBicmlkZ2UgZGV2aWNlCitiYXNlZCBvbiB0aGUgYnJpZGdlIHRvIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIGV0aGVybmV0IGRldmljZSBpcyBhdHRhY2hlZC4KKworCisuU0ggU0VFIEFMU08KKy5CUiBpcCAoOCkKKy5TSCBCVUdTCisuUkIgIlBsZWFzZSBkaXJlY3QgYnVncmVwb3J0cyBhbmQgcGF0Y2hlcyB0bzogIiA8bmV0ZGV2QHZnZXIua2VybmVsLm9yZz4KKworLlNIIEFVVEhPUgorT3JpZ2luYWwgTWFucGFnZSBieSBTdGVwaGVuIEhlbW1pbmdlcgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWFuL21hbjgvY3RzdGF0LjggYi9pcHJvdXRlMi9tYW4vbWFuOC9jdHN0YXQuOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODBlMmIyCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbWFuL21hbjgvY3RzdGF0LjgKQEAgLTAsMCArMSBAQAorLnNvIG1hbjgvbG5zdGF0LjgKZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L2dlbmwuOCBiL2lwcm91dGUyL21hbi9tYW44L2dlbmwuOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWRlNTk0Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbWFuL21hbjgvZ2VubC44CkBAIC0wLDAgKzEsNzcgQEAKKy5USCBHRU5MIDggIjI5IE9jdCAyMDE1IiAiaXByb3V0ZTIiICJMaW51eCIKKy5TSCBOQU1FCitnZW5sIFwtIGdlbmVyaWMgbmV0bGluayB1dGlsaXR5IGZyb250ZW5kCisuU0ggU1lOT1BTSVMKKy5pbiArOAorLnRpIC04CisuQlIgZ2VubCAiIFsgIiAtcyBbIHRhdGlzdGljcyAiXSBdIFsgIiAtZCBbIGV0YWlscyAiXSBdIFsgIiAtciBbIGF3ICJdIF0gIiBPQkpFQ1QKKworLnRpIC04CisuQlIgZ2VubCAiIHsgIiAtViBbIGVyc2lvbiAiXSB8ICIgLWggWyBlbHAgIl0gfSIKKworLnRpIC04CisuSVIgT0JKRUNUICIgOj0geyAiCisuQiBjdHJsCisuSVIgQ1RSTF9PUFRTICIgfSIKKworLnRpIC04CisuSVIgQ1RSTF9PUFRTICIgOj0geyAiCisuQlIgaGVscCAiIHwgIiBsaXN0ICIgfCAiIG1vbml0b3IgIiB8ICIgZ2V0CisuSVIgUEFSTVMgIiB9IgorCisudGkgLTgKKy5JUiBQQVJNUyAiIDo9IHsgIgorLkIgbmFtZQorLklSIE5BTUUgIiB8ICIKKy5CIGlkCisuSVIgSUQgIiB9IgorLlNIIERFU0NSSVBUSU9OCitUaGUKKy5CIGdlbmwKK3V0aWxpdHkgcHJvdmlkZXMgYSBzaW1wbGUgZnJvbnRlbmQgdG8gdGhlIGdlbmVyaWMgbmV0bGluayBsaWJyYXJ5LiBBbHRob3VnaCBpdCdzCitkZXNpZ25lZCB0byBzdXBwb3J0IG11bHRpcGxlCisuSVIgT0JKRUNUIHMsCitmb3Igbm93IG9ubHkgdGhlCisuQiBjdHJsCitvYmplY3QgaXMgYXZhaWxhYmxlLCB3aGljaCBpcyB1c2VkIHRvIHF1ZXJ5IHRoZSBnZW5lcmljIG5ldGxpbmsgY29udHJvbGxlci4KKy5TUyBjdHJsCitUaGUgZ2VuZXJpYyBuZXRsaW5rIGNvbnRyb2xsZXIgY2FuIGJlIHF1ZXJpZWQgaW4gdmFyaW91cyB3YXlzOgorLlRQCisuQiBoZWxwCitUaGlzIGNvbW1hbmQganVzdCBwcmludHMgYSBoZWxwIHRleHQgZm9yIHRoZQorLkIgY3RybAorb2JqZWN0LgorLlRQCisuQiBsaXN0CitTaG93IHRoZSByZWdpc3RlcmVkIG5ldGxpbmsgdXNlcnMuCisuVFAKKy5CIG1vbml0b3IKK0xpc3RlbiBmb3IgZ2VuZXJpYyBuZXRsaW5rIG5vdGlmaWNhdGlvbnMuCisuVFAKKy5CIGdldAorUXVlcnkgdGhlIGNvbnRyb2xsZXIgZm9yIGEgZ2l2ZW4gdXNlciwgaWRlbnRpZmllZCBlaXRoZXIgYnkKKy5CUiBuYW1lICIgb3IgIiBpZCAuCisuU0ggT1BUSU9OUworZ2VubCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnMuCisuVFAKKy5CIFwtaCwgXC1oZWxwCitTaG93IHN1bW1hcnkgb2Ygb3B0aW9ucy4KKy5UUAorLkIgXC1WLCBcLVZlcnNpb24KK1Nob3cgdmVyc2lvbiBvZiBwcm9ncmFtLgorLlRQCisuQiBcLXMsIFwtc3RhdHMsIFwtc3RhdGlzdGljcworU2hvdyBvYmplY3Qgc3RhdGlzdGljcy4KKy5UUAorLkIgXC1kLCBcLWRldGFpbHMKK1Nob3cgb2JqZWN0IGRldGFpbHMuCisuVFAKKy5CIFwtciwgXC1yYXcKK0R1bXAgcmF3IG91dHB1dCBvbmx5LgorLlNIIFNFRSBBTFNPCisuQlIgaXAgKDgpCisuYnIKKy5TSCBBVVRIT1IKK2dlbmwgd2FzIHdyaXR0ZW4gYnkgSmFtYWwgSGFkaSBTYWxpbSA8aGFkaUBjeWJlcnVzLmNhPi4KKy5QUAorVGhpcyBtYW51YWwgcGFnZSB3YXMgd3JpdHRlbiBieSBQZXRyIFNhYmF0YSA8Y29udHlrQHJlZGhhdC5jb20+LgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWFuL21hbjgvaWZjZmcuOCBiL2lwcm91dGUyL21hbi9tYW44L2lmY2ZnLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEzNzg2YwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L2lmY2ZnLjgKQEAgLTAsMCArMSw0OCBAQAorLlRIIElGQ0ZHIDggIlNlcHRlbWJlciAyNCAyMDA5IiAiaXByb3V0ZTIiICJMaW51eCIKKy5TSCBOQU1FCitpZmNmZyBcLSBzaW1wbGlzdGljIHNjcmlwdCB3aGljaCByZXBsYWNlcyBpZmNvbmZpZyBJUCBtYW5hZ2VtZW50CisuU0ggU1lOT1BTSVMKKy5hZCBsCisuaW4gKzgKKy50aSAtOAorLkIgaWZjZmcKKy5SSSAiWyAiIERFVklDRSAiIF0gWyAiIGNvbW1hbmQgIiBdICIgQUREUkVTUyAiIFsgIiBQRUVSICIgXSAiCisuc3AKKworLlNIIERFU0NSSVBUSU9OCitUaGlzIG1hbnVhbCBwYWdlIGRvY3VtZW50cyBicmllZmx5IHRoZQorLkIgaWZjZmcKK2NvbW1hbmQuCisuUFAKK1RoaXMgaXMgYSBzaW1wbGlzdGljIHNjcmlwdCByZXBsYWNpbmcgb25lIG9wdGlvbiBvZgorLkIgaWZjb25maWcKKywgbmFtZWx5LCBJUCBhZGRyZXNzIG1hbmFnZW1lbnQuIEl0IG5vdCBvbmx5IGFkZHMKK2FkZHJlc3NlcywgYnV0IGFsc28gY2FycmllcyBvdXQgRHVwbGljYXRlIEFkZHJlc3MgRGV0ZWN0aW9uIFJGQy1ESENQLAorc2VuZHMgdW5zb2xpY2l0ZWQgQVJQIHRvIHVwZGF0ZSB0aGUgY2FjaGVzIG9mIG90aGVyIGhvc3RzIHNoYXJpbmcKK3RoZSBpbnRlcmZhY2UsIGFkZHMgc29tZSBjb250cm9sIHJvdXRlcyBhbmQgcmVzdGFydHMgUm91dGVyIERpc2NvdmVyeQord2hlbiBpdCBpcyBuZWNlc3NhcnkuCisKKy5TSCBJRkNPTkZJRyAtIENPTU1BTkQgU1lOVEFYCisKKy5TUworLlRQCisuQiBERVZJQ0UKKy0gaXQgbWF5IGhhdmUgYWxpYXMsIHN1ZmZpeCwgc2VwYXJhdGVkIGJ5IGNvbG9uLgorCisuVFAKKy5CIGNvbW1hbmQKKy0gYWRkLCBkZWxldGUgb3Igc3RvcC4KKworLlRQCisuQiBBRERSRVNTCistIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgcHJlZml4IGxlbmd0aC4KKworLlRQCisuQiBwZWVyCistIG9wdGlvbmFsIHBlZXIgYWRkcmVzcyBmb3IgcG9pbnRwb2ludCBpbnRlcmZhY2VzLgorCisuU0ggTk9URVMKK1RoaXMgc2NyaXB0IGlzIG5vdCBzdWl0YWJsZSBmb3IgdXNlIHdpdGggSVB2Ni4KKworLlNIIFNFRSBBTFNPCisuUkIgIklQIENvbW1hbmQgcmVmZXJlbmNlICIgaXAtY3JlZi5wcwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWFuL21hbjgvaWZzdGF0LjggYi9pcHJvdXRlMi9tYW4vbWFuOC9pZnN0YXQuOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDlkODY4Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbWFuL21hbjgvaWZzdGF0LjgKQEAgLTAsMCArMSw1OSBAQAorLlRIIElGU1RBVCA4ICIyOCBPY3QgMjAxNSIgImlwcm91dGUyIiAiTGludXgiCisuU0ggTkFNRQoraWZzdGF0IFwtIGhhbmR5IHV0aWxpdHkgdG8gcmVhZCBuZXR3b3JrIGludGVyZmFjZSBzdGF0aXN0aWNzCisuU0ggU1lOT1BTSVMKKy5pbiArOAorLnRpIC04CisuQlIgaWZzdGF0ICIgWyAiCisuSVIgT1BUSU9OUyAiIF0gWyAiIElOVEVSRkFDRV9MSVNUICIgXSIKKworLnRpIC04CisuSVIgSU5URVJGQUNFX0xJU1QgIiA6PSAiIElOVEVSRkFDRV9MSVNUICIgfCAiIGludGVyZmFjZQorLlNIIERFU0NSSVBUSU9OCitcZkJpZnN0YXRcZlAgbmVhdGx5IHByaW50cyBvdXQgbmV0d29yayBpbnRlcmZhY2Ugc3RhdGlzdGljcy4KK1RoZSB1dGlsaXR5IGtlZXBzIHJlY29yZHMgb2YgdGhlIHByZXZpb3VzIGRhdGEgZGlzcGxheWVkIGluIGhpc3RvcnkgZmlsZXMgYW5kCitieSBkZWZhdWx0IG9ubHkgc2hvd3MgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBsYXN0IGFuZCB0aGUgY3VycmVudCBjYWxsLgorTG9jYXRpb24gb2YgdGhlIGhpc3RvcnkgZmlsZXMgZGVmYXVsdHMgdG8gL3RtcC8uaWZzdGF0LnUkVUlEIGJ1dCBtYXkgYmUKK292ZXJyaWRkZW4gd2l0aCB0aGUgSUZTVEFUX0hJU1RPUlkgZW52aXJvbm1lbnQgdmFyaWFibGUuCisuU0ggT1BUSU9OUworLlRQCisuQiBcLWgsIFwtXC1oZWxwCitTaG93IHN1bW1hcnkgb2Ygb3B0aW9ucy4KKy5UUAorLkIgXC1WLCBcLVwtdmVyc2lvbgorU2hvdyB2ZXJzaW9uIG9mIHByb2dyYW0uCisuVFAKKy5CIFwtYSwgXC1cLWlnbm9yZQorSWdub3JlIHRoZSBoaXN0b3J5IGZpbGUuCisuVFAKKy5CIFwtZCwgXC1cLXNjYW49U0VDUworU2FtcGxlIHN0YXRpc3RpY3MgZXZlcnkgU0VDUyBzZWNvbmQuCisuVFAKKy5CIFwtZSwgXC1cLWVycm9ycworU2hvdyBlcnJvcnMuCisuVFAKKy5CIFwtbiwgXC1cLW5vb3V0cHV0CitEb24ndCBkaXNwbGF5IGFueSBvdXRwdXQuICBVcGRhdGUgdGhlIGhpc3RvcnkgZmlsZSBvbmx5LgorLlRQCisuQiBcLXIsIFwtXC1yZXNldAorUmVzZXQgaGlzdG9yeS4KKy5UUAorLkIgXC1zLCBcLVwtbm91cGRhdGUKK0Rvbid0IHVwZGF0ZSB0aGUgaGlzdG9yeSBmaWxlLgorLlRQCisuQiBcLXQsIFwtXC1pbnRlcnZhbD1TRUNTCitSZXBvcnQgYXZlcmFnZSBvdmVyIHRoZSBsYXN0IFNFQ1Mgc2Vjb25kcy4KKy5UUAorLkIgXC16LCBcLVwtemVyb3MKK1Nob3cgZW50cmllcyB3aXRoIHplcm8gYWN0aXZpdHkuCisuU0ggRU5WSVJPTk1FTlQKKy5UUAorLkIgSUZTVEFUX0hJU1RPUlkKK0lmIHNldCwgaXQncyB2YWx1ZSBpcyBpbnRlcnByZXRlZCBhcyBhbHRlcm5hdGUgaGlzdG9yeSBmaWxlIHBhdGguCisuU0ggU0VFIEFMU08KKy5CUiBpcCAoOCkKKy5icgorLlNIIEFVVEhPUgoraWZzdGF0IHdhcyB3cml0dGVuIGJ5IEFsZXhleSBLdXpuZXRzb3YgPGt1em5ldEBtczIuaW5yLmFjLnJ1Pi4KKy5QUAorVGhpcyBtYW51YWwgcGFnZSB3YXMgd3JpdHRlbiBieSBQZXRyIFNhYmF0YSA8Y29udHlrQHJlZGhhdC5jb20+LgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWFuL21hbjgvaXAtYWRkcmVzcy44LmluIGIvaXByb3V0ZTIvbWFuL21hbjgvaXAtYWRkcmVzcy44LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1OWQ5MDYKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9tYW4vbWFuOC9pcC1hZGRyZXNzLjguaW4KQEAgLTAsMCArMSwzNDIgQEAKKy5USCAiSVBcLUFERFJFU1MiIDggIjIwIERlYyAyMDExIiAiaXByb3V0ZTIiICJMaW51eCIKKy5TSCAiTkFNRSIKK2lwLWFkZHJlc3MgXC0gcHJvdG9jb2wgYWRkcmVzcyBtYW5hZ2VtZW50CisuU0ggIlNZTk9QU0lTIgorLnNwCisuYWQgbAorLmluICs4CisudGkgLTgKKy5CIGlwCisuUkkgIlsgIiBPUFRJT05TICIgXSIKKy5CIGFkZHJlc3MKKy5SSSAiIHsgIiBDT01NQU5EICIgfCAiCisuQlIgaGVscCAiIH0iCisuc3AKKworLnRpIC04CisuQlIgImlwIGFkZHJlc3MiICIgeyAiIGFkZCAiIHwgIiBjaGFuZ2UgIiB8ICIgcmVwbGFjZSAiIH0gIgorLklCIElGQUREUiAiIGRldiAiIElGTkFNRQorLlJJICJbICIgTElGRVRJTUUgIiBdIFsgIiBDT05GRkxBRy1MSVNUICIgXSIKKworLnRpIC04CisuQlIgImlwIGFkZHJlc3MgZGVsIgorLklCIElGQUREUiAiIGRldiAiIElGTkFNRSAiIFsgIiBtbmd0bXBhZGRyICIgXSIKKworLnRpIC04CisuQlIgImlwIGFkZHJlc3MiICIgeyAiIHNob3cgIiB8ICIgc2F2ZSAiIHwgIiBmbHVzaCAiIH0gWyAiIGRldgorLklSIElGTkFNRSAiIF0gWyAiCisuQiAgc2NvcGUKKy5JUiBTQ09QRS1JRCAiIF0gWyAiCisuQiAgdG8KKy5JUiBQUkVGSVggIiBdIFsgIiBGTEFHLUxJU1QgIiBdIFsgIgorLkIgIGxhYmVsCisuSVIgUEFUVEVSTiAiIF0gWyAiIHVwICIgXSIKKworLnRpIC04CisuQlIgImlwIGFkZHJlc3MiICIgeyAiIHNob3dkdW1wICIgfCAiIHJlc3RvcmUgIiB9IgorCisudGkgLTgKKy5JUiBJRkFERFIgIiA6PSAiIFBSRUZJWCAiIHwgIiBBRERSCisuQiAgcGVlcgorLklSIFBSRUZJWCAiIFsgIgorLkIgIGJyb2FkY2FzdAorLklSIEFERFIgIiBdIFsgIgorLkIgIGFueWNhc3QKKy5JUiBBRERSICIgXSBbICIKKy5CICBsYWJlbAorLklSIExBQkVMICIgXSBbICIKKy5CICBzY29wZQorLklSIFNDT1BFLUlEICIgXSIKKworLnRpIC04CisuSVIgU0NPUEUtSUQgIiA6PSAiCisuUkIgIlsgIiBob3N0ICIgfCAiIGxpbmsgIiB8ICIgZ2xvYmFsICIgfCAiCisuSVIgTlVNQkVSICIgXSIKKworLnRpIC04CisuSVIgRkxBRy1MSVNUICIgOj0gWyAiICBGTEFHLUxJU1QgIiBdICIgRkxBRworCisudGkgLTgKKy5JUiBGTEFHICIgOj0gIgorLlJCICJbICIgcGVybWFuZW50ICIgfCAiIGR5bmFtaWMgIiB8ICIgc2Vjb25kYXJ5ICIgfCAiIHByaW1hcnkgIiB8IFwKK1sgLSBdICIgdGVudGF0aXZlICIgfCBbIC0gXSAiIGRlcHJlY2F0ZWQgIiB8IFsgLSBdICIgZGFkZmFpbGVkICIgfCAiXAordGVtcG9yYXJ5ICIgfCAiIENPTkZGTEFHLUxJU1QgIiBdIgorCisudGkgLTgKKy5JUiBDT05GRkxBRy1MSVNUICIgOj0gWyAiICBDT05GRkxBRy1MSVNUICIgXSAiIENPTkZGTEFHCisKKy50aSAtOAorLklSIENPTkZGTEFHICIgOj0gIgorLlJCICJbICIgaG9tZSAiIHwgIiBtbmd0bXBhZGRyICIgfCAiIG5vZGFkICIgfCAiIG5vcHJlZml4cm91dGUgIiBdIgorCisudGkgLTgKKy5JUiBMSUZFVElNRSAiIDo9IFsgIgorLkJJIHZhbGlkX2xmdCAiIExGVCIKKy5SQiAifCAiIHByZWZlcnJlZF9sZnQKKy5JUiAgTEZUICIgXSIKKworLnRpIC04CisuSVIgTEZUICIgOj0gWyAiCisuQlIgZm9yZXZlciAiIHwiCisuSVIgU0VDT05EUyAiIF0iCisKKy5TSCAiREVTQ1JJUFRJT04iCitUaGUKKy5CIGFkZHJlc3MKK2lzIGEgcHJvdG9jb2wgKElQdjQgb3IgSVB2NikgYWRkcmVzcyBhdHRhY2hlZAordG8gYSBuZXR3b3JrIGRldmljZS4gRWFjaCBkZXZpY2UgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBhZGRyZXNzCit0byB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgcHJvdG9jb2wuIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgc2V2ZXJhbAorZGlmZmVyZW50IGFkZHJlc3NlcyBhdHRhY2hlZCB0byBvbmUgZGV2aWNlLiBUaGVzZSBhZGRyZXNzZXMgYXJlIG5vdAorZGlzY3JpbWluYXRlZCwgc28gdGhhdCB0aGUgdGVybQorLkIgYWxpYXMKK2lzIG5vdCBxdWl0ZSBhcHByb3ByaWF0ZSBmb3IgdGhlbSBhbmQgd2UgZG8gbm90IHVzZSBpdCBpbiB0aGlzIGRvY3VtZW50LgorLnNwCitUaGUKKy5CIGlwIGFkZHJlc3MKK2NvbW1hbmQgZGlzcGxheXMgYWRkcmVzc2VzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLCBhZGRzIG5ldyBhZGRyZXNzZXMKK2FuZCBkZWxldGVzIG9sZCBvbmVzLgorCisuU1MgaXAgYWRkcmVzcyBhZGQgLSBhZGQgbmV3IHByb3RvY29sIGFkZHJlc3MuCisKKy5UUAorLkJJIGRldiAiIElGTkFNRSAiCit0aGUgbmFtZSBvZiB0aGUgZGV2aWNlIHRvIGFkZCB0aGUgYWRkcmVzcyB0by4KKworLlRQCisuQkkgbG9jYWwgIiBBRERSRVNTICIgKGRlZmF1bHQpCit0aGUgYWRkcmVzcyBvZiB0aGUgaW50ZXJmYWNlLiBUaGUgZm9ybWF0IG9mIHRoZSBhZGRyZXNzIGRlcGVuZHMKK29uIHRoZSBwcm90b2NvbC4gSXQgaXMgYSBkb3R0ZWQgcXVhZCBmb3IgSVAgYW5kIGEgc2VxdWVuY2Ugb2YKK2hleGFkZWNpbWFsIGhhbGZ3b3JkcyBzZXBhcmF0ZWQgYnkgY29sb25zIGZvciBJUHY2LiBUaGUKKy5JIEFERFJFU1MKK21heSBiZSBmb2xsb3dlZCBieSBhIHNsYXNoIGFuZCBhIGRlY2ltYWwgbnVtYmVyIHdoaWNoIGVuY29kZXMKK3RoZSBuZXR3b3JrIHByZWZpeCBsZW5ndGguCisKKy5UUAorLkJJIHBlZXIgIiBBRERSRVNTIgordGhlIGFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBlbmRwb2ludCBmb3IgcG9pbnRvcG9pbnQgaW50ZXJmYWNlcy4KK0FnYWluLCB0aGUKKy5JIEFERFJFU1MKK21heSBiZSBmb2xsb3dlZCBieSBhIHNsYXNoIGFuZCBhIGRlY2ltYWwgbnVtYmVyLCBlbmNvZGluZyB0aGUgbmV0d29yaworcHJlZml4IGxlbmd0aC4gSWYgYSBwZWVyIGFkZHJlc3MgaXMgc3BlY2lmaWVkLCB0aGUgbG9jYWwgYWRkcmVzcworY2Fubm90IGhhdmUgYSBwcmVmaXggbGVuZ3RoLiBUaGUgbmV0d29yayBwcmVmaXggaXMgYXNzb2NpYXRlZAord2l0aCB0aGUgcGVlciByYXRoZXIgdGhhbiB3aXRoIHRoZSBsb2NhbCBhZGRyZXNzLgorCisuVFAKKy5CSSBicm9hZGNhc3QgIiBBRERSRVNTIgordGhlIGJyb2FkY2FzdCBhZGRyZXNzIG9uIHRoZSBpbnRlcmZhY2UuCisuc3AKK0l0IGlzIHBvc3NpYmxlIHRvIHVzZSB0aGUgc3BlY2lhbCBzeW1ib2xzCisuQiAnKycKK2FuZAorLkIgJy0nCitpbnN0ZWFkIG9mIHRoZSBicm9hZGNhc3QgYWRkcmVzcy4gSW4gdGhpcyBjYXNlLCB0aGUgYnJvYWRjYXN0IGFkZHJlc3MKK2lzIGRlcml2ZWQgYnkgc2V0dGluZy9yZXNldHRpbmcgdGhlIGhvc3QgYml0cyBvZiB0aGUgaW50ZXJmYWNlIHByZWZpeC4KKworLlRQCisuQkkgbGFiZWwgIiBMQUJFTCIKK0VhY2ggYWRkcmVzcyBtYXkgYmUgdGFnZ2VkIHdpdGggYSBsYWJlbCBzdHJpbmcuCitJbiBvcmRlciB0byBwcmVzZXJ2ZSBjb21wYXRpYmlsaXR5IHdpdGggTGludXgtMi4wIG5ldCBhbGlhc2VzLAordGhpcyBzdHJpbmcgbXVzdCBjb2luY2lkZSB3aXRoIHRoZSBuYW1lIG9mIHRoZSBkZXZpY2Ugb3IgbXVzdCBiZSBwcmVmaXhlZAord2l0aCB0aGUgZGV2aWNlIG5hbWUgZm9sbG93ZWQgYnkgY29sb24uCisKKy5UUAorLkJJIHNjb3BlICIgU0NPUEVfVkFMVUUiCit0aGUgc2NvcGUgb2YgdGhlIGFyZWEgd2hlcmUgdGhpcyBhZGRyZXNzIGlzIHZhbGlkLgorVGhlIGF2YWlsYWJsZSBzY29wZXMgYXJlIGxpc3RlZCBpbiBmaWxlCisuQlIgIkBTWVNDT05GRElSQC9ydF9zY29wZXMiIC4KK1ByZWRlZmluZWQgc2NvcGUgdmFsdWVzIGFyZToKKworLmluICs4CisuQiBnbG9iYWwKKy0gdGhlIGFkZHJlc3MgaXMgZ2xvYmFsbHkgdmFsaWQuCisuc3AKKy5CIHNpdGUKKy0gKElQdjYgb25seSwgZGVwcmVjYXRlZCkgdGhlIGFkZHJlc3MgaXMgc2l0ZSBsb2NhbCwgaS5lLiBpdCBpcwordmFsaWQgaW5zaWRlIHRoaXMgc2l0ZS4KKy5zcAorLkIgbGluaworLSB0aGUgYWRkcmVzcyBpcyBsaW5rIGxvY2FsLCBpLmUuIGl0IGlzIHZhbGlkIG9ubHkgb24gdGhpcyBkZXZpY2UuCisuc3AKKy5CIGhvc3QKKy0gdGhlIGFkZHJlc3MgaXMgdmFsaWQgb25seSBpbnNpZGUgdGhpcyBob3N0LgorLmluIC04CisKKy5UUAorLkJJIHZhbGlkX2xmdCAiIExGVCIKK3RoZSB2YWxpZCBsaWZldGltZSBvZiB0aGlzIGFkZHJlc3M7IHNlZSBzZWN0aW9uIDUuNS40IG9mCitSRkMgNDg2Mi4gV2hlbiBpdCBleHBpcmVzLCB0aGUgYWRkcmVzcyBpcyByZW1vdmVkIGJ5IHRoZSBrZXJuZWwuCitEZWZhdWx0cyB0bworLkJSICJmb3JldmVyIiAuCisKKy5UUAorLkJJIHByZWZlcnJlZF9sZnQgIiBMRlQiCit0aGUgcHJlZmVycmVkIGxpZmV0aW1lIG9mIHRoaXMgYWRkcmVzczsgc2VlIHNlY3Rpb24gNS41LjQKK29mIFJGQyA0ODYyLiBXaGVuIGl0IGV4cGlyZXMsIHRoZSBhZGRyZXNzIGlzIG5vIGxvbmdlciB1c2VkIGZvciBuZXcKK291dGdvaW5nIGNvbm5lY3Rpb25zLiBEZWZhdWx0cyB0bworLkJSICJmb3JldmVyIiAuCisKKy5UUAorLkIgaG9tZQorKElQdjYgb25seSkgZGVzaWduYXRlcyB0aGlzIGFkZHJlc3MgdGhlICJob21lIGFkZHJlc3MiIGFzIGRlZmluZWQgaW4KK1JGQyA2Mjc1LgorCisuVFAKKy5CIG1uZ3RtcGFkZHIKKyhJUHY2IG9ubHkpIG1ha2UgdGhlIGtlcm5lbCBtYW5hZ2UgdGVtcG9yYXJ5IGFkZHJlc3NlcyBjcmVhdGVkIGZyb20gdGhpcyBvbmUgYXMKK3RlbXBsYXRlIG9uIGJlaGFsZiBvZiBQcml2YWN5IEV4dGVuc2lvbnMgKFJGQzMwNDEpLiBGb3IgdGhpcyB0byBiZWNvbWUgYWN0aXZlLAordGhlIFxmQnVzZV90ZW1wYWRkclxmUCBzeXNjdGwgc2V0dGluZyBoYXMgdG8gYmUgc2V0IHRvIGEgdmFsdWUgZ3JlYXRlciB0aGFuCit6ZXJvLiAgVGhlIGdpdmVuIGFkZHJlc3MgbmVlZHMgdG8gaGF2ZSBhIHByZWZpeCBsZW5ndGggb2YgNjQuIFRoaXMgZmxhZyBhbGxvd3MKK3RvIHVzZSBwcml2YWN5IGV4dGVuc2lvbnMgaW4gYSBtYW51YWxseSBjb25maWd1cmVkIG5ldHdvcmssIGp1c3QgbGlrZSBpZgorc3RhdGVsZXNzIGF1dG8tY29uZmlndXJhdGlvbiB3YXMgYWN0aXZlLgorCisuVFAKKy5CIG5vZGFkCisoSVB2NiBvbmx5KSBkbyBub3QgcGVyZm9ybSBEdXBsaWNhdGUgQWRkcmVzcyBEZXRlY3Rpb24gKFJGQyA0ODYyKSB3aGVuCithZGRpbmcgdGhpcyBhZGRyZXNzLgorCisuVFAKKy5CIG5vcHJlZml4cm91dGUKK0RvIG5vdCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBhIHJvdXRlIGZvciB0aGUgbmV0d29yayBwcmVmaXggb2YgdGhlIGFkZGVkCithZGRyZXNzLCBhbmQgZG9uJ3Qgc2VhcmNoIGZvciBvbmUgdG8gZGVsZXRlIHdoZW4gcmVtb3ZpbmcgdGhlIGFkZHJlc3MuIENoYW5naW5nCithbiBhZGRyZXNzIHRvIGFkZCB0aGlzIGZsYWcgd2lsbCByZW1vdmUgdGhlIGF1dG9tYXRpY2FsbHkgYWRkZWQgcHJlZml4IHJvdXRlLAorY2hhbmdpbmcgaXQgdG8gcmVtb3ZlIHRoaXMgZmxhZyB3aWxsIGNyZWF0ZSB0aGUgcHJlZml4IHJvdXRlIGF1dG9tYXRpY2FsbHkuCisKKy5TUyBpcCBhZGRyZXNzIGRlbGV0ZSAtIGRlbGV0ZSBwcm90b2NvbCBhZGRyZXNzCisuQiBBcmd1bWVudHM6Citjb2luY2lkZSB3aXRoIHRoZSBhcmd1bWVudHMgb2YKKy5CIGlwIGFkZHIgYWRkLgorVGhlIGRldmljZSBuYW1lIGlzIGEgcmVxdWlyZWQgYXJndW1lbnQuIFRoZSByZXN0IGFyZSBvcHRpb25hbC4KK0lmIG5vIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sIHRoZSBmaXJzdCBhZGRyZXNzIGlzIGRlbGV0ZWQuCisKKy5TUyBpcCBhZGRyZXNzIHNob3cgLSBsb29rIGF0IHByb3RvY29sIGFkZHJlc3NlcworCisuVFAKKy5CSSBkZXYgIiBJRk5BTUUgIiAoZGVmYXVsdCkKK25hbWUgb2YgZGV2aWNlLgorCisuVFAKKy5CSSBzY29wZSAiIFNDT1BFX1ZBTCIKK29ubHkgbGlzdCBhZGRyZXNzZXMgd2l0aCB0aGlzIHNjb3BlLgorCisuVFAKKy5CSSB0byAiIFBSRUZJWCIKK29ubHkgbGlzdCBhZGRyZXNzZXMgbWF0Y2hpbmcgdGhpcyBwcmVmaXguCisKKy5UUAorLkJJIGxhYmVsICIgUEFUVEVSTiIKK29ubHkgbGlzdCBhZGRyZXNzZXMgd2l0aCBsYWJlbHMgbWF0Y2hpbmcgdGhlCisuSVIgIlBBVFRFUk4iIC4KKy5JIFBBVFRFUk4KK2lzIGEgdXN1YWwgc2hlbGwgc3R5bGUgcGF0dGVybi4KKworLlRQCisuQiB1cAorb25seSBsaXN0IHJ1bm5pbmcgaW50ZXJmYWNlcy4KKworLlRQCisuQlIgZHluYW1pYyAiIGFuZCAiIHBlcm1hbmVudAorKElQdjYgb25seSkgb25seSBsaXN0IGFkZHJlc3NlcyBpbnN0YWxsZWQgZHVlIHRvIHN0YXRlbGVzcworYWRkcmVzcyBjb25maWd1cmF0aW9uIG9yIG9ubHkgbGlzdCBwZXJtYW5lbnQgKG5vdCBkeW5hbWljKQorYWRkcmVzc2VzLgorCisuVFAKKy5CIHRlbnRhdGl2ZQorKElQdjYgb25seSkgb25seSBsaXN0IGFkZHJlc3NlcyB3aGljaCBoYXZlIG5vdCB5ZXQgcGFzc2VkIGR1cGxpY2F0ZQorYWRkcmVzcyBkZXRlY3Rpb24uCisKKy5UUAorLkIgLXRlbnRhdGl2ZQorKElQdjYgb25seSkgb25seSBsaXN0IGFkZHJlc3NlcyB3aGljaCBhcmUgbm90IGluIHRoZSBwcm9jZXNzIG9mCitkdXBsaWNhdGUgYWRkcmVzcyBkZXRlY3Rpb24gY3VycmVudGx5LgorCisuVFAKKy5CIGRlcHJlY2F0ZWQKKyhJUHY2IG9ubHkpIG9ubHkgbGlzdCBkZXByZWNhdGVkIGFkZHJlc3Nlcy4KKworLlRQCisuQiAtZGVwcmVjYXRlZAorKElQdjYgb25seSkgb25seSBsaXN0IGFkZHJlc3NlcyBub3QgYmVpbmcgZGVwcmVjYXRlZC4KKworLlRQCisuQiBkYWRmYWlsZWQKKyhJUHY2IG9ubHkpIG9ubHkgbGlzdCBhZGRyZXNzZXMgd2hpY2ggaGF2ZSBmYWlsZWQgZHVwbGljYXRlCithZGRyZXNzIGRldGVjdGlvbi4KKworLlRQCisuQiAtZGFkZmFpbGVkCisoSVB2NiBvbmx5KSBvbmx5IGxpc3QgYWRkcmVzc2VzIHdoaWNoIGhhdmUgbm90IGZhaWxlZCBkdXBsaWNhdGUKK2FkZHJlc3MgZGV0ZWN0aW9uLgorCisuVFAKKy5CIHRlbXBvcmFyeQorKElQdjYgb25seSkgb25seSBsaXN0IHRlbXBvcmFyeSBhZGRyZXNzZXMuCisKKy5UUAorLkJSIHByaW1hcnkgIiBhbmQgIiBzZWNvbmRhcnkKK29ubHkgbGlzdCBwcmltYXJ5IChvciBzZWNvbmRhcnkpIGFkZHJlc3Nlcy4KKworLlNTIGlwIGFkZHJlc3MgZmx1c2ggLSBmbHVzaCBwcm90b2NvbCBhZGRyZXNzZXMKK1RoaXMgY29tbWFuZCBmbHVzaGVzIHRoZSBwcm90b2NvbCBhZGRyZXNzZXMgc2VsZWN0ZWQgYnkgc29tZSBjcml0ZXJpYS4KKworLlBQCitUaGlzIGNvbW1hbmQgaGFzIHRoZSBzYW1lIGFyZ3VtZW50cyBhcworLkIgc2hvdy4KK1RoZSBkaWZmZXJlbmNlIGlzIHRoYXQgaXQgZG9lcyBub3QgcnVuIHdoZW4gbm8gYXJndW1lbnRzIGFyZSBnaXZlbi4KKworLlBQCisuQiBXYXJuaW5nOgorVGhpcyBjb21tYW5kIGFuZCBvdGhlcgorLkIgZmx1c2gKK2NvbW1hbmRzIGFyZSB1bmZvcmdpdmluZy4gVGhleSB3aWxsIGNydWVsbHkgcHVyZ2UgYWxsIHRoZSBhZGRyZXNzZXMuCisKKy5QUAorV2l0aCB0aGUKKy5CIC1zdGF0aXN0aWNzCitvcHRpb24sIHRoZSBjb21tYW5kIGJlY29tZXMgdmVyYm9zZS4gSXQgcHJpbnRzIG91dCB0aGUgbnVtYmVyIG9mIGRlbGV0ZWQKK2FkZHJlc3NlcyBhbmQgdGhlIG51bWJlciBvZiByb3VuZHMgbWFkZSB0byBmbHVzaCB0aGUgYWRkcmVzcyBsaXN0LgorSWYgdGhpcyBvcHRpb24gaXMgZ2l2ZW4gdHdpY2UsCisuQiBpcCBhZGRyZXNzIGZsdXNoCithbHNvIGR1bXBzIGFsbCB0aGUgZGVsZXRlZCBhZGRyZXNzZXMgaW4gdGhlIGZvcm1hdCBkZXNjcmliZWQgaW4gdGhlCitwcmV2aW91cyBzdWJzZWN0aW9uLgorCisuU0ggIkVYQU1QTEVTIgorLlBQCitpcCBhZGRyZXNzIHNob3cKKy5SUyA0CitTaG93cyBJUHY0IGFuZCBJUHY2IGFkZHJlc3NlcyBhc3NpZ25lZCB0byBhbGwgbmV0d29yayBpbnRlcmZhY2VzLiBUaGUgJ3Nob3cnCitzdWJjb21tYW5kIGNhbiBiZSBvbWl0dGVkLgorLlJFCisuUFAKK2lwIGFkZHJlc3Mgc2hvdyB1cAorLlJTIDQKK1NhbWUgYXMgYWJvdmUgZXhjZXB0IHRoYXQgb25seSBhZGRyZXNzZXMgYXNzaWduZWQgdG8gYWN0aXZlIG5ldHdvcmsgaW50ZXJmYWNlcworYXJlIHNob3duLgorLlJFCisuUFAKK2lwIGFkZHJlc3Mgc2hvdyBkZXYgZXRoMAorLlJTIDQKK1Nob3dzIElQdjQgYW5kIElQdjYgYWRkcmVzc2VzIGFzc2lnbmVkIHRvIG5ldHdvcmsgaW50ZXJmYWNlIGV0aDAuCisuUkUKKy5QUAoraXAgYWRkcmVzcyBhZGQgMjAwMTowZGI4Ojg1YTM6OjAzNzA6NzMzNC82NCBkZXYgZXRoMQorLlJTIDQKK0FkZHMgYW4gSVB2NiBhZGRyZXNzIHRvIG5ldHdvcmsgaW50ZXJmYWNlIGV0aDEuCisuUkUKKy5QUAoraXAgYWRkcmVzcyBkZWxldGUgMjAwMTowZGI4Ojg1YTM6OjAzNzA6NzMzNC82NCBkZXYgZXRoMQorLlJTIDQKK0RlbGV0ZSB0aGUgSVB2NiBhZGRyZXNzIGFkZGVkIGFib3ZlLgorLlJFCisuUFAKK2lwIGFkZHJlc3MgZmx1c2ggZGV2IGV0aDQgc2NvcGUgZ2xvYmFsCisuUlMgNAorUmVtb3ZlcyBhbGwgZ2xvYmFsIElQdjQgYW5kIElQdjYgYWRkcmVzc2VzIGZyb20gZGV2aWNlIGV0aDQuIFdpdGhvdXQgJ3Njb3BlCitnbG9iYWwnIGl0IHdvdWxkIHJlbW92ZSBhbGwgYWRkcmVzc2VzIGluY2x1ZGluZyBJUHY2IGxpbmstbG9jYWwgb25lcy4KKy5SRQorCisuU0ggU0VFIEFMU08KKy5icgorLkJSIGlwICg4KQorCisuU0ggQVVUSE9SCitPcmlnaW5hbCBNYW5wYWdlIGJ5IE1pY2hhaWwgTGl0dmFrIDxtY2lAb3dsLm9wZW53YWxsLmNvbT4KZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L2lwLWFkZHJsYWJlbC44IGIvaXByb3V0ZTIvbWFuL21hbjgvaXAtYWRkcmxhYmVsLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFlZjU3MgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L2lwLWFkZHJsYWJlbC44CkBAIC0wLDAgKzEsNjggQEAKKy5USCBJUFwtQUREUkxBQkVMIDggIjIwIERlYyAyMDExIiAiaXByb3V0ZTIiICJMaW51eCIKKy5TSCAiTkFNRSIKK2lwLWFkZHJsYWJlbCBcLSBwcm90b2NvbCBhZGRyZXNzIGxhYmVsIG1hbmFnZW1lbnQKKy5TSCAiU1lOT1BTSVMiCisuc3AKKy5hZCBsCisuaW4gKzgKKy50aSAtOAorLkIgaXAKKy5SSSAiWyAiIE9QVElPTlMgIiBdIgorLkIgYWRkcmxhYmVsCisuUkkgIiB7ICIgQ09NTUFORCAiIHwgIgorLkJSIGhlbHAgIiB9IgorLnNwCisKKy50aSAtOAorLklSIE9QVElPTlMgIiA6PSB7ICIKK1xmQlwtVlxmUltcZkllcnNpb25cZlJdIHwKK1xmQlwtc1xmUltcZkl0YXRpc3RpY3NcZlJdIHwKK1xmQlwtclxmUltcZkllc29sdmVcZlJdIHwKK1xmQlwtZlxmUltcZklhbWlseVxmUl0geworLkJSIGluZXQgIiB8ICIgaW5ldDYgIiB8ICIgaXB4ICIgfCAiIGRuZXQgIiB8ICIgbGluayAiIH0gfCAiCitcZkJcLW9cZlJbXGZJbmVsaW5lXGZSXSB9CisKKy50aSAtOAorLkJSICJpcCBhZGRybGFiZWwiICIgeyAiIGFkZCAiIHwgIiBkZWwgIiB9ICIgcHJlZml4CisuQlIgUFJFRklYICIgWyAiCisuQiBkZXYKKy5JUiBERVYgIiBdIFsgIgorLkIgbGFiZWwKKy5JUiBOVU1CRVIgIiBdIgorCisudGkgLTgKKy5CUiAiaXAgYWRkcmxhYmVsIiAiIHsgIiBsaXN0ICIgfCAiIGZsdXNoICIgfSIKKworLlNIICJERVNDUklQVElPTiIKK0lQdjYgYWRkcmVzcyBsYWJlbHMgYXJlIHVzZWQgZm9yIGFkZHJlc3Mgc2VsZWN0aW9uOwordGhleSBhcmUgZGVzY3JpYmVkIGluIFJGQyAzNDg0LiBQcmVjZWRlbmNlIGlzIG1hbmFnZWQgYnkgdXNlcnNwYWNlLAorYW5kIG9ubHkgdGhlIGxhYmVsIGl0c2VsZiBpcyBzdG9yZWQgaW4gdGhlIGtlcm5lbC4KKworLlNTIGlwIGFkZHJsYWJlbCBhZGQgLSBhZGQgYW4gYWRkcmVzcyBsYWJlbAorYWRkIGFuIGFkZHJlc3MgbGFiZWwgZW50cnkgdG8gdGhlIGtlcm5lbC4KKy5UUAorLkJJIHByZWZpeCAiIFBSRUZJWCIKKy5UUAorLkJJIGRldiAiIERFViIKK3RoZSBvdXRnb2luZyBpbnRlcmZhY2UuCisuVFAKKy5CSSBsYWJlbCAiIE5VTUJFUiIKK3RoZSBsYWJlbCBmb3IgdGhlIHByZWZpeC4KKzB4ZmZmZmZmZmYgaXMgcmVzZXJ2ZWQuCisuU1MgaXAgYWRkcmxhYmVsIGRlbCAtIGRlbGV0ZSBhbiBhZGRyZXNzIGxhYmVsCitkZWxldGUgYW4gYWRkcmVzcyBsYWJlbCBlbnRyeSBmcm9tIHRoZSBrZXJuZWwuCisuQiBBcmd1bWVudHM6Citjb2luY2lkZSB3aXRoIHRoZSBhcmd1bWVudHMgb2YKKy5CIGlwIGFkZHJsYWJlbCBhZGQKK2J1dCB0aGUgbGFiZWwgaXMgbm90IHJlcXVpcmVkLgorLlNTIGlwIGFkZHJsYWJlbCBsaXN0IC0gbGlzdCBhZGRyZXNzIGxhYmVscworbGlzdCB0aGUgY3VycmVudCBhZGRyZXNzIGxhYmVsIGVudHJpZXMgaW4gdGhlIGtlcm5lbC4KKy5TUyBpcCBhZGRybGFiZWwgZmx1c2ggLSBmbHVzaCBhZGRyZXNzIGxhYmVscworZmx1c2ggYWxsIGFkZHJlc3MgbGFiZWxzIGluIHRoZSBrZXJuZWwuIFRoaXMgZG9lcyBub3QgcmVzdG9yZSBhbnkgZGVmYXVsdCBzZXR0aW5ncy4KKworLlNIIFNFRSBBTFNPCisuYnIKKy5CUiBpcCAoOCkKKworLlNIIEFVVEhPUgorTWFucGFnZSBieSBZb3NoaWZ1amkgSGlkZWFraSAvIOWQieiXpOiLseaYjgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWFuL21hbjgvaXAtZm91LjggYi9pcHJvdXRlMi9tYW4vbWFuOC9pcC1mb3UuOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmEyMmVlCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbWFuL21hbjgvaXAtZm91LjgKQEAgLTAsMCArMSw3NiBAQAorLlRIIElQXC1GT1UgOCAiMiBOb3YgMjAxNCIgImlwcm91dGUyIiAiTGludXgiCisuU0ggIk5BTUUiCitpcC1mb3UgXC0gRm9vLW92ZXItVURQIHJlY2VpdmUgcG9ydCBjb25maWd1cmF0aW9uCisuUAoraXAtZ3VlIFwtIEdlbmVyaWMgVURQIEVuY2Fwc3VsYXRpb24gcmVjZWl2ZSBwb3J0IGNvbmZpZ3VyYXRpb24KKy5TSCAiU1lOT1BTSVMiCisuc3AKKy5hZCBsCisuaW4gKzgKKy50aSAtOAorLkIgaXAKKy5SSSAiWyAiIE9QVElPTlMgIiBdIgorLkIgZm91CisuUkkgIiB7ICIgQ09NTUFORCAiIHwgIgorLkJSIGhlbHAgIiB9IgorLnNwCisudGkgLTgKKy5CUiAiaXAgZm91IGFkZCIKKy5CIHBvcnQKKy5JUiBQT1JUCisuUkIgInsgIgorLkIgZ3VlCisuUkkgInwiCisuQiBpcHByb3RvCisuSVIgUFJPVE8KKy5SQiAiIH0iCisuYnIKKy50aSAtOAorLkJSICJpcCBmb3UgZGVsIgorLkIgcG9ydAorLklSIFBPUlQKKy5TSCBERVNDUklQVElPTgorVGhlCisuQiBpcCBmb3UKK2NvbW1hbmRzIGFyZSB1c2VkIHRvIGNyZWF0ZSBhbmQgZGVsZXRlIHJlY2VpdmUgcG9ydHMgZm9yIEZvby1vdmVyLVVEUAorKEZPVSkgYXMgd2VsbCBhcyBHZW5lcmljIFVEUCBFbmNhcHN1bGF0aW9uIChHVUUpLgorLlBQCitGb28tb3Zlci1VRFAgYWxsb3dzIGVuY2Fwc3VsYXRpbmcgcGFja2V0cyBvZiBhbiBJUCBwcm90b2NvbCBkaXJlY3RseQorb3ZlciBVRFAuIFRoZSByZWNlaXZlciBpbmZlcnMgdGhlIHByb3RvY29sIG9mIGEgcGFja2V0IHJlY2VpdmVkIG9uCithIEZPVSBVRFAgcG9ydCB0byBiZSB0aGUgcHJvdG9jb2wgY29uZmlndXJlZCBmb3IgdGhlIHBvcnQuCisuUFAKK0dlbmVyaWMgVURQIEVuY2Fwc3VsYXRpb24gKEdVRSkgZW5jYXBzdWxhdGVzIHBhY2tldHMgb2YgYW4gSVAgcHJvdG9jb2wKK3dpdGhpbiBVRFAgYW5kIGFuIGVuY2Fwc3VsYXRpb24gaGVhZGVyLiBUaGUgZW5jYXBzdWxhdGlvbiBoZWFkZXIgY29udGFpbnMgdGhlCitJUCBwcm90b2NvbCBudW1iZXIgZm9yIHRoZSBlbmNhcHN1bGF0ZWQgcGFja2V0LgorLlBQCitXaGVuIGNyZWF0aW5nIGEgRk9VIG9yIEdVRSByZWNlaXZlIHBvcnQsIHRoZSBwb3J0IG51bWJlciBpcyBzcGVjaWZpZWQgaW4KKy5JIFBPUlQKK2FyZ3VtZW50LiBJZiBGT1UgaXMgdXNlZCwgdGhlIElQIHByb3RvY29sIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIHBvcnQgaXMgc3BlY2lmaWVkIGluCisuSSBQUk9UTworYXJndW1lbnQuCisuUFAKK0EgRk9VIG9yIEdVRSByZWNlaXZlIHBvcnQgaXMgZGVsZXRlZCBieSBzcGVjaWZ5aW5nCisuSSBQT1JUCitpbiB0aGUgZGVsZXRlIGNvbW1hbmQuCisuU0ggRVhBTVBMRVMKKy5QUAorLlNTIENvbmZpZ3VyZSBhIEZPVSByZWNlaXZlIHBvcnQgZm9yIEdSRSBib3VuZCB0byA3Nzc3CisubmYKKyMgaXAgZm91IGFkZCBwb3J0IDg4ODggaXBwcm90byA0NworLlBQCisuU1MgQ29uZmlndXJlIGEgRk9VIHJlY2VpdmUgcG9ydCBmb3IgSVBJUCBib3VuZCB0byA4ODg4CisubmYKKyMgaXAgZm91IGFkZCBwb3J0IDg4ODggaXBwcm90byA0CisuUFAKKy5TUyBDb25maWd1cmUgYSBHVUUgcmVjZWl2ZSBwb3J0IGJvdW5kIHRvIDk5OTkKKy5uZgorIyBpcCBmb3UgYWRkIHBvcnQgOTk5OSBndWUKKy5QUAorLlNTIERlbGV0ZSB0aGUgR1VFIHJlY2VpdmUgcG9ydCBib3VuZCB0byA5OTk5CisubmYKKyMgaXAgZm91IGRlbCBwb3J0IDk5OTkKKy5TSCBTRUUgQUxTTworLmJyCisuQlIgaXAgKDgpCisuU0ggQVVUSE9SCitUb20gSGVyYmVydCA8dGhlcmJlcnRAZ29vZ2xlLmNvbT4KZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L2lwLWd1ZS44IGIvaXByb3V0ZTIvbWFuL21hbjgvaXAtZ3VlLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQyOTE0YwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L2lwLWd1ZS44CkBAIC0wLDAgKzEgQEAKKy5zbyBtYW44L2lwLWZvdS44CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9tYW4vbWFuOC9pcC1sMnRwLjggYi9pcHJvdXRlMi9tYW4vbWFuOC9pcC1sMnRwLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTczODAzNQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L2lwLWwydHAuOApAQCAtMCwwICsxLDM4OSBAQAorLlRIIElQXC1MMlRQIDggIjE5IEFwciAyMDEyIiAiaXByb3V0ZTIiICJMaW51eCIKKy5TSCAiTkFNRSIKK2lwLWwydHAgLSBMMlRQdjMgc3RhdGljIHVubWFuYWdlZCB0dW5uZWwgY29uZmlndXJhdGlvbgorLlNIICJTWU5PUFNJUyIKKy5zcAorLmFkIGwKKy5pbiArOAorLnRpIC04CisuQiBpcAorLlJJICJbICIgT1BUSU9OUyAiIF0iCisuQiBsMnRwCisuUkkgIiB7ICIgQ09NTUFORCAiIHwgIgorLkJSIGhlbHAgIiB9IgorLnNwCisudGkgLTgKKy5CUiAiaXAgbDJ0cCBhZGQgdHVubmVsIgorLmJyCisuQiByZW1vdGUKKy5SSSAiWyAiIEFERFIgIiBdIgorLkIgbG9jYWwKKy5SSSAiWyAiIEFERFIgIiBdIgorLmJyCisuQiB0dW5uZWxfaWQKKy5JUiBJRAorLkIgcGVlcl90dW5uZWxfaWQKKy5JUiBJRAorLmJyCisuUkIgIlsgIiBlbmNhcCAiIHsgIiBpcCAiIHwgIiB1ZHAgIiB9IF0iCisuYnIKKy5SQiAiWyAiIHVkcF9zcG9ydAorLklSIFBPUlQKKy5SQiAiIF0gWyAiIHVkcF9kcG9ydAorLklSIFBPUlQKKy5SQiAiIF0iCisuYnIKKy50aSAtOAorLkJSICJpcCBsMnRwIGFkZCBzZXNzaW9uIgorLlJCICJbICIgbmFtZQorLklSIE5BTUUKKy5SQiAiIF0iCisuYnIKKy5CIHR1bm5lbF9pZAorLklSIElECisuQiBzZXNzaW9uX2lkCisuSVIgSUQKKy5CIHBlZXJfc2Vzc2lvbl9pZAorLklSIElECisuYnIKKy5SQiAiWyAiIGNvb2tpZQorLklSIEhFWFNUUgorLlJCICIgXSBbICIgcGVlcl9jb29raWUKKy5JUiBIRVhTVFIKKy5SQiAiIF0iCisuYnIKKy5SQiAiWyAiIGwyc3BlY190eXBlICIgeyAiIG5vbmUgIiB8ICIgZGVmYXVsdCAiIH0gXSIKKy5icgorLlJCICJbICIgb2Zmc2V0CisuSVIgT0ZGU0VUCisuUkIgIiBdIFsgIiBwZWVyX29mZnNldAorLklSIE9GRlNFVAorLlJCICIgXSIKKy5icgorLnRpIC04CisuQlIgImlwIGwydHAgZGVsIHR1bm5lbCIKKy5CIHR1bm5lbF9pZAorLklSIElECisuYnIKKy50aSAtOAorLkJSICJpcCBsMnRwIGRlbCBzZXNzaW9uIgorLkIgdHVubmVsX2lkCisuSVIgSUQKKy5CIHNlc3Npb25faWQKKy5JUiBJRAorLmJyCisudGkgLTgKKy5CUiAiaXAgbDJ0cCBzaG93IHR1bm5lbCIKKy5CICJbIiB0dW5uZWxfaWQKKy5JUiBJRAorLkIgIl0iCisuYnIKKy50aSAtOAorLkJSICJpcCBsMnRwIHNob3cgc2Vzc2lvbiIKKy5CICJbIiB0dW5uZWxfaWQKKy5JUiBJRAorLkIgIl0gWyIgc2Vzc2lvbl9pZAorLklSIElECisuQiAiXSIKKy5icgorLnRpIC04CisuSVIgTkFNRSAiIDo9ICIKKy5JUiBTVFJJTkcKKy50aSAtOAorLklSIEFERFIgIiA6PSB7ICIgSVBfQUREUkVTUyAiIH0iCisudGkgLTgKKy5JUiBQT1JUICIgOj0geyAiIE5VTUJFUiAiIH0iCisudGkgLTgKKy5JUiBJRCAiIDo9IHsgIiBOVU1CRVIgIiB9IgorLnRpIC04CisudGkgLTgKKy5JUiBIRVhTVFIgIiA6PSB7IDggb3IgMTYgaGV4IGRpZ2l0cyAoNCAvIDggYnl0ZXMpIH0iCisuU0ggREVTQ1JJUFRJT04KK1RoZQorLkIgaXAgbDJ0cAorY29tbWFuZHMgYXJlIHVzZWQgdG8gZXN0YWJsaXNoIHN0YXRpYywgb3Igc28tY2FsbGVkCisuSSB1bm1hbmFnZWQKK0wyVFB2MyBldGhlcm5ldCB0dW5uZWxzLiBGb3IgdW5tYW5hZ2VkIHR1bm5lbHMsIHRoZXJlIGlzIG5vIEwyVFAKK2NvbnRyb2wgcHJvdG9jb2wgc28gbm8gdXNlcnNwYWNlIGRhZW1vbiBpcyByZXF1aXJlZCAtIHR1bm5lbHMgYXJlCittYW51YWxseSBjcmVhdGVkIGJ5IGlzc3VpbmcgY29tbWFuZHMgYXQgYSBsb2NhbCBzeXN0ZW0gYW5kIGF0IGEgcmVtb3RlCitwZWVyLgorLlBQCitMMlRQdjMgaXMgc3VpdGFibGUgZm9yIExheWVyLTIgdHVubmVsaW5nLiBTdGF0aWMgdHVubmVscyBhcmUgdXNlZnVsCit0byBlc3RhYmxpc2ggbmV0d29yayBsaW5rcyBhY3Jvc3MgSVAgbmV0d29ya3Mgd2hlbiB0aGUgdHVubmVscyBhcmUKK2ZpeGVkLiBMMlRQdjMgdHVubmVscyBjYW4gY2FycnkgZGF0YSBvZiBtb3JlIHRoYW4gb25lIHNlc3Npb24uIEVhY2gKK3Nlc3Npb24gaXMgaWRlbnRpZmllZCBieSBhIHNlc3Npb25faWQgYW5kIGl0cyBwYXJlbnQgdHVubmVsJ3MKK3R1bm5lbF9pZC4gQSB0dW5uZWwgbXVzdCBiZSBjcmVhdGVkIGJlZm9yZSBhIHNlc3Npb24gY2FuIGJlIGNyZWF0ZWQgaW4KK3RoZSB0dW5uZWwuCisuUFAKK1doZW4gY3JlYXRpbmcgYW4gTDJUUCB0dW5uZWwsIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSByZW1vdGUgcGVlciBpcworc3BlY2lmaWVkLCB3aGljaCBjYW4gYmUgZWl0aGVyIGFuIElQdjQgb3IgSVB2NiBhZGRyZXNzLiBUaGUgbG9jYWwgSVAKK2FkZHJlc3MgdG8gYmUgdXNlZCB0byByZWFjaCB0aGUgcGVlciBtdXN0IGFsc28gYmUgc3BlY2lmaWVkLiBUaGlzIGlzCit0aGUgYWRkcmVzcyBvbiB3aGljaCB0aGUgbG9jYWwgc3lzdGVtIHdpbGwgbGlzdGVuIGZvciBhbmQgYWNjZXB0CityZWNlaXZlZCBMMlRQIGRhdGEgcGFja2V0cyBmcm9tIHRoZSBwZWVyLgorLlBQCitMMlRQdjMgZGVmaW5lcyB0d28gcGFja2V0IGVuY2Fwc3VsYXRpb24gZm9ybWF0czogVURQIG9yIElQLiBVRFAKK2VuY2Fwc3VsYXRpb24gaXMgbW9zdCBjb21tb24uIElQIGVuY2Fwc3VsYXRpb24gdXNlcyBhIGRlZGljYXRlZCBJUAorcHJvdG9jb2wgdmFsdWUgdG8gY2FycnkgTDJUUCBkYXRhIHdpdGhvdXQgdGhlIG92ZXJoZWFkIG9mIFVEUC4gVXNlIElQCitlbmNhcHN1bGF0aW9uIG9ubHkgd2hlbiB0aGVyZSBhcmUgbm8gTkFUIGRldmljZXMgb3IgZmlyZXdhbGxzIGluIHRoZQorbmV0d29yayBwYXRoLgorLlBQCitXaGVuIGFuIEwyVFB2MyBldGhlcm5ldCBzZXNzaW9uIGlzIGNyZWF0ZWQsIGEgdmlydHVhbCBuZXR3b3JrCitpbnRlcmZhY2UgaXMgY3JlYXRlZCBmb3IgdGhlIHNlc3Npb24sIHdoaWNoIG11c3QgdGhlbiBiZSBjb25maWd1cmVkCithbmQgYnJvdWdodCB1cCwganVzdCBsaWtlIGFueSBvdGhlciBuZXR3b3JrIGludGVyZmFjZS4gV2hlbiBkYXRhIGlzCitwYXNzZWQgdGhyb3VnaCB0aGUgaW50ZXJmYWNlLCBpdCBpcyBjYXJyaWVkIG92ZXIgdGhlIEwyVFAgdHVubmVsIHRvCit0aGUgcGVlci4gQnkgY29uZmlndXJpbmcgdGhlIHN5c3RlbSdzIHJvdXRpbmcgdGFibGVzIG9yIGFkZGluZyB0aGUKK2ludGVyZmFjZSB0byBhIGJyaWRnZSwgdGhlIEwyVFAgaW50ZXJmYWNlIGlzIGxpa2UgYSB2aXJ0dWFsIHdpcmUKKyhwc2V1ZG93aXJlKSBjb25uZWN0ZWQgdG8gdGhlIHBlZXIuCisuUFAKK0VzdGFibGlzaGluZyBhbiB1bm1hbmFnZWQgTDJUUHYzIGV0aGVybmV0IHBzZXVkb3dpcmUgaW52b2x2ZXMgbWFudWFsbHkKK2NyZWF0aW5nIEwyVFAgY29udGV4dHMgb24gdGhlIGxvY2FsIHN5c3RlbSBhbmQgYXQgdGhlIHBlZXIuIFBhcmFtZXRlcnMKK3VzZWQgYXQgZWFjaCBzaXRlIG11c3QgY29ycmVzcG9uZCBvciBubyBkYXRhIHdpbGwgYmUgcGFzc2VkLiBObworY29uc2lzdGVuY3kgY2hlY2tzIGFyZSBwb3NzaWJsZSBzaW5jZSB0aGVyZSBpcyBubyBjb250cm9sIHByb3RvY29sCit1c2VkIHRvIGVzdGFibGlzaCB1bm1hbmFnZWQgTDJUUCB0dW5uZWxzLiBPbmNlIHRoZSB2aXJ0dWFsIG5ldHdvcmsKK2ludGVyZmFjZSBvZiBhIGdpdmVuIEwyVFAgc2Vzc2lvbiBpcyBjb25maWd1cmVkIGFuZCBlbmFibGVkLCBkYXRhIGNhbgorYmUgdHJhbnNtaXR0ZWQsIGV2ZW4gaWYgdGhlIHBlZXIgaXNuJ3QgeWV0IGNvbmZpZ3VyZWQuIElmIHRoZSBwZWVyCitpc24ndCBjb25maWd1cmVkLCB0aGUgTDJUUCBkYXRhIHBhY2tldHMgd2lsbCBiZSBkaXNjYXJkZWQgYnkKK3RoZSBwZWVyLgorLlBQCitUbyBlc3RhYmxpc2ggYW4gdW5tYW5hZ2VkIEwyVFAgdHVubmVsLCB1c2UKKy5CIGwydHAgYWRkIHR1bm5lbAorYW5kCisuQiBsMnRwIGFkZCBzZXNzaW9uCitjb21tYW5kcyBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gVGhlbiBjb25maWd1cmUgYW5kIGVuYWJsZSB0aGUKK3R1bm5lbCdzIHZpcnR1YWwgbmV0d29yayBpbnRlcmZhY2UsIGFzIHJlcXVpcmVkLgorLlBQCitOb3RlIHRoYXQgdW5tYW5hZ2VkIHR1bm5lbHMgY2Fycnkgb25seSBldGhlcm5ldCBmcmFtZXMuIElmIHlvdSBuZWVkIHRvCitjYXJyeSBQUFAgdHJhZmZpYyAoTDJUUHYyKSBvciB5b3VyIHBlZXIgZG9lc24ndCBzdXBwb3J0IHVubWFuYWdlZAorTDJUUHYzIHR1bm5lbHMsIHlvdSB3aWxsIG5lZWQgYW4gTDJUUCBzZXJ2ZXIgd2hpY2ggaW1wbGVtZW50cyB0aGUgTDJUUAorY29udHJvbCBwcm90b2NvbC4gVGhlIEwyVFAgY29udHJvbCBwcm90b2NvbCBhbGxvd3MgZHluYW1pYyBMMlRQCit0dW5uZWxzIGFuZCBzZXNzaW9ucyB0byBiZSBlc3RhYmxpc2hlZCBhbmQgcHJvdmlkZXMgZm9yIGRldGVjdGluZyBhbmQKK2FjdGluZyB1cG9uIG5ldHdvcmsgZmFpbHVyZXMuCisuU1MgaXAgbDJ0cCBhZGQgdHVubmVsIC0gYWRkIGEgbmV3IHR1bm5lbAorLlRQCisuQkkgbmFtZSAiIE5BTUUgIgorc2V0cyB0aGUgc2Vzc2lvbiBuZXR3b3JrIGludGVyZmFjZSBuYW1lLiBEZWZhdWx0IGlzIGwydHBldGhOLgorLlRQCisuQkkgdHVubmVsX2lkICIgSUQiCitzZXQgdGhlIHR1bm5lbCBpZCwgd2hpY2ggaXMgYSAzMi1iaXQgaW50ZWdlciB2YWx1ZS4gVW5pcXVlbHkKK2lkZW50aWZpZXMgdGhlIHR1bm5lbC4gVGhlIHZhbHVlIHVzZWQgbXVzdCBtYXRjaCB0aGUgcGVlcl90dW5uZWxfaWQKK3ZhbHVlIGJlaW5nIHVzZWQgYXQgdGhlIHBlZXIuCisuVFAKKy5CSSBwZWVyX3R1bm5lbF9pZCAiIElEIgorc2V0IHRoZSBwZWVyIHR1bm5lbCBpZCwgd2hpY2ggaXMgYSAzMi1iaXQgaW50ZWdlciB2YWx1ZSBhc3NpZ25lZCB0bwordGhlIHR1bm5lbCBieSB0aGUgcGVlci4gVGhlIHZhbHVlIHVzZWQgbXVzdCBtYXRjaCB0aGUgdHVubmVsX2lkIHZhbHVlCitiZWluZyB1c2VkIGF0IHRoZSBwZWVyLgorLlRQCisuQkkgcmVtb3RlICIgQUREUiIKK3NldCB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIHBlZXIuIE1heSBiZSBzcGVjaWZpZWQgYXMgYW4gSVB2NAorYWRkcmVzcyBvciBhbiBJUHY2IGFkZHJlc3MuCisuVFAKKy5CSSBsb2NhbCAiIEFERFIiCitzZXQgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIGxvY2FsIGludGVyZmFjZSB0byBiZSB1c2VkIGZvciB0aGUKK3R1bm5lbC4gVGhpcyBhZGRyZXNzIG11c3QgYmUgdGhlIGFkZHJlc3Mgb2YgYSBsb2NhbCBpbnRlcmZhY2UuIE1heSBiZQorc3BlY2lmaWVkIGFzIGFuIElQdjQgYWRkcmVzcyBvciBhbiBJUHY2IGFkZHJlc3MuCisuVFAKKy5CSSBlbmNhcCAiIEVOQ0FQIgorc2V0IHRoZSBlbmNhcHN1bGF0aW9uIHR5cGUgb2YgdGhlIHR1bm5lbC4KKy5icgorVmFsaWQgdmFsdWVzIGZvciBlbmNhcHN1bGF0aW9uIGFyZToKKy5CUiB1ZHAgIiwgIiBpcCAiLiIKKy5UUAorLkJJIHVkcF9zcG9ydCAiIFBPUlQiCitzZXQgdGhlIFVEUCBzb3VyY2UgcG9ydCB0byBiZSB1c2VkIGZvciB0aGUgdHVubmVsLiBNdXN0IGJlIHByZXNlbnQKK3doZW4gdWRwIGVuY2Fwc3VsYXRpb24gaXMgc2VsZWN0ZWQuIElnbm9yZWQgd2hlbiBpcCBlbmNhcHN1bGF0aW9uIGlzCitzZWxlY3RlZC4KKy5UUAorLkJJIHVkcF9kcG9ydCAiIFBPUlQiCitzZXQgdGhlIFVEUCBkZXN0aW5hdGlvbiBwb3J0IHRvIGJlIHVzZWQgZm9yIHRoZSB0dW5uZWwuIE11c3QgYmUKK3ByZXNlbnQgd2hlbiB1ZHAgZW5jYXBzdWxhdGlvbiBpcyBzZWxlY3RlZC4gSWdub3JlZCB3aGVuIGlwCitlbmNhcHN1bGF0aW9uIGlzIHNlbGVjdGVkLgorLlNTIGlwIGwydHAgZGVsIHR1bm5lbCAtIGRlc3Ryb3kgYSB0dW5uZWwKKy5UUAorLkJJIHR1bm5lbF9pZCAiIElEIgorc2V0IHRoZSB0dW5uZWwgaWQgb2YgdGhlIHR1bm5lbCB0byBiZSBkZWxldGVkLiBBbGwgc2Vzc2lvbnMgd2l0aGluIHRoZQordHVubmVsIG11c3QgYmUgZGVsZXRlZCBmaXJzdC4KKy5TUyBpcCBsMnRwIHNob3cgdHVubmVsIC0gc2hvdyBpbmZvcm1hdGlvbiBhYm91dCB0dW5uZWxzCisuVFAKKy5CSSB0dW5uZWxfaWQgIiBJRCIKK3NldCB0aGUgdHVubmVsIGlkIG9mIHRoZSB0dW5uZWwgdG8gYmUgc2hvd24uIElmIG5vdCBzcGVjaWZpZWQsCitpbmZvcm1hdGlvbiBhYm91dCBhbGwgdHVubmVscyBpcyBwcmludGVkLgorLlNTIGlwIGwydHAgYWRkIHNlc3Npb24gLSBhZGQgYSBuZXcgc2Vzc2lvbiB0byBhIHR1bm5lbAorLlRQCisuQkkgbmFtZSAiIE5BTUUgIgorc2V0cyB0aGUgc2Vzc2lvbiBuZXR3b3JrIGludGVyZmFjZSBuYW1lLiBEZWZhdWx0IGlzIGwydHBldGhOLgorLlRQCisuQkkgdHVubmVsX2lkICIgSUQiCitzZXQgdGhlIHR1bm5lbCBpZCwgd2hpY2ggaXMgYSAzMi1iaXQgaW50ZWdlciB2YWx1ZS4gVW5pcXVlbHkKK2lkZW50aWZpZXMgdGhlIHR1bm5lbCBpbnRvIHdoaWNoIHRoZSBzZXNzaW9uIHdpbGwgYmUgY3JlYXRlZC4gVGhlCit0dW5uZWwgbXVzdCBhbHJlYWR5IGV4aXN0LgorLlRQCisuQkkgc2Vzc2lvbl9pZCAiIElEIgorc2V0IHRoZSBzZXNzaW9uIGlkLCB3aGljaCBpcyBhIDMyLWJpdCBpbnRlZ2VyIHZhbHVlLiBVbmlxdWVseQoraWRlbnRpZmllcyB0aGUgc2Vzc2lvbiBiZWluZyBjcmVhdGVkLiBUaGUgdmFsdWUgdXNlZCBtdXN0IG1hdGNoIHRoZQorcGVlcl9zZXNzaW9uX2lkIHZhbHVlIGJlaW5nIHVzZWQgYXQgdGhlIHBlZXIuCisuVFAKKy5CSSBwZWVyX3Nlc3Npb25faWQgIiBJRCIKK3NldCB0aGUgcGVlciBzZXNzaW9uIGlkLCB3aGljaCBpcyBhIDMyLWJpdCBpbnRlZ2VyIHZhbHVlIGFzc2lnbmVkIHRvCit0aGUgc2Vzc2lvbiBieSB0aGUgcGVlci4gVGhlIHZhbHVlIHVzZWQgbXVzdCBtYXRjaCB0aGUgc2Vzc2lvbl9pZAordmFsdWUgYmVpbmcgdXNlZCBhdCB0aGUgcGVlci4KKy5UUAorLkJJIGNvb2tpZSAiIEhFWFNUUiIKK3NldHMgYW4gb3B0aW9uYWwgY29va2llIHZhbHVlIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSBzZXNzaW9uLiBUaGlzIGlzIGEKKzQgb3IgOCBieXRlIHZhbHVlLCBzcGVjaWZpZWQgYXMgOCBvciAxNiBoZXggZGlnaXRzLAorZS5nLiAwMTRkMzYzNmRlYWRiZWVmLiBUaGUgdmFsdWUgbXVzdCBtYXRjaCB0aGUgcGVlcl9jb29raWUgdmFsdWUgc2V0CithdCB0aGUgcGVlci4gVGhlIGNvb2tpZSB2YWx1ZSBpcyBjYXJyaWVkIGluIEwyVFAgZGF0YSBwYWNrZXRzIGFuZCBpcworY2hlY2tlZCBmb3IgZXhwZWN0ZWQgdmFsdWUgYXQgdGhlIHBlZXIuIERlZmF1bHQgaXMgdG8gdXNlIG5vIGNvb2tpZS4KKy5UUAorLkJJIHBlZXJfY29va2llICIgSEVYU1RSIgorc2V0cyBhbiBvcHRpb25hbCBwZWVyIGNvb2tpZSB2YWx1ZSB0byBiZSBhc3NpZ25lZCB0byB0aGUgc2Vzc2lvbi4gVGhpcworaXMgYSA0IG9yIDggYnl0ZSB2YWx1ZSwgc3BlY2lmaWVkIGFzIDggb3IgMTYgaGV4IGRpZ2l0cywKK2UuZy4gMDE0ZDM2MzZkZWFkYmVlZi4gVGhlIHZhbHVlIG11c3QgbWF0Y2ggdGhlIGNvb2tpZSB2YWx1ZSBzZXQgYXQKK3RoZSBwZWVyLiBJdCB0ZWxscyB0aGUgbG9jYWwgc3lzdGVtIHdoYXQgY29va2llIHZhbHVlIHRvIGV4cGVjdCB0bworZmluZCBpbiByZWNlaXZlZCBMMlRQIHBhY2tldHMuIERlZmF1bHQgaXMgdG8gdXNlIG5vIGNvb2tpZS4KKy5UUAorLkJJIGwyc3BlY190eXBlICIgTDJTUEVDVFlQRSIKK3NldCB0aGUgbGF5ZXIyc3BlY2lmaWMgaGVhZGVyIHR5cGUgb2YgdGhlIHNlc3Npb24uCisuYnIKK1ZhbGlkIHZhbHVlcyBhcmU6CisuQlIgbm9uZSAiLCAiIHVkcCAiLiIKKy5UUAorLkJJIG9mZnNldCAiIE9GRlNFVCIKK3NldHMgdGhlIGJ5dGUgb2Zmc2V0IGZyb20gdGhlIEwyVFAgaGVhZGVyIHdoZXJlIHVzZXIgZGF0YSBzdGFydHMgaW4KK3RyYW5zbWl0dGVkIEwyVFAgZGF0YSBwYWNrZXRzLiBUaGlzIGlzIGhhcmRseSBldmVyIHVzZWQuIElmIHNldCwgdGhlCit2YWx1ZSBtdXN0IG1hdGNoIHRoZSBwZWVyX29mZnNldCB2YWx1ZSB1c2VkIGF0IHRoZSBwZWVyLiBEZWZhdWx0IGlzIDAuCisuVFAKKy5CSSBwZWVyX29mZnNldCAiIE9GRlNFVCIKK3NldHMgdGhlIGJ5dGUgb2Zmc2V0IGZyb20gdGhlIEwyVFAgaGVhZGVyIHdoZXJlIHVzZXIgZGF0YSBzdGFydHMgaW4KK3JlY2VpdmVkIEwyVFAgZGF0YSBwYWNrZXRzLiBUaGlzIGlzIGhhcmRseSBldmVyIHVzZWQuIElmIHNldCwgdGhlCit2YWx1ZSBtdXN0IG1hdGNoIHRoZSBvZmZzZXQgdmFsdWUgdXNlZCBhdCB0aGUgcGVlci4gRGVmYXVsdCBpcyAwLgorLlNTIGlwIGwydHAgZGVsIHNlc3Npb24gLSBkZXN0cm95IGEgc2Vzc2lvbgorLlRQCisuQkkgdHVubmVsX2lkICIgSUQiCitzZXQgdGhlIHR1bm5lbCBpZCBpbiB3aGljaCB0aGUgc2Vzc2lvbiB0byBiZSBkZWxldGVkIGlzIGxvY2F0ZWQuCisuVFAKKy5CSSBzZXNzaW9uX2lkICIgSUQiCitzZXQgdGhlIHNlc3Npb24gaWQgb2YgdGhlIHNlc3Npb24gdG8gYmUgZGVsZXRlZC4KKy5TUyBpcCBsMnRwIHNob3cgc2Vzc2lvbiAtIHNob3cgaW5mb3JtYXRpb24gYWJvdXQgc2Vzc2lvbnMKKy5UUAorLkJJIHR1bm5lbF9pZCAiIElEIgorc2V0IHRoZSB0dW5uZWwgaWQgb2YgdGhlIHNlc3Npb24ocykgdG8gYmUgc2hvd24uIElmIG5vdCBzcGVjaWZpZWQsCitpbmZvcm1hdGlvbiBhYm91dCBzZXNzaW9ucyBpbiBhbGwgdHVubmVscyBpcyBwcmludGVkLgorLlRQCisuQkkgc2Vzc2lvbl9pZCAiIElEIgorc2V0IHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uIHRvIGJlIHNob3duLiBJZiBub3Qgc3BlY2lmaWVkLAoraW5mb3JtYXRpb24gYWJvdXQgYWxsIHNlc3Npb25zIGlzIHByaW50ZWQuCisuU0ggRVhBTVBMRVMKKy5QUAorLlNTIFNldHVwIEwyVFAgdHVubmVscyBhbmQgc2Vzc2lvbnMKKy5uZgorc2l0ZS1BOiMgaXAgbDJ0cCBhZGQgdHVubmVsIHR1bm5lbF9pZCAzMDAwIHBlZXJfdHVubmVsX2lkIDQwMDAgXFwKKyAgICAgICAgICAgZW5jYXAgdWRwIGxvY2FsIDEuMi4zLjQgcmVtb3RlIDUuNi43LjggXFwKKyAgICAgICAgICAgdWRwX3Nwb3J0IDUwMDAgdWRwX2Rwb3J0IDYwMDAKK3NpdGUtQTojIGlwIGwydHAgYWRkIHNlc3Npb24gdHVubmVsX2lkIDMwMDAgc2Vzc2lvbl9pZCAxMDAwIFxcCisgICAgICAgICAgIHBlZXJfc2Vzc2lvbl9pZCAyMDAwCisKK3NpdGUtQjojIGlwIGwydHAgYWRkIHR1bm5lbCB0dW5uZWxfaWQgNDAwMCBwZWVyX3R1bm5lbF9pZCAzMDAwIFxcCisgICAgICAgICAgIGVuY2FwIHVkcCBsb2NhbCA1LjYuNy44IHJlbW90ZSAxLjIuMy40IFxcCisgICAgICAgICAgIHVkcF9zcG9ydCA2MDAwIHVkcF9kcG9ydCA1MDAwCitzaXRlLUI6IyBpcCBsMnRwIGFkZCBzZXNzaW9uIHR1bm5lbF9pZCA0MDAwIHNlc3Npb25faWQgMjAwMCBcXAorICAgICAgICAgICBwZWVyX3Nlc3Npb25faWQgMTAwMAorCitzaXRlLUE6IyBpcCBsaW5rIHNldCBsMnRwZXRoMCB1cCBtdHUgMTQ4OAorCitzaXRlLUI6IyBpcCBsaW5rIHNldCBsMnRwZXRoMCB1cCBtdHUgMTQ4OAorLmZpCisuUFAKK05vdGljZSB0aGF0IHRoZSBJUCBhZGRyZXNzZXMsIFVEUCBwb3J0cyBhbmQgdHVubmVsIC8gc2Vzc2lvbiBpZHMgYXJlCittYXRjaGVkIGFuZCByZXZlcnNlZCBhdCBlYWNoIHNpdGUuCisuU1MgQ29uZmlndXJlIGFzIElQIGludGVyZmFjZXMKK1RoZSB0d28gaW50ZXJmYWNlcyBjYW4gYmUgY29uZmlndXJlZCB3aXRoIElQIGFkZHJlc3NlcyBpZiBvbmx5IElQIGRhdGEKK2lzIHRvIGJlIGNhcnJpZWQuIFRoaXMgaXMgcGVyaGFwcyB0aGUgc2ltcGxlc3QgY29uZmlndXJhdGlvbi4KKy5QUAorLm5mCitzaXRlLUE6IyBpcCBhZGRyIGFkZCAxMC40Mi4xLjEgcGVlciAxMC40Mi4xLjIgZGV2IGwydHBldGgwCisKK3NpdGUtQjojIGlwIGFkZHIgYWRkIDEwLjQyLjEuMiBwZWVyIDEwLjQyLjEuMSBkZXYgbDJ0cGV0aDAKKworc2l0ZS1BOiMgcGluZyAxMC40Mi4xLjIKKy5maQorLlBQCitOb3cgdGhlIGxpbmsgc2hvdWxkIGJlIHVzYWJsZS4gQWRkIHN0YXRpYyByb3V0ZXMgYXMgbmVlZGVkIHRvIGhhdmUKK2RhdGEgc2VudCBvdmVyIHRoZSBuZXcgbGluay4KKy5QUAorLlNTIENvbmZpZ3VyZSBhcyBicmlkZ2VkIGludGVyZmFjZXMKK1RvIGNhcnJ5IG5vbi1JUCBkYXRhLCB0aGUgTDJUUCBuZXR3b3JrIGludGVyZmFjZSBpcyBhZGRlZCB0byBhIGJyaWRnZQoraW5zdGVhZCBvZiBiZWluZyBhc3NpZ25lZCBpdHMgb3duIElQIGFkZHJlc3MsIHVzaW5nIHN0YW5kYXJkIExpbnV4Cit1dGlsaXRpZXMuIFNpbmNlIHJhdyBldGhlcm5ldCBmcmFtZXMgYXJlIHRoZW4gY2FycmllZCBpbnNpZGUgdGhlCit0dW5uZWwsIHRoZSBNVFUgb2YgdGhlIEwyVFAgaW50ZXJmYWNlcyBtdXN0IGJlIHNldCB0byBhbGxvdyBzcGFjZSBmb3IKK3Rob3NlIGhlYWRlcnMuCisuUFAKKy5uZgorc2l0ZS1BOiMgaXAgbGluayBzZXQgbDJ0cGV0aDAgdXAgbXR1IDE0NDYKK3NpdGUtQTojIGlwIGxpbmsgYWRkIGJyMCB0eXBlIGJyaWRnZQorc2l0ZS1BOiMgaXAgbGluayBzZXQgbDJ0cGV0aDAgbWFzdGVyIGJyMAorc2l0ZS1BOiMgaXAgbGluayBzZXQgZXRoMCBtYXN0ZXIgYnIwCitzaXRlLUE6IyBpcCBsaW5rIHNldCBicjAgdXAKKy5maQorLlBQCitJZiB5b3UgYXJlIHVzaW5nIFZMQU5zLCBzZXR1cCBhIGJyaWRnZSBwZXIgVkxBTiBhbmQgYnJpZGdlIGVhY2ggVkxBTgorb3ZlciBhIHNlcGFyYXRlIEwyVFAgc2Vzc2lvbi4gRm9yIGV4YW1wbGUsIHRvIGJyaWRnZSBWTEFOIElEIDUgb24gZXRoMQorb3ZlciBhbiBMMlRQIHBzZXVkb3dpcmU6CisuUFAKKy5uZgorc2l0ZS1BOiMgaXAgbGluayBzZXQgbDJ0cGV0aDAgdXAgbXR1IDE0NDYKK3NpdGUtQTojIGlwIGxpbmsgYWRkIGJydmxhbjUgdHlwZSBicmlkZ2UKK3NpdGUtQTojIGlwIGxpbmsgc2V0IGwydHBldGgwLjUgbWFzdGVyIGJydmxhbjUKK3NpdGUtQTojIGlwIGxpbmsgc2V0IGV0aDEuNSBtYXN0ZXIgYnJ2bGFuNQorc2l0ZS1BOiMgaXAgbGluayBzZXQgYnJ2bGFuNSB1cAorLmZpCisuUFAKK0FkZGluZyB0aGUgTDJUUCBpbnRlcmZhY2UgdG8gYSBicmlkZ2UgY2F1c2VzIHRoZSBicmlkZ2UgdG8gZm9yd2FyZAordHJhZmZpYyBvdmVyIHRoZSBMMlRQIHBzZXVkb3dpcmUganVzdCBsaWtlIGl0IGZvcndhcmRzIG92ZXIgYW55IG90aGVyCitpbnRlcmZhY2UuIFRoZSBicmlkZ2UgbGVhcm5zIE1BQyBhZGRyZXNzZXMgb2YgaG9zdHMgYXR0YWNoZWQgdG8gZWFjaAoraW50ZXJmYWNlIGFuZCBpbnRlbGxpZ2VudGx5IGZvcndhcmRzIGZyYW1lcyBmcm9tIG9uZSBicmlkZ2UgcG9ydCB0bworYW5vdGhlci4gSVAgYWRkcmVzc2VzIGFyZSBub3QgYXNzaWduZWQgdG8gdGhlIGwydHBldGhOIGludGVyZmFjZXMuIElmCit0aGUgYnJpZGdlIGlzIGNvcnJlY3RseSBjb25maWd1cmVkIGF0IGJvdGggc2lkZXMgb2YgdGhlIEwyVFAKK3BzZXVkb3dpcmUsIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byByZWFjaCBob3N0cyBpbiB0aGUgcGVlcidzIGJyaWRnZWQKK25ldHdvcmsuCisuUFAKK1doZW4gcmF3IGV0aGVybmV0IGZyYW1lcyBhcmUgYnJpZGdlZCBhY3Jvc3MgYW4gTDJUUCB0dW5uZWwsIGxhcmdlCitmcmFtZXMgbWF5IGJlIGZyYWdtZW50ZWQgYW5kIGZvcndhcmRlZCBhcyBpbmRpdmlkdWFsIElQIGZyYWdtZW50cyB0bwordGhlIHJlY2lwaWVudCwgZGVwZW5kaW5nIG9uIHRoZSBNVFUgb2YgdGhlIHBoeXNpY2FsIGludGVyZmFjZSB1c2VkIGJ5Cit0aGUgdHVubmVsLiBXaGVuIHRoZSBldGhlcm5ldCBmcmFtZXMgY2FycnkgcHJvdG9jb2xzIHdoaWNoIGFyZQorcmVhc3NlbWJsZWQgYnkgdGhlIHJlY2lwaWVudCwgbGlrZSBJUCwgdGhpcyBpc24ndCBhIHByb2JsZW0uIEhvd2V2ZXIsCitzdWNoIGZyYWdtZW50YXRpb24gY2FuIGNhdXNlIHByb2JsZW1zIGZvciBwcm90b2NvbHMgbGlrZSBQUFBvRSB3aGVyZQordGhlIHJlY2lwaWVudCBleHBlY3RzIHRvIHJlY2VpdmUgZXRoZXJuZXQgZnJhbWVzIGV4YWN0bHkgYXMKK3RyYW5zbWl0dGVkLiBJbiBzdWNoIGNhc2VzLCBpdCBpcyBpbXBvcnRhbnQgdGhhdCBmcmFtZXMgbGVhdmluZyB0aGUKK3R1bm5lbCBhcmUgcmVhc3NlbWJsZWQgYmFjayBpbnRvIGEgc2luZ2xlIGZyYW1lIGJlZm9yZSBiZWluZworZm9yd2FyZGVkIG9uLiBUbyBkbyBzbywgZW5hYmxlIG5ldGZpbHRlciBjb25uZWN0aW9uIHRyYWNraW5nCisoY29ubnRyYWNrKSBvciBtYW51YWxseSBsb2FkIHRoZSBMaW51eCBuZXRmaWx0ZXIgZGVmcmFnIG1vZHVsZXMgYXQKK2VhY2ggdHVubmVsIGVuZHBvaW50LgorLlBQCisubmYKK3NpdGUtQTojIG1vZHByb2JlIG5mX2RlZnJhZ19pcHY0CisKK3NpdGUtQjojIG1vZHByb2JlIG5mX2RlZnJhZ19pcHY0CisuZmkKKy5QUAorSWYgTDJUUCBpcyBiZWluZyB1c2VkIG92ZXIgSVB2NiwgdXNlIHRoZSBJUHY2IGRlZnJhZyBtb2R1bGUuCisuU0ggSU5URVJPUEVSQUJJTElUWQorLlBQCitVbm1hbmFnZWQgKHN0YXRpYykgTDJUUHYzIHR1bm5lbHMgYXJlIHN1cHBvcnRlZCBieSBzb21lIG5ldHdvcmsKK2VxdWlwbWVudCBlcXVpcG1lbnQgdmVuZG9ycyBzdWNoIGFzIENpc2NvLgorLlBQCitJbiBMaW51eCwgTDJUUCBIZWxsbyBtZXNzYWdlcyBhcmUgbm90IHN1cHBvcnRlZCBpbiB1bm1hbmFnZWQKK3R1bm5lbHMuIEhlbGxvIG1lc3NhZ2VzIGFyZSB1c2VkIGJ5IEwyVFAgY2xpZW50cyBhbmQgc2VydmVycyB0byBkZXRlY3QKK2xpbmsgZmFpbHVyZXMgaW4gb3JkZXIgdG8gYXV0b21hdGUgdGVhcmluZyBkb3duIGFuZCByZWVzdGFibGlzaGluZworZHluYW1pYyB0dW5uZWxzLiBJZiBhIG5vbi1MaW51eCBwZWVyIHN1cHBvcnRzIEhlbGxvIG1lc3NhZ2VzIGluCit1bm1hbmFnZWQgdHVubmVscywgaXQgbXVzdCBiZSB0dXJuZWQgb2ZmIHRvIGludGVyb3BlcmF0ZSB3aXRoIExpbnV4LgorLlBQCitMaW51eCBkZWZhdWx0cyB0byB1c2UgdGhlIERlZmF1bHQgTGF5ZXIyU3BlY2lmaWNIZWFkZXIgdHlwZSBhcyBkZWZpbmVkCitpbiB0aGUgTDJUUHYzIHByb3RvY29sIHNwZWNpZmljYXRpb24sIFJGQzM5MzEuIFRoaXMgc2V0dGluZyBtdXN0IGJlCitjb25zaXN0ZW50IHdpdGggdGhhdCBjb25maWd1cmVkIGF0IHRoZSBwZWVyLiBTb21lIHZlbmRvcgoraW1wbGVtZW50YXRpb25zIChlLmcuIENpc2NvKSBkZWZhdWx0IHRvIHVzZSBhIExheWVyMlNwZWNpZmljSGVhZGVyCit0eXBlIG9mIE5vbmUuCisuU0ggU0VFIEFMU08KKy5icgorLkJSIGlwICg4KQorLlNIIEFVVEhPUgorSmFtZXMgQ2hhcG1hbiA8amNoYXBtYW5Aa2F0YWxpeC5jb20+CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9tYW4vbWFuOC9pcC1saW5rLjguaW4gYi9pcHJvdXRlMi9tYW4vbWFuOC9pcC1saW5rLjguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzMjM0MwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L2lwLWxpbmsuOC5pbgpAQCAtMCwwICsxLDExODkgQEAKKy5USCBJUFwtTElOSyA4ICIxMyBEZWMgMjAxMiIgImlwcm91dGUyIiAiTGludXgiCisuU0ggIk5BTUUiCitpcC1saW5rIFwtIG5ldHdvcmsgZGV2aWNlIGNvbmZpZ3VyYXRpb24KKy5TSCAiU1lOT1BTSVMiCisuc3AKKy5hZCBsCisuaW4gKzgKKy50aSAtOAorLkIgaXAKKy5SSSAiWyAiIE9QVElPTlMgIiBdIgorLkIgbGluaworLlJJICAiIHsgIiBDT01NQU5EICIgfCAiCisuQlIgaGVscCAiIH0iCisuc3AKKworLnRpIC04CisuSVIgT1BUSU9OUyAiIDo9IHsgIgorXGZCXC1WXGZSW1xmSWVyc2lvblxmUl0gfAorXGZCXC1oXGZSW1xmSXVtYW4tcmVhZGFibGVcZlJdIHwKK1xmQlwtc1xmUltcZkl0YXRpc3RpY3NcZlJdIHwKK1xmQlwtclxmUltcZkllc29sdmVcZlJdIHwKK1xmQlwtZlxmUltcZklhbWlseVxmUl0geworLkJSIGluZXQgIiB8ICIgaW5ldDYgIiB8ICIgaXB4ICIgfCAiIGRuZXQgIiB8ICIgbGluayAiIH0gfCAiCitcZkJcLW9cZlJbXGZJbmVsaW5lXGZSXSB8CitcZkJcLWJyXGZSW1xmSWllZlxmUl0gfQorCisudGkgLTgKKy5CSSAiaXAgbGluayBhZGQiCisuUkIgIlsgIiBsaW5rCisuSVIgREVWSUNFICIgXSIKKy5SQiAiWyAiIG5hbWUgIiBdIgorLkkgTkFNRQorLmJyCisuUkIgIlsgIiB0eHF1ZXVlbGVuCisuSVIgUEFDS0VUUyAiIF0iCisuYnIKKy5SQiAiWyAiIGFkZHJlc3MKKy5JUiBMTEFERFIgIiBdIgorLlJCICJbICIgYnJvYWRjYXN0CisuSVIgTExBRERSICIgXSIKKy5icgorLlJCICJbICIgbXR1CisuSVIgTVRVICIgXSIKKy5SQiAiWyAiIGluZGV4CisuSVIgSURYICIgXSIKKy5icgorLlJCICJbICIgbnVtdHhxdWV1ZXMKKy5JUiBRVUVVRV9DT1VOVCAiIF0iCisuUkIgIlsgIiBudW1yeHF1ZXVlcworLklSIFFVRVVFX0NPVU5UICIgXSIKKy5icgorLkJSIHR5cGUgIiBUWVBFIgorLlJJICJbICIgQVJHUyAiIF0iCisKKy50aSAtOAorLklSIFRZUEUgIiA6PSBbICIKKy5CUiBicmlkZ2UgIiB8ICIKKy5CUiBib25kICIgfCAiCisuQlIgY2FuICIgfCAiCisuQlIgZHVtbXkgIiB8ICIKKy5CUiBoc3IgIiB8ICIKKy5CUiBpZmIgIiB8ICIKKy5CUiBpcG9pYiAiIHwiCisuQlIgbWFjdmxhbiAgIiB8ICIKKy5CUiBtYWN2dGFwICAiIHwgIgorLkJSIHZjYW4gIiB8ICIKKy5CUiB2ZXRoICIgfCAiCisuQlIgdmxhbiAiIHwgIgorLkJSIHZ4bGFuICIgfCIKKy5CUiBpcDZ0bmwgIiB8IgorLkJSIGlwaXAgIiB8IgorLkJSIHNpdCAiIHwiCisuQlIgZ3JlICIgfCIKKy5CUiBncmV0YXAgIiB8IgorLkJSIGlwNmdyZSAiIHwiCisuQlIgaXA2Z3JldGFwICIgfCIKKy5CUiB2dGkgIiB8IgorLkJSIG5sbW9uICIgfCIKKy5CUiBpcHZsYW4gIiB8IgorLkJSIGxvd3BhbiAiIHwiCisuQlIgZ2VuZXZlICIgXSIKKworLnRpIC04CisuQlIgImlwIGxpbmsgZGVsZXRlICIgeworLklSIERFVklDRSAiIHwgIgorLkJJICJncm91cCAiIEdST1VQCit9CisuQkkgdHlwZSAiIFRZUEUiCisuUkkgIlsgIiBBUkdTICIgXSIKKworLnRpIC04CisuQlIgImlwIGxpbmsgc2V0ICIgeworLklSIERFVklDRSAiIHwgIgorLkJJICJncm91cCAiIEdST1VQCisuUkIgIn0geyAiIHVwICIgfCAiIGRvd24gIiB8ICIgYXJwICIgeyAiIG9uICIgfCAiIG9mZiAiIH0gfCIKKy5icgorLkJSIHByb21pc2MgIiB7ICIgb24gIiB8ICIgb2ZmICIgfSB8IgorLmJyCisuQlIgYWxsbXVsdGljYXN0ICIgeyAiIG9uICIgfCAiIG9mZiAiIH0gfCIKKy5icgorLkJSIGR5bmFtaWMgIiB7ICIgb24gIiB8ICIgb2ZmICIgfSB8IgorLmJyCisuQlIgbXVsdGljYXN0ICIgeyAiIG9uICIgfCAiIG9mZiAiIH0gfCIKKy5icgorLkJSIHByb3RvZG93biAiIHsgIiBvbiAiIHwgIiBvZmYgIiB9IHwiCisuYnIKKy5CICB0eHF1ZXVlbGVuCisuSVIgUEFDS0VUUyAiIHwiCisuYnIKKy5CICBuYW1lCisuSVIgTkVXTkFNRSAiIHwiCisuYnIKKy5CICBhZGRyZXNzCisuSVIgTExBRERSICIgfCIKKy5CICBicm9hZGNhc3QKKy5JUiBMTEFERFIgIiB8IgorLmJyCisuQiAgbXR1CisuSVIgTVRVICIgfCIKKy5icgorLkIgIG5ldG5zCisuSVIgUElEICIgfCIKKy5icgorLkIgIG5ldG5zCisuSVIgTkVUTlNOQU1FICIgfCIKKy5icgorLkIgYWxpYXMKKy5JUiBOQU1FICAiIHwiCisuYnIKKy5CIHZmCisuSVIgTlVNICIgWyIKKy5CICBtYWMKKy5JUiBMTEFERFIgIiBdIFsiCisuQiB2bGFuCisuSVIgVkxBTklEICIgWyAiCisuQiBxb3MKKy5JUiBWTEFOLVFPUyAiIF0gXSBbIgorLkIgcmF0ZQorLklSIFRYUkFURSAiIF0gWyIKKy5CIG1heF90eF9yYXRlCisuSVIgVFhSQVRFICIgXSBbIgorLkIgbWluX3R4X3JhdGUKKy5JUiBUWFJBVEUgIiBdIFsiCisuQiBzcG9vZmNoayB7IG9uIHwgb2ZmIH0gXSBbCisuQiBzdGF0ZSB7IGF1dG8gfCBlbmFibGUgfCBkaXNhYmxlfQorXSB8CisuYnIKKy5CIG1hc3RlcgorLklSIERFVklDRSAiIHwiCisuYnIKKy5CIG5vbWFzdGVyICIgfCIKKy5icgorLkIgYWRkcmdlbm1vZGUgeyBldWk2NCB8IG5vbmUgfCBzdGFibGVfc2VjcmV0IHwgcmFuZG9tIH0KKy5icgorLkIgbGluay1uZXRuc2lkIElECisuQlIgIiB9IgorCisKKy50aSAtOAorLkIgaXAgbGluayBzaG93CisuUkkgIlsgIiBERVZJQ0UgIiB8ICIKKy5CIGdyb3VwCisuSVIgR1JPVVAgIiB8ICIKKy5CUiB1cCAiIHwgIgorLkIgbWFzdGVyCisuSVIgREVWSUNFICIgfCAiCisuQiB0eXBlCisuSVIgVFlQRSAiIF0iCisKKy50aSAtOAorLkIgaXAgbGluayBoZWxwCisuUkkgIlsgIiBUWVBFICIgXSIKKworLlNIICJERVNDUklQVElPTiIKKy5TUyBpcCBsaW5rIGFkZCAtIGFkZCB2aXJ0dWFsIGxpbmsKKworLlRQCisuQkkgbGluayAiIERFVklDRSAiCitzcGVjaWZpZXMgdGhlIHBoeXNpY2FsIGRldmljZSB0byBhY3Qgb3BlcmF0ZSBvbi4KKworLkkgTkFNRQorc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBuZXcgdmlydHVhbCBkZXZpY2UuCisKKy5JIFRZUEUKK3NwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgbmV3IGRldmljZS4KKy5zcAorTGluayB0eXBlczoKKworLmluICs4CisuQiBicmlkZ2UKKy0gRXRoZXJuZXQgQnJpZGdlIGRldmljZQorLnNwCisuQiBib25kCistIEJvbmRpbmcgZGV2aWNlCisuQiBjYW4KKy0gQ29udHJvbGxlciBBcmVhIE5ldHdvcmsgaW50ZXJmYWNlCisuc3AKKy5CIGR1bW15CistIER1bW15IG5ldHdvcmsgaW50ZXJmYWNlCisuc3AKKy5CIGhzcgorLSBIaWdoLWF2YWlsYWJpbGl0eSBTZWFtbGVzcyBSZWR1bmRhbmN5IGRldmljZQorLnNwCisuQiBpZmIKKy0gSW50ZXJtZWRpYXRlIEZ1bmN0aW9uYWwgQmxvY2sgZGV2aWNlCisuc3AKKy5CIGlwb2liCistIElQIG92ZXIgSW5maW5pYmFuZCBkZXZpY2UKKy5zcAorLkIgbWFjdmxhbgorLSBWaXJ0dWFsIGludGVyZmFjZSBiYXNlIG9uIGxpbmsgbGF5ZXIgYWRkcmVzcyAoTUFDKQorLnNwCisuQiBtYWN2dGFwCistIFZpcnR1YWwgaW50ZXJmYWNlIGJhc2VkIG9uIGxpbmsgbGF5ZXIgYWRkcmVzcyAoTUFDKSBhbmQgVEFQLgorLnNwCisuQiB2Y2FuCistIFZpcnR1YWwgQ29udHJvbGxlciBBcmVhIE5ldHdvcmsgaW50ZXJmYWNlCisuc3AKKy5CIHZldGgKKy0gVmlydHVhbCBldGhlcm5ldCBpbnRlcmZhY2UKKy5zcAorLkJSIHZsYW4KKy0gODAyLjFxIHRhZ2dlZCB2aXJ0dWFsIExBTiBpbnRlcmZhY2UKKy5zcAorLkJSIHZ4bGFuCistIFZpcnR1YWwgZVh0ZW5kZWQgTEFOCisuc3AKKy5CUiBpcDZ0bmwKKy0gVmlydHVhbCB0dW5uZWwgaW50ZXJmYWNlIElQdjR8SVB2NiBvdmVyIElQdjYKKy5zcAorLkJSIGlwaXAKKy0gVmlydHVhbCB0dW5uZWwgaW50ZXJmYWNlIElQdjQgb3ZlciBJUHY0Cisuc3AKKy5CUiBzaXQKKy0gVmlydHVhbCB0dW5uZWwgaW50ZXJmYWNlIElQdjYgb3ZlciBJUHY0Cisuc3AKKy5CUiBncmUKKy0gVmlydHVhbCB0dW5uZWwgaW50ZXJmYWNlIEdSRSBvdmVyIElQdjQKKy5zcAorLkJSIGdyZXRhcAorLSBWaXJ0dWFsIEwyIHR1bm5lbCBpbnRlcmZhY2UgR1JFIG92ZXIgSVB2NAorLnNwCisuQlIgaXA2Z3JlCistIFZpcnR1YWwgdHVubmVsIGludGVyZmFjZSBHUkUgb3ZlciBJUHY2Cisuc3AKKy5CUiBpcDZncmV0YXAKKy0gVmlydHVhbCBMMiB0dW5uZWwgaW50ZXJmYWNlIEdSRSBvdmVyIElQdjYKKy5zcAorLkJSIHZ0aQorLSBWaXJ0dWFsIHR1bm5lbCBpbnRlcmZhY2UKKy5zcAorLkJSIG5sbW9uCistIE5ldGxpbmsgbW9uaXRvcmluZyBkZXZpY2UKKy5zcAorLkJSIGlwdmxhbgorLSBJbnRlcmZhY2UgZm9yIEwzIChJUHY2L0lQdjQpIGJhc2VkIFZMQU5zCisuc3AKKy5CUiBsb3dwYW4KKy0gSW50ZXJmYWNlIGZvciA2TG9XUEFOIChJUHY2KSBvdmVyIElFRUUgODAyLjE1LjQgLyBCbHVldG9vdGgKKy5zcAorLkJSIGdlbmV2ZQorLSBHRW5lcmljIE5FdHdvcmsgVmlydHVhbGl6YXRpb24gRW5jYXBzdWxhdGlvbgorLmluIC04CisKKy5UUAorLkJJIG51bXR4cXVldWVzICIgUVVFVUVfQ09VTlQgIgorc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdHJhbnNtaXQgcXVldWVzIGZvciBuZXcgZGV2aWNlLgorCisuVFAKKy5CSSBudW1yeHF1ZXVlcyAiIFFVRVVFX0NPVU5UICIKK3NwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHJlY2VpdmUgcXVldWVzIGZvciBuZXcgZGV2aWNlLgorCisuVFAKKy5CSSBpbmRleCAiIElEWCAiCitzcGVjaWZpZXMgdGhlIGRlc2lyZWQgaW5kZXggb2YgdGhlIG5ldyB2aXJ0dWFsIGRldmljZS4gVGhlIGxpbmsgY3JlYXRpb24gZmFpbHMsIGlmIHRoZSBpbmRleCBpcyBidXN5LgorCisuVFAKK1ZMQU4gVHlwZSBTdXBwb3J0CitGb3IgYSBsaW5rIG9mIHR5cGUKKy5JIFZMQU4KK3RoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHN1cHBvcnRlZDoKKworLkJJICJpcCBsaW5rIGFkZAorLkJJIGxpbmsgIiBERVZJQ0UgIgorLkJJIG5hbWUgIiBOQU1FICIKKy5CSSB0eXBlICIgdmxhbiAiCitbCisuQkkgcHJvdG9jb2wgIiBWTEFOX1BST1RPICIKK10KKy5CSSBpZCAiIFZMQU5JRCAiCitbCisuQlIgcmVvcmRlcl9oZHIgIiB7ICIgb24gIiB8ICIgb2ZmICIgfSAiCitdCitbCisuQlIgZ3ZycCAiIHsgIiBvbiAiIHwgIiBvZmYgIiB9ICIKK10KK1sKKy5CUiBtdnJwICIgeyAiIG9uICIgfCAiIG9mZiAiIH0gIgorXQorWworLkJSIGxvb3NlX2JpbmRpbmcgIiB7ICIgb24gIiB8ICIgb2ZmICIgfSAiCitdCitbCisuQkkgaW5ncmVzcy1xb3MtbWFwICIgUU9TLU1BUCAiCitdCitbCisuQkkgZWdyZXNzLXFvcy1tYXAgIiBRT1MtTUFQICIKK10KKworLmluICs4Cisuc3AKKy5CSSBwcm90b2NvbCAiIFZMQU5fUFJPVE8gIgorLSBlaXRoZXIgODAyLjFRIG9yIDgwMi4xYWQuCisKKy5CSSBpZCAiIFZMQU5JRCAiCistIHNwZWNpZmllcyB0aGUgVkxBTiBJZGVudGlmZXIgdG8gdXNlLiBOb3RlIHRoYXQgbnVtYmVycyB3aXRoIGEgbGVhZGluZyAiIDAgIiBvciAiIDB4ICIgYXJlIGludGVycHJldGVkIGFzIG9jdGFsIG9yIGhleGFkZWltYWwsIHJlc3BlY3RpdmVseS4KKworLkJSIHJlb3JkZXJfaGRyICIgeyAiIG9uICIgfCAiIG9mZiAiIH0gIgorLSBzcGVjaWZpZXMgd2hldGhlciBldGhlcm5ldCBoZWFkZXJzIGFyZSByZW9yZGVyZWQgb3Igbm90IChkZWZhdWx0IGlzCisuQlIgb24gIikuIgorCisuaW4gKzQKK0lmCisuQlIgcmVvcmRlcl9oZHIgIiBpcyAiIG9uCit0aGVuIFZMQU4gaGVhZGVyIHdpbGwgYmUgbm90IGluc2VydGVkIGltbWVkaWF0ZWx5IGJ1dCBvbmx5IGJlZm9yZSBwYXNzaW5nIHRvIHRoZQorcGh5c2ljYWwgZGV2aWNlIChpZiB0aGlzIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IFZMQU4gb2ZmbG9hZGluZyksIHRoZSBzaW1pbGFyCitvbiB0aGUgUlggZGlyZWN0aW9uIC0gYnkgZGVmYXVsdCB0aGUgcGFja2V0IHdpbGwgYmUgdW50YWdnZWQgYmVmb3JlIGJlaW5nCityZWNlaXZlZCBieSBWTEFOIGRldmljZS4gUmVvcmRlcmluZyBhbGxvd3MgdG8gYWNjZWxlcmF0ZSB0YWdnaW5nIG9uIGVncmVzcyBhbmQKK3RvIGhpZGUgVkxBTiBoZWFkZXIgb24gaW5ncmVzcyBzbyB0aGUgcGFja2V0IGxvb2tzIGxpa2UgcmVndWxhciBFdGhlcm5ldCBwYWNrZXQsCithdCB0aGUgc2FtZSB0aW1lIGl0IG1pZ2h0IGJlIGNvbmZ1c2luZyBmb3IgcGFja2V0IGNhcHR1cmUgYXMgdGhlIFZMQU4gaGVhZGVyCitkb2VzIG5vdCBleGlzdCB3aXRoaW4gdGhlIHBhY2tldC4KKworVkxBTiBvZmZsb2FkaW5nIGNhbiBiZSBjaGVja2VkIGJ5CisuQlIgZXRodG9vbCAiKDgpOiIKKy5pbiArNAorLnNwCisuQiBldGh0b29sIC1rCis8cGh5X2Rldj4gfAorLlJCIGdyZXAgIiB0eC12bGFuLW9mZmxvYWQiCisuc3AKKy5pbiAtNAord2hlcmUgPHBoeV9kZXY+IGlzIHRoZSBwaHlzaWNhbCBkZXZpY2UgdG8gd2hpY2ggVkxBTiBkZXZpY2UgaXMgYm91bmQuCisuaW4gLTQKKworLkJSIGd2cnAgIiB7ICIgb24gIiB8ICIgb2ZmICIgfSAiCistIHNwZWNpZmllcyB3aGV0aGVyIHRoaXMgVkxBTiBzaG91bGQgYmUgcmVnaXN0ZXJlZCB1c2luZyBHQVJQIFZMQU4gUmVnaXN0cmF0aW9uIFByb3RvY29sLgorCisuQlIgbXZycCAiIHsgIiBvbiAiIHwgIiBvZmYgIiB9ICIKKy0gc3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBWTEFOIHNob3VsZCBiZSByZWdpc3RlcmVkIHVzaW5nIE11bHRpcGxlIFZMQU4gUmVnaXN0cmF0aW9uIFByb3RvY29sLgorCisuQlIgbG9vc2VfYmluZGluZyAiIHsgIiBvbiAiIHwgIiBvZmYgIiB9ICIKKy0gc3BlY2lmaWVzIHdoZXRoZXIgdGhlIFZMQU4gZGV2aWNlIHN0YXRlIGlzIGJvdW5kIHRvIHRoZSBwaHlzaWNhbCBkZXZpY2Ugc3RhdGUuCisKKy5CSSBpbmdyZXNzLXFvcy1tYXAgIiBRT1MtTUFQICIKKy0gZGVmaW5lcyBhIG1hcHBpbmcgb2YgVkxBTiBoZWFkZXIgcHJpbyBmaWVsZCB0byB0aGUgTGludXggaW50ZXJuYWwgcGFja2V0Citwcmlvcml0eSBvbiBpbmNvbWluZyBmcmFtZXMuIFRoZSBmb3JtYXQgaXMgRlJPTTpUTyB3aXRoIG11bHRpcGxlIG1hcHBpbmdzCitzZXBhcmF0ZWQgYnkgc3BhY2VzLgorCisuQkkgZWdyZXNzLXFvcy1tYXAgIiBRT1MtTUFQICIKKy0gZGVmaW5lcyBhIG1hcHBpbmcgb2YgTGludXggaW50ZXJuYWwgcGFja2V0IHByaW9yaXR5IHRvIFZMQU4gaGVhZGVyIHByaW8gZmllbGQKK2J1dCBmb3Igb3V0Z29pbmcgZnJhbWVzLiBUaGUgZm9ybWF0IGlzIHRoZSBzYW1lIGFzIGZvciBpbmdyZXNzLXFvcy1tYXAuCisuaW4gKzQKKworTGludXggcGFja2V0IHByaW9yaXR5IGNhbiBiZSBzZXQgYnkKKy5CUiBpcHRhYmxlcyAiKDgpIjoKKy5pbiArNAorLnNwCisuQiBpcHRhYmxlcworLXQgbWFuZ2xlIC1BIFBPU1RST1VUSU5HIFsuLi5dIC1qIENMQVNTSUZZIC0tc2V0LWNsYXNzIDA6NAorLnNwCisuaW4gLTQKK2FuZCB0aGlzICI0IiBwcmlvcml0eSBjYW4gYmUgdXNlZCBpbiB0aGUgZWdyZXNzIHFvcyBtYXBwaW5nIHRvIHNldCBWTEFOIHByaW8gIjUiOgorLnNwCisuaW4gKzQKKy5CIGlwCitsaW5rIHNldCB2ZXRoMC4xMCB0eXBlIHZsYW4gZWdyZXNzIDQ6NQorLmluIC00CisuaW4gLTQKKy5pbiAtOAorCisuVFAKK1ZYTEFOIFR5cGUgU3VwcG9ydAorRm9yIGEgbGluayBvZiB0eXBlCisuSSBWWExBTgordGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgc3VwcG9ydGVkOgorCisuQkkgImlwIGxpbmsgYWRkICIgREVWSUNFCisuQkkgdHlwZSAiIHZ4bGFuICIgaWQgIiBJRCIKK1sKKy5CSSBkZXYgIiBQSFlTX0RFViAiCisuUkIgIiBdIFsgeyAiIGdyb3VwICIgfCAiIHJlbW90ZSAiIH0gIgorLkkgSVBBRERSCitdIFsKKy5CIGxvY2FsCisuUkkgInsgIklQQUREUiAiIHwgImFueSAiIH0gIgorXSBbCisuQkkgdHRsICIgVFRMICIKK10gWworLkJJIHRvcyAiIFRPUyAiCitdIFsKKy5CSSBkc3Rwb3J0ICIgUE9SVCAiCitdIFsKKy5CSSBzcmNwb3J0ICIgTUlOIE1BWCAiCitdIFsKKy5JICJbbm9dbGVhcm5pbmcgIgorXSBbCisuSSAiW25vXXByb3h5ICIKK10gWworLkkgIltub11yc2MgIgorXSBbCisuSSAiW25vXWwybWlzcyAiCitdIFsKKy5JICJbbm9dbDNtaXNzICIKK10gWworLkkgIltub111ZHBjc3VtICIKK10gWworLkkgIltub111ZHA2emVyb2NzdW10eCAiCitdIFsKKy5JICJbbm9ddWRwNnplcm9jc3VtcnggIgorXSBbCisuQkkgYWdlaW5nICIgU0VDT05EUyAiCitdIFsKKy5CSSBtYXhhZGRyZXNzICIgTlVNQkVSICIKK10gWworLkIgZ2JwCitdCisKKy5pbiArOAorLnNwCisuQkkgIGlkICIgVk5JICIKKy0gc3BlY2lmaWVzIHRoZSBWWExBTiBOZXR3b3JrIElkZW50aWZlciAob3IgVlhMQU4gU2VnbWVudAorSWRlbnRpZmllcikgdG8gdXNlLgorCisuQkkgZGV2ICIgUEhZU19ERVYiCistIHNwZWNpZmllcyB0aGUgcGh5c2ljYWwgZGV2aWNlIHRvIHVzZSBmb3IgdHVubmVsIGVuZHBvaW50IGNvbW11bmljYXRpb24uCisKKy5zcAorLkJJIGdyb3VwICIgSVBBRERSIgorLSBzcGVjaWZpZXMgdGhlIG11bHRpY2FzdCBJUCBhZGRyZXNzIHRvIGpvaW4uCitUaGlzIHBhcmFtZXRlciBjYW5ub3QgYmUgc3BlY2lmaWVkIHdpdGggdGhlCisuQiByZW1vdGUKK3BhcmFtZXRlci4KKworLnNwCisuQkkgcmVtb3RlICIgSVBBRERSIgorLSBzcGVjaWZpZXMgdGhlIHVuaWNhc3QgZGVzdGluYXRpb24gSVAgYWRkcmVzcyB0byB1c2UgaW4gb3V0Z29pbmcgcGFja2V0cword2hlbiB0aGUgZGVzdGluYXRpb24gbGluayBsYXllciBhZGRyZXNzIGlzIG5vdCBrbm93biBpbiB0aGUgVlhMQU4gZGV2aWNlCitmb3J3YXJkaW5nIGRhdGFiYXNlLiBUaGlzIHBhcmFtZXRlciBjYW5ub3QgYmUgc3BlY2lmaWVkIHdpdGggdGhlCisuQiBncm91cAorcGFyYW1ldGVyLgorCisuc3AKKy5CSSBsb2NhbCAiIElQQUREUiIKKy0gc3BlY2lmaWVzIHRoZSBzb3VyY2UgSVAgYWRkcmVzcyB0byB1c2UgaW4gb3V0Z29pbmcgcGFja2V0cy4KKworLnNwCisuQkkgdHRsICIgVFRMIgorLSBzcGVjaWZpZXMgdGhlIFRUTCB2YWx1ZSB0byB1c2UgaW4gb3V0Z29pbmcgcGFja2V0cy4KKworLnNwCisuQkkgdG9zICIgVE9TIgorLSBzcGVjaWZpZXMgdGhlIFRPUyB2YWx1ZSB0byB1c2UgaW4gb3V0Z29pbmcgcGFja2V0cy4KKworLnNwCisuQkkgZHN0cG9ydCAiIFBPUlQiCistIHNwZWNpZmllcyB0aGUgVURQIGRlc3RpbmF0aW9uIHBvcnQgdG8gY29tbXVuaWNhdGUgdG8gdGhlIHJlbW90ZSBWWExBTiB0dW5uZWwgZW5kcG9pbnQuCisKKy5zcAorLkJJIHNyY3BvcnQgIiBNSU4gTUFYIgorLSBzcGVjaWZpZXMgdGhlIHJhbmdlIG9mIHBvcnQgbnVtYmVycyB0byB1c2UgYXMgVURQCitzb3VyY2UgcG9ydHMgdG8gY29tbXVuaWNhdGUgdG8gdGhlIHJlbW90ZSBWWExBTiB0dW5uZWwgZW5kcG9pbnQuCisKKy5zcAorLkkgW25vXWxlYXJuaW5nCistIHNwZWNpZmllcyBpZiB1bmtub3duIHNvdXJjZSBsaW5rIGxheWVyIGFkZHJlc3NlcyBhbmQgSVAgYWRkcmVzc2VzCithcmUgZW50ZXJlZCBpbnRvIHRoZSBWWExBTiBkZXZpY2UgZm9yd2FyZGluZyBkYXRhYmFzZS4KKworLnNwCisuSSBbbm9dcnNjCistIHNwZWNpZmllcyBpZiByb3V0ZSBzaG9ydCBjaXJjdWl0IGlzIHR1cm5lZCBvbi4KKworLnNwCisuSSBbbm9dcHJveHkKKy0gc3BlY2lmaWVzIEFSUCBwcm94eSBpcyB0dXJuZWQgb24uCisKKy5zcAorLkkgW25vXWwybWlzcworLSBzcGVjaWZpZXMgaWYgbmV0bGluayBMTEFERFIgbWlzcyBub3RpZmljYXRpb25zIGFyZSBnZW5lcmF0ZWQuCisKKy5zcAorLkkgW25vXWwzbWlzcworLSBzcGVjaWZpZXMgaWYgbmV0bGluayBJUCBBRERSIG1pc3Mgbm90aWZpY2F0aW9ucyBhcmUgZ2VuZXJhdGVkLgorCisuc3AKKy5JIFtub111ZHBjc3VtCistIHNwZWNpZmllcyBpZiBVRFAgY2hlY2tzdW0gaXMgZmlsbGVkIGluCisKKy5zcAorLkkgW25vXXVkcDZ6ZXJvY3N1bXR4CistIHNwZWNpZmllcyBpZiBVRFAgY2hlY2tzdW0gaXMgZmlsbGVkIGluCisKKy5zcAorLkkgW25vXXVkcDZ6ZXJvY3N1bXJ4CistIHNwZWNpZmllcyBpZiBVRFAgY2hlY2tzdW0gaXMgcmVjZWl2ZWQKKworLnNwCisuQkkgYWdlaW5nICIgU0VDT05EUyIKKy0gc3BlY2lmaWVzIHRoZSBsaWZldGltZSBpbiBzZWNvbmRzIG9mIEZEQiBlbnRyaWVzIGxlYXJudCBieSB0aGUga2VybmVsLgorCisuc3AKKy5CSSBtYXhhZGRyZXNzICIgTlVNQkVSIgorLSBzcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIEZEQiBlbnRyaWVzLgorCisuc3AKKy5CIGdicAorLSBlbmFibGVzIHRoZSBHcm91cCBQb2xpY3kgZXh0ZW5zaW9uIChWWExBTi1HQlApLgorCisuaW4gKzQKK0FsbG93cyB0byB0cmFuc3BvcnQgZ3JvdXAgcG9saWN5IGNvbnRleHQgYWNyb3NzIFZYTEFOIG5ldHdvcmsgcGVlcnMuCitJZiBlbmFibGVkLCBpbmNsdWRlcyB0aGUgbWFyayBvZiBhIHBhY2tldCBpbiB0aGUgVlhMQU4gaGVhZGVyIGZvciBvdXRnb2luZworcGFja2V0cyBhbmQgZmlsbHMgdGhlIHBhY2tldCBtYXJrIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiBmb3VuZCBpbiB0aGUKK1ZYTEFOIGhlYWRlciBmb3IgaW5jb21taW5nIHBhY2tldHMuCisKK0Zvcm1hdCBvZiB1cHBlciAxNiBiaXRzIG9mIHBhY2tldCBtYXJrIChmbGFncyk7CisKKy5pbiArMgorKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisuYnIKK3wtfC18LXwtfC18LXwtfC18LXxEfC18LXxBfC18LXwtfAorLmJyCisrLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKworLkIgRCA6PQorRG9uJ3QgTGVhcm4gYml0LiBXaGVuIHNldCwgdGhpcyBiaXQgaW5kaWNhdGVzIHRoYXQgdGhlIGVncmVzcworVlRFUCBNVVNUIE5PVCBsZWFybiB0aGUgc291cmNlIGFkZHJlc3Mgb2YgdGhlIGVuY2Fwc3VsYXRlZCBmcmFtZS4KKworLkIgQSA6PQorSW5kaWNhdGVzIHRoYXQgdGhlIGdyb3VwIHBvbGljeSBoYXMgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8KK3RoaXMgcGFja2V0LiBQb2xpY2llcyBNVVNUIE5PVCBiZSBhcHBsaWVkIGJ5IGRldmljZXMgd2hlbiB0aGUgQSBiaXQgaXMgc2V0LgorLmluIC0yCisKK0Zvcm1hdCBvZiBsb3dlciAxNiBiaXRzIG9mIHBhY2tldCBtYXJrIChwb2xpY3kgSUQpOgorCisuaW4gKzIKKystKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworLmJyCit8ICAgICAgICBHcm91cCBQb2xpY3kgSUQgICAgICAgIHwKKy5icgorKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisuaW4gLTIKKworRXhhbXBsZToKKyAgaXB0YWJsZXMgLUEgT1VUUFVUIFsuLi5dIC1qIE1BUksgLS1zZXQtbWFyayAweDgwMEZGCisKKy5pbiAtNAorCisuaW4gLTgKKworLlRQCitHUkUsIElQSVAsIFNJVCBUeXBlIFN1cHBvcnQKK0ZvciBhIGxpbmsgb2YgdHlwZXMKKy5JIEdSRS9JUElQL1NJVAordGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgc3VwcG9ydGVkOgorCisuQkkgImlwIGxpbmsgYWRkICIgREVWSUNFCisuQlIgdHlwZSAiIHsgZ3JlIHwgaXBpcCB8IHNpdCB9ICIKKy5CSSAiIHJlbW90ZSAiIEFERFIgIiBsb2NhbCAiIEFERFIKK1sKKy5CUiBlbmNhcCAiIHsgZm91IHwgZ3VlIHwgbm9uZSB9ICIKK10gWworLkJJICJlbmNhcC1zcG9ydCB7ICIgUE9SVCAiIHwgYXV0byB9ICIKK10gWworLkJJICJlbmNhcC1kcG9ydCAiIFBPUlQKK10gWworLkkgIiBbbm9dZW5jYXAtY3N1bSAiCitdIFsKKy5JICIgW25vXWVuY2FwLXJlbWNzdW0gIgorXQorCisuaW4gKzgKKy5zcAorLkJJICByZW1vdGUgIiBBRERSICIKKy0gc3BlY2lmaWVzIHRoZSByZW1vdGUgYWRkcmVzcyBvZiB0aGUgdHVubmVsLgorCisuc3AKKy5CSSAgbG9jYWwgIiBBRERSICIKKy0gc3BlY2lmaWVzIHRoZSBmaXhlZCBsb2NhbCBhZGRyZXNzIGZvciB0dW5uZWxlZCBwYWNrZXRzLgorSXQgbXVzdCBiZSBhbiBhZGRyZXNzIG9uIGFub3RoZXIgaW50ZXJmYWNlIG9uIHRoaXMgaG9zdC4KKworLnNwCisuQlIgZW5jYXAgIiB7IGZvdSB8IGd1ZSB8IG5vbmUgfSAiCistIHNwZWNpZmllcyB0eXBlIG9mIHNlY29uZGFyeSBVRFAgZW5jYXBzdWxhdGlvbi4gImZvdSIgaW5kaWNhdGVzCitGb28tT3Zlci1VRFAsICJndWUiIGluZGljYXRlcyBHZW5lcmljIFVEUCBFbmNhcHN1bGF0aW9uLgorCisuc3AKKy5CSSAiZW5jYXAtc3BvcnQgeyAiIFBPUlQgIiB8IGF1dG8gfSAiCistIHNwZWNpZmllcyB0aGUgc291cmNlIHBvcnQgaW4gVURQIGVuY2Fwc3VsYXRpb24uCisuSVIgUE9SVAoraW5kaWNhdGVzIHRoZSBwb3J0IGJ5IG51bWJlciwgImF1dG8iCitpbmRpY2F0ZXMgdGhhdCB0aGUgcG9ydCBudW1iZXIgc2hvdWxkIGJlIGNob3NlbiBhdXRvbWF0aWNhbGx5CisodGhlIGtlcm5lbCBwaWNrcyBhIGZsb3cgYmFzZWQgb24gdGhlIGZsb3cgaGFzaCBvZiB0aGUKK2VuY2Fwc3VsYXRlZCBwYWNrZXQpLgorCisuc3AKKy5JIFtub11lbmNhcC1jc3VtCistIHNwZWNpZmllcyBpZiBVRFAgY2hlY2tzdW1zIGFyZSBlbmFibGVkIGluIHRoZSBzZWNvbmRhcnkKK2VuY2Fwc3VsYXRpb24uCisKKy5zcAorLkkgW25vXWVuY2FwLXJlbWNzdW0KKy0gc3BlY2lmaWVzIGlmIFJlbW90ZSBDaGVja3N1bSBPZmZsb2FkIGlzIGVuYWJsZWQuIFRoaXMgaXMgb25seQorYXBwbGljYWJsZSBmb3IgR2VuZXJpYyBVRFAgRW5jYXBzdWxhdGlvbi4KKworLmluIC04CisKKy5UUAorSVA2R1JFL0lQNkdSRVRBUCBUeXBlIFN1cHBvcnQKK0ZvciBhIGxpbmsgb2YgdHlwZQorLkkgSVA2R1JFL0lQNkdSRVRBUAordGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgc3VwcG9ydGVkOgorCisuQkkgImlwIGxpbmsgYWRkICIgREVWSUNFCisuQkkgdHlwZSAiIHsgaXA2Z3JlIHwgaXA2Z3JldGFwIH0gICIgcmVtb3RlICIgQUREUiAiIGxvY2FsICIgQUREUgorWworLkkgIltpfG9dc2VxXSIKK10gWworLkkgIltpfG9da2V5IiBLRVkKK10gWworLkkgIiBbaXxvXWNzdW0gIgorXSBbCisuQkkgaG9wbGltaXQgIiBUVEwgIgorXSBbCisuQkkgZW5jYXBsaW1pdCAiIEVMSU0gIgorXSBbCisuQkkgdGNsYXNzICIgVENMQVNTICIKK10gWworLkJJIGZsb3dsYWJlbCAiIEZMT1dMQUJFTCAiCitdIFsKKy5CSSAiZHNjcCBpbmhlcml0IgorXSBbCisuQkkgZGV2ICIgUEhZU19ERVYgIgorXQorCisuaW4gKzgKKy5zcAorLkJJICByZW1vdGUgIiBBRERSICIKKy0gc3BlY2lmaWVzIHRoZSByZW1vdGUgSVB2NiBhZGRyZXNzIG9mIHRoZSB0dW5uZWwuCisKKy5zcAorLkJJICBsb2NhbCAiIEFERFIgIgorLSBzcGVjaWZpZXMgdGhlIGZpeGVkIGxvY2FsIElQdjYgYWRkcmVzcyBmb3IgdHVubmVsZWQgcGFja2V0cy4KK0l0IG11c3QgYmUgYW4gYWRkcmVzcyBvbiBhbm90aGVyIGludGVyZmFjZSBvbiB0aGlzIGhvc3QuCisKKy5zcAorLkJJICBbaXxvXXNlcQorLSBzZXJpYWxpemUgcGFja2V0cy4KK1RoZQorLkIgb3NlcQorZmxhZyBlbmFibGVzIHNlcXVlbmNpbmcgb2Ygb3V0Z29pbmcgcGFja2V0cy4KK1RoZQorLkIgaXNlcQorZmxhZyByZXF1aXJlcyB0aGF0IGFsbCBpbnB1dCBwYWNrZXRzIGFyZSBzZXJpYWxpemVkLgorCisuc3AKKy5CSSAgW2l8b11rZXkgIiBLRVkiCistIHVzZSBrZXllZCBHUkUgd2l0aCBrZXkKKy5JUiBLRVkgIi4gIktFWQoraXMgZWl0aGVyIGEgbnVtYmVyIG9yIGFuIElQdjQgYWRkcmVzcy1saWtlIGRvdHRlZCBxdWFkLgorVGhlCisuQiBrZXkKK3BhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHNhbWUga2V5IHRvIHVzZSBpbiBib3RoIGRpcmVjdGlvbnMuCitUaGUKKy5CUiBpa2V5ICIgYW5kICIgb2tleQorcGFyYW1ldGVycyBzcGVjaWZ5IGRpZmZlcmVudCBrZXlzIGZvciBpbnB1dCBhbmQgb3V0cHV0LgorCisuc3AKKy5CSSAgW2l8b11jc3VtCistIGdlbmVyYXRlL3JlcXVpcmUgY2hlY2tzdW1zIGZvciB0dW5uZWxlZCBwYWNrZXRzLgorVGhlCisuQiBvY3N1bQorZmxhZyBjYWxjdWxhdGVzIGNoZWNrc3VtcyBmb3Igb3V0Z29pbmcgcGFja2V0cy4KK1RoZQorLkIgaWNzdW0KK2ZsYWcgcmVxdWlyZXMgdGhhdCBhbGwgaW5wdXQgcGFja2V0cyBoYXZlIHRoZSBjb3JyZWN0CitjaGVja3N1bS4gVGhlCisuQiBjc3VtCitmbGFnIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGNvbWJpbmF0aW9uCisuQlIgImljc3VtIG9jc3VtIiAuCisKKy5zcAorLkJJICBob3BsaW1pdCAiIFRUTCIKKy0gc3BlY2lmaWVzIEhvcCBMaW1pdCB2YWx1ZSB0byB1c2UgaW4gb3V0Z29pbmcgcGFja2V0cy4KKworLnNwCisuQkkgIGVuY2FwbGltaXQgIiBFTElNIgorLSBzcGVjaWZpZXMgYSBmaXhlZCBlbmNhcHN1bGF0aW9uIGxpbWl0LiBEZWZhdWx0IGlzIDQuCisKKy5zcAorLkJJICBmbG93bGFiZWwgIiBGTE9XTEFCRUwiCistIHNwZWNpZmllcyBhIGZpeGVkIGZsb3dsYWJlbC4KKworLnNwCisuQkkgIHRjbGFzcyAiIFRDTEFTUyIKKy0gc3BlY2lmaWVzIHRoZSB0cmFmZmljIGNsYXNzIGZpZWxkIG9uCit0dW5uZWxlZCBwYWNrZXRzLCB3aGljaCBjYW4gYmUgc3BlY2lmaWVkIGFzIGVpdGhlciBhIHR3by1kaWdpdAoraGV4IHZhbHVlIChlLmcuIGMwKSBvciBhIHByZWRlZmluZWQgc3RyaW5nIChlLmcuIGludGVybmV0KS4KK1RoZSB2YWx1ZQorLkIgaW5oZXJpdAorY2F1c2VzIHRoZSBmaWVsZCB0byBiZSBjb3BpZWQgZnJvbSB0aGUgb3JpZ2luYWwgSVAgaGVhZGVyLiBUaGUKK3ZhbHVlcworLkJJICJpbmhlcml0LyIgU1RSSU5HCitvcgorLkJJICJpbmhlcml0LyIgMDAgIi4uIiBmZgord2lsbCBzZXQgdGhlIGZpZWxkIHRvCisuSSBTVFJJTkcKK29yCisuSVIgMDAgIi4uIiBmZgord2hlbiB0dW5uZWxpbmcgbm9uLUlQIHBhY2tldHMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDAwLgorCisuaW4gLTgKKworLlRQCitJUG9JQiBUeXBlIFN1cHBvcnQKK0ZvciBhIGxpbmsgb2YgdHlwZQorLkkgSVBvSUIKK3RoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHN1cHBvcnRlZDoKKworLkJJICJpcCBsaW5rIGFkZCAiIERFVklDRSAiIG5hbWUgIiBOQU1FCisuQkkgdHlwZSAiIGlwb2liIFsgIiBwa2V5ICIgUEtFWSBdIFsiIG1vZGUgIiBNT0RFICIgXQorCisuaW4gKzgKKy5zcAorLkJJICBwa2V5ICIgUEtFWSAiCistIHNwZWNpZmllcyB0aGUgSUIgUC1LZXkgdG8gdXNlLgorCisuQkkgIG1vZGUgIiBNT0RFICIKKy0gc3BlY2lmaWVzIHRoZSBtb2RlIChkYXRhZ3JhbSBvciBjb25uZWN0ZWQpIHRvIHVzZS4KKworLlRQCitHRU5FVkUgVHlwZSBTdXBwb3J0CitGb3IgYSBsaW5rIG9mIHR5cGUKKy5JIEdFTkVWRQordGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgc3VwcG9ydGVkOgorCisuQkkgImlwIGxpbmsgYWRkICIgREVWSUNFCisuQkkgdHlwZSAiIGdlbmV2ZSAiIGlkICIgSUQgIiByZW1vdGUgIiBJUEFERFIiCitbCisuQkkgdHRsICIgVFRMICIKK10gWworLkJJIHRvcyAiIFRPUyAiCitdCisKKy5pbiArOAorLnNwCisuQkkgIGlkICIgVk5JICIKKy0gc3BlY2lmaWVzIHRoZSBWaXJ0dWFsIE5ldHdvcmsgSWRlbnRpZmVyIHRvIHVzZS4KKworLnNwCisuQkkgcmVtb3RlICIgSVBBRERSIgorLSBzcGVjaWZpZXMgdGhlIHVuaWNhc3QgZGVzdGluYXRpb24gSVAgYWRkcmVzcyB0byB1c2UgaW4gb3V0Z29pbmcgcGFja2V0cy4KKworLnNwCisuQkkgdHRsICIgVFRMIgorLSBzcGVjaWZpZXMgdGhlIFRUTCB2YWx1ZSB0byB1c2UgaW4gb3V0Z29pbmcgcGFja2V0cy4KKworLnNwCisuQkkgdG9zICIgVE9TIgorLSBzcGVjaWZpZXMgdGhlIFRPUyB2YWx1ZSB0byB1c2UgaW4gb3V0Z29pbmcgcGFja2V0cy4KKworLmluIC04CisKKy5UUAorTUFDVkxBTiBhbmQgTUFDVlRBUCBUeXBlIFN1cHBvcnQKK0ZvciBhIGxpbmsgb2YgdHlwZQorLkkgTUFDVkxBTgorb3IKKy5JIE1BQ1ZUQVAKK3RoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHN1cHBvcnRlZDoKKworLkJJICJpcCBsaW5rIGFkZCBsaW5rICIgREVWSUNFICIgbmFtZSAiIE5BTUUKKy5CUiB0eXBlICIgeyAiIG1hY3ZsYW4gIiB8ICIgbWFjdnRhcCAiIH0gIgorLkJSIG1vZGUgIiB7ICIgcHJpdmF0ZSAiIHwgIiB2ZXBhICIgfCAiIGJyaWRnZSAiIHwgIiBwYXNzdGhydQorLkJSICIgWyAiIG5vcHJvbWlzYyAiIF0gfSAiCisKKy5pbiArOAorLnNwCisuQlIgdHlwZSAiIHsgIiBtYWN2bGFuICIgfCAiIG1hY3Z0YXAgIiB9ICIKKy0gc3BlY2lmaWVzIHRoZSBsaW5rIHR5cGUgdG8gdXNlLgorLkJSIG1hY3ZsYW4gIiBjcmVhdGVzIGp1c3QgYSB2aXJ0dWFsIGludGVyZmFjZSwgd2hpbGUgIgorLkJSIG1hY3Z0YXAgIiBpbiBhZGRpdGlvbiBjcmVhdGVzIGEgY2hhcmFjdGVyIGRldmljZSAiCisuQlIgL2Rldi90YXBYICIgdG8gYmUgdXNlZCBqdXN0IGxpa2UgYSAiIHR1bnRhcCAiIGRldmljZS4iCisKKy5CIG1vZGUgcHJpdmF0ZQorLSBEbyBub3QgYWxsb3cgY29tbXVuaWNhdGlvbiBiZXR3ZWVuCisuQiBtYWN2bGFuCitpbnN0YW5jZXMgb24gdGhlIHNhbWUgcGh5c2ljYWwgaW50ZXJmYWNlLCBldmVuIGlmIHRoZSBleHRlcm5hbCBzd2l0Y2ggc3VwcG9ydHMKK2hhaXJwaW4gbW9kZS4KKworLkIgbW9kZSB2ZXBhCistIFZpcnR1YWwgRXRoZXJuZXQgUG9ydCBBZ2dyZWdhdG9yIG1vZGUuIERhdGEgZnJvbSBvbmUKKy5CIG1hY3ZsYW4KK2luc3RhbmNlIHRvIHRoZSBvdGhlciBvbiB0aGUgc2FtZSBwaHlzaWNhbCBpbnRlcmZhY2UgaXMgdHJhbnNtaXR0ZWQgb3ZlciB0aGUKK3BoeXNpY2FsIGludGVyZmFjZS4gRWl0aGVyIHRoZSBhdHRhY2hlZCBzd2l0Y2ggbmVlZHMgdG8gc3VwcG9ydCBoYWlycGluIG1vZGUsCitvciB0aGVyZSBtdXN0IGJlIGEgVENQL0lQIHJvdXRlciBmb3J3YXJkaW5nIHRoZSBwYWNrZXRzIGluIG9yZGVyIHRvIGFsbG93Citjb21tdW5pY2F0aW9uLiBUaGlzIGlzIHRoZSBkZWZhdWx0IG1vZGUuCisKKy5CIG1vZGUgYnJpZGdlCistIEluIGJyaWRnZSBtb2RlLCBhbGwgZW5kcG9pbnRzIGFyZSBkaXJlY3RseSBjb25uZWN0ZWQgdG8gZWFjaCBvdGhlciwKK2NvbW11bmljYXRpb24gaXMgbm90IHJlZGlyZWN0ZWQgdGhyb3VnaCB0aGUgcGh5c2ljYWwgaW50ZXJmYWNlJ3MgcGVlci4KKworLkJSIG1vZGUgIiAiIHBhc3N0aHJ1ICIgWyAiIG5vcHJvbWlzYyAiIF0gIgorLSBUaGlzIG1vZGUgZ2l2ZXMgbW9yZSBwb3dlciB0byBhIHNpbmdsZSBlbmRwb2ludCwgdXN1YWxseSBpbgorLkJSIG1hY3Z0YXAgIiBtb2RlLiBJdCBpcyBub3QgYWxsb3dlZCBmb3IgbW9yZSB0aGFuIG9uZSBlbmRwb2ludCBvbiB0aGUgc2FtZSAiCitwaHlzaWNhbCBpbnRlcmZhY2UuIEFsbCB0cmFmZmljIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoaXMgZW5kcG9pbnQsIGFsbG93aW5nCit2aXJ0aW8gZ3Vlc3RzIHRvIGNoYW5nZSBNQUMgYWRkcmVzcyBvciBzZXQgcHJvbWlzY3VvdXMgbW9kZSBpbiBvcmRlciB0byBicmlkZ2UKK3RoZSBpbnRlcmZhY2Ugb3IgY3JlYXRlIHZsYW4gaW50ZXJmYWNlcyBvbiB0b3Agb2YgaXQuIEJ5IGRlZmF1bHQsIHRoaXMgbW9kZQorZm9yY2VzIHRoZSB1bmRlcmx5aW5nIGludGVyZmFjZSBpbnRvIHByb21pc2N1b3VzIG1vZGUuIFBhc3NpbmcgdGhlCisuQlIgbm9wcm9taXNjICIgZmxhZyBwcmV2ZW50cyB0aGlzLCBzbyB0aGUgcHJvbWlzYyBmbGFnIG1heSBiZSBjb250cm9sbGVkICIKK3VzaW5nIHN0YW5kYXJkIHRvb2xzLgorLmluIC04CisKKy5TUyBpcCBsaW5rIGRlbGV0ZSAtIGRlbGV0ZSB2aXJ0dWFsIGxpbmsKKworLlRQCisuQkkgZGV2ICIgREVWSUNFICIKK3NwZWNpZmllcyB0aGUgdmlydHVhbCBkZXZpY2UgdG8gYWN0IG9wZXJhdGUgb24uCisKKy5UUAorLkJJIGdyb3VwICIgR1JPVVAgIgorc3BlY2lmaWVzIHRoZSBncm91cCBvZiB2aXJ0dWFsIGxpbmtzIHRvIGRlbGV0ZS4gR3JvdXAgMCBpcyBub3QgYWxsb3dlZCB0byBiZQorZGVsZXRlZCBzaW5jZSBpdCBpcyB0aGUgZGVmYXVsdCBncm91cC4KKworLlRQCisuQkkgdHlwZSAiIFRZUEUgIgorc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBkZXZpY2UuCisKKy5TUyBpcCBsaW5rIHNldCAtIGNoYW5nZSBkZXZpY2UgYXR0cmlidXRlcworCisuVFAKKy5CSSBkZXYgIiBERVZJQ0UgIgorLkkgREVWSUNFCitzcGVjaWZpZXMgbmV0d29yayBkZXZpY2UgdG8gb3BlcmF0ZSBvbi4gV2hlbiBjb25maWd1cmluZyBTUi1JT1YgVmlydHVhbCBGdW5jdGlvbgorKFZGKSBkZXZpY2VzLCB0aGlzIGtleXdvcmQgc2hvdWxkIHNwZWNpZnkgdGhlIGFzc29jaWF0ZWQgUGh5c2ljYWwgRnVuY3Rpb24gKFBGKQorZGV2aWNlLgorCisuVFAKKy5CSSBncm91cCAiIEdST1VQICIKKy5JIEdST1VQCitoYXMgYSBkdWFsIHJvbGU6IElmIGJvdGggZ3JvdXAgYW5kIGRldiBhcmUgcHJlc2VudCwgdGhlbiBtb3ZlIHRoZSBkZXZpY2UgdG8gdGhlCitzcGVjaWZpZWQgZ3JvdXAuIElmIG9ubHkgYSBncm91cCBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIGNvbW1hbmQgb3BlcmF0ZXMgb24KK2FsbCBkZXZpY2VzIGluIHRoYXQgZ3JvdXAuCisKKy5UUAorLkJSIHVwICIgYW5kICIgZG93bgorY2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGUgZGV2aWNlIHRvCisuQiBVUAorb3IKKy5CUiAiRE9XTiIgLgorCisuVFAKKy5CUiAiYXJwIG9uICIgb3IgIiBhcnAgb2ZmIgorY2hhbmdlIHRoZQorLkIgTk9BUlAKK2ZsYWcgb24gdGhlIGRldmljZS4KKworLlRQCisuQlIgIm11bHRpY2FzdCBvbiAiIG9yICIgbXVsdGljYXN0IG9mZiIKK2NoYW5nZSB0aGUKKy5CIE1VTFRJQ0FTVAorZmxhZyBvbiB0aGUgZGV2aWNlLgorCisuVFAKKy5CUiAicHJvdG9kb3duIG9uICIgb3IgIiBwcm90b2Rvd24gb2ZmIgorY2hhbmdlIHRoZQorLkIgUFJPVE9ET1dOCitzdGF0ZSBvbiB0aGUgZGV2aWNlLiBJbmRpY2F0ZXMgdGhhdCBhIHByb3RvY29sIGVycm9yIGhhcyBiZWVuIGRldGVjdGVkIG9uIHRoZSBwb3J0LiBTd2l0Y2ggZHJpdmVycyBjYW4gcmVhY3QgdG8gdGhpcyBlcnJvciBieSBkb2luZyBhIHBoeXMgZG93biBvbiB0aGUgc3dpdGNoIHBvcnQuCisKKy5UUAorLkJSICJkeW5hbWljIG9uICIgb3IgIiBkeW5hbWljIG9mZiIKK2NoYW5nZSB0aGUKKy5CIERZTkFNSUMKK2ZsYWcgb24gdGhlIGRldmljZS4gSW5kaWNhdGVzIHRoYXQgYWRkcmVzcyBjYW4gY2hhbmdlIHdoZW4gaW50ZXJmYWNlIGdvZXMgZG93biAoY3VycmVudGx5CisuQiBOT1QKK3VzZWQgYnkgdGhlIExpbnV4KS4KKworLlRQCisuQkkgbmFtZSAiIE5BTUUiCitjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIGRldmljZS4gVGhpcyBvcGVyYXRpb24gaXMgbm90CityZWNvbW1lbmRlZCBpZiB0aGUgZGV2aWNlIGlzIHJ1bm5pbmcgb3IgaGFzIHNvbWUgYWRkcmVzc2VzCithbHJlYWR5IGNvbmZpZ3VyZWQuCisKKy5UUAorLkJJIHR4cXVldWVsZW4gIiBOVU1CRVIiCisuVFAKKy5CSSB0eHFsZW4gIiBOVU1CRVIiCitjaGFuZ2UgdGhlIHRyYW5zbWl0IHF1ZXVlIGxlbmd0aCBvZiB0aGUgZGV2aWNlLgorCisuVFAKKy5CSSBtdHUgIiBOVU1CRVIiCitjaGFuZ2UgdGhlCisuSSBNVFUKK29mIHRoZSBkZXZpY2UuCisKKy5UUAorLkJJIGFkZHJlc3MgIiBMTEFERFJFU1MiCitjaGFuZ2UgdGhlIHN0YXRpb24gYWRkcmVzcyBvZiB0aGUgaW50ZXJmYWNlLgorCisuVFAKKy5CSSBicm9hZGNhc3QgIiBMTEFERFJFU1MiCisuVFAKKy5CSSBicmQgIiBMTEFERFJFU1MiCisuVFAKKy5CSSBwZWVyICIgTExBRERSRVNTIgorY2hhbmdlIHRoZSBsaW5rIGxheWVyIGJyb2FkY2FzdCBhZGRyZXNzIG9yIHRoZSBwZWVyIGFkZHJlc3Mgd2hlbgordGhlIGludGVyZmFjZSBpcworLklSICJQT0lOVE9QT0lOVCIgLgorCisuVFAKKy5CSSBuZXRucyAiIE5FVE5TTkFNRSAiIFxmUnwgIiBQSUQiCittb3ZlIHRoZSBkZXZpY2UgdG8gdGhlIG5ldHdvcmsgbmFtZXNwYWNlIGFzc29jaWF0ZWQgd2l0aCBuYW1lCisuSVIgIk5FVE5TTkFNRSAiIG9yCisuUkkgcHJvY2VzcyAiIFBJRCIuCisKK1NvbWUgZGV2aWNlcyBhcmUgbm90IGFsbG93ZWQgdG8gY2hhbmdlIG5ldHdvcmsgbmFtZXNwYWNlOiBsb29wYmFjaywgYnJpZGdlLAorcHBwLCB3aXJlbGVzcy4gVGhlc2UgYXJlIG5ldHdvcmsgbmFtZXNwYWNlIGxvY2FsIGRldmljZXMuIEluIHN1Y2ggY2FzZQorLkIgaXAKK3Rvb2wgd2lsbCByZXR1cm4gIkludmFsaWQgYXJndW1lbnQiIGVycm9yLiBJdCBpcyBwb3NzaWJsZSB0byBmaW5kIG91dCBpZiBkZXZpY2UgaXMgbG9jYWwKK3RvIGEgc2luZ2xlIG5ldHdvcmsgbmFtZXNwYWNlIGJ5IGNoZWNraW5nCisuQiBuZXRucy1sb2NhbAorZmxhZyBpbiB0aGUgb3V0cHV0IG9mIHRoZQorLkJSIGV0aHRvb2wgIjoiCisKKy5pbiArOAorLkIgZXRodG9vbCAtaworLkkgREVWSUNFCisuaW4gLTgKKworVG8gY2hhbmdlIG5ldHdvcmsgbmFtZXNwYWNlIGZvciB3aXJlbGVzcyBkZXZpY2VzIHRoZQorLkIgaXcKK3Rvb2wgY2FuIGJlIHVzZWQuIEJ1dCBpdCBhbGxvd3MgdG8gY2hhbmdlIG5ldHdvcmsgbmFtZXNwYWNlIG9ubHkgZm9yIHBoeXNpY2FsIGRldmljZXMgYW5kIGJ5IHByb2Nlc3MKKy5JUiBQSUQgLgorCisuVFAKKy5CSSBhbGlhcyAiIE5BTUUiCitnaXZlIHRoZSBkZXZpY2UgYSBzeW1ib2xpYyBuYW1lIGZvciBlYXN5IHJlZmVyZW5jZS4KKworLlRQCisuQkkgZ3JvdXAgIiBHUk9VUCIKK3NwZWNpZnkgdGhlIGdyb3VwIHRoZSBkZXZpY2UgYmVsb25ncyB0by4KK1RoZSBhdmFpbGFibGUgZ3JvdXBzIGFyZSBsaXN0ZWQgaW4gZmlsZQorLkJSICJAU1lTQ09ORkRJUkAvZ3JvdXAiIC4KKworLlRQCisuQkkgdmYgIiBOVU0iCitzcGVjaWZ5IGEgVmlydHVhbCBGdW5jdGlvbiBkZXZpY2UgdG8gYmUgY29uZmlndXJlZC4gVGhlIGFzc29jaWF0ZWQgUEYgZGV2aWNlCittdXN0IGJlIHNwZWNpZmllZCB1c2luZyB0aGUKKy5CIGRldgorcGFyYW1ldGVyLgorCisuaW4gKzgKKy5CSSBtYWMgIiBMTEFERFJFU1MiCistIGNoYW5nZSB0aGUgc3RhdGlvbiBhZGRyZXNzIGZvciB0aGUgc3BlY2lmaWVkIFZGLiBUaGUKKy5CIHZmCitwYXJhbWV0ZXIgbXVzdCBiZSBzcGVjaWZpZWQuCisKKy5zcAorLkJJIHZsYW4gIiBWTEFOSUQiCistIGNoYW5nZSB0aGUgYXNzaWduZWQgVkxBTiBmb3IgdGhlIHNwZWNpZmllZCBWRi4gV2hlbiBzcGVjaWZpZWQsIGFsbCB0cmFmZmljCitzZW50IGZyb20gdGhlIFZGIHdpbGwgYmUgdGFnZ2VkIHdpdGggdGhlIHNwZWNpZmllZCBWTEFOIElELiBJbmNvbWluZyB0cmFmZmljCit3aWxsIGJlIGZpbHRlcmVkIGZvciB0aGUgc3BlY2lmaWVkIFZMQU4gSUQsIGFuZCB3aWxsIGhhdmUgYWxsIFZMQU4gdGFncworc3RyaXBwZWQgYmVmb3JlIGJlaW5nIHBhc3NlZCB0byB0aGUgVkYuIFNldHRpbmcgdGhpcyBwYXJhbWV0ZXIgdG8gMCBkaXNhYmxlcworVkxBTiB0YWdnaW5nIGFuZCBmaWx0ZXJpbmcuIFRoZQorLkIgdmYKK3BhcmFtZXRlciBtdXN0IGJlIHNwZWNpZmllZC4KKworLnNwCisuQkkgcW9zICIgVkxBTi1RT1MiCistIGFzc2lnbiBWTEFOIFFPUyAocHJpb3JpdHkpIGJpdHMgZm9yIHRoZSBWTEFOIHRhZy4gV2hlbiBzcGVjaWZpZWQsIGFsbCBWTEFOCit0YWdzIHRyYW5zbWl0dGVkIGJ5IHRoZSBWRiB3aWxsIGluY2x1ZGUgdGhlIHNwZWNpZmllZCBwcmlvcml0eSBiaXRzIGluIHRoZQorVkxBTiB0YWcuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSB2YWx1ZSBpcyBhc3N1bWVkIHRvIGJlIDAuIEJvdGggdGhlCisuQiB2ZgorYW5kCisuQiB2bGFuCitwYXJhbWV0ZXJzIG11c3QgYmUgc3BlY2lmaWVkLiBTZXR0aW5nIGJvdGgKKy5CIHZsYW4KK2FuZAorLkIgcW9zCithcyAwIGRpc2FibGVzIFZMQU4gdGFnZ2luZyBhbmQgZmlsdGVyaW5nIGZvciB0aGUgVkYuCisKKy5zcAorLkJJIHJhdGUgIiBUWFJBVEUiCistLSBjaGFuZ2UgdGhlIGFsbG93ZWQgdHJhbnNtaXQgYmFuZHdpZHRoLCBpbiBNYnBzLCBmb3IgdGhlIHNwZWNpZmllZCBWRi4KK1NldHRpbmcgdGhpcyBwYXJhbWV0ZXIgdG8gMCBkaXNhYmxlcyByYXRlIGxpbWl0aW5nLgorLkIgdmYKK3BhcmFtZXRlciBtdXN0IGJlIHNwZWNpZmllZC4KK1BsZWFzZSB1c2UgbmV3IEFQSQorLkIgIm1heF90eF9yYXRlIgorb3B0aW9uIGluc3RlYWQuCisKKy5zcAorLkJJIG1heF90eF9yYXRlICIgVFhSQVRFIgorLSBjaGFuZ2UgdGhlIGFsbG93ZWQgbWF4aW11bSB0cmFuc21pdCBiYW5kd2lkdGgsIGluIE1icHMsIGZvciB0aGUgc3BlY2lmaWVkIFZGLgorLkIgdmYKK3BhcmFtZXRlciBtdXN0IGJlIHNwZWNpZmllZC4KKworLnNwCisuQkkgbWluX3R4X3JhdGUgIiBUWFJBVEUiCistIGNoYW5nZSB0aGUgYWxsb3dlZCBtaW5pbXVtIHRyYW5zbWl0IGJhbmR3aWR0aCwgaW4gTWJwcywgZm9yIHRoZSBzcGVjaWZpZWQgVkYuCitNaW5pbXVtIFRYUkFURSBzaG91bGQgYmUgYWx3YXlzIDw9IE1heGltdW0gVFhSQVRFLgorLkIgdmYKK3BhcmFtZXRlciBtdXN0IGJlIHNwZWNpZmllZC4KKworLnNwCisuQkkgc3Bvb2ZjaGsgIiBvbnxvZmYiCistIHR1cm4gcGFja2V0IHNwb29mIGNoZWNraW5nIG9uIG9yIG9mZiBmb3IgdGhlIHNwZWNpZmllZCBWRi4KKy5zcAorLkJJIHN0YXRlICIgYXV0b3xlbmFibGV8ZGlzYWJsZSIKKy0gc2V0IHRoZSB2aXJ0dWFsIGxpbmsgc3RhdGUgYXMgc2VlbiBieSB0aGUgc3BlY2lmaWVkIFZGLiBTZXR0aW5nIHRvIGF1dG8gbWVhbnMgYQorcmVmbGVjdGlvbiBvZiB0aGUgUEYgbGluayBzdGF0ZSwgZW5hYmxlIGxldHMgdGhlIFZGIHRvIGNvbW11bmljYXRlIHdpdGggb3RoZXIgVkZzIG9uCit0aGlzIGhvc3QgZXZlbiBpZiB0aGUgUEYgbGluayBzdGF0ZSBpcyBkb3duLCBkaXNhYmxlIGNhdXNlcyB0aGUgSFcgdG8gZHJvcCBhbnkgcGFja2V0cworc2VudCBieSB0aGUgVkYuCisuaW4gLTgKKworLlRQCisuQkkgbWFzdGVyICIgREVWSUNFIgorc2V0IG1hc3RlciBkZXZpY2Ugb2YgdGhlIGRldmljZSAoZW5zbGF2ZSBkZXZpY2UpLgorCisuVFAKKy5CSSBub21hc3RlcgordW5zZXQgbWFzdGVyIGRldmljZSBvZiB0aGUgZGV2aWNlIChyZWxlYXNlIGRldmljZSkuCisKKy5UUAorLkJJIGFkZHJnZW5tb2RlICIgZXVpNjR8bm9uZXxzdGFibGVfc2VjcmV0fHJhbmRvbSIKK3NldCB0aGUgSVB2NiBhZGRyZXNzIGdlbmVyYXRpb24gbW9kZQorCisuSSBldWk2NAorLSB1c2UgYSBNb2RpZmllZCBFVUktNjQgZm9ybWF0IGludGVyZmFjZSBpZGVudGlmaWVyCisKKy5JIG5vbmUKKy0gZGlzYWJsZSBhdXRvbWF0aWMgYWRkcmVzcyBnZW5lcmF0aW9uCisKKy5JIHN0YWJsZV9zZWNyZXQKKy0gZ2VuZXJhdGUgdGhlIGludGVyZmFjZSBpZGVudGlmaWVyIGJhc2VkIG9uIGEgcHJlc2V0IC9wcm9jL3N5cy9uZXQvaXB2Ni9jb25mL3tkZWZhdWx0LERFVklDRX0vc3RhYmxlX3NlY3JldAorCisuSSByYW5kb20KKy0gbGlrZSBzdGFibGVfc2VjcmV0LCBidXQgYXV0by1nZW5lcmF0ZSBhIG5ldyByYW5kb20gc2VjcmV0IGlmIG5vbmUgaXMgc2V0CisKKy5UUAorLkJSICJsaW5rLW5ldG5zaWQgIgorc2V0IHBlZXIgbmV0bnNpZCBmb3IgYSBjcm9zcy1uZXRucyBpbnRlcmZhY2UKKworLlBQCisuQiBXYXJuaW5nOgorSWYgbXVsdGlwbGUgcGFyYW1ldGVyIGNoYW5nZXMgYXJlIHJlcXVlc3RlZCwKKy5CIGlwCithYm9ydHMgaW1tZWRpYXRlbHkgYWZ0ZXIgYW55IG9mIHRoZSBjaGFuZ2VzIGhhdmUgZmFpbGVkLgorVGhpcyBpcyB0aGUgb25seSBjYXNlIHdoZW4KKy5CIGlwCitjYW4gbW92ZSB0aGUgc3lzdGVtIHRvIGFuIHVucHJlZGljdGFibGUgc3RhdGUuIFRoZSBzb2x1dGlvbgoraXMgdG8gYXZvaWQgY2hhbmdpbmcgc2V2ZXJhbCBwYXJhbWV0ZXJzIHdpdGggb25lCisuQiBpcCBsaW5rIHNldAorY2FsbC4KKworLlNTICBpcCBsaW5rIHNob3cgLSBkaXNwbGF5IGRldmljZSBhdHRyaWJ1dGVzCisKKy5UUAorLkJJIGRldiAiIE5BTUUgIiAoZGVmYXVsdCkKKy5JIE5BTUUKK3NwZWNpZmllcyB0aGUgbmV0d29yayBkZXZpY2UgdG8gc2hvdy4KK0lmIHRoaXMgYXJndW1lbnQgaXMgb21pdHRlZCBhbGwgZGV2aWNlcyBpbiB0aGUgZGVmYXVsdCBncm91cCBhcmUgbGlzdGVkLgorCisuVFAKKy5CSSBncm91cCAiIEdST1VQICIKKy5JIEdST1VQCitzcGVjaWZpZXMgd2hhdCBncm91cCBvZiBkZXZpY2VzIHRvIHNob3cuCisKKy5UUAorLkIgdXAKK29ubHkgZGlzcGxheSBydW5uaW5nIGludGVyZmFjZXMuCisKKy5UUAorLkJJIG1hc3RlciAiIERFVklDRSAiCisuSSBERVZJQ0UKK3NwZWNpZmllcyB0aGUgbWFzdGVyIGRldmljZSB3aGljaCBlbnNsYXZlcyBkZXZpY2VzIHRvIHNob3cuCisKKy5UUAorLkJJIHR5cGUgIiBUWVBFICIKKy5JIFRZUEUKK3NwZWNpZmllcyB0aGUgdHlwZSBvZiBkZXZpY2VzIHRvIHNob3cuCisKKy5UUAorVGhlIHNob3cgY29tbWFuZCBoYXMgYWRkaXRpb25hbCBmb3JtYXR0aW5nIG9wdGlvbnM6CisKKy5SUworLlRQCisuQlIgIlwtcyIgLCAiIFwtc3RhdHMiLCAiIFwtc3RhdGlzdGljcyIKK291dHB1dCBtb3JlIHN0YXRpc3RpY3MgYWJvdXQgcGFja2V0IHVzYWdlLgorCisuVFAKKy5CUiAiXC1kIiwgIiBcLWRldGFpbHMiCitvdXRwdXQgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbi4KKworLlRQCisuQlIgIlwtaCIsICIgXC1odW1hbiIsICIgXC1odW1hbi1yZWFkYWJsZSIKK291dHB1dCBzdGF0aXN0aWNzIHdpdGggaHVtYW4gcmVhZGFibGUgdmFsdWVzIG51bWJlciBmb2xsb3dlZCBieSBzdWZmaXgKKworLlRQCisuQlIgIlwtaWVjIgorcHJpbnQgaHVtYW4gcmVhZGFibGUgcmF0ZXMgaW4gSUVDIHVuaXRzIChpZS4gMUsgPSAxMDI0KS4KKy5SRQorCisuU1MgIGlwIGxpbmsgaGVscCAtIGRpc3BsYXkgaGVscAorCisuUFAKKy5JICJUWVBFIgorc3BlY2lmaWVzIHdoaWNoIGhlbHAgb2YgbGluayB0eXBlIHRvIGRpc2xwYXkuCisKKy5TUworLkkgR1JPVVAKK21heSBiZSBhIG51bWJlciBvciBhIHN0cmluZyBmcm9tIHRoZSBmaWxlCisuQiBAU1lTQ09ORkRJUkAvZ3JvdXAKK3doaWNoIGNhbiBiZSBtYW51YWxseSBmaWxsZWQuCisKKy5TSCAiRVhBTVBMRVMiCisuUFAKK2lwIGxpbmsgc2hvdworLlJTIDQKK1Nob3dzIHRoZSBzdGF0ZSBvZiBhbGwgbmV0d29yayBpbnRlcmZhY2VzIG9uIHRoZSBzeXN0ZW0uCisuUkUKKy5QUAoraXAgbGluayBzaG93IHR5cGUgYnJpZGdlCisuUlMgNAorU2hvd3MgdGhlIGJyaWRnZSBkZXZpY2VzLgorLlJFCisuUFAKK2lwIGxpbmsgc2hvdyB0eXBlIHZsYW4KKy5SUyA0CitTaG93cyB0aGUgdmxhbiBkZXZpY2VzLgorLlJFCisuUFAKK2lwIGxpbmsgc2hvdyBtYXN0ZXIgYnIwCisuUlMgNAorU2hvd3MgZGV2aWNlcyBlbnNsYXZlZCBieSBicjAKKy5SRQorLlBQCitpcCBsaW5rIHNldCBkZXYgcHBwMCBtdHUgMTQwMAorLlJTIDQKK0NoYW5nZSB0aGUgTVRVIHRoZSBwcHAwIGRldmljZS4KKy5SRQorLlBQCitpcCBsaW5rIGFkZCBsaW5rIGV0aDAgbmFtZSBldGgwLjEwIHR5cGUgdmxhbiBpZCAxMAorLlJTIDQKK0NyZWF0ZXMgYSBuZXcgdmxhbiBkZXZpY2UgZXRoMC4xMCBvbiBkZXZpY2UgZXRoMC4KKy5SRQorLlBQCitpcCBsaW5rIGRlbGV0ZSBkZXYgZXRoMC4xMAorLlJTIDQKK1JlbW92ZXMgdmxhbiBkZXZpY2UuCisuUkUKKworaXAgbGluayBoZWxwIGdyZQorLlJTIDQKK0Rpc3BsYXkgaGVscCBmb3IgdGhlIGdyZSBsaW5rIHR5cGUuCisuUkUKKy5QUAoraXAgbGluayBhZGQgbmFtZSB0dW4xIHR5cGUgaXBpcCByZW1vdGUgMTkyLjE2OC4xLjEKK2xvY2FsIDE5Mi4xNjguMS4yIHR0bCAyMjUgZW5jYXAgZ3VlIGVuY2FwLXNwb3J0IGF1dG8KK2VuY2FwLWRwb3J0IDU1NTUgZW5jYXAtY3N1bSBlbmNhcC1yZW1jc3VtCisuUlMgNAorQ3JlYXRlcyBhbiBJUElQIHRoYXQgaXMgZW5jYXBzdWxhdGVkIHdpdGggR2VuZXJpYyBVRFAgRW5jYXBzdWxhdGlvbiwKK2FuZCB0aGUgb3V0ZXIgVURQIGNoZWNrc3VtIGFuZCByZW1vdGUgY2hlY2tzdW0gb2ZmbG9hZCBhcmUgZW5hYmxlZC4KKworLlJFCisuUFAKK2lwIGxpbmsgYWRkIGxpbmsgd3BhbjAgbG93cGFuMCB0eXBlIGxvd3BhbgorLlJTIDQKK0NyZWF0ZXMgYSA2TG9XUEFOIGludGVyZmFjZSBuYW1lZCBsb3dwYW4wIG9uIHRoZSB1bmRlcmx5aW5nCitJRUVFIDgwMi4xNS40IGRldmljZSB3cGFuMC4KKy5SRQorCisuU0ggU0VFIEFMU08KKy5icgorLkJSIGlwICg4KSwKKy5CUiBpcC1uZXRucyAoOCksCisuQlIgZXRodG9vbCAoOCksCisuQlIgaXB0YWJsZXMgKDgpCisKKy5TSCBBVVRIT1IKK09yaWdpbmFsIE1hbnBhZ2UgYnkgTWljaGFpbCBMaXR2YWsgPG1jaUBvd2wub3BlbndhbGwuY29tPgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWFuL21hbjgvaXAtbWFkZHJlc3MuOCBiL2lwcm91dGUyL21hbi9tYW44L2lwLW1hZGRyZXNzLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM0MzJiYgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L2lwLW1hZGRyZXNzLjgKQEAgLTAsMCArMSw1OSBAQAorLlRIIElQXC1NQUREUkVTUyA4ICIyMCBEZWMgMjAxMSIgImlwcm91dGUyIiAiTGludXgiCisuU0ggIk5BTUUiCitpcC1tYWRkcmVzcyBcLSBtdWx0aWNhc3QgYWRkcmVzc2VzIG1hbmFnZW1lbnQKKy5TSCAiU1lOT1BTSVMiCisuc3AKKy5hZCBsCisuaW4gKzgKKy50aSAtOAorLkIgaXAKKy5SSSAiWyAiIE9QVElPTlMgIiBdIgorLkIgIG1hZGRyZXNzCisuUkkgIiB7ICIgQ09NTUFORCAiIHwgIgorLkJSIGhlbHAgIiB9IgorLnNwCisudGkgLTgKKworLkJSICJpcCBtYWRkcmVzcyIgIiBbICIgYWRkICIgfCAiIGRlbCAiIF0iCisuSUIgTVVMVElBRERSICIgZGV2ICIgTkFNRQorCisudGkgLTgKKy5CUiAiaXAgbWFkZHJlc3Mgc2hvdyIgIiBbICIgZGV2CisuSVIgTkFNRSAiIF0iCisKKy5TSCBERVNDUklQVElPTgorLkIgbWFkZHJlc3MKK29iamVjdHMgYXJlIG11bHRpY2FzdCBhZGRyZXNzZXMuCisKKy5TUyBpcCBtYWRkcmVzcyBzaG93IC0gbGlzdCBtdWx0aWNhc3QgYWRkcmVzc2VzCisKKy5UUAorLkJJIGRldiAiIE5BTUUgIiAoZGVmYXVsdCkKK3RoZSBkZXZpY2UgbmFtZS4KKworLlRQCisuQiBpcCBtYWRkcmVzcyBhZGQgLSBhZGQgYSBtdWx0aWNhc3QgYWRkcmVzcworLlRQCisuQiBpcCBtYWRkcmVzcyBkZWxldGUgLSBkZWxldGUgYSBtdWx0aWNhc3QgYWRkcmVzcworLnNwCitUaGVzZSBjb21tYW5kcyBhdHRhY2gvZGV0YWNoIGEgc3RhdGljIGxpbmstbGF5ZXIgbXVsdGljYXN0IGFkZHJlc3MKK3RvIGxpc3RlbiBvbiB0aGUgaW50ZXJmYWNlLgorTm90ZSB0aGF0IGl0IGlzIGltcG9zc2libGUgdG8gam9pbiBwcm90b2NvbCBtdWx0aWNhc3QgZ3JvdXBzCitzdGF0aWNhbGx5LiBUaGlzIGNvbW1hbmQgb25seSBtYW5hZ2VzIGxpbmstbGF5ZXIgYWRkcmVzc2VzLgorCisuUlMKKy5UUAorLkJJIGFkZHJlc3MgIiBMTEFERFJFU1MgIiAoZGVmYXVsdCkKK3RoZSBsaW5rLWxheWVyIG11bHRpY2FzdCBhZGRyZXNzLgorCisuVFAKKy5CSSBkZXYgIiBOQU1FIgordGhlIGRldmljZSB0byBqb2luL2xlYXZlIHRoaXMgbXVsdGljYXN0IGFkZHJlc3MuCisuUkUKKworLlNIIFNFRSBBTFNPCisuYnIKKy5CUiBpcCAoOCkKKworLlNIIEFVVEhPUgorT3JpZ2luYWwgTWFucGFnZSBieSBNaWNoYWlsIExpdHZhayA8bWNpQG93bC5vcGVud2FsbC5jb20+CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9tYW4vbWFuOC9pcC1tb25pdG9yLjggYi9pcHJvdXRlMi9tYW4vbWFuOC9pcC1tb25pdG9yLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJiZDM4MQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L2lwLW1vbml0b3IuOApAQCAtMCwwICsxLDEzNSBAQAorLlRIIElQXC1NT05JVE9SIDggIjEzIERlYyAyMDEyIiAiaXByb3V0ZTIiICJMaW51eCIKKy5TSCAiTkFNRSIKK2lwLW1vbml0b3IsIHJ0bW9uIFwtIHN0YXRlIG1vbml0b3JpbmcKKy5TSCAiU1lOT1BTSVMiCisuc3AKKy5hZCBsCisuaW4gKzgKKy50aSAtOAorLkJSICJpcCAiICIgWyAiCisuSVIgaXAtT1BUSU9OUyAiIF0iCisuQlIgICJtb25pdG9yIiAiIFsgIiBhbGwgIiB8IgorLklSIE9CSkVDVC1MSVNUICIgXSBbIgorLkJJIGZpbGUgIiBGSUxFTkFNRSAiCitdIFsKKy5CSSBsYWJlbAorXSBbCisuQkkgYWxsLW5zaWQKK10gWworLkJJIGRldiAiIERFVklDRSAiCitdCisuc3AKKworLlNIIE9QVElPTlMKKworLlRQCisuQlIgIlwtdCIgLCAiIFwtdGltZXN0YW1wIgorUHJpbnRzIHRpbWVzdGFtcCBiZWZvcmUgdGhlIGV2ZW50IG1lc3NhZ2Ugb24gdGhlIHNlcGFyYXRlZCBsaW5lIGluIGZvcm1hdDoKKyAgICBUaW1lc3RhbXA6IDxEYXk+IDxNb250aD4gPEREPiA8aGg6bW06c3M+IDxZWVlZPiA8dXNlY3M+IHVzZWMKKyAgICA8RVZFTlQ+CisKKy5UUAorLkJSICJcLXRzIiAsICIgXC10c2hvcnQiCitQcmludHMgc2hvcnQgdGltZXN0YW1wIGJlZm9yZSB0aGUgZXZlbnQgbWVzc2FnZSBvbiB0aGUgc2FtZSBsaW5lIGluIGZvcm1hdDoKKyAgICBbPFlZWVk+LTxNTT4tPEREPlQ8aGg6bW06c3M+Ljxtcz5dIDxFVkVOVD4KKworLlNIIERFU0NSSVBUSU9OCitUaGUKKy5CIGlwCit1dGlsaXR5IGNhbiBtb25pdG9yIHRoZSBzdGF0ZSBvZiBkZXZpY2VzLCBhZGRyZXNzZXMKK2FuZCByb3V0ZXMgY29udGludW91c2x5LiBUaGlzIG9wdGlvbiBoYXMgYSBzbGlnaHRseSBkaWZmZXJlbnQgZm9ybWF0LgorTmFtZWx5LCB0aGUKKy5CIG1vbml0b3IKK2NvbW1hbmQgaXMgdGhlIGZpcnN0IGluIHRoZSBjb21tYW5kIGxpbmUgYW5kIHRoZW4gdGhlIG9iamVjdCBsaXN0IGZvbGxvd3M6CisKKy5CUiAiaXAgbW9uaXRvciIgIiBbICIgYWxsICIgfCIKKy5JUiBPQkpFQ1QtTElTVCAiIF0gWyIKKy5CSSBmaWxlICIgRklMRU5BTUUgIgorXSBbCisuQkkgbGFiZWwKK10gWworLkJJIGFsbC1uc2lkCitdIFsKKy5CSSBkZXYgIiBERVZJQ0UgIgorXQorCisuSSBPQkpFQ1QtTElTVAoraXMgdGhlIGxpc3Qgb2Ygb2JqZWN0IHR5cGVzIHRoYXQgd2Ugd2FudCB0byBtb25pdG9yLgorSXQgbWF5IGNvbnRhaW4KKy5CUiBsaW5rICIsICIgYWRkcmVzcyAiLCAiIHJvdXRlICIsICIgbXJvdXRlICIsICIgcHJlZml4ICIsICIKKy5CUiBuZWlnaCAiLCAiIG5ldGNvbmYgIiwgIiAgcnVsZSAiIGFuZCAiIG5zaWQgIi4iCitJZiBubworLkIgZmlsZQorYXJndW1lbnQgaXMgZ2l2ZW4sCisuQiBpcAorb3BlbnMgUlRORVRMSU5LLCBsaXN0ZW5zIG9uIGl0IGFuZCBkdW1wcyBzdGF0ZSBjaGFuZ2VzIGluIHRoZSBmb3JtYXQKK2Rlc2NyaWJlZCBpbiBwcmV2aW91cyBzZWN0aW9ucy4KKworLlAKK0lmIHRoZQorLkJJIGxhYmVsCitvcHRpb24gaXMgc2V0LCBhIHByZWZpeCBpcyBkaXNwbGF5ZWQgYmVmb3JlIGVhY2ggbWVzc2FnZSB0bworc2hvdyB0aGUgZmFtaWx5IG9mIHRoZSBtZXNzYWdlLiBGb3IgZXhhbXBsZToKKy5zcAorLmluICsyCitbTkVJR0hdMTAuMTYuMC4xMTIgZGV2IGV0aDAgbGxhZGRyIDAwOjA0OjIzOmRmOjJmOmQwIFJFQUNIQUJMRQorW0xJTktdMzogZXRoMTogPEJST0FEQ0FTVCxNVUxUSUNBU1Q+IG10dSAxNTAwIHFkaXNjIHBmaWZvX2Zhc3Qgc3RhdGUgRE9XTiBncm91cCBkZWZhdWx0CisgICAgbGluay9ldGhlciA1Mjo1NDowMDoxMjozNDo1NyBicmQgZmY6ZmY6ZmY6ZmY6ZmY6ZmYKKy5pbiAtMgorLnNwCisKKy5QCitJZiB0aGUKKy5CSSBhbGwtbnNpZAorb3B0aW9uIGlzIHNldCwgdGhlIHByb2dyYW0gbGlzdGVucyB0byBhbGwgbmV0d29yayBuYW1lc3BhY2VzIHRoYXQgaGF2ZSBhCituc2lkIGFzc2lnbmVkIGludG8gdGhlIG5ldHdvcmsgbmFtZXNwYWNlIHdlcmUgdGhlIHByb2dyYW0gaXMgcnVubmluZy4KK0EgcHJlZml4IGlzIGRpc3BsYXllZCB0byBzaG93IHRoZSBuZXR3b3JrIG5hbWVzcGFjZSB3aGVyZSB0aGUgbWVzc2FnZQorb3JpZ2luYXRlcy4gRXhhbXBsZToKKy5zcAorLmluICsyCitbbnNpZCAwXTEwLjE2LjAuMTEyIGRldiBldGgwIGxsYWRkciAwMDowNDoyMzpkZjoyZjpkMCBSRUFDSEFCTEUKKy5pbiAtMgorLnNwCisKKy5QCitJZiB0aGUKKy5CSSBmaWxlCitvcHRpb24gaXMgZ2l2ZW4sIHRoZSBwcm9ncmFtIGRvZXMgbm90IGxpc3RlbiBvbiBSVE5FVExJTkssCitidXQgb3BlbnMgdGhlIGdpdmVuIGZpbGUsIGFuZCBkdW1wcyBpdHMgY29udGVudHMuIFRoZSBmaWxlCitzaG91bGQgY29udGFpbiBSVE5FVExJTksgbWVzc2FnZXMgc2F2ZWQgaW4gYmluYXJ5IGZvcm1hdC4KK1N1Y2ggYSBmaWxlIGNhbiBiZSBnZW5lcmF0ZWQgd2l0aCB0aGUKKy5CIHJ0bW9uCit1dGlsaXR5LiBUaGlzIHV0aWxpdHkgaGFzIGEgY29tbWFuZCBsaW5lIHN5bnRheCBzaW1pbGFyIHRvCisuQlIgImlwIG1vbml0b3IiIC4KK0lkZWFsbHksCisuQiBydG1vbgorc2hvdWxkIGJlIHN0YXJ0ZWQgYmVmb3JlIHRoZSBmaXJzdCBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gY29tbWFuZAoraXMgaXNzdWVkLiBGLmUuIGlmIHlvdSBpbnNlcnQ6Cisuc3AKKy5pbiArOAorcnRtb24gZmlsZSAvdmFyL2xvZy9ydG1vbi5sb2cKKy5pbiAtOAorLnNwCitpbiBhIHN0YXJ0dXAgc2NyaXB0LCB5b3Ugd2lsbCBiZSBhYmxlIHRvIHZpZXcgdGhlIGZ1bGwgaGlzdG9yeQorbGF0ZXIuCisKKy5QCitOZXZlcnRoZWxlc3MsIGl0IGlzIHBvc3NpYmxlIHRvIHN0YXJ0CisuQiBydG1vbgorYXQgYW55IHRpbWUuCitJdCBwcmVwZW5kcyB0aGUgaGlzdG9yeSB3aXRoIHRoZSBzdGF0ZSBzbmFwc2hvdCBkdW1wZWQgYXQgdGhlIG1vbWVudAorb2Ygc3RhcnRpbmcuCisKKy5QCitJZiB0aGUKKy5CSSBkZXYKK29wdGlvbiBpcyBnaXZlbiwgdGhlIHByb2dyYW0gcHJpbnRzIG9ubHkgZXZlbnRzIHJlbGF0ZWQgdG8gdGhpcyBkZXZpY2UuCisKKy5TSCBTRUUgQUxTTworLmJyCisuQlIgaXAgKDgpCisKKy5TSCBBVVRIT1IKK09yaWdpbmFsIE1hbnBhZ2UgYnkgTWljaGFpbCBMaXR2YWsgPG1jaUBvd2wub3BlbndhbGwuY29tPgorLmJyCitNYW5wYWdlIHJldmlzZWQgYnkgTmljb2xhcyBEaWNodGVsIDxuaWNvbGFzLmRpY2h0ZWxANndpbmQuY29tPgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWFuL21hbjgvaXAtbXJvdXRlLjggYi9pcHJvdXRlMi9tYW4vbWFuOC9pcC1tcm91dGUuOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODliNmIyCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbWFuL21hbjgvaXAtbXJvdXRlLjgKQEAgLTAsMCArMSw1OCBAQAorLlRIIElQXC1NUk9VVEUgOCAiMTMgRGVjIDIwMTIiICJpcHJvdXRlMiIgIkxpbnV4IgorLlNIICJOQU1FIgoraXAtbXJvdXRlIFwtIG11bHRpY2FzdCByb3V0aW5nIGNhY2hlIG1hbmFnZW1lbnQKKy5TSCAiU1lOT1BTSVMiCisuc3AKKy5hZCBsCisuaW4gKzgKKy50aSAtOAorLkJSICJpcCAiICIgWyBpcC1PUFRJT05TIF0gIiAibXJvdXRlIHNob3ciICIgWyBbICIKKy5CUiAiIHRvICIgIiBdICIKKy5JUiBQUkVGSVggIiBdIFsgIgorLkIgIGZyb20KKy5JUiBQUkVGSVggIiBdIFsgIgorLkIgIGlpZgorLklSIERFVklDRSAiIF0gWyAiCisuQiB0YWJsZQorLklSIFRBQkxFX0lEICIgXSAiCisKKy5TSCBERVNDUklQVElPTgorLkIgbXJvdXRlCitvYmplY3RzIGFyZSBtdWx0aWNhc3Qgcm91dGluZyBjYWNoZSBlbnRyaWVzIGNyZWF0ZWQgYnkgYSB1c2VyLWxldmVsCittcm91dGluZyBkYWVtb24gKGYuZS4KKy5CIHBpbWQKK29yCisuQiBtcm91dGVkCispLgorCitEdWUgdG8gdGhlIGxpbWl0YXRpb25zIG9mIHRoZSBjdXJyZW50IGludGVyZmFjZSB0byB0aGUgbXVsdGljYXN0IHJvdXRpbmcKK2VuZ2luZSwgaXQgaXMgaW1wb3NzaWJsZSB0byBjaGFuZ2UKKy5CIG1yb3V0ZQorb2JqZWN0cyBhZG1pbmlzdHJhdGl2ZWx5LCBzbyB3ZSBjYW4gb25seSBkaXNwbGF5IHRoZW0uIFRoaXMgbGltaXRhdGlvbgord2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCisKKy5TUyBpcCBtcm91dGUgc2hvdyAtIGxpc3QgbXJvdXRlIGNhY2hlIGVudHJpZXMKKworLlRQCisuQkkgdG8gIiBQUkVGSVggIiAoZGVmYXVsdCkKK3RoZSBwcmVmaXggc2VsZWN0aW5nIHRoZSBkZXN0aW5hdGlvbiBtdWx0aWNhc3QgYWRkcmVzc2VzIHRvIGxpc3QuCisKKy5UUAorLkJJIGlpZiAiIE5BTUUiCit0aGUgaW50ZXJmYWNlIG9uIHdoaWNoIG11bHRpY2FzdCBwYWNrZXRzIGFyZSByZWNlaXZlZC4KKworLlRQCisuQkkgZnJvbSAiIFBSRUZJWCIKK3RoZSBwcmVmaXggc2VsZWN0aW5nIHRoZSBJUCBzb3VyY2UgYWRkcmVzc2VzIG9mIHRoZSBtdWx0aWNhc3Qgcm91dGUuCisKKy5UUAorLkJJIHRhYmxlICIgVEFCTEVfSUQiCit0aGUgdGFibGUgaWQgc2VsZWN0aW5nIHRoZSBtdWx0aWNhc3QgdGFibGUuIEl0IGNhbiBiZQorLkJSIGxvY2FsICIsICIgbWFpbiAiLCAiIGRlZmF1bHQgIiwgIiBhbGwgIiBvciBhIG51bWJlci4iCisKKy5TSCBTRUUgQUxTTworLmJyCisuQlIgaXAgKDgpCisKKy5TSCBBVVRIT1IKK09yaWdpbmFsIE1hbnBhZ2UgYnkgTWljaGFpbCBMaXR2YWsgPG1jaUBvd2wub3BlbndhbGwuY29tPgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWFuL21hbjgvaXAtbmVpZ2hib3VyLjggYi9pcHJvdXRlMi9tYW4vbWFuOC9pcC1uZWlnaGJvdXIuOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWIwMjU2Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbWFuL21hbjgvaXAtbmVpZ2hib3VyLjgKQEAgLTAsMCArMSwyMDQgQEAKKy5USCBJUFwtTkVJR0hCT1VSIDggIjIwIERlYyAyMDExIiAiaXByb3V0ZTIiICJMaW51eCIKKy5TSCAiTkFNRSIKK2lwLW5laWdoYm91ciBcLSBuZWlnaGJvdXIvYXJwIHRhYmxlcyBtYW5hZ2VtZW50LgorLlNIICJTWU5PUFNJUyIKKy5zcAorLmFkIGwKKy5pbiArOAorLnRpIC04CisuQiBpcAorLlJJICJbICIgT1BUSU9OUyAiIF0iCisuQiBuZWlnaAorLlJJICIgeyAiIENPTU1BTkQgIiB8ICIKKy5CUiBoZWxwICIgfSIKKy5zcAorCisudGkgLTgKKy5CUiAiaXAgbmVpZ2giICIgeyAiIGFkZCAiIHwgIiBkZWwgIiB8ICIgY2hhbmdlICIgfCAiIHJlcGxhY2UgIiB9IHsgIgorLklSIEFERFIgIiBbICIKKy5CICBsbGFkZHIKKy5JUiBMTEFERFIgIiBdIFsgIgorLkJSIG51ZCAiIHsgIiBwZXJtYW5lbnQgIiB8ICIgbm9hcnAgIiB8ICIgc3RhbGUgIiB8ICIgcmVhY2hhYmxlICIgfSBdIHwgIiBwcm94eQorLklSIEFERFIgIiB9IFsgIgorLkIgIGRldgorLklSIERFViAiIF0iCisKKy50aSAtOAorLkJSICJpcCBuZWlnaCIgIiB7ICIgc2hvdyAiIHwgIiBmbHVzaCAiIH0gWyAiIHByb3h5ICIgXSBbICIgdG8KKy5JUiBQUkVGSVggIiBdIFsgIgorLkIgIGRldgorLklSIERFViAiIF0gWyAiCisuQiAgbnVkCisuSVIgU1RBVEUgIiBdIgorCisKKy5TSCBERVNDUklQVElPTgorVGhlCisuQiBpcCBuZWlnaAorY29tbWFuZCBtYW5pcHVsYXRlcworLkkgbmVpZ2hib3VyCitvYmplY3RzIHRoYXQgZXN0YWJsaXNoIGJpbmRpbmdzIGJldHdlZW4gcHJvdG9jb2wgYWRkcmVzc2VzIGFuZAorbGluayBsYXllciBhZGRyZXNzZXMgZm9yIGhvc3RzIHNoYXJpbmcgdGhlIHNhbWUgbGluay4KK05laWdoYm91ciBlbnRyaWVzIGFyZSBvcmdhbml6ZWQgaW50byB0YWJsZXMuIFRoZSBJUHY0IG5laWdoYm91ciB0YWJsZQoraXMgYWxzbyBrbm93biBieSBhbm90aGVyIG5hbWUgLSB0aGUgQVJQIHRhYmxlLgorCisuUAorVGhlIGNvcnJlc3BvbmRpbmcgY29tbWFuZHMgZGlzcGxheSBuZWlnaGJvdXIgYmluZGluZ3MKK2FuZCB0aGVpciBwcm9wZXJ0aWVzLCBhZGQgbmV3IG5laWdoYm91ciBlbnRyaWVzIGFuZCBkZWxldGUgb2xkIG9uZXMuCisKKy5UUAoraXAgbmVpZ2hib3VyIGFkZAorYWRkIGEgbmV3IG5laWdoYm91ciBlbnRyeQorLlRQCitpcCBuZWlnaGJvdXIgY2hhbmdlCitjaGFuZ2UgYW4gZXhpc3RpbmcgZW50cnkKKy5UUAoraXAgbmVpZ2hib3VyIHJlcGxhY2UKK2FkZCBhIG5ldyBlbnRyeSBvciBjaGFuZ2UgYW4gZXhpc3Rpbmcgb25lCisuUlMKKy5QUAorVGhlc2UgY29tbWFuZHMgY3JlYXRlIG5ldyBuZWlnaGJvdXIgcmVjb3JkcyBvciB1cGRhdGUgZXhpc3Rpbmcgb25lcy4KKworLlRQCisuQkkgdG8gIiBBRERSRVNTICIgKGRlZmF1bHQpCit0aGUgcHJvdG9jb2wgYWRkcmVzcyBvZiB0aGUgbmVpZ2hib3VyLiBJdCBpcyBlaXRoZXIgYW4gSVB2NCBvciBJUHY2IGFkZHJlc3MuCisKKy5UUAorLkJJIGRldiAiIE5BTUUiCit0aGUgaW50ZXJmYWNlIHRvIHdoaWNoIHRoaXMgbmVpZ2hib3VyIGlzIGF0dGFjaGVkLgorCisuVFAKKy5CSSBsbGFkZHIgIiBMTEFERFJFU1MiCit0aGUgbGluayBsYXllciBhZGRyZXNzIG9mIHRoZSBuZWlnaGJvdXIuCisuSSBMTEFERFJFU1MKK2NhbiBhbHNvIGJlCisuQlIgIm51bGwiIC4KKworLlRQCisuQkkgbnVkICIgTlVEX1NUQVRFIgordGhlIHN0YXRlIG9mIHRoZSBuZWlnaGJvdXIgZW50cnkuCisuQiBudWQKK2lzIGFuIGFiYnJldmlhdGlvbiBmb3IgJ05laWdoYm91ciBVbnJlYWNoYWJpbGl0eSBEZXRlY3Rpb24nLgorVGhlIHN0YXRlIGNhbiB0YWtlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKworLlRQCisuQiBwZXJtYW5lbnQKK3RoZSBuZWlnaGJvdXIgZW50cnkgaXMgdmFsaWQgZm9yZXZlciBhbmQgY2FuIGJlIG9ubHkKK2JlIHJlbW92ZWQgYWRtaW5pc3RyYXRpdmVseS4KKy5UUAorLkIgbm9hcnAKK3RoZSBuZWlnaGJvdXIgZW50cnkgaXMgdmFsaWQuIE5vIGF0dGVtcHRzIHRvIHZhbGlkYXRlCit0aGlzIGVudHJ5IHdpbGwgYmUgbWFkZSBidXQgaXQgY2FuIGJlIHJlbW92ZWQgd2hlbiBpdHMgbGlmZXRpbWUgZXhwaXJlcy4KKy5UUAorLkIgcmVhY2hhYmxlCit0aGUgbmVpZ2hib3VyIGVudHJ5IGlzIHZhbGlkIHVudGlsIHRoZSByZWFjaGFiaWxpdHkKK3RpbWVvdXQgZXhwaXJlcy4KKy5UUAorLkIgc3RhbGUKK3RoZSBuZWlnaGJvdXIgZW50cnkgaXMgdmFsaWQgYnV0IHN1c3BpY2lvdXMuCitUaGlzIG9wdGlvbiB0bworLkIgaXAgbmVpZ2gKK2RvZXMgbm90IGNoYW5nZSB0aGUgbmVpZ2hib3VyIHN0YXRlIGlmIGl0IHdhcyB2YWxpZCBhbmQgdGhlIGFkZHJlc3MKK2lzIG5vdCBjaGFuZ2VkIGJ5IHRoaXMgY29tbWFuZC4KKy5SRQorCisuVFAKK2lwIG5laWdoYm91ciBkZWxldGUKK2RlbGV0ZSBhIG5laWdoYm91ciBlbnRyeQorLlJTCisuUFAKK1RoZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIHdpdGgKKy5CUiAiaXAgbmVpZ2ggYWRkIiAsCitleGNlcHQgdGhhdAorLkIgbGxhZGRyCithbmQKKy5CIG51ZAorYXJlIGlnbm9yZWQuCisKKy5QUAorLkIgV2FybmluZzoKK0F0dGVtcHRzIHRvIGRlbGV0ZSBvciBtYW51YWxseSBjaGFuZ2UgYQorLkIgbm9hcnAKK2VudHJ5IGNyZWF0ZWQgYnkgdGhlIGtlcm5lbCBtYXkgcmVzdWx0IGluIHVucHJlZGljdGFibGUgYmVoYXZpb3VyLgorUGFydGljdWxhcmx5LCB0aGUga2VybmVsIG1heSB0cnkgdG8gcmVzb2x2ZSB0aGlzIGFkZHJlc3MgZXZlbgorb24gYQorLkIgTk9BUlAKK2ludGVyZmFjZSBvciBpZiB0aGUgYWRkcmVzcyBpcyBtdWx0aWNhc3Qgb3IgYnJvYWRjYXN0LgorLlJFCisKKy5UUAoraXAgbmVpZ2hib3VyIHNob3cKK2xpc3QgbmVpZ2hib3VyIGVudHJpZXMKKy5SUworLlRQCisuQkkgdG8gIiBBRERSRVNTICIgKGRlZmF1bHQpCit0aGUgcHJlZml4IHNlbGVjdGluZyB0aGUgbmVpZ2hib3VycyB0byBsaXN0LgorCisuVFAKKy5CSSBkZXYgIiBOQU1FIgorb25seSBsaXN0IHRoZSBuZWlnaGJvdXJzIGF0dGFjaGVkIHRvIHRoaXMgZGV2aWNlLgorCisuVFAKKy5CSSBwcm94eQorbGlzdCBuZWlnaGJvdXIgcHJveGllcy4KKworLlRQCisuQiB1bnVzZWQKK29ubHkgbGlzdCBuZWlnaGJvdXJzIHdoaWNoIGFyZSBub3QgY3VycmVudGx5IGluIHVzZS4KKworLlRQCisuQkkgbnVkICIgTlVEX1NUQVRFIgorb25seSBsaXN0IG5laWdoYm91ciBlbnRyaWVzIGluIHRoaXMgc3RhdGUuCisuSSBOVURfU1RBVEUKK3Rha2VzIHZhbHVlcyBsaXN0ZWQgYmVsb3cgb3IgdGhlIHNwZWNpYWwgdmFsdWUKKy5CIGFsbAord2hpY2ggbWVhbnMgYWxsIHN0YXRlcy4gVGhpcyBvcHRpb24gbWF5IG9jY3VyIG1vcmUgdGhhbiBvbmNlLgorSWYgdGhpcyBvcHRpb24gaXMgYWJzZW50LAorLkIgaXAKK2xpc3RzIGFsbCBlbnRyaWVzIGV4Y2VwdCBmb3IKKy5CIG5vbmUKK2FuZAorLkJSICJub2FycCIgLgorLlJFCisKKy5UUAoraXAgbmVpZ2hib3VyIGZsdXNoCitmbHVzaCBuZWlnaGJvdXIgZW50cmllcworLlJTCitUaGlzIGNvbW1hbmQgaGFzIHRoZSBzYW1lIGFyZ3VtZW50cyBhcworLkIgc2hvdy4KK1RoZSBkaWZmZXJlbmNlcyBhcmUgdGhhdCBpdCBkb2VzIG5vdCBydW4gd2hlbiBubyBhcmd1bWVudHMgYXJlIGdpdmVuLAorYW5kIHRoYXQgdGhlIGRlZmF1bHQgbmVpZ2hib3VyIHN0YXRlcyB0byBiZSBmbHVzaGVkIGRvIG5vdCBpbmNsdWRlCisuQiBwZXJtYW5lbnQKK2FuZAorLkJSICJub2FycCIgLgorCisuUFAKK1dpdGggdGhlCisuQiAtc3RhdGlzdGljcworb3B0aW9uLCB0aGUgY29tbWFuZCBiZWNvbWVzIHZlcmJvc2UuIEl0IHByaW50cyBvdXQgdGhlIG51bWJlciBvZgorZGVsZXRlZCBuZWlnaGJvdXJzIGFuZCB0aGUgbnVtYmVyIG9mIHJvdW5kcyBtYWRlIHRvIGZsdXNoIHRoZQorbmVpZ2hib3VyIHRhYmxlLiBJZiB0aGUgb3B0aW9uIGlzIGdpdmVuCit0d2ljZSwKKy5CIGlwIG5laWdoIGZsdXNoCithbHNvIGR1bXBzIGFsbCB0aGUgZGVsZXRlZCBuZWlnaGJvdXJzLgorLlJFCisKKy5TSCBFWEFNUExFUworLlBQCitpcCBuZWlnaGJvdXIKKy5SUworU2hvd3MgdGhlIGN1cnJlbnQgbmVpZ2hib3VyIHRhYmxlIGluIGtlcm5lbC4KKy5SRQorLlBQCitpcCBuZWlnaCBmbHVzaCBkZXYgZXRoMAorLlJTCitSZW1vdmVzIGVudHJpZXMgaW4gdGhlIG5laWdoYm91ciB0YWJsZSBvbiBkZXZpY2UgZXRoMC4KKy5SRQorCisuU0ggU0VFIEFMU08KKy5icgorLkJSIGlwICg4KQorCisuU0ggQVVUSE9SCitPcmlnaW5hbCBNYW5wYWdlIGJ5IE1pY2hhaWwgTGl0dmFrIDxtY2lAb3dsLm9wZW53YWxsLmNvbT4KZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L2lwLW5ldGNvbmYuOCBiL2lwcm91dGUyL21hbi9tYW44L2lwLW5ldGNvbmYuOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzE4MjU4Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbWFuL21hbjgvaXAtbmV0Y29uZi44CkBAIC0wLDAgKzEsMzYgQEAKKy5USCBJUFwtTkVUQ09ORiA4ICIxMyBEZWMgMjAxMiIgImlwcm91dGUyIiAiTGludXgiCisuU0ggIk5BTUUiCitpcC1uZXRjb25mIFwtIG5ldHdvcmsgY29uZmlndXJhdGlvbiBtb25pdG9yaW5nCisuU0ggIlNZTk9QU0lTIgorLnNwCisuYWQgbAorLmluICs4CisudGkgLTgKKy5CUiAiaXAgIiAiIFsgaXAtT1BUSU9OUyBdICIgIm5ldGNvbmYgc2hvdyIgIiBbICIKKy5CIGRldgorLklSIE5BTUUgIiBdIgorCisuU0ggREVTQ1JJUFRJT04KK1RoZQorLkIgaXAgbmV0Y29uZgordXRpbGl0eSBjYW4gbW9uaXRvciBJUHY0IGFuZCBJUHY2IHBhcmFtZXRlcnMgKHNlZQorLkJSICIvcHJvYy9zeXMvbmV0L2lwdls0fDZdL2NvbmYvW2FsbHxERVZdLyIgIikiCitsaWtlIGZvcndhcmRpbmcsIHJwX2ZpbHRlcgorb3IgbWNfZm9yd2FyZGluZyBzdGF0dXMuCisKK0lmIG5vIGludGVyZmFjZSBpcyBzcGVjaWZpZWQsIHRoZSBlbnRyeQorLkIgYWxsCitpcyBkaXNwbGF5ZWQuCisKKy5TUyBpcCBuZXRjb25mIHNob3cgLSBkaXNwbGF5IG5ldHdvcmsgcGFyYW1ldGVycworCisuVFAKKy5CSSBkZXYgIiBOQU1FIgordGhlIG5hbWUgb2YgdGhlIGRldmljZSB0byBkaXNwbGF5IG5ldHdvcmsgcGFyYW1ldGVycyBmb3IuCisKKy5TSCBTRUUgQUxTTworLmJyCisuQlIgaXAgKDgpCisKKy5TSCBBVVRIT1IKK09yaWdpbmFsIE1hbnBhZ2UgYnkgTmljb2xhcyBEaWNodGVsIDxuaWNvbGFzLmRpY2h0ZWxANndpbmQuY29tPgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWFuL21hbjgvaXAtbmV0bnMuOCBiL2lwcm91dGUyL21hbi9tYW44L2lwLW5ldG5zLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliMGZiYwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L2lwLW5ldG5zLjgKQEAgLTAsMCArMSwyMTMgQEAKKy5USCBJUFwtTkVUTlMgOCAiMTYgSmFuIDIwMTMiICJpcHJvdXRlMiIgIkxpbnV4IgorLlNIIE5BTUUKK2lwLW5ldG5zIFwtIHByb2Nlc3MgbmV0d29yayBuYW1lc3BhY2UgbWFuYWdlbWVudAorLlNIIFNZTk9QU0lTCisuc3AKKy5hZCBsCisuaW4gKzgKKy50aSAtOAorLkIgaXAKKy5SSSAiWyAiIE9QVElPTlMgIiBdIgorLkIgbmV0bnMKKy5SSSAgIiB7ICIgQ09NTUFORCAiIHwgIgorLkJSIGhlbHAgIiB9IgorLnNwCisudGkgLTgKKy5CUiAiaXAgbmV0bnMiICIgeyAiIGxpc3QgIiB9ICIKKworLnRpIC04CisuQiBpcCBuZXRucyBhZGQKKy5JIE5FVE5TTkFNRQorCisudGkgLTgKKy5CIGlwIFstYWxsXSBuZXRucyBkZWwKKy5SSSAiWyAiIE5FVE5TTkFNRSAiIF0iCisKKy50aSAtOAorLkJSICJpcCBuZXRucyIgIiB7ICIgc2V0ICIgfSAiCisuSSBORVROU05BTUUgTkVUTlNJRAorCisudGkgLTgKKy5CUiAiaXAgbmV0bnMgaWRlbnRpZnkiCisuUkkgIlsgIiBQSUQgIiBdIgorCisudGkgLTgKKy5CUiAiaXAgbmV0bnMgcGlkcyIKKy5JIE5FVE5TTkFNRQorCisudGkgLTgKKy5CUiAiaXAgWy1hbGxdIG5ldG5zIGV4ZWMgIgorLlJJICJbICIgTkVUTlNOQU1FICIgXSAiIGNvbW1hbmQgLi4uCisKKy50aSAtOAorLkJSICJpcCBuZXRucyBtb25pdG9yIgorCisudGkgLTgKKy5CUiAiaXAgbmV0bnMgbGlzdC1pZCIKKworLlNIIERFU0NSSVBUSU9OCitBIG5ldHdvcmsgbmFtZXNwYWNlIGlzIGxvZ2ljYWxseSBhbm90aGVyIGNvcHkgb2YgdGhlIG5ldHdvcmsgc3RhY2ssCit3aXRoIGl0cyBvd24gcm91dGVzLCBmaXJld2FsbCBydWxlcywgYW5kIG5ldHdvcmsgZGV2aWNlcy4KKworQnkgZGVmYXVsdCBhIHByb2Nlc3MgaW5oZXJpdHMgaXRzIG5ldHdvcmsgbmFtZXNwYWNlIGZyb20gaXRzIHBhcmVudC4gSW5pdGlhbGx5IGFsbAordGhlIHByb2Nlc3NlcyBzaGFyZSB0aGUgc2FtZSBkZWZhdWx0IG5ldHdvcmsgbmFtZXNwYWNlIGZyb20gdGhlIGluaXQgcHJvY2Vzcy4KKworQnkgY29udmVudGlvbiBhIG5hbWVkIG5ldHdvcmsgbmFtZXNwYWNlIGlzIGFuIG9iamVjdCBhdAorLkJSICIvdmFyL3J1bi9uZXRucy8iIE5BTUUKK3RoYXQgY2FuIGJlIG9wZW5lZC4gVGhlIGZpbGUgZGVzY3JpcHRvciByZXN1bHRpbmcgZnJvbSBvcGVuaW5nCisuQlIgIi92YXIvcnVuL25ldG5zLyIgTkFNRQorcmVmZXJzIHRvIHRoZSBzcGVjaWZpZWQgbmV0d29yayBuYW1lc3BhY2UuIEhvbGRpbmcgdGhhdCBmaWxlCitkZXNjcmlwdG9yIG9wZW4ga2VlcHMgdGhlIG5ldHdvcmsgbmFtZXNwYWNlIGFsaXZlLiBUaGUgZmlsZQorZGVzY3JpcHRvciBjYW4gYmUgdXNlZCB3aXRoIHRoZQorLkIgc2V0bnMoMikKK3N5c3RlbSBjYWxsIHRvIGNoYW5nZSB0aGUgbmV0d29yayBuYW1lc3BhY2UgYXNzb2NpYXRlZCB3aXRoIGEgdGFzay4KKworRm9yIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBhd2FyZSBvZiBuZXR3b3JrIG5hbWVzcGFjZXMsIHRoZSBjb252ZW50aW9uCitpcyB0byBsb29rIGZvciBnbG9iYWwgbmV0d29yayBjb25maWd1cmF0aW9uIGZpbGVzIGZpcnN0IGluCisuQlIgIi9ldGMvbmV0bnMvIiBOQU1FICIvIgordGhlbiBpbgorLkJSICIvZXRjLyIuCitGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgYSBkaWZmZXJlbnQgdmVyc2lvbiBvZgorLkJSIC9ldGMvcmVzb2x2LmNvbmYKK2ZvciBhIG5ldHdvcmsgbmFtZXNwYWNlIHVzZWQgdG8gaXNvbGF0ZSB5b3VyIHZwbiB5b3Ugd291bGQgbmFtZSBpdAorLkJSIC9ldGMvbmV0bnMvbXl2cG4vcmVzb2x2LmNvbmYuCisKKy5CIGlwIG5ldG5zIGV4ZWMKK2F1dG9tYXRlcyBoYW5kbGluZyBvZiB0aGlzIGNvbmZpZ3VyYXRpb24sIGZpbGUgY29udmVudGlvbiBmb3IgbmV0d29yaworbmFtZXNwYWNlIHVuYXdhcmUgYXBwbGljYXRpb25zLCBieSBjcmVhdGluZyBhIG1vdW50IG5hbWVzcGFjZSBhbmQKK2JpbmQgbW91bnRpbmcgYWxsIG9mIHRoZSBwZXIgbmV0d29yayBuYW1lc3BhY2UgY29uZmlndXJlIGZpbGVzIGludG8KK3RoZWlyIHRyYWRpdGlvbmFsIGxvY2F0aW9uIGluIC9ldGMuCisKKy5UUAorLkIgaXAgbmV0bnMgbGlzdCAtIHNob3cgYWxsIG9mIHRoZSBuYW1lZCBuZXR3b3JrIG5hbWVzcGFjZXMKKy5zcAorVGhpcyBjb21tYW5kIGRpc3BsYXlzIGFsbCBvZiB0aGUgbmV0d29yayBuYW1lc3BhY2VzIGluIC92YXIvcnVuL25ldG5zCisKKy5UUAorLkIgaXAgbmV0bnMgYWRkIE5BTUUgLSBjcmVhdGUgYSBuZXcgbmFtZWQgbmV0d29yayBuYW1lc3BhY2UKKy5zcAorSWYgTkFNRSBpcyBhdmFpbGFibGUgaW4gL3Zhci9ydW4vbmV0bnMvIHRoaXMgY29tbWFuZCBjcmVhdGVzIGEgbmV3CituZXR3b3JrIG5hbWVzcGFjZSBhbmQgYXNzaWducyBOQU1FLgorCisuVFAKKy5CIGlwIFstYWxsXSBuZXRucyBkZWxldGUgWyBOQU1FIF0gLSBkZWxldGUgdGhlIG5hbWUgb2YgYSBuZXR3b3JrIG5hbWVzcGFjZShzKQorLnNwCitJZiBOQU1FIGlzIHByZXNlbnQgaW4gL3Zhci9ydW4vbmV0bnMgaXQgaXMgdW1vdW50ZWQgYW5kIHRoZSBtb3VudAorcG9pbnQgaXMgcmVtb3ZlZC4gSWYgdGhpcyBpcyB0aGUgbGFzdCB1c2VyIG9mIHRoZSBuZXR3b3JrIG5hbWVzcGFjZSB0aGUKK25ldHdvcmsgbmFtZXNwYWNlIHdpbGwgYmUgZnJlZWQgYW5kIGFsbCBwaHlzaWNhbCBkZXZpY2VzIHdpbGwgYmUgbW92ZWQgdG8gdGhlCitkZWZhdWx0IG9uZSwgb3RoZXJ3aXNlIHRoZSBuZXR3b3JrIG5hbWVzcGFjZSBwZXJzaXN0cyB1bnRpbCBpdCBoYXMgbm8gbW9yZQordXNlcnMuIGlwIG5ldG5zIGRlbGV0ZSBtYXkgZmFpbCBpZiB0aGUgbW91bnQgcG9pbnQgaXMgaW4gdXNlIGluIGFub3RoZXIgbW91bnQKK25hbWVzcGFjZS4KKworSWYKKy5CIC1hbGwKK29wdGlvbiB3YXMgc3BlY2lmaWVkIHRoZW4gYWxsIHRoZSBuZXR3b3JrIG5hbWVzcGFjZSBuYW1lcyB3aWxsIGJlIHJlbW92ZWQuCisKK0l0IGlzIHBvc3NpYmxlIHRvIGxvc2UgdGhlIHBoeXNpY2FsIGRldmljZSB3aGVuIGl0IHdhcyBtb3ZlZCB0byBuZXRucyBhbmQKK3RoZW4gdGhpcyBuZXRucyB3YXMgZGVsZXRlZCB3aXRoIGEgcnVubmluZyBwcm9jZXNzOgorCisuUlMgMTAKKyQgaXAgbmV0bnMgYWRkIG5ldDAKKy5SRQorLlJTIDEwCiskIGlwIGxpbmsgc2V0IGRldiBldGgwIG5ldG5zIG5ldDAKKy5SRQorLlJTIDEwCiskIGlwIG5ldG5zIGV4ZWMgbmV0MCBTT01FX1BST0NFU1NfSU5fQkFDS0dST1VORAorLlJFCisuUlMgMTAKKyQgaXAgbmV0bnMgZGVsIG5ldDAKKy5SRQorCisuUlMKK2FuZCBldGgwIHdpbGwgYXBwZWFyIGluIHRoZSBkZWZhdWx0IG5ldG5zIG9ubHkgYWZ0ZXIgU09NRV9QUk9DRVNTX0lOX0JBQ0tHUk9VTkQKK3dpbGwgZXhpdCBvciB3aWxsIGJlIGtpbGxlZC4gVG8gcHJldmVudCB0aGlzIHRoZSBwcm9jZXNzZXMgcnVubmluZyBpbiBuZXQwCitzaG91bGQgYmUga2lsbGVkIGJlZm9yZSBkZWxldGluZyB0aGUgbmV0bnM6CisKKy5SRQorLlJTIDEwCiskIGlwIG5ldG5zIHBpZHMgbmV0MCB8IHhhcmdzIGtpbGwKKy5SRQorLlJTIDEwCiskIGlwIG5ldG5zIGRlbCBuZXQwCisuUkUKKworLlRQCisuQiBpcCBuZXRucyBzZXQgTkFNRSBORVROU0lEIC0gYXNzaWduIGFuIGlkIHRvIGEgcGVlciBuZXR3b3JrIG5hbWVzcGFjZQorLnNwCitUaGlzIGNvbW1hbmQgYXNzaWducyBhIGlkIHRvIGEgcGVlciBuZXR3b3JrIG5hbWVzcGFjZS4gVGhpcyBpZCBpcyB2YWxpZAorb25seSBpbiB0aGUgY3VycmVudCBuZXR3b3JrIG5hbWVzcGFjZS4KK1RoaXMgaWQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBrZXJuZWwgaW4gc29tZSBuZXRsaW5rIG1lc3NhZ2VzLiBJZiBubyBpZCBpcworYXNzaWduZWQgd2hlbiB0aGUga2VybmVsIG5lZWRzIGl0LCBpdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgYnkKK3RoZSBrZXJuZWwuCitPbmNlIGl0IGlzIGFzc2lnbmVkLCBpdCdzIG5vdCBwb3NzaWJsZSB0byBjaGFuZ2UgaXQuCisKKy5UUAorLkIgaXAgbmV0bnMgaWRlbnRpZnkgW1BJRF0gLSBSZXBvcnQgbmV0d29yayBuYW1lc3BhY2VzIG5hbWVzIGZvciBwcm9jZXNzCisuc3AKK1RoaXMgY29tbWFuZCB3YWxrcyB0aHJvdWdoIC92YXIvcnVuL25ldG5zIGFuZCBmaW5kcyBhbGwgdGhlIG5ldHdvcmsKK25hbWVzcGFjZSBuYW1lcyBmb3IgbmV0d29yayBuYW1lc3BhY2Ugb2YgdGhlIHNwZWNpZmllZCBwcm9jZXNzLCBpZiBQSUQgaXMKK25vdCBzcGVjaWZpZWQgdGhlbiB0aGUgY3VycmVudCBwcm9jZXNzIHdpbGwgYmUgdXNlZC4KKworLlRQCisuQiBpcCBuZXRucyBwaWRzIE5BTUUgLSBSZXBvcnQgcHJvY2Vzc2VzIGluIHRoZSBuYW1lZCBuZXR3b3JrIG5hbWVzcGFjZQorLnNwCitUaGlzIGNvbW1hbmQgd2Fsa3MgdGhyb3VnaCBwcm9jIGFuZCBmaW5kcyBhbGwgb2YgdGhlIHByb2Nlc3Mgd2hvIGhhdmUKK3RoZSBuYW1lZCBuZXR3b3JrIG5hbWVzcGFjZSBhcyB0aGVpciBwcmltYXJ5IG5ldHdvcmsgbmFtZXNwYWNlLgorCisuVFAKKy5CIGlwIFstYWxsXSBuZXRucyBleGVjIFsgTkFNRSBdIGNtZCAuLi4gLSBSdW4gY21kIGluIHRoZSBuYW1lZCBuZXR3b3JrIG5hbWVzcGFjZQorLnNwCitUaGlzIGNvbW1hbmQgYWxsb3dzIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBuZXR3b3JrIG5hbWVzcGFjZSB1bmF3YXJlCit0byBiZSBydW4gaW4gc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgbmV0d29yayBuYW1lc3BhY2Ugd2l0aAorYWxsIG9mIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIG5ldHdvcmsgbmFtZXNwYWNlIGFwcGVhcmluZworaW4gdGhlIGN1c3RvbWFyeSBnbG9iYWwgbG9jYXRpb25zLiBBIG5ldHdvcmsgbmFtZXNwYWNlIGFuZCBiaW5kIG1vdW50cworYXJlIHVzZWQgdG8gbW92ZSBmaWxlcyBmcm9tIHRoZWlyIG5ldHdvcmsgbmFtZXNwYWNlIHNwZWNpZmljIGxvY2F0aW9uCit0byB0aGVpciBkZWZhdWx0IGxvY2F0aW9ucyB3aXRob3V0IGFmZmVjdGluZyBvdGhlciBwcm9jZXNzZXMuCisKK0lmCisuQiAtYWxsCitvcHRpb24gd2FzIHNwZWNpZmllZCB0aGVuCisuQiBjbWQKK3dpbGwgYmUgZXhlY3V0ZWQgc3luY2hyb25vdXNseSBvbiB0aGUgZWFjaCBuYW1lZCBuZXR3b3JrIG5hbWVzcGFjZSBldmVuIGlmCisuQiBjbWQKK2ZhaWxzIG9uIHNvbWUgb2YgdGhlbS4gTmV0d29yayBuYW1lc3BhY2UgbmFtZSBpcyBwcmludGVkIG9uIGVhY2gKKy5CIGNtZAorZXhlY3V0aW5nLgorCisuVFAKKy5CIGlwIG5ldG5zIG1vbml0b3IgLSBSZXBvcnQgYXMgbmV0d29yayBuYW1lc3BhY2UgbmFtZXMgYXJlIGFkZGVkIGFuZCBkZWxldGVkCisuc3AKK1RoaXMgY29tbWFuZCB3YXRjaGVzIG5ldHdvcmsgbmFtZXNwYWNlIG5hbWUgYWRkaXRpb24gYW5kIGRlbGV0aW9uIGV2ZW50cworYW5kIHByaW50cyBhIGxpbmUgZm9yIGVhY2ggZXZlbnQgaXQgc2Vlcy4KKworLlRQCisuQiBpcCBuZXRucyBsaXN0LWlkIC0gbGlzdCBuZXR3b3JrIG5hbWVzcGFjZSBpZHMgKG5zaWQpCisuc3AKK05ldHdvcmsgbmFtZXNwYWNlIGlkcyBhcmUgdXNlZCB0byBpZGVudGlmeSBhIHBlZXIgbmV0d29yayBuYW1lc3BhY2UuIFRoaXMKK2NvbW1hbmQgZGlzcGxheXMgbnNpZCBvZiB0aGUgY3VycmVudCBuZXR3b3JrIG5hbWVzcGFjZSBhbmQgcHJvdmlkZXMgdGhlCitjb3JyZXNwb25kaW5nIGlwcm91dGUyIG5ldG5zIG5hbWUgKGZyb20gL3Zhci9ydW4vbmV0bnMpIGlmIGFueS4KKworLlNIIEVYQU1QTEVTCisuUFAKK2lwIG5ldG5zIGxpc3QKKy5SUworU2hvd3MgdGhlIGxpc3Qgb2YgY3VycmVudCBuYW1lZCBuZXR3b3JrIG5hbWVzcGFjZXMKKy5SRQorLlBQCitpcCBuZXRucyBhZGQgdnBuCisuUlMKK0NyZWF0ZXMgYSBuZXR3b3JrIG5hbWVzcGFjZSBhbmQgbmFtZXMgaXQgdnBuCisuUkUKKy5QUAoraXAgbmV0bnMgZXhlYyB2cG4gaXAgbGluayBzZXQgbG8gdXAKKy5SUworQnJpbmcgdXAgdGhlIGxvb3BiYWNrIGludGVyZmFjZSBpbiB0aGUgdnBuIG5ldHdvcmsgbmFtZXNwYWNlLgorLlJFCisKKy5TSCBTRUUgQUxTTworLmJyCisuQlIgaXAgKDgpCisKKy5TSCBBVVRIT1IKK09yaWdpbmFsIE1hbnBhZ2UgYnkgRXJpYyBXLiBCaWVkZXJtYW4KZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L2lwLW50YWJsZS44IGIvaXByb3V0ZTIvbWFuL21hbjgvaXAtbnRhYmxlLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYyZTU4OQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L2lwLW50YWJsZS44CkBAIC0wLDAgKzEsMTAxIEBACisuVEggSVBcLU5UQUJMRSA4ICIyMCBEZWMgMjAxMSIgImlwcm91dGUyIiAiTGludXgiCisuU0ggIk5BTUUiCitpcC1udGFibGUgLSBuZWlnaGJvdXIgdGFibGUgY29uZmlndXJhdGlvbgorLlNIICJTWU5PUFNJUyIKKy5zcAorLmFkIGwKKy5pbiArOAorLnRpIC04CisuQiBpcAorLlJJICJbICIgT1BUSU9OUyAiIF0iCisuQiBhZGRyZXNzCisuUkkgIiB7ICIgQ09NTUFORCAiIHwgIgorLkJSIGhlbHAgIiB9IgorLnNwCisKKy50aSAtOAorLkJSICJpcCBudGFibGUgY2hhbmdlIG5hbWUiCisuSVIgTkFNRSAiIFsgIgorLkIgZGV2CisuSVIgREVWICIgXSAiIFBBUk1TCisKKy50aSAtOAorLklSIFBBUk1TICIgOj0geyAiCisuQiB0aHJlc2gxCisuSVIgVkFMICIgfCAiCisuQiB0aHJlc2gyCisuSVIgVkFMICIgfCAiCisuQiB0aHJlc2gzCisuSVIgVkFMICIgfCAiCisuQiBnY19pbnQKKy5JUiBNU0VDICIgfCAiCisuQiBiYXNlX3JlYWNoYWJsZQorLklSIE1TRUMgIiB8ICIKKy5CIHJldHJhbnMKKy5JUiBNU0VDICIgfCAiICJnY19zdGFsZSBNU0VDICIgIiB8ICIKKy5CIGRlbGF5X3Byb2JlCisuSVIgTVNFQyAiIHwgIiAicXVldWUgTEVOICIgIiB8ICIKKy5CIGFwcF9wcm9icworLklSIFZBTCAiIHwgIgorLkIgdWNhc3RfcHJvYmVzCisuSVIgVkFMICIgfCAiICJtY2FzdF9wcm9iZXMgVkFMICIgIiB8ICIKKy5CIGFueWNhc3RfZGVsYXkKKy5JUiBNU0VDICIgfCAiCisuQiBwcm94eV9kZWxheQorLklSIE1TRUMgIiB8ICIgInByb3h5X3F1ZXVlIExFTiAiICIgfCAiCisuQiBsb2NrdGltZQorLklSIE1TRUMgIiB9IgorCisudGkgLTgKKy5CUiAiaXAgbnRhYmxlIHNob3ciICIgWyAiCisuQiBkZXYKKy5JUiBERVYgIiBdIFsgIgorLkIgbmFtZQorLklSIE5BTUUgIiBdIgorCisuU0ggREVTQ1JJUFRJT04KKy5JIGlwIG50YWJsZQorY29udHJvbHMgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBuZWlnaGJvdXIgdGFibGVzLgorCisuU1MgaXAgbnRhYmxlIHNob3cgLSBsaXN0IHRoZSBpcCBuZWlnaGJvdXIgdGFibGVzCisKK1RoaXMgY29tbWFuZHMgZGlzcGxheXMgbmVpZ2hib3VyIHRhYmxlIHBhcmFtZXRlcnMgYW5kIHN0YXRpc3RpY3MuCisKKy5UUAorLkJJIGRldiAiIERFViIKK29ubHkgbGlzdCB0aGUgdGFibGUgYXR0YWNoZWQgdG8gdGhpcyBkZXZpY2UuCisKKy5UUAorLkJJIG5hbWUgIiBOQU1FIgorb25seSBsaXN0cyB0aGUgdGFibGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKworLlNTIGlwIG50YWJsZSBjaGFuZ2UgLSBtb2RpZnkgdGFibGUgcGFyYW1ldGVyCisKK1RoaXMgY29tbWFuZCBhbGxvd3MgbW9kaWZ5aW5nIHRhYmxlIHBhcmFtZXRlcnMgc3VjaCBhcyB0aW1lcnMgYW5kIHF1ZXVlIGxlbmd0aHMuCisuVFAKKy5CSSBuYW1lICIgTkFNRSIKK3RoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBtb2RpZnkuCisKKy5UUAorLkJJIGRldiAiIERFViIKK3RoZSBuYW1lIG9mIHRoZSBkZXZpY2UgdG8gbW9kaWZ5IHRoZSB0YWJsZSB2YWx1ZXMuCisKKy5TSCBFWEFNUExFUworLlBQCitpcCBudGFibGUgc2hvdyBkZXYgZXRoMAorLlJTIDQKK1Nob3dzIHRoZSBuZWlnaGJvdXIgdGFibGUgKElQdjQgQVJQIGFuZCBJUHY2IG5kaXNjKSBwYXJhbWV0ZXJzIG9uIGRldmljZSBldGgwLgorLlJFCisuUFAKK2lwIG50YWJsZSBjaGFuZ2UgbmFtZSBhcnBfY2FjaGUgcXVldWUgOCBkZXYgZXRoMAorLlJTIDQKK0NoYW5nZXMgdGhlIG51bWJlciBvZiBwYWNrZXRzIHF1ZXVlZCB3aGlsZSBhZGRyZXNzIGlzIGJlaW5nIHJlc29sdmVkIGZyb20gdGhlCitkZWZhdWx0IHZhbHVlICgzKSB0byA4IHBhY2tldHMuCisuUkUKKworLlNIIFNFRSBBTFNPCisuYnIKKy5CUiBpcCAoOCkKKworLlNIIEFVVEhPUgorTWFucGFnZSBieSBTdGVwaGVuIEhlbW1pbmdlcgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWFuL21hbjgvaXAtcm91dGUuOC5pbiBiL2lwcm91dGUyL21hbi9tYW44L2lwLXJvdXRlLjguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc2NGJmYwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L2lwLXJvdXRlLjguaW4KQEAgLTAsMCArMSw5MzIgQEAKKy5USCBJUFwtUk9VVEUgOCAiMTMgRGVjIDIwMTIiICJpcHJvdXRlMiIgIkxpbnV4IgorLlNIICJOQU1FIgoraXAtcm91dGUgXC0gcm91dGluZyB0YWJsZSBtYW5hZ2VtZW50CisuU0ggIlNZTk9QU0lTIgorLnNwCisuYWQgbAorLmluICs4CisudGkgLTgKKy5CIGlwCisuUkkgIlsgIiBpcC1PUFRJT05TICIgXSIKKy5CIHJvdXRlCisuUkkgIiB7ICIgQ09NTUFORCAiIHwgIgorLkJSIGhlbHAgIiB9IgorLnNwCisudGkgLTgKKworLnRpIC04CisuQlIgImlwIHJvdXRlIiAiIHsgIgorLkJSIGxpc3QgIiB8ICIgZmx1c2ggIiB9ICIKKy5JICBTRUxFQ1RPUgorCisudGkgLTgKKy5CUiAiaXAgcm91dGUgc2F2ZSIKKy5JIFNFTEVDVE9SCisKKy50aSAtOAorLkJSICJpcCByb3V0ZSByZXN0b3JlIgorCisudGkgLTgKKy5CICBpcCByb3V0ZSBnZXQKKy5JUiBBRERSRVNTICIgWyAiCisuQkkgZnJvbSAiIEFERFJFU1MgIiBpaWYgIiBTVFJJTkciCisuUkIgIiBdIFsgIiBvaWYKKy5JUiBTVFJJTkcgIiBdIFsgIgorLkIgIHRvcworLklSIFRPUyAiIF0iCisKKy50aSAtOAorLkJSICJpcCByb3V0ZSIgIiB7ICIgYWRkICIgfCAiIGRlbCAiIHwgIiBjaGFuZ2UgIiB8ICIgYXBwZW5kICIgfCAiXAorcmVwbGFjZSAiIH0gIgorLkkgIFJPVVRFCisKKy50aSAtOAorLklSIFNFTEVDVE9SICIgOj0gIgorLlJCICJbICIgcm9vdAorLklSIFBSRUZJWCAiIF0gWyAiCisuQiAgbWF0Y2gKKy5JUiBQUkVGSVggIiBdIFsgIgorLkIgIGV4YWN0CisuSVIgUFJFRklYICIgXSBbICIKKy5CICB0YWJsZQorLklSIFRBQkxFX0lEICIgXSBbICIKKy5CICBwcm90bworLklSIFJUUFJPVE8gIiBdIFsgIgorLkIgIHR5cGUKKy5JUiBUWVBFICIgXSBbICIKKy5CICBzY29wZQorLklSIFNDT1BFICIgXSIKKworLnRpIC04CisuSVIgUk9VVEUgIiA6PSAiIE5PREVfU1BFQyAiIFsgIiBJTkZPX1NQRUMgIiBdIgorCisudGkgLTgKKy5JUiBOT0RFX1NQRUMgIiA6PSBbICIgVFlQRSAiIF0gIiBQUkVGSVggIiBbIgorLkIgIHRvcworLklSIFRPUyAiIF0gWyAiCisuQiAgdGFibGUKKy5JUiBUQUJMRV9JRCAiIF0gWyAiCisuQiAgcHJvdG8KKy5JUiBSVFBST1RPICIgXSBbICIKKy5CICBzY29wZQorLklSIFNDT1BFICIgXSBbICIKKy5CICBtZXRyaWMKKy5JUiBNRVRSSUMgIiBdIgorCisudGkgLTgKKy5JUiBJTkZPX1NQRUMgIiA6PSAiICJOSCBPUFRJT05TIEZMQUdTIiAiIFsiCisuQiAgbmV4dGhvcAorLklSIE5IICIgXSAuLi4iCisKKy50aSAtOAorLklSIE5IICIgOj0gWyAiCisuQiAgZW5jYXAKKy5JUiBFTkNBUCAiIF0gWyAiCisuQiAgdmlhCitbCisuSVIgRkFNSUxZICIgXSAiIEFERFJFU1MgIiBdIFsgIgorLkIgIGRldgorLklSIFNUUklORyAiIF0gWyAiCisuQiAgd2VpZ2h0CisuSVIgTlVNQkVSICIgXSAiIE5IRkxBR1MKKworLnRpIC04CisuSVIgRkFNSUxZICIgOj0gWyAiCisuQlIgaW5ldCAiIHwgIiBpbmV0NiAiIHwgIiBpcHggIiB8ICIgZG5ldCAiIHwgIiBtcGxzICIgfCAiIGJyaWRnZSAiIHwgIiBsaW5rICIgXSIKKworLnRpIC04CisuSVIgT1BUSU9OUyAiIDo9ICIgRkxBR1MgIiBbICIKKy5CICBtdHUKKy5JUiBOVU1CRVIgIiBdIFsgIgorLkIgIGFkdm1zcworLklSIE5VTUJFUiAiIF0gWyAiCisuQiAgYXMKK1sKKy5CIHRvCitdCisuSVIgQUREUkVTUyAiIF0iCisuQiAgcnR0CisuSVIgVElNRSAiIF0gWyAiCisuQiAgcnR0dmFyCisuSVIgVElNRSAiIF0gWyAiCisuQiAgcmVvcmRlcmluZworLklSIE5VTUJFUiAiIF0gWyAiCisuQiAgd2luZG93CisuSVIgTlVNQkVSICIgXSBbICIKKy5CICBjd25kCisuSVIgTlVNQkVSICIgXSBbICIKKy5CICBzc3RocmVzaAorLklSIFJFQUxNICIgXSBbICIKKy5CICByZWFsbXMKKy5JUiBSRUFMTSAiIF0gWyAiCisuQiAgcnRvX21pbgorLklSIFRJTUUgIiBdIFsgIgorLkIgIGluaXRjd25kCisuSVIgTlVNQkVSICIgXSBbICIKKy5CICBpbml0cnduZAorLklSIE5VTUJFUiAiIF0gWyAiCisuQiAgZmVhdHVyZXMKKy5JUiBGRUFUVVJFUyAiIF0gWyAiCisuQiAgcXVpY2thY2sKKy5JUiBCT09MICIgXSBbICIKKy5CICBjb25nY3RsCisuSVIgTkFNRSAiIF0gWyAiCisuQiAgcHJlZgorLklSIFBSRUYgIiBdIFsgIgorLkIgIGV4cGlyZXMKKy5JUiBUSU1FICIgXSIKKworLnRpIC04CisuSVIgVFlQRSAiIDo9IFsgIgorLkJSIHVuaWNhc3QgIiB8ICIgbG9jYWwgIiB8ICIgYnJvYWRjYXN0ICIgfCAiIG11bHRpY2FzdCAiIHwgIlwKK3Rocm93ICIgfCAiIHVucmVhY2hhYmxlICIgfCAiIHByb2hpYml0ICIgfCAiIGJsYWNraG9sZSAiIHwgIiBuYXQgIiBdIgorCisudGkgLTgKKy5JUiBUQUJMRV9JRCAiIDo9IFsgIgorLkJSIGxvY2FsICJ8ICIgbWFpbiAiIHwgIiBkZWZhdWx0ICIgfCAiIGFsbCAiIHwiCisuSVIgTlVNQkVSICIgXSIKKworLnRpIC04CisuSVIgU0NPUEUgIiA6PSBbICIKKy5CUiBob3N0ICIgfCAiIGxpbmsgIiB8ICIgZ2xvYmFsICIgfCIKKy5JUiBOVU1CRVIgIiBdIgorCisudGkgLTgKKy5JUiBOSEZMQUdTICIgOj0gWyAiCisuQlIgb25saW5rICIgfCAiIHBlcnZhc2l2ZSAiIF0iCisKKy50aSAtOAorLklSIFJUUFJPVE8gIiA6PSBbICIKKy5CUiBrZXJuZWwgIiB8ICIgYm9vdCAiIHwgIiBzdGF0aWMgIiB8IgorLklSIE5VTUJFUiAiIF0iCisKKy50aSAtOAorLklSIEZFQVRVUkVTICIgOj0gWyAiCisuQlIgZWNuICIgfCBdIgorCisudGkgLTgKKy5JUiBQUkVGICIgOj0gWyAiCisuQlIgbG93ICIgfCAiIG1lZGl1bSAiIHwgIiBoaWdoICIgXSIKKworLnRpIC04CisuSVIgRU5DQVAgIiA6PSBbICIKKy5JUiBNUExTICIgfCAiIElQICIgXSIKKworLnRpIC04CisuSVIgRU5DQVBfTVBMUyAiIDo9ICIKKy5CUiBtcGxzICIgWyAiCisuSVIgTEFCRUwgIiBdIgorCisudGkgLTgKKy5JUiBFTkNBUF9JUCAiIDo9ICIKKy5CIGlwCisuQiBpZAorLklSIFRVTk5FTF9JRAorLkIgIGRzdAorLklSIFJFTU9URV9JUCAiIFsgIgorLkIgdG9zCisuSVIgVE9TICIgXSBbIgorLkIgIHR0bAorLklSIFRUTCAiIF0iCisKKy5TSCBERVNDUklQVElPTgorLkIgaXAgcm91dGUKK2lzIHVzZWQgdG8gbWFuaXB1bGF0ZSBlbnRyaWVzIGluIHRoZSBrZXJuZWwgcm91dGluZyB0YWJsZXMuCisuc3AKKy5CIFJvdXRlIHR5cGVzOgorCisuaW4gKzgKKy5CIHVuaWNhc3QKKy0gdGhlIHJvdXRlIGVudHJ5IGRlc2NyaWJlcyByZWFsIHBhdGhzIHRvIHRoZSBkZXN0aW5hdGlvbnMgY292ZXJlZAorYnkgdGhlIHJvdXRlIHByZWZpeC4KKworLnNwCisuQiB1bnJlYWNoYWJsZQorLSB0aGVzZSBkZXN0aW5hdGlvbnMgYXJlIHVucmVhY2hhYmxlLiBQYWNrZXRzIGFyZSBkaXNjYXJkZWQgYW5kIHRoZQorSUNNUCBtZXNzYWdlCisuSSBob3N0IHVucmVhY2hhYmxlCitpcyBnZW5lcmF0ZWQuCitUaGUgbG9jYWwgc2VuZGVycyBnZXQgYW4KKy5JIEVIT1NUVU5SRUFDSAorZXJyb3IuCisKKy5zcAorLkIgYmxhY2tob2xlCistIHRoZXNlIGRlc3RpbmF0aW9ucyBhcmUgdW5yZWFjaGFibGUuIFBhY2tldHMgYXJlIGRpc2NhcmRlZCBzaWxlbnRseS4KK1RoZSBsb2NhbCBzZW5kZXJzIGdldCBhbgorLkkgRUlOVkFMCitlcnJvci4KKworLnNwCisuQiBwcm9oaWJpdAorLSB0aGVzZSBkZXN0aW5hdGlvbnMgYXJlIHVucmVhY2hhYmxlLiBQYWNrZXRzIGFyZSBkaXNjYXJkZWQgYW5kIHRoZQorSUNNUCBtZXNzYWdlCisuSSBjb21tdW5pY2F0aW9uIGFkbWluaXN0cmF0aXZlbHkgcHJvaGliaXRlZAoraXMgZ2VuZXJhdGVkLiBUaGUgbG9jYWwgc2VuZGVycyBnZXQgYW4KKy5JIEVBQ0NFUworZXJyb3IuCisKKy5zcAorLkIgbG9jYWwKKy0gdGhlIGRlc3RpbmF0aW9ucyBhcmUgYXNzaWduZWQgdG8gdGhpcyBob3N0LiBUaGUgcGFja2V0cyBhcmUgbG9vcGVkCitiYWNrIGFuZCBkZWxpdmVyZWQgbG9jYWxseS4KKworLnNwCisuQiBicm9hZGNhc3QKKy0gdGhlIGRlc3RpbmF0aW9ucyBhcmUgYnJvYWRjYXN0IGFkZHJlc3Nlcy4gVGhlIHBhY2tldHMgYXJlIHNlbnQgYXMKK2xpbmsgYnJvYWRjYXN0cy4KKworLnNwCisuQiB0aHJvdworLSBhIHNwZWNpYWwgY29udHJvbCByb3V0ZSB1c2VkIHRvZ2V0aGVyIHdpdGggcG9saWN5IHJ1bGVzLiBJZiBzdWNoIGEKK3JvdXRlIGlzIHNlbGVjdGVkLCBsb29rdXAgaW4gdGhpcyB0YWJsZSBpcyB0ZXJtaW5hdGVkIHByZXRlbmRpbmcgdGhhdAorbm8gcm91dGUgd2FzIGZvdW5kLiBXaXRob3V0IHBvbGljeSByb3V0aW5nIGl0IGlzIGVxdWl2YWxlbnQgdG8gdGhlCithYnNlbmNlIG9mIHRoZSByb3V0ZSBpbiB0aGUgcm91dGluZyB0YWJsZS4gVGhlIHBhY2tldHMgYXJlIGRyb3BwZWQKK2FuZCB0aGUgSUNNUCBtZXNzYWdlCisuSSBuZXQgdW5yZWFjaGFibGUKK2lzIGdlbmVyYXRlZC4gVGhlIGxvY2FsIHNlbmRlcnMgZ2V0IGFuCisuSSBFTkVUVU5SRUFDSAorZXJyb3IuCisKKy5zcAorLkIgbmF0CistIGEgc3BlY2lhbCBOQVQgcm91dGUuIERlc3RpbmF0aW9ucyBjb3ZlcmVkIGJ5IHRoZSBwcmVmaXgKK2FyZSBjb25zaWRlcmVkIHRvIGJlIGR1bW15IChvciBleHRlcm5hbCkgYWRkcmVzc2VzIHdoaWNoIHJlcXVpcmUgdHJhbnNsYXRpb24KK3RvIHJlYWwgKG9yIGludGVybmFsKSBvbmVzIGJlZm9yZSBmb3J3YXJkaW5nLiBUaGUgYWRkcmVzc2VzIHRvIHRyYW5zbGF0ZSB0bworYXJlIHNlbGVjdGVkIHdpdGggdGhlIGF0dHJpYnV0ZQorLkJSICJ2aWEiIC4KKy5CIFdhcm5pbmc6CitSb3V0ZSBOQVQgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBpbiBMaW51eCAyLjYuCisKKy5zcAorLkIgYW55Y2FzdAorLlJJICItICIgIm5vdCBpbXBsZW1lbnRlZCIKK3RoZSBkZXN0aW5hdGlvbnMgYXJlCisuSSBhbnljYXN0CithZGRyZXNzZXMgYXNzaWduZWQgdG8gdGhpcyBob3N0LiBUaGV5IGFyZSBtYWlubHkgZXF1aXZhbGVudAordG8KKy5CIGxvY2FsCit3aXRoIG9uZSBkaWZmZXJlbmNlOiBzdWNoIGFkZHJlc3NlcyBhcmUgaW52YWxpZCB3aGVuIHVzZWQKK2FzIHRoZSBzb3VyY2UgYWRkcmVzcyBvZiBhbnkgcGFja2V0LgorCisuc3AKKy5CIG11bHRpY2FzdAorLSBhIHNwZWNpYWwgdHlwZSB1c2VkIGZvciBtdWx0aWNhc3Qgcm91dGluZy4gSXQgaXMgbm90IHByZXNlbnQgaW4KK25vcm1hbCByb3V0aW5nIHRhYmxlcy4KKy5pbiAtOAorCisuUAorLkIgUm91dGUgdGFibGVzOgorTGludXgtMi54IGNhbiBwYWNrIHJvdXRlcyBpbnRvIHNldmVyYWwgcm91dGluZyB0YWJsZXMgaWRlbnRpZmllZAorYnkgYSBudW1iZXIgaW4gdGhlIHJhbmdlIGZyb20gMSB0byAyXjMxIG9yIGJ5IG5hbWUgZnJvbSB0aGUgZmlsZQorLkIgQFNZU0NPTkZESVJAL3J0X3RhYmxlcworQnkgZGVmYXVsdCBhbGwgbm9ybWFsIHJvdXRlcyBhcmUgaW5zZXJ0ZWQgaW50byB0aGUKKy5CIG1haW4KK3RhYmxlIChJRCAyNTQpIGFuZCB0aGUga2VybmVsIG9ubHkgdXNlcyB0aGlzIHRhYmxlIHdoZW4gY2FsY3VsYXRpbmcgcm91dGVzLgorVmFsdWVzICgwLCAyNTMsIDI1NCwgYW5kIDI1NSkgYXJlIHJlc2VydmVkIGZvciBidWlsdC1pbiB1c2UuCisKKy5zcAorQWN0dWFsbHksIG9uZSBvdGhlciB0YWJsZSBhbHdheXMgZXhpc3RzLCB3aGljaCBpcyBpbnZpc2libGUgYnV0CitldmVuIG1vcmUgaW1wb3J0YW50LiBJdCBpcyB0aGUKKy5CIGxvY2FsCit0YWJsZSAoSUQgMjU1KS4gVGhpcyB0YWJsZQorY29uc2lzdHMgb2Ygcm91dGVzIGZvciBsb2NhbCBhbmQgYnJvYWRjYXN0IGFkZHJlc3Nlcy4gVGhlIGtlcm5lbCBtYWludGFpbnMKK3RoaXMgdGFibGUgYXV0b21hdGljYWxseSBhbmQgdGhlIGFkbWluaXN0cmF0b3IgdXN1YWxseSBuZWVkIG5vdCBtb2RpZnkgaXQKK29yIGV2ZW4gbG9vayBhdCBpdC4KKworVGhlIG11bHRpcGxlIHJvdXRpbmcgdGFibGVzIGVudGVyIHRoZSBnYW1lIHdoZW4KKy5JIHBvbGljeSByb3V0aW5nCitpcyB1c2VkLgorCisuVFAKK2lwIHJvdXRlIGFkZAorYWRkIG5ldyByb3V0ZQorLlRQCitpcCByb3V0ZSBjaGFuZ2UKK2NoYW5nZSByb3V0ZQorLlRQCitpcCByb3V0ZSByZXBsYWNlCitjaGFuZ2Ugb3IgYWRkIG5ldyBvbmUKKy5SUworLlRQCisuQkkgdG8gIiBUWVBFIFBSRUZJWCAiIChkZWZhdWx0KQordGhlIGRlc3RpbmF0aW9uIHByZWZpeCBvZiB0aGUgcm91dGUuIElmCisuSSBUWVBFCitpcyBvbWl0dGVkLAorLkIgaXAKK2Fzc3VtZXMgdHlwZQorLkJSICJ1bmljYXN0IiAuCitPdGhlciB2YWx1ZXMgb2YKKy5JIFRZUEUKK2FyZSBsaXN0ZWQgYWJvdmUuCisuSSBQUkVGSVgKK2lzIGFuIElQIG9yIElQdjYgYWRkcmVzcyBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgc2xhc2ggYW5kIHRoZQorcHJlZml4IGxlbmd0aC4gSWYgdGhlIGxlbmd0aCBvZiB0aGUgcHJlZml4IGlzIG1pc3NpbmcsCisuQiBpcAorYXNzdW1lcyBhIGZ1bGwtbGVuZ3RoIGhvc3Qgcm91dGUuIFRoZXJlIGlzIGFsc28gYSBzcGVjaWFsCisuSSBQUkVGSVgKKy5CIGRlZmF1bHQKKy0gd2hpY2ggaXMgZXF1aXZhbGVudCB0byBJUAorLkIgMC8wCitvciB0byBJUHY2CisuQlIgIjo6LzAiIC4KKworLlRQCisuQkkgdG9zICIgVE9TIgorLlRQCisuQkkgZHNmaWVsZCAiIFRPUyIKK3RoZSBUeXBlIE9mIFNlcnZpY2UgKFRPUykga2V5LiBUaGlzIGtleSBoYXMgbm8gYXNzb2NpYXRlZCBtYXNrIGFuZAordGhlIGxvbmdlc3QgbWF0Y2ggaXMgdW5kZXJzdG9vZCBhczogRmlyc3QsIGNvbXBhcmUgdGhlIFRPUworb2YgdGhlIHJvdXRlIGFuZCBvZiB0aGUgcGFja2V0LiBJZiB0aGV5IGFyZSBub3QgZXF1YWwsIHRoZW4gdGhlIHBhY2tldAorbWF5IHN0aWxsIG1hdGNoIGEgcm91dGUgd2l0aCBhIHplcm8gVE9TLgorLkkgVE9TCitpcyBlaXRoZXIgYW4gOCBiaXQgaGV4YWRlY2ltYWwgbnVtYmVyIG9yIGFuIGlkZW50aWZpZXIKK2Zyb20KKy5CUiAiQFNZU0NPTkZESVJAL3J0X2RzZmllbGQiIC4KKworLlRQCisuQkkgbWV0cmljICIgTlVNQkVSIgorLlRQCisuQkkgcHJlZmVyZW5jZSAiIE5VTUJFUiIKK3RoZSBwcmVmZXJlbmNlIHZhbHVlIG9mIHRoZSByb3V0ZS4KKy5JIE5VTUJFUgoraXMgYW4gYXJiaXRyYXJ5IDMyYml0IG51bWJlci4KKworLlRQCisuQkkgdGFibGUgIiBUQUJMRUlEIgordGhlIHRhYmxlIHRvIGFkZCB0aGlzIHJvdXRlIHRvLgorLkkgVEFCTEVJRAorbWF5IGJlIGEgbnVtYmVyIG9yIGEgc3RyaW5nIGZyb20gdGhlIGZpbGUKKy5CUiAiQFNZU0NPTkZESVJAL3J0X3RhYmxlcyIgLgorSWYgdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCwKKy5CIGlwCithc3N1bWVzIHRoZQorLkIgbWFpbgordGFibGUsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZgorLkJSIGxvY2FsICIsICIgYnJvYWRjYXN0ICIgYW5kICIgbmF0Cityb3V0ZXMsIHdoaWNoIGFyZSBwdXQgaW50byB0aGUKKy5CIGxvY2FsCit0YWJsZSBieSBkZWZhdWx0LgorCisuVFAKKy5CSSBkZXYgIiBOQU1FIgordGhlIG91dHB1dCBkZXZpY2UgbmFtZS4KKworLlRQCisuQkkgdmlhICIgWyBGQU1JTFkgXSBBRERSRVNTIgordGhlIGFkZHJlc3Mgb2YgdGhlIG5leHRob3Agcm91dGVyLCBpbiB0aGUgYWRkcmVzcyBmYW1pbHkgRkFNSUxZLgorQWN0dWFsbHksIHRoZSBzZW5zZSBvZiB0aGlzIGZpZWxkIGRlcGVuZHMgb24gdGhlIHJvdXRlIHR5cGUuICBGb3IKK25vcm1hbAorLkIgdW5pY2FzdAorcm91dGVzIGl0IGlzIGVpdGhlciB0aGUgdHJ1ZSBuZXh0IGhvcCByb3V0ZXIgb3IsIGlmIGl0IGlzIGEgZGlyZWN0Cityb3V0ZSBpbnN0YWxsZWQgaW4gQlNEIGNvbXBhdGliaWxpdHkgbW9kZSwgaXQgY2FuIGJlIGEgbG9jYWwgYWRkcmVzcworb2YgdGhlIGludGVyZmFjZS4gRm9yIE5BVCByb3V0ZXMgaXQgaXMgdGhlIGZpcnN0IGFkZHJlc3Mgb2YgdGhlIGJsb2NrCitvZiB0cmFuc2xhdGVkIElQIGRlc3RpbmF0aW9ucy4KKworLlRQCisuQkkgc3JjICIgQUREUkVTUyIKK3RoZSBzb3VyY2UgYWRkcmVzcyB0byBwcmVmZXIgd2hlbiBzZW5kaW5nIHRvIHRoZSBkZXN0aW5hdGlvbnMKK2NvdmVyZWQgYnkgdGhlIHJvdXRlIHByZWZpeC4KKworLlRQCisuQkkgcmVhbG0gIiBSRUFMTUlEIgordGhlIHJlYWxtIHRvIHdoaWNoIHRoaXMgcm91dGUgaXMgYXNzaWduZWQuCisuSSBSRUFMTUlECittYXkgYmUgYSBudW1iZXIgb3IgYSBzdHJpbmcgZnJvbSB0aGUgZmlsZQorLkJSICJAU1lTQ09ORkRJUkAvcnRfcmVhbG1zIiAuCisKKy5UUAorLkJJIG10dSAiIE1UVSIKKy5UUAorLkJJICJtdHUgbG9jayIgIiBNVFUiCit0aGUgTVRVIGFsb25nIHRoZSBwYXRoIHRvIHRoZSBkZXN0aW5hdGlvbi4gSWYgdGhlIG1vZGlmaWVyCisuQiBsb2NrCitpcyBub3QgdXNlZCwgdGhlIE1UVSBtYXkgYmUgdXBkYXRlZCBieSB0aGUga2VybmVsIGR1ZSB0bworUGF0aCBNVFUgRGlzY292ZXJ5LiBJZiB0aGUgbW9kaWZpZXIKKy5CIGxvY2sKK2lzIHVzZWQsIG5vIHBhdGggTVRVIGRpc2NvdmVyeSB3aWxsIGJlIHRyaWVkLCBhbGwgcGFja2V0cword2lsbCBiZSBzZW50IHdpdGhvdXQgdGhlIERGIGJpdCBpbiBJUHY0IGNhc2Ugb3IgZnJhZ21lbnRlZAordG8gTVRVIGZvciBJUHY2LgorCisuVFAKKy5CSSB3aW5kb3cgIiBOVU1CRVIiCit0aGUgbWF4aW1hbCB3aW5kb3cgZm9yIFRDUCB0byBhZHZlcnRpc2UgdG8gdGhlc2UgZGVzdGluYXRpb25zLAorbWVhc3VyZWQgaW4gYnl0ZXMuIEl0IGxpbWl0cyBtYXhpbWFsIGRhdGEgYnVyc3RzIHRoYXQgb3VyIFRDUAorcGVlcnMgYXJlIGFsbG93ZWQgdG8gc2VuZCB0byB1cy4KKworLlRQCisuQkkgcnR0ICIgVElNRSIKK3RoZSBpbml0aWFsIFJUVCAoJ1JvdW5kIFRyaXAgVGltZScpIGVzdGltYXRlLiBJZiBubyBzdWZmaXggaXMKK3NwZWNpZmllZCB0aGUgdW5pdHMgYXJlIHJhdyB2YWx1ZXMgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZQorcm91dGluZyBjb2RlIHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCBwcmV2aW91cyByZWxlYXNlcy4KK090aGVyd2lzZSBpZiBhIHN1ZmZpeCBvZiBzLCBzZWMgb3Igc2VjcyBpcyB1c2VkIHRvIHNwZWNpZnkKK3NlY29uZHMgYW5kIG1zLCBtc2VjIG9yIG1zZWNzIHRvIHNwZWNpZnkgbWlsbGlzZWNvbmRzLgorCisKKy5UUAorLkJJIHJ0dHZhciAiIFRJTUUgIiAiKDIuMy4xNSsgb25seSkiCit0aGUgaW5pdGlhbCBSVFQgdmFyaWFuY2UgZXN0aW1hdGUuIFZhbHVlcyBhcmUgc3BlY2lmaWVkIGFzIHdpdGgKKy5CSSBydHQKK2Fib3ZlLgorCisuVFAKKy5CSSBydG9fbWluICIgVElNRSAiICIoMi42LjIzKyBvbmx5KSIKK3RoZSBtaW5pbXVtIFRDUCBSZXRyYW5zbWlzc2lvbiBUaW1lT3V0IHRvIHVzZSB3aGVuIGNvbW11bmljYXRpbmcgd2l0aCB0aGlzCitkZXN0aW5hdGlvbi4gVmFsdWVzIGFyZSBzcGVjaWZpZWQgYXMgd2l0aAorLkJJIHJ0dAorYWJvdmUuCisKKy5UUAorLkJJIHNzdGhyZXNoICIgTlVNQkVSICIgIigyLjMuMTUrIG9ubHkpIgorYW4gZXN0aW1hdGUgZm9yIHRoZSBpbml0aWFsIHNsb3cgc3RhcnQgdGhyZXNob2xkLgorCisuVFAKKy5CSSBjd25kICIgTlVNQkVSICIgIigyLjMuMTUrIG9ubHkpIgordGhlIGNsYW1wIGZvciBjb25nZXN0aW9uIHdpbmRvdy4gSXQgaXMgaWdub3JlZCBpZiB0aGUKKy5CIGxvY2sKK2ZsYWcgaXMgbm90IHVzZWQuCisKKy5UUAorLkJJIGluaXRjd25kICIgTlVNQkVSICIgIigyLjUuNzArIG9ubHkpIgordGhlIGluaXRpYWwgY29uZ2VzdGlvbiB3aW5kb3cgc2l6ZSBmb3IgY29ubmVjdGlvbnMgdG8gdGhpcyBkZXN0aW5hdGlvbi4KK0FjdHVhbCB3aW5kb3cgc2l6ZSBpcyB0aGlzIHZhbHVlIG11bHRpcGxpZWQgYnkgdGhlIE1TUworKGBgTWF4aW1hbCBTZWdtZW50IFNpemUnJykgZm9yIHNhbWUgY29ubmVjdGlvbi4gVGhlIGRlZmF1bHQgaXMKK3plcm8sIG1lYW5pbmcgdG8gdXNlIHRoZSB2YWx1ZXMgc3BlY2lmaWVkIGluIFJGQzI0MTQuCisKKy5UUAorLkJJIGluaXRyd25kICIgTlVNQkVSICIgIigyLjYuMzMrIG9ubHkpIgordGhlIGluaXRpYWwgcmVjZWl2ZSB3aW5kb3cgc2l6ZSBmb3IgY29ubmVjdGlvbnMgdG8gdGhpcyBkZXN0aW5hdGlvbi4KK0FjdHVhbCB3aW5kb3cgc2l6ZSBpcyB0aGlzIHZhbHVlIG11bHRpcGxpZWQgYnkgdGhlIE1TUyBvZiB0aGUgY29ubmVjdGlvbi4KK1RoZSBkZWZhdWx0IHZhbHVlIGlzIHplcm8sIG1lYW5pbmcgdG8gdXNlIFNsb3cgU3RhcnQgdmFsdWUuCisKKy5UUAorLkJJIGZlYXR1cmVzICIgRkVBVFVSRVMgIiAoMy4xOCsgb25seSkKK0VuYWJsZSBvciBkaXNhYmxlIHBlci1yb3V0ZSBmZWF0dXJlcy4gT25seSBhdmFpbGFibGUgZmVhdHVyZSBhdCB0aGlzCit0aW1lIGlzCisuQiBlY24KK3RvIGVuYWJsZSBleHBsaWNpdCBjb25nZXN0aW9uIG5vdGlmaWNhdGlvbiB3aGVuIGluaXRpYXRpbmcgY29ubmVjdGlvbnMgdG8gdGhlCitnaXZlbiBkZXN0aW5hdGlvbiBuZXR3b3JrLgorV2hlbiByZXNwb25kaW5nIHRvIGEgY29ubmVjdGlvbiByZXF1ZXN0IGZyb20gdGhlIGdpdmVuIG5ldHdvcmssIGVjbiB3aWxsCithbHNvIGJlIHVzZWQgZXZlbiBpZiB0aGUKKy5CIG5ldC5pcHY0LnRjcF9lY24KK3N5c2N0bCBpcyBzZXQgdG8gMC4KKworLlRQCisuQkkgcXVpY2thY2sgIiBCT09MICIgIigzLjExKyBvbmx5KSIKK0VuYWJsZSBvciBkaXNhYmxlIHF1aWNrIGFjayBmb3IgY29ubmVjdGlvbnMgdG8gdGhpcyBkZXN0aW5hdGlvbi4KKworLlRQCisuQkkgY29uZ2N0bCAiIE5BTUUgIiAiKDMuMjArIG9ubHkpIgorLlRQCisuQkkgImNvbmdjdGwgbG9jayIgIiBOQU1FICIgIigzLjIwKyBvbmx5KSIKK1NldHMgYSBzcGVjaWZpYyBUQ1AgY29uZ2VzdGlvbiBjb250cm9sIGFsZ29yaXRobSBvbmx5IGZvciBhIGdpdmVuIGRlc3RpbmF0aW9uLgorSWYgbm90IHNwZWNpZmllZCwgTGludXgga2VlcHMgdGhlIGN1cnJlbnQgZ2xvYmFsIGRlZmF1bHQgVENQIGNvbmdlc3Rpb24gY29udHJvbAorYWxnb3JpdGhtLCBvciB0aGUgb25lIHNldCBmcm9tIHRoZSBhcHBsaWNhdGlvbi4gSWYgdGhlIG1vZGlmaWVyCisuQiBsb2NrCitpcyBub3QgdXNlZCwgYW4gYXBwbGljYXRpb24gbWF5IG5ldmVydGhlbGVzcyBvdmVyd3JpdGUgdGhlIHN1Z2dlc3RlZCBjb25nZXN0aW9uCitjb250cm9sIGFsZ29yaXRobSBmb3IgdGhhdCBkZXN0aW5hdGlvbi4gSWYgdGhlIG1vZGlmaWVyCisuQiBsb2NrCitpcyB1c2VkLCB0aGVuIGFuIGFwcGxpY2F0aW9uIGlzIG5vdCBhbGxvd2VkIHRvIG92ZXJ3cml0ZSB0aGUgc3BlY2lmaWVkIGNvbmdlc3Rpb24KK2NvbnRyb2wgYWxnb3JpdGhtIGZvciB0aGF0IGRlc3RpbmF0aW9uLCB0aHVzIGl0IHdpbGwgYmUgZW5mb3JjZWQvZ3VhcmFudGVlZCB0bwordXNlIHRoZSBwcm9wb3NlZCBhbGdvcml0aG0uCisKKy5UUAorLkJJIGFkdm1zcyAiIE5VTUJFUiAiICIoMi4zLjE1KyBvbmx5KSIKK3RoZSBNU1MgKCdNYXhpbWFsIFNlZ21lbnQgU2l6ZScpIHRvIGFkdmVydGlzZSB0byB0aGVzZQorZGVzdGluYXRpb25zIHdoZW4gZXN0YWJsaXNoaW5nIFRDUCBjb25uZWN0aW9ucy4gSWYgaXQgaXMgbm90IGdpdmVuLAorTGludXggdXNlcyBhIGRlZmF1bHQgdmFsdWUgY2FsY3VsYXRlZCBmcm9tIHRoZSBmaXJzdCBob3AgZGV2aWNlIE1UVS4KKyhJZiB0aGUgcGF0aCB0byB0aGVzZSBkZXN0aW5hdGlvbiBpcyBhc3ltbWV0cmljLCB0aGlzIGd1ZXNzIG1heSBiZSB3cm9uZy4pCisKKy5UUAorLkJJIHJlb3JkZXJpbmcgIiBOVU1CRVIgIiAiKDIuMy4xNSsgb25seSkiCitNYXhpbWFsIHJlb3JkZXJpbmcgb24gdGhlIHBhdGggdG8gdGhpcyBkZXN0aW5hdGlvbi4KK0lmIGl0IGlzIG5vdCBnaXZlbiwgTGludXggdXNlcyB0aGUgdmFsdWUgc2VsZWN0ZWQgd2l0aAorLkIgc3lzY3RsCit2YXJpYWJsZQorLkJSICJuZXQvaXB2NC90Y3BfcmVvcmRlcmluZyIgLgorCisuVFAKKy5CSSBuZXh0aG9wICIgTkVYVEhPUCIKK3RoZSBuZXh0aG9wIG9mIGEgbXVsdGlwYXRoIHJvdXRlLgorLkkgTkVYVEhPUAoraXMgYSBjb21wbGV4IHZhbHVlIHdpdGggaXRzIG93biBzeW50YXggc2ltaWxhciB0byB0aGUgdG9wIGxldmVsCithcmd1bWVudCBsaXN0czoKKworLmluICs4CisuQkkgdmlhICIgWyBGQU1JTFkgXSBBRERSRVNTIgorLSBpcyB0aGUgbmV4dGhvcCByb3V0ZXIuCisuc3AKKworLkJJIGRldiAiIE5BTUUiCistIGlzIHRoZSBvdXRwdXQgZGV2aWNlLgorLnNwCisKKy5CSSB3ZWlnaHQgIiBOVU1CRVIiCistIGlzIGEgd2VpZ2h0IGZvciB0aGlzIGVsZW1lbnQgb2YgYSBtdWx0aXBhdGgKK3JvdXRlIHJlZmxlY3RpbmcgaXRzIHJlbGF0aXZlIGJhbmR3aWR0aCBvciBxdWFsaXR5LgorLmluIC04CisKKy5UUAorLkJJIHNjb3BlICIgU0NPUEVfVkFMIgordGhlIHNjb3BlIG9mIHRoZSBkZXN0aW5hdGlvbnMgY292ZXJlZCBieSB0aGUgcm91dGUgcHJlZml4LgorLkkgU0NPUEVfVkFMCittYXkgYmUgYSBudW1iZXIgb3IgYSBzdHJpbmcgZnJvbSB0aGUgZmlsZQorLkJSICJAU1lTQ09ORkRJUkAvcnRfc2NvcGVzIiAuCitJZiB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkLAorLkIgaXAKK2Fzc3VtZXMgc2NvcGUKKy5CIGdsb2JhbAorZm9yIGFsbCBnYXRld2F5ZWQKKy5CIHVuaWNhc3QKK3JvdXRlcywgc2NvcGUKKy5CIGxpbmsKK2ZvciBkaXJlY3QKKy5CUiB1bmljYXN0ICIgYW5kICIgYnJvYWRjYXN0Cityb3V0ZXMgYW5kIHNjb3BlCisuQlIgaG9zdCAiIGZvciAiIGxvY2FsCityb3V0ZXMuCisKKy5UUAorLkJJIHByb3RvY29sICIgUlRQUk9UTyIKK3RoZSByb3V0aW5nIHByb3RvY29sIGlkZW50aWZpZXIgb2YgdGhpcyByb3V0ZS4KKy5JIFJUUFJPVE8KK21heSBiZSBhIG51bWJlciBvciBhIHN0cmluZyBmcm9tIHRoZSBmaWxlCisuQlIgIkBTWVNDT05GRElSQC9ydF9wcm90b3MiIC4KK0lmIHRoZSByb3V0aW5nIHByb3RvY29sIElEIGlzIG5vdCBnaXZlbiwKKy5CIGlwIGFzc3VtZXMgcHJvdG9jb2wKKy5CIGJvb3QKKyhpLmUuIGl0IGFzc3VtZXMgdGhlIHJvdXRlIHdhcyBhZGRlZCBieSBzb21lb25lIHdobyBkb2Vzbid0Cit1bmRlcnN0YW5kIHdoYXQgdGhleSBhcmUgZG9pbmcpLiBTZXZlcmFsIHByb3RvY29sIHZhbHVlcyBoYXZlCithIGZpeGVkIGludGVycHJldGF0aW9uLgorTmFtZWx5OgorCisuaW4gKzgKKy5CIHJlZGlyZWN0CistIHRoZSByb3V0ZSB3YXMgaW5zdGFsbGVkIGR1ZSB0byBhbiBJQ01QIHJlZGlyZWN0LgorLnNwCisKKy5CIGtlcm5lbAorLSB0aGUgcm91dGUgd2FzIGluc3RhbGxlZCBieSB0aGUga2VybmVsIGR1cmluZyBhdXRvY29uZmlndXJhdGlvbi4KKy5zcAorCisuQiBib290CistIHRoZSByb3V0ZSB3YXMgaW5zdGFsbGVkIGR1cmluZyB0aGUgYm9vdHVwIHNlcXVlbmNlLgorSWYgYSByb3V0aW5nIGRhZW1vbiBzdGFydHMsIGl0IHdpbGwgcHVyZ2UgYWxsIG9mIHRoZW0uCisuc3AKKworLkIgc3RhdGljCistIHRoZSByb3V0ZSB3YXMgaW5zdGFsbGVkIGJ5IHRoZSBhZG1pbmlzdHJhdG9yCit0byBvdmVycmlkZSBkeW5hbWljIHJvdXRpbmcuIFJvdXRpbmcgZGFlbW9uIHdpbGwgcmVzcGVjdCB0aGVtCithbmQsIHByb2JhYmx5LCBldmVuIGFkdmVydGlzZSB0aGVtIHRvIGl0cyBwZWVycy4KKy5zcAorCisuQiByYQorLSB0aGUgcm91dGUgd2FzIGluc3RhbGxlZCBieSBSb3V0ZXIgRGlzY292ZXJ5IHByb3RvY29sLgorLmluIC04CisKKy5zcAorVGhlIHJlc3Qgb2YgdGhlIHZhbHVlcyBhcmUgbm90IHJlc2VydmVkIGFuZCB0aGUgYWRtaW5pc3RyYXRvciBpcyBmcmVlCit0byBhc3NpZ24gKG9yIG5vdCB0byBhc3NpZ24pIHByb3RvY29sIHRhZ3MuCisKKy5UUAorLkIgb25saW5rCitwcmV0ZW5kIHRoYXQgdGhlIG5leHRob3AgaXMgZGlyZWN0bHkgYXR0YWNoZWQgdG8gdGhpcyBsaW5rLAorZXZlbiBpZiBpdCBkb2VzIG5vdCBtYXRjaCBhbnkgaW50ZXJmYWNlIHByZWZpeC4KKworLlRQCisuQkkgcHJlZiAiIFBSRUYiCit0aGUgSVB2NiByb3V0ZSBwcmVmZXJlbmNlLgorLkkgUFJFRgoraXMgYSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgcm91dGUgcHJlZmVyZW5jZSBhcyBkZWZpbmVkIGluIFJGQzQxOTEgZm9yIFJvdXRlcgorRGlzY292ZXJ5IG1lc3NhZ2VzLiBOYW1lbHk6CisKKy5pbiArOAorLkIgbG93CistIHRoZSByb3V0ZSBoYXMgYSBsb3dlc3QgcHJpb3JpdHkKKy5zcAorCisuQiBtZWRpdW0KKy0gdGhlIHJvdXRlIGhhcyBhIGRlZmF1bHQgcHJpb3JpdHkKKy5zcAorCisuQiBoaWdoCistIHRoZSByb3V0ZSBoYXMgYSBoaWdoZXN0IHByaW9yaXR5Cisuc3AKKworLlRQCisuQkkgZW5jYXAgIiBFTkNBUFRZUEUgRU5DQVBIRFIiCithdHRhY2ggdHVubmVsIGVuY2Fwc3VsYXRpb24gYXR0cmlidXRlcyB0byB0aGlzIHJvdXRlLgorLnNwCisuSSBFTkNBUFRZUEUKK2lzIGEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIHN1cHBvcnRlZCBlbmNhcHN1bGF0aW9uIHR5cGUuIE5hbWVseToKKworLmluICs4CisuQkkgbXBscworLSBlbmNhcHN1bGF0aW9uIHR5cGUgTVBMUworLnNwCisuQkkgaXAKKy0gSVAgZW5jYXBzdWxhdGlvbiAoR2VuZXZlLCBHUkUsIFZYTEFOLCAuLi4pCisuc3AKKworLmluIC04CisuSSBFTkNBUEhEUgoraXMgYSBzZXQgb2YgZW5jYXBzdWxhdGlvbiBhdHRyaWJ1dGVzIHNwZWNpZmljIHRvIHRoZQorLkkgRU5DQVBUWVBFLgorCisuaW4gKzgKKy5CIG1wbHMKKy5pbiArMgorLkkgTVBMU0xBQkVMCistIG1wbHMgbGFiZWwgc3RhY2sgd2l0aCBsYWJlbHMgc2VwYXJhdGVkIGJ5CisuSSAiLyIKKy5pbiAtMgorLnNwCisKKy5CIGlwCisuaW4gKzIKKy5CIGlkCisuSSBUVU5ORUxfSUQKKy5CICBkc3QKKy5JUiBSRU1PVEVfSVAgIiBbICIKKy5CIHRvcworLklSIFRPUyAiIF0gWyIKKy5CICB0dGwKKy5JUiBUVEwgIiBdIgorLmluIC0yCisuc3AKKworLmluIC04CisuUkUKKworLlRQCisuQkkgZXhwaXJlcyAiIFRJTUUgIiAiKDQuNCsgb25seSkiCit0aGUgcm91dGUgd2lsbCBiZSBkZWxldGVkIGFmdGVyIHRoZSBleHBpcmVzIHRpbWUuCisuQiBPbmx5CitzdXBwb3J0IElQdjYgYXQgcHJlc2VudC4KKworLlRQCitpcCByb3V0ZSBkZWxldGUKK2RlbGV0ZSByb3V0ZQorLlJTCisuQiBpcCByb3V0ZSBkZWwKK2hhcyB0aGUgc2FtZSBhcmd1bWVudHMgYXMKKy5CUiAiaXAgcm91dGUgYWRkIiAsCitidXQgdGhlaXIgc2VtYW50aWNzIGFyZSBhIGJpdCBkaWZmZXJlbnQuCisKK0tleSB2YWx1ZXMKKy5SQiAiKCIgdG8gIiwgIiB0b3MgIiwgIiBwcmVmZXJlbmNlICIgYW5kICIgdGFibGUgIikiCitzZWxlY3QgdGhlIHJvdXRlIHRvIGRlbGV0ZS4gSWYgb3B0aW9uYWwgYXR0cmlidXRlcyBhcmUgcHJlc2VudCwKKy5CIGlwCit2ZXJpZmllcyB0aGF0IHRoZXkgY29pbmNpZGUgd2l0aCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgcm91dGUgdG8gZGVsZXRlLgorSWYgbm8gcm91dGUgd2l0aCB0aGUgZ2l2ZW4ga2V5IGFuZCBhdHRyaWJ1dGVzIHdhcyBmb3VuZCwKKy5CIGlwIHJvdXRlIGRlbAorZmFpbHMuCisuUkUKKworLlRQCitpcCByb3V0ZSBzaG93CitsaXN0IHJvdXRlcworLlJTCit0aGUgY29tbWFuZCBkaXNwbGF5cyB0aGUgY29udGVudHMgb2YgdGhlIHJvdXRpbmcgdGFibGVzIG9yIHRoZSByb3V0ZShzKQorc2VsZWN0ZWQgYnkgc29tZSBjcml0ZXJpYS4KKworLlRQCisuQkkgdG8gIiBTRUxFQ1RPUiAiIChkZWZhdWx0KQorb25seSBzZWxlY3Qgcm91dGVzIGZyb20gdGhlIGdpdmVuIHJhbmdlIG9mIGRlc3RpbmF0aW9ucy4KKy5JIFNFTEVDVE9SCitjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBtb2RpZmllcgorLlJCICIoIiByb290ICIsICIgbWF0Y2ggIiBvciAiIGV4YWN0ICIpIgorYW5kIGEgcHJlZml4LgorLkJJIHJvb3QgIiBQUkVGSVgiCitzZWxlY3RzIHJvdXRlcyB3aXRoIHByZWZpeGVzIG5vdCBzaG9ydGVyIHRoYW4KKy5JUiBQUkVGSVggIi4iCitGLmUuCisuQkkgcm9vdCAiIDAvMCIKK3NlbGVjdHMgdGhlIGVudGlyZSByb3V0aW5nIHRhYmxlLgorLkJJIG1hdGNoICIgUFJFRklYIgorc2VsZWN0cyByb3V0ZXMgd2l0aCBwcmVmaXhlcyBub3QgbG9uZ2VyIHRoYW4KKy5JUiBQUkVGSVggIi4iCitGLmUuCisuQkkgbWF0Y2ggIiAxMC4wLzE2Igorc2VsZWN0cworLklSIDEwLjAvMTYgIiwiCisuSVIgMTAvOCAiIGFuZCAiIDAvMCAsCitidXQgaXQgZG9lcyBub3Qgc2VsZWN0CisuSVIgMTAuMS8xNiAiIGFuZCAiIDEwLjAuMC8yNCAuCitBbmQKKy5CSSBleGFjdCAiIFBSRUZJWCIKKyhvciBqdXN0CisuSVIgUFJFRklYICIpIgorc2VsZWN0cyByb3V0ZXMgd2l0aCB0aGlzIGV4YWN0IHByZWZpeC4gSWYgbmVpdGhlciBvZiB0aGVzZSBvcHRpb25zCithcmUgcHJlc2VudCwKKy5CIGlwCithc3N1bWVzCisuQkkgcm9vdCAiIDAvMCIKK2kuZS4gaXQgbGlzdHMgdGhlIGVudGlyZSB0YWJsZS4KKworLlRQCisuQkkgdG9zICIgVE9TIgorLlRQCisuQkkgZHNmaWVsZCAiIFRPUyIKK29ubHkgc2VsZWN0IHJvdXRlcyB3aXRoIHRoZSBnaXZlbiBUT1MuCisKKy5UUAorLkJJIHRhYmxlICIgVEFCTEVJRCIKK3Nob3cgdGhlIHJvdXRlcyBmcm9tIHRoaXMgdGFibGUocykuIFRoZSBkZWZhdWx0IHNldHRpbmcgaXMgdG8gc2hvdyB0YWJsZQorLkJSIG1haW4gIi4iCisuSSBUQUJMRUlECittYXkgZWl0aGVyIGJlIHRoZSBJRCBvZiBhIHJlYWwgdGFibGUgb3Igb25lIG9mIHRoZSBzcGVjaWFsIHZhbHVlczoKKy5zcAorLmluICs4CisuQiBhbGwKKy0gbGlzdCBhbGwgb2YgdGhlIHRhYmxlcy4KKy5zcAorLkIgY2FjaGUKKy0gZHVtcCB0aGUgcm91dGluZyBjYWNoZS4KKy5pbiAtOAorCisuVFAKKy5CIGNsb25lZAorLlRQCisuQiBjYWNoZWQKK2xpc3QgY2xvbmVkIHJvdXRlcyBpLmUuIHJvdXRlcyB3aGljaCB3ZXJlIGR5bmFtaWNhbGx5IGZvcmtlZCBmcm9tCitvdGhlciByb3V0ZXMgYmVjYXVzZSBzb21lIHJvdXRlIGF0dHJpYnV0ZSAoZi5lLiBNVFUpIHdhcyB1cGRhdGVkLgorQWN0dWFsbHksIGl0IGlzIGVxdWl2YWxlbnQgdG8KKy5CUiAidGFibGUgY2FjaGUiICIuIgorCisuVFAKKy5CSSBmcm9tICIgU0VMRUNUT1IiCit0aGUgc2FtZSBzeW50YXggYXMgZm9yCisuQlIgdG8gIiwiCitidXQgaXQgYmluZHMgdGhlIHNvdXJjZSBhZGRyZXNzIHJhbmdlIHJhdGhlciB0aGFuIGRlc3RpbmF0aW9ucy4KK05vdGUgdGhhdCB0aGUKKy5CIGZyb20KK29wdGlvbiBvbmx5IHdvcmtzIHdpdGggY2xvbmVkIHJvdXRlcy4KKworLlRQCisuQkkgcHJvdG9jb2wgIiBSVFBST1RPIgorb25seSBsaXN0IHJvdXRlcyBvZiB0aGlzIHByb3RvY29sLgorCisuVFAKKy5CSSBzY29wZSAiIFNDT1BFX1ZBTCIKK29ubHkgbGlzdCByb3V0ZXMgd2l0aCB0aGlzIHNjb3BlLgorCisuVFAKKy5CSSB0eXBlICIgVFlQRSIKK29ubHkgbGlzdCByb3V0ZXMgb2YgdGhpcyB0eXBlLgorCisuVFAKKy5CSSBkZXYgIiBOQU1FIgorb25seSBsaXN0IHJvdXRlcyBnb2luZyB2aWEgdGhpcyBkZXZpY2UuCisKKy5UUAorLkJJIHZpYSAiIFsgRkFNSUxZIF0gUFJFRklYIgorb25seSBsaXN0IHJvdXRlcyBnb2luZyB2aWEgdGhlIG5leHRob3Agcm91dGVycyBzZWxlY3RlZCBieQorLklSIFBSRUZJWCAiLiIKKworLlRQCisuQkkgc3JjICIgUFJFRklYIgorb25seSBsaXN0IHJvdXRlcyB3aXRoIHByZWZlcnJlZCBzb3VyY2UgYWRkcmVzc2VzIHNlbGVjdGVkCitieQorLklSIFBSRUZJWCAiLiIKKworLlRQCisuQkkgcmVhbG0gIiBSRUFMTUlEIgorLlRQCisuQkkgcmVhbG1zICIgRlJPTVJFQUxNL1RPUkVBTE0iCitvbmx5IGxpc3Qgcm91dGVzIHdpdGggdGhlc2UgcmVhbG1zLgorLlJFCisKKy5UUAoraXAgcm91dGUgZmx1c2gKK2ZsdXNoIHJvdXRpbmcgdGFibGVzCisuUlMKK3RoaXMgY29tbWFuZCBmbHVzaGVzIHJvdXRlcyBzZWxlY3RlZCBieSBzb21lIGNyaXRlcmlhLgorCisuc3AKK1RoZSBhcmd1bWVudHMgaGF2ZSB0aGUgc2FtZSBzeW50YXggYW5kIHNlbWFudGljcyBhcyB0aGUgYXJndW1lbnRzIG9mCisuQlIgImlwIHJvdXRlIHNob3ciICwKK2J1dCByb3V0aW5nIHRhYmxlcyBhcmUgbm90IGxpc3RlZCBidXQgcHVyZ2VkLiBUaGUgb25seSBkaWZmZXJlbmNlIGlzCit0aGUgZGVmYXVsdCBhY3Rpb246CisuQiBzaG93CitkdW1wcyBhbGwgdGhlIElQIG1haW4gcm91dGluZyB0YWJsZSBidXQKKy5CIGZsdXNoCitwcmludHMgdGhlIGhlbHBlciBwYWdlLgorCisuc3AKK1dpdGggdGhlCisuQiAtc3RhdGlzdGljcworb3B0aW9uLCB0aGUgY29tbWFuZCBiZWNvbWVzIHZlcmJvc2UuIEl0IHByaW50cyBvdXQgdGhlIG51bWJlciBvZgorZGVsZXRlZCByb3V0ZXMgYW5kIHRoZSBudW1iZXIgb2Ygcm91bmRzIG1hZGUgdG8gZmx1c2ggdGhlIHJvdXRpbmcKK3RhYmxlLiBJZiB0aGUgb3B0aW9uIGlzIGdpdmVuCit0d2ljZSwKKy5CIGlwIHJvdXRlIGZsdXNoCithbHNvIGR1bXBzIGFsbCB0aGUgZGVsZXRlZCByb3V0ZXMgaW4gdGhlIGZvcm1hdCBkZXNjcmliZWQgaW4gdGhlCitwcmV2aW91cyBzdWJzZWN0aW9uLgorLlJFCisKKy5UUAoraXAgcm91dGUgZ2V0CitnZXQgYSBzaW5nbGUgcm91dGUKKy5SUwordGhpcyBjb21tYW5kIGdldHMgYSBzaW5nbGUgcm91dGUgdG8gYSBkZXN0aW5hdGlvbiBhbmQgcHJpbnRzIGl0cworY29udGVudHMgZXhhY3RseSBhcyB0aGUga2VybmVsIHNlZXMgaXQuCisKKy5UUAorLkJJIHRvICIgQUREUkVTUyAiIChkZWZhdWx0KQordGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MuCisKKy5UUAorLkJJIGZyb20gIiBBRERSRVNTIgordGhlIHNvdXJjZSBhZGRyZXNzLgorCisuVFAKKy5CSSB0b3MgIiBUT1MiCisuVFAKKy5CSSBkc2ZpZWxkICIgVE9TIgordGhlIFR5cGUgT2YgU2VydmljZS4KKworLlRQCisuQkkgaWlmICIgTkFNRSIKK3RoZSBkZXZpY2UgZnJvbSB3aGljaCB0aGlzIHBhY2tldCBpcyBleHBlY3RlZCB0byBhcnJpdmUuCisKKy5UUAorLkJJIG9pZiAiIE5BTUUiCitmb3JjZSB0aGUgb3V0cHV0IGRldmljZSBvbiB3aGljaCB0aGlzIHBhY2tldCB3aWxsIGJlIHJvdXRlZC4KKworLlRQCisuQiBjb25uZWN0ZWQKK2lmIG5vIHNvdXJjZSBhZGRyZXNzCisuUkIgIihvcHRpb24gIiBmcm9tICIpIgord2FzIGdpdmVuLCByZWxvb2t1cCB0aGUgcm91dGUgd2l0aCB0aGUgc291cmNlIHNldCB0byB0aGUgcHJlZmVycmVkCithZGRyZXNzIHJlY2VpdmVkIGZyb20gdGhlIGZpcnN0IGxvb2t1cC4KK0lmIHBvbGljeSByb3V0aW5nIGlzIHVzZWQsIGl0IG1heSBiZSBhIGRpZmZlcmVudCByb3V0ZS4KKworLlAKK05vdGUgdGhhdCB0aGlzIG9wZXJhdGlvbiBpcyBub3QgZXF1aXZhbGVudCB0bworLkJSICJpcCByb3V0ZSBzaG93IiAuCisuQiBzaG93CitzaG93cyBleGlzdGluZyByb3V0ZXMuCisuQiBnZXQKK3Jlc29sdmVzIHRoZW0gYW5kIGNyZWF0ZXMgbmV3IGNsb25lcyBpZiBuZWNlc3NhcnkuIEVzc2VudGlhbGx5LAorLkIgZ2V0CitpcyBlcXVpdmFsZW50IHRvIHNlbmRpbmcgYSBwYWNrZXQgYWxvbmcgdGhpcyBwYXRoLgorSWYgdGhlCisuQiBpaWYKK2FyZ3VtZW50IGlzIG5vdCBnaXZlbiwgdGhlIGtlcm5lbCBjcmVhdGVzIGEgcm91dGUKK3RvIG91dHB1dCBwYWNrZXRzIHRvd2FyZHMgdGhlIHJlcXVlc3RlZCBkZXN0aW5hdGlvbi4KK1RoaXMgaXMgZXF1aXZhbGVudCB0byBwaW5naW5nIHRoZSBkZXN0aW5hdGlvbgord2l0aCBhIHN1YnNlcXVlbnQKKy5CUiAiaXAgcm91dGUgbHMgY2FjaGUiICwKK2hvd2V2ZXIsIG5vIHBhY2tldHMgYXJlIGFjdHVhbGx5IHNlbnQuIFdpdGggdGhlCisuQiBpaWYKK2FyZ3VtZW50LCB0aGUga2VybmVsIHByZXRlbmRzIHRoYXQgYSBwYWNrZXQgYXJyaXZlZCBmcm9tIHRoaXMgaW50ZXJmYWNlCithbmQgc2VhcmNoZXMgZm9yIGEgcGF0aCB0byBmb3J3YXJkIHRoZSBwYWNrZXQuCisuUkUKKworLlRQCitpcCByb3V0ZSBzYXZlCitzYXZlIHJvdXRpbmcgdGFibGUgaW5mb3JtYXRpb24gdG8gc3Rkb3V0CisuUlMKK1RoaXMgY29tbWFuZCBiZWhhdmVzIGxpa2UKKy5CUiAiaXAgcm91dGUgc2hvdyIKK2V4Y2VwdCB0aGF0IHRoZSBvdXRwdXQgaXMgcmF3IGRhdGEgc3VpdGFibGUgZm9yIHBhc3NpbmcgdG8KKy5CUiAiaXAgcm91dGUgcmVzdG9yZSIgLgorLlJFCisKKy5UUAoraXAgcm91dGUgcmVzdG9yZQorcmVzdG9yZSByb3V0aW5nIHRhYmxlIGluZm9ybWF0aW9uIGZyb20gc3RkaW4KKy5SUworVGhpcyBjb21tYW5kIGV4cGVjdHMgdG8gcmVhZCBhIGRhdGEgc3RyZWFtIGFzIHJldHVybmVkIGZyb20KKy5CUiAiaXAgcm91dGUgc2F2ZSIgLgorSXQgd2lsbCBhdHRlbXB0IHRvIHJlc3RvcmUgdGhlIHJvdXRpbmcgdGFibGUgaW5mb3JtYXRpb24gZXhhY3RseSBhcworaXQgd2FzIGF0IHRoZSB0aW1lIG9mIHRoZSBzYXZlLCBzbyBhbnkgdHJhbnNsYXRpb24gb2YgaW5mb3JtYXRpb24KK2luIHRoZSBzdHJlYW0gKHN1Y2ggYXMgZGV2aWNlIGluZGV4ZXMpIG11c3QgYmUgZG9uZSBmaXJzdC4gQW55IGV4aXN0aW5nCityb3V0ZXMgYXJlIGxlZnQgdW5jaGFuZ2VkLiBBbnkgcm91dGVzIHNwZWNpZmllZCBpbiB0aGUgZGF0YSBzdHJlYW0gdGhhdAorYWxyZWFkeSBleGlzdCBpbiB0aGUgdGFibGUgd2lsbCBiZSBpZ25vcmVkLgorLlJFCisKKy5TSCBFWEFNUExFUworLlBQCitpcCBybworLlJTIDQKK1Nob3cgYWxsIHJvdXRlIGVudHJpZXMgaW4gdGhlIGtlcm5lbC4KKy5SRQorLlBQCitpcCByb3V0ZSBhZGQgZGVmYXVsdCB2aWEgMTkyLjE2OC4xLjEgZGV2IGV0aDAKKy5SUyA0CitBZGRzIGEgZGVmYXVsdCByb3V0ZSAoZm9yIGFsbCBhZGRyZXNzZXMpIHZpYSB0aGUgbG9jYWwgZ2F0ZXdheSAxOTIuMTY4LjEuMSB0aGF0IGNhbgorYmUgcmVhY2hlZCBvbiBkZXZpY2UgZXRoMC4KKy5SRQorLlBQCitpcCByb3V0ZSBhZGQgMTAuMS4xLjAvMzAgZW5jYXAgbXBscyAyMDAvMzAwIHZpYSAxMC4xLjEuMSBkZXYgZXRoMAorLlJTIDQKK0FkZHMgYW4gaXB2NCByb3V0ZSB3aXRoIG1wbHMgZW5jYXBzdWxhdGlvbiBhdHRyaWJ1dGVzIGF0dGFjaGVkIHRvIGl0LgorLlJFCisuU0ggU0VFIEFMU08KKy5icgorLkJSIGlwICg4KQorCisuU0ggQVVUSE9SCitPcmlnaW5hbCBNYW5wYWdlIGJ5IE1pY2hhaWwgTGl0dmFrIDxtY2lAb3dsLm9wZW53YWxsLmNvbT4KZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L2lwLXJ1bGUuOCBiL2lwcm91dGUyL21hbi9tYW44L2lwLXJ1bGUuOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzAwOGM2Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbWFuL21hbjgvaXAtcnVsZS44CkBAIC0wLDAgKzEsMjk3IEBACisuVEggSVBcLVJVTEUgOCAiMjAgRGVjIDIwMTEiICJpcHJvdXRlMiIgIkxpbnV4IgorLlNIICJOQU1FIgoraXAtcnVsZSBcLSByb3V0aW5nIHBvbGljeSBkYXRhYmFzZSBtYW5hZ2VtZW50CisuU0ggIlNZTk9QU0lTIgorLnNwCisuYWQgbAorLmluICs4CisudGkgLTgKKy5CIGlwCisuUkkgIlsgIiBPUFRJT05TICIgXSIKKy5CIHJ1bGUKKy5SSSAiIHsgIiBDT01NQU5EICIgfCAiCisuQlIgaGVscCAiIH0iCisuc3AKKworLnRpIC04CisuQiAgaXAgcnVsZQorLlJCICIgWyAiIGxpc3QgIiB8ICIgYWRkICIgfCAiIGRlbCAiIHwgIiBmbHVzaCAiIHwgIiBzYXZlICIgXSIKKy5JICBTRUxFQ1RPUiBBQ1RJT04KKworLnRpIC04CisuQiAgaXAgcnVsZSAgIiByZXN0b3JlICIKKworLnRpIC04CisuSVIgU0VMRUNUT1IgIiA6PSBbICIKKy5CICBmcm9tCisuSVIgUFJFRklYICIgXSBbICIKKy5CICB0bworLklSIFBSRUZJWCAiIF0gWyAiCisuQiAgdG9zCisuSVIgVE9TICIgXSBbICIKKy5CICBmd21hcmsKKy5JUiBGV01BUktbL01BU0tdICIgXSBbICIKKy5CICBpaWYKKy5JUiBTVFJJTkcgIiBdIFsgIgorLkIgIG9pZgorLklSIFNUUklORyAiIF0gWyAiCisuQiAgcHJlZgorLklSIE5VTUJFUiAiIF0iCisKKy50aSAtOAorLklSIEFDVElPTiAiIDo9IFsgIgorLkIgIHRhYmxlCisuSVIgVEFCTEVfSUQgIiBdIFsgIgorLkIgIG5hdAorLklSIEFERFJFU1MgIiBdIFsgIgorLkIgcmVhbG1zCisuUkkgIlsiIFNSQ1JFQUxNICIvXSIgRFNUUkVBTE0gIiBdIgorLkkgIFNVUFBSRVNTT1IKKworLnRpIC04CisuSVIgU1VQUFJFU1NPUiAiIDo9IFsgIgorLkIgIHN1cHByZXNzX3ByZWZpeGxlbmd0aAorLklSIE5VTUJFUiAiIF0gWyAiCisuQiAgc3VwcHJlc3NfaWZncm91cAorLklSIEdST1VQICIgXSIKKworLnRpIC04CisuSVIgVEFCTEVfSUQgIiA6PSBbICIKKy5CUiBsb2NhbCAiIHwgIiBtYWluICIgfCAiIGRlZmF1bHQgIiB8IgorLklSIE5VTUJFUiAiIF0iCisKKy5TSCBERVNDUklQVElPTgorLkkgaXAgcnVsZQorbWFuaXB1bGF0ZXMgcnVsZXMKK2luIHRoZSByb3V0aW5nIHBvbGljeSBkYXRhYmFzZSBjb250cm9sIHRoZSByb3V0ZSBzZWxlY3Rpb24gYWxnb3JpdGhtLgorCisuUAorQ2xhc3NpYyByb3V0aW5nIGFsZ29yaXRobXMgdXNlZCBpbiB0aGUgSW50ZXJuZXQgbWFrZSByb3V0aW5nIGRlY2lzaW9ucworYmFzZWQgb25seSBvbiB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBvZiBwYWNrZXRzIChhbmQgaW4gdGhlb3J5LAorYnV0IG5vdCBpbiBwcmFjdGljZSwgb24gdGhlIFRPUyBmaWVsZCkuCisKKy5QCitJbiBzb21lIGNpcmN1bXN0YW5jZXMgd2Ugd2FudCB0byByb3V0ZSBwYWNrZXRzIGRpZmZlcmVudGx5IGRlcGVuZGluZyBub3Qgb25seQorb24gZGVzdGluYXRpb24gYWRkcmVzc2VzLCBidXQgYWxzbyBvbiBvdGhlciBwYWNrZXQgZmllbGRzOiBzb3VyY2UgYWRkcmVzcywKK0lQIHByb3RvY29sLCB0cmFuc3BvcnQgcHJvdG9jb2wgcG9ydHMgb3IgZXZlbiBwYWNrZXQgcGF5bG9hZC4KK1RoaXMgdGFzayBpcyBjYWxsZWQgJ3BvbGljeSByb3V0aW5nJy4KKworLlAKK1RvIHNvbHZlIHRoaXMgdGFzaywgdGhlIGNvbnZlbnRpb25hbCBkZXN0aW5hdGlvbiBiYXNlZCByb3V0aW5nIHRhYmxlLCBvcmRlcmVkCithY2NvcmRpbmcgdG8gdGhlIGxvbmdlc3QgbWF0Y2ggcnVsZSwgaXMgcmVwbGFjZWQgd2l0aCBhICdyb3V0aW5nIHBvbGljeQorZGF0YWJhc2UnIChvciBSUERCKSwgd2hpY2ggc2VsZWN0cyByb3V0ZXMgYnkgZXhlY3V0aW5nIHNvbWUgc2V0IG9mIHJ1bGVzLgorCisuUAorRWFjaCBwb2xpY3kgcm91dGluZyBydWxlIGNvbnNpc3RzIG9mIGEKKy5CIHNlbGVjdG9yCithbmQgYW4KKy5CIGFjdGlvbiBwcmVkaWNhdGUuCitUaGUgUlBEQiBpcyBzY2FubmVkIGluIG9yZGVyIG9mIGRlY3JlYXNpbmcgcHJpb3JpdHkuIFRoZSBzZWxlY3Rvcgorb2YgZWFjaCBydWxlIGlzIGFwcGxpZWQgdG8ge3NvdXJjZSBhZGRyZXNzLCBkZXN0aW5hdGlvbiBhZGRyZXNzLCBpbmNvbWluZworaW50ZXJmYWNlLCB0b3MsIGZ3bWFya30gYW5kLCBpZiB0aGUgc2VsZWN0b3IgbWF0Y2hlcyB0aGUgcGFja2V0LAordGhlIGFjdGlvbiBpcyBwZXJmb3JtZWQuIFRoZSBhY3Rpb24gcHJlZGljYXRlIG1heSByZXR1cm4gd2l0aCBzdWNjZXNzLgorSW4gdGhpcyBjYXNlLCBpdCB3aWxsIGVpdGhlciBnaXZlIGEgcm91dGUgb3IgZmFpbHVyZSBpbmRpY2F0aW9uCithbmQgdGhlIFJQREIgbG9va3VwIGlzIHRlcm1pbmF0ZWQuIE90aGVyd2lzZSwgdGhlIFJQREIgcHJvZ3JhbQorY29udGludWVzIHdpdGggdGhlIG5leHQgcnVsZS4KKworLlAKK1NlbWFudGljYWxseSwgdGhlIG5hdHVyYWwgYWN0aW9uIGlzIHRvIHNlbGVjdCB0aGUgbmV4dGhvcCBhbmQgdGhlIG91dHB1dCBkZXZpY2UuCisKKy5QCitBdCBzdGFydHVwIHRpbWUgdGhlIGtlcm5lbCBjb25maWd1cmVzIHRoZSBkZWZhdWx0IFJQREIgY29uc2lzdGluZyBvZiB0aHJlZQorcnVsZXM6CisKKy5UUAorMS4KK1ByaW9yaXR5OiAwLCBTZWxlY3RvcjogbWF0Y2ggYW55dGhpbmcsIEFjdGlvbjogbG9va3VwIHJvdXRpbmcKK3RhYmxlCisuQiBsb2NhbAorKElEIDI1NSkuCitUaGUKKy5CIGxvY2FsCit0YWJsZSBpcyBhIHNwZWNpYWwgcm91dGluZyB0YWJsZSBjb250YWluaW5nCitoaWdoIHByaW9yaXR5IGNvbnRyb2wgcm91dGVzIGZvciBsb2NhbCBhbmQgYnJvYWRjYXN0IGFkZHJlc3Nlcy4KKy5zcAorUnVsZSAwIGlzIHNwZWNpYWwuIEl0IGNhbm5vdCBiZSBkZWxldGVkIG9yIG92ZXJyaWRkZW4uCisKKy5UUAorMi4KK1ByaW9yaXR5OiAzMjc2NiwgU2VsZWN0b3I6IG1hdGNoIGFueXRoaW5nLCBBY3Rpb246IGxvb2t1cCByb3V0aW5nCit0YWJsZQorLkIgbWFpbgorKElEIDI1NCkuCitUaGUKKy5CIG1haW4KK3RhYmxlIGlzIHRoZSBub3JtYWwgcm91dGluZyB0YWJsZSBjb250YWluaW5nIGFsbCBub24tcG9saWN5Cityb3V0ZXMuIFRoaXMgcnVsZSBtYXkgYmUgZGVsZXRlZCBhbmQvb3Igb3ZlcnJpZGRlbiB3aXRoIG90aGVyCitvbmVzIGJ5IHRoZSBhZG1pbmlzdHJhdG9yLgorCisuVFAKKzMuCitQcmlvcml0eTogMzI3NjcsIFNlbGVjdG9yOiBtYXRjaCBhbnl0aGluZywgQWN0aW9uOiBsb29rdXAgcm91dGluZwordGFibGUKKy5CIGRlZmF1bHQKKyhJRCAyNTMpLgorVGhlCisuQiBkZWZhdWx0Cit0YWJsZSBpcyBlbXB0eS4gSXQgaXMgcmVzZXJ2ZWQgZm9yIHNvbWUgcG9zdC1wcm9jZXNzaW5nIGlmIG5vIHByZXZpb3VzCitkZWZhdWx0IHJ1bGVzIHNlbGVjdGVkIHRoZSBwYWNrZXQuCitUaGlzIHJ1bGUgbWF5IGFsc28gYmUgZGVsZXRlZC4KKworLlAKK0VhY2ggUlBEQiBlbnRyeSBoYXMgYWRkaXRpb25hbAorYXR0cmlidXRlcy4gRi5lLiBlYWNoIHJ1bGUgaGFzIGEgcG9pbnRlciB0byBzb21lIHJvdXRpbmcKK3RhYmxlLiBOQVQgYW5kIG1hc3F1ZXJhZGluZyBydWxlcyBoYXZlIGFuIGF0dHJpYnV0ZSB0byBzZWxlY3QgbmV3IElQCithZGRyZXNzIHRvIHRyYW5zbGF0ZS9tYXNxdWVyYWRlLiBCZXNpZGVzIHRoYXQsIHJ1bGVzIGhhdmUgc29tZQorb3B0aW9uYWwgYXR0cmlidXRlcywgd2hpY2ggcm91dGVzIGhhdmUsIG5hbWVseQorLkJSICJyZWFsbXMiIC4KK1RoZXNlIHZhbHVlcyBkbyBub3Qgb3ZlcnJpZGUgdGhvc2UgY29udGFpbmVkIGluIHRoZSByb3V0aW5nIHRhYmxlcy4gVGhleQorYXJlIG9ubHkgdXNlZCBpZiB0aGUgcm91dGUgZGlkIG5vdCBzZWxlY3QgYW55IGF0dHJpYnV0ZXMuCisKKy5zcAorVGhlIFJQREIgbWF5IGNvbnRhaW4gcnVsZXMgb2YgdGhlIGZvbGxvd2luZyB0eXBlczoKKworLlJTCisuQiB1bmljYXN0CistIHRoZSBydWxlIHByZXNjcmliZXMgdG8gcmV0dXJuIHRoZSByb3V0ZSBmb3VuZAoraW4gdGhlIHJvdXRpbmcgdGFibGUgcmVmZXJlbmNlZCBieSB0aGUgcnVsZS4KKworLkIgYmxhY2tob2xlCistIHRoZSBydWxlIHByZXNjcmliZXMgdG8gc2lsZW50bHkgZHJvcCB0aGUgcGFja2V0LgorCisuQiB1bnJlYWNoYWJsZQorLSB0aGUgcnVsZSBwcmVzY3JpYmVzIHRvIGdlbmVyYXRlIGEgJ05ldHdvcmsgaXMgdW5yZWFjaGFibGUnIGVycm9yLgorCisuQiBwcm9oaWJpdAorLSB0aGUgcnVsZSBwcmVzY3JpYmVzIHRvIGdlbmVyYXRlICdDb21tdW5pY2F0aW9uIGlzIGFkbWluaXN0cmF0aXZlbHkKK3Byb2hpYml0ZWQnIGVycm9yLgorCisuQiBuYXQKKy0gdGhlIHJ1bGUgcHJlc2NyaWJlcyB0byB0cmFuc2xhdGUgdGhlIHNvdXJjZSBhZGRyZXNzCitvZiB0aGUgSVAgcGFja2V0IGludG8gc29tZSBvdGhlciB2YWx1ZS4KKy5SRQorCisuVFAKKy5CIGlwIHJ1bGUgYWRkIC0gaW5zZXJ0IGEgbmV3IHJ1bGUKKy5UUAorLkIgaXAgcnVsZSBkZWxldGUgLSBkZWxldGUgYSBydWxlCisuUlMKKy5UUAorLkJJIHR5cGUgIiBUWVBFICIgKGRlZmF1bHQpCit0aGUgdHlwZSBvZiB0aGlzIHJ1bGUuIFRoZSBsaXN0IG9mIHZhbGlkIHR5cGVzIHdhcyBnaXZlbiBpbiB0aGUgcHJldmlvdXMKK3N1YnNlY3Rpb24uCisKKy5UUAorLkJJIGZyb20gIiBQUkVGSVgiCitzZWxlY3QgdGhlIHNvdXJjZSBwcmVmaXggdG8gbWF0Y2guCisKKy5UUAorLkJJIHRvICIgUFJFRklYIgorc2VsZWN0IHRoZSBkZXN0aW5hdGlvbiBwcmVmaXggdG8gbWF0Y2guCisKKy5UUAorLkJJIGlpZiAiIE5BTUUiCitzZWxlY3QgdGhlIGluY29taW5nIGRldmljZSB0byBtYXRjaC4gSWYgdGhlIGludGVyZmFjZSBpcyBsb29wYmFjaywKK3RoZSBydWxlIG9ubHkgbWF0Y2hlcyBwYWNrZXRzIG9yaWdpbmF0aW5nIGZyb20gdGhpcyBob3N0LiBUaGlzIG1lYW5zCit0aGF0IHlvdSBtYXkgY3JlYXRlIHNlcGFyYXRlIHJvdXRpbmcgdGFibGVzIGZvciBmb3J3YXJkZWQgYW5kIGxvY2FsCitwYWNrZXRzIGFuZCwgaGVuY2UsIGNvbXBsZXRlbHkgc2VncmVnYXRlIHRoZW0uCisKKy5UUAorLkJJIG9pZiAiIE5BTUUiCitzZWxlY3QgdGhlIG91dGdvaW5nIGRldmljZSB0byBtYXRjaC4gVGhlIG91dGdvaW5nIGludGVyZmFjZSBpcyBvbmx5CithdmFpbGFibGUgZm9yIHBhY2tldHMgb3JpZ2luYXRpbmcgZnJvbSBsb2NhbCBzb2NrZXRzIHRoYXQgYXJlIGJvdW5kIHRvCithIGRldmljZS4KKworLlRQCisuQkkgdG9zICIgVE9TIgorLlRQCisuQkkgZHNmaWVsZCAiIFRPUyIKK3NlbGVjdCB0aGUgVE9TIHZhbHVlIHRvIG1hdGNoLgorCisuVFAKKy5CSSBmd21hcmsgIiBNQVJLIgorc2VsZWN0IHRoZQorLkIgZndtYXJrCit2YWx1ZSB0byBtYXRjaC4KKworLlRQCisuQkkgcHJpb3JpdHkgIiBQUkVGRVJFTkNFIgordGhlIHByaW9yaXR5IG9mIHRoaXMgcnVsZS4gRWFjaCBydWxlIHNob3VsZCBoYXZlIGFuIGV4cGxpY2l0bHkKK3NldAorLkkgdW5pcXVlCitwcmlvcml0eSB2YWx1ZS4KK1RoZSBvcHRpb25zIHByZWZlcmVuY2UgYW5kIG9yZGVyIGFyZSBzeW5vbnltcyB3aXRoIHByaW9yaXR5LgorCisuVFAKKy5CSSB0YWJsZSAiIFRBQkxFSUQiCit0aGUgcm91dGluZyB0YWJsZSBpZGVudGlmaWVyIHRvIGxvb2t1cCBpZiB0aGUgcnVsZSBzZWxlY3RvciBtYXRjaGVzLgorSXQgaXMgYWxzbyBwb3NzaWJsZSB0byB1c2UgbG9va3VwIGluc3RlYWQgb2YgdGFibGUuCisKKy5UUAorLkJJIHN1cHByZXNzX3ByZWZpeGxlbmd0aCAiIE5VTUJFUiIKK3JlamVjdCByb3V0aW5nIGRlY2lzaW9ucyB0aGF0IGhhdmUgYSBwcmVmaXggbGVuZ3RoIG9mIE5VTUJFUiBvciBsZXNzLgorCisuVFAKKy5CSSBzdXBwcmVzc19pZmdyb3VwICIgR1JPVVAiCityZWplY3Qgcm91dGluZyBkZWNpc2lvbnMgdGhhdCB1c2UgYSBkZXZpY2UgYmVsb25naW5nIHRvIHRoZSBpbnRlcmZhY2UKK2dyb3VwIEdST1VQLgorCisuVFAKKy5CSSByZWFsbXMgIiBGUk9NL1RPIgorUmVhbG1zIHRvIHNlbGVjdCBpZiB0aGUgcnVsZSBtYXRjaGVkIGFuZCB0aGUgcm91dGluZyB0YWJsZSBsb29rdXAKK3N1Y2NlZWRlZC4gUmVhbG0KKy5JIFRPCitpcyBvbmx5IHVzZWQgaWYgdGhlIHJvdXRlIGRpZCBub3Qgc2VsZWN0IGFueSByZWFsbS4KKworLlRQCisuQkkgbmF0ICIgQUREUkVTUyIKK1RoZSBiYXNlIG9mIHRoZSBJUCBhZGRyZXNzIGJsb2NrIHRvIHRyYW5zbGF0ZSAoZm9yIHNvdXJjZSBhZGRyZXNzZXMpLgorVGhlCisuSSBBRERSRVNTCittYXkgYmUgZWl0aGVyIHRoZSBzdGFydCBvZiB0aGUgYmxvY2sgb2YgTkFUIGFkZHJlc3NlcyAoc2VsZWN0ZWQgYnkgTkFUCityb3V0ZXMpIG9yIGEgbG9jYWwgaG9zdCBhZGRyZXNzIChvciBldmVuIHplcm8pLgorSW4gdGhlIGxhc3QgY2FzZSB0aGUgcm91dGVyIGRvZXMgbm90IHRyYW5zbGF0ZSB0aGUgcGFja2V0cywgYnV0CittYXNxdWVyYWRlcyB0aGVtIHRvIHRoaXMgYWRkcmVzcy4KK1VzaW5nIG1hcC10byBpbnN0ZWFkIG9mIG5hdCBtZWFucyB0aGUgc2FtZSB0aGluZy4KKworLkIgV2FybmluZzoKK0NoYW5nZXMgdG8gdGhlIFJQREIgbWFkZSB3aXRoIHRoZXNlIGNvbW1hbmRzIGRvIG5vdCBiZWNvbWUgYWN0aXZlCitpbW1lZGlhdGVseS4gSXQgaXMgYXNzdW1lZCB0aGF0IGFmdGVyIGEgc2NyaXB0IGZpbmlzaGVzIGEgYmF0Y2ggb2YKK3VwZGF0ZXMsIGl0IGZsdXNoZXMgdGhlIHJvdXRpbmcgY2FjaGUgd2l0aAorLkJSICJpcCByb3V0ZSBmbHVzaCBjYWNoZSIgLgorLlJFCisuVFAKKy5CIGlwIHJ1bGUgZmx1c2ggLSBhbHNvIGR1bXBzIGFsbCB0aGUgZGVsZXRlZCBydWxlcy4KK1RoaXMgY29tbWFuZCBoYXMgbm8gYXJndW1lbnRzLgorLlRQCisuQiBpcCBydWxlIHNob3cgLSBsaXN0IHJ1bGVzCitUaGlzIGNvbW1hbmQgaGFzIG5vIGFyZ3VtZW50cy4KK1RoZSBvcHRpb25zIGxpc3Qgb3IgbHN0IGFyZSBzeW5vbnltcyB3aXRoIHNob3cuCisKKy5UUAorLkIgaXAgcnVsZSBzYXZlCitzYXZlIHJ1bGVzIHRhYmxlIGluZm9ybWF0aW9uIHRvIHN0ZG91dAorLlJTCitUaGlzIGNvbW1hbmQgYmVoYXZlcyBsaWtlCisuQlIgImlwIHJ1bGUgc2hvdyIKK2V4Y2VwdCB0aGF0IHRoZSBvdXRwdXQgaXMgcmF3IGRhdGEgc3VpdGFibGUgZm9yIHBhc3NpbmcgdG8KKy5CUiAiaXAgcnVsZSByZXN0b3JlIiAuCisuUkUKKworLlRQCisuQiBpcCBydWxlIHJlc3RvcmUKK3Jlc3RvcmUgcnVsZXMgdGFibGUgaW5mb3JtYXRpb24gZnJvbSBzdGRpbgorLlJTCitUaGlzIGNvbW1hbmQgZXhwZWN0cyB0byByZWFkIGEgZGF0YSBzdHJlYW0gYXMgcmV0dXJuZWQgZnJvbQorLkJSICJpcCBydWxlIHNhdmUiIC4KK0l0IHdpbGwgYXR0ZW1wdCB0byByZXN0b3JlIHRoZSBydWxlcyB0YWJsZSBpbmZvcm1hdGlvbiBleGFjdGx5IGFzCitpdCB3YXMgYXQgdGhlIHRpbWUgb2YgdGhlIHNhdmUuIEFueSBydWxlcyBhbHJlYWR5IGluIHRoZSB0YWJsZSBhcmUKK2xlZnQgdW5jaGFuZ2VkLCBhbmQgZHVwbGljYXRlcyBhcmUgbm90IGlnbm9yZWQuCisuUkUKKworLlNIIFNFRSBBTFNPCisuYnIKKy5CUiBpcCAoOCkKKworLlNIIEFVVEhPUgorT3JpZ2luYWwgTWFucGFnZSBieSBNaWNoYWlsIExpdHZhayA8bWNpQG93bC5vcGVud2FsbC5jb20+CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9tYW4vbWFuOC9pcC10Y3BfbWV0cmljcy44IGIvaXByb3V0ZTIvbWFuL21hbjgvaXAtdGNwX21ldHJpY3MuOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDJkYWM4Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbWFuL21hbjgvaXAtdGNwX21ldHJpY3MuOApAQCAtMCwwICsxLDE0MyBAQAorLlRIICJJUFwtVENQX01FVFJJQ1MiIDggIjIzIEF1ZyAyMDEyIiAiaXByb3V0ZTIiICJMaW51eCIKKy5TSCAiTkFNRSIKK2lwLXRjcF9tZXRyaWNzIFwtIG1hbmFnZW1lbnQgZm9yIFRDUCBNZXRyaWNzCisuU0ggIlNZTk9QU0lTIgorLnNwCisuYWQgbAorLmluICs4CisudGkgLTgKKy5CIGlwCisuUkkgIlsgIiBPUFRJT05TICIgXSIKKy5CIHRjcF9tZXRyaWNzCisuUkkgInsgIiBDT01NQU5EICIgfCAiCisuQlIgaGVscCAiIH0iCisuc3AKKworLnRpIC04CisuQlIgImlwIHRjcF9tZXRyaWNzIiAiIHsgIiBzaG93ICIgfCAiIGZsdXNoICIgfQorLklSIFNFTEVDVE9SCisKKy50aSAtOAorLkJSICJpcCB0Y3BfbWV0cmljcyBkZWxldGUgIiBbICIgYWRkcmVzcyAiIF0KKy5JUiBBRERSRVNTCisKKy50aSAtOAorLklSIFNFTEVDVE9SICIgOj0gIgorLlJCICJbIFsgIiBhZGRyZXNzICIgXSAiCisuSVIgUFJFRklYICIgXSIKKworLlNIICJERVNDUklQVElPTiIKKy5CIGlwIHRjcF9tZXRyaWNzCitpcyB1c2VkIHRvIG1hbmlwdWxhdGUgZW50cmllcyBpbiB0aGUga2VybmVsIHRoYXQga2VlcCBUQ1AgaW5mb3JtYXRpb24KK2ZvciBJUHY0IGFuZCBJUHY2IGRlc3RpbmF0aW9ucy4gVGhlIGVudHJpZXMgYXJlIGNyZWF0ZWQgd2hlbgorVENQIHNvY2tldHMgd2FudCB0byBzaGFyZSBpbmZvcm1hdGlvbiBmb3IgZGVzdGluYXRpb25zIGFuZCBhcmUKK3N0b3JlZCBpbiBhIGNhY2hlIGtleWVkIGJ5IHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzLiBUaGUgc2F2ZWQKK2luZm9ybWF0aW9uIG1heSBpbmNsdWRlIHZhbHVlcyBmb3IgbWV0cmljcyAoaW5pdGlhbGx5IG9idGFpbmVkIGZyb20KK3JvdXRlcyksIHJlY2VudCBUU1ZBTCBmb3IgVElNRS1XQUlUIHJlY3ljbGluZyBwdXJwb3Nlcywgc3RhdGUgZm9yIHRoZQorRmFzdCBPcGVuIGZlYXR1cmUsIGV0Yy4KK0ZvciBwZXJmb3JtYW5jZSByZWFzb25zIHRoZSBjYWNoZSBjYW4gbm90IGdyb3cgYWJvdmUgY29uZmlndXJlZCBsaW1pdAorYW5kIHRoZSBvbGRlciBlbnRyaWVzIGFyZSByZXBsYWNlZCB3aXRoIGZyZXNoIGluZm9ybWF0aW9uLCBzb21ldGltZXMKK3JlY2xhaW1lZCBhbmQgdXNlZCBmb3IgbmV3IGRlc3RpbmF0aW9ucy4gVGhlIGtlcm5lbCBuZXZlciByZW1vdmVzCitlbnRyaWVzLCB0aGV5IGNhbiBiZSBmbHVzaGVkIG9ubHkgd2l0aCB0aGlzIHRvb2wuCisKKy5TUyBpcCB0Y3BfbWV0cmljcyBzaG93IC0gc2hvdyBjYWNoZWQgZW50cmllcworCisuVFAKKy5CSSBhZGRyZXNzICIgUFJFRklYICIgKGRlZmF1bHQpCitJUHY0L0lQdjYgcHJlZml4IG9yIGFkZHJlc3MuIElmIG5vIHByZWZpeCBpcyBwcm92aWRlZCBhbGwgZW50cmllcyBhcmUgc2hvd24uCisKKy5MUAorVGhlIG91dHB1dCBtYXkgY29udGFpbiB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOgorCisuQkkgYWdlICIgPFMuTU1NPiIgc2VjCistIHRpbWUgYWZ0ZXIgdGhlIGVudHJ5IHdhcyBjcmVhdGVkLCByZXNldCBvciB1cGRhdGVkIHdpdGggbWV0cmljcworZnJvbSBzb2NrZXRzLiBUaGUgZW50cnkgaXMgcmVzZXQgYW5kIHJlZnJlc2hlZCBvbiB1c2Ugd2l0aCBtZXRyaWNzIGZyb20KK3JvdXRlIGlmIHRoZSBtZXRyaWNzIGFyZSBub3QgdXBkYXRlZCBpbiBsYXN0IGhvdXIuIE5vdCBhbGwgY2FjaGVkIHZhbHVlcworcmVzZXQgdGhlIGFnZSBvbiB1cGRhdGUuCisKKy5CSSBjd25kICIgPE4+IgorLSBDV05EIG1ldHJpYyB2YWx1ZQorCisuQkkgZm9fY29va2llICIgPEhFWC1TVFJJTkc+IgorLSBDb29raWUgdmFsdWUgcmVjZWl2ZWQgaW4gU1lOLUFDSyB0byBiZSB1c2VkIGJ5IEZhc3QgT3BlbiBmb3IgbmV4dCBTWU5zCisKKy5CSSBmb19tc3MgIiA8Tj4iCistIE1TUyB2YWx1ZSByZWNlaXZlZCBpbiBTWU4tQUNLIHRvIGJlIHVzZWQgYnkgRmFzdCBPcGVuIGZvciBuZXh0IFNZTnMKKworLkJJIGZvX3N5bl9kcm9wcyAiIDxOPi88Uy5NTU0+IiAic2VjIGFnbyIKKy0gTnVtYmVyIG9mIGRyb3BzIG9mIGluaXRpYWwgb3V0Z29pbmcgRmFzdCBPcGVuIFNZTnMgd2l0aCBkYXRhCitkZXRlY3RlZCBieSBtb25pdG9yaW5nIHRoZSByZWNlaXZlZCBTWU4tQUNLIGFmdGVyIFNZTiByZXRyYW5zbWlzc2lvbi4KK1RoZSBzZWNvbmRzIHNob3cgdGhlIHRpbWUgYWZ0ZXIgbGFzdCBTWU4gZHJvcCBhbmQgdG9nZXRoZXIgd2l0aAordGhlIGRyb3AgY291bnQgY2FuIGJlIHVzZWQgdG8gZGlzYWJsZSBGYXN0IE9wZW4gZm9yIHNvbWUgdGltZS4KKworLkJJIHJlb3JkZXJpbmcgIiA8Tj4iCistIFJlb3JkZXJpbmcgbWV0cmljIHZhbHVlCisKKy5CSSBydHQgIiA8Tj4iIHVzCistIFJUVCBtZXRyaWMgdmFsdWUKKworLkJJIHJ0dHZhciAiIDxOPiIgdXMKKy0gUlRUVkFSIG1ldHJpYyB2YWx1ZQorCisuQkkgc3N0aHJlc2ggIiA8U1NUSFJFU0g+IgorLSBTU1RIUkVTSCBtZXRyaWMgdmFsdWUKKworLkJJIHR3X3RzICIgPFRTVkFMPi88U0VDPiIgInNlYyBhZ28iCistIHJlY2VudCBUU1ZBTCBhbmQgdGhlIHNlY29uZHMgYWZ0ZXIgc2F2aW5nIGl0IGludG8gVElNRS1XQUlUIHNvY2tldAorCisuU1MgaXAgdGNwX21ldHJpY3MgZGVsZXRlIC0gZGVsZXRlIHNpbmdsZSBlbnRyeQorCisuVFAKKy5CSSBhZGRyZXNzICIgQUREUkVTUyAiIChkZWZhdWx0KQorSVB2NC9JUHY2IGFkZHJlc3MuIFRoZSBhZGRyZXNzIGlzIGEgcmVxdWlyZWQgYXJndW1lbnQuCisKKy5TUyBpcCB0Y3BfbWV0cmljcyBmbHVzaCAtIGZsdXNoIGVudHJpZXMKK1RoaXMgY29tbWFuZCBmbHVzaGVzIHRoZSBlbnRyaWVzIHNlbGVjdGVkIGJ5IHNvbWUgY3JpdGVyaWEuCisKKy5QUAorVGhpcyBjb21tYW5kIGhhcyB0aGUgc2FtZSBhcmd1bWVudHMgYXMKKy5CIHNob3cuCisKKy5TSCAiRVhBTVBMRVMiCisuUFAKK2lwIHRjcF9tZXRyaWNzIHNob3cgYWRkcmVzcyAxOTIuMTY4LjAuMC8yNAorLlJTIDQKK1Nob3dzIHRoZSBlbnRyaWVzIGZvciBkZXN0aW5hdGlvbnMgZnJvbSBzdWJuZXQKKy5SRQorLlBQCitpcCB0Y3BfbWV0cmljcyBzaG93IDE5Mi4xNjguMC4wLzI0CisuUlMgNAorVGhlIHNhbWUgYnV0IGFkZHJlc3Mga2V5d29yZCBpcyBvcHRpb25hbAorLlJFCisuUFAKK2lwIHRjcF9tZXRyaWNzCisuUlMgNAorU2hvdyBhbGwgaXMgdGhlIGRlZmF1bHQgYWN0aW9uCisuUkUKKy5QUAoraXAgdGNwX21ldHJpY3MgZGVsZXRlIDE5Mi4xNjguMC4xCisuUlMgNAorUmVtb3ZlcyB0aGUgZW50cnkgZm9yIDE5Mi4xNjguMC4xIGZyb20gY2FjaGUuCisuUkUKKy5QUAoraXAgdGNwX21ldHJpY3MgZmx1c2ggMTkyLjE2OC4wLjAvMjQKKy5SUyA0CitSZW1vdmVzIGVudHJpZXMgZm9yIGRlc3RpbmF0aW9ucyBmcm9tIHN1Ym5ldAorLlJFCisuUFAKK2lwIHRjcF9tZXRyaWNzIGZsdXNoIGFsbAorLlJTIDQKK1JlbW92ZXMgYWxsIGVudHJpZXMgZnJvbSBjYWNoZQorLlJFCisuUFAKK2lwIC02IHRjcF9tZXRyaWNzIGZsdXNoIGFsbAorLlJTIDQKK1JlbW92ZXMgYWxsIElQdjYgZW50cmllcyBmcm9tIGNhY2hlIGtlZXBpbmcgdGhlIElQdjQgZW50cmllcy4KKy5SRQorCisuU0ggU0VFIEFMU08KKy5icgorLkJSIGlwICg4KQorCisuU0ggQVVUSE9SCitPcmlnaW5hbCBNYW5wYWdlIGJ5IEp1bGlhbiBBbmFzdGFzb3YgPGphQHNzaS5iZz4KZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L2lwLXRva2VuLjggYi9pcHJvdXRlMi9tYW4vbWFuOC9pcC10b2tlbi44Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YTNkMWUKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9tYW4vbWFuOC9pcC10b2tlbi44CkBAIC0wLDAgKzEsNjYgQEAKKy5USCBJUFwtVE9LRU4gOCAiMjggTWFyIDIwMTMiICJpcHJvdXRlMiIgIkxpbnV4IgorLlNIICJOQU1FIgoraXAtdG9rZW4gXC0gdG9rZW5pemVkIGludGVyZmFjZSBpZGVudGlmaWVyIHN1cHBvcnQKKy5TSCAiU1lOT1BTSVMiCisuc3AKKy5hZCBsCisuaW4gKzgKKy50aSAtOAorLkIgaXAgdG9rZW4KKy5SSSAiIHsgIiBDT01NQU5EICIgfCAiCisuQlIgaGVscCAiIH0iCisuc3AKKworLnRpIC04CisuQlIgImlwIHRva2VuIiAiIHsgIiBzZXQgIiB9ICIKKy5JUiBUT0tFTgorLkIgZGV2CisuSVIgREVWCisKKy50aSAtOAorLkJSICJpcCB0b2tlbiIgIiB7ICIgZ2V0ICIgfSAiCisuQiBkZXYKKy5JUiBERVYKKworLnRpIC04CisuQlIgImlwIHRva2VuIiAiIHsgIiBsaXN0ICIgfSIKKworLlNIICJERVNDUklQVElPTiIKK0lQdjYgdG9rZW5pemVkIGludGVyZmFjZSBpZGVudGlmaWVyIHN1cHBvcnQgaXMgdXNlZCBmb3IgYXNzaWduaW5nIHdlbGwta25vd24KK2hvc3QtcGFydCBhZGRyZXNzZXMgdG8gbm9kZXMgd2hpbHN0IHN0aWxsIG9idGFpbmluZyBhIGdsb2JhbCBuZXR3b3JrIHByZWZpeAorZnJvbSBSb3V0ZXIgYWR2ZXJ0aXNlbWVudHMuIFRoZSBwcmltYXJ5IHRhcmdldCBmb3IgdG9rZW5pemVkIGlkZW50aWZpZXJzIGFyZQorc2VydmVyIHBsYXRmb3JtcyB3aGVyZSBhZGRyZXNzZXMgYXJlIHVzdWFsbHkgbWFudWFsbHkgY29uZmlndXJlZCwgcmF0aGVyIHRoYW4KK3VzaW5nIERIQ1B2NiBvciBTTEFBQy4gQnkgdXNpbmcgdG9rZW5pemVkIGlkZW50aWZpZXJzLCBob3N0cyBjYW4gc3RpbGwKK2RldGVybWluZSB0aGVpciBuZXR3b3JrIHByZWZpeCBieSB1c2Ugb2YgU0xBQUMsIGJ1dCBtb3JlIHJlYWRpbHkgYmUKK2F1dG9tYXRpY2FsbHkgcmVudW1iZXJlZCBzaG91bGQgdGhlaXIgbmV0d29yayBwcmVmaXggY2hhbmdlIFsxXS4gVG9rZW5pemVkCitJUHY2IElkZW50aWZpZXJzIGFyZSBkZXNjcmliZWQgaW4gdGhlIGRyYWZ0CitbMV06IDxkcmFmdC1jaG93bi02bWFuLXRva2VuaXNlZC1pcHY2LWlkZW50aWZpZXJzLTAyPi4KKworLlNTIGlwIHRva2VuIHNldCAtIHNldCBhbiBpbnRlcmZhY2UgdG9rZW4KK3NldCB0aGUgaW50ZXJmYWNlIHRva2VuIHRvIHRoZSBrZXJuZWwuIE9uY2UgYSB0b2tlbiBpcyBzZXQsIGl0IGNhbm5vdCBiZQorcmVtb3ZlZCBmcm9tIHRoZSBpbnRlcmZhY2UsIG9ubHkgb3ZlcndyaXR0ZW4uCisuVFAKKy5JIFRPS0VOCit0aGUgaW50ZXJmYWNlIGlkZW50aWZpZXIgdG9rZW4gYWRkcmVzcy4KKy5UUAorLkJJIGRldiAiIERFViIKK3RoZSBuZXR3b3JraW5nIGludGVyZmFjZS4KKworLlNTIGlwIHRva2VuIGdldCAtIGdldCB0aGUgaW50ZXJmYWNlIHRva2VuIGZyb20gdGhlIGtlcm5lbAorc2hvdyBhIHRva2VuaXplZCBpbnRlcmZhY2UgaWRlbnRpZmllciBvZiBhIHBhcnRpY3VsYXIgbmV0d29ya2luZyBkZXZpY2UuCisuQiBBcmd1bWVudHM6Citjb2luY2lkZSB3aXRoIHRoZSBhcmd1bWVudHMgb2YKKy5CIGlwIHRva2VuIHNldAorYnV0IHRoZQorLkkgVE9LRU4KK211c3QgYmUgbGVmdCBvdXQuCisuU1MgaXAgdG9rZW4gbGlzdCAtIGxpc3QgYWxsIGludGVyZmFjZSB0b2tlbnMKK2xpc3QgYWxsIHRva2VuaXplZCBpbnRlcmZhY2UgaWRlbnRpZmllcnMgZm9yIHRoZSBuZXR3b3JraW5nIGludGVyZmFjZXMgZnJvbQordGhlIGtlcm5lbC4KKworLlNIIFNFRSBBTFNPCisuYnIKKy5CUiBpcCAoOCkKKworLlNIIEFVVEhPUgorTWFucGFnZSBieSBEYW5pZWwgQm9ya21hbm4KZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L2lwLXR1bm5lbC44IGIvaXByb3V0ZTIvbWFuL21hbjgvaXAtdHVubmVsLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI3NDZjYgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L2lwLXR1bm5lbC44CkBAIC0wLDAgKzEsMjYyIEBACisuVEggSVBcLVRVTk5FTCA4ICIyMCBEZWMgMjAxMSIgImlwcm91dGUyIiAiTGludXgiCisuU0ggIk5BTUUiCitpcC10dW5uZWwgLSB0dW5uZWwgY29uZmlndXJhdGlvbgorLlNIICJTWU5PUFNJUyIKKy5zcAorLmFkIGwKKy5pbiArOAorLnRpIC04CisuQiBpcCB0dW5uZWwgaGVscAorLnNwCisudGkgLTgKKy5CUiAiaXAgIgorLlJJICJbICIgT1BUSU9OUyAiIF0iCisuQlIgInR1bm5lbCIgIiB7ICIgYWRkICIgfCAiIGNoYW5nZSAiIHwgIiBkZWwgIiB8ICIgc2hvdyAiIHwgIiBwcmwgIiB9IgorLlJJICJbICIgTkFNRSAiIF0iCisuYnIKKy5SQiAiWyAiIG1vZGUKKy5JUiBNT0RFICIgXSBbICIKKy5CIHJlbW90ZQorLklSIEFERFIgIiBdIFsgIgorLkIgIGxvY2FsCisuSVIgQUREUiAiIF0iCisuYnIKKy5SQiAiWyBbIiBpICJ8IiBvICJdIiBzZXEgIiBdIFsgWyIgaSAifCIgbyAiXSIga2V5CisuSVIgS0VZICIgXSBbICIKKy5SQiAiWyIgaSAifCIgbyAiXSIgY3N1bSAiIF0gXSIKKy5icgorLlJCICJbICIgZW5jYXBsaW1pdAorLklSIEVMSU0gIiBdIgorLlJCICJbICIgdHRsICJ8IiBob3BsaW1pdAorLklSIFRUTCAiIF0iCisuYnIKKy5SQiAiWyAiIHRvcworLklSIFRPUyAiIF0gWyAiCisuQiBmbG93bGFiZWwKKy5JUiBGTE9XTEFCRUwgIiBdIgorLmJyCisuUkIgIlsgIiBwcmwtZGVmYXVsdAorLklSIEFERFIgIiBdIFsgIgorLkIgcHJsLW5vZGVmYXVsdAorLklSIEFERFIgIiBdIFsgIgorLkIgcHJsLWRlbGV0ZQorLklSIEFERFIgIiBdIgorLmJyCisuUkIgIlsgWyIgbm8gIl0iIHBtdHVkaXNjICIgXSIKKy5SQiAiWyAiIGRldgorLklSIFBIWVNfREVWICIgXSIKKworLnRpIC04CisuSVIgTU9ERSAiIDo9ICIKKy5SQiAiIHsgIiBpcGlwICIgfCAiIGdyZSAiIHwgIiBzaXQgIiB8ICIgaXNhdGFwICIgfCAiIHZ0aSAiIHwgIiBpcDZpcDYgIiB8ICIgaXBpcDYgIiB8ICIgaXA2Z3JlICIgfCAiIHZ0aTYgIiB8ICIgYW55ICIgfSIKKworLnRpIC04CisuSVIgQUREUiAiIDo9IHsgIiBJUF9BRERSRVNTICIgfCIKKy5CUiBhbnkgIiB9IgorCisudGkgLTgKKy5JUiBUT1MgIiA6PSB7ICIgU1RSSU5HICIgfCAiIDAwICIuLiIgZmYgIiB8IgorLkJSIGluaGVyaXQgIiB8IgorLkJJICJpbmhlcml0LyIgU1RSSU5HCisuUkIgInwiCisuQkkgImluaGVyaXQvIiAwMCAiLi4iIGZmCisuUkIgIn0iCisKKy50aSAtOAorLklSIEVMSU0gIiA6PSB7IgorLkJSIG5vbmUgIiB8ICIKKy5JUiAwICIuLiIgMjU1ICIgfSIKKworLnRpIC04CisudGkgLTgKKy5JUiBUVEwgIiA6PSB7ICIgMSAiLi4iIDI1NSAiIHwgIgorLkJSIGluaGVyaXQgIiB9IgorCisudGkgLTgKKy5JUiBLRVkgIiA6PSB7ICIgRE9UVEVEX1FVQUQgIiB8ICIgTlVNQkVSICIgfSIKKworLnRpIC04CisuSVIgVElNRSAiIDo9ICIgTlVNQkVSICJbc3xtc10iCisKKy5TSCBERVNDUklQVElPTgorLkIgdHVubmVsCitvYmplY3RzIGFyZSB0dW5uZWxzLCBlbmNhcHN1bGF0aW5nIHBhY2tldHMgaW4gSVAgcGFja2V0cyBhbmQgdGhlbgorc2VuZGluZyB0aGVtIG92ZXIgdGhlIElQIGluZnJhc3RydWN0dXJlLgorVGhlIGVuY2Fwc3VsYXRpbmcgKG9yIG91dGVyKSBhZGRyZXNzIGZhbWlseSBpcyBzcGVjaWZpZWQgYnkgdGhlCisuQiAtZgorb3B0aW9uLiBUaGUgZGVmYXVsdCBpcyBJUHY0LgorCisuVFAKKy5CIGlwIHR1bm5lbCBhZGQKK2FkZCBhIG5ldyB0dW5uZWwKKy5UUAorLkIgaXAgdHVubmVsIGNoYW5nZQorY2hhbmdlIGFuIGV4aXN0aW5nIHR1bm5lbAorLlRQCisuQiBpcCB0dW5uZWwgZGVsZXRlCitkZXN0cm95IGEgdHVubmVsCisuUlMKKy5UUAorLkJJIG5hbWUgIiBOQU1FICIgKGRlZmF1bHQpCitzZWxlY3QgdGhlIHR1bm5lbCBkZXZpY2UgbmFtZS4KKworLlRQCisuQkkgbW9kZSAiIE1PREUiCitzZXQgdGhlIHR1bm5lbCBtb2RlLiBBdmFpbGFibGUgbW9kZXMgZGVwZW5kIG9uIHRoZSBlbmNhcHN1bGF0aW5nIGFkZHJlc3MgZmFtaWx5LgorLmJyCitNb2RlcyBmb3IgSVB2NCBlbmNhcHN1bGF0aW9uIGF2YWlsYWJsZToKKy5CUiBpcGlwICIsICIgc2l0ICIsICIgaXNhdGFwICIsICIgdnRpICIsIGFuZCAiIGdyZSAiLiIKKy5icgorTW9kZXMgZm9yIElQdjYgZW5jYXBzdWxhdGlvbiBhdmFpbGFibGU6CisuQlIgaXA2aXA2ICIsICIgaXBpcDYgIiwgIiBpcDZncmUgIiwgIiB2dGk2ICIsIGFuZCAiIGFueSAiLiIKKworLlRQCisuQkkgcmVtb3RlICIgQUREUkVTUyIKK3NldCB0aGUgcmVtb3RlIGVuZHBvaW50IG9mIHRoZSB0dW5uZWwuCisKKy5UUAorLkJJIGxvY2FsICIgQUREUkVTUyIKK3NldCB0aGUgZml4ZWQgbG9jYWwgYWRkcmVzcyBmb3IgdHVubmVsZWQgcGFja2V0cy4KK0l0IG11c3QgYmUgYW4gYWRkcmVzcyBvbiBhbm90aGVyIGludGVyZmFjZSBvZiB0aGlzIGhvc3QuCisKKy5UUAorLkJJIHR0bCAiIE4iCisuVFAKKy5CSSBob3BsaW1pdCAiIE4iCitzZXQgYSBmaXhlZCBUVEwgKElQdjQpIG9yIGhvcGxpbWl0IChJUHY2KQorLkkgTgorb24gdHVubmVsZWQgcGFja2V0cy4KKy5JIE4KK2lzIGEgbnVtYmVyIGluIHRoZSByYW5nZSAxLS0yNTUuIDAgaXMgYSBzcGVjaWFsIHZhbHVlCittZWFuaW5nIHRoYXQgcGFja2V0cyBpbmhlcml0IHRoZSBUVEwgdmFsdWUuCitUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgSVB2NCB0dW5uZWxzIGlzOgorLkJSICJpbmhlcml0IiAuCitUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgSVB2NiB0dW5uZWxzIGlzOgorLkJSICI2NCIgLgorCisKKy5UUAorLkJJIHRvcyAiIFQiCisuVFAKKy5CSSBkc2ZpZWxkICIgVCIKKy5UUAorLkJJIHRjbGFzcyAiIFQiCitzZXQgdGhlIHR5cGUgb2Ygc2VydmljZSAoSVB2NCkgb3IgdHJhZmZpYyBjbGFzcyAoSVB2NikgZmllbGQgb24KK3R1bm5lbGVkIHBhY2tldHMsIHdoaWNoIGNhbiBiZSBzcGVjaWZpZWQgYXMgZWl0aGVyIGEgdHdvLWRpZ2l0CitoZXggdmFsdWUgKGUuZy4gYzApIG9yIGEgcHJlZGVmaW5lZCBzdHJpbmcgKGUuZy4gaW50ZXJuZXQpLgorVGhlIHZhbHVlCisuQiBpbmhlcml0CitjYXVzZXMgdGhlIGZpZWxkIHRvIGJlIGNvcGllZCBmcm9tIHRoZSBvcmlnaW5hbCBJUCBoZWFkZXIuIFRoZQordmFsdWVzCisuQkkgImluaGVyaXQvIiBTVFJJTkcKK29yCisuQkkgImluaGVyaXQvIiAwMCAiLi4iIGZmCit3aWxsIHNldCB0aGUgZmllbGQgdG8KKy5JIFNUUklORworb3IKKy5JUiAwMCAiLi4iIGZmCit3aGVuIHR1bm5lbGluZyBub24tSVAgcGFja2V0cy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMDAuCisKKy5UUAorLkJJIGRldiAiIE5BTUUiCitiaW5kIHRoZSB0dW5uZWwgdG8gdGhlIGRldmljZQorLkkgTkFNRQorc28gdGhhdCB0dW5uZWxlZCBwYWNrZXRzIHdpbGwgb25seSBiZSByb3V0ZWQgdmlhIHRoaXMgZGV2aWNlIGFuZCB3aWxsCitub3QgYmUgYWJsZSB0byBlc2NhcGUgdG8gYW5vdGhlciBkZXZpY2Ugd2hlbiB0aGUgcm91dGUgdG8gZW5kcG9pbnQKK2NoYW5nZXMuCisKKy5UUAorLkIgbm9wbXR1ZGlzYworZGlzYWJsZSBQYXRoIE1UVSBEaXNjb3Zlcnkgb24gdGhpcyB0dW5uZWwuCitJdCBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuIE5vdGUgdGhhdCBhIGZpeGVkIHR0bCBpcyBpbmNvbXBhdGlibGUKK3dpdGggdGhpcyBvcHRpb246IHR1bm5lbGluZyB3aXRoIGEgZml4ZWQgdHRsIGFsd2F5cyBtYWtlcyBwbXR1CitkaXNjb3ZlcnkuCisKKy5UUAorLkJJIGtleSAiIEsiCisuVFAKKy5CSSBpa2V5ICIgSyIKKy5UUAorLkJJIG9rZXkgIiBLIgorLlJCICggIiBvbmx5IEdSRSB0dW5uZWxzICIgKQordXNlIGtleWVkIEdSRSB3aXRoIGtleQorLklSIEsgIi4gIiBLCitpcyBlaXRoZXIgYSBudW1iZXIgb3IgYW4gSVAgYWRkcmVzcy1saWtlIGRvdHRlZCBxdWFkLgorVGhlCisuQiBrZXkKK3BhcmFtZXRlciBzZXRzIHRoZSBrZXkgdG8gdXNlIGluIGJvdGggZGlyZWN0aW9ucy4KK1RoZQorLkJSIGlrZXkgIiBhbmQgIiBva2V5CitwYXJhbWV0ZXJzIHNldCBkaWZmZXJlbnQga2V5cyBmb3IgaW5wdXQgYW5kIG91dHB1dC4KKworLlRQCisuQlIgY3N1bSAiLCAiIGljc3VtICIsICIgb2NzdW0KKy5SQiAoICIgb25seSBHUkUgdHVubmVscyAiICkKK2dlbmVyYXRlL3JlcXVpcmUgY2hlY2tzdW1zIGZvciB0dW5uZWxlZCBwYWNrZXRzLgorVGhlCisuQiBvY3N1bQorZmxhZyBjYWxjdWxhdGVzIGNoZWNrc3VtcyBmb3Igb3V0Z29pbmcgcGFja2V0cy4KK1RoZQorLkIgaWNzdW0KK2ZsYWcgcmVxdWlyZXMgdGhhdCBhbGwgaW5wdXQgcGFja2V0cyBoYXZlIHRoZSBjb3JyZWN0CitjaGVja3N1bS4gVGhlCisuQiBjc3VtCitmbGFnIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGNvbWJpbmF0aW9uCisuQlIgImljc3VtIG9jc3VtIiAuCisKKy5UUAorLkJSIHNlcSAiLCAiIGlzZXEgIiwgIiBvc2VxCisuUkIgKCAiIG9ubHkgR1JFIHR1bm5lbHMgIiApCitzZXJpYWxpemUgcGFja2V0cy4KK1RoZQorLkIgb3NlcQorZmxhZyBlbmFibGVzIHNlcXVlbmNpbmcgb2Ygb3V0Z29pbmcgcGFja2V0cy4KK1RoZQorLkIgaXNlcQorZmxhZyByZXF1aXJlcyB0aGF0IGFsbCBpbnB1dCBwYWNrZXRzIGFyZSBzZXJpYWxpemVkLgorVGhlCisuQiAgc2VxCitmbGFnIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGNvbWJpbmF0aW9uCisuQlIgImlzZXEgb3NlcSIgLgorLkIgSXQgZG9lc24ndCB3b3JrLiBEb24ndCB1c2UgaXQuCisKKy5UUAorLkJJIGVuY2FwbGltICIgRUxJTSIKKy5SQiAoICIgb25seSBJUHY2IHR1bm5lbHMgIiApCitzZXQgYSBmaXhlZCBlbmNhcHN1bGF0aW9uIGxpbWl0LiBEZWZhdWx0IGlzIDQuCisKKy5UUAorLkJJIGZsb3dsYWJlbCAiIEZMT1dMQUJFTCIKKy5SQiAoICIgb25seSBJUHY2IHR1bm5lbHMgIiApCitzZXQgYSBmaXhlZCBmbG93bGFiZWwuCisuUkUKKworLlRQCisuQiBpcCB0dW5uZWwgcHJsCitwb3RlbnRpYWwgcm91dGVyIGxpc3QgKElTQVRBUCBvbmx5KQorLlJTCisuVFAKKy5CSSBkZXYgIiBOQU1FIgorbWFuZGF0b3J5IGRldmljZSBuYW1lLgorCisuVFAKKy5CSSBwcmwtZGVmYXVsdCAiIEFERFIiCisuVFAKKy5CSSBwcmwtbm9kZWZhdWx0ICIgQUREUiIKKy5UUAorLkJJIHBybC1kZWxldGUgIiBBRERSIgorLlJCICJBZGQgb3IgZGVsZXRlICIgQUREUgorYXMgYSBwb3RlbnRpYWwgcm91dGVyIG9yIGRlZmF1bHQgcm91dGVyLgorLlJFCisKKy5UUAorLkIgaXAgdHVubmVsIHNob3cKK2xpc3QgdHVubmVscworVGhpcyBjb21tYW5kIGhhcyBubyBhcmd1bWVudHMuCisKKy5TSCBTRUUgQUxTTworLmJyCisuQlIgaXAgKDgpCisKKy5TSCBBVVRIT1IKK09yaWdpbmFsIE1hbnBhZ2UgYnkgTWljaGFpbCBMaXR2YWsgPG1jaUBvd2wub3BlbndhbGwuY29tPgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWFuL21hbjgvaXAteGZybS44IGIvaXByb3V0ZTIvbWFuL21hbjgvaXAteGZybS44Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZTA3MjgKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9tYW4vbWFuOC9pcC14ZnJtLjgKQEAgLTAsMCArMSw2OTQgQEAKKy5USCBJUFwtWEZSTSA4ICIyMCBEZWMgMjAxMSIgImlwcm91dGUyIiAiTGludXgiCisuU0ggIk5BTUUiCitpcC14ZnJtIFwtIHRyYW5zZm9ybSBjb25maWd1cmF0aW9uCisuU0ggIlNZTk9QU0lTIgorLnNwCisuYWQgbAorLmluICs4CisudGkgLTgKKy5CIGlwCisuUkkgIlsgIiBPUFRJT05TICIgXSIKKy5CIHhmcm0KKy5SSSAiIHsgIiBDT01NQU5EICIgfCAiCisuQlIgaGVscCAiIH0iCisuc3AKKworLnRpIC04CisuQiAiaXAgeGZybSIKKy5JUiBYRlJNLU9CSkVDVCAiIHsgIiBDT01NQU5EICIgfCAiCisuQlIgaGVscCAiIH0iCisuc3AKKworLnRpIC04CisuSVIgWEZSTS1PQkpFQ1QgIiA6PSIKKy5CUiBzdGF0ZSAiIHwgIiBwb2xpY3kgIiB8ICIgbW9uaXRvcgorLnNwCisKKy50aSAtOAorLkJSICJpcCB4ZnJtIHN0YXRlIiAiIHsgIiBhZGQgIiB8ICIgdXBkYXRlICIgfSAiCisuSVIgSUQgIiBbICIgQUxHTy1MSVNUICIgXSIKKy5SQiAiWyAiIG1vZGUKKy5JUiBNT0RFICIgXSIKKy5SQiAiWyAiIG1hcmsKKy5JIE1BUksKKy5SQiAiWyAiIG1hc2sKKy5JUiBNQVNLICIgXSBdIgorLlJCICJbICIgcmVxaWQKKy5JUiBSRVFJRCAiIF0iCisuUkIgIlsgIiBzZXEKKy5JUiBTRVEgIiBdIgorLlJCICJbICIgcmVwbGF5LXdpbmRvdworLklSIFNJWkUgIiBdIgorLlJCICJbICIgcmVwbGF5LXNlcQorLklSIFNFUSAiIF0iCisuUkIgIlsgIiByZXBsYXktb3NlcQorLklSIFNFUSAiIF0iCisuUkIgIlsgIiByZXBsYXktc2VxLWhpCisuSVIgU0VRICIgXSIKKy5SQiAiWyAiIHJlcGxheS1vc2VxLWhpCisuSVIgU0VRICIgXSIKKy5SQiAiWyAiIGZsYWcKKy5JUiBGTEFHLUxJU1QgIiBdIgorLlJCICJbICIgc2VsCisuSVIgU0VMRUNUT1IgIiBdIFsgIiBMSU1JVC1MSVNUICIgXSIKKy5SQiAiWyAiIGVuY2FwCisuSVIgRU5DQVAgIiBdIgorLlJCICJbICIgY29hCisuSVIgQUREUiAiWy8iIFBMRU4gIl0gXSIKKy5SQiAiWyAiIGN0eAorLklSIENUWCAiIF0iCisKKy50aSAtOAorLkIgImlwIHhmcm0gc3RhdGUgYWxsb2NzcGkiCisuSSBJRAorLlJCICJbICIgbW9kZQorLklSIE1PREUgIiBdIgorLlJCICJbICIgbWFyaworLkkgTUFSSworLlJCICJbICIgbWFzaworLklSIE1BU0sgIiBdIF0iCisuUkIgIlsgIiByZXFpZAorLklSIFJFUUlEICIgXSIKKy5SQiAiWyAiIHNlcQorLklSIFNFUSAiIF0iCisuUkIgIlsgIiBtaW4KKy5JIFNQSQorLkIgbWF4CisuSVIgU1BJICIgXSIKKworLnRpIC04CisuQlIgImlwIHhmcm0gc3RhdGUiICIgeyAiIGRlbGV0ZSAiIHwgIiBnZXQgIiB9ICIKKy5JIElECisuUkIgIlsgIiBtYXJrCisuSSBNQVJLCisuUkIgIlsgIiBtYXNrCisuSVIgTUFTSyAiIF0gXSIKKworLnRpIC04CisuQlIgImlwIHhmcm0gc3RhdGUiICIgeyAiIGRlbGV0ZWFsbCAiIHwgIiBsaXN0ICIgfSBbIgorLklSIElEICIgXSIKKy5SQiAiWyAiIG1vZGUKKy5JUiBNT0RFICIgXSIKKy5SQiAiWyAiIHJlcWlkCisuSVIgUkVRSUQgIiBdIgorLlJCICJbICIgZmxhZworLklSIEZMQUctTElTVCAiIF0iCisKKy50aSAtOAorLkJSICJpcCB4ZnJtIHN0YXRlIGZsdXNoIiAiIFsgIiBwcm90bworLklSIFhGUk0tUFJPVE8gIiBdIgorCisudGkgLTgKKy5CUiAiaXAgeGZybSBzdGF0ZSBjb3VudCIKKworLnRpIC04CisuSVIgSUQgIiA6PSIKKy5SQiAiWyAiIHNyYworLklSIEFERFIgIiBdIgorLlJCICJbICIgZHN0CisuSVIgQUREUiAiIF0iCisuUkIgIlsgIiBwcm90bworLklSIFhGUk0tUFJPVE8gIiBdIgorLlJCICJbICIgc3BpCisuSVIgU1BJICIgXSIKKworLnRpIC04CisuSVIgWEZSTS1QUk9UTyAiIDo9IgorLkJSIGVzcCAiIHwgIiBhaCAiIHwgIiBjb21wICIgfCAiIHJvdXRlMiAiIHwgIiBoYW8KKworLnRpIC04CisuSVIgQUxHTy1MSVNUICIgOj0gWyAiIEFMR08tTElTVCAiIF0gIiBBTEdPCisKKy50aSAtOAorLklSIEFMR08gIiA6PSIKKy5SQiAieyAiIGVuYyAiIHwgIiBhdXRoICIgfSAiCisuSVIgQUxHTy1OQU1FICIgIiBBTEdPLUtFWU1BVCAiIHwiCisuYnIKKy5CIGF1dGgtdHJ1bmMKKy5JUiBBTEdPLU5BTUUgIiAiIEFMR08tS0VZTUFUICIgIiBBTEdPLVRSVU5DLUxFTiAiIHwiCisuYnIKKy5CIGFlYWQKKy5JUiBBTEdPLU5BTUUgIiAiIEFMR08tS0VZTUFUICIgIiBBTEdPLUlDVi1MRU4gIiB8IgorLmJyCisuQiBjb21wCisuSVIgQUxHTy1OQU1FCisKKy50aSAtOAorLklSIE1PREUgIiA6PSAiCisuQlIgdHJhbnNwb3J0ICIgfCAiIHR1bm5lbCAiIHwgIiBiZWV0ICIgfCAiIHJvICIgfCAiIGluX3RyaWdnZXIKKworLnRpIC04CisuSVIgRkxBRy1MSVNUICIgOj0gWyAiIEZMQUctTElTVCAiIF0gIiBGTEFHCisKKy50aSAtOAorLklSIEZMQUcgIiA6PSIKKy5CUiBub2VjbiAiIHwgIiBkZWNhcC1kc2NwICIgfCAiIG5vcG10dWRpc2MgIiB8ICIgd2lsZHJlY3YgIiB8ICIgaWNtcCAiIHwgIgorLkJSIGFmLXVuc3BlYyAiIHwgIiBhbGlnbjQgIiB8ICIgZXNuCisKKy50aSAtOAorLklSIFNFTEVDVE9SICIgOj0iCisuUkIgIlsgIiBzcmMKKy5JUiBBRERSICJbLyIgUExFTiAiXSBdIgorLlJCICJbICIgZHN0CisuSVIgQUREUiAiWy8iIFBMRU4gIl0gXSIKKy5SQiAiWyAiIGRldgorLklSIERFViAiIF0iCisuYnIKKy5SSSAiWyAiIFVQU1BFQyAiIF0iCisKKy50aSAtOAorLklSIFVQU1BFQyAiIDo9ICIKKy5CUiBwcm90byAiIHsiCisuSVIgUFJPVE8gIiB8IgorLmJyCisuUkIgInsgIiB0Y3AgIiB8ICIgdWRwICIgfCAiIHNjdHAgIiB8ICIgZGNjcCAiIH0gWyAiIHNwb3J0CisuSVIgUE9SVCAiIF0iCisuUkIgIlsgIiBkcG9ydAorLklSIFBPUlQgIiBdIHwiCisuYnIKKy5SQiAieyAiIGljbXAgIiB8ICIgaXB2Ni1pY21wICIgfCAiIG1vYmlsaXR5LWhlYWRlciAiIH0gWyAiIHR5cGUKKy5JUiBOVU1CRVIgIiBdIgorLlJCICJbICIgY29kZQorLklSIE5VTUJFUiAiIF0gfCIKKy5icgorLkJSIGdyZSAiIFsgIiBrZXkKKy5SSSAieyAiIERPVFRFRC1RVUFEICIgfCAiIE5VTUJFUiAiIH0gXSB9IgorCisudGkgLTgKKy5JUiBMSU1JVC1MSVNUICIgOj0gWyAiIExJTUlULUxJU1QgIiBdIgorLkIgbGltaXQKKy5JIExJTUlUCisKKy50aSAtOAorLklSIExJTUlUICIgOj0iCisuUkIgInsgIiB0aW1lLXNvZnQgIiB8ICIgdGltZS1oYXJkICIgfCAiIHRpbWUtdXNlLXNvZnQgIiB8ICIgdGltZS11c2UtaGFyZCAiIH0iCisuSVIgIlNFQ09ORFMiICIgfCIKKy5icgorLlJCICJ7ICIgYnl0ZS1zb2Z0ICIgfCAiIGJ5dGUtaGFyZCAiIH0iCisuSVIgU0laRSAiIHwiCisuYnIKKy5SQiAieyAiIHBhY2tldC1zb2Z0ICIgfCAiIHBhY2tldC1oYXJkICIgfSIKKy5JIENPVU5UCisKKy50aSAtOAorLklSIEVOQ0FQICIgOj0iCisuUkIgInsgIiBlc3BpbnVkcCAiIHwgIiBlc3BpbnVkcC1ub25pa2UgIiB9IgorLklSIFNQT1JUICIgIiBEUE9SVCAiICIgT0FERFIKKworLnRpIC04CisuQlIgImlwIHhmcm0gcG9saWN5IiAiIHsgIiBhZGQgIiB8ICIgdXBkYXRlICIgfSIKKy5JIFNFTEVDVE9SCisuQiBkaXIKKy5JIERJUgorLlJCICJbICIgY3R4CisuSVIgQ1RYICIgXSIKKy5SQiAiWyAiIG1hcmsKKy5JIE1BUksKKy5SQiAiWyAiIG1hc2sKKy5JUiBNQVNLICIgXSBdIgorLlJCICJbICIgaW5kZXgKKy5JUiBJTkRFWCAiIF0iCisuUkIgIlsgIiBwdHlwZQorLklSIFBUWVBFICIgXSIKKy5SQiAiWyAiIGFjdGlvbgorLklSIEFDVElPTiAiIF0iCisuUkIgIlsgIiBwcmlvcml0eQorLklSIFBSSU9SSVRZICIgXSIKKy5SQiAiWyAiIGZsYWcKKy5JUiBGTEFHLUxJU1QgIiBdIgorLlJJICJbICIgTElNSVQtTElTVCAiIF0gWyAiIFRNUEwtTElTVCAiIF0iCisKKy50aSAtOAorLkJSICJpcCB4ZnJtIHBvbGljeSIgIiB7ICIgZGVsZXRlICIgfCAiIGdldCAiIH0iCisuUkkgInsgIiBTRUxFQ1RPUiAiIHwgIgorLkIgaW5kZXgKKy5JUiBJTkRFWCAiIH0iCisuQiBkaXIKKy5JIERJUgorLlJCICJbICIgY3R4CisuSVIgQ1RYICIgXSIKKy5SQiAiWyAiIG1hcmsKKy5JIE1BUksKKy5SQiAiWyAiIG1hc2sKKy5JUiBNQVNLICIgXSBdIgorLlJCICJbICIgcHR5cGUKKy5JUiBQVFlQRSAiIF0iCisKKy50aSAtOAorLkJSICJpcCB4ZnJtIHBvbGljeSIgIiB7ICIgZGVsZXRlYWxsICIgfCAiIGxpc3QgIiB9IgorLlJJICJbICIgU0VMRUNUT1IgIiBdIgorLlJCICJbICIgZGlyCisuSVIgRElSICIgXSIKKy5SQiAiWyAiIGluZGV4CisuSVIgSU5ERVggIiBdIgorLlJCICJbICIgcHR5cGUKKy5JUiBQVFlQRSAiIF0iCisuUkIgIlsgIiBhY3Rpb24KKy5JUiBBQ1RJT04gIiBdIgorLlJCICJbICIgcHJpb3JpdHkKKy5JUiBQUklPUklUWSAiIF0iCisKKy50aSAtOAorLkIgImlwIHhmcm0gcG9saWN5IGZsdXNoIgorLlJCICJbICIgcHR5cGUKKy5JUiBQVFlQRSAiIF0iCisKKy50aSAtOAorLkIgImlwIHhmcm0gcG9saWN5IGNvdW50IgorCisudGkgLTgKKy5CICJpcCB4ZnJtIHBvbGljeSBzZXQiCisuUkIgIlsgIiBodGhyZXNoNAorLklSIExCSVRTICIgIiBSQklUUyAiIF0iCisuUkIgIlsgIiBodGhyZXNoNgorLklSIExCSVRTICIgIiBSQklUUyAiIF0iCisKKy50aSAtOAorLklSIFNFTEVDVE9SICIgOj0iCisuUkIgIlsgIiBzcmMKKy5JUiBBRERSICJbLyIgUExFTiAiXSBdIgorLlJCICJbICIgZHN0CisuSVIgQUREUiAiWy8iIFBMRU4gIl0gXSIKKy5SQiAiWyAiIGRldgorLklSIERFViAiIF0iCisuUkkgIlsgIiBVUFNQRUMgIiBdIgorCisudGkgLTgKKy5JUiBVUFNQRUMgIiA6PSAiCisuQlIgcHJvdG8gIiB7IgorLklSIFBST1RPICIgfCIKKy5icgorLlJCICJ7ICIgdGNwICIgfCAiIHVkcCAiIHwgIiBzY3RwICIgfCAiIGRjY3AgIiB9IFsgIiBzcG9ydAorLklSIFBPUlQgIiBdIgorLlJCICJbICIgZHBvcnQKKy5JUiBQT1JUICIgXSB8IgorLmJyCisuUkIgInsgIiBpY21wICIgfCAiIGlwdjYtaWNtcCAiIHwgIiBtb2JpbGl0eS1oZWFkZXIgIiB9IFsgIiB0eXBlCisuSVIgTlVNQkVSICIgXSIKKy5SQiAiWyAiIGNvZGUKKy5JUiBOVU1CRVIgIiBdIHwiCisuYnIKKy5CUiBncmUgIiBbICIga2V5CisuUkkgInsgIiBET1RURUQtUVVBRCAiIHwgIiBOVU1CRVIgIiB9IF0gfSIKKworLnRpIC04CisuSVIgRElSICIgOj0gIgorLkJSIGluICIgfCAiIG91dCAiIHwgIiBmd2QKKworLnRpIC04CisuSVIgUFRZUEUgIiA6PSAiCisuQlIgbWFpbiAiIHwgIiBzdWIKKworLnRpIC04CisuSVIgQUNUSU9OICIgOj0gIgorLkJSIGFsbG93ICIgfCAiIGJsb2NrCisKKy50aSAtOAorLklSIEZMQUctTElTVCAiIDo9IFsgIiBGTEFHLUxJU1QgIiBdICIgRkxBRworCisudGkgLTgKKy5JUiBGTEFHICIgOj0iCisuQlIgbG9jYWxvayAiIHwgIiBpY21wCisKKy50aSAtOAorLklSIExJTUlULUxJU1QgIiA6PSBbICIgTElNSVQtTElTVCAiIF0iCisuQiBsaW1pdAorLkkgTElNSVQKKworLnRpIC04CisuSVIgTElNSVQgIiA6PSIKKy5SQiAieyAiIHRpbWUtc29mdCAiIHwgIiB0aW1lLWhhcmQgIiB8ICIgdGltZS11c2Utc29mdCAiIHwgIiB0aW1lLXVzZS1oYXJkICIgfSIKKy5JUiAiU0VDT05EUyIgIiB8IgorLmJyCisuUkIgInsgIiBieXRlLXNvZnQgIiB8ICIgYnl0ZS1oYXJkICIgfSIKKy5JUiBTSVpFICIgfCIKKy5icgorLlJCICJ7ICIgcGFja2V0LXNvZnQgIiB8ICIgcGFja2V0LWhhcmQgIiB9IgorLkkgQ09VTlQKKworLnRpIC04CisuSVIgVE1QTC1MSVNUICIgOj0gWyAiIFRNUEwtTElTVCAiIF0iCisuQiB0bXBsCisuSSBUTVBMCisKKy50aSAtOAorLklSIFRNUEwgIiA6PSAiIElECisuUkIgIlsgIiBtb2RlCisuSVIgTU9ERSAiIF0iCisuUkIgIlsgIiByZXFpZAorLklSIFJFUUlEICIgXSIKKy5SQiAiWyAiIGxldmVsCisuSVIgTEVWRUwgIiBdIgorCisudGkgLTgKKy5JUiBJRCAiIDo9IgorLlJCICJbICIgc3JjCisuSVIgQUREUiAiIF0iCisuUkIgIlsgIiBkc3QKKy5JUiBBRERSICIgXSIKKy5SQiAiWyAiIHByb3RvCisuSVIgWEZSTS1QUk9UTyAiIF0iCisuUkIgIlsgIiBzcGkKKy5JUiBTUEkgIiBdIgorCisudGkgLTgKKy5JUiBYRlJNLVBST1RPICIgOj0iCisuQlIgZXNwICIgfCAiIGFoICIgfCAiIGNvbXAgIiB8ICIgcm91dGUyICIgfCAiIGhhbworCisudGkgLTgKKy5JUiBNT0RFICIgOj0gIgorLkJSIHRyYW5zcG9ydCAiIHwgIiB0dW5uZWwgIiB8ICIgYmVldCAiIHwgIiBybyAiIHwgIiBpbl90cmlnZ2VyCisKKy50aSAtOAorLklSIExFVkVMICIgOj0iCisuQlIgcmVxdWlyZWQgIiB8ICIgdXNlCisKKy50aSAtOAorLkJSICJpcCB4ZnJtIG1vbml0b3IiICIgWyIKKy5CSSBhbGwtbnNpZAorXSBbCisuQkkgYWxsCisgfAorLklSIExJU1RvZlhGUk0tT0JKRUNUUyAiIF0iCisKKy50aSAtOAorLklSIExJU1RvZlhGUk0tT0JKRUNUUyAiIDo9IFsgIiBMSVNUb2ZYRlJNLU9CSkVDVFMgIiBdICIgWEZSTS1PQkpFQ1QKKworLnRpIC04CisuSVIgWEZSTS1PQkpFQ1QgIiA6PSAiCisuQlIgYWNxdWlyZSAiIHwgIiBleHBpcmUgIiB8ICIgU0EgIiB8ICIgcG9saWN5ICIgfCAiIGFldmVudCAiIHwgIiByZXBvcnQKKworLmluIC04CisuYWQgYgorCisuU0ggREVTQ1JJUFRJT04KKworeGZybSBpcyBhbiBJUCBmcmFtZXdvcmsgZm9yIHRyYW5zZm9ybWluZyBwYWNrZXRzIChzdWNoIGFzIGVuY3J5cHRpbmcKK3RoZWlyIHBheWxvYWRzKS4gVGhpcyBmcmFtZXdvcmsgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlIElQc2VjIHByb3RvY29sCitzdWl0ZSAod2l0aCB0aGUKKy5CIHN0YXRlCitvYmplY3Qgb3BlcmF0aW5nIG9uIHRoZSBTZWN1cml0eSBBc3NvY2lhdGlvbiBEYXRhYmFzZSwgYW5kIHRoZQorLkIgcG9saWN5CitvYmplY3Qgb3BlcmF0aW5nIG9uIHRoZSBTZWN1cml0eSBQb2xpY3kgRGF0YWJhc2UpLiBJdCBpcyBhbHNvIHVzZWQgZm9yCit0aGUgSVAgUGF5bG9hZCBDb21wcmVzc2lvbiBQcm90b2NvbCBhbmQgZmVhdHVyZXMgb2YgTW9iaWxlIElQdjYuCisKKy5UUworbCBsLgoraXAgeGZybSBzdGF0ZSBhZGQJYWRkIG5ldyBzdGF0ZSBpbnRvIHhmcm0KK2lwIHhmcm0gc3RhdGUgdXBkYXRlCXVwZGF0ZSBleGlzdGluZyBzdGF0ZSBpbiB4ZnJtCitpcCB4ZnJtIHN0YXRlIGFsbG9jc3BpCWFsbG9jYXRlIGFuIFNQSSB2YWx1ZQoraXAgeGZybSBzdGF0ZSBkZWxldGUJZGVsZXRlIGV4aXN0aW5nIHN0YXRlIGluIHhmcm0KK2lwIHhmcm0gc3RhdGUgZ2V0CWdldCBleGlzdGluZyBzdGF0ZSBpbiB4ZnJtCitpcCB4ZnJtIHN0YXRlIGRlbGV0ZWFsbAlkZWxldGUgYWxsIGV4aXN0aW5nIHN0YXRlIGluIHhmcm0KK2lwIHhmcm0gc3RhdGUgbGlzdAlwcmludCBvdXQgdGhlIGxpc3Qgb2YgZXhpc3Rpbmcgc3RhdGUgaW4geGZybQoraXAgeGZybSBzdGF0ZSBmbHVzaAlmbHVzaCBhbGwgc3RhdGUgaW4geGZybQoraXAgeGZybSBzdGF0ZSBjb3VudAljb3VudCBhbGwgZXhpc3Rpbmcgc3RhdGUgaW4geGZybQorLlRFCisKKy5UUAorLklSIElECitpcyBzcGVjaWZpZWQgYnkgYSBzb3VyY2UgYWRkcmVzcywgZGVzdGluYXRpb24gYWRkcmVzcywKKy5SSSAidHJhbnNmb3JtIHByb3RvY29sICIgWEZSTS1QUk9UTyAiLCIKK2FuZC9vciBTZWN1cml0eSBQYXJhbWV0ZXIgSW5kZXgKKy5JUiBTUEkgIi4iCisoRm9yIElQIFBheWxvYWQgQ29tcHJlc3Npb24sIHRoZSBDb21wcmVzc2lvbiBQYXJhbWV0ZXIgSW5kZXggb3IgQ1BJIGlzIHVzZWQgZm9yCisuSVIgU1BJICIuKSIKKworLlRQCisuSSBYRlJNLVBST1RPCitzcGVjaWZpZXMgYSB0cmFuc2Zvcm0gcHJvdG9jb2w6CisuUkIgIklQc2VjIEVuY2Fwc3VsYXRpbmcgU2VjdXJpdHkgUGF5bG9hZCAoIiBlc3AgIiksIgorLlJCICJJUHNlYyBBdXRoZW50aWNhdGlvbiBIZWFkZXIgKCIgYWggIiksIgorLlJCICJJUCBQYXlsb2FkIENvbXByZXNzaW9uICgiIGNvbXAgIiksIgorLlJCICJNb2JpbGUgSVB2NiBUeXBlIDIgUm91dGluZyBIZWFkZXIgKCIgcm91dGUyICIpLCBvciIKKy5SQiAiTW9iaWxlIElQdjYgSG9tZSBBZGRyZXNzIE9wdGlvbiAoIiBoYW8gIikuIgorCisuVFAKKy5JIEFMR08tTElTVAorY29udGFpbnMgb25lIG9yIG1vcmUgYWxnb3JpdGhtcyB0byB1c2UuIEVhY2ggYWxnb3JpdGhtCisuSSBBTEdPCitpcyBzcGVjaWZpZWQgYnk6CisuUlMKKy5JUCBcW2J1XQordGhlIGFsZ29yaXRobSB0eXBlOgorLlJCICJlbmNyeXB0aW9uICgiIGVuYyAiKSwiCisuUkIgImF1dGhlbnRpY2F0aW9uICgiIGF1dGggIiBvciAiIGF1dGgtdHJ1bmMgIiksIgorLlJCICJhdXRoZW50aWNhdGVkIGVuY3J5cHRpb24gd2l0aCBhc3NvY2lhdGVkIGRhdGEgKCIgYWVhZCAiKSwgb3IiCisuUkIgImNvbXByZXNzaW9uICgiIGNvbXAgIikiCisuSVAgXFtidV0KK3RoZSBhbGdvcml0aG0gbmFtZQorLklSIEFMR08tTkFNRQorKHNlZSBiZWxvdykKKy5JUCBcW2J1XQorLlJCICIoZm9yIGFsbCBleGNlcHQgIiBjb21wICIpIgordGhlIGtleWluZyBtYXRlcmlhbAorLklSIEFMR08tS0VZTUFUICIsIgord2hpY2ggbWF5IGluY2x1ZGUgYm90aCBhIGtleSBhbmQgYSBzYWx0IG9yIG5vbmNlIHZhbHVlOyByZWZlciB0byB0aGUKK2NvcnJlc3BvbmRpbmcgUkZDCisuSVAgXFtidV0KKy5SQiAiKGZvciAiIGF1dGgtdHJ1bmMgIiBvbmx5KSIKK3RoZSB0cnVuY2F0aW9uIGxlbmd0aAorLkkgQUxHTy1UUlVOQy1MRU4KK2luIGJpdHMKKy5JUCBcW2J1XQorLlJCICIoZm9yICIgYWVhZCAiIG9ubHkpIgordGhlIEludGVncml0eSBDaGVjayBWYWx1ZSBsZW5ndGgKKy5JIEFMR08tSUNWLUxFTgoraW4gYml0cworLlJFCisKKy5uaAorLlJTCitFbmNyeXB0aW9uIGFsZ29yaXRobXMgaW5jbHVkZQorLkJSIGVjYihjaXBoZXJfbnVsbCkgIiwgIiBjYmMoZGVzKSAiLCAiIGNiYyhkZXMzX2VkZSkgIiwgIiBjYmMoY2FzdDUpICIsIgorLkJSIGNiYyhibG93ZmlzaCkgIiwgIiBjYmMoYWVzKSAiLCAiIGNiYyhzZXJwZW50KSAiLCAiIGNiYyhjYW1lbGxpYSkgIiwiCisuQlIgY2JjKHR3b2Zpc2gpICIsIGFuZCAiIHJmYzM2ODYoY3RyKGFlcykpICIuIgorCitBdXRoZW50aWNhdGlvbiBhbGdvcml0aG1zIGluY2x1ZGUKKy5CUiBkaWdlc3RfbnVsbCAiLCAiIGhtYWMobWQ1KSAiLCAiIGhtYWMoc2hhMSkgIiwgIiBobWFjKHNoYTI1NikgIiwiCisuQlIgaG1hYyhzaGEzODQpICIsICIgaG1hYyhzaGE1MTIpICIsICIgaG1hYyhybWQ2MTApICIsIGFuZCAiIHhjYmMoYWVzKSAiLiIKKworQXV0aGVudGljYXRlZCBlbmNyeXB0aW9uIHdpdGggYXNzb2NpYXRlZCBkYXRhIChBRUFEKSBhbGdvcml0aG1zIGluY2x1ZGUKKy5CUiByZmM0MTA2KGdjbShhZXMpKSAiLCAiIHJmYzQzMDkoY2NtKGFlcykpICIsIGFuZCAiIHJmYzQ1NDMoZ2NtKGFlcykpICIuIgorCitDb21wcmVzc2lvbiBhbGdvcml0aG1zIGluY2x1ZGUKKy5CUiBkZWZsYXRlICIsICIgbHpzICIsIGFuZCAiIGx6amggIi4iCisuUkUKKy5oeQorCisuVFAKKy5JIE1PREUKK3NwZWNpZmllcyBhIG1vZGUgb2Ygb3BlcmF0aW9uIGZvciB0aGUgdHJhbnNmb3JtIHByb3RvY29sLiBJUHNlYyBhbmQgSVAgUGF5bG9hZAorQ29tcHJlc3Npb24gbW9kZXMgYXJlCisuQlIgdHJhbnNwb3J0ICIsICIgdHVubmVsICIsIgorYW5kIChmb3IgSVBzZWMgRVNQIG9ubHkpIEJvdW5kIEVuZC10by1FbmQgVHVubmVsCisuUkIgIigiIGJlZXQgIikuIgorTW9iaWxlIElQdjYgbW9kZXMgYXJlIHJvdXRlIG9wdGltaXphdGlvbgorLlJCICIoIiBybyAiKSIKK2FuZCBpbmJvdW5kIHRyaWdnZXIKKy5SQiAiKCIgaW5fdHJpZ2dlciAiKS4iCisKKy5UUAorLkkgRkxBRy1MSVNUCitjb250YWlucyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbmFsIGZsYWdzOgorLkJSIG5vZWNuICIsICIgZGVjYXAtZHNjcCAiLCAiIG5vcG10dWRpc2MgIiwgIiB3aWxkcmVjdiAiLCAiIGljbXAgIiwgIgorLkJSIGFmLXVuc3BlYyAiLCAiIGFsaWduNCAiLCBvciAiIGVzbiAiLiIKKworLlRQCisuSVIgU0VMRUNUT1IKK3NlbGVjdHMgdGhlIHRyYWZmaWMgdGhhdCB3aWxsIGJlIGNvbnRyb2xsZWQgYnkgdGhlIHBvbGljeSwgYmFzZWQgb24gdGhlIHNvdXJjZQorYWRkcmVzcywgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MsIHRoZSBuZXR3b3JrIGRldmljZSwgYW5kL29yCisuSVIgVVBTUEVDICIuIgorCisuVFAKKy5JUiBVUFNQRUMKK3NlbGVjdHMgdHJhZmZpYyBieSBwcm90b2NvbC4gRm9yIHRoZQorLkJSIHRjcCAiLCAiIHVkcCAiLCAiIHNjdHAgIiwgb3IgIiBkY2NwCitwcm90b2NvbHMsIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHBvcnQgY2FuIG9wdGlvbmFsbHkgYmUgc3BlY2lmaWVkLgorRm9yIHRoZQorLkJSIGljbXAgIiwgIiBpcHY2LWljbXAgIiwgb3IgIiBtb2JpbGl0eS1oZWFkZXIKK3Byb3RvY29scywgdGhlIHR5cGUgYW5kIGNvZGUgbnVtYmVycyBjYW4gb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQuCitGb3IgdGhlCisuQiBncmUKK3Byb3RvY29sLCB0aGUga2V5IGNhbiBvcHRpb25hbGx5IGJlIHNwZWNpZmllZCBhcyBhIGRvdHRlZC1xdWFkIG9yIG51bWJlci4KK090aGVyIHByb3RvY29scyBjYW4gYmUgc2VsZWN0ZWQgYnkgbmFtZSBvciBudW1iZXIKKy5JUiBQUk9UTyAiLiIKKworLlRQCisuSSBMSU1JVC1MSVNUCitzZXRzIGxpbWl0cyBpbiBzZWNvbmRzLCBieXRlcywgb3IgbnVtYmVycyBvZiBwYWNrZXRzLgorCisuVFAKKy5JIEVOQ0FQCitlbmNhcHN1bGF0ZXMgcGFja2V0cyB3aXRoIHByb3RvY29sCisuQlIgZXNwaW51ZHAgIiBvciAiIGVzcGludWRwLW5vbmlrZSAiLCIKKy5SSSAidXNpbmcgc291cmNlIHBvcnQgIiBTUE9SVCAiLCBkZXN0aW5hdGlvbiBwb3J0ICIgIERQT1JUCisuUkkgIiwgYW5kIG9yaWdpbmFsIGFkZHJlc3MgIiBPQUREUiAiLiIKKworLnNwCisuUFAKKy5UUworbCBsLgoraXAgeGZybSBwb2xpY3kgYWRkCWFkZCBhIG5ldyBwb2xpY3kKK2lwIHhmcm0gcG9saWN5IHVwZGF0ZQl1cGRhdGUgYW4gZXhpc3RpbmcgcG9saWN5CitpcCB4ZnJtIHBvbGljeSBkZWxldGUJZGVsZXRlIGFuIGV4aXN0aW5nIHBvbGljeQoraXAgeGZybSBwb2xpY3kgZ2V0CWdldCBhbiBleGlzdGluZyBwb2xpY3kKK2lwIHhmcm0gcG9saWN5IGRlbGV0ZWFsbAlkZWxldGUgYWxsIGV4aXN0aW5nIHhmcm0gcG9saWNpZXMKK2lwIHhmcm0gcG9saWN5IGxpc3QJcHJpbnQgb3V0IHRoZSBsaXN0IG9mIHhmcm0gcG9saWNpZXMKK2lwIHhmcm0gcG9saWN5IGZsdXNoCWZsdXNoIHBvbGljaWVzCisuVEUKKworLlRQCisuSVIgU0VMRUNUT1IKK3NlbGVjdHMgdGhlIHRyYWZmaWMgdGhhdCB3aWxsIGJlIGNvbnRyb2xsZWQgYnkgdGhlIHBvbGljeSwgYmFzZWQgb24gdGhlIHNvdXJjZQorYWRkcmVzcywgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MsIHRoZSBuZXR3b3JrIGRldmljZSwgYW5kL29yCisuSVIgVVBTUEVDICIuIgorCisuVFAKKy5JUiBVUFNQRUMKK3NlbGVjdHMgdHJhZmZpYyBieSBwcm90b2NvbC4gRm9yIHRoZQorLkJSIHRjcCAiLCAiIHVkcCAiLCAiIHNjdHAgIiwgb3IgIiBkY2NwCitwcm90b2NvbHMsIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHBvcnQgY2FuIG9wdGlvbmFsbHkgYmUgc3BlY2lmaWVkLgorRm9yIHRoZQorLkJSIGljbXAgIiwgIiBpcHY2LWljbXAgIiwgb3IgIiBtb2JpbGl0eS1oZWFkZXIKK3Byb3RvY29scywgdGhlIHR5cGUgYW5kIGNvZGUgbnVtYmVycyBjYW4gb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQuCitGb3IgdGhlCisuQiBncmUKK3Byb3RvY29sLCB0aGUga2V5IGNhbiBvcHRpb25hbGx5IGJlIHNwZWNpZmllZCBhcyBhIGRvdHRlZC1xdWFkIG9yIG51bWJlci4KK090aGVyIHByb3RvY29scyBjYW4gYmUgc2VsZWN0ZWQgYnkgbmFtZSBvciBudW1iZXIKKy5JUiBQUk9UTyAiLiIKKworLlRQCisuSSBESVIKK3NlbGVjdHMgdGhlIHBvbGljeSBkaXJlY3Rpb24gYXMKKy5CUiBpbiAiLCAiIG91dCAiLCBvciAiIGZ3ZCAiLiIKKworLlRQCisuSSBDVFgKK3NldHMgdGhlIHNlY3VyaXR5IGNvbnRleHQuCisKKy5UUAorLkkgUFRZUEUKK2NhbiBiZQorLkJSIG1haW4gIiAoZGVmYXVsdCkgb3IgIiBzdWIgIi4iCisKKy5UUAorLkkgQUNUSU9OCitjYW4gYmUKKy5CUiBhbGxvdyAiIChkZWZhdWx0KSBvciAiIGJsb2NrICIuIgorCisuVFAKKy5JIFBSSU9SSVRZCitpcyBhIG51bWJlciB0aGF0IGRlZmF1bHRzIHRvIHplcm8uCisKKy5UUAorLkkgRkxBRy1MSVNUCitjb250YWlucyBvbmUgb3IgYm90aCBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbmFsIGZsYWdzOgorLkJSIGxvY2FsICIgb3IgIiBpY21wICIuIgorCisuVFAKKy5JIExJTUlULUxJU1QKK3NldHMgbGltaXRzIGluIHNlY29uZHMsIGJ5dGVzLCBvciBudW1iZXJzIG9mIHBhY2tldHMuCisKKy5UUAorLkkgVE1QTC1MSVNUCitpcyBhIHRlbXBsYXRlIGxpc3Qgc3BlY2lmaWVkIHVzaW5nCisuSVIgSUQgIiwgIiBNT0RFICIsICIgUkVRSUQgIiwgYW5kL29yICIgTEVWRUwgIi4gIgorCisuVFAKKy5JUiBJRAoraXMgc3BlY2lmaWVkIGJ5IGEgc291cmNlIGFkZHJlc3MsIGRlc3RpbmF0aW9uIGFkZHJlc3MsCisuUkkgInRyYW5zZm9ybSBwcm90b2NvbCAiIFhGUk0tUFJPVE8gIiwiCithbmQvb3IgU2VjdXJpdHkgUGFyYW1ldGVyIEluZGV4CisuSVIgU1BJICIuIgorKEZvciBJUCBQYXlsb2FkIENvbXByZXNzaW9uLCB0aGUgQ29tcHJlc3Npb24gUGFyYW1ldGVyIEluZGV4IG9yIENQSSBpcyB1c2VkIGZvcgorLklSIFNQSSAiLikiCisKKy5UUAorLkkgWEZSTS1QUk9UTworc3BlY2lmaWVzIGEgdHJhbnNmb3JtIHByb3RvY29sOgorLlJCICJJUHNlYyBFbmNhcHN1bGF0aW5nIFNlY3VyaXR5IFBheWxvYWQgKCIgZXNwICIpLCIKKy5SQiAiSVBzZWMgQXV0aGVudGljYXRpb24gSGVhZGVyICgiIGFoICIpLCIKKy5SQiAiSVAgUGF5bG9hZCBDb21wcmVzc2lvbiAoIiBjb21wICIpLCIKKy5SQiAiTW9iaWxlIElQdjYgVHlwZSAyIFJvdXRpbmcgSGVhZGVyICgiIHJvdXRlMiAiKSwgb3IiCisuUkIgIk1vYmlsZSBJUHY2IEhvbWUgQWRkcmVzcyBPcHRpb24gKCIgaGFvICIpLiIKKworLlRQCisuSSBNT0RFCitzcGVjaWZpZXMgYSBtb2RlIG9mIG9wZXJhdGlvbiBmb3IgdGhlIHRyYW5zZm9ybSBwcm90b2NvbC4gSVBzZWMgYW5kIElQIFBheWxvYWQKK0NvbXByZXNzaW9uIG1vZGVzIGFyZQorLkJSIHRyYW5zcG9ydCAiLCAiIHR1bm5lbCAiLCIKK2FuZCAoZm9yIElQc2VjIEVTUCBvbmx5KSBCb3VuZCBFbmQtdG8tRW5kIFR1bm5lbAorLlJCICIoIiBiZWV0ICIpLiIKK01vYmlsZSBJUHY2IG1vZGVzIGFyZSByb3V0ZSBvcHRpbWl6YXRpb24KKy5SQiAiKCIgcm8gIikiCithbmQgaW5ib3VuZCB0cmlnZ2VyCisuUkIgIigiIGluX3RyaWdnZXIgIikuIgorCisuVFAKKy5JIExFVkVMCitjYW4gYmUKKy5CUiByZXF1aXJlZCAiIChkZWZhdWx0KSBvciAiIHVzZSAiLiIKKworLnNwCisuUFAKKy5UUworbCBsLgoraXAgeGZybSBwb2xpY3kgY291bnQJY291bnQgZXhpc3RpbmcgcG9saWNpZXMKKy5URQorCisuUFAKK1VzZSBvbmUgb3IgbW9yZSAtcyBvcHRpb25zIHRvIGRpc3BsYXkgbW9yZSBkZXRhaWxzLCBpbmNsdWRpbmcgcG9saWN5IGhhc2ggdGFibGUKK2luZm9ybWF0aW9uLgorCisuc3AKKy5QUAorLlRTCitsIGwuCitpcCB4ZnJtIHBvbGljeSBzZXQJY29uZmlndXJlIHRoZSBwb2xpY3kgaGFzaCB0YWJsZQorLlRFCisKKy5QUAorU2VjdXJpdHkgcG9saWNpZXMgd2hvc2UgYWRkcmVzcyBwcmVmaXggbGVuZ3RocyBhcmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsCitwb2xpY3kgaGFzaCB0YWJsZSB0aHJlc2hvbGRzIGFyZSBoYXNoZWQuIE90aGVycyBhcmUgc3RvcmVkIGluIHRoZQorcG9saWN5X2luZXhhY3QgY2hhaW5lZCBsaXN0LgorCisuVFAKKy5JIExCSVRTCitzcGVjaWZpZXMgdGhlIG1pbmltdW0gbG9jYWwgYWRkcmVzcyBwcmVmaXggbGVuZ3RoIG9mIHBvbGljaWVzIHRoYXQgYXJlCitzdG9yZWQgaW4gdGhlIFNlY3VyaXR5IFBvbGljeSBEYXRhYmFzZSBoYXNoIHRhYmxlLgorCisuVFAKKy5JIFJCSVRTCitzcGVjaWZpZXMgdGhlIG1pbmltdW0gcmVtb3RlIGFkZHJlc3MgcHJlZml4IGxlbmd0aCBvZiBwb2xpY2llcyB0aGF0IGFyZQorc3RvcmVkIGluIHRoZSBTZWN1cml0eSBQb2xpY3kgRGF0YWJhc2UgaGFzaCB0YWJsZS4KKworLnNwCisuUFAKKy5UUworbCBsLgoraXAgeGZybSBtb25pdG9yIAlzdGF0ZSBtb25pdG9yaW5nIGZvciB4ZnJtIG9iamVjdHMKKy5URQorCisuUFAKK1RoZSB4ZnJtIG9iamVjdHMgdG8gbW9uaXRvciBjYW4gYmUgb3B0aW9uYWxseSBzcGVjaWZpZWQuCisKKy5QCitJZiB0aGUKKy5CSSBhbGwtbnNpZAorb3B0aW9uIGlzIHNldCwgdGhlIHByb2dyYW0gbGlzdGVucyB0byBhbGwgbmV0d29yayBuYW1lc3BhY2VzIHRoYXQgaGF2ZSBhCituc2lkIGFzc2lnbmVkIGludG8gdGhlIG5ldHdvcmsgbmFtZXNwYWNlIHdlcmUgdGhlIHByb2dyYW0gaXMgcnVubmluZy4KK0EgcHJlZml4IGlzIGRpc3BsYXllZCB0byBzaG93IHRoZSBuZXR3b3JrIG5hbWVzcGFjZSB3aGVyZSB0aGUgbWVzc2FnZQorb3JpZ2luYXRlcy4gRXhhbXBsZToKKy5zcAorLmluICsyCitbbnNpZCAxXUZsdXNoZWQgc3RhdGUgcHJvdG8gMAorLmluIC0yCisuc3AKKworLlNIIEFVVEhPUgorTWFucGFnZSByZXZpc2VkIGJ5IERhdmlkIFdhcmQgPGRhdmlkLndhcmRAbGwubWl0LmVkdT4KKy5icgorTWFucGFnZSByZXZpc2VkIGJ5IENocmlzdG9waGUgR291YXVsdCA8Y2hyaXN0b3BoZS5nb3VhdWx0QDZ3aW5kLmNvbT4KKy5icgorTWFucGFnZSByZXZpc2VkIGJ5IE5pY29sYXMgRGljaHRlbCA8bmljb2xhcy5kaWNodGVsQDZ3aW5kLmNvbT4KZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L2lwLjggYi9pcHJvdXRlMi9tYW4vbWFuOC9pcC44Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZjY5MDcKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9tYW4vbWFuOC9pcC44CkBAIC0wLDAgKzEsMzE5IEBACisuVEggSVAgOCAiMjAgRGVjIDIwMTEiICJpcHJvdXRlMiIgIkxpbnV4IgorLlNIIE5BTUUKK2lwIFwtIHNob3cgLyBtYW5pcHVsYXRlIHJvdXRpbmcsIGRldmljZXMsIHBvbGljeSByb3V0aW5nIGFuZCB0dW5uZWxzCisuU0ggU1lOT1BTSVMKKworLmFkIGwKKy5pbiArOAorLnRpIC04CisuQiBpcAorLlJJICJbICIgT1BUSU9OUyAiIF0gIiBPQkpFQ1QgIiB7ICIgQ09NTUFORCAiIHwgIgorLkJSIGhlbHAgIiB9IgorLnNwCisKKy50aSAtOAorLkIgaXAKKy5SQiAiWyAiIC1mb3JjZSAiIF0gIgorLkJJICItYmF0Y2ggIiBmaWxlbmFtZQorLnNwCisKKy50aSAtOAorLklSIE9CSkVDVCAiIDo9IHsgIgorLkJSIGxpbmsgIiB8ICIgYWRkcmVzcyAiIHwgIiBhZGRybGFiZWwgIiB8ICIgcm91dGUgIiB8ICIgcnVsZSAiIHwgIiBuZWlnaCAiIHwgIlwKKyBudGFibGUgIiB8ICIgdHVubmVsICIgfCAiIHR1bnRhcCAiIHwgIiBtYWRkcmVzcyAiIHwgIiAgbXJvdXRlICIgfCAiIG1ydWxlICIgfCAiXAorIG1vbml0b3IgIiB8ICIgeGZybSAiIHwgIiBuZXRucyAiIHwgIiAgbDJ0cCAiIHwgIiAgdGNwX21ldHJpY3MgIiB9IgorLnNwCisKKy50aSAtOAorLklSIE9QVElPTlMgIiA6PSB7ICIKK1xmQlwtVlxmUltcZkllcnNpb25cZlJdIHwKK1xmQlwtaFxmUltcZkl1bWFuLXJlYWRhYmxlXGZSXSB8CitcZkJcLXNcZlJbXGZJdGF0aXN0aWNzXGZSXSB8CitcZkJcLXJcZlJbXGZJZXNvbHZlXGZSXSB8CitcZkJcLWZcZlJbXGZJYW1pbHlcZlJdIHsKKy5CUiBpbmV0ICIgfCAiIGluZXQ2ICIgfCAiIGlweCAiIHwgIiBkbmV0ICIgfCAiIGxpbmsgIiB9IHwgIgorXGZCXC1vXGZSW1xmSW5lbGluZVxmUl0gfAorXGZCXC1uXGZSW1xmSWV0bnNcZlJdIG5hbWUgfAorXGZCXC1hXGZSW1xmSWxsXGZSXSB8CitcZkJcLWNcZlJbXGZJb2xvclxmUl0gfQorCisKKy5TSCBPUFRJT05TCisKKy5UUAorLkJSICJcLVYiICwgIiAtVmVyc2lvbiIKK1ByaW50IHRoZSB2ZXJzaW9uIG9mIHRoZQorLkIgaXAKK3V0aWxpdHkgYW5kIGV4aXQuCisKKy5UUAorLkJSICJcLWgiLCAiIFwtaHVtYW4iLCAiIFwtaHVtYW4tcmVhZGFibGUiCitvdXRwdXQgc3RhdGlzdGljcyB3aXRoIGh1bWFuIHJlYWRhYmxlIHZhbHVlcyBmb2xsb3dlZCBieSBzdWZmaXguCisKKy5UUAorLkJSICJcLWIiLCAiIFwtYmF0Y2ggIiA8RklMRU5BTUU+CitSZWFkIGNvbW1hbmRzIGZyb20gcHJvdmlkZWQgZmlsZSBvciBzdGFuZGFyZCBpbnB1dCBhbmQgaW52b2tlIHRoZW0uCitGaXJzdCBmYWlsdXJlIHdpbGwgY2F1c2UgdGVybWluYXRpb24gb2YgaXAuCisKKy5UUAorLkJSICJcLWZvcmNlIgorRG9uJ3QgdGVybWluYXRlIGlwIG9uIGVycm9ycyBpbiBiYXRjaCBtb2RlLgorSWYgdGhlcmUgd2VyZSBhbnkgZXJyb3JzIGR1cmluZyBleGVjdXRpb24gb2YgdGhlIGNvbW1hbmRzLCB0aGUgYXBwbGljYXRpb24gcmV0dXJuIGNvZGUgd2lsbCBiZSBub24gemVyby4KKworLlRQCisuQlIgIlwtcyIgLCAiIFwtc3RhdHMiICwgIiBcLXN0YXRpc3RpY3MiCitPdXRwdXQgbW9yZSBpbmZvcm1hdGlvbi4gSWYgdGhlIG9wdGlvbgorYXBwZWFycyB0d2ljZSBvciBtb3JlLCB0aGUgYW1vdW50IG9mIGluZm9ybWF0aW9uIGluY3JlYXNlcy4KK0FzIGEgcnVsZSwgdGhlIGluZm9ybWF0aW9uIGlzIHN0YXRpc3RpY3Mgb3Igc29tZSB0aW1lIHZhbHVlcy4KKworLlRQCisuQlIgIlwtZCIgLCAiIFwtZGV0YWlscyIKK091dHB1dCBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uLgorCisuVFAKKy5CUiAiXC1sIiAsICIgXC1sb29wcyAiIDxDT1VOVD4KK1NwZWNpZnkgbWF4aW11bSBudW1iZXIgb2YgbG9vcHMgdGhlICdpcCBhZGRyZXNzIGZsdXNoJyBsb2dpYword2lsbCBhdHRlbXB0IGJlZm9yZSBnaXZpbmcgdXAuIFRoZSBkZWZhdWx0IGlzIDEwLgorWmVybyAoMCkgbWVhbnMgbG9vcCB1bnRpbCBhbGwgYWRkcmVzc2VzIGFyZSByZW1vdmVkLgorCisuVFAKKy5CUiAiXC1mIiAsICIgXC1mYW1pbHkgIiA8RkFNSUxZPgorU3BlY2lmaWVzIHRoZSBwcm90b2NvbCBmYW1pbHkgdG8gdXNlLiBUaGUgcHJvdG9jb2wgZmFtaWx5IGlkZW50aWZpZXIgY2FuIGJlIG9uZSBvZgorLkJSICJpbmV0IiAsICIgaW5ldDYiICwgIiBicmlkZ2UiICwgIiBpcHgiICwgIiBkbmV0IiAsICIgbXBscyIKK29yCisuQlIgbGluayAuCitJZiB0aGlzIG9wdGlvbiBpcyBub3QgcHJlc2VudCwKK3RoZSBwcm90b2NvbCBmYW1pbHkgaXMgZ3Vlc3NlZCBmcm9tIG90aGVyIGFyZ3VtZW50cy4gSWYgdGhlIHJlc3QKK29mIHRoZSBjb21tYW5kIGxpbmUgZG9lcyBub3QgZ2l2ZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gZ3Vlc3MgdGhlCitmYW1pbHksCisuQiBpcAorZmFsbHMgYmFjayB0byB0aGUgZGVmYXVsdCBvbmUsIHVzdWFsbHkKKy5CIGluZXQKK29yCisuQlIgImFueSIgLgorLkIgbGluaworaXMgYSBzcGVjaWFsIGZhbWlseSBpZGVudGlmaWVyIG1lYW5pbmcgdGhhdCBubyBuZXR3b3JraW5nIHByb3RvY29sCitpcyBpbnZvbHZlZC4KKworLlRQCisuQiBcLTQKK3Nob3J0Y3V0IGZvcgorLkJSICItZmFtaWx5IGluZXQiIC4KKworLlRQCisuQiBcLTYKK3Nob3J0Y3V0IGZvcgorLkJSICJcLWZhbWlseSBpbmV0NiIgLgorCisuVFAKKy5CIFwtQgorc2hvcnRjdXQgZm9yCisuQlIgIlwtZmFtaWx5IGJyaWRnZSIgLgorCisuVFAKKy5CIFwtRAorc2hvcnRjdXQgZm9yCisuQlIgIlwtZmFtaWx5IGRlY25ldCIgLgorCisuVFAKKy5CIFwtSQorc2hvcnRjdXQgZm9yCisuQlIgIlwtZmFtaWx5IGlweCIgLgorCisuVFAKKy5CIFwtTQorc2hvcnRjdXQgZm9yCisuQlIgIlwtZmFtaWx5IG1wbHMiIC4KKworLlRQCisuQiBcLTAKK3Nob3J0Y3V0IGZvcgorLkJSICJcLWZhbWlseSBsaW5rIiAuCisKKy5UUAorLkJSICJcLW8iICwgIiBcLW9uZWxpbmUiCitvdXRwdXQgZWFjaCByZWNvcmQgb24gYSBzaW5nbGUgbGluZSwgcmVwbGFjaW5nIGxpbmUgZmVlZHMKK3dpdGggdGhlCisuQiAnXGUnCitjaGFyYWN0ZXIuIFRoaXMgaXMgY29udmVuaWVudCB3aGVuIHlvdSB3YW50IHRvIGNvdW50IHJlY29yZHMKK3dpdGgKKy5CUiB3YyAoMSkKK29yIHRvCisuQlIgZ3JlcCAoMSkKK3RoZSBvdXRwdXQuCisKKy5UUAorLkJSICJcLXIiICwgIiBcLXJlc29sdmUiCit1c2UgdGhlIHN5c3RlbSdzIG5hbWUgcmVzb2x2ZXIgdG8gcHJpbnQgRE5TIG5hbWVzIGluc3RlYWQgb2YKK2hvc3QgYWRkcmVzc2VzLgorCisuVFAKKy5CUiAiXC1uIiAsICIgXC1uZXRucyAiIDxORVROUz4KK3N3aXRjaGVzCisuQiBpcAordG8gdGhlIHNwZWNpZmllZCBuZXR3b3JrIG5hbWVzcGFjZQorLklSIE5FVE5TIC4KK0FjdHVhbGx5IGl0IGp1c3Qgc2ltcGxpZmllcyBleGVjdXRpbmcgb2Y6CisKKy5CIGlwIG5ldG5zIGV4ZWMKKy5JUiBORVROUworLkIgaXAKKy5SSSAiWyAiIE9QVElPTlMgIiBdICIgT0JKRUNUICIgeyAiIENPTU1BTkQgIiB8ICIKKy5CUiBoZWxwICIgfSIKKwordG8KKworLkIgaXAKKy5SSSAiLW5bZXRuc10gIiBORVROUyAiIFsgIiBPUFRJT05TICIgXSAiIE9CSkVDVCAiIHsgIiBDT01NQU5EICIgfCAiCisuQlIgaGVscCAiIH0iCisKKy5UUAorLkJSICJcLWEiICwgIiBcLWFsbCIKK2V4ZWN1dGVzIHNwZWNpZmllZCBjb21tYW5kIG92ZXIgYWxsIG9iamVjdHMsIGl0IGRlcGVuZHMgaWYgY29tbWFuZCBzdXBwb3J0cyB0aGlzIG9wdGlvbi4KKworLlRQCisuQlIgIlwtYyIgLCAiIC1jb2xvciIKK1VzZSBjb2xvciBvdXRwdXQuCisKKy5UUAorLkJSICJcLXQiICwgIiBcLXRpbWVzdGFtcCIKK2Rpc3BsYXkgY3VycmVudCB0aW1lIHdoZW4gdXNpbmcgbW9uaXRvciBvcHRpb24uCisKKy5TSCBJUCAtIENPTU1BTkQgU1lOVEFYCisKKy5TUworLkkgT0JKRUNUCisKKy5UUAorLkIgYWRkcmVzcworLSBwcm90b2NvbCAoSVAgb3IgSVB2NikgYWRkcmVzcyBvbiBhIGRldmljZS4KKworLlRQCisuQiBhZGRybGFiZWwKKy0gbGFiZWwgY29uZmlndXJhdGlvbiBmb3IgcHJvdG9jb2wgYWRkcmVzcyBzZWxlY3Rpb24uCisKKy5UUAorLkIgbDJ0cAorLSB0dW5uZWwgZXRoZXJuZXQgb3ZlciBJUCAoTDJUUHYzKS4KKworLlRQCisuQiBsaW5rCistIG5ldHdvcmsgZGV2aWNlLgorCisuVFAKKy5CIG1hZGRyZXNzCistIG11bHRpY2FzdCBhZGRyZXNzLgorCisuVFAKKy5CIG1vbml0b3IKKy0gd2F0Y2ggZm9yIG5ldGxpbmsgbWVzc2FnZXMuCisKKy5UUAorLkIgbXJvdXRlCistIG11bHRpY2FzdCByb3V0aW5nIGNhY2hlIGVudHJ5LgorCisuVFAKKy5CIG1ydWxlCistIHJ1bGUgaW4gbXVsdGljYXN0IHJvdXRpbmcgcG9saWN5IGRhdGFiYXNlLgorCisuVFAKKy5CIG5laWdoYm91cgorLSBtYW5hZ2UgQVJQIG9yIE5ESVNDIGNhY2hlIGVudHJpZXMuCisKKy5UUAorLkIgbmV0bnMKKy0gbWFuYWdlIG5ldHdvcmsgbmFtZXNwYWNlcy4KKworLlRQCisuQiBudGFibGUKKy0gbWFuYWdlIHRoZSBuZWlnaGJvciBjYWNoZSdzIG9wZXJhdGlvbi4KKworLlRQCisuQiByb3V0ZQorLSByb3V0aW5nIHRhYmxlIGVudHJ5LgorCisuVFAKKy5CIHJ1bGUKKy0gcnVsZSBpbiByb3V0aW5nIHBvbGljeSBkYXRhYmFzZS4KKworLlRQCisuQiB0Y3BfbWV0cmljcy90Y3BtZXRyaWNzCistIG1hbmFnZSBUQ1AgTWV0cmljcworCisuVFAKKy5CIHR1bm5lbAorLSB0dW5uZWwgb3ZlciBJUC4KKworLlRQCisuQiB0dW50YXAKKy0gbWFuYWdlIFRVTi9UQVAgZGV2aWNlcy4KKworLlRQCisuQiB4ZnJtCistIG1hbmFnZSBJUFNlYyBwb2xpY2llcy4KKworLlBQCitUaGUgbmFtZXMgb2YgYWxsIG9iamVjdHMgbWF5IGJlIHdyaXR0ZW4gaW4gZnVsbCBvcgorYWJicmV2aWF0ZWQgZm9ybSwgZm9yIGV4YW1wbGUKKy5CIGFkZHJlc3MKK2NhbiBiZSBhYmJyZXZpYXRlZCBhcworLkIgYWRkcgorb3IganVzdAorLkIgYS4KKworLlNTCisuSSBDT01NQU5ECisKK1NwZWNpZmllcyB0aGUgYWN0aW9uIHRvIHBlcmZvcm0gb24gdGhlIG9iamVjdC4KK1RoZSBzZXQgb2YgcG9zc2libGUgYWN0aW9ucyBkZXBlbmRzIG9uIHRoZSBvYmplY3QgdHlwZS4KK0FzIGEgcnVsZSwgaXQgaXMgcG9zc2libGUgdG8KKy5CUiAiYWRkIiAsICIgZGVsZXRlIgorYW5kCisuQiBzaG93Cisob3IKKy5CIGxpc3QKKykgb2JqZWN0cywgYnV0IHNvbWUgb2JqZWN0cyBkbyBub3QgYWxsb3cgYWxsIG9mIHRoZXNlIG9wZXJhdGlvbnMKK29yIGhhdmUgc29tZSBhZGRpdGlvbmFsIGNvbW1hbmRzLiBUaGUKKy5CIGhlbHAKK2NvbW1hbmQgaXMgYXZhaWxhYmxlIGZvciBhbGwgb2JqZWN0cy4gSXQgcHJpbnRzCitvdXQgYSBsaXN0IG9mIGF2YWlsYWJsZSBjb21tYW5kcyBhbmQgYXJndW1lbnQgc3ludGF4IGNvbnZlbnRpb25zLgorLnNwCitJZiBubyBjb21tYW5kIGlzIGdpdmVuLCBzb21lIGRlZmF1bHQgY29tbWFuZCBpcyBhc3N1bWVkLgorVXN1YWxseSBpdCBpcworLkIgbGlzdAorb3IsIGlmIHRoZSBvYmplY3RzIG9mIHRoaXMgY2xhc3MgY2Fubm90IGJlIGxpc3RlZCwKKy5CUiAiaGVscCIgLgorCisuU0ggRVhJVCBTVEFUVVMKK0V4aXQgc3RhdHVzIGlzIDAgaWYgY29tbWFuZCB3YXMgc3VjY2Vzc2Z1bCwgYW5kIDEgaWYgdGhlcmUgaXMgYSBzeW50YXggZXJyb3IuCitJZiBhbiBlcnJvciB3YXMgcmVwb3J0ZWQgYnkgdGhlIGtlcm5lbCBleGl0IHN0YXR1cyBpcyAyLgorCisuU0ggSElTVE9SWQorLkIgaXAKK3dhcyB3cml0dGVuIGJ5IEFsZXhleSBOLiBLdXpuZXRzb3YgYW5kIGFkZGVkIGluIExpbnV4IDIuMi4KKy5TSCBTRUUgQUxTTworLkJSIGlwLWFkZHJlc3MgKDgpLAorLkJSIGlwLWFkZHJsYWJlbCAoOCksCisuQlIgaXAtbDJ0cCAoOCksCisuQlIgaXAtbGluayAoOCksCisuQlIgaXAtbWFkZHJlc3MgKDgpLAorLkJSIGlwLW1vbml0b3IgKDgpLAorLkJSIGlwLW1yb3V0ZSAoOCksCisuQlIgaXAtbmVpZ2hib3VyICg4KSwKKy5CUiBpcC1uZXRucyAoOCksCisuQlIgaXAtbnRhYmxlICg4KSwKKy5CUiBpcC1yb3V0ZSAoOCksCisuQlIgaXAtcnVsZSAoOCksCisuQlIgaXAtdGNwX21ldHJpY3MgKDgpLAorLkJSIGlwLXR1bm5lbCAoOCksCisuQlIgaXAteGZybSAoOCkKKy5icgorLlJCICJJUCBDb21tYW5kIHJlZmVyZW5jZSAiIGlwLWNyZWYucHMKKy5TSCBSRVBPUlRJTkcgQlVHUworUmVwb3J0IGFueSBidWdzIHRvIHRoZSBOZXR3b3JrIERldmVsb3BlcnMgbWFpbGluZyBsaXN0CisuQiA8bmV0ZGV2QHZnZXIua2VybmVsLm9yZz4KK3doZXJlIHRoZSBkZXZlbG9wbWVudCBhbmQgbWFpbnRlbmFuY2UgaXMgcHJpbWFyaWx5IGRvbmUuCitZb3UgZG8gbm90IGhhdmUgdG8gYmUgc3Vic2NyaWJlZCB0byB0aGUgbGlzdCB0byBzZW5kIGEgbWVzc2FnZSB0aGVyZS4KKworLlNIIEFVVEhPUgorT3JpZ2luYWwgTWFucGFnZSBieSBNaWNoYWlsIExpdHZhayA8bWNpQG93bC5vcGVud2FsbC5jb20+CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9tYW4vbWFuOC9sbnN0YXQuOCBiL2lwcm91dGUyL21hbi9tYW44L2xuc3RhdC44Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZDVmNGEKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9tYW4vbWFuOC9sbnN0YXQuOApAQCAtMCwwICsxLDI2MyBAQAorLlRIIExOU1RBVCA4CisuU0ggTkFNRQorbG5zdGF0IFwtIHVuaWZpZWQgbGludXggbmV0d29yayBzdGF0aXN0aWNzCisuU0ggU1lOT1BTSVMKKy5CIGxuc3RhdAorLlJJIFsgb3B0aW9ucyBdCisuU0ggREVTQ1JJUFRJT04KK1RoaXMgbWFudWFsIHBhZ2UgZG9jdW1lbnRzIGJyaWVmbHkgdGhlCisuQiBsbnN0YXQKK2NvbW1hbmQuCisuUFAKK1xmQmxuc3RhdFxmUCBpcyBhIGdlbmVyYWxpemVkIGFuZCBtb3JlIGZlYXR1cmUtY29tcGxldGUgcmVwbGFjZW1lbnQgZm9yIHRoZSBvbGQKK3J0c3RhdCBwcm9ncmFtLiBJdCBpcyBjb21tb25seSB1c2VkIHRvIHBlcmlvZGljYWxseSBwcmludCBhIHNlbGVjdGlvbiBvZgorc3RhdGlzdGljYWwgdmFsdWVzIGV4cG9ydGVkIGJ5IHRoZSBrZXJuZWwuCitJbiBhZGRpdGlvbiB0byByb3V0aW5nIGNhY2hlIHN0YXRpc3RpY3MsIGl0IHN1cHBvcnRzIGFueSBraW5kIG9mIHN0YXRpc3RpY3MgdGhlCitsaW51eCBrZXJuZWwgZXhwb3J0cyB2aWEgYSBmaWxlIGluIC9wcm9jL25ldC9zdGF0Ly4KKy5QUAorRWFjaCBmaWxlIGluIC9wcm9jL25ldC9zdGF0LyBjb250YWlucyBhIGhlYWRlciBsaW5lIGxpc3RpbmcgdGhlIGNvbHVtbiBuYW1lcy4KK1RoZXNlIG5hbWVzIGFyZSB1c2VkIGJ5IFxmQmxuc3RhdFxmUCBhcyBrZXlzIGZvciBzZWxlY3Rpbmcgd2hpY2ggc3RhdGlzdGljcyB0bworcHJpbnQuIEZvciBldmVyeSBDUFUgcHJlc2VudCBpbiB0aGUgc3lzdGVtLCBhIGxpbmUgZm9sbG93cyB3aGljaCBsaXN0cyB0aGUKK2FjdHVhbCB2YWx1ZXMgZm9yIGVhY2ggY29sdW1uIG9mIHRoZSBmaWxlLiBcZkJsbnN0YXRcZlAgc3VtcyB0aGVzZSB2YWx1ZXMgdXAKKyh3aGljaCBpbiBmYWN0IGFyZSBjb3VudGVycykgYmVmb3JlIHByaW50aW5nIHRoZW0uIEFmdGVyIGVhY2ggaW50ZXJ2YWwsIG9ubHkKK3RoZSBkaWZmZXJlbmNlIHRvIHRoZSBsYXN0IHZhbHVlIGlzIHByaW50ZWQuCisuUFAKK0ZpbGVzIGFuZCBjb2x1bW5zIG1heSBiZSBzZWxlY3RlZCBieSB1c2luZyB0aGUgXGZCLWZcZlAgYW5kIFxmQi1rXGZQCitwYXJhbWV0ZXJzLiBCeSBkZWZhdWx0LCBhbGwgY29sdW1ucyBvZiBhbGwgZmlsZXMgYXJlIHByaW50ZWQuCisuU0ggT1BUSU9OUworbG5zdGF0IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgb3B0aW9ucy4KKy5UUAorLkIgXC1oLCBcLVwtaGVscAorU2hvdyBzdW1tYXJ5IG9mIG9wdGlvbnMuCisuVFAKKy5CIFwtViwgXC1cLXZlcnNpb24KK1Nob3cgdmVyc2lvbiBvZiBwcm9ncmFtLgorLlRQCisuQiBcLWMsIFwtXC1jb3VudCA8Y291bnQ+CitQcmludCA8Y291bnQ+IG51bWJlciBvZiBpbnRlcnZhbHMuCisuVFAKKy5CIFwtZCwgXC1cLWR1bXAKK0R1bXAgbGlzdCBvZiBhdmFpbGFibGUgZmlsZXMva2V5cy4KKy5UUAorLkIgXC1mLCBcLVwtZmlsZSA8ZmlsZT4KK1N0YXRpc3RpY3MgZmlsZSB0byB1c2UsIG1heSBiZSBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMuIEJ5IGRlZmF1bHQgYWxsIGZpbGVzIGluIC9wcm9jL25ldC9zdGF0IGFyZSBzY2FubmVkLgorLlRQCisuQiBcLWksIFwtXC1pbnRlcnZhbCA8aW50dj4KK1NldCBpbnRlcnZhbCB0byAnaW50dicgc2Vjb25kcy4KKy5UUAorLkIgXC1qLCBcLVwtanNvbgorRGlzcGxheSByZXN1bHRzIGluIEpTT04gZm9ybWF0CisuVFAKKy5CIFwtaywgXC1cLWtleXMgayxrLGssLi4uCitEaXNwbGF5IG9ubHkga2V5cyBzcGVjaWZpZWQuIEVhY2gga2V5IFxmQmtcZlAgaXMgb2YgdGhlIGZvcm0gXGZCW2ZpbGU6XWtleVxmUC4gSWYgXGZCPGZpbGU+XGZQCitpcyBnaXZlbiwgdGhlIHNlYXJjaCBmb3IgdGhlIGdpdmVuIGtleSBpcyBsaW1pdGVkIHRvIHRoYXQgZmlsZS4gT3RoZXJ3aXNlIHRoZSBmaXJzdCBmaWxlIGNvbnRhaW5pbmcKK3RoZSBzZWFyY2hlZCBrZXkgaXMgYmVpbmcgdXNlZC4KKy5UUAorLkIgXC1zLCBcLVwtc3ViamVjdCBbMC0yXQorU3BlY2lmeSBkaXNwbGF5IG9mIHN1YmplY3QvaGVhZGVyLiAnMCcgbWVhbnMgbm8gaGVhZGVyIGF0IGFsbCwgJzEnIHByaW50cyBhIGhlYWRlciBvbmx5IGF0IHN0YXJ0IG9mIHRoZSBwcm9ncmFtIGFuZCAnMicgcHJpbnRzIGEgaGVhZGVyIGV2ZXJ5IDIwIGxpbmVzLgorLlRQCisuQiBcLXcsIFwtXC13aWR0aCBuLG4sbiwuLi4KK1dpZHRoIGZvciBlYWNoIGZpZWxkLgorLlNIIFVTQUdFIEVYQU1QTEVTCisuVFAKKy5CICMgbG5zdGF0IC1kCitHZXQgYSBsaXN0IG9mIHN1cHBvcnRlZCBzdGF0aXN0aWNzIGZpbGVzLgorLlRQCisuQiAjIGxuc3RhdCAtayBhcnBfY2FjaGU6ZW50cmllcyxydF9jYWNoZTppbl9oaXQsYXJwX2NhY2hlOmRlc3Ryb3lzCitTZWxlY3QgdGhlIHNwZWNpZmllZCBmaWxlcyBhbmQga2V5cy4KKy5UUAorLkIgIyBsbnN0YXQgLWkgMTAKK1VzZSBhbiBpbnRlcnZhbCBvZiAxMCBzZWNvbmRzLgorLlRQCisuQiAjIGxuc3RhdCAtZiBpcF9jb25udHJhY2sKK1VzZSBvbmx5IHRoZSBzcGVjaWZpZWQgZmlsZSBmb3Igc3RhdGlzdGljcy4KKy5UUAorLkIgIyBsbnN0YXQgLXMgMAorRG8gbm90IHByaW50IGEgaGVhZGVyIGF0IGFsbC4KKy5UUAorLkIgIyBsbnN0YXQgLXMgMjAKK1ByaW50IGEgaGVhZGVyIGF0IHN0YXJ0IGFuZCBldmVyeSAyMCBsaW5lcy4KKy5UUAorLkIgIyBsbnN0YXQgLWMgLTEgLWkgMSAtZiBydF9jYWNoZSAtayBlbnRyaWVzLGluX2hpdCxpbl9zbG93X3RvdAorRGlzcGxheSBzdGF0aXN0aWNzIGZvciBrZXlzIGVudHJpZXMsIGluX2hpdCBhbmQgaW5fc2xvd190b3Qgb2YgZmllbGQgcnRfY2FjaGUgZXZlcnkgc2Vjb25kLgorCisuU0ggRklMRVMKKy5UUAorLkIgL3Byb2MvbmV0L3N0YXQvYXJwX2NhY2hlLCAvcHJvYy9uZXQvc3RhdC9uZGlzY19jYWNoZQorU3RhdGlzdGljcyBhcm91bmQgbmVpZ2hib3IgY2FjaGUgYW5kIEFSUC4gXGZCYXJwX2NhY2hlXGZQIGlzIGZvciBJUHY0LCBcZkJuZGlzY19jYWNoZVxmUCBpcyB0aGUgc2FtZSBmb3IgSVB2Ni4KKy5zcAorLkIgZW50cmllcworTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIG5laWdoYm9yIHRhYmxlLgorLnNwCisuQiBhbGxvY3MKK0hvdyBtYW55IG5laWdoYm9yIGVudHJpZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZC4KKy5zcAorLkIgZGVzdHJveXMKK0hvdyBtYW55IG5laWdoYm9yIGVudHJpZXMgaGF2ZSBiZWVuIHJlbW92ZWQuCisuc3AKKy5CIGhhc2hfZ3Jvd3MKK0hvdyBvZnRlbiB0aGUgbmVpZ2hib3IgKGhhc2gpIHRhYmxlIHdhcyBpbmNyZWFzZWQuCisuc3AKKy5CIGxvb2t1cHMKK0hvdyBtYW55IGxvb2t1cHMgd2VyZSBwZXJmb3JtZWQuCisuc3AKKy5CIGhpdHMKK0hvdyBtYW55IFxmQmxvb2t1cHNcZlAgd2VyZSBzdWNjZXNzZnVsLgorLnNwCisuQiByZXNfZmFpbGVkCitIb3cgbWFueSBuZWlnaGJvciBsb29rdXBzIGZhaWxlZC4KKy5zcAorLkIgcmN2X3Byb2Jlc19tY2FzdAorSG93IG1hbnkgbXVsdGljYXN0IG5laWdoYm9yIHNvbGljaXRhdGlvbnMgd2VyZSByZWNlaXZlZC4gKElQdjYgb25seS4pCisuc3AKKy5CIHJjdl9wcm9iZXNfdWNhc3QKK0hvdyBtYW55IHVuaWNhc3QgbmVpZ2hib3Igc29saWNpdGF0aW9ucyB3ZXJlIHJlY2VpdmVkLiAoSVB2NiBvbmx5LikKKy5zcAorLkIgcGVyaW9kaWNfZ2NfcnVucworSG93IG1hbnkgZ2FyYmFnZSBjb2xsZWN0aW9uIHJ1bnMgd2VyZSBleGVjdXRlZC4KKy5zcAorLkIgZm9yY2VkX2djX3J1bnMKK0hvdyBtYW55IGZvcmNlZCBnYXJiYWdlIGNvbGxlY3Rpb24gcnVucyB3ZXJlIGV4ZWN1dGVkLiBIYXBwZW5zIHdoZW4gYWRkaW5nIGFuCitlbnRyeSBhbmQgdGhlIHRhYmxlIGlzIHRvbyBmdWxsLgorLnNwCisuQiB1bnJlc29sdmVkX2Rpc2NhcmRzCitIb3cgbWFueSBuZWlnaGJvciB0YWJsZSBlbnRyaWVzIHdlcmUgZGlzY2FyZGVkIGR1ZSB0byBsb29rdXAgZmFpbHVyZS4KKy5zcAorLkIgdGFibGVfZnVsbHMKK051bWJlciBvZiB0YWJsZSBvdmVyZmxvd3MuIEhhcHBlbnMgaWYgdGFibGUgaXMgZnVsbCBhbmQgZm9yY2VkIEdDIHJ1biAoc2VlCitcZkJmb3JjZWRfZ2NfcnVuc1xmUCkgaGFzIGZhaWxlZC4KKworLlRQCisuQiAvcHJvYy9uZXQvc3RhdC9pcF9jb25udHJhY2ssIC9wcm9jL25ldC9zdGF0L25mX2Nvbm50cmFjaworQ29ubnRyYWNrIHJlbGF0ZWQgY291bnRlcnMuIFxmQmlwX2Nvbm50cmFja1xmUCBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKK3dpdGggb2xkZXIgdXNlcnNwYWNlIG9ubHkgYW5kIHNob3dzIHRoZSBzYW1lIGRhdGEgYXMgXGZCbmZfY29ubnRyYWNrXGZQLgorLnNwCisuQiBlbnRyaWVzCitOdW1iZXIgb2YgZW50cmllcyBpbiBjb25udHJhY2sgdGFibGUuCisuc3AKKy5CIHNlYXJjaGVkCitOdW1iZXIgb2YgY29ubnRyYWNrIHRhYmxlIGxvb2t1cHMgcGVyZm9ybWVkLgorLnNwCisuQiBmb3VuZAorTnVtYmVyIG9mIFxmQnNlYXJjaGVkXGZQIGVudHJpZXMgd2hpY2ggd2VyZSBzdWNjZXNzZnVsLgorLnNwCisuQiBuZXcKK051bWJlciBvZiBjb25udHJhY2sgZW50cmllcyBhZGRlZCB3aGljaCB3ZXJlIG5vdCBleHBlY3RlZCBiZWZvcmUuCisuc3AKKy5CIGludmFsaWQKK051bWJlciBvZiBwYWNrZXRzIHNlZW4gd2hpY2ggY2FuIG5vdCBiZSB0cmFja2VkLgorLnNwCisuQiBpZ25vcmUKK051bWJlciBvZiBwYWNrZXRzIHNlZW4gd2hpY2ggYXJlIGFscmVhZHkgY29ubmVjdGVkIHRvIGEgY29ubnRyYWNrIGVudHJ5LgorLnNwCisuQiBkZWxldGUKK051bWJlciBvZiBjb25udHJhY2sgZW50cmllcyB3aGljaCB3ZXJlIHJlbW92ZWQuCisuc3AKKy5CIGRlbGV0ZV9saXN0CitOdW1iZXIgb2YgY29ubnRyYWNrIGVudHJpZXMgd2hpY2ggd2VyZSBwdXQgdG8gZHlpbmcgbGlzdC4KKy5zcAorLkIgaW5zZXJ0CitOdW1iZXIgb2YgZW50cmllcyBpbnNlcnRlZCBpbnRvIHRoZSBsaXN0LgorLnNwCisuQiBpbnNlcnRfZmFpbGVkCitOdW1iZXIgb2YgZW50cmllcyBmb3Igd2hpY2ggbGlzdCBpbnNlcnRpb24gd2FzIGF0dGVtcHRlZCBidXQgZmFpbGVkIChoYXBwZW5zIGlmCit0aGUgc2FtZSBlbnRyeSBpcyBhbHJlYWR5IHByZXNlbnQpLgorLnNwCisuQiBkcm9wCitOdW1iZXIgb2YgcGFja2V0cyBkcm9wcGVkIGR1ZSB0byBjb25udHJhY2sgZmFpbHVyZS4gRWl0aGVyIG5ldyBjb25udHJhY2sgZW50cnkKK2FsbG9jYXRpb24gZmFpbGVkLCBvciBwcm90b2NvbCBoZWxwZXIgZHJvcHBlZCB0aGUgcGFja2V0LgorLnNwCisuQiBlYXJseV9kcm9wCitOdW1iZXIgb2YgZHJvcHBlZCBjb25udHJhY2sgZW50cmllcyB0byBtYWtlIHJvb20gZm9yIG5ldyBvbmVzLCBpZiBtYXhpbXVtIHRhYmxlCitzaXplIHdhcyByZWFjaGVkLgorLnNwCisuQiBpY21wX2Vycm9yCitOdW1iZXIgb2YgcGFja2V0cyB3aGljaCBjb3VsZCBub3QgYmUgdHJhY2tlZCBkdWUgdG8gZXJyb3Igc2l0dWF0aW9uLiBUaGlzIGlzIGEKK3N1YnNldCBvZiBcZkJpbnZhbGlkXGZQLgorLnNwCisuQiBleHBlY3RfbmV3CitOdW1iZXIgb2YgY29ubnRyYWNrIGVudHJpZXMgYWRkZWQgYWZ0ZXIgYW4gZXhwZWN0YXRpb24gZm9yIHRoZW0gd2FzIGFscmVhZHkKK3ByZXNlbnQuCisuc3AKKy5CIGV4cGVjdF9jcmVhdGUKK051bWJlciBvZiBleHBlY3RhdGlvbnMgYWRkZWQuCisuc3AKKy5CIGV4cGVjdF9kZWxldGUKK051bWJlciBvZiBleHBlY3RhdGlvbnMgZGVsZXRlZC4KKy5zcAorLkIgc2VhcmNoX3Jlc3RhcnQKK051bWJlciBvZiBjb25udHJhY2sgdGFibGUgbG9va3VwcyB3aGljaCBoYWQgdG8gYmUgcmVzdGFydGVkIGR1ZSB0byBoYXNodGFibGUKK3Jlc2l6ZXMuCisKKy5UUAorLkIgL3Byb2MvbmV0L3N0YXQvcnRfY2FjaGUKK1JvdXRpbmcgY2FjaGUgc3RhdGlzdGljcy4KKy5zcAorLkIgZW50cmllcworTnVtYmVyIG9mIGVudHJpZXMgaW4gcm91dGluZyBjYWNoZS4KKy5zcAorLkIgaW5faGl0CitOdW1iZXIgb2Ygcm91dGUgY2FjaGUgaGl0cyBmb3IgaW5jb21pbmcgcGFja2V0cy4gRGVwcmVjYXRlZCBzaW5jZSBJUCByb3V0ZQorY2FjaGUgcmVtb3ZhbCwgdGhlcmVmb3JlIGFsd2F5cyB6ZXJvLgorLnNwCisuQiBpbl9zbG93X3RvdAorTnVtYmVyIG9mIHJvdXRpbmcgY2FjaGUgZW50cmllcyBhZGRlZCBmb3IgaW5wdXQgdHJhZmZpYy4KKy5zcAorLkIgaW5fc2xvd19tYworTnVtYmVyIG9mIG11bHRpY2FzdCByb3V0aW5nIGNhY2hlIGVudHJpZXMgYWRkZWQgZm9yIGlucHV0IHRyYWZmaWMuCisuc3AKKy5CIGluX25vX3JvdXRlCitOdW1iZXIgb2YgaW5wdXQgcGFja2V0cyBmb3Igd2hpY2ggbm8gcm91dGluZyB0YWJsZSBlbnRyeSB3YXMgZm91bmQuCisuc3AKKy5CIGluX2JyZAorTnVtYmVyIG9mIG1hdGNoZWQgaW5wdXQgYnJvYWRjYXN0IHBhY2tldHMuCisuc3AKKy5CIGluX21hcnRpYW5fZHN0CitOdW1iZXIgb2YgaW5jb21pbmcgbWFydGlhbiBkZXN0aW5hdGlvbiBwYWNrZXRzLgorLnNwCisuQiBpbl9tYXJ0aWFuX3NyYworTnVtYmVyIG9mIGluY29taW5nIG1hcnRpYW4gc291cmNlIHBhY2tldHMuCisuc3AKKy5CIG91dF9oaXQKK051bWJlciBvZiByb3V0ZSBjYWNoZSBoaXRzIGZvciBvdXRnb2luZyBwYWNrZXRzLiBEZXByZWNhdGVkIHNpbmNlIElQIHJvdXRlCitjYWNoZSByZW1vdmFsLCB0aGVyZWZvcmUgYWx3YXlzIHplcm8uCisuc3AKKy5CIG91dF9zbG93X3RvdAorTnVtYmVyIG9mIHJvdXRpbmcgY2FjaGUgZW50cmllcyBhZGRlZCBmb3Igb3V0cHV0IHRyYWZmaWMuCisuc3AKKy5CIG91dF9zbG93X21jCitOdW1iZXIgb2YgbXVsdGljYXN0IHJvdXRpbmcgY2FjaGUgZW50cmllcyBhZGRlZCBmb3Igb3V0cHV0IHRyYWZmaWMuCisuc3AKKy5CIGdjX3RvdGFsCitUb3RhbCBudW1iZXIgb2YgZ2FyYmFnZSBjb2xsZWN0aW9uIHJ1bnMuIERlcHJlY2F0ZWQgc2luY2UgSVAgcm91dGUgY2FjaGUKK3JlbW92YWwsIHRoZXJlZm9yZSBhbHdheXMgemVyby4KKy5zcAorLkIgZ2NfaWdub3JlZAorTnVtYmVyIG9mIGlnbm9yZWQgZ2FyYmFnZSBjb2xsZWN0aW9uIHJ1bnMgZHVlIHRvIG1pbmltdW0gR0MgaW50ZXJ2YWwgbm90CityZWFjaGVkIGFuZCByb3V0aW5nIGNhY2hlIG5vdCBmdWxsLiBEZXByZWNhdGVkIHNpbmNlIElQIHJvdXRlIGNhY2hlIHJlbW92YWwsCit0aGVyZWZvcmUgYWx3YXlzIHplcm8uCisuc3AKKy5CIGdjX2dvYWxfbWlzcworTnVtYmVyIG9mIGdhcmJhZ2UgY29sbGVjdG9yIGdvYWwgbWlzc2VzLiBEZXByZWNhdGVkIHNpbmNlIElQIHJvdXRlIGNhY2hlCityZW1vdmFsLCB0aGVyZWZvcmUgYWx3YXlzIHplcm8uCisuc3AKKy5CIGdjX2RzdF9vdmVyZmxvdworTnVtYmVyIG9mIGRlc3RpbmF0aW9uIGNhY2hlIG92ZXJmbG93cy4gRGVwcmVjYXRlZCBzaW5jZSBJUCByb3V0ZSBjYWNoZSByZW1vdmFsLAordGhlcmVmb3JlIGFsd2F5cyB6ZXJvLgorLnNwCisuQiBpbl9obGlzdF9zZWFyY2gKK051bWJlciBvZiBoYXNoIHRhYmxlIGxpc3QgdHJhdmVyc2FscyBmb3IgaW5wdXQgdHJhZmZpYy4gRGVwcmVjYXRlZCBzaW5jZSBJUAorcm91dGUgY2FjaGUgcmVtb3ZhbCwgdGhlcmVmb3JlIGFsd2F5cyB6ZXJvLgorLnNwCisuQiBvdXRfaGxpc3Rfc2VhcmNoCitOdW1iZXIgb2YgaGFzaCB0YWJsZSBsaXN0IHRyYXZlcnNhbHMgZm9yIG91dHB1dCB0cmFmZmljLiBEZXByZWNhdGVkIHNpbmNlIElQCityb3V0ZSBjYWNoZSByZW1vdmFsLCB0aGVyZWZvcmUgYWx3YXlzIHplcm8uCisKKy5TSCBTRUUgQUxTTworLkJSIGlwICg4KSwKK2FuZCAvdXNyL3NoYXJlL2RvYy9pcHJvdXRlLWRvYy9SRUFETUUubG5zdGF0IChwYWNrYWdlIGlwcm91dGUtZG9jIG9uIERlYmlhbikKKy5icgorLlNIIEFVVEhPUgorbG5zdGF0IHdhcyB3cml0dGVuIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+LgorLlBQCitUaGlzIG1hbnVhbCBwYWdlIHdhcyB3cml0dGVuIGJ5IE1pY2hhZWwgUHJva29wIDxtaWthQGdybWwub3JnPiBmb3IgdGhlIERlYmlhbiBwcm9qZWN0IChidXQgbWF5IGJlIHVzZWQgYnkgb3RoZXJzKS4KZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L25zdGF0LjggYi9pcHJvdXRlMi9tYW4vbWFuOC9uc3RhdC44Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MDNjYzgKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9tYW4vbWFuOC9uc3RhdC44CkBAIC0wLDAgKzEgQEAKKy5zbyBtYW44L3J0YWNjdC44CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9tYW4vbWFuOC9yb3V0ZWYuOCBiL2lwcm91dGUyL21hbi9tYW44L3JvdXRlZi44Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYTcwNTkKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9tYW4vbWFuOC9yb3V0ZWYuOApAQCAtMCwwICsxIEBACisuc28gbWFuOC9yb3V0ZWwuOApkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWFuL21hbjgvcm91dGVsLjggYi9pcHJvdXRlMi9tYW4vbWFuOC9yb3V0ZWwuOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmQ1ODBmCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbWFuL21hbjgvcm91dGVsLjgKQEAgLTAsMCArMSwzMiBAQAorLlRIICJST1VURUwiICI4IiAiMyBKYW4sIDIwMDgiICJpcHJvdXRlMiIgIkxpbnV4IgorLlNIICJOQU1FIgorLkxQCityb3V0ZWwgXC0gbGlzdCByb3V0ZXMgd2l0aCBwcmV0dHkgb3V0cHV0IGZvcm1hdAorLmJyCityb3V0ZWYgXC0gZmx1c2ggcm91dGVzCisuU0ggIlNZTlRBWCIKKy5MUAorcm91dGVsIFtcZkl0YWJsZW5yXGZQIFtcZklyYXcgaXAgYXJncy4uLlxmUF1dCisuYnIKK3JvdXRlZgorLlNIICJERVNDUklQVElPTiIKKy5MUAorVGhlc2UgcHJvZ3JhbXMgYXJlIGEgc2V0IG9mIGhlbHBlciBzY3JpcHRzIHlvdSBjYW4gdXNlIGluc3RlYWQgb2YgcmF3IGlwcm91dGUyIGNvbW1hbmRzLgorLmJyCitUaGUgcm91dGVsIHNjcmlwdCB3aWxsIGxpc3Qgcm91dGVzIGluIGEgZm9ybWF0IHRoYXQgc29tZSBtaWdodCBjb25zaWRlciBlYXNpZXIgdG8gaW50ZXJwcmV0IHRoZW4gdGhlIGlwIHJvdXRlIGxpc3QgZXF1aXZhbGVudC4KKy5icgorVGhlIHJvdXRlZiBzY3JpcHQgZG9lcyBub3QgdGFrZSBhbnkgYXJndW1lbnRzIGFuZCB3aWxsIHNpbXBseSBmbHVzaCB0aGUgcm91dGluZyB0YWJsZSBkb3duIHRoZSBkcmFpbi4gQmV3YXJlISBUaGlzIG1lYW5zIGRlbGV0aW5nIGFsbCByb3V0ZXMgd2hpY2ggd2lsbCBtYWtlIHlvdXIgbmV0d29yayB1bnVzYWJsZSEKKworLlNIICJGSUxFUyIKKy5MUAorXGZJL3Vzci9iaW4vcm91dGVmXGZQCisuYnIKK1xmSS91c3IvYmluL3JvdXRlbFxmUAorLlNIICJBVVRIT1JTIgorLkxQCitUaGUgcm91dGVsIHNjcmlwdCB3YXMgd3JpdHRlbiBieSBTdGVwaGVuIFIuIHZhbiBkZW4gQmVyZyA8c3JiQGN1Y2kubmw+LCAxOTk5LzA0LzE4IGFuZCBkb25hdGVkIHRvIHRoZSBwdWJsaWMgZG9tYWluLgorLmJyCitUaGlzIG1hbnVhbCBwYWdlIHdhcyB3cml0dGVuIGJ5IEFuZHJlYXMgSGVucmlrc3NvbiAgPGFuZHJlYXNAZmF0YWwuc2U+LCBmb3IgdGhlIERlYmlhbiBHTlUvTGludXggc3lzdGVtLgorLlNIICJTRUUgQUxTTyIKKy5MUAoraXAoOCkKZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L3J0YWNjdC44IGIvaXByb3V0ZTIvbWFuL21hbjgvcnRhY2N0LjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NmOTdhYQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L3J0YWNjdC44CkBAIC0wLDAgKzEsNDkgQEAKKy5USCBSVEFDQ1QgOCAiMjcgSnVuZSwgMjAwNyIKKworLlNIIE5BTUUKK25zdGF0LCBydGFjY3QgLSBuZXR3b3JrIHN0YXRpc3RpY3MgdG9vbHMuCisKKy5TSCBTWU5PUFNJUworVXNhZ2U6IG5zdGF0IFsgLWg/dlZ6cm5hc2Q6dDogXSBbIFBBVFRFUk4gWyBQQVRURVJOIF0gXQorLmJyCitVc2FnZTogcnRhY2N0IFsgLWg/dlZ6cm5hc2Q6dDogXSBbIExpc3RPZlJlYWxtcyBdCisKKy5TSCBERVNDUklQVElPTgorLkIgbnN0YXQKK2FuZAorLkIgcnRhY2N0CithcmUgc2ltcGxlIHRvb2xzIHRvIG1vbml0b3Iga2VybmVsIHNubXAgY291bnRlcnMgYW5kIG5ldHdvcmsgaW50ZXJmYWNlIHN0YXRpc3RpY3MuCisKKy5TSCBPUFRJT05TCisuQiBcLWgsIFwtXC1oZWxwCitQcmludCBoZWxwCisuVFAKKy5CIFwtViwgXC1cLXZlcnNpb24KK1ByaW50IHZlcnNpb24KKy5UUAorLkIgXC16LCBcLVwtemVybworRHVtcCB6ZXJvIGNvdW50ZXJzIHRvby4gQnkgZGVmYXVsdCB0aGV5IGFyZSBub3Qgc2hvd24uCisuVFAKKy5CIFwtciwgXC1cLXJlc2V0CitSZXNldCBoaXN0b3J5LgorLlRQCisuQiBcLW4sIFwtXC1ub291dHB1dAorRG8gbm90IGRpc3BsYXkgYW55dGhpbmcsIG9ubHkgdXBkYXRlIGhpc3RvcnkuCisuVFAKKy5CIFwtYSwgXC1cLWlnbm9yZQorRHVtcCBhYnNvbHV0ZSB2YWx1ZXMgb2YgY291bnRlcnMuIFRoZSBkZWZhdWx0IGlzIHRvIGNhbGN1bGF0ZSBpbmNyZW1lbnRzIHNpbmNlIHRoZSBwcmV2aW91cyB1c2UuCisuVFAKKy5CIFwtcywgXC1cLW5vdXBkYXRlCitEbyBub3QgdXBkYXRlIGhpc3RvcnksIHNvIHRoYXQgdGhlIG5leHQgdGltZSB5b3Ugd2lsbCBzZWUgY291bnRlcnMgaW5jbHVkaW5nIHZhbHVlcyBhY2N1bXVsYXRlZCB0byB0aGUgbW9tZW50IG9mIHRoaXMgbWVhc3VyZW1lbnQgdG9vLgorLkIgXC1qLCBcLVwtanNvbgorRGlzcGxheSByZXN1bHRzIGluIEpTT04gZm9ybWF0LgorLlRQCisuQiBcLWQsIFwtXC1pbnRlcnZhbCA8SU5URVJWQUw+CitSdW4gaW4gZGFlbW9uIG1vZGUgY29sbGVjdGluZyBzdGF0aXN0aWNzLiA8SU5URVJWQUw+IGlzIGludGVydmFsIGJldHdlZW4gbWVhc3VyZW1lbnRzIGluIHNlY29uZHMuCisuVFAKKworVGltZSBpbnRlcnZhbCB0byBhdmVyYWdlIHJhdGVzLiBEZWZhdWx0IHZhbHVlIGlzIDYwIHNlY29uZHMuCisuVFAKKworLlNIIFNFRSBBTFNPCitsbnN0YXQoOCkKZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L3J0bW9uLjggYi9pcHJvdXRlMi9tYW4vbWFuOC9ydG1vbi44Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YTJiNzcKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9tYW4vbWFuOC9ydG1vbi44CkBAIC0wLDAgKzEsNjggQEAKKy5USCBSVE1PTiA4CisuU0ggTkFNRQorcnRtb24gXC0gbGlzdGVucyB0byBhbmQgbW9uaXRvcnMgUlRuZXRsaW5rCisuU0ggU1lOT1BTSVMKKy5CIHJ0bW9uCisuUkkgIlsgb3B0aW9ucyBdIGZpbGUgRklMRSBbIGFsbCB8IExJU1RvZk9CSkVDVFMgXSIKKy5TSCBERVNDUklQVElPTgorVGhpcyBtYW51YWwgcGFnZSBkb2N1bWVudHMgYnJpZWZseSB0aGUKKy5CIHJ0bW9uCitjb21tYW5kLgorLlBQCisuQiBydG1vbgorbGlzdGVucyBvbgorLkkgbmV0bGluaworc29ja2V0IGFuZCBtb25pdG9ycyByb3V0aW5nIHRhYmxlIGNoYW5nZXMuCisKKy5JIHJ0bW9uCitjYW4gYmUgc3RhcnRlZCBiZWZvcmUgdGhlIGZpcnN0IG5ldHdvcmsgY29uZmlndXJhdGlvbiBjb21tYW5kIGlzIGlzc3VlZC4KK0ZvciBleGFtcGxlIGlmIHlvdSBpbnNlcnQ6CisKKy5CIHJ0bW9uIGZpbGUgL3Zhci9sb2cvcnRtb24ubG9nCisKK2luIGEgc3RhcnR1cCBzY3JpcHQsIHlvdSB3aWxsIGJlIGFibGUgdG8gdmlldyB0aGUgZnVsbCBoaXN0b3J5IGxhdGVyLgorQ2VydGFpbmx5LCBpdCBpcyBwb3NzaWJsZSB0byBzdGFydCBydG1vbiBhdCBhbnkgdGltZS4gSXQgcHJlcGVuZHMgdGhlIGhpc3Rvcnkgd2l0aCB0aGUgc3RhdGUgc25hcHNob3QgZHVtcGVkIGF0IHRoZSBtb21lbnQgb2Ygc3RhcnRpbmcuCisKKy5TSCBPUFRJT05TCisuSSBydG1vbiBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisuVFAKKy5CIFwtVmVyc2lvbgorUHJpbnQgdmVyc2lvbiBhbmQgZXhpdC4KKy5UUAorLkIgaGVscAorU2hvdyBzdW1tYXJ5IG9mIG9wdGlvbnMuCisuVFAKKy5CIGZpbGUgRklMRSBbIGFsbCB8IExJU1RvZk9CSkVDVFMgXQorTG9nIG91dHB1dCB0byBGSUxFLiBMSVNUb2ZPQkpFQ1RTIGlzIHRoZSBsaXN0IG9mIG9iamVjdCB0eXBlcyB0aGF0IHdlCit3YW50IHRvIG1vbml0b3IuIEl0IG1heSBjb250YWluICdsaW5rJywgJ2FkZHJlc3MnLCAncm91dGUnCithbmQgJ2FsbCcuICdsaW5rJyBzcGVjaWZpZXMgdGhlIG5ldHdvcmsgZGV2aWNlLCAnYWRkcmVzcycgdGhlIHByb3RvY29sCisoSVAgb3IgSVB2NikgYWRkcmVzcyBvbiBhIGRldmljZSwgJ3JvdXRlJyB0aGUgcm91dGluZyB0YWJsZSBlbnRyeQorYW5kICdhbGwnIGRvZXMgd2hhdCB0aGUgbmFtZSBzYXlzLgorLlRQCisuQiBcLWZhbWlseSBbIGluZXQgfCBpbmV0NiB8IGxpbmsgfCBoZWxwIF0KK1NwZWNpZnkgcHJvdG9jb2wgZmFtaWx5LiAnaW5ldCcgaXMgSVB2NCwgJ2luZXQ2JyBpcyBJUHY2LCAnbGluaycKK21lYW5zIHRoYXQgbm8gbmV0d29ya2luZyBwcm90b2NvbCBpcyBpbnZvbHZlZCBhbmQgJ2hlbHAnIHByaW50cyB1c2FnZSBpbmZvcm1hdGlvbi4KKy5UUAorLkIgXC00CitVc2UgSVB2NC4gU2hvcnRjdXQgZm9yIC1mYW1pbHkgaW5ldC4KKy5UUAorLkIgXC02CitVc2UgSVB2Ni4gU2hvcnRjdXQgZm9yIC1mYW1pbHkgaW5ldDYuCisuVFAKKy5CIFwtMAorVXNlIGEgc3BlY2lhbCBmYW1pbHkgaWRlbnRpZmllciBtZWFuaW5nIHRoYXQgbm8gbmV0d29ya2luZyBwcm90b2NvbCBpcyBpbnZvbHZlZC4gU2hvcnRjdXQgZm9yIC1mYW1pbHkgbGluay4KKy5TSCBVU0FHRSBFWEFNUExFUworLlRQCisuQiAjIHJ0bW9uIGZpbGUgL3Zhci9sb2cvcnRtb24ubG9nCitMb2cgdG8gZmlsZSAvdmFyL2xvZy9ydG1vbi5sb2csIHRoZW4gcnVuOgorLlRQCisuQiAjIGlwIG1vbml0b3IgZmlsZSAvdmFyL2xvZy9ydG1vbi5sb2cKK3RvIGRpc3BsYXkgbG9nZ2VkIG91dHB1dCBmcm9tIGZpbGUuCisuU0ggU0VFIEFMU08KKy5CUiBpcCAoOCkKKy5TSCBBVVRIT1IKKy5CIHJ0bW9uCit3YXMgd3JpdHRlbiBieSBBbGV4ZXkgS3V6bmV0c292IDxrdXpuZXRAbXMyLmluci5hYy5ydT4uCisuUFAKK1RoaXMgbWFudWFsIHBhZ2Ugd2FzIHdyaXR0ZW4gYnkgTWljaGFlbCBQcm9rb3AgPG1pa2FAZ3JtbC5vcmc+LAorZm9yIHRoZSBEZWJpYW4gcHJvamVjdCAoYnV0IG1heSBiZSB1c2VkIGJ5IG90aGVycykuCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9tYW4vbWFuOC9ydHByLjggYi9pcHJvdXRlMi9tYW4vbWFuOC9ydHByLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUzMmIyZQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L3J0cHIuOApAQCAtMCwwICsxLDI1IEBACisuVEggUlRQUiA4ICIxOCBTZXB0ZW1iZXIsIDIwMTUiCisKKy5TSCBOQU1FCitydHByIFwtIHJlcGxhY2UgYmFja3NsYXNoZXMgd2l0aCBuZXdsaW5lcy4KKworLlNIIERFU0NSSVBUSU9OCisuQiBydHByCitpcyBhIHRyaXZpYWwgYmFzaCBzY3JpcHQgd2hpY2ggY29udmVydHMgYmFja3NsYXNoZXMgaW4gc3RhbmRhcmQgaW5wdXQgdG8gbmV3bGluZXMuIEl0J3Mgc29sZSBwdXJwb3NlIGlzIHRvIGJlIGZlZCB3aXRoIGlucHV0IGZyb20KKy5CIGlwCit3aGVuIGV4ZWN1dGVkIHdpdGggaXQncworLkIgLS1vbmVsaW5lCitmbGFnLgorCisuU0ggRVhBTVBMRVMKKy5UUAoraXAgLS1vbmVubGluZSBhZGRyZXNzIHNob3cgfCBydHByCitVbmRvIG9uZWxpbmUgY29udmVydGVkCisuQiBpcC1hZGRyZXNzCitvdXRwdXQuCisKKy5TSCBTRUUgQUxTTworLkJSIGlwICg4KQorCisuU0ggQVVUSE9SUworU3RlcGhlbiBIZW1taW5nZXIgPHNoZW1taW5nQGJyb2NhZGUuY29tPgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWFuL21hbjgvcnRzdGF0LjggYi9pcHJvdXRlMi9tYW4vbWFuOC9ydHN0YXQuOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODBlMmIyCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbWFuL21hbjgvcnRzdGF0LjgKQEAgLTAsMCArMSBAQAorLnNvIG1hbjgvbG5zdGF0LjgKZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L3NzLjggYi9pcHJvdXRlMi9tYW4vbWFuOC9zcy44Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ODQ2MGMKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9tYW4vbWFuOC9zcy44CkBAIC0wLDAgKzEsMjA0IEBACisuVEggU1MgOAorLlNIIE5BTUUKK3NzIFwtIGFub3RoZXIgdXRpbGl0eSB0byBpbnZlc3RpZ2F0ZSBzb2NrZXRzCisuU0ggU1lOT1BTSVMKKy5CIHNzCisuUkkgWyBvcHRpb25zIF0gIiBbIEZJTFRFUiBdIgorLlNIIERFU0NSSVBUSU9OCisuQiBzcworaXMgdXNlZCB0byBkdW1wIHNvY2tldCBzdGF0aXN0aWNzLiBJdCBhbGxvd3Mgc2hvd2luZyBpbmZvcm1hdGlvbiBzaW1pbGFyCit0bworLklSIG5ldHN0YXQgLgorSXQgY2FuIGRpc3BsYXkgbW9yZSBUQ1AgYW5kIHN0YXRlIGluZm9ybWF0aW9ucyB0aGFuIG90aGVyIHRvb2xzLgorCisuU0ggT1BUSU9OUworV2hlbiBubyBvcHRpb24gaXMgdXNlZCBzcyBkaXNwbGF5cyBhIGxpc3Qgb2YKK29wZW4gbm9uLWxpc3RlbmluZyBzb2NrZXRzIChlLmcuIFRDUC9VTklYL1VEUCkgdGhhdCBoYXZlIGVzdGFibGlzaGVkIGNvbm5lY3Rpb24uCisuVFAKKy5CIFwtaCwgXC1cLWhlbHAKK1Nob3cgc3VtbWFyeSBvZiBvcHRpb25zLgorLlRQCisuQiBcLVYsIFwtXC12ZXJzaW9uCitPdXRwdXQgdmVyc2lvbiBpbmZvcm1hdGlvbi4KKy5UUAorLkIgXC1uLCBcLVwtbnVtZXJpYworRG8gbm90IHRyeSB0byByZXNvbHZlIHNlcnZpY2UgbmFtZXMuCisuVFAKKy5CIFwtciwgXC1cLXJlc29sdmUKK1RyeSB0byByZXNvbHZlIG51bWVyaWMgYWRkcmVzcy9wb3J0cy4KKy5UUAorLkIgXC1hLCBcLVwtYWxsCitEaXNwbGF5IGJvdGggbGlzdGVuaW5nIGFuZCBub24tbGlzdGVuaW5nIChmb3IgVENQIHRoaXMgbWVhbnMgZXN0YWJsaXNoZWQgY29ubmVjdGlvbnMpIHNvY2tldHMuCisuVFAKKy5CIFwtbCwgXC1cLWxpc3RlbmluZworRGlzcGxheSBvbmx5IGxpc3RlbmluZyBzb2NrZXRzICh0aGVzZSBhcmUgb21pdHRlZCBieSBkZWZhdWx0KS4KKy5UUAorLkIgXC1vLCBcLVwtb3B0aW9ucworU2hvdyB0aW1lciBpbmZvcm1hdGlvbi4KKy5UUAorLkIgXC1lLCBcLVwtZXh0ZW5kZWQKK1Nob3cgZGV0YWlsZWQgc29ja2V0IGluZm9ybWF0aW9uCisuVFAKKy5CIFwtbSwgXC1cLW1lbW9yeQorU2hvdyBzb2NrZXQgbWVtb3J5IHVzYWdlLgorLlRQCisuQiBcLXAsIFwtXC1wcm9jZXNzZXMKK1Nob3cgcHJvY2VzcyB1c2luZyBzb2NrZXQuCisuVFAKKy5CIFwtaSwgXC1cLWluZm8KK1Nob3cgaW50ZXJuYWwgVENQIGluZm9ybWF0aW9uLgorLlRQCisuQiBcLUssIFwtXC1raWxsCitBdHRlbXB0cyB0byBmb3JjaWJseSBjbG9zZSBzb2NrZXRzLiBUaGlzIG9wdGlvbiBkaXNwbGF5cyBzb2NrZXRzIHRoYXQgYXJlCitzdWNjZXNzZnVsbHkgY2xvc2VkIGFuZCBzaWxlbnRseSBza2lwcyBzb2NrZXRzIHRoYXQgdGhlIGtlcm5lbCBkb2VzIG5vdCBzdXBwb3J0CitjbG9zaW5nLiBJdCBzdXBwb3J0cyBJUHY0IGFuZCBJUHY2IHNvY2tldHMgb25seS4KKy5UUAorLkIgXC1zLCBcLVwtc3VtbWFyeQorUHJpbnQgc3VtbWFyeSBzdGF0aXN0aWNzLiBUaGlzIG9wdGlvbiBkb2VzIG5vdCBwYXJzZSBzb2NrZXQgbGlzdHMgb2J0YWluaW5nCitzdW1tYXJ5IGZyb20gdmFyaW91cyBzb3VyY2VzLiBJdCBpcyB1c2VmdWwgd2hlbiBhbW91bnQgb2Ygc29ja2V0cyBpcyBzbyBodWdlCit0aGF0IHBhcnNpbmcgL3Byb2MvbmV0L3RjcCBpcyBwYWluZnVsLgorLlRQCisuQiBcLVosIFwtXC1jb250ZXh0CitBcyB0aGUKKy5CIFwtcAorb3B0aW9uIGJ1dCBhbHNvIHNob3dzIHByb2Nlc3Mgc2VjdXJpdHkgY29udGV4dC4KKy5zcAorRm9yCisuQlIgbmV0bGluayAoNykKK3NvY2tldHMgdGhlIGluaXRpYXRpbmcgcHJvY2VzcyBjb250ZXh0IGlzIGRpc3BsYXllZCBhcyBmb2xsb3dzOgorLlJTCisuUlMKKy5JUCAiMS4iIDQKK0lmIHZhbGlkIHBpZCBzaG93IHRoZSBwcm9jZXNzIGNvbnRleHQuCisuSVAgIjIuIiA0CitJZiBkZXN0aW5hdGlvbiBpcyBrZXJuZWwgKHBpZCA9IDApIHNob3cga2VybmVsIGluaXRpYWwgY29udGV4dC4KKy5JUCAiMy4iIDQKK0lmIGEgdW5pcXVlIGlkZW50aWZpZXIgaGFzIGJlZW4gYWxsb2NhdGVkIGJ5IHRoZSBrZXJuZWwgb3IgbmV0bGluayB1c2VyLAorc2hvdyBjb250ZXh0IGFzICJ1bmF2YWlsYWJsZSIuIFRoaXMgd2lsbCBnZW5lcmFsbHkgaW5kaWNhdGUgdGhhdCBhCitwcm9jZXNzIGhhcyBtb3JlIHRoYW4gb25lIG5ldGxpbmsgc29ja2V0IGFjdGl2ZS4KKy5SRQorLlJFCisuVFAKKy5CIFwteiwgXC1cLWNvbnRleHRzCitBcyB0aGUKKy5CIFwtWgorb3B0aW9uIGJ1dCBhbHNvIHNob3dzIHRoZSBzb2NrZXQgY29udGV4dC4gVGhlIHNvY2tldCBjb250ZXh0IGlzCit0YWtlbiBmcm9tIHRoZSBhc3NvY2lhdGVkIGlub2RlIGFuZCBpcyBub3QgdGhlIGFjdHVhbCBzb2NrZXQKK2NvbnRleHQgaGVsZCBieSB0aGUga2VybmVsLiBTb2NrZXRzIGFyZSB0eXBpY2FsbHkgbGFiZWxlZCB3aXRoIHRoZQorY29udGV4dCBvZiB0aGUgY3JlYXRpbmcgcHJvY2VzcywgaG93ZXZlciB0aGUgY29udGV4dCBzaG93biB3aWxsIHJlZmxlY3QKK2FueSBwb2xpY3kgcm9sZSwgdHlwZSBhbmQvb3IgcmFuZ2UgdHJhbnNpdGlvbiBydWxlcyBhcHBsaWVkLAorYW5kIGlzIHRoZXJlZm9yZSBhIHVzZWZ1bCByZWZlcmVuY2UuCisuVFAKKy5CIFwtTiBOU05BTUUsIFwtXC1uZXQ9TlNOQU1FCitTd2l0Y2ggdG8gdGhlIHNwZWNpZmllZCBuZXR3b3JrIG5hbWVzcGFjZSBuYW1lLgorLlRQCisuQiBcLWIsIFwtXC1icGYKK1Nob3cgc29ja2V0IEJQRiBmaWx0ZXJzIChvbmx5IGFkbWluaXN0cmF0b3JzIGFyZSBhbGxvd2VkIHRvIGdldCB0aGVzZSBpbmZvcm1hdGlvbikuCisuVFAKKy5CIFwtNCwgXC1cLWlwdjQKK0Rpc3BsYXkgb25seSBJUCB2ZXJzaW9uIDQgc29ja2V0cyAoYWxpYXMgZm9yIC1mIGluZXQpLgorLlRQCisuQiBcLTYsIFwtXC1pcHY2CitEaXNwbGF5IG9ubHkgSVAgdmVyc2lvbiA2IHNvY2tldHMgKGFsaWFzIGZvciAtZiBpbmV0NikuCisuVFAKKy5CIFwtMCwgXC1cLXBhY2tldAorRGlzcGxheSBQQUNLRVQgc29ja2V0cyAoYWxpYXMgZm9yIC1mIGxpbmspLgorLlRQCisuQiBcLXQsIFwtXC10Y3AKK0Rpc3BsYXkgVENQIHNvY2tldHMuCisuVFAKKy5CIFwtdSwgXC1cLXVkcAorRGlzcGxheSBVRFAgc29ja2V0cy4KKy5UUAorLkIgXC1kLCBcLVwtZGNjcAorRGlzcGxheSBEQ0NQIHNvY2tldHMuCisuVFAKKy5CIFwtdywgXC1cLXJhdworRGlzcGxheSBSQVcgc29ja2V0cy4KKy5UUAorLkIgXC14LCBcLVwtdW5peAorRGlzcGxheSBVbml4IGRvbWFpbiBzb2NrZXRzIChhbGlhcyBmb3IgLWYgdW5peCkuCisuVFAKKy5CIFwtZiBGQU1JTFksIFwtXC1mYW1pbHk9RkFNSUxZCitEaXNwbGF5IHNvY2tldHMgb2YgdHlwZSBGQU1JTFkuCitDdXJyZW50bHkgdGhlIGZvbGxvd2luZyBmYW1pbGllcyBhcmUgc3VwcG9ydGVkOiB1bml4LCBpbmV0LCBpbmV0NiwgbGluaywgbmV0bGluay4KKy5UUAorLkIgXC1BIFFVRVJZLCBcLVwtcXVlcnk9UVVFUlksIFwtXC1zb2NrZXQ9UVVFUlkKK0xpc3Qgb2Ygc29ja2V0IHRhYmxlcyB0byBkdW1wLCBzZXBhcmF0ZWQgYnkgY29tbWFzLiBUaGUgZm9sbG93aW5nIGlkZW50aWZpZXJzCithcmUgdW5kZXJzdG9vZDogYWxsLCBpbmV0LCB0Y3AsIHVkcCwgcmF3LCB1bml4LCBwYWNrZXQsIG5ldGxpbmssIHVuaXhfZGdyYW0sCit1bml4X3N0cmVhbSwgdW5peF9zZXFwYWNrZXQsIHBhY2tldF9yYXcsIHBhY2tldF9kZ3JhbS4KKy5UUAorLkIgXC1EIEZJTEUsIFwtXC1kaWFnPUZJTEUKK0RvIG5vdCBkaXNwbGF5IGFueXRoaW5nLCBqdXN0IGR1bXAgcmF3IGluZm9ybWF0aW9uIGFib3V0IFRDUCBzb2NrZXRzIHRvIEZJTEUgYWZ0ZXIgYXBwbHlpbmcgZmlsdGVycy4gSWYgRklMRSBpcyAtIHN0ZG91dCBpcyB1c2VkLgorLlRQCisuQiBcLUYgRklMRSwgXC1cLWZpbHRlcj1GSUxFCitSZWFkIGZpbHRlciBpbmZvcm1hdGlvbiBmcm9tIEZJTEUuCitFYWNoIGxpbmUgb2YgRklMRSBpcyBpbnRlcnByZXRlZCBsaWtlIHNpbmdsZSBjb21tYW5kIGxpbmUgb3B0aW9uLiBJZiBGSUxFIGlzIC0gc3RkaW4gaXMgdXNlZC4KKy5UUAorLkIgRklMVEVSIDo9IFsgc3RhdGUgU1RBVEUtRklMVEVSIF0gWyBFWFBSRVNTSU9OIF0KK1BsZWFzZSB0YWtlIGEgbG9vayBhdCB0aGUgb2ZmaWNpYWwgZG9jdW1lbnRhdGlvbiAoRGViaWFuIHBhY2thZ2UgaXByb3V0ZS1kb2MpIGZvciBkZXRhaWxzIHJlZ2FyZGluZyBmaWx0ZXJzLgorCisuU0ggU1RBVEUtRklMVEVSCisKKy5CIFNUQVRFLUZJTFRFUgorYWxsb3dzIHRvIGNvbnN0cnVjdCBhcmJpdHJhcnkgc2V0IG9mIHN0YXRlcyB0byBtYXRjaC4gSXRzIHN5bnRheCBpcyBzZXF1ZW5jZSBvZiBrZXl3b3JkcyBzdGF0ZSBhbmQgZXhjbHVkZSBmb2xsb3dlZCBieSBpZGVudGlmaWVyIG9mIHN0YXRlLgorLlRQCitBdmFpbGFibGUgaWRlbnRpZmllcnMgYXJlOgorCitBbGwgc3RhbmRhcmQgVENQIHN0YXRlczoKKy5CUiBlc3RhYmxpc2hlZCAiLCAiIHN5bi1zZW50ICIsICIgc3luLXJlY3YgIiwgIiBmaW4td2FpdC0xICIsICIgZmluLXdhaXQtMiAiLCAiIHRpbWUtd2FpdCAiLCAiIGNsb3NlZCAiLCAiIGNsb3NlLXdhaXQgIiwgIiBsYXN0LWFjayAiLCAiCisuQlIgIGxpc3RlbiAiIGFuZCAiIGNsb3NpbmcuCisKKy5CIGFsbAorLSBmb3IgYWxsIHRoZSBzdGF0ZXMKKworLkIgY29ubmVjdGVkCistIGFsbCB0aGUgc3RhdGVzIGV4Y2VwdCBmb3IKKy5CUiBsaXN0ZW4gIiBhbmQgIiBjbG9zZWQKKworLkIgc3luY2hyb25pemVkCistIGFsbCB0aGUKKy5CIGNvbm5lY3RlZAorc3RhdGVzIGV4Y2VwdCBmb3IKKy5CIHN5bi1zZW50CisKKy5CIGJ1Y2tldAorLSBzdGF0ZXMsIHdoaWNoIGFyZSBtYWludGFpbmVkIGFzIG1pbmlzb2NrZXRzLCBpLmUuCisuQlIgdGltZS13YWl0ICIgYW5kICIgc3luLXJlY3YKKworLkIgYmlnCistIG9wcG9zaXRlIHRvCisuQiBidWNrZXQKKworLlNIIFVTQUdFIEVYQU1QTEVTCisuVFAKKy5CIHNzIC10IC1hCitEaXNwbGF5IGFsbCBUQ1Agc29ja2V0cy4KKy5UUAorLkIgc3MgLXQgLWEgLVoKK0Rpc3BsYXkgYWxsIFRDUCBzb2NrZXRzIHdpdGggcHJvY2VzcyBTRUxpbnV4IHNlY3VyaXR5IGNvbnRleHRzLgorLlRQCisuQiBzcyAtdSAtYQorRGlzcGxheSBhbGwgVURQIHNvY2tldHMuCisuVFAKKy5CIHNzIC1vIHN0YXRlIGVzdGFibGlzaGVkICcoIGRwb3J0ID0gOnNzaCBvciBzcG9ydCA9IDpzc2ggKScKK0Rpc3BsYXkgYWxsIGVzdGFibGlzaGVkIHNzaCBjb25uZWN0aW9ucy4KKy5UUAorLkIgc3MgLXggc3JjIC90bXAvLlgxMS11bml4LyoKK0ZpbmQgYWxsIGxvY2FsIHByb2Nlc3NlcyBjb25uZWN0ZWQgdG8gWCBzZXJ2ZXIuCisuVFAKKy5CIHNzIC1vIHN0YXRlIGZpbi13YWl0LTEgJyggc3BvcnQgPSA6aHR0cCBvciBzcG9ydCA9IDpodHRwcyApJyBkc3QgMTkzLjIzMy43LzI0CitMaXN0IGFsbCB0aGUgdGNwIHNvY2tldHMgaW4gc3RhdGUgRklOLVdBSVQtMSBmb3Igb3VyIGFwYWNoZSB0byBuZXR3b3JrIDE5My4yMzMuNy8yNCBhbmQgbG9vayBhdCB0aGVpciB0aW1lcnMuCisuU0ggU0VFIEFMU08KKy5CUiBpcCAoOCksCisuQlIgL3Vzci9zaGFyZS9kb2MvaXByb3V0ZS1kb2Mvc3MuaHRtbCAiIChwYWNrYWdlIGlwcm91dGWtZG9jKSIsCisuYnIKKy5CUiBSRkMgIiA3OTMgIgorLSBodHRwczovL3Rvb2xzLmlldGYub3JnL3JmYy9yZmM3OTMudHh0IChUQ1Agc3RhdGVzKQorCisuU0ggQVVUSE9SCisuSSBzcword2FzIHdyaXR0ZW4gYnkgQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1Pi4KKy5QUAorVGhpcyBtYW51YWwgcGFnZSB3YXMgd3JpdHRlbiBieSBNaWNoYWVsIFByb2tvcCA8bWlrYUBncm1sLm9yZz4KK2ZvciB0aGUgRGViaWFuIHByb2plY3QgKGJ1dCBtYXkgYmUgdXNlZCBieSBvdGhlcnMpLgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWFuL21hbjgvdGMtYmFzaWMuOCBiL2lwcm91dGUyL21hbi9tYW44L3RjLWJhc2ljLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzOWVhYQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L3RjLWJhc2ljLjgKQEAgLTAsMCArMSwzNCBAQAorLlRIICJCYXNpYyBjbGFzc2lmaWVyIGluIHRjIiA4ICIyMSBPY3QgMjAxNSIgImlwcm91dGUyIiAiTGludXgiCisKKy5TSCBOQU1FCitiYXNpYyBcLSBiYXNpYyB0cmFmZmljIGNvbnRyb2wgZmlsdGVyCisuU0ggU1lOT1BTSVMKKy5pbiArOAorLnRpIC04CisuQlIgdGMgIiAiIGZpbHRlciAiIC4uLiAiIGJhc2ljICIgWyAiIG1hdGNoCisuSVIgRU1BVENIX1RSRUUgIiBdIFsgIgorLkIgYWN0aW9uCisuSVIgQUNUSU9OX1NQRUMgIiBdIFsgIgorLkIgY2xhc3NpZAorLklSIENMQVNTSUQgIiBdIgorLlNIIERFU0NSSVBUSU9OCitUaGUKKy5CIGJhc2ljCitmaWx0ZXIgYWxsb3dzIHRvIGNsYXNzaWZ5IHBhY2tldHMgdXNpbmcgdGhlIGV4dGVuZGVkIG1hdGNoIGluZnJhc3RydWN0dXJlLgorLlNIIE9QVElPTlMKKy5UUAorLkJJIGFjdGlvbiAiIEFDVElPTl9TUEVDIgorQXBwbHkgYW4gYWN0aW9uIGZyb20gdGhlIGdlbmVyaWMgYWN0aW9ucyBmcmFtZXdvcmsgb24gbWF0Y2hpbmcgcGFja2V0cy4KKy5UUAorLkJJIGNsYXNzaWQgIiBDTEFTU0lEIgorUHVzaCBtYXRjaGluZyBwYWNrZXRzIGludG8gdGhlIGNsYXNzIGlkZW50aWZpZWQgYnkKKy5JUiBDTEFTU0lEIC4KKy5UUAorLkJJIG1hdGNoICIgRU1BVENIX1RSRUUiCitNYXRjaCBwYWNrZXRzIHVzaW5nIHRoZSBleHRlbmRlZCBtYXRjaCBpbmZyYXN0cnVjdHVyZS4gU2VlCisuQlIgdGMtZW1hdGNoICg4KQorZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIGFsbG93ZWQgc3ludGF4IGluCisuSVIgRU1BVENIX1RSRUUgLgorLlNIIFNFRSBBTFNPCisuQlIgdGMgKDgpLAorLkJSIHRjLWVtYXRjaCAoOCkKZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L3RjLWJmaWZvLjggYi9pcHJvdXRlMi9tYW4vbWFuOC90Yy1iZmlmby44Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMjkwMzIKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9tYW4vbWFuOC90Yy1iZmlmby44CkBAIC0wLDAgKzEsNzQgQEAKKy5USCBQQkZJRk8gOCAiMTAgSmFudWFyeSAyMDAyIiAiaXByb3V0ZTIiICJMaW51eCIKKy5TSCBOQU1FCitwZmlmbyBcLSBQYWNrZXQgbGltaXRlZCBGaXJzdCBJbiwgRmlyc3QgT3V0IHF1ZXVlCisuUAorYmZpZm8gXC0gQnl0ZSBsaW1pdGVkIEZpcnN0IEluLCBGaXJzdCBPdXQgcXVldWUKKworLlNIIFNZTk9QU0lTCisuQiB0YyBxZGlzYyAuLi4gYWRkIHBmaWZvCisuQiBbIGxpbWl0CitwYWNrZXRzCisuQiBdCisuUAorLkIgdGMgcWRpc2MgLi4uIGFkZCBiZmlmbworLkIgWyBsaW1pdAorYnl0ZXMKKy5CIF0KKworLlNIIERFU0NSSVBUSU9OCitUaGUgcGZpZm8gYW5kIGJmaWZvIHFkaXNjcyBhcmUgdW5hZG9ybmVkIEZpcnN0IEluLCBGaXJzdCBPdXQgcXVldWVzLiBUaGV5IGFyZSB0aGUKK3NpbXBsZXN0IHF1ZXVlcyBwb3NzaWJsZSBhbmQgdGhlcmVmb3JlIGhhdmUgbm8gb3ZlcmhlYWQuCisuQiBwZmlmbworY29uc3RyYWlucyB0aGUgcXVldWUgc2l6ZSBhcyBtZWFzdXJlZCBpbiBwYWNrZXRzLgorLkIgYmZpZm8KK2RvZXMgc28gYXMgbWVhc3VyZWQgaW4gYnl0ZXMuCisKK0xpa2UgYWxsIG5vbi1kZWZhdWx0IHFkaXNjcywgdGhleSBtYWludGFpbiBzdGF0aXN0aWNzLiBUaGlzIG1pZ2h0IGJlIGEgcmVhc29uIHRvIHByZWZlcgorcGZpZm8gb3IgYmZpZm8gb3ZlciB0aGUgZGVmYXVsdC4KKworLlNIIEFMR09SSVRITQorQSBsaXN0IG9mIHBhY2tldHMgaXMgbWFpbnRhaW5lZCwgd2hlbiBhIHBhY2tldCBpcyBlbnF1ZXVlZCBpdCBnZXRzIGluc2VydGVkIGF0IHRoZSB0YWlsIG9mCithIGxpc3QuIFdoZW4gYSBwYWNrZXQgbmVlZHMgdG8gYmUgc2VudCBvdXQgdG8gdGhlIG5ldHdvcmssIGl0IGlzIHRha2VuIGZyb20gdGhlIGhlYWQgb2YgdGhlIGxpc3QuCisKK0lmIHRoZSBsaXN0IGlzIHRvbyBsb25nLCBubyBmdXJ0aGVyIHBhY2tldHMgYXJlIGFsbG93ZWQgb24uIFRoaXMgaXMgY2FsbGVkICd0YWlsIGRyb3AnLgorCisuU0ggUEFSQU1FVEVSUworLlRQCitsaW1pdAorTWF4aW11bSBxdWV1ZSBzaXplLiBTcGVjaWZpZWQgaW4gYnl0ZXMgZm9yIGJmaWZvLCBpbiBwYWNrZXRzIGZvciBwZmlmby4gRm9yIHBmaWZvLCBkZWZhdWx0cwordG8gdGhlIGludGVyZmFjZSB0eHF1ZXVlbGVuLCBhcyBzcGVjaWZpZWQgd2l0aAorLkJSIGlmY29uZmlnICg4KQorb3IKKy5CUiBpcCAoOCkuCitUaGUgcmFuZ2UgZm9yIHRoaXMgcGFyYW1ldGVyIGlzIFswLCBVSU5UMzJfTUFYXS4KKworRm9yIGJmaWZvLCBpdCBkZWZhdWx0cyB0byB0aGUgdHhxdWV1ZWxlbiBtdWx0aXBsaWVkIGJ5IHRoZSBpbnRlcmZhY2UgTVRVLgorVGhlIHJhbmdlIGZvciB0aGlzIHBhcmFtZXRlciBpcyBbMCwgVUlOVDMyX01BWF0gYnl0ZXMuCisKK05vdGU6IFRoZSBsaW5rIGxheWVyIGhlYWRlciB3YXMgY29uc2lkZXJlZCB3aGVuIGNvdW50aW5nIHBhY2tldHMgbGVuZ3RoLgorCisuU0ggT1VUUFVUCitUaGUgb3V0cHV0IG9mCisuQiB0YyAtcyBxZGlzYyBscworY29udGFpbnMgdGhlIGxpbWl0LCBlaXRoZXIgaW4gcGFja2V0cyBvciBpbiBieXRlcywgYW5kIHRoZSBudW1iZXIgb2YgYnl0ZXMKK2FuZCBwYWNrZXRzIGFjdHVhbGx5IHNlbnQuIEFuIHVuc2VudCBhbmQgZHJvcHBlZCBwYWNrZXQgb25seSBhcHBlYXJzIGJldHdlZW4gYnJhY2VzCithbmQgaXMgbm90IGNvdW50ZWQgYXMgJ1NlbnQnLgorCitJbiB0aGlzIGV4YW1wbGUsIHRoZSBxdWV1ZSBsZW5ndGggaXMgMTAwIHBhY2tldHMsIDQ1ODk0IGJ5dGVzIHdlcmUgc2VudCBvdmVyIDY4MSBwYWNrZXRzLgorTm8gcGFja2V0cyB3ZXJlIGRyb3BwZWQsIGFuZCBhcyB0aGUgcGZpZm8gcXVldWUgZG9lcyBub3Qgc2xvdyBkb3duIHBhY2tldHMsIHRoZXJlIHdlcmUgYWxzbyBubworb3ZlcmxpbWl0czoKKy5QCisubmYKKyMgdGMgLXMgcWRpc2MgbHMgZGV2IGV0aDAKK3FkaXNjIHBmaWZvIDgwMDE6IGRldiBldGgwIGxpbWl0IDEwMHAKKyBTZW50IDQ1ODk0IGJ5dGVzIDY4MSBwa3RzIChkcm9wcGVkIDAsIG92ZXJsaW1pdHMgMCkKKy5maQorCitJZiBhIGJhY2tsb2cgb2NjdXJzLCB0aGlzIGlzIGRpc3BsYXllZCBhcyB3ZWxsLgorLlNIIFNFRSBBTFNPCisuQlIgdGMgKDgpCisKKy5TSCBBVVRIT1JTCitBbGV4ZXkgTi4gS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisKK1RoaXMgbWFucGFnZSBtYWludGFpbmVkIGJ5IGJlcnQgaHViZXJ0IDxhaHVAZHM5YS5ubD4KZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L3RjLWJwZi44IGIvaXByb3V0ZTIvbWFuL21hbjgvdGMtYnBmLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhkNWM1ZgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L3RjLWJwZi44CkBAIC0wLDAgKzEsOTI0IEBACisuVEggIkJQRiBjbGFzc2lmaWVyIGFuZCBhY3Rpb25zIGluIHRjIiA4ICIxOCBNYXkgMjAxNSIgImlwcm91dGUyIiAiTGludXgiCisuU0ggTkFNRQorQlBGIFwtIEJQRiBwcm9ncmFtbWFibGUgY2xhc3NpZmllciBhbmQgYWN0aW9ucyBmb3IgaW5ncmVzcy9lZ3Jlc3MKK3F1ZXVlaW5nIGRpc2NpcGxpbmVzCisuU0ggU1lOT1BTSVMKKy5TUyBlQlBGIGNsYXNzaWZpZXIgKGZpbHRlcikgb3IgYWN0aW9uOgorLkIgdGMgZmlsdGVyIC4uLiBicGYKK1sKKy5CIG9iamVjdC1maWxlCitPQkpfRklMRSBdIFsKKy5CIHNlY3Rpb24KK0NMU19OQU1FIF0gWworLkIgZXhwb3J0CitVRFNfRklMRSBdIFsKKy5CIHZlcmJvc2UKK10gWworLkIgcG9saWNlCitQT0xJQ0VfU1BFQyBdIFsKKy5CIGFjdGlvbgorQUNUSU9OX1NQRUMgXSBbCisuQiBjbGFzc2lkCitDTEFTU0lEIF0KKy5icgorLkIgdGMgYWN0aW9uIC4uLiBicGYKK1sKKy5CIG9iamVjdC1maWxlCitPQkpfRklMRSBdIFsKKy5CIHNlY3Rpb24KK0NMU19OQU1FIF0gWworLkIgZXhwb3J0CitVRFNfRklMRSBdIFsKKy5CIHZlcmJvc2UKK10KKworLlNTIGNCUEYgY2xhc3NpZmllciAoZmlsdGVyKSBvciBhY3Rpb246CisuQiB0YyBmaWx0ZXIgLi4uIGJwZgorWworLkIgYnl0ZWNvZGUtZmlsZQorQlBGX0ZJTEUgfAorLkIgYnl0ZWNvZGUKK0JQRl9CWVRFQ09ERSBdIFsKKy5CIHBvbGljZQorUE9MSUNFX1NQRUMgXSBbCisuQiBhY3Rpb24KK0FDVElPTl9TUEVDIF0gWworLkIgY2xhc3NpZAorQ0xBU1NJRCBdCisuYnIKKy5CIHRjIGFjdGlvbiAuLi4gYnBmCitbCisuQiBieXRlY29kZS1maWxlCitCUEZfRklMRSB8CisuQiBieXRlY29kZQorQlBGX0JZVEVDT0RFIF0KKworLlNIIERFU0NSSVBUSU9OCisKK0V4dGVuZGVkIEJlcmtlbGV5IFBhY2tldCBGaWx0ZXIgKAorLkIgZUJQRgorKSBhbmQgY2xhc3NpYyBCZXJrZWxleSBQYWNrZXQgRmlsdGVyCisob3JpZ2luYWxseSBrbm93biBhcyBCUEYsIGZvciBiZXR0ZXIgZGlzdGluY3Rpb24gcmVmZXJyZWQgdG8gYXMKKy5CIGNCUEYKK2hlcmUpIGFyZSBib3RoIGF2YWlsYWJsZSBhcyBhIGZ1bGx5IHByb2dyYW1tYWJsZSBhbmQgaGlnaGx5IGVmZmljaWVudAorY2xhc3NpZmllciBhbmQgYWN0aW9ucy4gVGhleSBib3RoIG9mZmVyIGEgbWluaW1hbCBpbnN0cnVjdGlvbiBzZXQgZm9yCitpbXBsZW1lbnRpbmcgc21hbGwgcHJvZ3JhbXMgd2hpY2ggY2FuIHNhZmVseSBiZSBsb2FkZWQgaW50byB0aGUga2VybmVsCithbmQgdGh1cyBleGVjdXRlZCBpbiBhIHRpbnkgdmlydHVhbCBtYWNoaW5lIGZyb20ga2VybmVsIHNwYWNlLiBBbiBpbi1rZXJuZWwKK3ZlcmlmaWVyIGd1YXJhbnRlZXMgdGhhdCBhIHNwZWNpZmllZCBwcm9ncmFtIGFsd2F5cyB0ZXJtaW5hdGVzIGFuZCBuZWl0aGVyCitjcmFzaGVzIG5vciBsZWFrcyBkYXRhIGZyb20gdGhlIGtlcm5lbC4KKworSW4gTGludXgsIGl0J3MgZ2VuZXJhbGx5IGNvbnNpZGVyZWQgdGhhdCBlQlBGIGlzIHRoZSBzdWNjZXNzb3Igb2YgY0JQRi4KK1RoZSBrZXJuZWwgaW50ZXJuYWxseSB0cmFuc2Zvcm1zIGNCUEYgZXhwcmVzc2lvbnMgaW50byBlQlBGIGV4cHJlc3Npb25zIGFuZAorZXhlY3V0ZXMgdGhlIGxhdHRlci4gRXhlY3V0aW9uIG9mIHRoZW0gY2FuIGJlIHBlcmZvcm1lZCBpbiBhbiBpbnRlcnByZXRlcgorb3IgYXQgc2V0dXAgdGltZSwgdGhleSBjYW4gYmUganVzdC1pbi10aW1lIGNvbXBpbGVkIChKSVQnZWQpIHRvIHJ1biBhcworbmF0aXZlIG1hY2hpbmUgY29kZS4gQ3VycmVudGx5LCB4ODZfNjQsIEFSTTY0IGFuZCBzMzkwIGFyY2hpdGVjdHVyZXMgaGF2ZQorZUJQRiBKSVQgc3VwcG9ydCwgd2hlcmVhcyBQUEMsIFNQQVJDLCBBUk0gYW5kIE1JUFMgaGF2ZSBjQlBGLCBidXQgZGlkIG5vdAorKHlldCkgc3dpdGNoIHRvIGVCUEYgSklUIHN1cHBvcnQuCisKK2VCUEYncyBpbnN0cnVjdGlvbiBzZXQgaGFzIHNpbWlsYXIgdW5kZXJseWluZyBwcmluY2lwbGVzIGFzIHRoZSBjQlBGCitpbnN0cnVjdGlvbiBzZXQsIGl0IGhvd2V2ZXIgaXMgbW9kZWxsZWQgY2xvc2VyIHRvIHRoZSB1bmRlcmx5aW5nCithcmNoaXRlY3R1cmUgdG8gYmV0dGVyIG1pbWljIG5hdGl2ZSBpbnN0cnVjdGlvbiBzZXRzIHdpdGggdGhlIGFpbSB0bworYWNoaWV2ZSBhIGJldHRlciBydW4tdGltZSBwZXJmb3JtYW5jZS4gSXQgaXMgZGVzaWduZWQgdG8gYmUgSklUJ2VkIHdpdGgKK2Egb25lIHRvIG9uZSBtYXBwaW5nLCB3aGljaCBjYW4gYWxzbyBvcGVuIHVwIHRoZSBwb3NzaWJpbGl0eSBmb3IgY29tcGlsZXJzCit0byBnZW5lcmF0ZSBvcHRpbWl6ZWQgZUJQRiBjb2RlIHRocm91Z2ggYW4gZUJQRiBiYWNrZW5kIHRoYXQgcGVyZm9ybXMKK2FsbW9zdCBhcyBmYXN0IGFzIG5hdGl2ZWx5IGNvbXBpbGVkIGNvZGUuIEdpdmVuIHRoYXQgTExWTSBwcm92aWRlcyBzdWNoCithbiBlQlBGIGJhY2tlbmQsIGVCUEYgcHJvZ3JhbXMgY2FuIHRoZXJlZm9yZSBlYXNpbHkgYmUgcHJvZ3JhbW1lZCBpbiBhCitzdWJzZXQgb2YgdGhlIEMgbGFuZ3VhZ2UuIE90aGVyIHRoYW4gdGhhdCwgZUJQRiBpbmZyYXN0cnVjdHVyZSBhbHNvIGNvbWVzCit3aXRoIGEgY29uc3RydWN0IGNhbGxlZCAibWFwcyIuIGVCUEYgbWFwcyBhcmUga2V5L3ZhbHVlIHN0b3JlcyB0aGF0IGFyZQorc2hhcmVkIGJldHdlZW4gbXVsdGlwbGUgZUJQRiBwcm9ncmFtcywgYnV0IGFsc28gYmV0d2VlbiBlQlBGIHByb2dyYW1zIGFuZAordXNlciBzcGFjZSBhcHBsaWNhdGlvbnMuCisKK0ZvciB0aGUgdHJhZmZpYyBjb250cm9sIHN1YnN5c3RlbSwgY2xhc3NpZmllciBhbmQgYWN0aW9ucyB0aGF0IGNhbiBiZQorYXR0YWNoZWQgdG8gaW5ncmVzcyBhbmQgZWdyZXNzIHFkaXNjcyBjYW4gYmUgd3JpdHRlbiBpbiBlQlBGIG9yIGNCUEYuIFRoZQorYWR2YW50YWdlIG92ZXIgb3RoZXIgY2xhc3NpZmllciBhbmQgYWN0aW9ucyBpcyB0aGF0IGVCUEYvY0JQRiBwcm92aWRlcyB0aGUKK2dlbmVyaWMgZnJhbWV3b3JrLCB3aGlsZSB1c2VycyBjYW4gaW1wbGVtZW50IHRoZWlyIGhpZ2hseSBzcGVjaWFsaXplZCB1c2UKK2Nhc2VzIGVmZmljaWVudGx5LiBUaGlzIG1lYW5zIHRoYXQgdGhlIGNsYXNzaWZpZXIgb3IgYWN0aW9uIHdyaXR0ZW4gdGhhdAord2F5IHdpbGwgbm90IHN1ZmZlciBmcm9tIGZlYXR1cmUgYmxvYXQsIGFuZCBjYW4gdGhlcmVmb3JlIGV4ZWN1dGUgaXRzIHRhc2sKK2hpZ2hseSBlZmZpY2llbnQuIEl0IGFsbG93cyBmb3Igbm9uLWxpbmVhciBjbGFzc2lmaWNhdGlvbiBhbmQgZXZlbiBtZXJnaW5nCit0aGUgYWN0aW9uIHBhcnQgaW50byB0aGUgY2xhc3NpZmljYXRpb24uIENvbWJpbmVkIHdpdGggZWZmaWNpZW50IGVCUEYgbWFwCitkYXRhIHN0cnVjdHVyZXMsIHVzZXIgc3BhY2UgY2FuIHB1c2ggbmV3IHBvbGljaWVzIGxpa2UgY2xhc3NpZHMgaW50byB0aGUKK2tlcm5lbCB3aXRob3V0IHJlbG9hZGluZyBhIGNsYXNzaWZpZXIsIG9yIGl0IGNhbiBnYXRoZXIgc3RhdGlzdGljcyB0aGF0CithcmUgcHVzaGVkIGludG8gb25lIG1hcCBhbmQgdXNlIGFub3RoZXIgb25lIGZvciBkeW5hbWljYWxseSBsb2FkIGJhbGFuY2luZwordHJhZmZpYyBiYXNlZCBvbiB0aGUgZGV0ZXJtaW5lZCBsb2FkLCBqdXN0IHRvIHByb3ZpZGUgYSBmZXcgZXhhbXBsZXMuCisKKy5TSCBQQVJBTUVURVJTCisuU1Mgb2JqZWN0LWZpbGUKK3BvaW50cyB0byBhbiBvYmplY3QgZmlsZSB0aGF0IGhhcyBhbiBleGVjdXRhYmxlIGFuZCBsaW5rYWJsZSBmb3JtYXQgKEVMRikKK2FuZCBjb250YWlucyBlQlBGIG9wY29kZXMgYW5kIGVCUEYgbWFwIGRlZmluaXRpb25zLiBUaGUgTExWTSBjb21waWxlcgoraW5mcmFzdHJ1Y3R1cmUgd2l0aAorLkIgY2xhbmcoMSkKK2FzIGEgQyBsYW5ndWFnZSBmcm9udCBlbmQgaXMgb25lIHByb2plY3QgdGhhdCBzdXBwb3J0cyBlbWl0dGluZyBlQlBGIG9iamVjdAorZmlsZXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBlQlBGIGNsYXNzaWZpZXIgKG1vcmUgZGV0YWlscyBpbiB0aGUKKy5CIEVYQU1QTEVTCitzZWN0aW9uKS4gVGhpcyBvcHRpb24gaXMgbWFuZGF0b3J5IHdoZW4gYW4gZUJQRiBjbGFzc2lmaWVyIG9yIGFjdGlvbiBpcwordG8gYmUgbG9hZGVkLgorCisuU1Mgc2VjdGlvbgoraXMgdGhlIG5hbWUgb2YgdGhlIEVMRiBzZWN0aW9uIGZyb20gdGhlIG9iamVjdCBmaWxlLCB3aGVyZSB0aGUgZUJQRgorY2xhc3NpZmllciBvciBhY3Rpb24gcmVzaWRlcy4gQnkgZGVmYXVsdCB0aGUgc2VjdGlvbiBuYW1lIGZvciB0aGUKK2NsYXNzaWZpZXIgaXMgY2FsbGVkICJjbGFzc2lmaWVyIiwgYW5kIGZvciB0aGUgYWN0aW9uICJhY3Rpb24iLiBHaXZlbgordGhhdCBhIHNpbmdsZSBvYmplY3QgZmlsZSBjYW4gY29udGFpbiBtdWx0aXBsZSBjbGFzc2lmaWVyIGFuZCBhY3Rpb25zLAordGhlIGNvcnJlc3BvbmRpbmcgc2VjdGlvbiBuYW1lIG5lZWRzIHRvIGJlIHNwZWNpZmllZCwgaWYgaXQgZGlmZmVycworZnJvbSB0aGUgZGVmYXVsdHMuCisKKy5TUyBleHBvcnQKK3BvaW50cyB0byBhIFVuaXggZG9tYWluIHNvY2tldCBmaWxlLiBJbiBjYXNlIHRoZSBlQlBGIG9iamVjdCBmaWxlIGFsc28KK2NvbnRhaW5zIGEgc2VjdGlvbiBuYW1lZCAibWFwcyIgd2l0aCBlQlBGIG1hcCBzcGVjaWZpY2F0aW9ucywgdGhlbiB0aGUKK21hcCBmaWxlIGRlc2NyaXB0b3JzIGNhbiBiZSBoYW5kZWQgb2ZmIHZpYSB0aGUgVW5peCBkb21haW4gc29ja2V0IHRvCithbiBlQlBGICJhZ2VudCIgaGVyZGluZyBhbGwgZGVzY3JpcHRvcnMgYWZ0ZXIgdGMgbGlmZXRpbWUuIFRoaXMgY2FuIGJlCitzb21lIHRoaXJkIHBhcnR5IGFwcGxpY2F0aW9uIGltcGxlbWVudGluZyB0aGUgSVBDIGNvdW50ZXJwYXJ0IGZvciB0aGUKK2ltcG9ydCwgdGhhdCB1c2VzIHRoZW0gZm9yIGNhbGxpbmcgaW50bworLkIgYnBmKDIpCitzeXN0ZW0gY2FsbCB0byByZWFkIG91dCBvciB1cGRhdGUgZUJQRiBtYXAgZGF0YSBmcm9tIHVzZXIgc3BhY2UsIGZvcgorZXhhbXBsZSwgZm9yIG1vbml0b3JpbmcgcHVycG9zZXMgb3IgdG8gcHVzaCBkb3duIG5ldyBwb2xpY2llcy4KKworLlNTIHZlcmJvc2UKK2lmIHNldCwgaXQgd2lsbCBkdW1wIHRoZSBlQlBGIHZlcmlmaWVyIG91dHB1dCwgZXZlbiBpZiBsb2FkaW5nIHRoZSBlQlBGCitwcm9ncmFtIHdhcyBzdWNjZXNzZnVsLiBCeSBkZWZhdWx0LCBvbmx5IG9uIGVycm9yLCB0aGUgdmVyaWZpZXIgbG9nIGlzCitiZWluZyBlbWl0dGVkIHRvIHRoZSB1c2VyLgorCisuU1MgcG9saWNlCitpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgZm9yIGFuIGVCUEYvY0JQRiBjbGFzc2lmaWVyIHRoYXQgc3BlY2lmaWVzIGEKK3BvbGljZSBpbgorLkIgdGMoMSkKK3doaWNoIGlzIGF0dGFjaGVkIHRvIHRoZSBjbGFzc2lmaWVyLCBmb3IgZXhhbXBsZSwgb24gYW4gaW5ncmVzcyBxZGlzYy4KKworLlNTIGFjdGlvbgoraXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIGZvciBhbiBlQlBGL2NCUEYgY2xhc3NpZmllciB0aGF0IHNwZWNpZmllcyBhCitzdWJzZXF1ZW50IGFjdGlvbiBpbgorLkIgdGMoMSkKK3doaWNoIGlzIGF0dGFjaGVkIHRvIGEgY2xhc3NpZmllci4KKworLlNTIGNsYXNzaWQKKy5TUyBmbG93aWQKK3Byb3ZpZGVzIHRoZSBkZWZhdWx0IHRyYWZmaWMgY29udHJvbCBjbGFzcyBpZGVudGlmaWVyIGZvciB0aGlzIGVCUEYvY0JQRgorY2xhc3NpZmllci4gVGhlIGRlZmF1bHQgY2xhc3MgaWRlbnRpZmllciBjYW4gYWxzbyBiZSBvdmVyd3JpdHRlbiBieSB0aGUKK3JldHVybiBjb2RlIG9mIHRoZSBlQlBGL2NCUEYgcHJvZ3JhbS4gQSBkZWZhdWx0IHJldHVybiBjb2RlIG9mCisuQiAtMQorc3BlY2lmaWVzIHRoZSBoZXJlIHByb3ZpZGVkIGRlZmF1bHQgY2xhc3MgaWRlbnRpZmllciB0byBiZSB1c2VkLiBBIHJldHVybgorY29kZSBvZiB0aGUgZUJQRi9jQlBGIHByb2dyYW0gb2YgMCBpbXBsaWVzIHRoYXQgbm8gbWF0Y2ggdG9vayBwbGFjZSwgYW5kCithIHJldHVybiBjb2RlIG90aGVyIHRoYW4gdGhlc2UgdHdvIHdpbGwgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgY2xhc3NpZC4gVGhpcworYWxsb3dzIGZvciBlZmZpY2llbnQsIG5vbi1saW5lYXIgY2xhc3NpZmljYXRpb24gd2l0aCBvbmx5IGEgc2luZ2xlIGVCUEYvY0JQRgorcHJvZ3JhbSBhcyBvcHBvc2VkIHRvIGhhdmluZyBtdWx0aXBsZSBpbmRpdmlkdWFsIHByb2dyYW1zIGZvciB2YXJpb3VzIGNsYXNzCitpZGVudGlmaWVycyB3aGljaCB3b3VsZCBuZWVkIHRvIHJlcGFyc2UgcGFja2V0IGNvbnRlbnRzLgorCisuU1MgYnl0ZWNvZGUKK2lzIGJlaW5nIHVzZWQgZm9yIGxvYWRpbmcgY0JQRiBjbGFzc2lmaWVyIGFuZCBhY3Rpb25zIG9ubHkuIFRoZSBjQlBGIGJ5dGVjb2RlCitpcyBkaXJlY3RseSBwYXNzZWQgYXMgYSB0ZXh0IHN0cmluZyBpbiB0aGUgZm9ybSBvZgorLkIgXCdzLGMgdCBmIGssYyB0IGYgayxjIHQgZiBrLC4uLlwnCissIHdoZXJlCisuQiBzCitkZW5vdGVzIHRoZSBudW1iZXIgb2Ygc3Vic2VxdWVudCA0LXR1cGxlcy4gT25lIHN1Y2ggNC10dXBsZSBjb25zaXN0cyBvZgorLkIgYyB0IGYgaworZGVjaW1hbHMsIHdoZXJlCisuQiBjCityZXByZXNlbnRzIHRoZSBjQlBGIG9wY29kZSwKKy5CIHQKK3RoZSBqdW1wIHRydWUgb2Zmc2V0IHRhcmdldCwKKy5CIGYKK3RoZSBqdW1wIGZhbHNlIG9mZnNldCB0YXJnZXQgYW5kCisuQiBrCit0aGUgaW1tZWRpYXRlIGNvbnN0YW50L2xpdGVyYWwuIFRoZXJlIGFyZSB2YXJpb3VzIHRvb2xzIHRoYXQgZ2VuZXJhdGUgY29kZQoraW4gdGhpcyBsb2FkYWJsZSBmb3JtYXQsIGZvciBleGFtcGxlLAorLkIgYnBmX2FzbQordGhhdCBzaGlwcyB3aXRoIHRoZSBMaW51eCBrZXJuZWwgc291cmNlIHRyZWUgdW5kZXIKKy5CIHRvb2xzL25ldC8KKywgc28gaXQgaXMgY2VydGFpbmx5IG5vdCBleHBlY3RlZCB0byBoYWNrIHRoaXMgYnkgaGFuZC4gVGhlCisuQiBieXRlY29kZQorb3IKKy5CIGJ5dGVjb2RlLWZpbGUKK29wdGlvbiBpcyBtYW5kYXRvcnkgd2hlbiBhIGNCUEYgY2xhc3NpZmllciBvciBhY3Rpb24gaXMgdG8gYmUgbG9hZGVkLgorCisuU1MgYnl0ZWNvZGUtZmlsZQorYWxzbyBiZWluZyB1c2VkIHRvIGxvYWQgYSBjQlBGIGNsYXNzaWZpZXIgb3IgYWN0aW9uLiBJdCdzIGVmZmVjdGl2ZWx5IHRoZQorc2FtZSBhcworLkIgYnl0ZWNvZGUKK29ubHkgdGhhdCB0aGUgY0JQRiBieXRlY29kZSBpcyBub3QgcGFzc2VkIGRpcmVjdGx5IHZpYSBjb21tYW5kIGxpbmUsIGJ1dAorcmF0aGVyIHJlc2lkZXMgaW4gYSB0ZXh0IGZpbGUuCisKKy5TSCBFWEFNUExFUworLlNTIGVCUEYgVE9PTElORworQSBmdWxsIGJsb3duIGV4YW1wbGUgaW5jbHVkaW5nIGVCUEYgYWdlbnQgY29kZSBjYW4gYmUgZm91bmQgaW5zaWRlIHRoZQoraXByb3V0ZTIgc291cmNlIHBhY2thZ2UgdW5kZXI6CisuQiBleGFtcGxlcy9icGYvCisKK0FzIHByZXJlcXVpc2l0ZXMsIHRoZSBrZXJuZWwgbmVlZHMgdG8gaGF2ZSB0aGUgZUJQRiBzeXN0ZW0gY2FsbCBuYW1lbHkKKy5CIGJwZigyKQorZW5hYmxlZCBhbmQgc2hpcHMgd2l0aAorLkIgY2xzX2JwZgorYW5kCisuQiBhY3RfYnBmCitrZXJuZWwgbW9kdWxlcyBmb3IgdGhlIHRyYWZmaWMgY29udHJvbCBzdWJzeXN0ZW0uIFRvIGVuYWJsZSBlQlBGL2VCUEYgSklUCitzdXBwb3J0LCBkZXBlbmRpbmcgd2hpY2ggb2YgdGhlIHR3byB0aGUgZ2l2ZW4gYXJjaGl0ZWN0dXJlIHN1cHBvcnRzOgorCisuaW4gKzRuCisuQiBlY2hvIDEgPiAvcHJvYy9zeXMvbmV0L2NvcmUvYnBmX2ppdF9lbmFibGUKKy5pbgorCitBIGdpdmVuIHJlc3RyaWN0ZWQgQyBmaWxlIGNhbiBiZSBjb21waWxlZCB2aWEgTExWTSBhczoKKworLmluICs0bgorLkIgY2xhbmcgLU8yIC1lbWl0LWxsdm0gLWMgYnBmLmMgLW8gLSB8IGxsYyAtbWFyY2g9YnBmIC1maWxldHlwZT1vYmogLW8gYnBmLm8KKy5pbgorCitUaGUgY29tcGlsZXIgaW52b2NhdGlvbiBtaWdodCBzdGlsbCBzaW1wbGlmeSBpbiBmdXR1cmUsIHNvIGZvciBub3csCitpdCdzIHF1aXRlIGhhbmR5IHRvIGFsaWFzIHRoaXMgY29uc3RydWN0IGluIG9uZSB3YXkgb3IgYW5vdGhlciwgZm9yCitleGFtcGxlOgorLmluICs0bgorLm5mCisuc3AKK19fYmNjKCkgeworICAgICAgICBjbGFuZyAtTzIgLWVtaXQtbGx2bSAtYyAkMSAtbyAtIHwgXFwKKyAgICAgICAgbGxjIC1tYXJjaD1icGYgLWZpbGV0eXBlPW9iaiAtbyAiYGJhc2VuYW1lICQxIC5jYC5vIgorfQorCithbGlhcyBiY2M9X19iY2MKKy5maQorLmluCisKK0EgbWluaW1hbCwgc3RhbmQtYWxvbmUgdW5pdCwgd2hpY2ggbWF0Y2hlcyBvbiBhbGwgdHJhZmZpYyB3aXRoIHRoZQorZGVmYXVsdCBjbGFzc2lkIChyZXR1cm4gY29kZSBvZiAtMSkgbG9va3MgbGlrZToKKworLmluICs0bgorLm5mCisuc3AKKyNpbmNsdWRlIDxsaW51eC9icGYuaD4KKworI2lmbmRlZiBfX3NlY3Rpb24KKyMgZGVmaW5lIF9fc2VjdGlvbih4KSAgX19hdHRyaWJ1dGVfXygoc2VjdGlvbih4KSwgdXNlZCkpCisjZW5kaWYKKworX19zZWN0aW9uKCJjbGFzc2lmaWVyIikgaW50IGNsc19tYWluKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYikKK3sKKyAgICAgICAgcmV0dXJuIC0xOworfQorCitjaGFyIF9fbGljZW5zZVtdIF9fc2VjdGlvbigibGljZW5zZSIpID0gIkdQTCI7CisuZmkKKy5pbgorCitNb3JlIGV4YW1wbGVzIGNhbiBiZSBmb3VuZCBmdXJ0aGVyIGJlbG93IGluIHN1YnNlY3Rpb24KKy5CIGVCUEYgUFJPR1JBTU1JTkcKK2FzIGZvY3VzIGhlcmUgd2lsbCBiZSBvbiB0b29saW5nLgorCitUaGVyZSBjYW4gYmUgdmFyaW91cyBvdGhlciBzZWN0aW9ucywgZm9yIGV4YW1wbGUsIGFsc28gZm9yIGFjdGlvbnMuCitUaHVzLCBhbiBvYmplY3QgZmlsZSBpbiBlQlBGIGNhbiBjb250YWluIG11bHRpcGxlIGVudHJhbmNlIHBvaW50cy4KK0Fsd2F5cyBhIHNwZWNpZmljIGVudHJhbmNlIHBvaW50LCBob3dldmVyLCBtdXN0IGJlIHNwZWNpZmllZCB3aGVuCitjb25maWd1cmluZyB3aXRoIHRjLiBBIGxpY2Vuc2UgbXVzdCBiZSBwYXJ0IG9mIHRoZSByZXN0cmljdGVkIEMgY29kZQorYW5kIHRoZSBsaWNlbnNlIHN0cmluZyBzeW50YXggaXMgdGhlIHNhbWUgYXMgd2l0aCBMaW51eCBrZXJuZWwgbW9kdWxlcy4KK1RoZSBrZXJuZWwgcmVzZXJ2ZXMgaXRzIHJpZ2h0IHRoYXQgc29tZSBlQlBGIGhlbHBlciBmdW5jdGlvbnMgY2FuIGJlCityZXN0cmljdGVkIHRvIEdQTCBjb21wYXRpYmxlIGxpY2Vuc2VzIG9ubHksIGFuZCB0aHVzIG1heSByZWplY3QgYSBwcm9ncmFtCitmcm9tIGxvYWRpbmcgaW50byB0aGUga2VybmVsIHdoZW4gc3VjaCBhIGxpY2Vuc2UgbWlzbWF0Y2ggb2NjdXJzLgorCitUaGUgcmVzdWx0aW5nIG9iamVjdCBmaWxlIGZyb20gdGhlIGNvbXBpbGF0aW9uIGNhbiBiZSBpbnNwZWN0ZWQgd2l0aAordGhlIHVzdWFsIHNldCBvZiB0b29scyB0aGF0IGFsc28gb3BlcmF0ZSBvbiBub3JtYWwgb2JqZWN0IGZpbGVzLCBmb3IKK2V4YW1wbGUKKy5CIG9iamR1bXAoMSkKK2ZvciBpbnNwZWN0aW5nIEVMRiBzZWN0aW9uIGhlYWRlcnM6CisKKy5pbiArNG4KKy5uZgorLnNwCitvYmpkdW1wIC1oIGJwZi5vCitbLi4uXQorMyBjbGFzc2lmaWVyICAgIDAwMDAwN2Y4ICAwMDAwMDAwMDAwMDAwMDAwICAwMDAwMDAwMDAwMDAwMDAwICAwMDAwMDA0MCAgMioqMworICAgICAgICAgICAgICAgIENPTlRFTlRTLCBBTExPQywgTE9BRCwgUkVMT0MsIFJFQURPTkxZLCBDT0RFCis0IGFjdGlvbi1tYXJrICAgMDAwMDAwODggIDAwMDAwMDAwMDAwMDAwMDAgIDAwMDAwMDAwMDAwMDAwMDAgIDAwMDAwODM4ICAyKiozCisgICAgICAgICAgICAgICAgQ09OVEVOVFMsIEFMTE9DLCBMT0FELCBSRUxPQywgUkVBRE9OTFksIENPREUKKzUgYWN0aW9uLXJhbmQgICAwMDAwMDA5OCAgMDAwMDAwMDAwMDAwMDAwMCAgMDAwMDAwMDAwMDAwMDAwMCAgMDAwMDA4YzAgIDIqKjMKKyAgICAgICAgICAgICAgICBDT05URU5UUywgQUxMT0MsIExPQUQsIFJFTE9DLCBSRUFET05MWSwgQ09ERQorNiBtYXBzICAgICAgICAgIDAwMDAwMDMwICAwMDAwMDAwMDAwMDAwMDAwICAwMDAwMDAwMDAwMDAwMDAwICAwMDAwMDk1OCAgMioqMgorICAgICAgICAgICAgICAgIENPTlRFTlRTLCBBTExPQywgTE9BRCwgREFUQQorNyBsaWNlbnNlICAgICAgIDAwMDAwMDA0ICAwMDAwMDAwMDAwMDAwMDAwICAwMDAwMDAwMDAwMDAwMDAwICAwMDAwMDk4OCAgMioqMAorICAgICAgICAgICAgICAgIENPTlRFTlRTLCBBTExPQywgTE9BRCwgREFUQQorWy4uLl0KKy5maQorLmluCisKK0FkZGluZyBhbiBlQlBGIGNsYXNzaWZpZXIgZnJvbSBhbiBvYmplY3QgZmlsZSB0aGF0IGNvbnRhaW5zIGEgY2xhc3NpZmllcgoraW4gdGhlIGRlZmF1bHQgRUxGIHNlY3Rpb24gaXMgdHJpdmlhbCAobm90ZSB0aGF0IGluc3RlYWQgb2YgIm9iamVjdC1maWxlIgorYWxzbyBzaG9ydGN1dHMgc3VjaCBhcyAib2JqIiBjYW4gYmUgdXNlZCk6CisKKy5pbiArNG4KKy5CIGJjYyBicGYuYworLmJyCisuQiB0YyBmaWx0ZXIgYWRkIGRldiBlbTEgcGFyZW50IDE6IGJwZiBvYmogYnBmLm8gZmxvd2lkIDE6MQorLmluCisKK0luIGNhc2UgdGhlIGNsYXNzaWZpZXIgcmVzaWRlcyBpbiBFTEYgc2VjdGlvbiAibXljbHMiLCB0aGVuIHRoYXQgc2FtZQorY29tbWFuZCBuZWVkcyB0byBiZSBpbnZva2VkIGFzOgorCisuaW4gKzRuCisuQiB0YyBmaWx0ZXIgYWRkIGRldiBlbTEgcGFyZW50IDE6IGJwZiBvYmogYnBmLm8gc2VjIG15Y2xzIGZsb3dpZCAxOjEKKy5pbgorCitEdW1waW5nIHRoZSBjbGFzc2lmaWVyIGNvbmZpZ3VyYXRpb24gd2lsbCB0ZWxsIHRoZSBsb2NhdGlvbiBvZiB0aGUKK2NsYXNzaWZpZXIsIGluIG90aGVyIHdvcmRzIHRoYXQgaXQncyBmcm9tIG9iamVjdCBmaWxlICJicGYubyIgdW5kZXIKK3NlY3Rpb24gIm15Y2xzIjoKKworLmluICs0bgorLkIgdGMgZmlsdGVyIHNob3cgZGV2IGVtMQorLmJyCisuQiBmaWx0ZXIgcGFyZW50IDE6IHByb3RvY29sIGFsbCBwcmVmIDQ5MTUyIGJwZgorLmJyCisuQiBmaWx0ZXIgcGFyZW50IDE6IHByb3RvY29sIGFsbCBwcmVmIDQ5MTUyIGJwZiBoYW5kbGUgMHgxIGZsb3dpZCAxOjEgYnBmLm86W215Y2xzXQorLmluCisKK1RoZSBzYW1lIHByb2dyYW0gY2FuIGFsc28gYmUgaW5zdGFsbGVkIG9uIGluZ3Jlc3MgcWRpc2Mgc2lkZSBhcyBvcHBvc2VkCit0byBlZ3Jlc3MgLi4uCisKKy5pbiArNG4KKy5CIHRjIHFkaXNjIGFkZCBkZXYgZW0xIGhhbmRsZSBmZmZmOiBpbmdyZXNzCisuYnIKKy5CIHRjIGZpbHRlciBhZGQgZGV2IGVtMSBwYXJlbnQgZmZmZjogYnBmIG9iaiBicGYubyBzZWMgbXljbHMgZmxvd2lkIGZmZmY6MQorLmluCisKK1wmLi4uIGFuZCBhZ2FpbiBkdW1wZWQgZnJvbSB0aGVyZToKKworLmluICs0bgorLkIgdGMgZmlsdGVyIHNob3cgZGV2IGVtMSBwYXJlbnQgZmZmZjoKKy5icgorLkIgZmlsdGVyIHByb3RvY29sIGFsbCBwcmVmIDQ5MTUyIGJwZgorLmJyCisuQiBmaWx0ZXIgcHJvdG9jb2wgYWxsIHByZWYgNDkxNTIgYnBmIGhhbmRsZSAweDEgZmxvd2lkIGZmZmY6MSBicGYubzpbbXljbHNdCisuaW4KKworQXR0YWNoaW5nIGEgY2xhc3NpZmllciBhbmQgYWN0aW9uIG9uIGluZ3Jlc3MgaGFzIHRoZSByZXN0cmljdGlvbiB0aGF0CitpdCBkb2Vzbid0IGhhdmUgYW4gYWN0dWFsIHVuZGVybHlpbmcgcXVldWVpbmcgZGlzY2lwbGluZS4gV2hhdCBpbmdyZXNzCitjYW4gZG8gaXMgdG8gY2xhc3NpZnksIG1hbmdsZSwgcmVkaXJlY3Qgb3IgZHJvcCBwYWNrZXRzLiBXaGVuIHF1ZXVlaW5nCitpcyByZXF1aXJlZCBvbiBpbmdyZXNzIHNpZGUsIHRoZW4gaW5ncmVzcyBtdXN0IHJlZGlyZWN0IHBhY2tldHMgdG8gdGhlCisuQiBpZmIKK2RldmljZSwgb3RoZXJ3aXNlIHBvbGljaW5nIGNhbiBiZSB1c2VkLiBNb3Jlb3ZlciwgaW5ncmVzcyBjYW4gYmUgdXNlZCB0bworaGF2ZSBhbiBlYXJseSBkcm9wIHBvaW50IG9mIHVud2FudGVkIHBhY2tldHMgYmVmb3JlIHRoZXkgaGl0IHVwcGVyIGxheWVycworb2YgdGhlIG5ldHdvcmtpbmcgc3RhY2ssIHBlcmZvcm0gbmV0d29yayBhY2NvdW50aW5nIHdpdGggZUJQRiBtYXBzIHRoYXQKK2NvdWxkIGJlIHNoYXJlZCB3aXRoIGVncmVzcywgb3IgaGF2ZSBhbiBlYXJseSBtYW5nbGUgYW5kL29yIHJlZGlyZWN0aW9uCitwb2ludCB0byBkaWZmZXJlbnQgbmV0d29ya2luZyBkZXZpY2VzLgorCitNdWx0aXBsZSBlQlBGIGFjdGlvbnMgYW5kIGNsYXNzaWZpZXIgY2FuIGJlIHBsYWNlZCBpbnRvIGEgc2luZ2xlCitvYmplY3QgZmlsZSB3aXRoaW4gdmFyaW91cyBzZWN0aW9ucy4gSW4gdGhhdCBjYXNlLCBub24tZGVmYXVsdCBzZWN0aW9uCituYW1lcyBtdXN0IGJlIHByb3ZpZGVkLCB3aGljaCBpcyB0aGUgY2FzZSBmb3IgYm90aCBhY3Rpb25zIGluIHRoaXMKK2V4YW1wbGU6CisKKy5pbiArNG4KKy5CIHRjIGZpbHRlciBhZGQgZGV2IGVtMSBwYXJlbnQgMTogYnBmIG9iaiBicGYubyBmbG93aWQgMToxIFxlCisuYnIKKy5pbiArMjVuCisuQiAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uIGJwZiBvYmogYnBmLm8gc2VjIGFjdGlvbi1tYXJrIFxlCisuYnIKKy5CICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24gYnBmIG9iaiBicGYubyBzZWMgYWN0aW9uLXJhbmQgb2sKKy5pbiAtMjVuCisuaW4gLTRuCisKK1RoZSBhZHZhbnRhZ2Ugb2YgdGhpcyBpcyB0aGF0IHRoZSBjbGFzc2lmaWVyIGFuZCB0aGUgdHdvIGFjdGlvbnMgY2FuCit0aGVuIHNoYXJlIGVCUEYgbWFwcyB3aXRoIGVhY2ggb3RoZXIsIGlmIGltcGxlbWVudGVkIGluIHRoZSBwcm9ncmFtcy4KKworSW4gb3JkZXIgdG8gYWNjZXNzIGVCUEYgbWFwcyBmcm9tIHVzZXIgc3BhY2UgYmV5b25kCisuQiB0Yyg4KQorc2V0dXAgbGlmZXRpbWUsIHRoZSBvd25lcnNoaXAgY2FuIGJlIHRyYW5zZmVycmVkIHRvIGFuIGVCUEYgYWdlbnQgdmlhCitVbml4IGRvbWFpbiBzb2NrZXRzLiBUaGVyZSBhcmUgdHdvIHBvc3NpYmlsaXRpZXMgZm9yIGltcGxlbWVudGluZyB0aGlzOgorCisuQiAxKQoraW1wbGVtZW50YXRpb24gb2YgYW4gb3duIGVCUEYgYWdlbnQgdGhhdCB0YWtlcyBjYXJlIG9mIHNldHRpbmcgdXAKK3RoZSBVbml4IGRvbWFpbiBzb2NrZXQgYW5kIGltcGxlbWVudGluZyB0aGUgcHJvdG9jb2wgdGhhdAorLkIgdGMoOCkKK2RpY3RhdGVzLiBBIGNvZGUgZXhhbXBsZSBvZiB0aGlzIGNhbiBiZSBmb3VuZCBpbnNpZGUgdGhlIGlwcm91dGUyCitzb3VyY2UgcGFja2FnZSB1bmRlcjoKKy5CIGV4YW1wbGVzL2JwZi8KKworLkIgMikKK3VzZQorLkIgdGMgZXhlYworZm9yIHRyYW5zZmVycmluZyB0aGUgZUJQRiBtYXAgZmlsZSBkZXNjcmlwdG9ycyB0aHJvdWdoIGEgVW5peCBkb21haW4KK3NvY2tldCwgYW5kIHNwYXduaW5nIGFuIGFwcGxpY2F0aW9uIHN1Y2ggYXMKKy5CIHNoKDEpCitcJi4gVGhpcyBhcHByb2FjaCdzIGFkdmFudGFnZSBpcyB0aGF0IHRjIHdpbGwgcGxhY2UgdGhlIGZpbGUgZGVzY3JpcHRvcnMKK2ludG8gdGhlIGVudmlyb25tZW50IGFuZCB0aHVzIG1ha2UgdGhlbSBhdmFpbGFibGUganVzdCBsaWtlIHN0ZGluLCBzdGRvdXQsCitzdGRlcnIgZmlsZSBkZXNjcmlwdG9ycywgbWVhbmluZywgaW4gY2FzZSB1c2VyIGFwcGxpY2F0aW9ucyBydW4gZnJvbSB3aXRoaW4KK3RoaXMgZmQtb3duZXIgc2hlbGwsIHRoZXkgY2FuIHRlcm1pbmF0ZSBhbmQgcmVzdGFydCB3aXRob3V0IGxvc2luZyBlQlBGCittYXBzIGZpbGUgZGVzY3JpcHRvcnMuIEV4YW1wbGUgaW52b2NhdGlvbiB3aXRoIHRoZSBwcmV2aW91cyBjbGFzc2lmaWVyIGFuZAorYWN0aW9uIG1peHR1cmU6CisKKy5pbiArNG4KKy5CIHRjIGV4ZWMgYnBmIGltcCAvdG1wL2JwZgorLmJyCisuQiB0YyBmaWx0ZXIgYWRkIGRldiBlbTEgcGFyZW50IDE6IGJwZiBvYmogYnBmLm8gZXhwIC90bXAvYnBmIGZsb3dpZCAxOjEgXGUKKy5icgorLmluICsyNW4KKy5CICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24gYnBmIG9iaiBicGYubyBzZWMgYWN0aW9uLW1hcmsgXGUKKy5icgorLkIgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbiBicGYgb2JqIGJwZi5vIHNlYyBhY3Rpb24tcmFuZCBvaworLmluIC0yNW4KKy5pbiAtNG4KKworQXNzdW1pbmcgdGhhdCBlQlBGIG1hcHMgYXJlIHNoYXJlZCB3aXRoIGNsYXNzaWZpZXIgYW5kIGFjdGlvbnMsIGl0J3MKK2Vub3VnaCB0byBleHBvcnQgdGhlbSBvbmNlLCBmb3IgZXhhbXBsZSwgZnJvbSB3aXRoaW4gdGhlIGNsYXNzaWZpZXIKK29yIGFjdGlvbiBjb21tYW5kLiB0YyB3aWxsIHNldHVwIGFsbCBlQlBGIG1hcCBmaWxlIGRlc2NyaXB0b3JzIGF0IHRoZQordGltZSB3aGVuIHRoZSBvYmplY3QgZmlsZSBpcyBmaXJzdCBwYXJzZWQuCisKK1doZW4gYSBzaGVsbCBoYXMgYmVlbiBzcGF3bmVkLCB0aGUgZW52aXJvbm1lbnQgd2lsbCBoYXZlIGEgY291cGxlIG9mCitlQlBGIHJlbGF0ZWQgdmFyaWFibGVzLiBCUEZfTlVNX01BUFMgcHJvdmlkZXMgdGhlIHRvdGFsIG51bWJlciBvZiBtYXBzCit0aGF0IGhhdmUgYmVlbiB0cmFuc2ZlcnJlZCBvdmVyIHRoZSBVbml4IGRvbWFpbiBzb2NrZXQuIEJQRl9NQVA8WD4ncwordmFsdWUgaXMgdGhlIGZpbGUgZGVzY3JpcHRvciBudW1iZXIgdGhhdCBjYW4gYmUgYWNjZXNzZWQgaW4gZUJQRiBhZ2VudAorYXBwbGljYXRpb25zLCBpbiBvdGhlciB3b3JkcywgaXQgY2FuIGRpcmVjdGx5IGJlIHVzZWQgYXMgdGhlIGZpbGUKK2Rlc2NyaXB0b3IgdmFsdWUgZm9yIHRoZQorLkIgYnBmKDIpCitzeXN0ZW0gY2FsbCB0byByZXRyaWV2ZSBvciBhbHRlciBlQlBGIG1hcCB2YWx1ZXMuIDxYPiBkZW5vdGVzIHRoZQoraWRlbnRpZmllciBvZiB0aGUgZUJQRiBtYXAuIEl0IGNvcnJlc3BvbmRzIHRvIHRoZQorLkIgaWQKK21lbWJlciBvZgorLkIgc3RydWN0IGJwZl9lbGZfbWFwCitcJiBmcm9tIHRoZSB0YyBlQlBGIG1hcCBzcGVjaWZpY2F0aW9uLgorCitUaGUgZW52aXJvbm1lbnQgaW4gdGhpcyBleGFtcGxlIGxvb2tzIGFzIGZvbGxvd3M6CisKKy5pbiArNG4KKy5uZgorLnNwCitzaCMgZW52IHwgZ3JlcCBCUEYKKyAgICBCUEZfTlVNX01BUFM9MworICAgIEJQRl9NQVAxPTYKKyAgICBCUEZfTUFQMD01CisgICAgQlBGX01BUDI9Nworc2gjIGxzIC1sYSAvcHJvYy9zZWxmL2ZkCisgICAgWy4uLl0KKyAgICBscnd4LS0tLS0tLiAxIHJvb3Qgcm9vdCA2NCBBcHIgMTQgMTY6NDYgNSAtPiBhbm9uX2lub2RlOmJwZi1tYXAKKyAgICBscnd4LS0tLS0tLiAxIHJvb3Qgcm9vdCA2NCBBcHIgMTQgMTY6NDYgNiAtPiBhbm9uX2lub2RlOmJwZi1tYXAKKyAgICBscnd4LS0tLS0tLiAxIHJvb3Qgcm9vdCA2NCBBcHIgMTQgMTY6NDYgNyAtPiBhbm9uX2lub2RlOmJwZi1tYXAKK3NoIyBteV9icGZfYWdlbnQKKy5maQorLmluCisKK2VCUEYgYWdlbnRzIGFyZSB2ZXJ5IHVzZWZ1bCBpbiB0aGF0IHRoZXkgY2FuIHByZXBvcHVsYXRlIGVCUEYgbWFwcyBmcm9tCit1c2VyIHNwYWNlLCBtb25pdG9yIHN0YXRpc3RpY3MgdmlhIG1hcHMgYW5kIGJhc2VkIG9uIHRoYXQgZmVlZGJhY2ssIGZvcgorZXhhbXBsZSwgcmV3cml0ZSBjbGFzc2lkcyBpbiBlQlBGIG1hcCB2YWx1ZXMgZHVyaW5nIHJ1bnRpbWUuIEdpdmVuIHRoYXQgZUJQRgorYWdlbnRzIGFyZSBpbXBsZW1lbnRlZCBhcyBub3JtYWwgYXBwbGljYXRpb25zLCB0aGV5IGNhbiBhbHNvIGR5bmFtaWNhbGx5CityZWNlaXZlIHRyYWZmaWMgY29udHJvbCBwb2xpY2llcyBmcm9tIGV4dGVybmFsIGNvbnRyb2xsZXJzIGFuZCB0aHVzIHB1c2gKK3RoZW0gZG93biBpbnRvIGVCUEYgbWFwcyB0byBkeW5hbWljYWxseSBhZGFwdCB0byBuZXR3b3JrIGNvbmRpdGlvbnMuIE1vcmVvdmVyLAorZUJQRiBtYXBzIGNhbiBhbHNvIGJlIHNoYXJlZCB3aXRoIG90aGVyIGVCUEYgcHJvZ3JhbSB0eXBlcyAoZS5nLiB0cmFjaW5nKSwKK3RodXMgdmVyeSBwb3dlcmZ1bCBjb21iaW5hdGlvbiBjYW4gdGhlcmVmb3JlIGJlIGltcGxlbWVudGVkLgorCisuU1MgZUJQRiBQUk9HUkFNTUlORworCitlQlBGIGNsYXNzaWZpZXIgYW5kIGFjdGlvbnMgYXJlIGJlaW5nIGltcGxlbWVudGVkIGluIHJlc3RyaWN0ZWQgQyBzeW50YXgKKyhpbiBmdXR1cmUsIHRoZXJlIGNvdWxkIGFkZGl0aW9uYWxseSBiZSBuZXcgbGFuZ3VhZ2UgZnJvbnRlbmRzIHN1cHBvcnRlZCkuCisKK1RoZSBoZWFkZXIgZmlsZQorLkIgbGludXgvYnBmLmgKK3Byb3ZpZGVzIGVCUEYgaGVscGVyIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSBjYWxsZWQgZnJvbSBhbiBlQlBGIHByb2dyYW0uCitUaGlzIG1hbiBwYWdlIHdpbGwgb25seSBwcm92aWRlIHR3byBtaW5pbWFsLCBzdGFuZC1hbG9uZSBleGFtcGxlcywgaGF2ZSBhCitsb29rIGF0CisuQiBleGFtcGxlcy9icGYKK2Zyb20gdGhlIGlwcm91dGUyIHNvdXJjZSBwYWNrYWdlIGZvciBhIGZ1bGx5IGZsZWRnZWQgZmxvdyBkaXNzZWN0b3IKK2V4YW1wbGUgdG8gYmV0dGVyIGRlbW9uc3RyYXRlIHNvbWUgb2YgdGhlIHBvc3NpYmlsaXRpZXMgd2l0aCBlQlBGLgorCitTdXBwb3J0ZWQgMzIgYml0IGNsYXNzaWZpZXIgcmV0dXJuIGNvZGVzIGZyb20gdGhlIEMgcHJvZ3JhbSBhbmQgdGhlaXIgbWVhbmluZ3M6CisuaW4gKzRuCisuQiAwCissIGRlbm90ZXMgYSBtaXNtYXRjaAorLmJyCisuQiAtMQorLCBkZW5vdGVzIHRoZSBkZWZhdWx0IGNsYXNzaWQgY29uZmlndXJlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUKKy5icgorLkIgZWxzZQorLCBldmVyeXRoaW5nIGVsc2Ugd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdCBjbGFzc2lkIHRvIHByb3ZpZGUgYSBmYWNpbGl0eSBmb3IKK25vbi1saW5lYXIgbWF0Y2hpbmcKKy5pbgorCitTdXBwb3J0ZWQgMzIgYml0IGFjdGlvbiByZXR1cm4gY29kZXMgZnJvbSB0aGUgQyBwcm9ncmFtIGFuZCB0aGVpciBtZWFuaW5ncyAoCisuQiBsaW51eC9wa3RfY2xzLmgKKyk6CisuaW4gKzRuCisuQiBUQ19BQ1RfT0sgKDApCissIHdpbGwgdGVybWluYXRlIHRoZSBwYWNrZXQgcHJvY2Vzc2luZyBwaXBlbGluZSBhbmQgYWxsb3dzIHRoZSBwYWNrZXQgdG8KK3Byb2NlZWQKKy5icgorLkIgVENfQUNUX1NIT1QgKDIpCissIHdpbGwgdGVybWluYXRlIHRoZSBwYWNrZXQgcHJvY2Vzc2luZyBwaXBlbGluZSBhbmQgZHJvcHMgdGhlIHBhY2tldAorLmJyCisuQiBUQ19BQ1RfVU5TUEVDICgtMSkKKywgd2lsbCB1c2UgdGhlIGRlZmF1bHQgYWN0aW9uIGNvbmZpZ3VyZWQgZnJvbSB0YyAoc2ltaWxhcmx5IGFzIHJldHVybmluZworLkIgLTEKK2Zyb20gYSBjbGFzc2lmaWVyKQorLmJyCisuQiBUQ19BQ1RfUElQRSAoMykKKywgd2lsbCBpdGVyYXRlIHRvIHRoZSBuZXh0IGFjdGlvbiwgaWYgYXZhaWxhYmxlCisuYnIKKy5CIFRDX0FDVF9SRUNMQVNTSUZZICgxKQorLCB3aWxsIHRlcm1pbmF0ZSB0aGUgcGFja2V0IHByb2Nlc3NpbmcgcGlwZWxpbmUgYW5kIHN0YXJ0IGNsYXNzaWZpY2F0aW9uCitmcm9tIHRoZSBiZWdpbm5pbmcKKy5icgorLkIgZWxzZQorLCBldmVyeXRoaW5nIGVsc2UgaXMgYW4gdW5zcGVjaWZpZWQgcmV0dXJuIGNvZGUKKy5pbgorCitCb3RoIGNsYXNzaWZpZXIgYW5kIGFjdGlvbiByZXR1cm4gY29kZXMgYXJlIHN1cHBvcnRlZCBpbiBlQlBGIGFuZCBjQlBGCitwcm9ncmFtcy4KKworVG8gZGVtb25zdHJhdGUgcmVzdHJpY3RlZCBDIHN5bnRheCwgYSBtaW5pbWFsIHRveSBjbGFzc2lmaWVyIGV4YW1wbGUgaXMKK3Byb3ZpZGVkLCB3aGljaCBhc3N1bWVzIHRoYXQgZWdyZXNzIHBhY2tldHMsIGZvciBpbnN0YW5jZSBvcmlnaW5hdGluZworZnJvbSBhIGNvbnRhaW5lciwgaGF2ZSBwcmV2aW91c2x5IGJlZW4gbWFya2VkIGluIGludGVydmFsIFswLCAyNTVdLiBUaGUKK3Byb2dyYW0ga2VlcHMgc3RhdGlzdGljcyBvbiBkaWZmZXJlbnQgbWFya3MgZm9yIHVzZXIgc3BhY2UgYW5kIG1hcHMgdGhlCitjbGFzc2lkIHRvIHRoZSByb290IHFkaXNjIHdpdGggdGhlIG1hcmtpbmcgaXRzZWxmIGFzIHRoZSBtaW5vciBoYW5kbGU6CisKKy5pbiArNG4KKy5uZgorLnNwCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9icGYuaD4KKyNpbmNsdWRlIDxsaW51eC9wa3Rfc2NoZWQuaD4KKworI2luY2x1ZGUgImhlbHBlcnMuaCIKKworc3RydWN0IHR1cGxlIHsKKyAgICAgICAgbG9uZyBwYWNrZXRzOworICAgICAgICBsb25nIGJ5dGVzOworfTsKKworI2RlZmluZSBCUEZfTUFQX0lEX1NUQVRTICAgICAgICAxIC8qIGFnZW50J3MgbWFwIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgQlBGX01BWF9NQVJLICAgICAgICAgICAgMjU2CisKK3N0cnVjdCBicGZfZWxmX21hcCBfX3NlY3Rpb24oIm1hcHMiKSBtYXBfc3RhdHMgPSB7CisgICAgICAgIC50eXBlICAgICAgICAgICA9ICAgICAgIEJQRl9NQVBfVFlQRV9BUlJBWSwKKyAgICAgICAgLmlkICAgICAgICAgICAgID0gICAgICAgQlBGX01BUF9JRF9TVEFUUywKKyAgICAgICAgLnNpemVfa2V5ICAgICAgID0gICAgICAgc2l6ZW9mKHVpbnQzMl90KSwKKyAgICAgICAgLnNpemVfdmFsdWUgICAgID0gICAgICAgc2l6ZW9mKHN0cnVjdCB0dXBsZSksCisgICAgICAgIC5tYXhfZWxlbSAgICAgICA9ICAgICAgIEJQRl9NQVhfTUFSSywKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbHNfdXBkYXRlX3N0YXRzKGNvbnN0IHN0cnVjdCBfX3NrX2J1ZmYgKnNrYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1hcmspCit7CisgICAgICAgIHN0cnVjdCB0dXBsZSAqdHU7CisKKyAgICAgICAgdHUgPSBicGZfbWFwX2xvb2t1cF9lbGVtKCZtYXBfc3RhdHMsICZtYXJrKTsKKyAgICAgICAgaWYgKGxpa2VseSh0dSkpIHsKKyAgICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCgmdHUtPnBhY2tldHMsIDEpOworICAgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCZ0dS0+Ynl0ZXMsIHNrYi0+bGVuKTsKKyAgICAgICAgfQorfQorCitfX3NlY3Rpb24oImNscyIpIGludCBjbHNfbWFpbihzdHJ1Y3QgX19za19idWZmICpza2IpCit7CisgICAgICAgIHVpbnQzMl90IG1hcmsgPSBza2ItPm1hcms7CisKKyAgICAgICAgaWYgKHVubGlrZWx5KG1hcmsgPj0gQlBGX01BWF9NQVJLKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjbHNfdXBkYXRlX3N0YXRzKHNrYiwgbWFyayk7CisKKyAgICAgICAgcmV0dXJuIFRDX0hfTUFLRShUQ19IX1JPT1QsIG1hcmspOworfQorCitjaGFyIF9fbGljZW5zZVtdIF9fc2VjdGlvbigibGljZW5zZSIpID0gIkdQTCI7CisuZmkKKy5pbgorCitBbm90aGVyIHNtYWxsIGV4YW1wbGUgaXMgYSBwb3J0IHJlZGlyZWN0b3Igd2hpY2ggZGVtdXhlcyBkZXN0aW5hdGlvbiBwb3J0Cis4MCBpbnRvIHRoZSBpbnRlcnZhbCBbODA4MCwgODA4N10gc3RlZXJlZCBieSBSU1MsIHRoYXQgY2FuIHRoZW4gYmUgYXR0YWNoZWQKK3RvIGluZ3Jlc3MgcWRpc2MuIFRoZSBleGVyY2lzZSBvZiBhZGRpbmcgdGhlIGVncmVzcyBjb3VudGVycGFydCBhbmQgSVB2Ngorc3VwcG9ydCBpcyBsZWZ0IHRvIHRoZSByZWFkZXI6CisKKy5pbiArNG4KKy5uZgorLnNwCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaW5jbHVkZSA8bGludXgvYnBmLmg+CisjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisKKyNpbmNsdWRlICJoZWxwZXJzLmgiCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfdGNwX2Rwb3J0KHN0cnVjdCBfX3NrX2J1ZmYgKnNrYiwgaW50IG5oX29mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdTE2IG9sZF9wb3J0LCBfX3UxNiBuZXdfcG9ydCkKK3sKKyAgICAgICAgYnBmX2w0X2NzdW1fcmVwbGFjZShza2IsIG5oX29mZiArIG9mZnNldG9mKHN0cnVjdCB0Y3BoZHIsIGNoZWNrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfcG9ydCwgbmV3X3BvcnQsIHNpemVvZihuZXdfcG9ydCkpOworICAgICAgICBicGZfc2tiX3N0b3JlX2J5dGVzKHNrYiwgbmhfb2ZmICsgb2Zmc2V0b2Yoc3RydWN0IHRjcGhkciwgZGVzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld19wb3J0LCBzaXplb2YobmV3X3BvcnQpLCAwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbGJfZG9faXB2NChzdHJ1Y3QgX19za19idWZmICpza2IsIGludCBuaF9vZmYpCit7CisgICAgICAgIF9fdTE2IGRwb3J0LCBkcG9ydF9uZXcgPSA4MDgwLCBvZmY7CisgICAgICAgIF9fdTggaXBfcHJvdG8sIGlwX3ZsOworCisgICAgICAgIGlwX3Byb3RvID0gbG9hZF9ieXRlKHNrYiwgbmhfb2ZmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yoc3RydWN0IGlwaGRyLCBwcm90b2NvbCkpOworICAgICAgICBpZiAoaXBfcHJvdG8gIT0gSVBQUk9UT19UQ1ApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgaXBfdmwgPSBsb2FkX2J5dGUoc2tiLCBuaF9vZmYpOworICAgICAgICBpZiAobGlrZWx5KGlwX3ZsID09IDB4NDUpKQorICAgICAgICAgICAgICAgIG5oX29mZiArPSBzaXplb2Yoc3RydWN0IGlwaGRyKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG5oX29mZiArPSAoaXBfdmwgJiAweEYpIDw8IDI7CisKKyAgICAgICAgZHBvcnQgPSBsb2FkX2hhbGYoc2tiLCBuaF9vZmYgKyBvZmZzZXRvZihzdHJ1Y3QgdGNwaGRyLCBkZXN0KSk7CisgICAgICAgIGlmIChkcG9ydCAhPSA4MCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBvZmYgPSBza2ItPnF1ZXVlX21hcHBpbmcgJiA3OworICAgICAgICBzZXRfdGNwX2Rwb3J0KHNrYiwgbmhfb2ZmIC0gQlBGX0xMX09GRiwgX19jb25zdGFudF9odG9ucyg4MCksCisgICAgICAgICAgICAgICAgICAgICAgX19jcHVfdG9fYmUxNihkcG9ydF9uZXcgKyBvZmYpKTsKKyAgICAgICAgcmV0dXJuIC0xOworfQorCitfX3NlY3Rpb24oImxiIikgaW50IGxiX21haW4oc3RydWN0IF9fc2tfYnVmZiAqc2tiKQoreworICAgICAgICBpbnQgcmV0ID0gMCwgbmhfb2ZmID0gQlBGX0xMX09GRiArIEVUSF9ITEVOOworCisgICAgICAgIGlmIChsaWtlbHkoc2tiLT5wcm90b2NvbCA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKSkpCisgICAgICAgICAgICAgICAgcmV0ID0gbGJfZG9faXB2NChza2IsIG5oX29mZik7CisKKyAgICAgICAgcmV0dXJuIHJldDsKK30KKworY2hhciBfX2xpY2Vuc2VbXSBfX3NlY3Rpb24oImxpY2Vuc2UiKSA9ICJHUEwiOworLmZpCisuaW4KKworVGhlIHJlbGF0ZWQgaGVscGVyIGhlYWRlciBmaWxlCisuQiBoZWxwZXJzLmgKK2luIGJvdGggZXhhbXBsZXMgd2FzOgorCisuaW4gKzRuCisubmYKKy5zcAorLyogTWlzYyBoZWxwZXIgbWFjcm9zLiAqLworI2RlZmluZSBfX3NlY3Rpb24oeCkgX19hdHRyaWJ1dGVfXygoc2VjdGlvbih4KSwgdXNlZCkpCisjZGVmaW5lIG9mZnNldG9mKHgsIHkpIF9fYnVpbHRpbl9vZmZzZXRvZih4LCB5KQorI2RlZmluZSBsaWtlbHkoeCkgX19idWlsdGluX2V4cGVjdCghISh4KSwgMSkKKyNkZWZpbmUgdW5saWtlbHkoeCkgX19idWlsdGluX2V4cGVjdCghISh4KSwgMCkKKworLyogVXNlZCBtYXAgc3RydWN0dXJlICovCitzdHJ1Y3QgYnBmX2VsZl9tYXAgeworICAgIF9fdTMyIHR5cGU7CisgICAgX191MzIgc2l6ZV9rZXk7CisgICAgX191MzIgc2l6ZV92YWx1ZTsKKyAgICBfX3UzMiBtYXhfZWxlbTsKKyAgICBfX3UzMiBpZDsKK307CisKKy8qIFNvbWUgdXNlZCBCUEYgZnVuY3Rpb24gY2FsbHMuICovCitzdGF0aWMgaW50ICgqYnBmX3NrYl9zdG9yZV9ieXRlcykodm9pZCAqY3R4LCBpbnQgb2ZmLCB2b2lkICpmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBmbGFncykgPQorICAgICAgKHZvaWQgKikgQlBGX0ZVTkNfc2tiX3N0b3JlX2J5dGVzOworc3RhdGljIGludCAoKmJwZl9sNF9jc3VtX3JlcGxhY2UpKHZvaWQgKmN0eCwgaW50IG9mZiwgaW50IGZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvLCBpbnQgZmxhZ3MpID0KKyAgICAgICh2b2lkICopIEJQRl9GVU5DX2w0X2NzdW1fcmVwbGFjZTsKK3N0YXRpYyB2b2lkICooKmJwZl9tYXBfbG9va3VwX2VsZW0pKHZvaWQgKm1hcCwgdm9pZCAqa2V5KSA9CisgICAgICAodm9pZCAqKSBCUEZfRlVOQ19tYXBfbG9va3VwX2VsZW07CisKKy8qIFNvbWUgdXNlZCBCUEYgaW50cmluc2ljcy4gKi8KK3Vuc2lnbmVkIGxvbmcgbG9uZyBsb2FkX2J5dGUodm9pZCAqc2tiLCB1bnNpZ25lZCBsb25nIGxvbmcgb2ZmKQorICAgIGFzbSAoImxsdm0uYnBmLmxvYWQuYnl0ZSIpOwordW5zaWduZWQgbG9uZyBsb25nIGxvYWRfaGFsZih2b2lkICpza2IsIHVuc2lnbmVkIGxvbmcgbG9uZyBvZmYpCisgICAgYXNtICgibGx2bS5icGYubG9hZC5oYWxmIik7CisuZmkKKy5pbgorCitCZXN0IHByYWN0aWNlLCB3ZSByZWNvbW1lbmQgdG8gb25seSBoYXZlIGEgc2luZ2xlIGVCUEYgY2xhc3NpZmllciBsb2FkZWQKK2luIHRjIGFuZCBwZXJmb3JtCisuQiBhbGwKK25lY2Vzc2FyeSBtYXRjaGluZyBhbmQgbWFuZ2xpbmcgZnJvbSB0aGVyZSBpbnN0ZWFkIG9mIGEgbGlzdCBvZiBpbmRpdmlkdWFsCitjbGFzc2lmaWVyIGFuZCBzZXBhcmF0ZSBhY3Rpb25zLiBKdXN0IGEgc2luZ2xlIGNsYXNzaWZpZXIgdGFpbG9yZWQgZm9yIGEKK2dpdmVuIHVzZS1jYXNlIHdpbGwgYmUgbW9zdCBlZmZpY2llbnQgdG8gcnVuLgorCisuU1MgZUJQRiBERUJVR0dJTkcKKworQm90aCB0YworLkIgZmlsdGVyCithbmQKKy5CIGFjdGlvbgorY29tbWFuZHMgZm9yCisuQiBicGYKK3N1cHBvcnQgYW4gb3B0aW9uYWwKKy5CIHZlcmJvc2UKK3BhcmFtZXRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGluc3BlY3QgdGhlIGVCUEYgdmVyaWZpZXIgbG9nLiBJdCBpcyBkdW1wZWQKK2J5IGRlZmF1bHQgaW4gY2FzZSBvZiBhbiBlcnJvci4KKworSW4gY2FzZSB0aGUgZUJQRi9jQlBGIEpJVCBjb21waWxlciBoYXMgYmVlbiBlbmFibGVkLCBpdCBjYW4gYWxzbyBiZQoraW5zdHJ1Y3RlZCB0byBlbWl0IGEgZGVidWcgb3V0cHV0IG9mIHRoZSByZXN1bHRpbmcgb3Bjb2RlIGltYWdlIGludG8KK3RoZSBrZXJuZWwgbG9nLCB3aGljaCBjYW4gYmUgcmVhZCB2aWEKKy5CIGRtZXNnKDEpCis6CisKKy5pbiArNG4KKy5CIGVjaG8gMiA+IC9wcm9jL3N5cy9uZXQvY29yZS9icGZfaml0X2VuYWJsZQorLmluCisKK1RoZSBMaW51eCBrZXJuZWwgc291cmNlIHRyZWUgc2hpcHMgYWRkaXRpb25hbGx5IHVuZGVyCisuQiB0b29scy9uZXQvCithIHNtYWxsIGhlbHBlciBjYWxsZWQKKy5CIGJwZl9qaXRfZGlzYXNtCit0aGF0IHJlYWRzIG91dCB0aGUgb3Bjb2RlIGltYWdlIGR1bXAgZnJvbSB0aGUga2VybmVsIGxvZyBhbmQgZHVtcHMgdGhlCityZXN1bHRpbmcgZGlzYXNzZW1ibHk6CisKKy5pbiArNG4KKy5CIGJwZl9qaXRfZGlzYXNtIC1vCisuaW4KKworT3RoZXIgdGhhbiB0aGF0LCB0aGUgTGludXgga2VybmVsIGFsc28gY29udGFpbnMgYW4gZXh0ZW5zaXZlIGVCUEYvY0JQRgordGVzdCBzdWl0ZSBtb2R1bGUgY2FsbGVkCisuQiB0ZXN0X2JwZgorXCYuIFVwb24gLi4uCisKKy5pbiArNG4KKy5CIG1vZHByb2JlIHRlc3RfYnBmCisuaW4KKworXCYuLi4gaXQgcGVyZm9ybXMgYSBkaXZlcnNpdHkgb2YgdGVzdCBjYXNlcyBhbmQgZHVtcHMgdGhlIHJlc3VsdHMgaW50bwordGhlIGtlcm5lbCBsb2cgdGhhdCBjYW4gYmUgaW5zcGVjdGVkIHdpdGgKKy5CIGRtZXNnKDEpCitcJi4gVGhlIHJlc3VsdHMgY2FuIGRpZmZlciBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgSklUIGNvbXBpbGVyIGlzIGVuYWJsZWQKK29yIG5vdC4gSW4gY2FzZSBvZiBmYWlsZWQgdGVzdCBjYXNlcywgdGhlIG1vZHVsZSB3aWxsIGZhaWwgdG8gbG9hZC4gSW4KK3N1Y2ggY2FzZXMsIHdlIHVyZ2UgeW91IHRvIGZpbGUgYSBidWcgcmVwb3J0IHRvIHRoZSByZWxhdGVkIEpJVCBhdXRob3JzLAorTGludXgga2VybmVsIGFuZCBuZXR3b3JraW5nIG1haWxpbmcgbGlzdHMuCisKKy5TUyBjQlBGCisKK0FsdGhvdWdoIHdlIGdlbmVyYWxseSByZWNvbW1lbmQgc3dpdGNoaW5nIHRvIGltcGxlbWVudGluZworLkIgZUJQRgorY2xhc3NpZmllciBhbmQgYWN0aW9ucywgZm9yIHRoZSBzYWtlIG9mIGNvbXBsZXRlbmVzcywgYSBmZXcgd29yZHMgb24gaG93IHRvCitwcm9ncmFtIGluIGNCUEYgd2lsbCBiZSBsb3N0IGhlcmUuCisKK0xpa2V3aXNlLCB0aGUKKy5CIGJwZl9qaXRfZW5hYmxlCitzd2l0Y2ggY2FuIGJlIGVuYWJsZWQgYXMgbWVudGlvbmVkIGFscmVhZHkuIFRvb2xpbmcgc3VjaCBhcworLkIgYnBmX2ppdF9kaXNhc20KK2lzIGFsc28gaW5kZXBlbmRlbnQgd2hldGhlciBlQlBGIG9yIGNCUEYgY29kZSBpcyBiZWluZyBsb2FkZWQuCisKK1VubGlrZSBpbiBlQlBGLCBjbGFzc2lmaWVyIGFuZCBhY3Rpb24gYXJlIG5vdCBpbXBsZW1lbnRlZCBpbiByZXN0cmljdGVkIEMsCitidXQgcmF0aGVyIGluIGEgbWluaW1hbCBhc3NlbWJsZXItbGlrZSBsYW5ndWFnZSBvciB3aXRoIHRoZSBoZWxwIG9mIG90aGVyCit0b29saW5nLgorCitUaGUgcmF3IGludGVyZmFjZSB3aXRoIHRjIHRha2VzIG9wY29kZXMgZGlyZWN0bHkuIEZvciBleGFtcGxlLCB0aGUgbW9zdAorbWluaW1hbCBjbGFzc2lmaWVyIG1hdGNoaW5nIG9uIGV2ZXJ5IHBhY2tldCByZXN1bHRpbmcgaW4gdGhlIGRlZmF1bHQKK2NsYXNzaWQgb2YgMToxIGxvb2tzIGxpa2U6CisKKy5pbiArNG4KKy5CIHRjIGZpbHRlciBhZGQgZGV2IGVtMSBwYXJlbnQgMTogYnBmIGJ5dGVjb2RlICcxLDYgMCAwIDQyOTQ5NjcyOTUsJyBmbG93aWQgMToxCisuaW4KKworVGhlIGZpcnN0IGRlY2ltYWwgb2YgdGhlIGJ5dGVjb2RlIHNlcXVlbmNlIGRlbm90ZXMgdGhlIG51bWJlciBvZiBzdWJzZXF1ZW50Cis0LXR1cGxlcyBvZiBjQlBGIG9wY29kZXMuIEFzIG1lbnRpb25lZCwgc3VjaCBhIDQtdHVwbGUgY29uc2lzdHMgb2YKKy5CIGMgdCBmIGsKK2RlY2ltYWxzLCB3aGVyZQorLkIgYworcmVwcmVzZW50cyB0aGUgY0JQRiBvcGNvZGUsCisuQiB0Cit0aGUganVtcCB0cnVlIG9mZnNldCB0YXJnZXQsCisuQiBmCit0aGUganVtcCBmYWxzZSBvZmZzZXQgdGFyZ2V0IGFuZAorLkIgawordGhlIGltbWVkaWF0ZSBjb25zdGFudC9saXRlcmFsLiBIZXJlLCB0aGlzIGRlbm90ZXMgYW4gdW5jb25kaXRpb25hbCByZXR1cm4KK2Zyb20gdGhlIHByb2dyYW0gd2l0aCBpbW1lZGlhdGUgdmFsdWUgb2YgLTEuCisKK1RodXMsIGZvciBlZ3Jlc3MgY2xhc3NpZmljYXRpb24sIFdpbGxlbSBkZSBCcnVpam4gaW1wbGVtZW50ZWQgYSBtaW5pbWFsIHN0YW5kLWFsb25lCitoZWxwZXIgdG9vbCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGZvcgorLkIgaXB0YWJsZXMoOCkKK0JQRiBleHRlbnNpb24sIHdoaWNoIGFidXNlcyB0aGUKKy5CIGxpYnBjYXAKK2ludGVybmFsIGNsYXNzaWMgQlBGIGNvbXBpbGVyLCBoaXMgY29kZSBkZXJpdmVkIGhlcmUgZm9yIHVzYWdlIHdpdGgKKy5CIHRjKDgpCis6CisKKy5pbiArNG4KKy5uZgorLnNwCisjaW5jbHVkZSA8cGNhcC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICAgICAgc3RydWN0IGJwZl9wcm9ncmFtIHByb2c7CisgICAgICAgIHN0cnVjdCBicGZfaW5zbiAqaW5zOworICAgICAgICBpbnQgaSwgcmV0LCBkbHQgPSBETFRfUkFXOworCisgICAgICAgIGlmIChhcmdjIDwgMiB8fCBhcmdjID4gMykKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgaWYgKGFyZ2MgPT0gMykgeworICAgICAgICAgICAgICAgIGRsdCA9IHBjYXBfZGF0YWxpbmtfbmFtZV90b192YWwoYXJndlsxXSk7CisgICAgICAgICAgICAgICAgaWYgKGRsdCA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gcGNhcF9jb21waWxlX25vcGNhcCgtMSwgZGx0LCAmcHJvZywgYXJndlthcmdjIC0gMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgUENBUF9ORVRNQVNLX1VOS05PV04pOworICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgIHByaW50ZigiJWQsIiwgcHJvZy5iZl9sZW4pOworICAgICAgICBpbnMgPSBwcm9nLmJmX2luc25zOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcm9nLmJmX2xlbiAtIDE7ICsraW5zLCArK2kpCisgICAgICAgICAgICAgICAgcHJpbnRmKCIldSAldSAldSAldSwiLCBpbnMtPmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgIGlucy0+anQsIGlucy0+amYsIGlucy0+ayk7CisgICAgICAgIHByaW50ZigiJXUgJXUgJXUgJXUiLAorICAgICAgICAgICAgICAgaW5zLT5jb2RlLCBpbnMtPmp0LCBpbnMtPmpmLCBpbnMtPmspOworCisgICAgICAgIHBjYXBfZnJlZWNvZGUoJnByb2cpOworICAgICAgICByZXR1cm4gMDsKK30KKy5maQorLmluCisKK0dpdmVuIHRoaXMgc21hbGwgaGVscGVyLCBhbnkKKy5CIHRjcGR1bXAoOCkKK2ZpbHRlciBleHByZXNzaW9uIGNhbiBiZSBhYnVzZWQgYXMgYSBjbGFzc2lmaWVyIHdoZXJlIGEgbWF0Y2ggd2lsbAorcmVzdWx0IGluIHRoZSBkZWZhdWx0IGNsYXNzaWQ6CisKKy5pbiArNG4KKy5CIGJwZnRvb2wgRU4xME1CICd0Y3BbdGNwZmxhZ3NdICYgdGNwLXN5biAhPSAwJyA+IC92YXIvYnBmL3RjcC1zeW4KKy5icgorLkIgdGMgZmlsdGVyIGFkZCBkZXYgZW0xIHBhcmVudCAxOiBicGYgYnl0ZWNvZGUtZmlsZSAvdmFyL2JwZi90Y3Atc3luIGZsb3dpZCAxOjEKKy5pbgorCitCYXNpY2FsbHksIHN1Y2ggYSBtaW5pbWFsIGdlbmVyYXRvciBpcyBlcXVpdmFsZW50IHRvOgorCisuaW4gKzRuCisuQiB0Y3BkdW1wIC1pZW0xIC1kZGQgJ3RjcFt0Y3BmbGFnc10gJiB0Y3Atc3luICE9IDAnIHwgdHIgJ1xcXFxuJyAnLCcgPiAvdmFyL2JwZi90Y3Atc3luCisuaW4KKworU2luY2UKKy5CIGxpYnBjYXAKK2RvZXMgbm90IHN1cHBvcnQgYWxsIExpbnV4JyBzcGVjaWZpYyBjQlBGIGV4dGVuc2lvbnMgaW4gaXRzIGNvbXBpbGVyLCB0aGUKK0xpbnV4IGtlcm5lbCBhbHNvIHNoaXBzIHVuZGVyCisuQiB0b29scy9uZXQvCithIG1pbmltYWwgQlBGIGFzc2VtYmxlciBjYWxsZWQKKy5CIGJwZl9hc20KK2ZvciBwcm92aWRpbmcgZnVsbCBjb250cm9sLiBGb3IgZGV0YWlsZWQgc3ludGF4IGFuZCBzZW1hbnRpY3Mgb24gaW1wbGVtZW50aW5nCitzdWNoIHByb2dyYW1zIGJ5IGhhbmQsIHNlZSByZWZlcmVuY2VzIHVuZGVyCisuQiBGVVJUSEVSIFJFQURJTkcKK1wmLgorCitUcml2aWFsIHRveSBleGFtcGxlIGluCisuQiBicGZfYXNtCitmb3IgY2xhc3NpZnlpbmcgSVB2NC9UQ1AgcGFja2V0cywgc2F2ZWQgaW4gYSB0ZXh0IGZpbGUgY2FsbGVkCisuQiBmb29iYXIKKzoKKworLmluICs0bgorLm5mCisuc3AKK2xkaCBbMTJdCitqbmUgIzB4ODAwLCBkcm9wCitsZGIgWzIzXQoram5lcSAjNiwgZHJvcAorcmV0ICMtMQorZHJvcDogcmV0ICMwCisuZmkKKy5pbgorCitTaW1pbGFybHksIHN1Y2ggYSBjbGFzc2lmaWVyIGNhbiBiZSBsb2FkZWQgYXM6CisKKy5pbiArNG4KKy5CIGJwZl9hc20gZm9vYmFyID4gL3Zhci9icGYvdGNwLXN5bgorLmJyCisuQiB0YyBmaWx0ZXIgYWRkIGRldiBlbTEgcGFyZW50IDE6IGJwZiBieXRlY29kZS1maWxlIC92YXIvYnBmL3RjcC1zeW4gZmxvd2lkIDE6MQorLmluCisKK0ZvciBCUEYgY2xhc3NpZmllcnMsIHRoZSBMaW51eCBrZXJuZWwgcHJvdmlkZXMgYWRkaXRpb25hbGx5IHVuZGVyCisuQiB0b29scy9uZXQvCithIHNtYWxsIEJQRiBkZWJ1Z2dlciBjYWxsZWQKKy5CIGJwZl9kYmcKKywgd2hpY2ggY2FuIGJlIHVzZWQgdG8gdGVzdCBhIGNsYXNzaWZpZXIgYWdhaW5zdCBwY2FwIGZpbGVzLCBzaW5nbGUtc3RlcAorb3IgYWRkIHZhcmlvdXMgYnJlYWtwb2ludHMgaW50byB0aGUgY2xhc3NpZmllciBwcm9ncmFtIGFuZCBkdW1wIHJlZ2lzdGVyCitjb250ZW50cyBkdXJpbmcgcnVudGltZS4KKworSW1wbGVtZW50aW5nIGFuIGFjdGlvbiBpbiBjbGFzc2ljIEJQRiBpcyByYXRoZXIgbGltaXRlZCBpbiB0aGUgc2Vuc2UgdGhhdAorcGFja2V0IG1hbmdsaW5nIGlzIG5vdCBzdXBwb3J0ZWQuIFRoZXJlZm9yZSwgaXQncyBnZW5lcmFsbHkgcmVjb21tZW5kZWQgdG8KK21ha2UgdGhlIHN3aXRjaCB0byBlQlBGLCB3aGVuZXZlciBwb3NzaWJsZS4KKworLlNIIEZVUlRIRVIgUkVBRElORworRnVydGhlciBhbmQgbW9yZSB0ZWNobmljYWwgZGV0YWlscyBhYm91dCB0aGUgQlBGIGFyY2hpdGVjdHVyZSBjYW4gYmUgZm91bmQKK2luIHRoZSBMaW51eCBrZXJuZWwgc291cmNlIHRyZWUgdW5kZXIKKy5CIERvY3VtZW50YXRpb24vbmV0d29ya2luZy9maWx0ZXIudHh0CitcJi4KKworRnVydGhlciBkZXRhaWxzIG9uIGVCUEYKKy5CIHRjKDgpCitleGFtcGxlcyBjYW4gYmUgZm91bmQgaW4gdGhlIGlwcm91dGUyIHNvdXJjZQordHJlZSB1bmRlcgorLkIgZXhhbXBsZXMvYnBmLworXCYuCisKKy5TSCBTRUUgQUxTTworLkJSIHRjICg4KSwKKy5CUiB0Yy1lbWF0Y2ggKDgpCisuQlIgYnBmICgyKQorLkJSIGJwZiAoNCkKKworLlNIIEFVVEhPUlMKK01hbnBhZ2Ugd3JpdHRlbiBieSBEYW5pZWwgQm9ya21hbm4uCisKK1BsZWFzZSByZXBvcnQgY29ycmVjdGlvbnMgb3IgaW1wcm92ZW1lbnRzIHRvIHRoZSBMaW51eCBrZXJuZWwgbmV0d29ya2luZworbWFpbGluZyBsaXN0OgorLkIgPG5ldGRldkB2Z2VyLmtlcm5lbC5vcmc+CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9tYW4vbWFuOC90Yy1jYnEtZGV0YWlscy44IGIvaXByb3V0ZTIvbWFuL21hbjgvdGMtY2JxLWRldGFpbHMuOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzY4MTAzCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbWFuL21hbjgvdGMtY2JxLWRldGFpbHMuOApAQCAtMCwwICsxLDQyMyBAQAorLlRIIENCUSA4ICI4IERlY2VtYmVyIDIwMDEiICJpcHJvdXRlMiIgIkxpbnV4IgorLlNIIE5BTUUKK0NCUSBcLSBDbGFzcyBCYXNlZCBRdWV1ZWluZworLlNIIFNZTk9QU0lTCisuQiB0YyBxZGlzYyAuLi4gZGV2CitkZXYKKy5CICAoIHBhcmVudAorY2xhc3NpZAorLkIgfCByb290KSBbIGhhbmRsZQorbWFqb3I6CisuQiBdIGNicSBhdnBrdAorYnl0ZXMKKy5CIGJhbmR3aWR0aAorcmF0ZQorLkIgWyBjZWxsCitieXRlcworLkIgXSBbIGV3bWEKK2xvZworLkIgXSBbIG1wdQorYnl0ZXMKKy5CIF0KKworLkIgdGMgY2xhc3MgLi4uIGRldgorZGV2CisuQiBwYXJlbnQKK21ham9yOlttaW5vcl0KKy5CIFsgY2xhc3NpZAorbWFqb3I6bWlub3IKKy5CIF0gY2JxIGFsbG90CitieXRlcworLkIgWyBiYW5kd2lkdGgKK3JhdGUKKy5CIF0gWyByYXRlCityYXRlCisuQiBdIHByaW8KK3ByaW9yaXR5CisuQiBbIHdlaWdodAord2VpZ2h0CisuQiBdIFsgbWluYnVyc3QKK3BhY2tldHMKKy5CIF0gWyBtYXhidXJzdAorcGFja2V0cworLkIgXSBbIGV3bWEKK2xvZworLkIgXSBbIGNlbGwKK2J5dGVzCisuQiBdIGF2cGt0CitieXRlcworLkIgWyBtcHUKK2J5dGVzCisuQiBdIFsgYm91bmRlZCBpc29sYXRlZCBdIFsgc3BsaXQKK2hhbmRsZQorLkIgJiBkZWZtYXAKK2RlZm1hcAorLkIgXSBbIGVzdGltYXRvcgoraW50ZXJ2YWwgdGltZWNvbnN0YW50CisuQiBdCisKKy5TSCBERVNDUklQVElPTgorQ2xhc3MgQmFzZWQgUXVldWVpbmcgaXMgYSBjbGFzc2Z1bCBxZGlzYyB0aGF0IGltcGxlbWVudHMgYSByaWNoCitsaW5rc2hhcmluZyBoaWVyYXJjaHkgb2YgY2xhc3Nlcy4gSXQgY29udGFpbnMgc2hhcGluZyBlbGVtZW50cyBhcword2VsbCBhcyBwcmlvcml0aXppbmcgY2FwYWJpbGl0aWVzLiBTaGFwaW5nIGlzIHBlcmZvcm1lZCB1c2luZyBsaW5rCitpZGxlIHRpbWUgY2FsY3VsYXRpb25zIGJhc2VkIG9uIHRoZSB0aW1pbmcgb2YgZGVxdWV1ZSBldmVudHMgYW5kCit1bmRlcmx5aW5nIGxpbmsgYmFuZHdpZHRoLgorCisuU0ggU0hBUElORyBBTEdPUklUSE0KK1NoYXBpbmcgaXMgZG9uZSB1c2luZyBsaW5rIGlkbGUgdGltZSBjYWxjdWxhdGlvbnMsIGFuZCBhY3Rpb25zIHRha2VuIGlmCit0aGVzZSBjYWxjdWxhdGlvbnMgZGV2aWF0ZSBmcm9tIHNldCBsaW1pdHMuCisKK1doZW4gc2hhcGluZyBhIDEwbWJpdC9zIGNvbm5lY3Rpb24gdG8gMW1iaXQvcywgdGhlIGxpbmsgd2lsbAorYmUgaWRsZSA5MCUgb2YgdGhlIHRpbWUuIElmIGl0IGlzbid0LCBpdCBuZWVkcyB0byBiZSB0aHJvdHRsZWQgc28gdGhhdCBpdAorSVMgaWRsZSA5MCUgb2YgdGhlIHRpbWUuCisKK0Zyb20gdGhlIGtlcm5lbCdzIHBlcnNwZWN0aXZlLCB0aGlzIGlzIGhhcmQgdG8gbWVhc3VyZSwgc28gQ0JRIGluc3RlYWQKK2Rlcml2ZXMgdGhlIGlkbGUgdGltZSBmcm9tIHRoZSBudW1iZXIgb2YgbWljcm9zZWNvbmRzIChpbiBmYWN0LCBqaWZmaWVzKQordGhhdCBlbGFwc2UgYmV0d2VlbiAgcmVxdWVzdHMgZnJvbSB0aGUgZGV2aWNlIGRyaXZlciBmb3IgbW9yZSBkYXRhLiBDb21iaW5lZAord2l0aCB0aGUgIGtub3dsZWRnZSBvZiBwYWNrZXQgc2l6ZXMsIHRoaXMgaXMgdXNlZCB0byBhcHByb3hpbWF0ZSBob3cgZnVsbCBvcgorZW1wdHkgdGhlIGxpbmsgaXMuCisKK1RoaXMgaXMgcmF0aGVyIGNpcmN1bXNwZWN0IGFuZCBkb2Vzbid0IGFsd2F5cyBhcnJpdmUgYXQgcHJvcGVyCityZXN1bHRzLiBGb3IgZXhhbXBsZSwgd2hhdCBpcyB0aGUgYWN0dWFsIGxpbmsgc3BlZWQgb2YgYW4gaW50ZXJmYWNlCit0aGF0IGlzIG5vdCByZWFsbHkgYWJsZSB0byB0cmFuc21pdCB0aGUgZnVsbCAxMDBtYml0L3Mgb2YgZGF0YSwKK3BlcmhhcHMgYmVjYXVzZSBvZiBhIGJhZGx5IGltcGxlbWVudGVkIGRyaXZlcj8gQSBQQ01DSUEgbmV0d29yayBjYXJkCit3aWxsIGFsc28gbmV2ZXIgYWNoaWV2ZSAxMDBtYml0L3MgYmVjYXVzZSBvZiB0aGUgd2F5IHRoZSBidXMgaXMKK2Rlc2lnbmVkIC0gYWdhaW4sIGhvdyBkbyB3ZSBjYWxjdWxhdGUgdGhlIGlkbGUgdGltZT8KKworVGhlIHBoeXNpY2FsIGxpbmsgYmFuZHdpZHRoIG1heSBiZSBpbGwgZGVmaW5lZCBpbiBjYXNlIG9mIG5vdC1xdWl0ZS1yZWFsCituZXR3b3JrIGRldmljZXMgbGlrZSBQUFAgb3ZlciBFdGhlcm5ldCBvciBQUFRQIG92ZXIgVENQL0lQLiBUaGUgZWZmZWN0aXZlCitiYW5kd2lkdGggaW4gdGhhdCBjYXNlIGlzIHByb2JhYmx5IGRldGVybWluZWQgYnkgdGhlIGVmZmljaWVuY3kgb2YgcGlwZXMKK3RvIHVzZXJzcGFjZSAtIHdoaWNoIG5vdCBkZWZpbmVkLgorCitEdXJpbmcgb3BlcmF0aW9ucywgdGhlIGVmZmVjdGl2ZSBpZGxldGltZSBpcyBtZWFzdXJlZCB1c2luZyBhbgorZXhwb25lbnRpYWwgd2VpZ2h0ZWQgbW92aW5nIGF2ZXJhZ2UgKEVXTUEpLCB3aGljaCBjb25zaWRlcnMgcmVjZW50CitwYWNrZXRzIHRvIGJlIGV4cG9uZW50aWFsbHkgbW9yZSBpbXBvcnRhbnQgdGhhbiBwYXN0IG9uZXMuIFRoZSBVbml4Citsb2FkYXZlcmFnZSBpcyBjYWxjdWxhdGVkIGluIHRoZSBzYW1lIHdheS4KKworVGhlIGNhbGN1bGF0ZWQgaWRsZSB0aW1lIGlzIHN1YnRyYWN0ZWQgZnJvbSB0aGUgRVdNQSBtZWFzdXJlZCBvbmUsCit0aGUgcmVzdWx0aW5nIG51bWJlciBpcyBjYWxsZWQgJ2F2Z2lkbGUnLiBBIHBlcmZlY3RseSBsb2FkZWQgbGluayBoYXMKK2FuIGF2Z2lkbGUgb2YgemVybzogcGFja2V0cyBhcnJpdmUgZXhhY3RseSBhdCB0aGUgY2FsY3VsYXRlZAoraW50ZXJ2YWwuCisKK0FuIG92ZXJsb2FkZWQgbGluayBoYXMgYSBuZWdhdGl2ZSBhdmdpZGxlIGFuZCBpZiBpdCBnZXRzIHRvbyBuZWdhdGl2ZSwKK0NCUSB0aHJvdHRsZXMgYW5kIGlzIHRoZW4gJ292ZXJsaW1pdCcuCisKK0NvbnZlcnNlbHksIGFuIGlkbGUgbGluayBtaWdodCBhbWFzcyBhIGh1Z2UgYXZnaWRsZSwgd2hpY2ggd291bGQgdGhlbgorYWxsb3cgaW5maW5pdGUgYmFuZHdpZHRocyBhZnRlciBhIGZldyBob3VycyBvZiBzaWxlbmNlLiBUbyBwcmV2ZW50Cit0aGlzLCBhdmdpZGxlIGlzIGNhcHBlZCBhdAorLkIgbWF4aWRsZS4KKworSWYgb3ZlcmxpbWl0LCBpbiB0aGVvcnksIHRoZSBDQlEgY291bGQgdGhyb3R0bGUgaXRzZWxmIGZvciBleGFjdGx5IHRoZQorYW1vdW50IG9mIHRpbWUgdGhhdCB3YXMgY2FsY3VsYXRlZCB0byBwYXNzIGJldHdlZW4gcGFja2V0cywgYW5kIHRoZW4KK3Bhc3Mgb25lIHBhY2tldCwgYW5kIHRocm90dGxlIGFnYWluLiBEdWUgdG8gdGltZXIgcmVzb2x1dGlvbiBjb25zdHJhaW50cywKK3RoaXMgbWF5IG5vdCBiZSBmZWFzaWJsZSwgc2VlIHRoZQorLkIgbWluYnVyc3QKK3BhcmFtZXRlciBiZWxvdy4KKworLlNIIENMQVNTSUZJQ0FUSU9OCitXaXRoaW4gdGhlIG9uZSBDQlEgaW5zdGFuY2UgbWFueSBjbGFzc2VzIG1heSBleGlzdC4gRWFjaCBvZiB0aGVzZSBjbGFzc2VzCitjb250YWlucyBhbm90aGVyIHFkaXNjLCBieSBkZWZhdWx0CisuQlIgdGMtcGZpZm8gKDgpLgorCitXaGVuIGVucXVldWVpbmcgYSBwYWNrZXQsIENCUSBzdGFydHMgYXQgdGhlIHJvb3QgYW5kIHVzZXMgdmFyaW91cyBtZXRob2RzIHRvCitkZXRlcm1pbmUgd2hpY2ggY2xhc3Mgc2hvdWxkIHJlY2VpdmUgdGhlIGRhdGEuIElmIGEgdmVyZGljdCBpcyByZWFjaGVkLCB0aGlzCitwcm9jZXNzIGlzIHJlcGVhdGVkIGZvciB0aGUgcmVjaXBpZW50IGNsYXNzIHdoaWNoIG1pZ2h0IGhhdmUgZnVydGhlcgorbWVhbnMgb2YgY2xhc3NpZnlpbmcgdHJhZmZpYyB0byBpdHMgY2hpbGRyZW4sIGlmIGFueS4KKworQ0JRIGhhcyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgYXZhaWxhYmxlIHRvIGNsYXNzaWZ5IGEgcGFja2V0IHRvIGFueSBjaGlsZAorY2xhc3Nlcy4KKy5UUAorKGkpCisuQiBza2ItPnByaW9yaXR5IGNsYXNzIGVuY29kaW5nLgorQ2FuIGJlIHNldCBmcm9tIHVzZXJzcGFjZSBieSBhbiBhcHBsaWNhdGlvbiB3aXRoIHRoZQorLkIgU09fUFJJT1JJVFkKK3NldHNvY2tvcHQuCitUaGUKKy5CIHNrYi0+cHJpb3JpdHkgY2xhc3MgZW5jb2RpbmcKK29ubHkgYXBwbGllcyBpZiB0aGUgc2tiLT5wcmlvcml0eSBob2xkcyBhIG1ham9yOm1pbm9yIGhhbmRsZSBvZiBhbiBleGlzdGluZworY2xhc3Mgd2l0aGluICB0aGlzIHFkaXNjLgorLlRQCisoaWkpCit0YyBmaWx0ZXJzIGF0dGFjaGVkIHRvIHRoZSBjbGFzcy4KKy5UUAorKGlpaSkKK1RoZSBkZWZtYXAgb2YgYSBjbGFzcywgYXMgc2V0IHdpdGggdGhlCisuQiBzcGxpdCAmIGRlZm1hcAorcGFyYW1ldGVycy4gVGhlIGRlZm1hcCBtYXkgY29udGFpbiBpbnN0cnVjdGlvbnMgZm9yIGVhY2ggcG9zc2libGUgTGludXggcGFja2V0Citwcmlvcml0eS4KKworLlAKK0VhY2ggY2xhc3MgYWxzbyBoYXMgYQorLkIgbGV2ZWwuCitMZWFmIG5vZGVzLCBhdHRhY2hlZCB0byB0aGUgYm90dG9tIG9mIHRoZSBjbGFzcyBoaWVyYXJjaHksIGhhdmUgYSBsZXZlbCBvZiAwLgorLlNIIENMQVNTSUZJQ0FUSU9OIEFMR09SSVRITQorCitDbGFzc2lmaWNhdGlvbiBpcyBhIGxvb3AsIHdoaWNoIHRlcm1pbmF0ZXMgd2hlbiBhIGxlYWYgY2xhc3MgaXMgZm91bmQuIEF0IGFueQorcG9pbnQgdGhlIGxvb3AgbWF5IGp1bXAgdG8gdGhlIGZhbGxiYWNrIGFsZ29yaXRobS4KKworVGhlIGxvb3AgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBzdGVwczoKKy5UUAorKGkpCitJZiB0aGUgcGFja2V0IGlzIGdlbmVyYXRlZCBsb2NhbGx5IGFuZCBoYXMgYSB2YWxpZCBjbGFzc2lkIGVuY29kZWQgd2l0aGluIGl0cworLkIgc2tiLT5wcmlvcml0eSwKK2Nob29zZSBpdCBhbmQgdGVybWluYXRlLgorCisuVFAKKyhpaSkKK0NvbnN1bHQgdGhlIHRjIGZpbHRlcnMsIGlmIGFueSwgYXR0YWNoZWQgdG8gdGhpcyBjaGlsZC4gSWYgdGhlc2UgcmV0dXJuCithIGNsYXNzIHdoaWNoIGlzIG5vdCBhIGxlYWYgY2xhc3MsIHJlc3RhcnQgbG9vcCBmcm9tIHRoZSBjbGFzcyByZXR1cm5lZC4KK0lmIGl0IGlzIGEgbGVhZiwgY2hvb3NlIGl0IGFuZCB0ZXJtaW5hdGUuCisuVFAKKyhpaWkpCitJZiB0aGUgdGMgZmlsdGVycyBkaWQgbm90IHJldHVybiBhIGNsYXNzLCBidXQgZGlkIHJldHVybiBhIGNsYXNzaWQsCit0cnkgdG8gZmluZCBhIGNsYXNzIHdpdGggdGhhdCBpZCB3aXRoaW4gdGhpcyBxZGlzYy4KK0NoZWNrIGlmIHRoZSBmb3VuZCBjbGFzcyBpcyBvZiBhIGxvd2VyCisuQiBsZXZlbAordGhhbiB0aGUgY3VycmVudCBjbGFzcy4gSWYgc28sIGFuZCB0aGUgcmV0dXJuZWQgY2xhc3MgaXMgbm90IGEgbGVhZiBub2RlLAorcmVzdGFydCB0aGUgbG9vcCBhdCB0aGUgZm91bmQgY2xhc3MuIElmIGl0IGlzIGEgbGVhZiBub2RlLCB0ZXJtaW5hdGUuCitJZiB3ZSBmb3VuZCBhbiB1cHdhcmQgcmVmZXJlbmNlIHRvIGEgaGlnaGVyIGxldmVsLCBlbnRlciB0aGUgZmFsbGJhY2sKK2FsZ29yaXRobS4KKy5UUAorKGl2KQorSWYgdGhlIHRjIGZpbHRlcnMgZGlkIG5vdCByZXR1cm4gYSBjbGFzcywgbm9yIGEgdmFsaWQgcmVmZXJlbmNlIHRvIG9uZSwKK2NvbnNpZGVyIHRoZSBtaW5vciBudW1iZXIgb2YgdGhlIHJlZmVyZW5jZSB0byBiZSB0aGUgcHJpb3JpdHkuIFJldHJpZXZlCithIGNsYXNzIGZyb20gdGhlIGRlZm1hcCBvZiB0aGlzIGNsYXNzIGZvciB0aGUgcHJpb3JpdHkuIElmIHRoaXMgZGlkIG5vdAorY29udGFpbiBhIGNsYXNzLCBjb25zdWx0IHRoZSBkZWZtYXAgb2YgdGhpcyBjbGFzcyBmb3IgdGhlCisuQiBCRVNUX0VGRk9SVAorY2xhc3MuIElmIHRoaXMgaXMgYW4gdXB3YXJkIHJlZmVyZW5jZSwgb3Igbm8KKy5CIEJFU1RfRUZGT1JUCitjbGFzcyB3YXMgZGVmaW5lZCwKK2VudGVyIHRoZSBmYWxsYmFjayBhbGdvcml0aG0uIElmIGEgdmFsaWQgY2xhc3Mgd2FzIGZvdW5kLCBhbmQgaXQgaXMgbm90IGEKK2xlYWYgbm9kZSwgcmVzdGFydCB0aGUgbG9vcCBhdCB0aGlzIGNsYXNzLiBJZiBpdCBpcyBhIGxlYWYsIGNob29zZSBpdCBhbmQKK3Rlcm1pbmF0ZS4gSWYKK25laXRoZXIgdGhlIHByaW9yaXR5IGRpc3RpbGxlZCBmcm9tIHRoZSBjbGFzc2lkLCBub3IgdGhlCisuQiBCRVNUX0VGRk9SVAorcHJpb3JpdHkgeWllbGRlZCBhIGNsYXNzLCBlbnRlciB0aGUgZmFsbGJhY2sgYWxnb3JpdGhtLgorLlAKK1RoZSBmYWxsYmFjayBhbGdvcml0aG0gcmVzaWRlcyBvdXRzaWRlIG9mIHRoZSBsb29wIGFuZCBpcyBhcyBmb2xsb3dzLgorLlRQCisoaSkKK0NvbnN1bHQgdGhlIGRlZm1hcCBvZiB0aGUgY2xhc3MgYXQgd2hpY2ggdGhlIGp1bXAgdG8gZmFsbGJhY2sgb2NjdXJyZWQuIElmCit0aGUgZGVmbWFwIGNvbnRhaW5zIGEgY2xhc3MgZm9yIHRoZQorLkIKK3ByaW9yaXR5CitvZiB0aGUgY2xhc3MgKHdoaWNoIGlzIHJlbGF0ZWQgdG8gdGhlIFRPUyBmaWVsZCksIGNob29zZSB0aGlzIGNsYXNzIGFuZAordGVybWluYXRlLgorLlRQCisoaWkpCitDb25zdWx0IHRoZSBtYXAgZm9yIGEgY2xhc3MgZm9yIHRoZQorLkIgQkVTVF9FRkZPUlQKK3ByaW9yaXR5LiBJZiBmb3VuZCwgY2hvb3NlIGl0LCBhbmQgdGVybWluYXRlLgorLlRQCisoaWlpKQorQ2hvb3NlIHRoZSBjbGFzcyBhdCB3aGljaCBicmVhayBvdXQgdG8gdGhlIGZhbGxiYWNrIGFsZ29yaXRobSBvY2N1cnJlZC4gVGVybWluYXRlLgorLlAKK1RoZSBwYWNrZXQgaXMgZW5xdWV1ZWQgdG8gdGhlIGNsYXNzIHdoaWNoIHdhcyBjaG9zZW4gd2hlbiBlaXRoZXIgYWxnb3JpdGhtCit0ZXJtaW5hdGVkLiBJdCBpcyB0aGVyZWZvcmUgcG9zc2libGUgZm9yIGEgcGFja2V0IHRvIGJlIGVucXVldWVkICpub3QqIGF0IGEKK2xlYWYgbm9kZSwgYnV0IGluIHRoZSBtaWRkbGUgb2YgdGhlIGhpZXJhcmNoeS4KKworLlNIIExJTksgU0hBUklORyBBTEdPUklUSE0KK1doZW4gZGVxdWV1aW5nIGZvciBzZW5kaW5nIHRvIHRoZSBuZXR3b3JrIGRldmljZSwgQ0JRIGRlY2lkZXMgd2hpY2ggb2YgaXRzCitjbGFzc2VzIHdpbGwgYmUgYWxsb3dlZCB0byBzZW5kLiBJdCBkb2VzIHNvIHdpdGggYSBXZWlnaHRlZCBSb3VuZCBSb2JpbiBwcm9jZXNzCitpbiB3aGljaCBlYWNoIGNsYXNzIHdpdGggcGFja2V0cyBnZXRzIGEgY2hhbmNlIHRvIHNlbmQgaW4gdHVybi4gVGhlIFdSUiBwcm9jZXNzCitzdGFydHMgYnkgYXNraW5nIHRoZSBoaWdoZXN0IHByaW9yaXR5IGNsYXNzZXMgKGxvd2VzdCBudW1lcmljYWxseSAtCitoaWdoZXN0IHNlbWFudGljYWxseSkgZm9yIHBhY2tldHMsIGFuZCB3aWxsIGNvbnRpbnVlIHRvIGRvIHNvIHVudGlsIHRoZXkKK2hhdmUgbm8gbW9yZSBkYXRhIHRvIG9mZmVyLCBpbiB3aGljaCBjYXNlIHRoZSBwcm9jZXNzIHJlcGVhdHMgZm9yIGxvd2VyCitwcmlvcml0aWVzLgorCisuQiBDRVJUQUlOVFkgRU5EUyBIRVJFLCBBTksgUExFQVNFIEhFTFAKKworRWFjaCBjbGFzcyBpcyBub3QgYWxsb3dlZCB0byBzZW5kIGF0IGxlbmd0aCB0aG91Z2ggLSB0aGV5IGNhbiBvbmx5IGRlcXVldWUgYQorY29uZmlndXJhYmxlIGFtb3VudCBvZiBkYXRhIGR1cmluZyBlYWNoIHJvdW5kLgorCitJZiBhIGNsYXNzIGlzIGFib3V0IHRvIGdvIG92ZXJsaW1pdCwgYW5kIGl0IGlzIG5vdAorLkIgYm91bmRlZAoraXQgd2lsbCB0cnkgdG8gYm9ycm93IGF2Z2lkbGUgZnJvbSBzaWJsaW5ncyB0aGF0IGFyZSBub3QKKy5CIGlzb2xhdGVkLgorVGhpcyBwcm9jZXNzIGlzIHJlcGVhdGVkIGZyb20gdGhlIGJvdHRvbSB1cHdhcmRzLiBJZiBhIGNsYXNzIGlzIHVuYWJsZQordG8gYm9ycm93IGVub3VnaCBhdmdpZGxlIHRvIHNlbmQgYSBwYWNrZXQsIGl0IGlzIHRocm90dGxlZCBhbmQgbm90IGFza2VkCitmb3IgYSBwYWNrZXQgZm9yIGVub3VnaCB0aW1lIGZvciB0aGUgYXZnaWRsZSB0byBpbmNyZWFzZSBhYm92ZSB6ZXJvLgorCisuQiBJIFJFQUxMWSBORUVEIEhFTFAgRklHVVJJTkcgVEhJUyBPVVQuIFJFU1QgT0YgRE9DVU1FTlQgSVMgUFJFVFRZIENFUlRBSU4KKy5CIEFHQUlOLgorCisuU0ggUURJU0MKK1RoZSByb290IHFkaXNjIG9mIGEgQ0JRIGNsYXNzIHRyZWUgaGFzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKworLlRQCitwYXJlbnQgbWFqb3I6bWlub3IgfCByb290CitUaGlzIG1hbmRhdG9yeSBwYXJhbWV0ZXIgZGV0ZXJtaW5lcyB0aGUgcGxhY2Ugb2YgdGhlIENCUSBpbnN0YW5jZSwgZWl0aGVyIGF0IHRoZQorLkIgcm9vdAorb2YgYW4gaW50ZXJmYWNlIG9yIHdpdGhpbiBhbiBleGlzdGluZyBjbGFzcy4KKy5UUAoraGFuZGxlIG1ham9yOgorTGlrZSBhbGwgb3RoZXIgcWRpc2NzLCB0aGUgQ0JRIGNhbiBiZSBhc3NpZ25lZCBhIGhhbmRsZS4gU2hvdWxkIGNvbnNpc3Qgb25seQorb2YgYSBtYWpvciBudW1iZXIsIGZvbGxvd2VkIGJ5IGEgY29sb24uIE9wdGlvbmFsLgorLlRQCithdnBrdCBieXRlcworRm9yIGNhbGN1bGF0aW9ucywgdGhlIGF2ZXJhZ2UgcGFja2V0IHNpemUgbXVzdCBiZSBrbm93bi4gSXQgaXMgc2lsZW50bHkgY2FwcGVkCithdCBhIG1pbmltdW0gb2YgMi8zIG9mIHRoZSBpbnRlcmZhY2UgTVRVLiBNYW5kYXRvcnkuCisuVFAKK2JhbmR3aWR0aCByYXRlCitUbyBkZXRlcm1pbmUgdGhlIGlkbGUgdGltZSwgQ0JRIG11c3Qga25vdyB0aGUgYmFuZHdpZHRoIG9mIHlvdXIgdW5kZXJseWluZworcGh5c2ljYWwgaW50ZXJmYWNlLCBvciBwYXJlbnQgcWRpc2MuIFRoaXMgaXMgYSB2aXRhbCBwYXJhbWV0ZXIsIG1vcmUgYWJvdXQgaXQKK2xhdGVyLiBNYW5kYXRvcnkuCisuVFAKK2NlbGwKK1RoZSBjZWxsIHNpemUgZGV0ZXJtaW5lcyBoZSBncmFudWxhcml0eSBvZiBwYWNrZXQgdHJhbnNtaXNzaW9uIHRpbWUgY2FsY3VsYXRpb25zLiBIYXMgYSBzZW5zaWJsZSBkZWZhdWx0LgorLlRQCittcHUKK0EgemVybyBzaXplZCBwYWNrZXQgbWF5IHN0aWxsIHRha2UgdGltZSB0byB0cmFuc21pdC4gVGhpcyB2YWx1ZSBpcyB0aGUgbG93ZXIKK2NhcCBmb3IgcGFja2V0IHRyYW5zbWlzc2lvbiB0aW1lIGNhbGN1bGF0aW9ucyAtIHBhY2tldHMgc21hbGxlciB0aGFuIHRoaXMgdmFsdWUKK2FyZSBzdGlsbCBkZWVtZWQgdG8gaGF2ZSB0aGlzIHNpemUuIERlZmF1bHRzIHRvIHplcm8uCisuVFAKK2V3bWEgbG9nCitXaGVuIENCUSBuZWVkcyB0byBtZWFzdXJlIHRoZSBhdmVyYWdlIGlkbGUgdGltZSwgaXQgZG9lcyBzbyB1c2luZyBhbgorRXhwb25lbnRpYWxseSBXZWlnaHRlZCBNb3ZpbmcgQXZlcmFnZSB3aGljaCBzbW9vdGhzIG91dCBtZWFzdXJlbWVudHMgaW50bworYSBtb3ZpbmcgYXZlcmFnZS4gVGhlIEVXTUEgTE9HIGRldGVybWluZXMgaG93IG11Y2ggc21vb3RoaW5nIG9jY3Vycy4gRGVmYXVsdHMKK3RvIDUuIExvd2VyIHZhbHVlcyBpbXBseSBncmVhdGVyIHNlbnNpdGl2aXR5LiBNdXN0IGJlIGJldHdlZW4gMCBhbmQgMzEuCisuUAorQSBDQlEgcWRpc2MgZG9lcyBub3Qgc2hhcGUgb3V0IG9mIGl0cyBvd24gYWNjb3JkLiBJdCBvbmx5IG5lZWRzIHRvIGtub3cgY2VydGFpbgorcGFyYW1ldGVycyBhYm91dCB0aGUgdW5kZXJseWluZyBsaW5rLiBBY3R1YWwgc2hhcGluZyBpcyBkb25lIGluIGNsYXNzZXMuCisKKy5TSCBDTEFTU0VTCitDbGFzc2VzIGhhdmUgYSBob3N0IG9mIHBhcmFtZXRlcnMgdG8gY29uZmlndXJlIHRoZWlyIG9wZXJhdGlvbi4KKworLlRQCitwYXJlbnQgbWFqb3I6bWlub3IKK1BsYWNlIG9mIHRoaXMgY2xhc3Mgd2l0aGluIHRoZSBoaWVyYXJjaHkuIElmIGF0dGFjaGVkIGRpcmVjdGx5IHRvIGEgcWRpc2MKK2FuZCBub3QgdG8gYW5vdGhlciBjbGFzcywgbWlub3IgY2FuIGJlIG9taXR0ZWQuIE1hbmRhdG9yeS4KKy5UUAorY2xhc3NpZCBtYWpvcjptaW5vcgorTGlrZSBxZGlzY3MsIGNsYXNzZXMgY2FuIGJlIG5hbWVkLiBUaGUgbWFqb3IgbnVtYmVyIG11c3QgYmUgZXF1YWwgdG8gdGhlCittYWpvciBudW1iZXIgb2YgdGhlIHFkaXNjIHRvIHdoaWNoIGl0IGJlbG9uZ3MuIE9wdGlvbmFsLCBidXQgbmVlZGVkIGlmIHRoaXMKK2NsYXNzIGlzIGdvaW5nIHRvIGhhdmUgY2hpbGRyZW4uCisuVFAKK3dlaWdodCB3ZWlnaHQKK1doZW4gZGVxdWV1aW5nIHRvIHRoZSBpbnRlcmZhY2UsIGNsYXNzZXMgYXJlIHRyaWVkIGZvciB0cmFmZmljIGluIGEKK3JvdW5kLXJvYmluIGZhc2hpb24uIENsYXNzZXMgd2l0aCBhIGhpZ2hlciBjb25maWd1cmVkIHFkaXNjIHdpbGwgZ2VuZXJhbGx5CitoYXZlIG1vcmUgdHJhZmZpYyB0byBvZmZlciBkdXJpbmcgZWFjaCByb3VuZCwgc28gaXQgbWFrZXMgc2Vuc2UgdG8gYWxsb3cKK2l0IHRvIGRlcXVldWUgbW9yZSB0cmFmZmljLiBBbGwgd2VpZ2h0cyB1bmRlciBhIGNsYXNzIGFyZSBub3JtYWxpemVkLCBzbworb25seSB0aGUgcmF0aW9zIG1hdHRlci4gRGVmYXVsdHMgdG8gdGhlIGNvbmZpZ3VyZWQgcmF0ZSwgdW5sZXNzIHRoZSBwcmlvcml0eQorb2YgdGhpcyBjbGFzcyBpcyBtYXhpbWFsLCBpbiB3aGljaCBjYXNlIGl0IGlzIHNldCB0byAxLgorLlRQCithbGxvdCBieXRlcworQWxsb3Qgc3BlY2lmaWVzIGhvdyBtYW55IGJ5dGVzIGEgcWRpc2MgY2FuIGRlcXVldWUKK2R1cmluZyBlYWNoIHJvdW5kIG9mIHRoZSBwcm9jZXNzLiBUaGlzIHBhcmFtZXRlciBpcyB3ZWlnaHRlZCB1c2luZyB0aGUKK3Jlbm9ybWFsaXplZCBjbGFzcyB3ZWlnaHQgZGVzY3JpYmVkIGFib3ZlLgorCisuVFAKK3ByaW9yaXR5IHByaW9yaXR5CitJbiB0aGUgcm91bmQtcm9iaW4gcHJvY2VzcywgY2xhc3NlcyB3aXRoIHRoZSBsb3dlc3QgcHJpb3JpdHkgZmllbGQgYXJlIHRyaWVkCitmb3IgcGFja2V0cyBmaXJzdC4gTWFuZGF0b3J5LgorCisuVFAKK3JhdGUgcmF0ZQorTWF4aW11bSByYXRlIHRoaXMgY2xhc3MgYW5kIGFsbCBpdHMgY2hpbGRyZW4gY29tYmluZWQgY2FuIHNlbmQgYXQuIE1hbmRhdG9yeS4KKworLlRQCitiYW5kd2lkdGggcmF0ZQorVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgYmFuZHdpZHRoIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIGEgQ0JRIGRpc2MuIE9ubHkKK3VzZWQgdG8gZGV0ZXJtaW5lIG1heGlkbGUgYW5kIG9mZnRpbWUsIHdoaWNoIGFyZSBvbmx5IGNhbGN1bGF0ZWQgd2hlbgorc3BlY2lmeWluZyBtYXhidXJzdCBvciBtaW5idXJzdC4gTWFuZGF0b3J5IGlmIHNwZWNpZnlpbmcgbWF4YnVyc3Qgb3IgbWluYnVyc3QuCisKKy5UUAorbWF4YnVyc3QKK1RoaXMgbnVtYmVyIG9mIHBhY2tldHMgaXMgdXNlZCB0byBjYWxjdWxhdGUgbWF4aWRsZSBzbyB0aGF0IHdoZW4KK2F2Z2lkbGUgaXMgYXQgbWF4aWRsZSwgdGhpcyBudW1iZXIgb2YgYXZlcmFnZSBwYWNrZXRzIGNhbiBiZSBidXJzdAorYmVmb3JlIGF2Z2lkbGUgZHJvcHMgdG8gMC4gU2V0IGl0IGhpZ2hlciB0byBiZSBtb3JlIHRvbGVyYW50IG9mCitidXJzdHMuIFlvdSBjYW4ndCBzZXQgbWF4aWRsZSBkaXJlY3RseSwgb25seSB2aWEgdGhpcyBwYXJhbWV0ZXIuCisKKy5UUAorbWluYnVyc3QKK0FzIG1lbnRpb25lZCBiZWZvcmUsIENCUSBuZWVkcyB0byB0aHJvdHRsZSBpbiBjYXNlIG9mCitvdmVybGltaXQuIFRoZSBpZGVhbCBzb2x1dGlvbiBpcyB0byBkbyBzbyBmb3IgZXhhY3RseSB0aGUgY2FsY3VsYXRlZAoraWRsZSB0aW1lLCBhbmQgcGFzcyAxIHBhY2tldC4gSG93ZXZlciwgVW5peCBrZXJuZWxzIGdlbmVyYWxseSBoYXZlIGEKK2hhcmQgdGltZSBzY2hlZHVsaW5nIGV2ZW50cyBzaG9ydGVyIHRoYW4gMTBtcywgc28gaXQgaXMgYmV0dGVyIHRvCit0aHJvdHRsZSBmb3IgYSBsb25nZXIgcGVyaW9kLCBhbmQgdGhlbiBwYXNzIG1pbmJ1cnN0IHBhY2tldHMgaW4gb25lCitnbywgYW5kIHRoZW4gc2xlZXAgbWluYnVyc3QgdGltZXMgbG9uZ2VyLgorCitUaGUgdGltZSB0byB3YWl0IGlzIGNhbGxlZCB0aGUgb2ZmdGltZS4gSGlnaGVyIHZhbHVlcyBvZiBtaW5idXJzdCBsZWFkCit0byBtb3JlIGFjY3VyYXRlIHNoYXBpbmcgaW4gdGhlIGxvbmcgdGVybSwgYnV0IHRvIGJpZ2dlciBidXJzdHMgYXQKK21pbGxpc2Vjb25kIHRpbWVzY2FsZXMuCisKKy5UUAorbWluaWRsZQorSWYgYXZnaWRsZSBpcyBiZWxvdyAwLCB3ZSBhcmUgb3ZlcmxpbWl0cyBhbmQgbmVlZCB0byB3YWl0IHVudGlsCithdmdpZGxlIHdpbGwgYmUgYmlnIGVub3VnaCB0byBzZW5kIG9uZSBwYWNrZXQuIFRvIHByZXZlbnQgYSBzdWRkZW4KK2J1cnN0IGZyb20gc2h1dHRpbmcgZG93biB0aGUgbGluayBmb3IgYSBwcm9sb25nZWQgcGVyaW9kIG9mIHRpbWUsCithdmdpZGxlIGlzIHJlc2V0IHRvIG1pbmlkbGUgaWYgaXQgZ2V0cyB0b28gbG93LgorCitNaW5pZGxlIGlzIHNwZWNpZmllZCBpbiBuZWdhdGl2ZSBtaWNyb3NlY29uZHMsIHNvIDEwIG1lYW5zIHRoYXQKK2F2Z2lkbGUgaXMgY2FwcGVkIGF0IC0xMHVzLgorCisuVFAKK2JvdW5kZWQKK1NpZ25pZmllcyB0aGF0IHRoaXMgY2xhc3Mgd2lsbCBub3QgYm9ycm93IGJhbmR3aWR0aCBmcm9tIGl0cyBzaWJsaW5ncy4KKy5UUAoraXNvbGF0ZWQKK01lYW5zIHRoYXQgdGhpcyBjbGFzcyB3aWxsIG5vdCBib3Jyb3cgYmFuZHdpZHRoIHRvIGl0cyBzaWJsaW5ncworCisuVFAKK3NwbGl0IG1ham9yOm1pbm9yICYgZGVmbWFwIGJpdG1hcFsvYml0bWFwXQorSWYgY29uc3VsdGluZyBmaWx0ZXJzIGF0dGFjaGVkIHRvIGEgY2xhc3MgZGlkIG5vdCBnaXZlIGEgdmVyZGljdCwKK0NCUSBjYW4gYWxzbyBjbGFzc2lmeSBiYXNlZCBvbiB0aGUgcGFja2V0J3MgcHJpb3JpdHkuIFRoZXJlIGFyZSAxNgorcHJpb3JpdGllcyBhdmFpbGFibGUsIG51bWJlcmVkIGZyb20gMCB0byAxNS4KKworVGhlIGRlZm1hcCBzcGVjaWZpZXMgd2hpY2ggcHJpb3JpdGllcyB0aGlzIGNsYXNzIHdhbnRzIHRvIHJlY2VpdmUsCitzcGVjaWZpZWQgYXMgYSBiaXRtYXAuIFRoZSBMZWFzdCBTaWduaWZpY2FudCBCaXQgY29ycmVzcG9uZHMgdG8gcHJpb3JpdHkKK3plcm8uIFRoZQorLkIgc3BsaXQKK3BhcmFtZXRlciB0ZWxscyBDQlEgYXQgd2hpY2ggY2xhc3MgdGhlIGRlY2lzaW9uIG11c3QgYmUgbWFkZSwgd2hpY2ggc2hvdWxkCitiZSBhIChncmFuZClwYXJlbnQgb2YgdGhlIGNsYXNzIHlvdSBhcmUgYWRkaW5nLgorCitBcyBhbiBleGFtcGxlLCAndGMgY2xhc3MgYWRkIC4uLiBjbGFzc2lkIDEwOjEgY2JxIC4uIHNwbGl0IDEwOjAgZGVmbWFwIGMwJworY29uZmlndXJlcyBjbGFzcyAxMDowIHRvIHNlbmQgcGFja2V0cyB3aXRoIHByaW9yaXRpZXMgNiBhbmQgNyB0byAxMDoxLgorCitUaGUgY29tcGxpbWVudGFyeSBjb25maWd1cmF0aW9uIHdvdWxkIHRoZW4KK2JlOiAndGMgY2xhc3MgYWRkIC4uLiBjbGFzc2lkIDEwOjIgY2JxIC4uLiBzcGxpdCAxMDowIGRlZm1hcCAzZicKK1doaWNoIHdvdWxkIHNlbmQgYWxsIHBhY2tldHMgMCwgMSwgMiwgMywgNCBhbmQgNSB0byAxMDoxLgorLlRQCitlc3RpbWF0b3IgaW50ZXJ2YWwgdGltZWNvbnN0YW50CitDQlEgY2FuIG1lYXN1cmUgaG93IG11Y2ggYmFuZHdpZHRoIGVhY2ggY2xhc3MgaXMgdXNpbmcsIHdoaWNoIHRjIGZpbHRlcnMKK2NhbiB1c2UgdG8gY2xhc3NpZnkgcGFja2V0cyB3aXRoLiBJbiBvcmRlciB0byBkZXRlcm1pbmUgdGhlIGJhbmR3aWR0aAoraXQgdXNlcyBhIHZlcnkgc2ltcGxlIGVzdGltYXRvciB0aGF0IG1lYXN1cmVzIG9uY2UgZXZlcnkKKy5CIGludGVydmFsCittaWNyb3NlY29uZHMgaG93IG11Y2ggdHJhZmZpYyBoYXMgcGFzc2VkLiBUaGlzIGFnYWluIGlzIGEgRVdNQSwgZm9yIHdoaWNoCit0aGUgdGltZSBjb25zdGFudCBjYW4gYmUgc3BlY2lmaWVkLCBhbHNvIGluIG1pY3Jvc2Vjb25kcy4gVGhlCisuQiB0aW1lIGNvbnN0YW50Citjb3JyZXNwb25kcyB0byB0aGUgc2x1Z2dpc2huZXNzIG9mIHRoZSBtZWFzdXJlbWVudCBvciwgY29udmVyc2VseSwgdG8gdGhlCitzZW5zaXRpdml0eSBvZiB0aGUgYXZlcmFnZSB0byBzaG9ydCBidXJzdHMuIEhpZ2hlciB2YWx1ZXMgbWVhbiBsZXNzCitzZW5zaXRpdml0eS4KKworCisKKy5TSCBTT1VSQ0VTCisuVFAKK28KK1NhbGx5IEZsb3lkIGFuZCBWYW4gSmFjb2Jzb24sICJMaW5rLXNoYXJpbmcgYW5kIFJlc291cmNlCitNYW5hZ2VtZW50IE1vZGVscyBmb3IgUGFja2V0IE5ldHdvcmtzIiwKK0lFRUUvQUNNIFRyYW5zYWN0aW9ucyBvbiBOZXR3b3JraW5nLCBWb2wuMywgTm8uNCwgMTk5NQorCisuVFAKK28KK1NhbGx5IEZsb3lkLCAiTm90ZXMgb24gQ0JRIGFuZCBHdWFyYW50ZWUgU2VydmljZSIsIDE5OTUKKworLlRQCitvCitTYWxseSBGbG95ZCwgIk5vdGVzIG9uIENsYXNzLUJhc2VkIFF1ZXVlaW5nOiBTZXR0aW5nCitQYXJhbWV0ZXJzIiwgMTk5NgorCisuVFAKK28KK1NhbGx5IEZsb3lkIGFuZCBNaWNoYWVsIFNwZWVyLCAiRXhwZXJpbWVudGFsIFJlc3VsdHMKK2ZvciBDbGFzcy1CYXNlZCBRdWV1ZWluZyIsIDE5OTgsIG5vdCBwdWJsaXNoZWQuCisKKworCisuU0ggU0VFIEFMU08KKy5CUiB0YyAoOCkKKworLlNIIEFVVEhPUgorQWxleGV5IE4uIEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1Pi4gVGhpcyBtYW5wYWdlIG1haW50YWluZWQgYnkKK2JlcnQgaHViZXJ0IDxhaHVAZHM5YS5ubD4KZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L3RjLWNicS44IGIvaXByb3V0ZTIvbWFuL21hbjgvdGMtY2JxLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAxMjY1ZAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L3RjLWNicS44CkBAIC0wLDAgKzEsMzUxIEBACisuVEggQ0JRIDggIjE2IERlY2VtYmVyIDIwMDEiICJpcHJvdXRlMiIgIkxpbnV4IgorLlNIIE5BTUUKK0NCUSBcLSBDbGFzcyBCYXNlZCBRdWV1ZWluZworLlNIIFNZTk9QU0lTCisuQiB0YyBxZGlzYyAuLi4gZGV2CitkZXYKKy5CICAoIHBhcmVudAorY2xhc3NpZAorLkIgfCByb290KSBbIGhhbmRsZQorbWFqb3I6CisuQiBdIGNicSBbIGFsbG90CitieXRlcworLkIgXSBhdnBrdAorYnl0ZXMKKy5CIGJhbmR3aWR0aAorcmF0ZQorLkIgWyBjZWxsCitieXRlcworLkIgXSBbIGV3bWEKK2xvZworLkIgXSBbIG1wdQorYnl0ZXMKKy5CIF0KKworLkIgdGMgY2xhc3MgLi4uIGRldgorZGV2CisuQiBwYXJlbnQKK21ham9yOlttaW5vcl0KKy5CIFsgY2xhc3NpZAorbWFqb3I6bWlub3IKKy5CIF0gY2JxIGFsbG90CitieXRlcworLkIgWyBiYW5kd2lkdGgKK3JhdGUKKy5CIF0gWyByYXRlCityYXRlCisuQiBdIHByaW8KK3ByaW9yaXR5CisuQiBbIHdlaWdodAord2VpZ2h0CisuQiBdIFsgbWluYnVyc3QKK3BhY2tldHMKKy5CIF0gWyBtYXhidXJzdAorcGFja2V0cworLkIgXSBbIGV3bWEKK2xvZworLkIgXSBbIGNlbGwKK2J5dGVzCisuQiBdIGF2cGt0CitieXRlcworLkIgWyBtcHUKK2J5dGVzCisuQiBdIFsgYm91bmRlZCBpc29sYXRlZCBdIFsgc3BsaXQKK2hhbmRsZQorLkIgJiBkZWZtYXAKK2RlZm1hcAorLkIgXSBbIGVzdGltYXRvcgoraW50ZXJ2YWwgdGltZWNvbnN0YW50CisuQiBdCisKKy5TSCBERVNDUklQVElPTgorQ2xhc3MgQmFzZWQgUXVldWVpbmcgaXMgYSBjbGFzc2Z1bCBxZGlzYyB0aGF0IGltcGxlbWVudHMgYSByaWNoCitsaW5rc2hhcmluZyBoaWVyYXJjaHkgb2YgY2xhc3Nlcy4gSXQgY29udGFpbnMgc2hhcGluZyBlbGVtZW50cyBhcword2VsbCBhcyBwcmlvcml0aXppbmcgY2FwYWJpbGl0aWVzLiBTaGFwaW5nIGlzIHBlcmZvcm1lZCB1c2luZyBsaW5rCitpZGxlIHRpbWUgY2FsY3VsYXRpb25zIGJhc2VkIG9uIHRoZSB0aW1pbmcgb2YgZGVxdWV1ZSBldmVudHMgYW5kCit1bmRlcmx5aW5nIGxpbmsgYmFuZHdpZHRoLgorCisuU0ggU0hBUElORyBBTEdPUklUSE0KK1doZW4gc2hhcGluZyBhIDEwbWJpdC9zIGNvbm5lY3Rpb24gdG8gMW1iaXQvcywgdGhlIGxpbmsgd2lsbAorYmUgaWRsZSA5MCUgb2YgdGhlIHRpbWUuIElmIGl0IGlzbid0LCBpdCBuZWVkcyB0byBiZSB0aHJvdHRsZWQgc28gdGhhdCBpdAorSVMgaWRsZSA5MCUgb2YgdGhlIHRpbWUuCisKK0R1cmluZyBvcGVyYXRpb25zLCB0aGUgZWZmZWN0aXZlIGlkbGV0aW1lIGlzIG1lYXN1cmVkIHVzaW5nIGFuCitleHBvbmVudGlhbCB3ZWlnaHRlZCBtb3ZpbmcgYXZlcmFnZSAoRVdNQSksIHdoaWNoIGNvbnNpZGVycyByZWNlbnQKK3BhY2tldHMgdG8gYmUgZXhwb25lbnRpYWxseSBtb3JlIGltcG9ydGFudCB0aGFuIHBhc3Qgb25lcy4gVGhlIFVuaXgKK2xvYWRhdmVyYWdlIGlzIGNhbGN1bGF0ZWQgaW4gdGhlIHNhbWUgd2F5LgorCitUaGUgY2FsY3VsYXRlZCBpZGxlIHRpbWUgaXMgc3VidHJhY3RlZCBmcm9tIHRoZSBFV01BIG1lYXN1cmVkIG9uZSwKK3RoZSByZXN1bHRpbmcgbnVtYmVyIGlzIGNhbGxlZCAnYXZnaWRsZScuIEEgcGVyZmVjdGx5IGxvYWRlZCBsaW5rIGhhcworYW4gYXZnaWRsZSBvZiB6ZXJvOiBwYWNrZXRzIGFycml2ZSBleGFjdGx5IGF0IHRoZSBjYWxjdWxhdGVkCitpbnRlcnZhbC4KKworQW4gb3ZlcmxvYWRlZCBsaW5rIGhhcyBhIG5lZ2F0aXZlIGF2Z2lkbGUgYW5kIGlmIGl0IGdldHMgdG9vIG5lZ2F0aXZlLAorQ0JRIHRocm90dGxlcyBhbmQgaXMgdGhlbiAnb3ZlcmxpbWl0Jy4KKworQ29udmVyc2VseSwgYW4gaWRsZSBsaW5rIG1pZ2h0IGFtYXNzIGEgaHVnZSBhdmdpZGxlLCB3aGljaCB3b3VsZCB0aGVuCithbGxvdyBpbmZpbml0ZSBiYW5kd2lkdGhzIGFmdGVyIGEgZmV3IGhvdXJzIG9mIHNpbGVuY2UuIFRvIHByZXZlbnQKK3RoaXMsIGF2Z2lkbGUgaXMgY2FwcGVkIGF0CisuQiBtYXhpZGxlLgorCitJZiBvdmVybGltaXQsIGluIHRoZW9yeSwgdGhlIENCUSBjb3VsZCB0aHJvdHRsZSBpdHNlbGYgZm9yIGV4YWN0bHkgdGhlCithbW91bnQgb2YgdGltZSB0aGF0IHdhcyBjYWxjdWxhdGVkIHRvIHBhc3MgYmV0d2VlbiBwYWNrZXRzLCBhbmQgdGhlbgorcGFzcyBvbmUgcGFja2V0LCBhbmQgdGhyb3R0bGUgYWdhaW4uIER1ZSB0byB0aW1lciByZXNvbHV0aW9uIGNvbnN0cmFpbnRzLAordGhpcyBtYXkgbm90IGJlIGZlYXNpYmxlLCBzZWUgdGhlCisuQiBtaW5idXJzdAorcGFyYW1ldGVyIGJlbG93LgorCisuU0ggQ0xBU1NJRklDQVRJT04KK1dpdGhpbiB0aGUgb25lIENCUSBpbnN0YW5jZSBtYW55IGNsYXNzZXMgbWF5IGV4aXN0LiBFYWNoIG9mIHRoZXNlIGNsYXNzZXMKK2NvbnRhaW5zIGFub3RoZXIgcWRpc2MsIGJ5IGRlZmF1bHQKKy5CUiB0Yy1wZmlmbyAoOCkuCisKK1doZW4gZW5xdWV1ZWluZyBhIHBhY2tldCwgQ0JRIHN0YXJ0cyBhdCB0aGUgcm9vdCBhbmQgdXNlcyB2YXJpb3VzIG1ldGhvZHMgdG8KK2RldGVybWluZSB3aGljaCBjbGFzcyBzaG91bGQgcmVjZWl2ZSB0aGUgZGF0YS4KKworSW4gdGhlIGFic2VuY2Ugb2YgdW5jb21tb24gY29uZmlndXJhdGlvbiBvcHRpb25zLCB0aGUgcHJvY2VzcyBpcyByYXRoZXIgZWFzeS4KK0F0IGVhY2ggbm9kZSB3ZSBsb29rIGZvciBhbiBpbnN0cnVjdGlvbiwgYW5kIHRoZW4gZ28gdG8gdGhlIGNsYXNzIHRoZQoraW5zdHJ1Y3Rpb24gcmVmZXJzIHVzIHRvLiBJZiB0aGUgY2xhc3MgZm91bmQgaXMgYSBiYXJyZW4gbGVhZi1ub2RlICh3aXRob3V0CitjaGlsZHJlbiksIHdlIGVucXVldWUgdGhlIHBhY2tldCB0aGVyZS4gSWYgaXQgaXMgbm90IHlldCBhIGxlYWYgbm9kZSwgd2UgZG8KK3RoZSB3aG9sZSB0aGluZyBvdmVyIGFnYWluIHN0YXJ0aW5nIGZyb20gdGhhdCBub2RlLgorCitUaGUgZm9sbG93aW5nIGFjdGlvbnMgYXJlIHBlcmZvcm1lZCwgaW4gb3JkZXIgYXQgZWFjaCBub2RlIHdlIHZpc2l0LCB1bnRpbCBvbmUKK3NlbmRzIHVzIHRvIGFub3RoZXIgbm9kZSwgb3IgdGVybWluYXRlcyB0aGUgcHJvY2Vzcy4KKy5UUAorKGkpCitDb25zdWx0IGZpbHRlcnMgYXR0YWNoZWQgdG8gdGhlIGNsYXNzLiBJZiBzZW50IHRvIGEgbGVhZm5vZGUsIHdlIGFyZSBkb25lLgorT3RoZXJ3aXNlLCByZXN0YXJ0LgorLlRQCisoaWkpCitDb25zdWx0IHRoZSBkZWZtYXAgZm9yIHRoZSBwcmlvcml0eSBhc3NpZ25lZCB0byB0aGlzIHBhY2tldCwgd2hpY2ggZGVwZW5kcworb24gdGhlIFRPUyBiaXRzLiBDaGVjayBpZiB0aGUgcmVmZXJyYWwgaXMgbGVhZmxlc3MsIG90aGVyd2lzZSByZXN0YXJ0LgorLlRQCisoaWlpKQorQXNrIHRoZSBkZWZtYXAgZm9yIGluc3RydWN0aW9ucyBmb3IgdGhlICdiZXN0IGVmZm9ydCcgcHJpb3JpdHkuIENoZWNrIHRoZQorYW5zd2VyIGZvciBsZWFmbmVzcywgb3RoZXJ3aXNlIHJlc3RhcnQuCisuVFAKKyhpdikKK0lmIG5vbmUgb2YgdGhlIGFib3ZlIHJldHVybmVkIHdpdGggYW4gaW5zdHJ1Y3Rpb24sIGVucXVldWUgYXQgdGhpcyBub2RlLgorLlAKK1RoaXMgYWxnb3JpdGhtIG1ha2VzIHN1cmUgdGhhdCBhIHBhY2tldCBhbHdheXMgZW5kcyB1cCBzb21ld2hlcmUsIGV2ZW4gd2hpbGUKK3lvdSBhcmUgYnVzeSBidWlsZGluZyB5b3VyIGNvbmZpZ3VyYXRpb24uCisKK0ZvciBtb3JlIGRldGFpbHMsIHNlZQorLkJSIHRjLWNicS1kZXRhaWxzKDgpLgorCisuU0ggTElOSyBTSEFSSU5HIEFMR09SSVRITQorV2hlbiBkZXF1ZXVpbmcgZm9yIHNlbmRpbmcgdG8gdGhlIG5ldHdvcmsgZGV2aWNlLCBDQlEgZGVjaWRlcyB3aGljaCBvZiBpdHMKK2NsYXNzZXMgd2lsbCBiZSBhbGxvd2VkIHRvIHNlbmQuIEl0IGRvZXMgc28gd2l0aCBhIFdlaWdodGVkIFJvdW5kIFJvYmluIHByb2Nlc3MKK2luIHdoaWNoIGVhY2ggY2xhc3Mgd2l0aCBwYWNrZXRzIGdldHMgYSBjaGFuY2UgdG8gc2VuZCBpbiB0dXJuLiBUaGUgV1JSIHByb2Nlc3MKK3N0YXJ0cyBieSBhc2tpbmcgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgY2xhc3NlcyAobG93ZXN0IG51bWVyaWNhbGx5IC0KK2hpZ2hlc3Qgc2VtYW50aWNhbGx5KSBmb3IgcGFja2V0cywgYW5kIHdpbGwgY29udGludWUgdG8gZG8gc28gdW50aWwgdGhleQoraGF2ZSBubyBtb3JlIGRhdGEgdG8gb2ZmZXIsIGluIHdoaWNoIGNhc2UgdGhlIHByb2Nlc3MgcmVwZWF0cyBmb3IgbG93ZXIKK3ByaW9yaXRpZXMuCisKK0NsYXNzZXMgYnkgZGVmYXVsdCBib3Jyb3cgYmFuZHdpZHRoIGZyb20gdGhlaXIgc2libGluZ3MuIEEgY2xhc3MgY2FuIGJlCitwcmV2ZW50ZWQgZnJvbSBkb2luZyBzbyBieSBkZWNsYXJpbmcgaXQgJ2JvdW5kZWQnLiBBIGNsYXNzIGNhbiBhbHNvIGluZGljYXRlCitpdHMgdW53aWxsaW5nbmVzcyB0byBsZW5kIG91dCBiYW5kd2lkdGggYnkgYmVpbmcgJ2lzb2xhdGVkJy4KKworLlNIIFFESVNDCitUaGUgcm9vdCBvZiBhIENCUSBxZGlzYyBjbGFzcyB0cmVlIGhhcyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisKKy5UUAorcGFyZW50IG1ham9yOm1pbm9yIHwgcm9vdAorVGhpcyBtYW5kYXRvcnkgcGFyYW1ldGVyIGRldGVybWluZXMgdGhlIHBsYWNlIG9mIHRoZSBDQlEgaW5zdGFuY2UsIGVpdGhlciBhdCB0aGUKKy5CIHJvb3QKK29mIGFuIGludGVyZmFjZSBvciB3aXRoaW4gYW4gZXhpc3RpbmcgY2xhc3MuCisuVFAKK2hhbmRsZSBtYWpvcjoKK0xpa2UgYWxsIG90aGVyIHFkaXNjcywgdGhlIENCUSBjYW4gYmUgYXNzaWduZWQgYSBoYW5kbGUuIFNob3VsZCBjb25zaXN0IG9ubHkKK29mIGEgbWFqb3IgbnVtYmVyLCBmb2xsb3dlZCBieSBhIGNvbG9uLiBPcHRpb25hbCwgYnV0IHZlcnkgdXNlZnVsIGlmIGNsYXNzZXMKK3dpbGwgYmUgZ2VuZXJhdGVkIHdpdGhpbiB0aGlzIHFkaXNjLgorLlRQCithbGxvdCBieXRlcworVGhpcyBhbGxvdG1lbnQgaXMgdGhlICdjaHVua2luZXNzJyBvZiBsaW5rIHNoYXJpbmcgYW5kIGlzIHVzZWQgZm9yIGRldGVybWluaW5nIHBhY2tldAordHJhbnNtaXNzaW9uIHRpbWUgdGFibGVzLiBUaGUgcWRpc2MgYWxsb3QgZGlmZmVycyBzbGlnaHRseSBmcm9tIHRoZSBjbGFzcyBhbGxvdCBkaXNjdXNzZWQKK2JlbG93LiBPcHRpb25hbC4gRGVmYXVsdHMgdG8gYSByZWFzb25hYmxlIHZhbHVlLCByZWxhdGVkIHRvIGF2cGt0LgorLlRQCithdnBrdCBieXRlcworVGhlIGF2ZXJhZ2Ugc2l6ZSBvZiBhIHBhY2tldCBpcyBuZWVkZWQgZm9yIGNhbGN1bGF0aW5nIG1heGlkbGUsIGFuZCBpcyBhbHNvIHVzZWQKK2ZvciBtYWtpbmcgc3VyZSAnYWxsb3QnIGhhcyBhIHNhZmUgdmFsdWUuIE1hbmRhdG9yeS4KKy5UUAorYmFuZHdpZHRoIHJhdGUKK1RvIGRldGVybWluZSB0aGUgaWRsZSB0aW1lLCBDQlEgbXVzdCBrbm93IHRoZSBiYW5kd2lkdGggb2YgeW91ciB1bmRlcmx5aW5nCitwaHlzaWNhbCBpbnRlcmZhY2UsIG9yIHBhcmVudCBxZGlzYy4gVGhpcyBpcyBhIHZpdGFsIHBhcmFtZXRlciwgbW9yZSBhYm91dCBpdAorbGF0ZXIuIE1hbmRhdG9yeS4KKy5UUAorY2VsbAorVGhlIGNlbGwgc2l6ZSBkZXRlcm1pbmVzIGhlIGdyYW51bGFyaXR5IG9mIHBhY2tldCB0cmFuc21pc3Npb24gdGltZSBjYWxjdWxhdGlvbnMuIEhhcyBhIHNlbnNpYmxlIGRlZmF1bHQuCisuVFAKK21wdQorQSB6ZXJvIHNpemVkIHBhY2tldCBtYXkgc3RpbGwgdGFrZSB0aW1lIHRvIHRyYW5zbWl0LiBUaGlzIHZhbHVlIGlzIHRoZSBsb3dlcgorY2FwIGZvciBwYWNrZXQgdHJhbnNtaXNzaW9uIHRpbWUgY2FsY3VsYXRpb25zIC0gcGFja2V0cyBzbWFsbGVyIHRoYW4gdGhpcyB2YWx1ZQorYXJlIHN0aWxsIGRlZW1lZCB0byBoYXZlIHRoaXMgc2l6ZS4gRGVmYXVsdHMgdG8gemVyby4KKy5UUAorZXdtYSBsb2cKK1doZW4gQ0JRIG5lZWRzIHRvIG1lYXN1cmUgdGhlIGF2ZXJhZ2UgaWRsZSB0aW1lLCBpdCBkb2VzIHNvIHVzaW5nIGFuCitFeHBvbmVudGlhbGx5IFdlaWdodGVkIE1vdmluZyBBdmVyYWdlIHdoaWNoIHNtb290aHMgb3V0IG1lYXN1cmVtZW50cyBpbnRvCithIG1vdmluZyBhdmVyYWdlLiBUaGUgRVdNQSBMT0cgZGV0ZXJtaW5lcyBob3cgbXVjaCBzbW9vdGhpbmcgb2NjdXJzLiBMb3dlcgordmFsdWVzIGltcGx5IGdyZWF0ZXIgc2Vuc2l0aXZpdHkuIE11c3QgYmUgYmV0d2VlbiAwIGFuZCAzMS4gRGVmYXVsdHMKK3RvIDUuCisuUAorQSBDQlEgcWRpc2MgZG9lcyBub3Qgc2hhcGUgb3V0IG9mIGl0cyBvd24gYWNjb3JkLiBJdCBvbmx5IG5lZWRzIHRvIGtub3cgY2VydGFpbgorcGFyYW1ldGVycyBhYm91dCB0aGUgdW5kZXJseWluZyBsaW5rLiBBY3R1YWwgc2hhcGluZyBpcyBkb25lIGluIGNsYXNzZXMuCisKKy5TSCBDTEFTU0VTCitDbGFzc2VzIGhhdmUgYSBob3N0IG9mIHBhcmFtZXRlcnMgdG8gY29uZmlndXJlIHRoZWlyIG9wZXJhdGlvbi4KKworLlRQCitwYXJlbnQgbWFqb3I6bWlub3IKK1BsYWNlIG9mIHRoaXMgY2xhc3Mgd2l0aGluIHRoZSBoaWVyYXJjaHkuIElmIGF0dGFjaGVkIGRpcmVjdGx5IHRvIGEgcWRpc2MKK2FuZCBub3QgdG8gYW5vdGhlciBjbGFzcywgbWlub3IgY2FuIGJlIG9taXR0ZWQuIE1hbmRhdG9yeS4KKy5UUAorY2xhc3NpZCBtYWpvcjptaW5vcgorTGlrZSBxZGlzY3MsIGNsYXNzZXMgY2FuIGJlIG5hbWVkLiBUaGUgbWFqb3IgbnVtYmVyIG11c3QgYmUgZXF1YWwgdG8gdGhlCittYWpvciBudW1iZXIgb2YgdGhlIHFkaXNjIHRvIHdoaWNoIGl0IGJlbG9uZ3MuIE9wdGlvbmFsLCBidXQgbmVlZGVkIGlmIHRoaXMKK2NsYXNzIGlzIGdvaW5nIHRvIGhhdmUgY2hpbGRyZW4uCisuVFAKK3dlaWdodCB3ZWlnaHQKK1doZW4gZGVxdWV1aW5nIHRvIHRoZSBpbnRlcmZhY2UsIGNsYXNzZXMgYXJlIHRyaWVkIGZvciB0cmFmZmljIGluIGEKK3JvdW5kLXJvYmluIGZhc2hpb24uIENsYXNzZXMgd2l0aCBhIGhpZ2hlciBjb25maWd1cmVkIHFkaXNjIHdpbGwgZ2VuZXJhbGx5CitoYXZlIG1vcmUgdHJhZmZpYyB0byBvZmZlciBkdXJpbmcgZWFjaCByb3VuZCwgc28gaXQgbWFrZXMgc2Vuc2UgdG8gYWxsb3cKK2l0IHRvIGRlcXVldWUgbW9yZSB0cmFmZmljLiBBbGwgd2VpZ2h0cyB1bmRlciBhIGNsYXNzIGFyZSBub3JtYWxpemVkLCBzbworb25seSB0aGUgcmF0aW9zIG1hdHRlci4gRGVmYXVsdHMgdG8gdGhlIGNvbmZpZ3VyZWQgcmF0ZSwgdW5sZXNzIHRoZSBwcmlvcml0eQorb2YgdGhpcyBjbGFzcyBpcyBtYXhpbWFsLCBpbiB3aGljaCBjYXNlIGl0IGlzIHNldCB0byAxLgorLlRQCithbGxvdCBieXRlcworQWxsb3Qgc3BlY2lmaWVzIGhvdyBtYW55IGJ5dGVzIGEgcWRpc2MgY2FuIGRlcXVldWUKK2R1cmluZyBlYWNoIHJvdW5kIG9mIHRoZSBwcm9jZXNzLiBUaGlzIHBhcmFtZXRlciBpcyB3ZWlnaHRlZCB1c2luZyB0aGUKK3Jlbm9ybWFsaXplZCBjbGFzcyB3ZWlnaHQgZGVzY3JpYmVkIGFib3ZlLiBTaWxlbnRseSBjYXBwZWQgYXQgYSBtaW5pbXVtIG9mCiszLzIgYXZwa3QuIE1hbmRhdG9yeS4KKworLlRQCitwcmlvIHByaW9yaXR5CitJbiB0aGUgcm91bmQtcm9iaW4gcHJvY2VzcywgY2xhc3NlcyB3aXRoIHRoZSBsb3dlc3QgcHJpb3JpdHkgZmllbGQgYXJlIHRyaWVkCitmb3IgcGFja2V0cyBmaXJzdC4gTWFuZGF0b3J5LgorCisuVFAKK2F2cGt0CitTZWUgdGhlIFFESVNDIHNlY3Rpb24uCisKKy5UUAorcmF0ZSByYXRlCitNYXhpbXVtIHJhdGUgdGhpcyBjbGFzcyBhbmQgYWxsIGl0cyBjaGlsZHJlbiBjb21iaW5lZCBjYW4gc2VuZCBhdC4gTWFuZGF0b3J5LgorCisuVFAKK2JhbmR3aWR0aCByYXRlCitUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBiYW5kd2lkdGggc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgYSBDQlEgZGlzYyEgT25seQordXNlZCB0byBkZXRlcm1pbmUgbWF4aWRsZSBhbmQgb2ZmdGltZSwgd2hpY2ggYXJlIG9ubHkgY2FsY3VsYXRlZCB3aGVuCitzcGVjaWZ5aW5nIG1heGJ1cnN0IG9yIG1pbmJ1cnN0LiBNYW5kYXRvcnkgaWYgc3BlY2lmeWluZyBtYXhidXJzdCBvciBtaW5idXJzdC4KKworLlRQCittYXhidXJzdAorVGhpcyBudW1iZXIgb2YgcGFja2V0cyBpcyB1c2VkIHRvIGNhbGN1bGF0ZSBtYXhpZGxlIHNvIHRoYXQgd2hlbgorYXZnaWRsZSBpcyBhdCBtYXhpZGxlLCB0aGlzIG51bWJlciBvZiBhdmVyYWdlIHBhY2tldHMgY2FuIGJlIGJ1cnN0CitiZWZvcmUgYXZnaWRsZSBkcm9wcyB0byAwLiBTZXQgaXQgaGlnaGVyIHRvIGJlIG1vcmUgdG9sZXJhbnQgb2YKK2J1cnN0cy4gWW91IGNhbid0IHNldCBtYXhpZGxlIGRpcmVjdGx5LCBvbmx5IHZpYSB0aGlzIHBhcmFtZXRlci4KKworLlRQCittaW5idXJzdAorQXMgbWVudGlvbmVkIGJlZm9yZSwgQ0JRIG5lZWRzIHRvIHRocm90dGxlIGluIGNhc2Ugb2YKK292ZXJsaW1pdC4gVGhlIGlkZWFsIHNvbHV0aW9uIGlzIHRvIGRvIHNvIGZvciBleGFjdGx5IHRoZSBjYWxjdWxhdGVkCitpZGxlIHRpbWUsIGFuZCBwYXNzIDEgcGFja2V0LiBIb3dldmVyLCBVbml4IGtlcm5lbHMgZ2VuZXJhbGx5IGhhdmUgYQoraGFyZCB0aW1lIHNjaGVkdWxpbmcgZXZlbnRzIHNob3J0ZXIgdGhhbiAxMG1zLCBzbyBpdCBpcyBiZXR0ZXIgdG8KK3Rocm90dGxlIGZvciBhIGxvbmdlciBwZXJpb2QsIGFuZCB0aGVuIHBhc3MgbWluYnVyc3QgcGFja2V0cyBpbiBvbmUKK2dvLCBhbmQgdGhlbiBzbGVlcCBtaW5idXJzdCB0aW1lcyBsb25nZXIuCisKK1RoZSB0aW1lIHRvIHdhaXQgaXMgY2FsbGVkIHRoZSBvZmZ0aW1lLiBIaWdoZXIgdmFsdWVzIG9mIG1pbmJ1cnN0IGxlYWQKK3RvIG1vcmUgYWNjdXJhdGUgc2hhcGluZyBpbiB0aGUgbG9uZyB0ZXJtLCBidXQgdG8gYmlnZ2VyIGJ1cnN0cyBhdAorbWlsbGlzZWNvbmQgdGltZXNjYWxlcy4gT3B0aW9uYWwuCisKKy5UUAorbWluaWRsZQorSWYgYXZnaWRsZSBpcyBiZWxvdyAwLCB3ZSBhcmUgb3ZlcmxpbWl0cyBhbmQgbmVlZCB0byB3YWl0IHVudGlsCithdmdpZGxlIHdpbGwgYmUgYmlnIGVub3VnaCB0byBzZW5kIG9uZSBwYWNrZXQuIFRvIHByZXZlbnQgYSBzdWRkZW4KK2J1cnN0IGZyb20gc2h1dHRpbmcgZG93biB0aGUgbGluayBmb3IgYSBwcm9sb25nZWQgcGVyaW9kIG9mIHRpbWUsCithdmdpZGxlIGlzIHJlc2V0IHRvIG1pbmlkbGUgaWYgaXQgZ2V0cyB0b28gbG93LgorCitNaW5pZGxlIGlzIHNwZWNpZmllZCBpbiBuZWdhdGl2ZSBtaWNyb3NlY29uZHMsIHNvIDEwIG1lYW5zIHRoYXQKK2F2Z2lkbGUgaXMgY2FwcGVkIGF0IC0xMHVzLiBPcHRpb25hbC4KKworLlRQCitib3VuZGVkCitTaWduaWZpZXMgdGhhdCB0aGlzIGNsYXNzIHdpbGwgbm90IGJvcnJvdyBiYW5kd2lkdGggZnJvbSBpdHMgc2libGluZ3MuCisuVFAKK2lzb2xhdGVkCitNZWFucyB0aGF0IHRoaXMgY2xhc3Mgd2lsbCBub3QgYm9ycm93IGJhbmR3aWR0aCB0byBpdHMgc2libGluZ3MKKworLlRQCitzcGxpdCBtYWpvcjptaW5vciAmIGRlZm1hcCBiaXRtYXBbL2JpdG1hcF0KK0lmIGNvbnN1bHRpbmcgZmlsdGVycyBhdHRhY2hlZCB0byBhIGNsYXNzIGRpZCBub3QgZ2l2ZSBhIHZlcmRpY3QsCitDQlEgY2FuIGFsc28gY2xhc3NpZnkgYmFzZWQgb24gdGhlIHBhY2tldCdzIHByaW9yaXR5LiBUaGVyZSBhcmUgMTYKK3ByaW9yaXRpZXMgYXZhaWxhYmxlLCBudW1iZXJlZCBmcm9tIDAgdG8gMTUuCisKK1RoZSBkZWZtYXAgc3BlY2lmaWVzIHdoaWNoIHByaW9yaXRpZXMgdGhpcyBjbGFzcyB3YW50cyB0byByZWNlaXZlLAorc3BlY2lmaWVkIGFzIGEgYml0bWFwLiBUaGUgTGVhc3QgU2lnbmlmaWNhbnQgQml0IGNvcnJlc3BvbmRzIHRvIHByaW9yaXR5Cit6ZXJvLiBUaGUKKy5CIHNwbGl0CitwYXJhbWV0ZXIgdGVsbHMgQ0JRIGF0IHdoaWNoIGNsYXNzIHRoZSBkZWNpc2lvbiBtdXN0IGJlIG1hZGUsIHdoaWNoIHNob3VsZAorYmUgYSAoZ3JhbmQpcGFyZW50IG9mIHRoZSBjbGFzcyB5b3UgYXJlIGFkZGluZy4KKworQXMgYW4gZXhhbXBsZSwgJ3RjIGNsYXNzIGFkZCAuLi4gY2xhc3NpZCAxMDoxIGNicSAuLiBzcGxpdCAxMDowIGRlZm1hcCBjMCcKK2NvbmZpZ3VyZXMgY2xhc3MgMTA6MCB0byBzZW5kIHBhY2tldHMgd2l0aCBwcmlvcml0aWVzIDYgYW5kIDcgdG8gMTA6MS4KKworVGhlIGNvbXBsaW1lbnRhcnkgY29uZmlndXJhdGlvbiB3b3VsZCB0aGVuCitiZTogJ3RjIGNsYXNzIGFkZCAuLi4gY2xhc3NpZCAxMDoyIGNicSAuLi4gc3BsaXQgMTA6MCBkZWZtYXAgM2YnCitXaGljaCB3b3VsZCBzZW5kIGFsbCBwYWNrZXRzIDAsIDEsIDIsIDMsIDQgYW5kIDUgdG8gMTA6MS4KKy5UUAorZXN0aW1hdG9yIGludGVydmFsIHRpbWVjb25zdGFudAorQ0JRIGNhbiBtZWFzdXJlIGhvdyBtdWNoIGJhbmR3aWR0aCBlYWNoIGNsYXNzIGlzIHVzaW5nLCB3aGljaCB0YyBmaWx0ZXJzCitjYW4gdXNlIHRvIGNsYXNzaWZ5IHBhY2tldHMgd2l0aC4gSW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHRoZSBiYW5kd2lkdGgKK2l0IHVzZXMgYSB2ZXJ5IHNpbXBsZSBlc3RpbWF0b3IgdGhhdCBtZWFzdXJlcyBvbmNlIGV2ZXJ5CisuQiBpbnRlcnZhbAorbWljcm9zZWNvbmRzIGhvdyBtdWNoIHRyYWZmaWMgaGFzIHBhc3NlZC4gVGhpcyBhZ2FpbiBpcyBhIEVXTUEsIGZvciB3aGljaAordGhlIHRpbWUgY29uc3RhbnQgY2FuIGJlIHNwZWNpZmllZCwgYWxzbyBpbiBtaWNyb3NlY29uZHMuIFRoZQorLkIgdGltZSBjb25zdGFudAorY29ycmVzcG9uZHMgdG8gdGhlIHNsdWdnaXNobmVzcyBvZiB0aGUgbWVhc3VyZW1lbnQgb3IsIGNvbnZlcnNlbHksIHRvIHRoZQorc2Vuc2l0aXZpdHkgb2YgdGhlIGF2ZXJhZ2UgdG8gc2hvcnQgYnVyc3RzLiBIaWdoZXIgdmFsdWVzIG1lYW4gbGVzcworc2Vuc2l0aXZpdHkuCisKKy5TSCBCVUdTCitUaGUgYWN0dWFsIGJhbmR3aWR0aCBvZiB0aGUgdW5kZXJseWluZyBsaW5rIG1heSBub3QgYmUga25vd24sIGZvciBleGFtcGxlCitpbiB0aGUgY2FzZSBvZiBQUG9FIG9yIFBQVFAgY29ubmVjdGlvbnMgd2hpY2ggaW4gZmFjdCBtYXkgc2VuZCBvdmVyIGEKK3BpcGUsIGluc3RlYWQgb2Ygb3ZlciBhIHBoeXNpY2FsIGRldmljZS4gQ0JRIGlzIHF1aXRlIHJlc2lsaWVudCB0byBtYWpvcgorZXJyb3JzIGluIHRoZSBjb25maWd1cmVkIGJhbmR3aWR0aCwgcHJvYmFibHkgYSB0aGUgY29zdCBvZiBjb2Fyc2VyIHNoYXBpbmcuCisKK0RlZmF1bHQga2VybmVscyByZWx5IG9uIGNvYXJzZSB0aW1pbmcgaW5mb3JtYXRpb24gZm9yIG1ha2luZyBkZWNpc2lvbnMuIFRoZXNlCittYXkgbWFrZSBzaGFwaW5nIHByZWNpc2UgaW4gdGhlIGxvbmcgdGVybSwgYnV0IGluYWNjdXJhdGUgb24gc2Vjb25kIGxvbmcgc2NhbGVzLgorCitTZWUKKy5CUiB0Yy1jYnEtZGV0YWlscyg4KQorZm9yIGhpbnRzIG9uIGhvdyB0byBpbXByb3ZlIHRoaXMuCisKKy5TSCBTT1VSQ0VTCisuVFAKK28KK1NhbGx5IEZsb3lkIGFuZCBWYW4gSmFjb2Jzb24sICJMaW5rLXNoYXJpbmcgYW5kIFJlc291cmNlCitNYW5hZ2VtZW50IE1vZGVscyBmb3IgUGFja2V0IE5ldHdvcmtzIiwKK0lFRUUvQUNNIFRyYW5zYWN0aW9ucyBvbiBOZXR3b3JraW5nLCBWb2wuMywgTm8uNCwgMTk5NQorCisuVFAKK28KK1NhbGx5IEZsb3lkLCAiTm90ZXMgb24gQ0JRIGFuZCBHdWFyYW50ZWVkIFNlcnZpY2UiLCAxOTk1CisKKy5UUAorbworU2FsbHkgRmxveWQsICJOb3RlcyBvbiBDbGFzcy1CYXNlZCBRdWV1ZWluZzogU2V0dGluZworUGFyYW1ldGVycyIsIDE5OTYKKworLlRQCitvCitTYWxseSBGbG95ZCBhbmQgTWljaGFlbCBTcGVlciwgIkV4cGVyaW1lbnRhbCBSZXN1bHRzCitmb3IgQ2xhc3MtQmFzZWQgUXVldWVpbmciLCAxOTk4LCBub3QgcHVibGlzaGVkLgorCisKKworLlNIIFNFRSBBTFNPCisuQlIgdGMgKDgpCisKKy5TSCBBVVRIT1IKK0FsZXhleSBOLiBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4uIFRoaXMgbWFucGFnZSBtYWludGFpbmVkIGJ5CitiZXJ0IGh1YmVydCA8YWh1QGRzOWEubmw+CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9tYW4vbWFuOC90Yy1jZ3JvdXAuOCBiL2lwcm91dGUyL21hbi9tYW44L3RjLWNncm91cC44Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZWE3ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9tYW4vbWFuOC90Yy1jZ3JvdXAuOApAQCAtMCwwICsxLDgwIEBACisuVEggIkNncm91cCBjbGFzc2lmaWVyIGluIHRjIiA4ICIgMjEgT2N0IDIwMTUiICJpcHJvdXRlMiIgIkxpbnV4IgorCisuU0ggTkFNRQorY2dyb3VwIFwtIGNvbnRyb2wgZ3JvdXAgYmFzZWQgdHJhZmZpYyBjb250cm9sIGZpbHRlcgorLlNIIFNZTk9QU0lTCisuaW4gKzgKKy50aSAtOAorLkJSIHRjICIgIiBmaWx0ZXIgIiAuLi4gIiBjZ3JvdXAgIiBbICIgbWF0Y2gKKy5JUiBFTUFUQ0hfVFJFRSAiIF0gWyAiCisuQiBhY3Rpb24KKy5JUiBBQ1RJT05fU1BFQyAiIF0iCisuU0ggREVTQ1JJUFRJT04KK1RoaXMgZmlsdGVyIHNlcnZlcyBhcyBhIGhpbnQgdG8KKy5CIHRjCit0aGF0IHRoZSBhc3NpZ25lZCBjbGFzcyBJRCBvZiB0aGUgbmV0X2NscyBjb250cm9sIGdyb3VwIHRoZSBwcm9jZXNzIHRoZSBwYWNrZXQKK29yaWdpbmF0ZXMgZnJvbSBiZWxvbmdzIHRvIHNob3VsZCBiZSB1c2VkIGZvciBjbGFzc2lmaWNhdGlvbi4gT2J2aW91c2x5LCBpdCBpcwordXNlZnVsIGZvciBsb2NhbGx5IGdlbmVyYXRlZCBwYWNrZXRzIG9ubHkuCisuU0ggT1BUSU9OUworLlRQCisuQkkgYWN0aW9uICIgQUNUSU9OX1NQRUMiCitBcHBseSBhbiBhY3Rpb24gZnJvbSB0aGUgZ2VuZXJpYyBhY3Rpb25zIGZyYW1ld29yayBvbiBtYXRjaGluZyBwYWNrZXRzLgorLlRQCisuQkkgbWF0Y2ggIiBFTUFUQ0hfVFJFRSIKK01hdGNoIHBhY2tldHMgdXNpbmcgdGhlIGV4dGVuZGVkIG1hdGNoIGluZnJhc3RydWN0dXJlLiBTZWUKKy5CUiB0Yy1lbWF0Y2ggKDgpCitmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgYWxsb3dlZCBzeW50YXggaW4KKy5JUiBFTUFUQ0hfVFJFRSAuCisuU0ggRVhBTVBMRVMKK0luIG9yZGVyIHRvIHVzZSB0aGlzIGZpbHRlciwgYSBuZXRfY2xzIGNvbnRyb2wgZ3JvdXAgaGFzIHRvIGJlIGNyZWF0ZWQgZmlyc3QgYW5kCitjbGFzcyBhcyB3ZWxsIGFzIHByb2Nlc3MgSUQocykgYXNzaWduZWQgdG8gaXQuIFRoZSBmb2xsb3dpbmcgY3JlYXRlcyBhIG5ldF9jbHMKK2Nncm91cCBuYW1lZCAiZm9vYmFyIjoKKworLlJTCisuRVgKK21vZHByb2JlIGNsc19jZ3JvdXAKK21rZGlyIC9zeXMvZnMvY2dyb3VwL25ldF9jbHMKK21vdW50IC10IGNncm91cCAtb25ldF9jbHMgbmV0X2NscyAvc3lzL2ZzL2Nncm91cC9uZXRfY2xzCitta2RpciAvc3lzL2ZzL2Nncm91cC9uZXRfY2xzL2Zvb2JhcgorLkVFCisuUkUKKworVG8gYXNzaWduIGEgY2xhc3MgSUQgdG8gdGhlIGNyZWF0ZWQgY2dyb3VwLCBhIGZpbGUgbmFtZWQKKy5JIG5ldF9jbHMuY2xhc3NpZAoraGFzIHRvIGJlIGNyZWF0ZWQgd2hpY2ggY29udGFpbnMgdGhlIGNsYXNzIElEIHRvIGJlIGFzc2lnbmVkIGFzIGEgaGV4YWRlY2ltYWwsCis2NGJpdCB3aWRlIG51bWJlci4gVGhlIHVwcGVyIDMyYml0cyBhcmUgcmVzZXJ2ZWQgZm9yIHRoZSBtYWpvciBoYW5kbGUsIHRoZQorcmVtYWluaW5nIGhvbGQgdGhlIG1pbm9yLiBTbyBhIGNsYXNzIElEIG9mIGUuZy4KKy5CIGZmOmJlCitoYXMgdG8gYmUgd3JpdHRlbiBsaWtlIHNvOgorLkIgMHhmZjAwYmUKKyhsZWFkaW5nIHplcm9lcyBtYXkgYmUgb21pdHRlZCkuIFRvIGNvbnRpbnVlIHRoZSBhYm92ZSBleGFtcGxlLCB0aGUgZm9sbG93aW5nCithc3NpZ25zIGNsYXNzIElEIDE6MiB0byBmb29iYXIgY2dyb3VwOgorCisuUlMKKy5FWAorZWNobyAweDEwMDAyID4gL3N5cy9mcy9jZ3JvdXAvbmV0X2Nscy9mb29iYXIvbmV0X2Nscy5jbGFzc2lkCisuRUUKKy5SRQorCitGaW5hbGx5IHNvbWUgUElEcyBjYW4gYmUgYXNzaWduZWQgdG8gdGhlIGdpdmVuIGNncm91cDoKKworLlJTCisuRVgKK2VjaG8gMTIzNCA+IC9zeXMvZnMvY2dyb3VwL25ldF9jbHMvZm9vYmFyL3Rhc2tzCitlY2hvIDU2NzggPiAvc3lzL2ZzL2Nncm91cC9uZXRfY2xzL2Zvb2Jhci90YXNrcworLkVFCisuUkUKKworTm93IGJ5IHNpbXBseSBhdHRhY2hpbmcgYQorLkIgY2dyb3VwCitmaWx0ZXIgdG8gYQorLkIgcWRpc2MKK21ha2VzIHBhY2tldHMgZnJvbSBQSURzIDEyMzQgYW5kIDU2NzggYmUgcHVzaGVkIGludG8gY2xhc3MgMToyLgorCisuU0ggU0VFIEFMU08KKy5CUiB0YyAoOCksCisuQlIgdGMtZW1hdGNoICg4KSwKKy5icgordGhlIGZpbGUKKy5JIERvY3VtZW50YXRpb24vY2dyb3Vwcy9uZXRfY2xzLnR4dAorb2YgdGhlIExpbnV4IGtlcm5lbCB0cmVlCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9tYW4vbWFuOC90Yy1jaG9rZS44IGIvaXByb3V0ZTIvbWFuL21hbjgvdGMtY2hva2UuOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTE2YTNkCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbWFuL21hbjgvdGMtY2hva2UuOApAQCAtMCwwICsxLDYzIEBACisuVEggVEMgOCAiQXVndXN0IDIwMTEiICJpcHJvdXRlMiIgIkxpbnV4IgorLlNIIE5BTUUKK2Nob2tlIFwtIGNob29zZSBhbmQga2VlcCBzY2hlZHVsZXIKKy5TSCBTWU5PUFNJUworLkIgdGMgcWRpc2MgLi4uIGNob2tlCisuQiBsaW1pdAorcGFja2V0cworLkIgbWluCitwYWNrZXRzCisuQiBtYXgKK3BhY2tldHMKKy5CIGF2cGt0CitieXRlcworLkIgYnVyc3QKK3BhY2tldHMKKy5CIFsgZWNuIF0gWyBiYW5kd2lkdGgKK3JhdGUKKy5CIF0gcHJvYmFiaWxpdHkKK2NoYW5jZQorCisuU0ggREVTQ1JJUFRJT04KKworQ0hPS2UgKENIT29zZSBhbmQgS2VlcCBmb3IgcmVzcG9uc2l2ZSBmbG93cywgQ0hPb3NlIGFuZCBLaWxsIGZvciB1bnJlc3BvbnNpdmUgZmxvd3MpCitpcyBhIGNsYXNzbGVzcyBxZGlzYyBkZXNpZ25lZCB0byBib3RoIGlkZW50aWZ5IGFuZCBwZW5hbGl6ZSBmbG93cyB0aGF0IG1vbm9wb2xpemUgdGhlCitxdWV1ZS4gQ0hPS2UgaXMgYSB2YXJpYXRpb24gb2YgUkVELCBhbmQgdGhlIGNvbmZpZ3VyYXRpb24gaXMgc2ltaWxhciB0byBSRUQuCisKKy5TSCBBTEdPUklUSE0KK09uY2UgdGhlIHF1ZXVlIGhpdHMgYSBjZXJ0YWluIGF2ZXJhZ2UgbGVuZ3RoLCBhIHJhbmRvbSBwYWNrZXQgaXMgZHJhd24gZnJvbSB0aGUKK3F1ZXVlLiBJZiBib3RoIHRoZSB0by1iZS1xdWV1ZWQgYW5kIHRoZSBkcmF3biBwYWNrZXQgYmVsb25nIHRvIHRoZSBzYW1lIGZsb3csCitib3RoIHBhY2tldHMgYXJlIGRyb3BwZWQuIE90aGVyd2lzZSwgaWYgdGhlIHF1ZXVlIGxlbmd0aCBpcyBzdGlsbCBiZWxvdyB0aGUgbWF4aW11bSBsZW5ndGgsCit0aGUgbmV3IHBhY2tldCBoYXMgYSBjb25maWd1cmFibGUgY2hhbmNlIG9mIGJlaW5nIG1hcmtlZCAod2hpY2ggbWF5IG1lYW4gZHJvcHBlZCkuCitJZiB0aGUgcXVldWUgbGVuZ3RoIGV4Y2VlZHMKKy5CUiBtYXggLAordGhlIG5ldyBwYWNrZXQgd2lsbCBhbHdheXMgYmUgbWFya2VkIChvciBkcm9wcGVkKS4KK0lmIHRoZSBxdWV1ZSBsZW5ndGggZXhjZWVkcworLkJSIGxpbWl0ICwKK3RoZSBuZXcgcGFja2V0IGlzIGFsd2F5cyBkcm9wcGVkLgorCitUaGUgbWFya2luZyBwcm9iYWJpbGl0eSBjb21wdXRhdGlvbiBpcyB0aGUgc2FtZSBhcyB1c2VkIGJ5IHRoZSBSRUQgcWRpc2MuCisKKy5TSCBQQVJBTUVURVJTCitUaGUgcGFyYW1ldGVycyBhcmUgdGhlIHNhbWUgYXMgZm9yIFJFRCwgZXhjZXB0IHRoYXQgUkVEIHVzZXMgYnl0ZXMgd2hlcmVhcyBjaG9rZQorY291bnRzIHBhY2tldHMuIFNlZQorLkJSIHRjLXJlZCAoOCkKK2ZvciBhIGRlc2NyaXB0aW9uLgorCisuU0ggU09VUkNFCisuVFAKK28KK1IuIFBhbiwgQi4gUHJhYmhha2FyLCBhbmQgSy4gUHNvdW5pcywgIkNIT0tlLCBBIFN0YXRlbGVzcworQWN0aXZlIFF1ZXVlIE1hbmFnZW1lbnQgU2NoZW1lIGZvciBBcHByb3hpbWF0aW5nIEZhaXIgQmFuZHdpZHRoIEFsbG9jYXRpb24iLAorSUVFRSBJTkZPQ09NLCAyMDAwLgorLlRQCitvCitBLiBUYW5nLCBKLiBXYW5nLCBTLiBMb3csICJVbmRlcnN0YW5kaW5nIENIT0tlOiBUaHJvdWdocHV0IGFuZCBTcGF0aWFsCitDaGFyYWN0ZXJpc3RpY3MiLCBJRUVFL0FDTSBUcmFuc2FjdGlvbnMgb24gTmV0d29ya2luZywgMjAwNAorCisuU0ggU0VFIEFMU08KKy5CUiB0YyAoOCksCisuQlIgdGMtcmVkICg4KQorCisuU0ggQVVUSE9SCitzY2hlZF9jaG9rZSB3YXMgY29udHJpYnV0ZWQgYnkgU3RlcGhlbiBIZW1taW5nZXIuCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9tYW4vbWFuOC90Yy1jb2RlbC44IGIvaXByb3V0ZTIvbWFuL21hbjgvdGMtY29kZWwuOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGU1MGE0Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbWFuL21hbjgvdGMtY29kZWwuOApAQCAtMCwwICsxLDExNCBAQAorLlRIIENvRGVsIDggIjIzIE1heSAyMDEyIiAiaXByb3V0ZTIiICJMaW51eCIKKy5TSCBOQU1FCitDb0RlbCBcLSBDb250cm9sbGVkLURlbGF5IEFjdGl2ZSBRdWV1ZSBNYW5hZ2VtZW50IGFsZ29yaXRobQorLlNIIFNZTk9QU0lTCisuQiB0YyBxZGlzYyAuLi4gY29kZWwKK1sKKy5CIGxpbWl0CitQQUNLRVRTIF0gWworLkIgdGFyZ2V0CitUSU1FIF0gWworLkIgaW50ZXJ2YWwKK1RJTUUgXSBbCisuQiBlY24KK3wKKy5CIG5vZWNuCitdCisKKy5TSCBERVNDUklQVElPTgorQ29EZWwgKHByb25vdW5jZWQgImNvZGRsZSIpIGlzIGFuIGFkYXB0aXZlICJuby1rbm9icyIgYWN0aXZlIHF1ZXVlIG1hbmFnZW1lbnQKK2FsZ29yaXRobSAoQVFNKSBzY2hlbWUgdGhhdCB3YXMgZGV2ZWxvcGVkIHRvIGFkZHJlc3MgdGhlIHNob3J0Y29taW5ncyBvZgorUkVEIGFuZCBpdHMgdmFyaWFudHMuIEl0IHdhcyBkZXZlbG9wZWQgd2l0aCB0aGUgZm9sbG93aW5nIGdvYWxzCitpbiBtaW5kOgorIG8gSXQgc2hvdWxkIGJlIHBhcmFtZXRlcmxlc3MuCisgbyBJdCBzaG91bGQga2VlcCBkZWxheXMgbG93IHdoaWxlIHBlcm1pdHRpbmcgYnVyc3RzIG9mIHRyYWZmaWMuCisgbyBJdCBzaG91bGQgY29udHJvbCBkZWxheS4KKyBvIEl0IHNob3VsZCBhZGFwdCBkeW5hbWljYWxseSB0byBjaGFuZ2luZyBsaW5rIHJhdGVzIHdpdGggbm8gaW1wYWN0IG9uCit1dGlsaXphdGlvbi4KKyBvIEl0IHNob3VsZCBiZSBzaW1wbGUgYW5kIGVmZmljaWVudCBhbmQgc2hvdWxkIHNjYWxlIGZyb20gc2ltcGxlIHRvCitjb21wbGV4IHJvdXRlcnMuCisKKy5TSCBBTEdPUklUSE0KK0NvRGVsIGNvbWVzIHdpdGggdGhyZWUgbWFqb3IgaW5ub3ZhdGlvbnMuIEluc3RlYWQgb2YgdXNpbmcgcXVldWUgc2l6ZSBvciBxdWV1ZQorYXZlcmFnZSwgaXQgdXNlcyB0aGUgbG9jYWwgbWluaW11bSBxdWV1ZSBhcyBhIG1lYXN1cmUgb2YgdGhlIHN0YW5kaW5nL3BlcnNpc3RlbnQgcXVldWUuCitTZWNvbmQsIGl0IHVzZXMgYSBzaW5nbGUgc3RhdGUtdHJhY2tpbmcgdmFyaWFibGUgb2YgdGhlIG1pbmltdW0gZGVsYXkgdG8gc2VlIHdoZXJlIGl0CitpcyByZWxhdGl2ZSB0byB0aGUgc3RhbmRpbmcgcXVldWUgZGVsYXkuIFRoaXJkLCBpbnN0ZWFkIG9mIG1lYXN1cmluZyBxdWV1ZSBzaXplCitpbiBieXRlcyBvciBwYWNrZXRzLCBpdCBpcyBtZWFzdXJlZCBpbiBwYWNrZXQtc29qb3VybiB0aW1lIGluIHRoZSBxdWV1ZS4KKworQ29EZWwgbWVhc3VyZXMgdGhlIG1pbmltdW0gbG9jYWwgcXVldWUgZGVsYXkgKGkuZS4gc3RhbmRpbmcgcXVldWUgZGVsYXkpIGFuZAorY29tcGFyZXMgaXQgdG8gdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBhY2NlcHRhYmxlIHF1ZXVlIGRlbGF5CisuQiB0YXJnZXQuCitBcyBsb25nIGFzIHRoZSBtaW5pbXVtIHF1ZXVlIGRlbGF5IGlzIGxlc3MgdGhhbgorLkIgdGFyZ2V0CitvciB0aGUgYnVmZmVyIGNvbnRhaW5zIGZld2VyIHRoYW4gTVRVIHdvcnRoIG9mIGJ5dGVzLCBwYWNrZXRzIGFyZSBub3QgZHJvcHBlZC4KK0NvZGVsIGVudGVycyBhIGRyb3BwaW5nIG1vZGUgd2hlbiB0aGUgbWluaW11bSBxdWV1ZSBkZWxheSBoYXMgZXhjZWVkZWQKKy5CIHRhcmdldAorZm9yIGEgdGltZSBncmVhdGVyIHRoYW4KKy5CIGludGVydmFsLgorSW4gdGhpcyBtb2RlLCBwYWNrZXRzIGFyZSBkcm9wcGVkIGF0IGRpZmZlcmVudCBkcm9wIHRpbWVzIHdoaWNoIGlzIHNldCBieSBhCitjb250cm9sIGxhdy4gVGhlIGNvbnRyb2wgbGF3IGVuc3VyZXMgdGhhdCB0aGUgcGFja2V0IGRyb3BzIGNhdXNlIGEgbGluZWFyIGNoYW5nZQoraW4gdGhlIHRocm91Z2hwdXQuIE9uY2UgdGhlIG1pbmltdW0gZGVsYXkgZ29lcyBiZWxvdworLkIgdGFyZ2V0LAorcGFja2V0cyBhcmUgbm8gbG9uZ2VyIGRyb3BwZWQuCisKK0FkZGl0aW9uYWwgZGV0YWlscyBjYW4gYmUgZm91bmQgaW4gdGhlIHBhcGVyIGNpdGVkIGJlbG93LgorCisuU0ggUEFSQU1FVEVSUworLlNTIGxpbWl0CitoYXJkIGxpbWl0IG9uIHRoZSByZWFsIHF1ZXVlIHNpemUuIFdoZW4gdGhpcyBsaW1pdCBpcyByZWFjaGVkLCBpbmNvbWluZyBwYWNrZXRzCithcmUgZHJvcHBlZC4gSWYgdGhlIHZhbHVlIGlzIGxvd2VyZWQsIHBhY2tldHMgYXJlIGRyb3BwZWQgc28gdGhhdCB0aGUgbmV3IGxpbWl0IGlzCittZXQuIERlZmF1bHQgaXMgMTAwMCBwYWNrZXRzLgorCisuU1MgdGFyZ2V0CitpcyB0aGUgYWNjZXB0YWJsZSBtaW5pbXVtIHN0YW5kaW5nL3BlcnNpc3RlbnQgcXVldWUgZGVsYXkuIFRoaXMgbWluaW11bSBkZWxheQoraXMgaWRlbnRpZmllZCBieSB0cmFja2luZyB0aGUgbG9jYWwgbWluaW11bSBxdWV1ZSBkZWxheSB0aGF0IHBhY2tldHMgZXhwZXJpZW5jZS4KK0RlZmF1bHQgYW5kIHJlY29tbWVuZGVkIHZhbHVlIGlzIDVtcy4KKworLlNTIGludGVydmFsCitpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IHRoZSBtZWFzdXJlZCBtaW5pbXVtIGRlbGF5IGRvZXMgbm90IGJlY29tZSB0b28gc3RhbGUuIFRoZQorbWluaW11bSBkZWxheSBtdXN0IGJlIGV4cGVyaWVuY2VkIGluIHRoZSBsYXN0IGVwb2NoIG9mIGxlbmd0aAorLkIgaW50ZXJ2YWwuCitJdCBzaG91bGQgYmUgc2V0IG9uIHRoZSBvcmRlciBvZiB0aGUgd29yc3QtY2FzZSBSVFQgdGhyb3VnaCB0aGUgYm90dGxlbmVjayB0bworZ2l2ZSBlbmRwb2ludHMgc3VmZmljaWVudCB0aW1lIHRvIHJlYWN0LiBEZWZhdWx0IHZhbHVlIGlzIDEwMG1zLgorCisuU1MgZWNuIHwgbm9lY24KK2NhbiBiZSB1c2VkIHRvIG1hcmsgcGFja2V0cyBpbnN0ZWFkIG9mIGRyb3BwaW5nIHRoZW0uIElmCisuQiBlY24KK2hhcyBiZWVuIGVuYWJsZWQsCisuQiBub2VjbgorY2FuIGJlIHVzZWQgdG8gdHVybiBpdCBvZmYgYW5kIHZpY2UtYS12ZXJzYS4gQnkgZGVmYXVsdCwKKy5CIGVjbgoraXMgdHVybmVkIG9mZi4KKworLlNIIEVYQU1QTEVTCisgIyB0YyBxZGlzYyBhZGQgZGV2IGV0aDAgcm9vdCBjb2RlbAorICMgdGMgLXMgcWRpc2Mgc2hvdworICAgcWRpc2MgY29kZWwgODAxYjogZGV2IGV0aDAgcm9vdCByZWZjbnQgMiBsaW1pdCAxMDAwcCB0YXJnZXQgNS4wbXMKK2ludGVydmFsIDEwMC4wbXMKKyAgICBTZW50IDI0NTgwMTY2MiBieXRlcyAyNzU4NTMgcGt0IChkcm9wcGVkIDAsIG92ZXJsaW1pdHMgMCByZXF1ZXVlcyAyNCkKKyAgICBiYWNrbG9nIDBiIDBwIHJlcXVldWVzIDI0CisgICAgIGNvdW50IDAgbGFzdGNvdW50IDAgbGRlbGF5IDJ1cyBkcm9wX25leHQgMHVzCisgICAgIG1heHBhY2tldCA3MzA2IGVjbl9tYXJrIDAgZHJvcF9vdmVybGltaXQgMAorCisgIyB0YyBxZGlzYyBhZGQgZGV2IGV0aDAgcm9vdCBjb2RlbCBsaW1pdCAxMDAgdGFyZ2V0IDRtcyBpbnRlcnZhbCAzMG1zIGVjbgorICMgdGMgLXMgcWRpc2Mgc2hvdworICAgcWRpc2MgY29kZWwgODAxYzogZGV2IGV0aDAgcm9vdCByZWZjbnQgMiBsaW1pdCAxMDBwIHRhcmdldCA0LjBtcworaW50ZXJ2YWwgMzAuMG1zIGVjbgorICAgIFNlbnQgMjM3NTczMDc0IGJ5dGVzIDI2ODU2MSBwa3QgKGRyb3BwZWQgMCwgb3ZlcmxpbWl0cyAwIHJlcXVldWVzIDUpCisgICAgYmFja2xvZyAwYiAwcCByZXF1ZXVlcyA1CisgICAgIGNvdW50IDAgbGFzdGNvdW50IDAgbGRlbGF5IDc2dXMgZHJvcF9uZXh0IDB1cworICAgICBtYXhwYWNrZXQgMjk2MiBlY25fbWFyayAwIGRyb3Bfb3ZlcmxpbWl0IDAKKworCisuU0ggU0VFIEFMU08KKy5CUiB0YyAoOCksCisuQlIgdGMtcmVkICg4KQorCisuU0ggU09VUkNFUworbyAgIEthdGhsZWVuIE5pY2hvbHMgYW5kIFZhbiBKYWNvYnNvbiwgIkNvbnRyb2xsaW5nIFF1ZXVlIERlbGF5IiwgQUNNIFF1ZXVlLAoraHR0cDovL3F1ZXVlLmFjbS5vcmcvZGV0YWlsLmNmbT9pZD0yMjA5MzM2CisKKy5TSCBBVVRIT1JTCitDb0RlbCB3YXMgaW1wbGVtZW50ZWQgYnkgRXJpYyBEdW1hemV0IGFuZCBEYXZpZCBUYWh0LiBUaGlzIG1hbnBhZ2Ugd2FzIHdyaXR0ZW4KK2J5IFZpamF5IFN1YnJhbWFuaWFuLiBQbGVhc2UgcmVwb3J0cyBjb3JyZWN0aW9ucyB0byB0aGUgTGludXggTmV0d29ya2luZworbWFpbGluZyBsaXN0IDxuZXRkZXZAdmdlci5rZXJuZWwub3JnPi4KZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L3RjLWRyci44IGIvaXByb3V0ZTIvbWFuL21hbjgvdGMtZHJyLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZlYTRlZQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L3RjLWRyci44CkBAIC0wLDAgKzEsOTQgQEAKKy5USCBUQyA4ICJKYW51YXJ5IDIwMTAiICJpcHJvdXRlMiIgIkxpbnV4IgorLlNIIE5BTUUKK2RyciBcLSBkZWZpY2l0IHJvdW5kIHJvYmluIHNjaGVkdWxlcgorLlNIIFNZTk9QU0lTCisuQiB0YyBxZGlzYyAuLi4gYWRkIGRycgorLkIgWyBxdWFudHVtCitieXRlcworLkIgXQorCisuU0ggREVTQ1JJUFRJT04KKworVGhlIERlZmljaXQgUm91bmQgUm9iaW4gU2NoZWR1bGVyIGlzIGEgY2xhc3NmdWwgcXVldWluZyBkaXNjaXBsaW5lIGFzCithIG1vcmUgZmxleGlibGUgcmVwbGFjZW1lbnQgZm9yIFN0b2NoYXN0aWMgRmFpcm5lc3MgUXVldWluZy4KKworVW5saWtlIFNGUSwgdGhlcmUgYXJlIG5vIGJ1aWx0LWluIHF1ZXVlcyBcLVwtIHlvdSBuZWVkIHRvIGFkZCBjbGFzc2VzCithbmQgdGhlbiBzZXQgdXAgZmlsdGVycyB0byBjbGFzc2lmeSBwYWNrZXRzIGFjY29yZGluZ2x5LgorVGhpcyBjYW4gYmUgdXNlZnVsIGUuZy4gZm9yIHVzaW5nIFJFRCBxZGlzY3Mgd2l0aCBkaWZmZXJlbnQgc2V0dGluZ3MgZm9yIHBhcnRpY3VsYXIKK3RyYWZmaWMuIFRoZXJlIGlzIG5vIGRlZmF1bHQgY2xhc3MgXC1cLSBpZiBhIHBhY2tldCBjYW5ub3QgYmUgY2xhc3NpZmllZCwKK2l0IGlzIGRyb3BwZWQuCisKKy5TSCBBTEdPUklUSE0KK0VhY2ggY2xhc3MgaXMgYXNzaWduZWQgYSBkZWZpY2l0IGNvdW50ZXIsIGluaXRpYWxpemVkIHRvCisuQiBxdWFudHVtLgorCitEUlIgbWFpbnRhaW5zIGFuIChpbnRlcm5hbCkgJydhY3RpdmUnJyBsaXN0IG9mIGNsYXNzZXMgd2hvc2UgcWRpc2NzIGFyZQorbm9uLWVtcHR5LiBUaGlzIGxpc3QgaXMgdXNlZCBmb3IgZGVxdWV1aW5nLiBBIHBhY2tldCBpcyBkZXF1ZXVlZCBmcm9tCit0aGUgY2xhc3MgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QgaWYgdGhlIHBhY2tldCBzaXplIGlzIHNtYWxsZXIgb3IgZXF1YWwKK3RvIHRoZSBkZWZpY2l0IGNvdW50ZXIuIElmIHRoZSBjb3VudGVyIGlzIHRvbyBzbWFsbCwgaXQgaXMgaW5jcmVhc2VkIGJ5CisuQiBxdWFudHVtCithbmQgdGhlIHNjaGVkdWxlciBtb3ZlcyBvbiB0byB0aGUgbmV4dCBjbGFzcyBpbiB0aGUgYWN0aXZlIGxpc3QuCisKKworLlNIIFBBUkFNRVRFUlMKKy5UUAorcXVhbnR1bQorQW1vdW50IG9mIGJ5dGVzIGEgZmxvdyBpcyBhbGxvd2VkIHRvIGRlcXVldWUgYmVmb3JlIHRoZSBzY2hlZHVsZXIgbW92ZXMgdG8KK3RoZSBuZXh0IGNsYXNzLiBEZWZhdWx0cyB0byB0aGUgTVRVIG9mIHRoZSBpbnRlcmZhY2UuIFRoZSBtaW5pbXVtIHZhbHVlIGlzIDEuCisKKy5TSCBFWEFNUExFICYgVVNBR0UKKworVG8gYXR0YWNoIHRvIGRldmljZSBldGgwLCB1c2luZyB0aGUgaW50ZXJmYWNlIE1UVSBhcyBpdHMgcXVhbnR1bToKKy5QCisjIHRjIHFkaXNjIGFkZCBkZXYgZXRoMCBoYW5kbGUgMSByb290IGRycgorLlAKK0FkZGluZyB0d28gY2xhc3NlczoKKy5QCisjIHRjIGNsYXNzIGFkZCBkZXYgZXRoMCBwYXJlbnQgMTogY2xhc3NpZCAxOjEgZHJyCisuYnIKKyMgdGMgY2xhc3MgYWRkIGRldiBldGgwIHBhcmVudCAxOiBjbGFzc2lkIDE6MiBkcnIKKy5QCitZb3UgYWxzbyBuZWVkIHRvIGFkZCBhdCBsZWFzdCBvbmUgZmlsdGVyIHRvIGNsYXNzaWZ5IHBhY2tldHMuCisuUAorIyB0YyBmaWx0ZXIgYWRkIGRldiBldGgwIHByb3RvY29sIC4uIGNsYXNzaWQgMToxCisuUAorCitMaWtlIFNGUSwgRFJSIGlzIG9ubHkgdXNlZnVsIHdoZW4gaXQgb3ducyB0aGUgcXVldWUgXC1cLSBpdCBpcyBhIHB1cmUgc2NoZWR1bGVyIGFuZCBkb2VzCitub3QgZGVsYXkgcGFja2V0cy4gQXR0YWNoaW5nIG5vbi13b3JrLWNvbnNlcnZpbmcgcWRpc2NzIGxpa2UgdGJmIHRvIGl0IGRvZXMgbm90IG1ha2UKK3NlbnNlIFwtXC0gb3RoZXIgcWRpc2NzIGluIHRoZSBhY3RpdmUgbGlzdCB3aWxsIGFsc28gYmVjb21lIGluYWN0aXZlIHVudGlsIHRoZSBkZXF1ZXVlCitvcGVyYXRpb24gc3VjY2VlZHMuIEVtYmVkIERSUiB3aXRoaW4gYW5vdGhlciBxZGlzYyBsaWtlIEhUQiBvciBIRlNDIHRvIGVuc3VyZSBpdCBvd25zIHRoZSBxdWV1ZS4KKy5QCitZb3UgY2FuIG1pbWljIFNGUSBiZWhhdmlvciBieSBhc3NpZ25pbmcgcGFja2V0cyB0byB0aGUgYXR0YWNoZWQgY2xhc3NlcyB1c2luZyB0aGUKK2Zsb3cgZmlsdGVyOgorCisuQiB0YyBxZGlzYyBhZGQgZGV2IC4uIGRycgorCisuQiBmb3IgaSBpbiAuLiAxMDI0O2RvCisuYnIKKy5CICJcdHRjIGNsYXNzIGFkZCBkZXYgLi4gY2xhc3NpZCAkaGFuZGxlOiQocHJpbnQgJXggJGkpIgorLmJyCisuQiAiXHR0YyBxZGlzYyBhZGQgZGV2IC4uIGZpZm8gbGltaXQgMTYiCisuYnIKKy5CIGRvbmUKKworLkIgdGMgZmlsdGVyIGFkZCAuLiBwcm90b2NvbCBpcCAuLiAkaGFuZGxlIGZsb3cgaGFzaCBrZXlzIHNyYyxkc3QscHJvdG8scHJvdG8tc3JjLHByb3RvLWRzdCBkaXZpc29yIDEwMjQgcGVydHVyYiAxMAorCisKKy5TSCBTT1VSQ0UKKy5UUAorbworTS4gU2hyZWVkaGFyIGFuZCBHZW9yZ2UgVmFyZ2hlc2UgIkVmZmljaWVudCBGYWlyCitRdWV1aW5nIHVzaW5nIERlZmljaXQgUm91bmQgUm9iaW4iLCBQcm9jLiBTSUdDT01NIDk1LgorCisuU0ggTk9URVMKKworVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBkcm9wIHBhY2tldHMgZnJvbSB0aGUgbG9uZ2VzdCBxdWV1ZSBvbiBvdmVycnVuLAorYXMgbGltaXRzIGFyZSBoYW5kbGVkIGJ5IHRoZSBpbmRpdmlkdWFsIGNoaWxkIHFkaXNjcy4KKworLlNIIFNFRSBBTFNPCisuQlIgdGMgKDgpLAorLkJSIHRjLWh0YiAoOCksCisuQlIgdGMtc2ZxICg4KQorCisuU0ggQVVUSE9SCitzY2hlZF9kcnIgd2FzIHdyaXR0ZW4gYnkgUGF0cmljayBNY0hhcmR5LgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWFuL21hbjgvdGMtZW1hdGNoLjggYi9pcHJvdXRlMi9tYW4vbWFuOC90Yy1lbWF0Y2guOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWJmNzBjCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbWFuL21hbjgvdGMtZW1hdGNoLjgKQEAgLTAsMCArMSwxMzIgQEAKKy5USCBlbWF0Y2ggOCAiNiBBdWd1c3QgMjAxMiIgaXByb3V0ZTIgTGludXgKKy4KKy5TSCBOQU1FCitlbWF0Y2ggXC0gZXh0ZW5kZWQgbWF0Y2hlcyBmb3IgdXNlIHdpdGggImJhc2ljIiBvciAiZmxvdyIgZmlsdGVycworLgorLlNIIFNZTk9QU0lTCisuc3AKKy5hZCBsCisuQiAidGMgZmlsdGVyIGFkZCAuLiBiYXNpYyBtYXRjaCIKKy5SSSBFWFBSCisuQiAuLiBmbG93aWQgLi4KKy5zcAorCisuSVIgRVhQUiAiIDo9ICIgVEVSTSAiIFsgeyAiCisuQiBhbmQgfCBvcgorfQorLklSIEVYUFIKK10KKworLklSIFRFUk0gIiA6PSBbICIgXGZCbm90ICIgXSB7ICIgTUFUQ0ggIiB8ICcoJyAiIEVYUFIgIiAnKScgfSAiCisKKy5JUiBNQVRDSCAiIDo9ICIgbW9kdWxlICIgJygnICIgQVJHUyAiICcpJyAiCisKKy5JUiBBUkdTICIgOj0gIiBBUkcxICIgIiBBUkcyICIgLi4KKworLlNIIE1BVENIRVMKKworLlNTIGNtcAorU2ltcGxlIGNvbXBhcmlzb24gZW1hdGNoOiBhcml0aG1ldGljIGNvbXBhcmUgb2YgcGFja2V0IGRhdGEgdG8gYSBnaXZlbiB2YWx1ZS4KKworLklSIGNtcCAiKCAiIEFMSUdOICIgYXQgIiBPRkZTRVQgIiBbICIgQVRUUlMgIiBdIHsgIiBlcSAiIHwgIiBsdCAiIHwgIiBndCAiIH0gIiBWQUxVRSAiICkKKworLklSIEFMSUdOICIgOj0geyAiIHU4ICIgfCAiIHUxNiAiIHwgIiB1MzIgIiB9ICIKKworLklSIEFUVFJTICIgOj0gWyBsYXllciAiIExBWUVSICIgXSBbIG1hc2sgIiBNQVNLICIgXSBbIHRyYW5zIF0KKworLklSIExBWUVSICIgOj0geyAiIGxpbmsgIiB8ICIgbmV0d29yayAiIHwgIiB0cmFuc3BvcnQgIiB8ICIgMC4uMiAiIH0KKworLlNTIG1ldGEKK01ldGFkYXRhIGVtYXRjaAorCisuSVIgbWV0YSAiKCAiIE9CSkVDVCAiIHsgIiBlcSAiIHwgIiBsdCAiIHwiIGd0ICIgfSAiIE9CSkVDVCAiICkKKworLklSIE9CSkVDVCAiIDo9IHsgIiBNRVRBX0lEICIgfCAgIiBWQUxVRSAiIH0KKworLklSIE1FVEFfSUQgIiA6PSAiIGlkICIgWyBzaGlmdCAiIFNISUZUICIgXSBbIG1hc2sgIiBNQVNLICIgXQorCisuVFAKK21ldGEgYXR0cmlidXRlczoKKworXGZCcmFuZG9tXGZQIDMyIGJpdCByYW5kb20gdmFsdWUKKworXGZCbG9hZGF2Z18xXGZQIExvYWQgYXZlcmFnZSBpbiBsYXN0IDUgbWludXRlcworCitcZkJuZl9tYXJrXGZQIE5ldGZpbHRlciBtYXJrCisKK1xmQnZsYW5cZlAgVmxhbiB0YWcKKworXGZCc2tfcmN2YnVmXGZQIFJlY2VpdmUgYnVmZmVyIHNpemUKKworXGZCc2tfc25kX3F1ZXVlXGZQIFNlbmQgcXVldWUgbGVuZ3RoCisKKy5QUAorQSBmdWxsIGxpc3Qgb2YgbWV0YSBhdHRyaWJ1dGVzIGNhbiBiZSBvYnRhaW5lZCB2aWEKKworIyB0YyBmaWx0ZXIgYWRkIGRldiBldGgxIGJhc2ljIG1hdGNoICdtZXRhKGxpc3QpJworCisuU1MgbmJ5dGUKK21hdGNoIHBhY2tldCBkYXRhIGJ5dGUgc2VxdWVuY2UKKworLklSIG5ieXRlICIoICIgTkVFRExFICAiIGF0ICIgT0ZGU0VUICIgWyBsYXllciAiIExBWUVSICIgXSApCisKKy5JUiBORUVETEUgICIgOj0geyAiIHN0cmluZyAiIHwgIiBjLWVzY2FwZS1zZXF1ZW5jZSAiICB9ICIKKworLklSIE9GRlNFVCAgIiA6PSAiIGludAorCisuSVIgTEFZRVIgIiA6PSB7ICIgbGluayAiIHwgIiBuZXR3b3JrICIgfCAiIHRyYW5zcG9ydCAiIHwgIiAwLi4yICIgfQorCisuU1MgdTMyCit1MzIgZW1hdGNoCisKKy5JUiB1MzIgIiggIiBBTElHTiAiICIgVkFMVUUgIiAiIE1BU0sgIiBhdCBbIG5leHRoZHIrIF0gIiBPRkZTRVQgIiApCisKKy5JUiBBTElHTiAiIDo9IHsgIiB1OCAiIHwgIiB1MTYgIiB8ICIgdTMyICIgfQorCisuU1MgaXBzZXQKK3Rlc3QgcGFja2V0IGFnYWluc3QgaXBzZXQgbWVtYmVyc2hpcAorCisuSVIgaXBzZXQgIiggIiBTRVROQU1FICIgIiBGTEFHUyAiICkKKworLklSIFNFVE5BTUUgIiA6PSAiIHN0cmluZworCisuSVIgRkxBR1MgIiA6PSB7ICIgRkxBRyAiIFssICIgRkxBR1MgIl0gfQorCitUaGUgZmxhZyBvcHRpb25zIGFyZSB0aGUgc2FtZSBhcyB0aG9zZSB1c2VkIGJ5IHRoZSBpcHRhYmxlcyAic2V0IiBtYXRjaC4KKworV2hlbiB1c2luZyB0aGUgaXBzZXQgZW1hdGNoIHdpdGggdGhlICJpcF9zZXRfaGFzaDpuZXQsaWZhY2UiIHNldCB0eXBlLAordGhlIGludGVyZmFjZSBjYW4gYmUgcXVlcmllZCB1c2luZyAic3JjLGRzdCAoc291cmNlIGlwIGFkZHJlc3MsIG91dGdvaW5nIGludGVyZmFjZSkgb3IKKyJzcmMsc3JjIiAoc291cmNlIGlwIGFkZHJlc3MsIGluY29taW5nIGludGVyZmFjZSkgc3ludGF4LgorCisuU0ggQ0FWRUFUUworCitUaGUgZW1hdGNoIHN5bnRheCB1c2VzICcoJyBhbmQgJyknIHRvIGdyb3VwIGV4cHJlc3Npb25zLiBBbGwgYnJhY2VzIG5lZWQgdG8gYmUKK2VzY2FwZWQgcHJvcGVybHkgdG8gcHJldmVudCBzaGVsbCBjb21tYW5kbGluZSBmcm9tIGludGVycHJldGluZyB0aGVzZSBkaXJlY3RseS4KKworV2hlbiB1c2luZyB0aGUgaXBzZXQgZW1hdGNoIHdpdGggdGhlICJpZmIiIGRldmljZSwgdGhlIG91dGdvaW5nIGRldmljZSB3aWxsIGJlIHRoZQoraWZiIGRldmljZSBpdHNlbGYsIGUuZy4gImlmYjAiLgorVGhlIG9yaWdpbmFsIGludGVyZmFjZSAoaS5lLiB0aGUgZGV2aWNlIHRoZSBwYWNrZXQgYXJyaXZlZCBvbikgaXMgdHJlYXRlZCBhcyB0aGUgaW5jb21pbmcgaW50ZXJmYWNlLgorCisuU0ggRVhBTVBMRSAmIFVTQUdFCisKKyMgdGMgZmlsdGVyIGFkZCAuLiBiYXNpYyBtYXRjaCAuLi4KKworIyAnY21wKHUxNiBhdCAzIGxheWVyIDIgbWFzayAweGZmMDAgZ3QgMjApJworCisjICdtZXRhKG5mbWFyayBndCAyNCknIGFuZCAnbWV0YSh0Y2luZGV4IG1hc2sgMHhmMCBlcSAweGYwKScKKworIyAnbmJ5dGUoImFiYWJhIiBhdCAxMiBsYXllciAxKScKKworIyAndTMyKHUxNiAweDExMjIgMHhmZmZmIGF0IG5leHRoZHIrNCknCisKK0NoZWNrIGlmIHBhY2tldCBzb3VyY2UgaXAgYWRkcmVzcyBpcyBtZW1iZXIgb2Ygc2V0IG5hbWVkIFxmQmJ1bGtcZlA6CisKKyMgJ2lwc2V0KGJ1bGsgc3JjKScKKworQ2hlY2sgaWYgcGFja2V0IHNvdXJjZSBpcCBhbmQgdGhlIGludGVyZmFjZSB0aGUgcGFja2V0IGFycml2ZWQgb24gaXMgbWVtYmVyIG9mICJoYXNoOm5ldCxpZmFjZSIgc2V0IG5hbWVkIFxmQmludGVyYWN0aXZlXGZQOgorCisjICdpcHNldChpbnRlcmFjdGl2ZSBzcmMsc3JjKScKKworLlNIICJBVVRIT1IiCisKK1RoZSBleHRlbmRlZCBtYXRjaCBpbmZyYXN0cnVjdHVyZSB3YXMgYWRkZWQgYnkgVGhvbWFzIEdyYWYuCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9tYW4vbWFuOC90Yy1mbG93LjggYi9pcHJvdXRlMi9tYW4vbWFuOC90Yy1mbG93LjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFiN2UyYQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L3RjLWZsb3cuOApAQCAtMCwwICsxLDI2NSBAQAorLlRIICJGbG93IGZpbHRlciBpbiB0YyIgOCAiMjAgT2N0IDIwMTUiICJpcHJvdXRlMiIgIkxpbnV4IgorCisuU0ggTkFNRQorZmxvdyBcLSBmbG93IGJhc2VkIHRyYWZmaWMgY29udHJvbCBmaWx0ZXIKKy5TSCBTWU5PUFNJUworLlRQCitNYXBwaW5nIG1vZGU6CisKKy5SUworLmluICs4CisudGkgLTgKKy5CUiB0YyAiICIgZmlsdGVyICIgLi4uICIgImZsb3cgbWFwIGtleSAiCisuSVIgS0VZICIgWyAiIE9QUyAiIF0gWyAiIE9QVElPTlMgIiBdICIKKy5SRQorLlRQCitIYXNoaW5nIG1vZGU6CisKKy5SUworLmluICs4CisudGkgLTgKKy5CUiB0YyAiICIgZmlsdGVyICIgLi4uICIgImZsb3cgaGFzaCBrZXlzICIKKy5JUiBLRVlfTElTVCAiIFsgIgorLkIgcGVydHVyYgorLklSIHNlY3MgIiBdIFsgIiBPUFRJT05TICIgXSAiCisuUkUKKworLmluICs4CisudGkgLTgKKy5JUiBPUFMgIiA6PSBbICIgT1BTICIgXSAiIE9QCisKKy50aSAtOAorLklSIE9QVElPTlMgIiA6PSBbICIKKy5CIGRpdmlzb3IKKy5JUiBOVU0gIiBdIFsgIgorLkIgYmFzZWNsYXNzCisuSVIgSUQgIiBdIFsgIgorLkIgbWF0Y2gKKy5JUiBFTUFUQ0hfVFJFRSAiIF0gWyAiCisuQiBhY3Rpb24KKy5JUiBBQ1RJT05fU1BFQyAiIF0iCisKKy50aSAtOAorLklSIEtFWV9MSVNUICIgOj0gWyAiIEtFWV9MSVNUICIgXSAiIEtFWQorCisudGkgLTgKKy5JUiBPUCAiIDo9IHsgIgorLkJSIG9yICIgfCAiIGFuZCAiIHwgIiB4b3IgIiB8ICIgcnNoaWZ0ICIgfCAiIGFkZGVuZCAiIH0gIgorLkkgTlVNCisKKy50aSAtOAorLklSIElEICIgOj0gIiBYIDogWQorCisudGkgLTgKKy5JUiBLRVkgIiA6PSB7ICIKKy5CUiBzcmMgIiB8ICIgZHN0ICIgfCAiIHByb3RvICIgfCAiIHByb3RvLXNyYyAiIHwgIiBwcm90by1kc3QgIiB8ICIgaWlmICIgfCAiCisuQlIgcHJpb3JpdHkgIiB8ICIgbWFyayAiIHwgIiBuZmN0ICIgfCAiIG5mY3Qtc3JjICIgfCAiIG5mY3QtZHN0ICIgfCAiCisuQlIgbmZjdC1wcm90by1zcmMgIiB8ICIgbmZjdC1wcm90by1kc3QgIiB8ICIgcnQtY2xhc3NpZCAiIHwgIiBzay11aWQgIiB8ICIKKy5CUiBzay1naWQgIiB8ICIgdmxhbi10YWcgIiB8ICIgcnhoYXNoICIgfSIKKy5TSCBERVNDUklQVElPTgorVGhlCisuQiBmbG93CitjbGFzc2lmaWVyIGlzIG1lYW50IHRvIGV4dGVuZCB0aGUKKy5CIFNGUQoraGFzaGluZyBjYXBhYmlsaXRpZXMgd2l0aG91dCBoYXJkLWNvZGluZyBuZXcgaGFzaCBmdW5jdGlvbnMuIEl0IGFsc28gYWxsb3dzCitkZXRlcm1pbmlzdGljIG1hcHBpbmdzIG9mIGtleXMgdG8gY2xhc3Nlcy4KKy5TSCBPUFRJT05TCisuVFAKKy5CSSBhY3Rpb24gIiBBQ1RJT05fU1BFQyIKK0FwcGx5IGFuIGFjdGlvbiBmcm9tIHRoZSBnZW5lcmljIGFjdGlvbnMgZnJhbWV3b3JrIG9uIG1hdGNoaW5nIHBhY2tldHMuCisuVFAKKy5CSSBiYXNlY2xhc3MgIiBJRCIKK0FuIG9mZnNldCBmb3IgdGhlIHJlc3VsdGluZyBjbGFzcyBJRC4KKy5JIElECittYXkgYmUKKy5CUiByb290ICIsICIgbm9uZQorb3IgYSBoZXhhZGVjaW1hbCBjbGFzcyBJRCBpbiB0aGUgZm9ybSBbXGZJWFxmQjpcZlJdXGZJWVxmUi4gSWYgXGZJWFxmUiBpcworb21pdHRlZCwgaXQgaXMgYXNzdW1lZCB0byBiZSB6ZXJvLgorLlRQCisuQkkgZGl2aXNvciAiIE5VTSIKK051bWJlciBvZiBidWNrZXRzIHRvIHVzZSBmb3Igc29ydGluZyBpbnRvLiBLZXlzIGFyZSBjYWxjdWxhdGVkIG1vZHVsbworLklSIE5VTSAuCisuVFAKKy5CSSAiaGFzaCBrZXlzICIgS0VZLUxJU1QKK1BlcmZvcm0gYQorLkIgamhhc2gyCitvcGVyYXRpb24gb3ZlciB0aGUga2V5cyBpbgorLklSIEtFWS1MSVNUICwKK3RoZSByZXN1bHQgKG1vZHVsbyB0aGUKKy5CIGRpdmlzb3IKK2lmIGdpdmVuKSBpcyB0YWtlbiBhcyBjbGFzcyBJRCwgb3B0aW9uYWxseSBvZmZzZXQgYnkgdGhlIHZhbHVlIG9mCisuQlIgYmFzZWNsYXNzIC4KK0l0IGlzIHBvc3NpYmxlIHRvIHNwZWNpZnkgYW4gaW50ZXJ2YWwgKGluIHNlY29uZHMpIGFmdGVyIHdoaWNoCisuQlIgamhhc2gyICdzCitlbnRyb3B5IHNvdXJjZSBpcyByZWNyZWF0ZWQgdXNpbmcgdGhlCisuQiBwZXJ0dXJiCitwYXJhbWV0ZXIuCisuVFAKKy5CSSAibWFwIGtleSAiIEtFWQorUGFja2V0IGRhdGEgaWRlbnRpZmllZCBieQorLkkgS0VZCitpcyB0cmFuc2xhdGVkIGludG8gY2xhc3MgSURzIHRvIHB1c2ggdGhlIHBhY2tldCBpbnRvLiBUaGUgdmFsdWUgbWF5IGJlIG1hbmdsZWQgYnkKKy5JIE9QUworYmVmb3JlIHVzaW5nIGl0IGZvciB0aGUgbWFwcGluZy4gVGhleSBhcmUgYXBwbGllZCBpbiB0aGUgb3JkZXIgbGlzdGVkIGhlcmU6CisuUlMKKy5UUCA0CisuQkkgYW5kICIgTlVNIgorUGVyZm9ybSBiaXR3aXNlCisuQiBBTkQKK29wZXJhdGlvbiB3aXRoIG51bWVyaWMgdmFsdWUKKy5JUiBOVU0gLgorLlRQCisuQkkgb3IgIiBOVU0iCitQZXJmb3JtIGJpdHdpc2UKKy5CIE9SCitvcGVyYXRpb24gd2l0aCBudW1lcmljIHZhbHVlCisuSVIgTlVNIC4KKy5UUAorLkJJIHhvciAiIE5VTSIKK1BlcmZvcm0gYml0d2lzZQorLkIgWE9SCitvcGVyYXRpb24gd2l0aCBudW1lcmljIHZhbHVlCisuSVIgTlVNIC4KKy5UUAorLkJJIHJzaGlmdCAiIE5VTSIKK1NoaWZ0IHRoZSB2YWx1ZSBvZgorLkkgS0VZCit0byB0aGUgcmlnaHQgYnkKKy5JIE5VTQorYml0cy4KKy5UUAorLkJJIGFkZGVuZCAiIE5VTSIKK0FkZAorLkkgTlVNCit0byB0aGUgdmFsdWUgb2YKKy5JUiBLRVkgLgorCisuUkUKKy5SUworRm9yIHRoZQorLkJSIG9yICIsICIgYW5kICIsICIgeG9yICIgYW5kICIgcnNoaWZ0CitvcGVyYXRpb25zLAorLkkgTlVNCitpcyBhc3N1bWVkIHRvIGJlIGFuIHVuc2lnbmVkLCAzMmJpdCBpbnRlZ2VyIHZhbHVlLiBGb3IgdGhlCisuQiBhZGRlbmQKK29wZXJhdGlvbiwKKy5JIE5VTQorbWF5IGJlIG11Y2ggbW9yZSBjb21wbGV4OiBJdCBtYXkgYmUgcHJlZml4ZWQgYnkgYSBtaW51cyAoJy0nKSBzaWduIHRvIGNhdXNlCitzdWJ0cmFjdGlvbiBpbnN0ZWFkIG9mIGFkZGl0aW9uIGFuZCBmb3Iga2V5cyBvZgorLkJSIHNyYyAiLCAiIGRzdCAiLCAiIG5mY3Qtc3JjICIgYW5kICIgbmZjdC1kc3QKK2l0IG1heSBiZSBnaXZlbiBpbiBJUCBhZGRyZXNzIG5vdGF0aW9uLiBTZWUgYmVsb3cgZm9yIGFuIGlsbHVzdHJhdGluZyBleGFtcGxlLgorLlJFCisuVFAKKy5CSSBtYXRjaCAiIEVNQVRDSF9UUkVFIgorTWF0Y2ggcGFja2V0cyB1c2luZyB0aGUgZXh0ZW5kZWQgbWF0Y2ggaW5mcmFzdHJ1Y3R1cmUuIFNlZQorLkJSIHRjLWVtYXRjaCAoOCkKK2ZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBhbGxvd2VkIHN5bnRheCBpbgorLklSIEVNQVRDSF9UUkVFIC4KKy5TSCBLRVlTCitJbiBtYXBwaW5nIG1vZGUsIGEgc2luZ2xlIGtleSBpcyB1c2VkIChhZnRlciBvcHRpb25hbCBwZXJtdXRhdGlvbikgdG8gYnVpbGQgYQorY2xhc3MgSUQuIFRoZSByZXN1bHRpbmcgSUQgaXMgZGVkdWNpYmxlIGluIG1vc3QgY2FzZXMuIEluIGhhc2hpbmcgbW9yZSwgYSBudW1iZXIKK29mIGtleXMgbWF5IGJlIHNwZWNpZmllZCB3aGljaCBhcmUgdGhlbiBoYXNoZWQgYW5kIHRoZSBvdXRwdXQgdXNlZCBhcyBjbGFzcyBJRC4KK1RoaXMgSUQgaXMgbm90IGRlZHVjaWJsZSBpbiBiZWZvcmVoYW5kLCBhbmQgbWF5IGV2ZW4gY2hhbmdlIG92ZXIgdGltZSBmb3IgYQorZ2l2ZW4gZmxvdyBpZiBhCisuQiBwZXJ0dXJiCitpbnRlcnZhbCBoYXMgYmVlbiBnaXZlbi4KKworVGhlIHJhbmdlIG9mIGNsYXNzIElEcyBjYW4gYmUgbGltaXRlZCBieSB0aGUKKy5CIGRpdmlzb3IKK29wdGlvbiwgd2hpY2ggaXMgdXNlZCBmb3IgYSBtb2R1bHVzLgorLlRQCisuQlIgc3JjICIsICIgZHN0CitVc2Ugc291cmNlIG9yIGRlc3RpbmF0aW9uIGFkZHJlc3MgYXMga2V5LiBJbiBjYXNlIG9mIElQdjQgYW5kIFRJUEMsIHRoaXMgaXMgdGhlCithY3R1YWwgYWRkcmVzcyB2YWx1ZS4gRm9yIElQdjYsIHRoZSAxMjhiaXQgYWRkcmVzcyBpcyBmb2xkZWQgaW50byBhIDMyYml0IHZhbHVlCitieSBYT1InaW5nIHRoZSBmb3VyIDMyYml0IHdvcmRzLiBJbiBhbGwgb3RoZXIgY2FzZXMsIHRoZSBrZXJuZWwtaW50ZXJuYWwgc29ja2V0CithZGRyZXNzIGlzIHVzZWQgKGFmdGVyIGZvbGRpbmcgaW50byAzMmJpdHMgb24gNjRiaXQgc3lzdGVtcykuCisuVFAKKy5CIHByb3RvCitVc2UgdGhlIGxheWVyIGZvdXIgcHJvdG9jb2wgbnVtYmVyIGFzIGtleS4KKy5UUAorLkIgcHJvdG8tc3JjCitVc2UgdGhlIGxheWVyIGZvdXIgc291cmNlIHBvcnQgYXMga2V5LiBJZiBub3QgYXZhaWxhYmxlLCB0aGUga2VybmVsLWludGVybmFsCitzb2NrZXQgYWRkcmVzcyBpcyB1c2VkIGluc3RlYWQuCisuVFAKKy5CIHByb3RvLWRzdAorVXNlIHRoZSBsYXllciBmb3VyIGRlc3RpbmF0aW9uIHBvcnQgYXMga2V5LiBJZiBub3QgYXZhaWxhYmxlLCB0aGUgYXNzb2NpYXRlZAora2VybmVsLWludGVybmFsIGRzdF9lbnRyeSBhZGRyZXNzIGlzIHVzZWQgYWZ0ZXIgWE9SJ2luZyB3aXRoIHRoZSBwYWNrZXQncworbGF5ZXIgdGhyZWUgcHJvdG9jb2wgbnVtYmVyLgorLlRQCisuQiBpaWYKK1VzZSB0aGUgaW5jb21pbmcgaW50ZXJmYWNlIGluZGV4IGFzIGtleS4KKy5UUAorLkIgcHJpb3JpdHkKK1VzZSB0aGUgcGFja2V0J3MgcHJpb3JpdHkgYXMga2V5LiBVc3VhbGx5IHRoaXMgaXMgdGhlIElQIGhlYWRlcidzIERTQ1AvRUNOCit2YWx1ZS4KKy5UUAorLkIgbWFyaworVXNlIHRoZSBuZXRmaWx0ZXIKKy5CIGZ3bWFyaworYXMga2V5LgorLlRQCisuQiBuZmN0CitVc2UgdGhlIGFzc29jaWF0ZWQgY29ubnRyYWNrIGVudHJ5IGFkZHJlc3MgYXMga2V5LgorLlRQCisuQlIgbmZjdC1zcmMgIiwgIiBuZmN0LWRzdCAiLCAiIG5mY3QtcHJvdG8tc3JjICIsICIgbmZjdC1wcm90by1kc3QKK1RoZXNlIGFyZSBjb25udHJhY2stYXdhcmUgdmFyaWFudHMgb2YKKy5CUiBzcmMgIiwgIiBkc3QgIiwgIiBwcm90by1zcmMgIiBhbmQgIiBwcm90by1kc3QgLgorSW4gY2FzZSBvZiBOQVQsIHRoZXNlIGFyZSBiYXNpY2FsbHkgdGhlIHBhY2tldCBoZWFkZXIncyB2YWx1ZXMgYmVmb3JlIE5BVCB3YXMKK2FwcGxpZWQuCisuVFAKKy5CIHJ0LWNsYXNzaWQKK1VzZSB0aGUgcGFja2V0J3MgZGVzdGluYXRpb24gcm91dGluZyB0YWJsZSBlbnRyeSdzIHJlYWxtIGFzIGtleS4KKy5UUAorLkIgc2stdWlkCisuVFEKKy5CIHNrLWdpZAorRm9yIGxvY2FsbHkgZ2VuZXJhdGVkIHBhY2tldHMsIHVzZSB0aGUgdXNlciBvciBncm91cCBJRCB0aGUgb3JpZ2luYXRpbmcgc29ja2V0CitiZWxvbmdzIHRvIGFzIGtleS4KKy5UUAorLkIgdmxhbi10YWcKK1VzZSB0aGUgcGFja2V0J3MgdmxhbiBJRCBhcyBrZXkuCisuVFAKKy5CIHJ4aGFzaAorVXNlIHRoZSBmbG93IGhhc2ggYXMga2V5LgorCisuU0ggRVhBTVBMRVMKKy5UUAorQ2xhc3NpYyBTRlEgaGFzaDoKKworLkVYCit0YyBmaWx0ZXIgYWRkIC4uLiBmbG93IGhhc2ggXFwKKwlrZXlzIHNyYyxkc3QscHJvdG8scHJvdG8tc3JjLHByb3RvLWRzdCBkaXZpc29yIDEwMjQKKy5FRQorLlRQCitDbGFzc2ljIFNGUSBoYXNoLCBidXQgdXNpbmcgaW5mb3JtYXRpb24gZnJvbSBjb25udHJhY2sgdG8gd29yayBwcm9wZXJseSBpbiBjb21iaW5hdGlvbiB3aXRoIE5BVDoKKworLkVYCit0YyBmaWx0ZXIgYWRkIC4uLiBmbG93IGhhc2ggXFwKKwlrZXlzIG5mY3Qtc3JjLG5mY3QtZHN0LHByb3RvLG5mY3QtcHJvdG8tc3JjLG5mY3QtcHJvdG8tZHN0IFxcCisJZGl2aXNvciAxMDI0CisuRUUKKy5UUAorTWFwIGRlc3RpbmF0aW9uIElQcyBvZiAxOTIuMTY4LjAuMC8yNCB0byBjbGFzc2lkcyAxLTI1NzoKKworLkVYCit0YyBmaWx0ZXIgYWRkIC4uLiBmbG93IG1hcCBcXAorCWtleSBkc3QgYWRkZW5kIC0xOTIuMTY4LjAuMCBkaXZpc29yIDI1NgorLkVFCisuVFAKK0FsdGVybmF0aXZlIHRvIHRoZSBhYm92ZToKKworLkVYCit0YyBmaWx0ZXIgYWRkIC4uLiBmbG93IG1hcCBcXAorCWtleSBkc3QgYW5kIDB4ZmYKKy5FRQorLlRQCitUaGUgc2FtZSwgYnV0IGluIHJldmVyc2Ugb3JkZXI6CisKKy5FWAordGMgZmlsdGVyIGFkZCAuLi4gZmxvdyBtYXAgXFwKKwlrZXkgZHN0IGFuZCAweGZmIHhvciAweGZmCisuRUUKKy5TSCBTRUUgQUxTTworLkJSIHRjICg4KSwKKy5CUiB0Yy1lbWF0Y2ggKDgpLAorLkJSIHRjLXNmcSAoOCkKZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L3RjLWZsb3dlci44IGIvaXByb3V0ZTIvbWFuL21hbjgvdGMtZmxvd2VyLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0ZDhlMQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L3RjLWZsb3dlci44CkBAIC0wLDAgKzEsMTEzIEBACisuVEggIkZsb3dlciBmaWx0ZXIgaW4gdGMiIDggIjIyIE9jdCAyMDE1IiAiaXByb3V0ZTIiICJMaW51eCIKKworLlNIIE5BTUUKK2Zsb3dlciBcLSBmbG93IGJhc2VkIHRyYWZmaWMgY29udHJvbCBmaWx0ZXIKKy5TSCBTWU5PUFNJUworLmluICs4CisudGkgLTgKKy5CUiB0YyAiICIgZmlsdGVyICIgLi4uICIgZmxvd2VyICIgWyAiCisuSVIgTUFUQ0hfTElTVCAiIF0gWyAiCisuQiBhY3Rpb24KKy5JUiBBQ1RJT05fU1BFQyAiIF0gWyAiCisuQiBjbGFzc2lkCisuSVIgQ0xBU1NJRCAiIF0iCisKKy50aSAtOAorLklSIE1BVENIX0xJU1QgIiA6PSBbICIgTUFUQ0hfTElTVCAiIF0gIiBNQVRDSAorCisudGkgLTgKKy5JUiBNQVRDSCAiIDo9IHsgIgorLkIgaW5kZXYKKy5JUiBpZm5hbWUgIiB8IHsgIgorLkJSIGRzdF9tYWMgIiB8ICIgc3JjX21hYyAiIH0gIgorLklSIG1hY19hZGRyZXNzICIgfCAiCisuQlIgZXRoX3R5cGUgIiB7ICIgaXB2NCAiIHwgIiBpcHY2ICIgfCAiCisuSVIgRVRIX1RZUEUgIiB9IHwgIgorLkJSIGlwX3Byb3RvICIgeyAiIHRjcCAiIHwgIiB1ZHAgIiB8ICIKKy5JUiBJUF9QUk9UTyAiIH0gfCB7ICIKKy5CUiBkc3RfaXAgIiB8ICIgc3JjX2lwICIgfSB7ICIKKy5JUiBpcHY0X2FkZHJlc3MgIiB8ICIgaXB2Nl9hZGRyZXNzICIgfSB8IHsgIgorLkJSIGRzdF9wb3J0ICIgfCAiIHNyY19wb3J0ICIgfSAiCisuSVIgcG9ydF9udW1iZXIgIiB9IgorLlNIIERFU0NSSVBUSU9OCitUaGUKKy5CIGZsb3dlcgorZmlsdGVyIG1hdGNoZXMgZmxvd3MgdG8gdGhlIHNldCBvZiBrZXlzIHNwZWNpZmllZCBhbmQgYXNzaWducyBhbiBhcmJpdHJhcmlseQorY2hvc2VuIGNsYXNzIElEIHRvIHBhY2tldHMgYmVsb25naW5nIHRvIHRoZW0uIEFkZGl0aW9uYWxseSAob3IgYWx0ZXJuYXRpdmVseSkgYW4KK2FjdGlvbiBmcm9tIHRoZSBnZW5lcmljIGFjdGlvbiBmcmFtZXdvcmsgbWF5IGJlIGNhbGxlZC4KKy5TSCBPUFRJT05TCisuVFAKKy5CSSBhY3Rpb24gIiBBQ1RJT05fU1BFQyIKK0FwcGx5IGFuIGFjdGlvbiBmcm9tIHRoZSBnZW5lcmljIGFjdGlvbnMgZnJhbWV3b3JrIG9uIG1hdGNoaW5nIHBhY2tldHMuCisuVFAKKy5CSSBjbGFzc2lkICIgQ0xBU1NJRCIKK1NwZWNpZnkgYSBjbGFzcyB0byBwYXNzIG1hdGNoaW5nIHBhY2tldHMgb24gdG8uCisuSSBDTEFTU0lECitpcyBpbiB0aGUgZm9ybQorLkJSIFggOiBZICIsIHdoaWxlICIgWCAiIGFuZCAiIFkKK2FyZSBpbnRlcnByZXRlZCBhcyBudW1iZXJzIGluIGhleGFkZWNpbWFsIGZvcm1hdC4KKy5UUAorLkJJIGluZGV2ICIgaWZuYW1lIgorTWF0Y2ggb24gaW5jb21pbmcgaW50ZXJmYWNlIG5hbWUuIE9idmlvdXNseSB0aGlzIG1ha2VzIHNlbnNlIG9ubHkgZm9yIGZvcndhcmRlZAorZmxvd3MuCisuSSBpZm5hbWUKK2lzIHRoZSBuYW1lIG9mIGFuIGludGVyZmFjZSB3aGljaCBtdXN0IGV4aXN0IGF0IHRoZSB0aW1lIG9mCisuQiB0YworaW52b2NhdGlvbi4KKy5UUAorLkJJIGRzdF9tYWMgIiBtYWNfYWRkcmVzcyIKKy5UUQorLkJJIHNyY19tYWMgIiBtYWNfYWRkcmVzcyIKK01hdGNoIG9uIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcy4KKy5UUAorLkJJIGV0aF90eXBlICIgRVRIX1RZUEUiCitNYXRjaCBvbiBsYXllciB0aHJlZSBwcm90b2NvbC4KKy5JIEVUSF9UWVBFCittYXkgYmUgZWl0aGVyCisuQlIgaXB2NCAsIGlwdjYKK29yIGFuIHVuc2lnbmVkIDE2Yml0IHZhbHVlIGluIGhleGFkZWNpbWFsIGZvcm1hdC4KKy5UUAorLkJJIGlwX3Byb3RvICIgSVBfUFJPVE8iCitNYXRjaCBvbiBsYXllciBmb3VyIHByb3RvY29sLgorLkkgSVBfUFJPVE8KK21heSBiZSBlaXRoZXIKKy5CUiB0Y3AgLCB1ZHAKK29yIGFuIHVuc2lnbmVkIDhiaXQgdmFsdWUgaW4gaGV4YWRlY2ltYWwgZm9ybWF0LgorLlRQCisuQkkgZHN0X2lwICIgQUREUkVTUyIKKy5UUQorLkJJIHNyY19pcCAiIEFERFJFU1MiCitNYXRjaCBvbiBzb3VyY2Ugb3IgZGVzdGluYXRpb24gSVAgYWRkcmVzcy4KKy5JIEFERFJFU1MKK211c3QgYmUgYSB2YWxpZCBJUHY0IG9yIElQdjYgYWRkcmVzcywgZGVwZW5kaW5nIG9uCisuQlIgZXRoZXJfdHlwZSAsCit3aGljaCBoYXMgdG8gYmUgc3BlY2lmaWVkIGluIGJlZm9yZWhhbmQuCisuVFAKKy5CSSBkc3RfcG9ydCAiIE5VTUJFUiIKKy5UUQorLkJJIHNyY19wb3J0ICIgTlVNQkVSIgorTWF0Y2ggb24gbGF5ZXIgNCBwcm90b2NvbCBzb3VyY2Ugb3IgZGVzdGluYXRpb24gcG9ydCBudW1iZXIuIE9ubHkgYXZhaWxhYmxlIGZvcgorLkJSIGlwX3Byb3RvICIgdmFsdWVzICIgdWRwICIgYW5kICIgdGNwICwKK3doaWNoIGhhcyB0byBiZSBzcGVjaWZpZWQgaW4gYmVmb3JlaGFuZC4KKy5TSCBOT1RFUworQXMgc3RhdGVkIGFib3ZlIHdoZXJlIGFwcGxpY2FibGUsIG1hdGNoZXMgb2YgYSBjZXJ0YWluIGxheWVyIGltcGxpY2l0bHkgZGVwZW5kCitvbiB0aGUgbWF0Y2hlcyBvZiB0aGUgbmV4dCBsb3dlciBsYXllci4gUHJlY2lzZWx5LCBsYXllciBvbmUgYW5kIHR3byBtYXRjaGVzICgKKy5CUiBpbmRldiAsIGRzdF9tYWMgLCBzcmNfbWFjICIgYW5kICIgZXRoX3R5cGUgKQoraGF2ZSBubyBkZXBlbmRlbmN5LCBsYXllciB0aHJlZSBtYXRjaGVzICgKKy5CUiBpcF9wcm90byAsIGRzdF9pcCAiIGFuZCAiIHNyY19pcCApCityZXF1aXJlCisuQiBldGhfdHlwZQorYmVpbmcgc2V0IHRvIGVpdGhlcgorLkJSIGlwdjQgIiBvciAiIGlwdjYgLAorYW5kIGZpbmFsbHkgbGF5ZXIgZm91ciBtYXRjaGVzICgKKy5CUiBkc3RfcG9ydCAiIGFuZCAiIHNyY19wb3J0ICkKK2RlcGVuZCBvbgorLkIgaXBfcHJvdG8KK2JlaW5nIHNldCB0byBlaXRoZXIKKy5CUiB0Y3AgIiBvciAiIHVkcCAuCisuUAorVGhlcmUgY2FuIGJlIG9ubHkgdXNlZCBvbmUgbWFzayBwZXIgb25lIHByaW8uIElmIHVzZXIgbmVlZHMgdG8gc3BlY2lmeSBkaWZmZXJlbnQKK21hc2ssIGhlIGhhcyB0byB1c2UgZGlmZmVyZW50IHByaW8uCisuU0ggU0VFIEFMU08KKy5CUiB0YyAoOCksCisuQlIgdGMtZmxvdyAoOCkKZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L3RjLWZxLjggYi9pcHJvdXRlMi9tYW4vbWFuOC90Yy1mcS44Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNThhMDUKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9tYW4vbWFuOC90Yy1mcS44CkBAIC0wLDAgKzEsOTIgQEAKKy5USCBGUSA4ICIxMCBTZXB0IDIwMTUiICJpcHJvdXRlMiIgIkxpbnV4IgorLlNIIE5BTUUKK0ZRIFwtIEZhaXIgUXVldWUgdHJhZmZpYyBwb2xpY2luZworLlNIIFNZTk9QU0lTCisuQiB0YyBxZGlzYyAuLi4gZnEKK1sKKy5CIGxpbWl0CitQQUNLRVRTIF0gWworLkIgZmxvd19saW1pdAorUEFDS0VUUyBdIFsKKy5CIHF1YW50dW0KK0JZVEVTIF0gWworLkIgaW5pdGlhbF9xdWFudHVtCitCWVRFUyBdIFsKKy5CIG1heHJhdGUKK1JBVEUgXSBbCisuQiBidWNrZXRzCitOVU1CRVIgXSAgWworLkIgcGFjaW5nCit8CisuQiBub3BhY2luZworXQorCisuU0ggREVTQ1JJUFRJT04KK0ZRIChGYWlyIFF1ZXVlKSBpcyBhIGNsYXNzbGVzcyBwYWNrZXQgc2NoZWR1bGVyIG1lYW50IHRvIGJlIG1vc3RseQordXNlZCBmb3IgbG9jYWxseSBnZW5lcmF0ZWQgdHJhZmZpYy4gIEl0IGlzIGRlc2lnbmVkIHRvIGFjaGlldmUgcGVyIGZsb3cgcGFjaW5nLgorRlEgZG9lcyBmbG93IHNlcGFyYXRpb24sIGFuZCBpcyBhYmxlIHRvIHJlc3BlY3QgcGFjaW5nIHJlcXVpcmVtZW50cyBzZXQgYnkgVENQIHN0YWNrLgorQWxsIHBhY2tldHMgYmVsb25naW5nIHRvIGEgc29ja2V0IGFyZSBjb25zaWRlcmVkIGFzIGEgJ2Zsb3cnLgorRm9yIG5vbiBsb2NhbCBwYWNrZXRzIChyb3V0ZXIgd29ya2xvYWQpLCBwYWNrZXQgcnhoYXNoIGlzIHVzZWQgYXMgZmFsbGJhY2suCisKK0FuIGFwcGxpY2F0aW9uIGNhbiBzcGVjaWZ5IGEgbWF4aW11bSBwYWNpbmcgcmF0ZSB1c2luZyB0aGUKKy5CIFNPX01BWF9QQUNJTkdfUkFURQorc2V0c29ja29wdCBjYWxsLiAgVGhpcyBwYWNrZXQgc2NoZWR1bGVyIGFkZHMgZGVsYXkgYmV0d2VlbiBwYWNrZXRzIHRvCityZXNwZWN0IHJhdGUgbGltaXRhdGlvbiBzZXQgYnkgVENQIHN0YWNrLgorCitEZXF1ZXVlaW5nIGhhcHBlbnMgaW4gYSByb3VuZC1yb2JpbiBmYXNoaW9uLgorQSBzcGVjaWFsIEZJRk8gcXVldWUgaXMgcmVzZXJ2ZWQgZm9yIGhpZ2ggcHJpb3JpdHkgcGFja2V0cyAoCisuQiBUQ19QUklPX0NPTlRST0wKK3ByaW9yaXR5KSwgc3VjaCBwYWNrZXRzIGFyZSBhbHdheXMgZGVxdWV1ZWQgZmlyc3QuCisKK0ZRIGlzIG5vbi13b3JrLWNvbnNlcnZpbmcuCisKK1RDUCBwYWNpbmcgaXMgZ29vZCBmb3IgZmxvd3MgaGF2aW5nIGlkbGUgdGltZXMsIGFzIHRoZSBjb25nZXN0aW9uCit3aW5kb3cgcGVybWl0cyBUQ1Agc3RhY2sgdG8gcXVldWUgYSBwb3NzaWJseSBsYXJnZSBudW1iZXIgb2YgcGFja2V0cy4KK1RoaXMgcmVtb3ZlcyB0aGUgJ3Nsb3cgc3RhcnQgYWZ0ZXIgaWRsZScgY2hvaWNlLCBiYWRseSBoaXR0aW5nCitsYXJnZSBCRFAgZmxvd3MgYW5kIGFwcGxpY2F0aW9ucyBkZWxpdmVyaW5nIGNodW5rcyBvZiBkYXRhIHN1Y2ggYXMgdmlkZW8gc3RyZWFtcy4KKworLlNIIFBBUkFNRVRFUlMKKy5TUyBsaW1pdAorSGFyZCBsaW1pdCBvbiB0aGUgcmVhbCBxdWV1ZSBzaXplLiBXaGVuIHRoaXMgbGltaXQgaXMgcmVhY2hlZCwgbmV3IHBhY2tldHMKK2FyZSBkcm9wcGVkLiBJZiB0aGUgdmFsdWUgaXMgbG93ZXJlZCwgcGFja2V0cyBhcmUgZHJvcHBlZCBzbyB0aGF0IHRoZSBuZXcgbGltaXQgaXMKK21ldC4gRGVmYXVsdCBpcyAxMDAwMCBwYWNrZXRzLgorLlNTIGZsb3dfbGltaXQKK0hhcmQgbGltaXQgb24gdGhlIG1heGltdW0gbnVtYmVyIG9mIHBhY2tldHMgcXVldWVkIHBlciBmbG93LgorRGVmYXVsdCB2YWx1ZSBpcyAxMDAuCisuU1MgcXVhbnR1bQorVGhlIGNyZWRpdCBwZXIgZGVxdWV1ZSBSUiByb3VuZCwgaS5lLiB0aGUgYW1vdW50IG9mIGJ5dGVzIGEgZmxvdyBpcyBhbGxvd2VkIHRvCitkZXF1ZXVlIGF0IG9uY2UuIEEgbGFyZ2VyIHZhbHVlIG1lYW5zIGEgbG9uZ2VyIHRpbWUgcGVyaW9kIGJlZm9yZSB0aGUgbmV4dCBmbG93Cit3aWxsIGJlIHNlcnZlZC4KK0RlZmF1bHQgaXMgMiAqIGludGVyZmFjZSBNVFUgYnl0ZXMuCisuU1MgaW5pdGlhbF9xdWFudHVtCitUaGUgaW5pdGlhbCBzZW5kaW5nIHJhdGUgY3JlZGl0LCBpLmUuIHRoZSBhbW91bnQgb2YgYnl0ZXMgYSBuZXcgZmxvdyBpcyBhbGxvd2VkCit0byBkZXF1ZXVlIGluaXRpYWxseS4KK1RoaXMgaXMgc3BlY2lmaWNhbGx5IG1lYW50IHRvIGFsbG93IHVzaW5nIElXMTAgd2l0aG91dCBhZGRlZCBkZWxheS4KK0RlZmF1bHQgaXMgMTAgKiBpbnRlcmZhY2UgTVRVLCBpLmUuIDE1MTQwIGZvciAnc3RhbmRhcmQnIGV0aGVybmV0LgorLlNTIG1heHJhdGUKK01heGltdW0gc2VuZGluZyByYXRlIG9mIGEgZmxvdy4gIERlZmF1bHQgaXMgdW5saW1pdGVkLgorQXBwbGljYXRpb24gc3BlY2lmaWMgc2V0dGluZyB2aWEKKy5CIFNPX01BWF9QQUNJTkdfUkFURQoraXMgaWdub3JlZCBvbmx5IGlmIGl0IGlzIGxhcmdlciB0aGFuIHRoaXMgdmFsdWUuCisuU1MgYnVja2V0cworVGhlIHNpemUgb2YgdGhlIGhhc2ggdGFibGUgdXNlZCBmb3IgZmxvdyBsb29rdXBzLiBFYWNoIGJ1Y2tldCBpcyBhc3NpZ25lZCBhCityZWQtYmxhY2sgdHJlZSBmb3IgZWZmaWNpZW50IGNvbGxpc2lvbiBzb3J0aW5nLgorRGVmYXVsdDogMTAyNC4KKy5TUyBbbm9dcGFjaW5nCitFbmFibGUgb3IgZGlzYWJsZSBmbG93IHBhY2luZy4gRGVmYXVsdCBpcyBlbmFibGVkLgorLlNIIEVYQU1QTEVTCisjdGMgcWRpc2MgYWRkIGRldiBldGgwIHJvb3QgZnEKKy5icgorI3RjIC1zIC1kIHFkaXNjCisuYnIKK3FkaXNjIGZxIDgwMDM6IGRldiBldGgwIHJvb3QgcmVmY250IDIgbGltaXQgMTAwMDBwIGZsb3dfbGltaXQgMTAwcCBidWNrZXRzIDEwMjQgcXVhbnR1bSAzMDI4IGluaXRpYWxfcXVhbnR1bSAxNTE0MAorIFNlbnQgNTAzNzI3OTgxIGJ5dGVzIDExNDY5NzIgcGt0IChkcm9wcGVkIDAsIG92ZXJsaW1pdHMgMCByZXF1ZXVlcyA1NDQ1MikKKyBiYWNrbG9nIDBiIDBwIHJlcXVldWVzIDU0NDUyCisgIDEyODkgZmxvd3MgKDEyODkgaW5hY3RpdmUsIDAgdGhyb3R0bGVkKQorICAwIGdjLCAzMSBoaWdocHJpbywgMjc0MTEgdGhyb3R0bGVkCisuYnIKKy5TSCBTRUUgQUxTTworLkJSIHRjICg4KSwKKy5CUiBzb2NrZXQgKDcpCisuU0ggQVVUSE9SUworRlEgd2FzIHdyaXR0ZW4gYnkgRXJpYyBEdW1hemV0LgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWFuL21hbjgvdGMtZnFfY29kZWwuOCBiL2lwcm91dGUyL21hbi9tYW44L3RjLWZxX2NvZGVsLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgwMzg5YQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L3RjLWZxX2NvZGVsLjgKQEAgLTAsMCArMSwxMDggQEAKKy5USCBGUV9Db0RlbCA4ICI0IEp1bmUgMjAxMiIgImlwcm91dGUyIiAiTGludXgiCisuU0ggTkFNRQorQ29EZWwgXC0gRmFpciBRdWV1aW5nIChGUSkgd2l0aCBDb250cm9sbGVkIERlbGF5IChDb0RlbCkKKy5TSCBTWU5PUFNJUworLkIgdGMgcWRpc2MgLi4uIGZxX2NvZGVsCitbCisuQiBsaW1pdAorUEFDS0VUUyBdIFsKKy5CIGZsb3dzCitOVU1CRVIgXSBbCisuQiB0YXJnZXQKK1RJTUUgXSBbCisuQiBpbnRlcnZhbAorVElNRSBdIFsKKy5CIHF1YW50dW0KK0JZVEVTIF0gWworLkIgZWNuCit8CisuQiBub2VjbgorXQorCisuU0ggREVTQ1JJUFRJT04KK0ZRX0NvZGVsIChGYWlyIFF1ZXVpbmcgQ29udHJvbGxlZCBEZWxheSkgaXMgcXVldWluZyBkaXNjaXBsaW5lIHRoYXQgY29tYmluZXMgRmFpcgorUXVldWluZyB3aXRoIHRoZSBDb0RlbCBBUU0gc2NoZW1lLiBGUV9Db2RlbCB1c2VzIGEgc3RvY2hhc3RpYyBtb2RlbCB0byBjbGFzc2lmeQoraW5jb21pbmcgcGFja2V0cyBpbnRvIGRpZmZlcmVudCBmbG93cyBhbmQgaXMgdXNlZCB0byBwcm92aWRlIGEgZmFpciBzaGFyZSBvZiB0aGUKK2JhbmR3aWR0aCB0byBhbGwgdGhlIGZsb3dzIHVzaW5nIHRoZSBxdWV1ZS4gRWFjaCBzdWNoIGZsb3cgaXMgbWFuYWdlZCBieSB0aGUKK0NvRGVsIHF1ZXVpbmcgZGlzY2lwbGluZS4gUmVvcmRlcmluZyB3aXRoaW4gYSBmbG93IGlzIGF2b2lkZWQgc2luY2UgQ29kZWwKK2ludGVybmFsbHkgdXNlcyBhIEZJRk8gcXVldWUuCisKKy5TSCBQQVJBTUVURVJTCisuU1MgbGltaXQKK2hhcyB0aGUgc2FtZSBzZW1hbnRpY3MgYXMKKy5CIGNvZGVsCithbmQgaXMgdGhlIGhhcmQgbGltaXQgb24gdGhlIHJlYWwgcXVldWUgc2l6ZS4KK1doZW4gdGhpcyBsaW1pdCBpcyByZWFjaGVkLCBpbmNvbWluZyBwYWNrZXRzIGFyZSBkcm9wcGVkLiBEZWZhdWx0IGlzIDEwMjQwCitwYWNrZXRzLgorCisuU1MgZmxvd3MKK2lzIHRoZSBudW1iZXIgb2YgZmxvd3MgaW50byB3aGljaCB0aGUgaW5jb21pbmcgcGFja2V0cyBhcmUgY2xhc3NpZmllZC4gRHVlIHRvCit0aGUgc3RvY2hhc3RpYyBuYXR1cmUgb2YgaGFzaGluZywgbXVsdGlwbGUgZmxvd3MgbWF5IGVuZCB1cCBiZWluZyBoYXNoZWQgaW50bwordGhlIHNhbWUgc2xvdC4gTmV3ZXIgZmxvd3MgaGF2ZSBwcmlvcml0eSBvdmVyIG9sZGVyIG9uZXMuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZQorc2V0IG9ubHkgYXQgbG9hZCB0aW1lIHNpbmNlIG1lbW9yeSBoYXMgdG8gYmUgYWxsb2NhdGVkIGZvciB0aGUgaGFzaCB0YWJsZS4KK0RlZmF1bHQgdmFsdWUgaXMgMTAyNC4KKworLlNTIHRhcmdldAoraGFzIHRoZSBzYW1lIHNlbWFudGljcyBhcworLkIgY29kZWwKK2FuZCBpcyB0aGUgYWNjZXB0YWJsZSBtaW5pbXVtCitzdGFuZGluZy9wZXJzaXN0ZW50IHF1ZXVlIGRlbGF5LiBUaGlzIG1pbmltdW0gZGVsYXkgaXMgaWRlbnRpZmllZCBieSB0cmFja2luZwordGhlIGxvY2FsIG1pbmltdW0gcXVldWUgZGVsYXkgdGhhdCBwYWNrZXRzIGV4cGVyaWVuY2UuIERlZmF1bHQgdmFsdWUgaXMgNW1zLgorCisuU1MgaW50ZXJ2YWwKK2hhcyB0aGUgc2FtZSBzZW1hbnRpY3MgYXMKKy5CIGNvZGVsCithbmQgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCB0aGUgbWVhc3VyZWQgbWluaW11bSBkZWxheSBkb2VzIG5vdCBiZWNvbWUgdG9vIHN0YWxlLgorVGhlIG1pbmltdW0gZGVsYXkgbXVzdCBiZSBleHBlcmllbmNlZCBpbiB0aGUgbGFzdCBlcG9jaCBvZiBsZW5ndGggLkIgaW50ZXJ2YWwuCitJdCBzaG91bGQgYmUgc2V0IG9uIHRoZSBvcmRlciBvZiB0aGUgd29yc3QtY2FzZSBSVFQgdGhyb3VnaCB0aGUgYm90dGxlbmVjayB0bworZ2l2ZSBlbmRwb2ludHMgc3VmZmljaWVudCB0aW1lIHRvIHJlYWN0LiBEZWZhdWx0IHZhbHVlIGlzIDEwMG1zLgorCisuU1MgcXVhbnR1bQoraXMgdGhlIG51bWJlciBvZiBieXRlcyB1c2VkIGFzICdkZWZpY2l0JyBpbiB0aGUgZmFpciBxdWV1aW5nIGFsZ29yaXRobS4gRGVmYXVsdAoraXMgc2V0IHRvIDE1MTQgYnl0ZXMgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIEV0aGVybmV0IE1UVSBwbHVzIHRoZSBoYXJkd2FyZQoraGVhZGVyIGxlbmd0aCBvZiAxNCBieXRlcy4KKworLlNTIGVjbiB8IG5vZWNuCitoYXMgdGhlIHNhbWUgc2VtYW50aWNzIGFzCisuQiBjb2RlbAorYW5kIGNhbiBiZSB1c2VkIHRvIG1hcmsgcGFja2V0cyBpbnN0ZWFkIG9mIGRyb3BwaW5nIHRoZW0uIElmCisuQiBlY24KK2hhcyBiZWVuIGVuYWJsZWQsCisuQiBub2VjbgorY2FuIGJlIHVzZWQgdG8gdHVybiBpdCBvZmYgYW5kIHZpY2UtYS12ZXJzYS4gVW5saWtlCisuQiBjb2RlbCwgZWNuCitpcyB0dXJuZWQgb24gYnkgZGVmYXVsdC4KKworLlNIIEVYQU1QTEVTCisjdGMgcWRpc2MgYWRkICAgZGV2IGV0aDAgcm9vdCBmcV9jb2RlbAorLmJyCisjdGMgLXMgcWRpc2Mgc2hvdworLmJyCitxZGlzYyBmcV9jb2RlbCA4MDAyOiBkZXYgZXRoMCByb290IHJlZmNudCAyIGxpbWl0IDEwMjQwcCBmbG93cyAxMDI0IHF1YW50dW0gMTUxNAorIHRhcmdldCA1LjBtcyBpbnRlcnZhbCAxMDAuMG1zIGVjbgorICAgU2VudCA0Mjg1MTQgYnl0ZXMgMjI2OSBwa3QgKGRyb3BwZWQgMCwgb3ZlcmxpbWl0cyAwIHJlcXVldWVzIDApCisgICBiYWNrbG9nIDBiIDBwIHJlcXVldWVzIDAKKyAgICBtYXhwYWNrZXQgMjU2IGRyb3Bfb3ZlcmxpbWl0IDAgbmV3X2Zsb3dfY291bnQgMCBlY25fbWFyayAwCisgICAgbmV3X2Zsb3dzX2xlbiAwIG9sZF9mbG93c19sZW4gMAorCisjdGMgcWRpc2MgYWRkIGRldiBldGgwIHJvb3QgZnFfY29kZWwgbGltaXQgMjAwMCB0YXJnZXQgM21zIGludGVydmFsIDQwbXMgbm9lY24KKy5icgorI3RjIC1zIHFkaXNjIHNob3cKKy5icgorcWRpc2MgZnFfY29kZWwgODAwMzogZGV2IGV0aDAgcm9vdCByZWZjbnQgMiBsaW1pdCAyMDAwcCBmbG93cyAxMDI0IHF1YW50dW0gMTUxNAordGFyZ2V0IDMuMG1zIGludGVydmFsIDQwLjBtcworIFNlbnQgMjU4ODk4NTAwNiBieXRlcyAxNzgzNjI5IHBrdCAoZHJvcHBlZCAwLCBvdmVybGltaXRzIDAgcmVxdWV1ZXMgMzQ4NjkpCisgYmFja2xvZyAwYiAwcCByZXF1ZXVlcyAzNDg2OQorICBtYXhwYWNrZXQgNjUyMjYgZHJvcF9vdmVybGltaXQgMCBuZXdfZmxvd19jb3VudCA3MyBlY25fbWFyayAwCisgIG5ld19mbG93c19sZW4gMSBvbGRfZmxvd3NfbGVuIDMKKworCisuU0ggU0VFIEFMU08KKy5CUiB0YyAoOCksCisuQlIgdGMtY29kZWwgKDgpLAorLkJSIHRjLXJlZCAoOCkKKworLlNIIEFVVEhPUlMKK0ZRX0NvRGVsIHdhcyBpbXBsZW1lbnRlZCBieSBFcmljIER1bWF6ZXQuIFRoaXMgbWFucGFnZSB3YXMgd3JpdHRlbgorYnkgVmlqYXkgU3VicmFtYW5pYW4uIFBsZWFzZSByZXBvcnQgY29ycmVjdGlvbnMgdG8gdGhlIExpbnV4IE5ldHdvcmtpbmcKK21haWxpbmcgbGlzdCA8bmV0ZGV2QHZnZXIua2VybmVsLm9yZz4uCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9tYW4vbWFuOC90Yy1mdy44IGIvaXByb3V0ZTIvbWFuL21hbjgvdGMtZncuOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzQyYjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbWFuL21hbjgvdGMtZncuOApAQCAtMCwwICsxLDY2IEBACisuVEggIkZpcmV3YWxsIG1hcmsgY2xhc3NpZmllciBpbiB0YyIgOCAiMjEgT2N0IDIwMTUiICJpcHJvdXRlMiIgIkxpbnV4IgorCisuU0ggTkFNRQorZncgXC0gZndtYXJrIHRyYWZmaWMgY29udHJvbCBmaWx0ZXIKKy5TSCBTWU5PUFNJUworLmluICs4CisudGkgLTgKKy5CUiB0YyAiICIgZmlsdGVyICIgLi4uICIgZncgIiBbICIgY2xhc3NpZAorLklSIENMQVNTSUQgIiBdIFsgIgorLkIgYWN0aW9uCisuSVIgQUNUSU9OX1NQRUMgIiBdIgorLlNIIERFU0NSSVBUSU9OCit0aGUKKy5CIGZ3CitmaWx0ZXIgYWxsb3dzIHRvIGNsYXNzaWZ5IHBhY2tldHMgYmFzZWQgb24gYSBwcmV2aW91c2x5IHNldAorLkJSIGZ3bWFyayAiIGJ5ICIgaXB0YWJsZXMgLgorSWYgaXQgaXMgaWRlbnRpY2FsIHRvIHRoZSBmaWx0ZXIncworLkJSIGhhbmRsZSAsCit0aGUgZmlsdGVyIG1hdGNoZXMuCisuQiBpcHRhYmxlcworYWxsb3dzIHRvIG1hcmsgc2luZ2xlIHBhY2tldHMgd2l0aCB0aGUKKy5CIE1BUksKK3RhcmdldCwgb3Igd2hvbGUgY29ubmVjdGlvbnMgdXNpbmcKKy5CUiBDT05OTUFSSyAuCitUaGUgYmVuZWZpdCBvZiB1c2luZyB0aGlzIGZpbHRlciBpbnN0ZWFkIG9mIGRvaW5nIHRoZQoraGVhdnktbGlmdGluZyB3aXRoCisuQiB0YworaXRzZWxmIGlzIHRoYXQgb24gb25lIGhhbmQgaXQgbWlnaHQgYmUgY29udmVuaWVudCB0byBrZWVwIHBhY2tldCBmaWx0ZXJpbmcgYW5kCitjbGFzc2lmaWNhdGlvbiBpbiBvbmUgcGxhY2UsIHBvc3NpYmx5IGhhdmluZyB0byBtYXRjaCBhIHBhY2tldCBqdXN0IG9uY2UsIGFuZCBvbgordGhlIG90aGVyIHVzZXJzIGZhbWlsaWFyIHdpdGgKKy5CUiBpcHRhYmxlcyAiIGJ1dCBub3QgIiB0Yword2lsbCBoYXZlIGEgbGVzcyBoYXJkIHRpbWUgYWRkaW5nIFFvUyB0byB0aGVpciBzZXR1cHMuCisuU0ggT1BUSU9OUworLlRQCisuQkkgY2xhc3NpZCAiIENMQVNTSUQiCitQdXNoIG1hdGNoaW5nIHBhY2tldHMgdG8gdGhlIGNsYXNzIGlkZW50aWZpZWQgYnkKKy5JUiBDTEFTU0lEIC4KKy5UUAorLkJJIGFjdGlvbiAiIEFDVElPTl9TUEVDIgorQXBwbHkgYW4gYWN0aW9uIGZyb20gdGhlIGdlbmVyaWMgYWN0aW9ucyBmcmFtZXdvcmsgb24gbWF0Y2hpbmcgcGFja2V0cy4KKy5TSCBFWEFNUExFUworVGFrZSBlLmcuIHRoZSBmb2xsb3dpbmcgdGMgZmlsdGVyIHN0YXRlbWVudDoKKworLlJTCisuRVgKK3RjIGZpbHRlciBhZGQgLi4uIGhhbmRsZSA2IGZ3IGNsYXNzaWQgMToxCisuRUUKKy5SRQorCit3aWxsIG1hdGNoIGlmIHRoZSBwYWNrZXQncworLkIgZndtYXJrCit2YWx1ZSBpcworLkJSIDYgLgorVGhpcyBpcyBhIHNhbXBsZQorLkIgaXB0YWJsZXMKK3N0YXRlbWVudCBtYXJraW5nIHBhY2tldHMgY29taW5nIGluIG9uIGV0aDA6CisKKy5SUworLkVYCitpcHRhYmxlcyAtdCBtYW5nbGUgLUEgUFJFUk9VVElORyAtaSBldGgwIC1qIE1BUksgLS1zZXQtbWFyayA2CisuRUUKKy5SRQorLlNIIFNFRSBBTFNPCisuQlIgdGMgKDgpLAorLkJSIGlwdGFibGVzICg4KSwKKy5CUiBpcHRhYmxlcy1leHRlbnNpb25zICg4KQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWFuL21hbjgvdGMtaGZzYy44IGIvaXByb3V0ZTIvbWFuL21hbjgvdGMtaGZzYy44Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NDQxMTgKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9tYW4vbWFuOC90Yy1oZnNjLjgKQEAgLTAsMCArMSw2MSBAQAorLlRIIEhGU0MgOCAiMzEgT2N0b2JlciAyMDExIiBpcHJvdXRlMiBMaW51eAorLgorLlNIIE5BTUUKK0hGU0MgXC0gSGllcmFyY2hpY2FsIEZhaXIgU2VydmljZSBDdXJ2ZSdzIGNvbnRyb2wgdW5kZXIgbGludXgKKy4KKy5TSCBTWU5PUFNJUworLm5mCit0YyBxZGlzYyBhZGQgLi4uIGhmc2MgWyBcZkJkZWZhdWx0XGZSIENMQVNTSUQgXQorCit0YyBjbGFzcyBhZGQgLi4uIGhmc2MgWyBbIFxmQnJ0XGZSIFNDIF0gWyBcZkJsc1xmUiBTQyBdIHwgWyBcZkJzY1xmUiBTQyBdIF0gWyBcZkJ1bFxmUiBTQyBdCisKK1xmQnJ0XGZSIDogcmVhbHRpbWUgc2VydmljZSBjdXJ2ZQorXGZCbHNcZlIgOiBsaW5rc2hhcmUgc2VydmljZSBjdXJ2ZQorXGZCc2NcZlIgOiBydCtscyBzZXJ2aWNlIGN1cnZlCitcZkJ1bFxmUiA6IHVwcGVybGltaXQgc2VydmljZSBjdXJ2ZQorCitcKGJ1IGF0IGxlYXN0IG9uZSBvZiBcZkJydFxmUiwgXGZCbHNcZlIgb3IgXGZCc2NcZlIgbXVzdCBiZSBzcGVjaWZpZWQKK1woYnUgXGZCdWxcZlIgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIHdpdGggXGZCbHNcZlIgb3IgXGZCc2NcZlIKKy4KKy5JUCAiU0MgOj0gWyBbIFxmQm0xXGZSIEJQUyBdIFxmQmRcZlIgU0VDIF0gXGZCbTJcZlIgQlBTIgorXGZCbTFcZlIgOiBzbG9wZSBvZiB0aGUgZmlyc3Qgc2VnbWVudAorXGZCZFxmUiAgOiB4XC1jb29yZGluYXRlIG9mIGludGVyc2VjdGlvbgorXGZCbTJcZlIgOiBzbG9wZSBvZiB0aGUgc2Vjb25kIHNlZ21lbnQKKy5QUAorLklQICJTQyA6PSBbIFsgXGZCdW1heFxmUiBCWVRFIF0gXGZCZG1heFxmUiBTRUMgXSBcZkJyYXRlXGZSIEJQUyIKK1xmQnVtYXhcZlIgOiBtYXhpbXVtIHVuaXQgb2Ygd29yaworXGZCZG1heFxmUiA6IG1heGltdW0gZGVsYXkKK1xmQnJhdGVcZlIgOiByYXRlCisuUFAKKy5maQorRm9yIGRlc2NyaXB0aW9uIG9mIEJZVEUsIEJQUyBhbmQgU0VDIFwtIHBsZWFzZSBzZWUgXGZCVU5JVFNcZlIKK3NlY3Rpb24gb2YgXGZCdGNcZlIoOCkuCisuCisuU0ggREVTQ1JJUFRJT04gKHFkaXNjKQorSEZTQyBxZGlzYyBoYXMgb25seSBvbmUgb3B0aW9uYWwgcGFyYW1ldGVyIFwtIFxmQmRlZmF1bHRcZlIuIENMQVNTSUQgc3BlY2lmaWVzCit0aGUgbWlub3IgcGFydCBvZiB0aGUgZGVmYXVsdCBjbGFzc2lkLCB3aGVyZSBwYWNrZXRzIG5vdCBjbGFzc2lmaWVkIGJ5IG90aGVyCittZWFucyAoZS5nLiB1MzIgZmlsdGVyLCBDTEFTU0lGWSB0YXJnZXQgb2YgaXB0YWJsZXMpIHdpbGwgYmUgZW5xdWV1ZWQuIElmCitcZkJkZWZhdWx0XGZSIGlzIG5vdCBzcGVjaWZpZWQsIHVuY2xhc3NpZmllZCBwYWNrZXRzIHdpbGwgYmUgZHJvcHBlZC4KKy4KKy5TSCBERVNDUklQVElPTiAoY2xhc3MpCitIRlNDIGNsYXNzIGlzIHVzZWQgdG8gY3JlYXRlIGEgY2xhc3MgaGllcmFyY2h5IGZvciBIRlNDIHNjaGVkdWxlci4gRm9yCitleHBsYW5hdGlvbiBvZiB0aGUgYWxnb3JpdGhtLCBhbmQgdGhlIG1lYW5pbmcgYmVoaW5kIFxmQnJ0XGZSLCBcZkJsc1xmUiwKK1xmQnNjXGZSIGFuZCBcZkJ1bFxmUiBzZXJ2aWNlIGN1cnZlcyBcLSBwbGVhc2UgcmVmZXIgdG8gXGZCdGNcLWhmc2NcZlIoNykuCisKK0FzIHlvdSBjYW4gc2VlIGluIFxmQlNZTk9QU0lTXGZSLCBzZXJ2aWNlIGN1cnZlIChTQykgY2FuIGJlIHNwZWNpZmllZCBpbiB0d28KK3dheXMuIEVpdGhlciBhcyBtYXhpbXVtIGRlbGF5IGZvciBjZXJ0YWluIGFtb3VudCBvZiB3b3JrLCBvciBhcyBhIGJhbmR3aWR0aAorYXNzaWduZWQgZm9yIGNlcnRhaW4gYW1vdW50IG9mIHRpbWUuIE9idmlvdXNseSwgXGZCbTFcZlIgaXMgc2ltcGx5CitcZkJ1bWF4XGZSL1xmQmRtYXhcZlIuCisKK0JvdGggXGZCbTJcZlIgYW5kIFxmQnJhdGVcZlIgYXJlIG1hbmRhdG9yeS4gSWYgeW91IG9taXQgb3RoZXIKK3BhcmFtZXRlcnMsIHlvdSB3aWxsIHNwZWNpZnkgbGluZWFyIHNlcnZpY2UgY3VydmUuCisuCisuU0ggIlNFRSBBTFNPIgorLgorXGZCdGNcZlIoOCksIFxmQnRjXC1oZnNjXGZSKDcpLCBcZkJ0Y1wtc3RhYlxmUig4KQorCitQbGVhc2UgZGlyZWN0IGJ1Z3JlcG9ydHMgYW5kIHBhdGNoZXMgdG86IDxuZXQuLi5Admdlci5rZXJuZWwub3JnPgorLgorLlNIICJBVVRIT1IiCisuCitNYW5wYWdlIGNyZWF0ZWQgYnkgTWljaGFsIFNvbHR5cyAoc29sLi4uQHppdS5pbmZvKQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWFuL21hbjgvdGMtaHRiLjggYi9pcHJvdXRlMi9tYW4vbWFuOC90Yy1odGIuOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTMxMGY0Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbWFuL21hbjgvdGMtaHRiLjgKQEAgLTAsMCArMSwxNDggQEAKKy5USCBIVEIgOCAiMTAgSmFudWFyeSAyMDAyIiAiaXByb3V0ZTIiICJMaW51eCIKKy5TSCBOQU1FCitIVEIgXC0gSGllcmFyY2h5IFRva2VuIEJ1Y2tldAorLlNIIFNZTk9QU0lTCisuQiB0YyBxZGlzYyAuLi4gZGV2CitkZXYKKy5CICAoIHBhcmVudAorY2xhc3NpZAorLkIgfCByb290KSBbIGhhbmRsZQorbWFqb3I6CisuQiBdIGh0YiBbIGRlZmF1bHQKK21pbm9yLWlkCisuQiBdCisKKy5CIHRjIGNsYXNzIC4uLiBkZXYKK2RldgorLkIgcGFyZW50CittYWpvcjpbbWlub3JdCisuQiBbIGNsYXNzaWQKK21ham9yOm1pbm9yCisuQiBdIGh0YiByYXRlCityYXRlCisuQiBbIGNlaWwKK3JhdGUKKy5CIF0gYnVyc3QKK2J5dGVzCisuQiBbIGNidXJzdAorYnl0ZXMKKy5CIF0gWyBwcmlvCitwcmlvcml0eQorLkIgXQorCisuU0ggREVTQ1JJUFRJT04KK0hUQiBpcyBtZWFudCBhcyBhIG1vcmUgdW5kZXJzdGFuZGFibGUgYW5kIGludHVpdGl2ZSByZXBsYWNlbWVudCBmb3IKK3RoZSBDQlEgcWRpc2MgaW4gTGludXguIEJvdGggQ0JRIGFuZCBIVEIgaGVscCB5b3UgdG8gY29udHJvbCB0aGUgdXNlCitvZiB0aGUgb3V0Ym91bmQgYmFuZHdpZHRoIG9uIGEgZ2l2ZW4gbGluay4gQm90aCBhbGxvdyB5b3UgdG8gdXNlIG9uZQorcGh5c2ljYWwgbGluayB0byBzaW11bGF0ZSBzZXZlcmFsIHNsb3dlciBsaW5rcyBhbmQgdG8gc2VuZCBkaWZmZXJlbnQKK2tpbmRzIG9mIHRyYWZmaWMgb24gZGlmZmVyZW50IHNpbXVsYXRlZCBsaW5rcy4gSW4gYm90aCBjYXNlcywgeW91IGhhdmUKK3RvIHNwZWNpZnkgaG93IHRvIGRpdmlkZSB0aGUgcGh5c2ljYWwgbGluayBpbnRvIHNpbXVsYXRlZCBsaW5rcyBhbmQKK2hvdyB0byBkZWNpZGUgd2hpY2ggc2ltdWxhdGVkIGxpbmsgdG8gdXNlIGZvciBhIGdpdmVuIHBhY2tldCB0byBiZSBzZW50LgorCitVbmxpa2UgQ0JRLCBIVEIgc2hhcGVzIHRyYWZmaWMgYmFzZWQgb24gdGhlIFRva2VuIEJ1Y2tldCBGaWx0ZXIgYWxnb3JpdGhtCit3aGljaCBkb2VzIG5vdCBkZXBlbmQgb24gaW50ZXJmYWNlIGNoYXJhY3RlcmlzdGljcyBhbmQgc28gZG9lcyBub3QgbmVlZCB0bwora25vdyB0aGUgdW5kZXJseWluZyBiYW5kd2lkdGggb2YgdGhlIG91dGdvaW5nIGludGVyZmFjZS4KKworLlNIIFNIQVBJTkcgQUxHT1JJVEhNCitTaGFwaW5nIHdvcmtzIGFzIGRvY3VtZW50ZWQgaW4KKy5CIHRjLXRiZiAoOCkuCisKKy5TSCBDTEFTU0lGSUNBVElPTgorV2l0aGluIHRoZSBvbmUgSFRCIGluc3RhbmNlIG1hbnkgY2xhc3NlcyBtYXkgZXhpc3QuIEVhY2ggb2YgdGhlc2UgY2xhc3NlcworY29udGFpbnMgYW5vdGhlciBxZGlzYywgYnkgZGVmYXVsdAorLkJSIHRjLXBmaWZvICg4KS4KKworV2hlbiBlbnF1ZXVlaW5nIGEgcGFja2V0LCBIVEIgc3RhcnRzIGF0IHRoZSByb290IGFuZCB1c2VzIHZhcmlvdXMgbWV0aG9kcyB0bworZGV0ZXJtaW5lIHdoaWNoIGNsYXNzIHNob3VsZCByZWNlaXZlIHRoZSBkYXRhLgorCitJbiB0aGUgYWJzZW5jZSBvZiB1bmNvbW1vbiBjb25maWd1cmF0aW9uIG9wdGlvbnMsIHRoZSBwcm9jZXNzIGlzIHJhdGhlciBlYXN5LgorQXQgZWFjaCBub2RlIHdlIGxvb2sgZm9yIGFuIGluc3RydWN0aW9uLCBhbmQgdGhlbiBnbyB0byB0aGUgY2xhc3MgdGhlCitpbnN0cnVjdGlvbiByZWZlcnMgdXMgdG8uIElmIHRoZSBjbGFzcyBmb3VuZCBpcyBhIGJhcnJlbiBsZWFmLW5vZGUgKHdpdGhvdXQKK2NoaWxkcmVuKSwgd2UgZW5xdWV1ZSB0aGUgcGFja2V0IHRoZXJlLiBJZiBpdCBpcyBub3QgeWV0IGEgbGVhZiBub2RlLCB3ZSBkbwordGhlIHdob2xlIHRoaW5nIG92ZXIgYWdhaW4gc3RhcnRpbmcgZnJvbSB0aGF0IG5vZGUuCisKK1RoZSBmb2xsb3dpbmcgYWN0aW9ucyBhcmUgcGVyZm9ybWVkLCBpbiBvcmRlciBhdCBlYWNoIG5vZGUgd2UgdmlzaXQsIHVudGlsIG9uZQorc2VuZHMgdXMgdG8gYW5vdGhlciBub2RlLCBvciB0ZXJtaW5hdGVzIHRoZSBwcm9jZXNzLgorLlRQCisoaSkKK0NvbnN1bHQgZmlsdGVycyBhdHRhY2hlZCB0byB0aGUgY2xhc3MuIElmIHNlbnQgdG8gYSBsZWFmbm9kZSwgd2UgYXJlIGRvbmUuCitPdGhlcndpc2UsIHJlc3RhcnQuCisuVFAKKyhpaSkKK0lmIG5vbmUgb2YgdGhlIGFib3ZlIHJldHVybmVkIHdpdGggYW4gaW5zdHJ1Y3Rpb24sIGVucXVldWUgYXQgdGhpcyBub2RlLgorLlAKK1RoaXMgYWxnb3JpdGhtIG1ha2VzIHN1cmUgdGhhdCBhIHBhY2tldCBhbHdheXMgZW5kcyB1cCBzb21ld2hlcmUsIGV2ZW4gd2hpbGUKK3lvdSBhcmUgYnVzeSBidWlsZGluZyB5b3VyIGNvbmZpZ3VyYXRpb24uCisKKy5TSCBMSU5LIFNIQVJJTkcgQUxHT1JJVEhNCitGSVhNRQorCisuU0ggUURJU0MKK1RoZSByb290IG9mIGEgSFRCIHFkaXNjIGNsYXNzIHRyZWUgaGFzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKworLlRQCitwYXJlbnQgbWFqb3I6bWlub3IgfCByb290CitUaGlzIG1hbmRhdG9yeSBwYXJhbWV0ZXIgZGV0ZXJtaW5lcyB0aGUgcGxhY2Ugb2YgdGhlIEhUQiBpbnN0YW5jZSwgZWl0aGVyIGF0IHRoZQorLkIgcm9vdAorb2YgYW4gaW50ZXJmYWNlIG9yIHdpdGhpbiBhbiBleGlzdGluZyBjbGFzcy4KKy5UUAoraGFuZGxlIG1ham9yOgorTGlrZSBhbGwgb3RoZXIgcWRpc2NzLCB0aGUgSFRCIGNhbiBiZSBhc3NpZ25lZCBhIGhhbmRsZS4gU2hvdWxkIGNvbnNpc3Qgb25seQorb2YgYSBtYWpvciBudW1iZXIsIGZvbGxvd2VkIGJ5IGEgY29sb24uIE9wdGlvbmFsLCBidXQgdmVyeSB1c2VmdWwgaWYgY2xhc3Nlcword2lsbCBiZSBnZW5lcmF0ZWQgd2l0aGluIHRoaXMgcWRpc2MuCisuVFAKK2RlZmF1bHQgbWlub3ItaWQKK1VuY2xhc3NpZmllZCB0cmFmZmljIGdldHMgc2VudCB0byB0aGUgY2xhc3Mgd2l0aCB0aGlzIG1pbm9yLWlkLgorCisuU0ggQ0xBU1NFUworQ2xhc3NlcyBoYXZlIGEgaG9zdCBvZiBwYXJhbWV0ZXJzIHRvIGNvbmZpZ3VyZSB0aGVpciBvcGVyYXRpb24uCisKKy5UUAorcGFyZW50IG1ham9yOm1pbm9yCitQbGFjZSBvZiB0aGlzIGNsYXNzIHdpdGhpbiB0aGUgaGllcmFyY2h5LiBJZiBhdHRhY2hlZCBkaXJlY3RseSB0byBhIHFkaXNjCithbmQgbm90IHRvIGFub3RoZXIgY2xhc3MsIG1pbm9yIGNhbiBiZSBvbWl0dGVkLiBNYW5kYXRvcnkuCisuVFAKK2NsYXNzaWQgbWFqb3I6bWlub3IKK0xpa2UgcWRpc2NzLCBjbGFzc2VzIGNhbiBiZSBuYW1lZC4gVGhlIG1ham9yIG51bWJlciBtdXN0IGJlIGVxdWFsIHRvIHRoZQorbWFqb3IgbnVtYmVyIG9mIHRoZSBxZGlzYyB0byB3aGljaCBpdCBiZWxvbmdzLiBPcHRpb25hbCwgYnV0IG5lZWRlZCBpZiB0aGlzCitjbGFzcyBpcyBnb2luZyB0byBoYXZlIGNoaWxkcmVuLgorLlRQCitwcmlvIHByaW9yaXR5CitJbiB0aGUgcm91bmQtcm9iaW4gcHJvY2VzcywgY2xhc3NlcyB3aXRoIHRoZSBsb3dlc3QgcHJpb3JpdHkgZmllbGQgYXJlIHRyaWVkCitmb3IgcGFja2V0cyBmaXJzdC4gTWFuZGF0b3J5LgorCisuVFAKK3JhdGUgcmF0ZQorTWF4aW11bSByYXRlIHRoaXMgY2xhc3MgYW5kIGFsbCBpdHMgY2hpbGRyZW4gYXJlIGd1YXJhbnRlZWQuIE1hbmRhdG9yeS4KKworLlRQCitjZWlsIHJhdGUKK01heGltdW0gcmF0ZSBhdCB3aGljaCBhIGNsYXNzIGNhbiBzZW5kLCBpZiBpdHMgcGFyZW50IGhhcyBiYW5kd2lkdGggdG8gc3BhcmUuCitEZWZhdWx0cyB0byB0aGUgY29uZmlndXJlZCByYXRlLCB3aGljaCBpbXBsaWVzIG5vIGJvcnJvd2luZworCisuVFAKK2J1cnN0IGJ5dGVzCitBbW91bnQgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgYnVyc3QgYXQKKy5CIGNlaWwKK3NwZWVkLCBpbiBleGNlc3Mgb2YgdGhlIGNvbmZpZ3VyZWQKKy5CIHJhdGUuCitTaG91bGQgYmUgYXQgbGVhc3QgYXMgaGlnaCBhcyB0aGUgaGlnaGVzdCBidXJzdCBvZiBhbGwgY2hpbGRyZW4uCisKKy5UUAorY2J1cnN0IGJ5dGVzCitBbW91bnQgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgYnVyc3QgYXQgJ2luZmluaXRlJyBzcGVlZCwgaW4gb3RoZXIgd29yZHMsIGFzIGZhc3QKK2FzIHRoZSBpbnRlcmZhY2UgY2FuIHRyYW5zbWl0IHRoZW0uIEZvciBwZXJmZWN0IGV2ZW5pbmcgb3V0LCBzaG91bGQgYmUgZXF1YWwgdG8gYXQgbW9zdCBvbmUgYXZlcmFnZQorcGFja2V0LiBTaG91bGQgYmUgYXQgbGVhc3QgYXMgaGlnaCBhcyB0aGUgaGlnaGVzdCBjYnVyc3Qgb2YgYWxsIGNoaWxkcmVuLgorCisuU0ggTk9URVMKK0R1ZSB0byBVbml4IHRpbWluZyBjb25zdHJhaW50cywgdGhlIG1heGltdW0gY2VpbCByYXRlIGlzIG5vdCBpbmZpbml0ZSBhbmQgbWF5IGluIGZhY3QgYmUgcXVpdGUgbG93LiBPbiBJbnRlbCwKK3RoZXJlIGFyZSAxMDAgdGltZXIgZXZlbnRzIHBlciBzZWNvbmQsIHRoZSBtYXhpbXVtIHJhdGUgaXMgdGhhdCByYXRlIGF0IHdoaWNoICdidXJzdCcgYnl0ZXMgYXJlIHNlbnQgZWFjaCB0aW1lciB0aWNrLgorRnJvbSB0aGlzLCB0aGUgbWluaW11bSBidXJzdCBzaXplIGZvciBhIHNwZWNpZmllZCByYXRlIGNhbiBiZSBjYWxjdWxhdGVkLiBGb3IgaTM4NiwgYSAxMG1iaXQgcmF0ZSByZXF1aXJlcyBhIDEyIGtpbG9ieXRlCitidXJzdCBhcyAxMDAqMTJrYio4IGVxdWFscyAxMG1iaXQuCisKKy5TSCBTRUUgQUxTTworLkJSIHRjICg4KQorLlAKK0hUQiB3ZWJzaXRlOiBodHRwOi8vbHV4aWsuY2RpLmN6L35kZXZpay9xb3MvaHRiLworLlNIIEFVVEhPUgorTWFydGluIERldmVyYSA8ZGV2aWtAY2RpLmN6Pi4gVGhpcyBtYW5wYWdlIG1haW50YWluZWQgYnkgYmVydCBodWJlcnQgPGFodUBkczlhLm5sPgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWFuL21hbjgvdGMtbXFwcmlvLjggYi9pcHJvdXRlMi9tYW4vbWFuOC90Yy1tcXByaW8uOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTFkMzA1Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbWFuL21hbjgvdGMtbXFwcmlvLjgKQEAgLTAsMCArMSwxMTIgQEAKKy5USCBNUVBSSU8gOCAiMjQgU2VwdCAyMDEzIiAiaXByb3V0ZTIiICJMaW51eCIKKy5TSCBOQU1FCitNUVBSSU8gXC0gTXVsdGlxdWV1ZSBQcmlvcml0eSBRZGlzYyAoT2ZmbG9hZGVkIEhhcmR3YXJlIFFPUykKKy5TSCBTWU5PUFNJUworLkIgdGMgcWRpc2MgLi4uIGRldgorZGV2CisuQiAgKCBwYXJlbnQKK2NsYXNzaWQKKy5CIHwgcm9vdCkgWyBoYW5kbGUKK21ham9yOgorLkIgXSBtcXByaW8gWyBudW10YwordGNzCisuQiBdIFsgbWFwCitQMCBQMSBQMi4uLgorLkIgXSBbIHF1ZXVlcworY291bnQxQG9mZnNldDEgY291bnQyQG9mZnNldDIgLi4uCisuQiBdIFsgaHcKKzF8MAorLkIgXQorCisuU0ggREVTQ1JJUFRJT04KK1RoZSBNUVBSSU8gcWRpc2MgaXMgYSBzaW1wbGUgcXVldWluZyBkaXNjaXBsaW5lIHRoYXQgYWxsb3dzIG1hcHBpbmcKK3RyYWZmaWMgZmxvd3MgdG8gaGFyZHdhcmUgcXVldWUgcmFuZ2VzIHVzaW5nIHByaW9yaXRpZXMgYW5kIGEgY29uZmlndXJhYmxlCitwcmlvcml0eSB0byB0cmFmZmljIGNsYXNzIG1hcHBpbmcuIEEgdHJhZmZpYyBjbGFzcyBpbiB0aGlzIGNvbnRleHQgaXMKK2Egc2V0IG9mIGNvbnRpZ3VvdXMgcWRpc2MgY2xhc3NlcyB3aGljaCBtYXAgMToxIHRvIGEgc2V0IG9mIGhhcmR3YXJlCitleHBvc2VkIHF1ZXVlcy4KKworQnkgZGVmYXVsdCB0aGUgcWRpc2MgYWxsb2NhdGVzIGEgcGZpZm8gcWRpc2MgKHBhY2tldCBsaW1pdGVkIGZpcnN0IGluLCBmaXJzdAorb3V0IHF1ZXVlKSBwZXIgVFggcXVldWUgZXhwb3NlZCBieSB0aGUgbG93ZXIgbGF5ZXIgZGV2aWNlLiBPdGhlciBxdWV1aW5nCitkaXNjaXBsaW5lcyBtYXkgYmUgYWRkZWQgc3Vic2VxdWVudGx5LiBQYWNrZXRzIGFyZSBlbnF1ZXVlZCB1c2luZyB0aGUKKy5CIG1hcAorcGFyYW1ldGVyIGFuZCBoYXNoZWQgYWNyb3NzIHRoZSBpbmRpY2F0ZWQgcXVldWVzIGluIHRoZQorLkIgb2Zmc2V0CithbmQKKy5CIGNvdW50LgorQnkgZGVmYXVsdCB0aGVzZSBwYXJhbWV0ZXJzIGFyZSBjb25maWd1cmVkIGJ5IHRoZSBoYXJkd2FyZQorZHJpdmVyIHRvIG1hdGNoIHRoZSBoYXJkd2FyZSBRT1Mgc3RydWN0dXJlcy4KKworRW5hYmxlZCBoYXJkd2FyZSBjYW4gcHJvdmlkZSBoYXJkd2FyZSBRT1Mgd2l0aCB0aGUgYWJpbGl0eSB0byBzdGVlcgordHJhZmZpYyBmbG93cyB0byBkZXNpZ25hdGVkIHRyYWZmaWMgY2xhc3NlcyBwcm92aWRlZCBieSB0aGlzIHFkaXNjLgorQ29uZmlndXJpbmcgdGhlIGhhcmR3YXJlIGJhc2VkIFFPUyBtZWNoYW5pc20gaXMgb3V0c2lkZSB0aGUgc2NvcGUgb2YKK3RoaXMgcWRpc2MuIFRvb2xzIHN1Y2ggYXMKKy5CIGxsZHBhZAorYW5kCisuQiBldGh0b29sCitleGlzdCB0byBwcm92aWRlIHRoaXMgZnVuY3Rpb25hbGl0eS4gQWxzbyBmdXJ0aGVyIHFkaXNjcyBtYXkgYmUgYWRkZWQKK3RvIHRoZSBjbGFzc2VzIG9mIE1RUFJJTyB0byBjcmVhdGUgbW9yZSBjb21wbGV4IGNvbmZpZ3VyYXRpb25zLgorCisuU0ggQUxHT1JJVEhNCitPbiBjcmVhdGlvbiB3aXRoICd0YyBxZGlzYyBhZGQnLCBlaWdodCB0cmFmZmljIGNsYXNzZXMgYXJlIGNyZWF0ZWQgbWFwcGluZworcHJpb3JpdGllcyAwLi43IHRvIHRyYWZmaWMgY2xhc3NlcyAwLi43IGFuZCBwcmlvcml0aWVzIGdyZWF0ZXIgdGhhbiA3IHRvCit0cmFmZmljIGNsYXNzIDAuIFRoaXMgcmVxdWlyZXMgYmFzZSBkcml2ZXIgc3VwcG9ydCBhbmQgdGhlIGNyZWF0aW9uIHdpbGwKK2ZhaWwgb24gZGV2aWNlcyB0aGF0IGRvIG5vdCBzdXBwb3J0IGhhcmR3YXJlIFFPUyBzY2hlbWVzLgorCitUaGVzZSBkZWZhdWx0cyBjYW4gYmUgb3ZlcnJpZGRlbiB1c2luZyB0aGUgcWRpc2MgcGFyYW1ldGVycy4gUHJvdmlkaW5nCit0aGUgJ2h3IDAnIGZsYWcgYWxsb3dzIHNvZnR3YXJlIHRvIHJ1biB3aXRob3V0IGhhcmR3YXJlIGNvb3JkaW5hdGlvbi4KKworSWYgaGFyZHdhcmUgY29vcmRpbmF0aW9uIGlzIGJlaW5nIHVzZWQgYW5kIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgdGhhdAordGhlIGhhcmR3YXJlIGNhbiBub3Qgc3VwcG9ydCB0aGVuIGFuIGVycm9yIGlzIHJldHVybmVkLiBGb3IgbWFueSB1c2VycworaGFyZHdhcmUgZGVmYXVsdHMgc2hvdWxkIHdvcmsgcmVhc29uYWJseSB3ZWxsLgorCitBcyBvbmUgc3BlY2lmaWMgZXhhbXBsZSBudW1lcm91cyBFdGhlcm5ldCBjYXJkcyBzdXBwb3J0IHRoZSA4MDIuMVEKK2xpbmsgc3RyaWN0IHByaW9yaXR5IHRyYW5zbWlzc2lvbiBzZWxlY3Rpb24gYWxnb3JpdGhtIChUU0EpLiBNUVBSSU8KK2VuYWJsZWQgaGFyZHdhcmUgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgY2xhc3NpZmljYXRpb24gbWV0aG9kcyBiZWxvdworY2FuIHByb3ZpZGUgaGFyZHdhcmUgb2ZmbG9hZGVkIHN1cHBvcnQgZm9yIHRoaXMgVFNBLgorCisuU0ggQ0xBU1NJRklDQVRJT04KK011bHRpcGxlIG1ldGhvZHMgYXJlIGF2YWlsYWJsZSB0byBzZXQgdGhlIFNLQiBwcmlvcml0eSB3aGljaCBNUVBSSU8KK3VzZXMgdG8gc2VsZWN0IHdoaWNoIHRyYWZmaWMgY2xhc3MgdG8gZW5xdWV1ZSB0aGUgcGFja2V0LgorLlRQCitGcm9tIHVzZXIgc3BhY2UKK0EgcHJvY2VzcyB3aXRoIHN1ZmZpY2llbnQgcHJpdmlsZWdlcyBjYW4gZW5jb2RlIHRoZSBkZXN0aW5hdGlvbiBjbGFzcworZGlyZWN0bHkgd2l0aCBTT19QUklPUklUWSwgc2VlCisuQlIgc29ja2V0KDcpLgorLlRQCit3aXRoIGlwdGFibGVzL25mdGFibGVzCitBbiBpcHRhYmxlcy9uZnRhYmxlcyBydWxlIGNhbiBiZSBjcmVhdGVkIHRvIG1hdGNoIHRyYWZmaWMgZmxvd3MgYW5kCitzZXQgdGhlIHByaW9yaXR5LgorLkJSIGlwdGFibGVzKDgpCisuVFAKK3dpdGggbmV0X3ByaW8gY2dyb3VwcworVGhlIG5ldF9wcmlvIGNncm91cCBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIHByaW9yaXR5IG9mIGFsbCBzb2NrZXRzCitiZWxvbmcgdG8gYW4gYXBwbGljYXRpb24uIFNlZSBrZXJuZWwgYW5kIGNncm91cCBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgorCisuU0ggUURJU0MgUEFSQU1FVEVSUworLlRQCitudW1fdGMKK051bWJlciBvZiB0cmFmZmljIGNsYXNzZXMgdG8gdXNlLiBVcCB0byAxNiBjbGFzc2VzIHN1cHBvcnRlZC4KKworLlRQCittYXAKK1RoZSBwcmlvcml0eSB0byB0cmFmZmljIGNsYXNzIG1hcC4gTWFwcyBwcmlvcml0aWVzIDAuLjE1IHRvIGEgc3BlY2lmaWVkCit0cmFmZmljIGNsYXNzLgorCisuVFAKK3F1ZXVlcworUHJvdmlkZSBjb3VudCBhbmQgb2Zmc2V0IG9mIHF1ZXVlIHJhbmdlIGZvciBlYWNoIHRyYWZmaWMgY2xhc3MuIEluIHRoZQorZm9ybWF0LAorLkIgY291bnRAb2Zmc2V0LgorUXVldWUgcmFuZ2VzIGZvciBlYWNoIHRyYWZmaWMgY2xhc3NlcyBjYW5ub3Qgb3ZlcmxhcCBhbmQgbXVzdCBiZSBhCitjb250aWd1b3VzIHJhbmdlIG9mIHF1ZXVlcy4KKworLlRQCitodworU2V0IHRvCisuQiAxCit0byB1c2UgaGFyZHdhcmUgUU9TIGRlZmF1bHRzLiBTZXQgdG8KKy5CIDAKK3RvIG92ZXJyaWRlIGhhcmR3YXJlIGRlZmF1bHRzIHdpdGggdXNlciBzcGVjaWZpZWQgdmFsdWVzLgorCisuU0ggQVVUSE9SUworSm9obiBGYXN0YWJlbmQsIDxqb2huLnIuZmFzdGFiZW5kQGludGVsLmNvbT4KZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L3RjLW5ldGVtLjggYi9pcHJvdXRlMi9tYW4vbWFuOC90Yy1uZXRlbS44Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMTM4NGYKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9tYW4vbWFuOC90Yy1uZXRlbS44CkBAIC0wLDAgKzEsMTk4IEBACisuVEggTkVURU0gOCAiMjUgTm92ZW1iZXIgMjAxMSIgImlwcm91dGUyIiAiTGludXgiCisuU0ggTkFNRQorTmV0RW0gXC0gTmV0d29yayBFbXVsYXRvcgorLlNIIFNZTk9QU0lTCisuQiAidGMgcWRpc2MgLi4uIGRldiIKKy5JUiBERVZJQ0UgIiBdICIKKy5CUiAiYWRkIG5ldGVtIgorLkkgT1BUSU9OUworCisuSVIgT1BUSU9OUyAiIDo9IFsgIiBMSU1JVCAiIF0gWyAiIERFTEFZICIgXSBbICIgTE9TUyBcCisiIF0gWyAiIENPUlJVUFQgIiBdIFsgIiBEVVBMSUNBVElPTiAiIF0gWyAiIFJFT1JERVJJTkcgIiBdWyAiIFJBVEUgIiBdIgorCisuSVIgTElNSVQgIiA6PSAiCisuQiBsaW1pdAorLkkgcGFja2V0cworCisuSVIgREVMQVkgIiA6PSAiCisuQkkgZGVsYXkKKy5JUiBUSU1FICIgWyAiIEpJVFRFUiAiIFsgIiBDT1JSRUxBVElPTiAiIF1dXSIKKy5icgorICAgICAgIFsKKy5CUiBkaXN0cmlidXRpb24gIiB7ICJ1bmlmb3JtICIgfCAiIG5vcm1hbCAiIHwgIiBwYXJldG8gIiB8ICAiIHBhcmV0b25vcm1hbCAiIH0gXSIKKworLklSIExPU1MgIiA6PSAiCisuQlIgbG9zcyAiIHsgIgorLkJJIHJhbmRvbQorLklSIFBFUkNFTlQgIiBbICIgQ09SUkVMQVRJT04gIiBdICB8IgorLmJyCisuUkIgIiAgICAgICAgICAgICAgICIgc3RhdGUKKy5JUiBwMTMgIiBbICIgcDMxICIgWyAiIHAzMiAiIFsgIiBwMjMgIiBbICIgcDE0ICJdXV1dIHwiCisuYnIKKy5SQiAiICAgICAgICAgICAgICAgIiBnZW1vZGVsCisuSVIgcCAiIFsgIiByICIgWyAiIDEtaCAiIFsgIiAxLWsgIiBdXV0gfSAiCisuUkIgICIgWyAiIGVjbiAiIF0gIgorCisuSVIgQ09SUlVQVCAiIDo9ICIKKy5CIGNvcnJ1cHQKKy5JUiBQRVJDRU5UICIgWyAiIENPUlJFTEFUSU9OICIgXV0iCisKKy5JUiBEVVBMSUNBVElPTiAiIDo9ICIKKy5CIGR1cGxpY2F0ZQorLklSIFBFUkNFTlQgIiBbICIgQ09SUkVMQVRJT04gIiBdXSIKKworLklSIFJFT1JERVJJTkcgIiA6PSAiCisuQiByZW9yZGVyCisuSVIgUEVSQ0VOVCAiIFsgIiBDT1JSRUxBVElPTiAiIF0gWyAiCisuQiBnYXAKKy5JUiBESVNUQU5DRSAiIF0iCisKKy5JUiBSQVRFICIgOj0gIgorLkIgcmF0ZQorLklSIFJBVEUgIiBbICIgUEFDS0VUT1ZFUkhFQUQgIiBbICIgQ0VMTFNJWkUgIiBbICIgQ0VMTE9WRVJIRUFEICIgXV1dXSIKKworCisuU0ggREVTQ1JJUFRJT04KK05ldEVtIGlzIGFuIGVuaGFuY2VtZW50IG9mIHRoZSBMaW51eCB0cmFmZmljIGNvbnRyb2wgZmFjaWxpdGllcwordGhhdCBhbGxvdyB0byBhZGQgZGVsYXksIHBhY2tldCBsb3NzLCBkdXBsaWNhdGlvbiBhbmQgbW9yZSBvdGhlcgorY2hhcmFjdGVyaXN0aWNzIHRvIHBhY2tldHMgb3V0Z29pbmcgZnJvbSBhIHNlbGVjdGVkIG5ldHdvcmsKK2ludGVyZmFjZS4gTmV0RW0gaXMgYnVpbHQgdXNpbmcgdGhlIGV4aXN0aW5nIFF1YWxpdHkgT2YgU2VydmljZSAoUU9TKQorYW5kIERpZmZlcmVudGlhdGVkIFNlcnZpY2VzIChkaWZmc2VydikgZmFjaWxpdGllcyBpbiB0aGUgTGludXgKK2tlcm5lbC4KKworLlNIIG5ldGVtIE9QVElPTlMKK25ldGVtIGhhcyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKKy5TUyBsaW1pdCBwYWNrZXRzCisKK2xpbWl0cyB0aGUgZWZmZWN0IG9mIHNlbGVjdGVkIG9wdGlvbnMgdG8gdGhlIGluZGljYXRlZCBudW1iZXIgb2YgbmV4dCBwYWNrZXRzLgorCisuU1MgZGVsYXkKK2FkZHMgdGhlIGNob3NlbiBkZWxheSB0byB0aGUgcGFja2V0cyBvdXRnb2luZyB0byBjaG9zZW4gbmV0d29yayBpbnRlcmZhY2UuIFRoZQorb3B0aW9uYWwgcGFyYW1ldGVycyBhbGxvd3MgdG8gaW50cm9kdWNlIGEgZGVsYXkgdmFyaWF0aW9uIGFuZCBhIGNvcnJlbGF0aW9uLgorRGVsYXkgYW5kIGppdHRlciB2YWx1ZXMgYXJlIGV4cHJlc3NlZCBpbiBtcyB3aGlsZSBjb3JyZWxhdGlvbiBpcyBwZXJjZW50YWdlLgorCisuU1MgZGlzdHJpYnV0aW9uCithbGxvdyB0aGUgdXNlciB0byBjaG9vc2UgdGhlIGRlbGF5IGRpc3RyaWJ1dGlvbi4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQKK2Rpc3RyaWJ1dGlvbiBpcyBOb3JtYWwuIEFkZGl0aW9uYWwgcGFyYW1ldGVycyBhbGxvdyB0byBjb25zaWRlciBzaXR1YXRpb25zIGluCit3aGljaCBuZXR3b3JrIGhhcyB2YXJpYWJsZSBkZWxheXMgZGVwZW5kaW5nIG9uIHRyYWZmaWMgZmxvd3MgY29uY3VycmluZyBvbiB0aGUKK3NhbWUgcGF0aCwgdGhhdCBjYXVzZXMgc2V2ZXJhbCBkZWxheSBwZWFrcyBhbmQgYSB0YWlsLgorCisuU1MgbG9zcyByYW5kb20KK2FkZHMgYW4gaW5kZXBlbmRlbnQgbG9zcyBwcm9iYWJpbGl0eSB0byB0aGUgcGFja2V0cyBvdXRnb2luZyBmcm9tIHRoZSBjaG9zZW4KK25ldHdvcmsgaW50ZXJmYWNlLiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGFkZCBhIGNvcnJlbGF0aW9uLCBidXQgdGhpcyBvcHRpb24KK2lzIG5vdyBkZXByZWNhdGVkIGR1ZSB0byB0aGUgbm90aWNlZCBiYWQgYmVoYXZpb3IuCisKKy5TUyBsb3NzIHN0YXRlCithZGRzIHBhY2tldCBsb3NzZXMgYWNjb3JkaW5nIHRvIHRoZSA0LXN0YXRlIE1hcmtvdiB1c2luZyB0aGUgdHJhbnNpdGlvbgorcHJvYmFiaWxpdGllcyBhcyBpbnB1dCBwYXJhbWV0ZXJzLiBUaGUgcGFyYW1ldGVyIHAxMyBpcyBtYW5kYXRvcnkgYW5kIGlmIHVzZWQKK2Fsb25lIGNvcnJlc3BvbmRzIHRvIHRoZSBCZXJub3VsbGkgbW9kZWwuIFRoZSBvcHRpb25hbCBwYXJhbWV0ZXJzIGFsbG93cyB0bworZXh0ZW5kIHRoZSBtb2RlbCB0byAyLXN0YXRlIChwMzEpLCAzLXN0YXRlIChwMjMgYW5kIHAzMikgYW5kIDQtc3RhdGUgKHAxNCkuCitTdGF0ZSAxIGNvcnJlc3BvbmRzIHRvIGdvb2QgcmVjZXB0aW9uLCBTdGF0ZSA0IHRvIGluZGVwZW5kZW50IGxvc3NlcywgU3RhdGUgMwordG8gYnVyc3QgbG9zc2VzIGFuZCBTdGF0ZSAyIHRvIGdvb2QgcmVjZXB0aW9uIHdpdGhpbiBhIGJ1cnN0LgorCisuU1MgbG9zcyBnZW1vZGVsCithZGRzIHBhY2tldCBsb3NzZXMgYWNjb3JkaW5nIHRvIHRoZSBHaWxiZXJ0LUVsbGlvdCBsb3NzIG1vZGVsIG9yIGl0cyBzcGVjaWFsCitjYXNlcyAoR2lsYmVydCwgU2ltcGxlIEdpbGJlcnQgYW5kIEJlcm5vdWxsaSkuIFRvIHVzZSB0aGUgQmVybm91bGxpIG1vZGVsLCB0aGUKK29ubHkgbmVlZGVkIHBhcmFtZXRlciBpcyBwIHdoaWxlIHRoZSBvdGhlcnMgd2lsbCBiZSBzZXQgdG8gdGhlIGRlZmF1bHQKK3ZhbHVlcyByPTEtcCwgMS1oPTEgYW5kIDEtaz0wLiBUaGUgcGFyYW1ldGVycyBuZWVkZWQgZm9yIHRoZSBTaW1wbGUgR2lsYmVydAorbW9kZWwgYXJlIHR3byAocCBhbmQgciksIHdoaWxlIHRocmVlIHBhcmFtZXRlcnMgKHAsIHIsIDEtaCkgYXJlIG5lZWRlZCBmb3IgdGhlCitHaWxiZXJ0IG1vZGVsIGFuZCBmb3VyIChwLCByLCAxLWggYW5kIDEtaykgYXJlIG5lZWRlZCBmb3IgdGhlIEdpbGJlcnQtRWxsaW90Cittb2RlbC4gQXMga25vd24sIHAgYW5kIHIgYXJlIHRoZSB0cmFuc2l0aW9uIHByb2JhYmlsaXRpZXMgYmV0d2VlbiB0aGUgYmFkIGFuZAordGhlIGdvb2Qgc3RhdGVzLCAxLWggaXMgdGhlIGxvc3MgcHJvYmFiaWxpdHkgaW4gdGhlIGJhZCBzdGF0ZSBhbmQgMS1rIGlzIHRoZQorbG9zcyBwcm9iYWJpbGl0eSBpbiB0aGUgZ29vZCBzdGF0ZS4KKworLlNTIGVjbgorY2FuIGJlIHVzZWQgb3B0aW9uYWxseSB0byBtYXJrIHBhY2tldHMgaW5zdGVhZCBvZiBkcm9wcGluZyB0aGVtLiBBIGxvc3MgbW9kZWwKK2hhcyB0byBiZSB1c2VkIGZvciB0aGlzIHRvIGJlIGVuYWJsZWQuCisKKy5TUyBjb3JydXB0CithbGxvd3MgdGhlIGVtdWxhdGlvbiBvZiByYW5kb20gbm9pc2UgaW50cm9kdWNpbmcgYW4gZXJyb3IgaW4gYSByYW5kb20gcG9zaXRpb24KK2ZvciBhIGNob3NlbiBwZXJjZW50IG9mIHBhY2tldHMuIEl0IGlzIGFsc28gcG9zc2libGUgdG8gYWRkIGEgY29ycmVsYXRpb24KK3Rocm91Z2ggdGhlIHByb3BlciBwYXJhbWV0ZXIuCisKKy5TUyBkdXBsaWNhdGUKK3VzaW5nIHRoaXMgb3B0aW9uIHRoZSBjaG9zZW4gcGVyY2VudCBvZiBwYWNrZXRzIGlzIGR1cGxpY2F0ZWQgYmVmb3JlIHF1ZXVpbmcKK3RoZW0uIEl0IGlzIGFsc28gcG9zc2libGUgdG8gYWRkIGEgY29ycmVsYXRpb24gdGhyb3VnaCB0aGUgcHJvcGVyIHBhcmFtZXRlci4KKworLlNTIHJlb3JkZXIKK3RvIHVzZSByZW9yZGVyaW5nLCBhIGRlbGF5IG9wdGlvbiBtdXN0IGJlIHNwZWNpZmllZC4gVGhlcmUgYXJlIHR3byB3YXlzIHRvIHVzZQordGhpcyBvcHRpb24gKGFzc3VtaW5nICdkZWxheSAxMG1zJyBpbiB0aGUgb3B0aW9ucyBsaXN0KS4KKworLkIgInJlb3JkZXIgIgorLkkgMjUlIDUwJQorLkIgImdhcCIKKy5JIDUKKy5icgoraW4gdGhpcyBmaXJzdCBleGFtcGxlLCB0aGUgZmlyc3QgNCAoZ2FwIC0gMSkgcGFja2V0cyBhcmUgZGVsYXllZCBieSAxMG1zIGFuZAorc3Vic2VxdWVudCBwYWNrZXRzIGFyZSBzZW50IGltbWVkaWF0ZWx5IHdpdGggYSBwcm9iYWJpbGl0eSBvZiAwLjI1ICh3aXRoCitjb3JyZWxhdGlvbiBvZiA1MCUgKSBvciBkZWxheWVkIHdpdGggYSBwcm9iYWJpbGl0eSBvZiAwLjc1LiBBZnRlciBhIHBhY2tldCBpcworcmVvcmRlcmVkLCB0aGUgcHJvY2VzcyByZXN0YXJ0cyBpLmUuIHRoZSBuZXh0IDQgcGFja2V0cyBhcmUgZGVsYXllZCBhbmQKK3N1YnNlcXVlbnQgcGFja2V0cyBhcmUgc2VudCBpbW1lZGlhdGVseSBvciBkZWxheWVkIGJhc2VkIG9uIHJlb3JkZXJpbmcKK3Byb2JhYmlsaXR5LiBUbyBjYXVzZSBhIHJlcGVhdGFibGUgcGF0dGVybiB3aGVyZSBldmVyeSA1dGggcGFja2V0IGlzIHJlb3JkZXJlZAorcmVsaWFibHksIGEgcmVvcmRlciBwcm9iYWJpbGl0eSBvZiAxMDAlIGNhbiBiZSB1c2VkLgorCisuQiByZW9yZGVyCisuSSAyNSUgNTAlCisuYnIKK2luIHRoaXMgc2Vjb25kIGV4YW1wbGUgMjUlIG9mIHBhY2tldHMgYXJlIHNlbnQgaW1tZWRpYXRlbHkgKHdpdGggY29ycmVsYXRpb24gb2YKKzUwJSkgd2hpbGUgdGhlIG90aGVycyBhcmUgZGVsYXllZCBieSAxMCBtcy4KKworLlNTIHJhdGUKK2RlbGF5IHBhY2tldHMgYmFzZWQgb24gcGFja2V0IHNpemUgYW5kIGlzIGEgcmVwbGFjZW1lbnQgZm9yCisuSVIgVEJGIC4KK1JhdGUgY2FuIGJlCitzcGVjaWZpZWQgaW4gY29tbW9uIHVuaXRzIChlLmcuIDEwMGtiaXQpLiBPcHRpb25hbAorLkkgUEFDS0VUT1ZFUkhFQUQKKyhpbiBieXRlcykgc3BlY2lmeSBhbiBwZXIgcGFja2V0IG92ZXJoZWFkIGFuZCBjYW4gYmUgbmVnYXRpdmUuIEEgcG9zaXRpdmUgdmFsdWUgY2FuIGJlCit1c2VkIHRvIHNpbXVsYXRlIGFkZGl0aW9uYWwgbGluayBsYXllciBoZWFkZXJzLiBBIG5lZ2F0aXZlIHZhbHVlIGNhbiBiZSB1c2VkIHRvCithcnRpZmljaWFsIHN0cmlwIHRoZSBFdGhlcm5ldCBoZWFkZXIgKGUuZy4gLTE0KSBhbmQvb3Igc2ltdWxhdGUgYSBsaW5rIGxheWVyCitoZWFkZXIgY29tcHJlc3Npb24gc2NoZW1lLiBUaGUgdGhpcmQgcGFyYW1ldGVyIC0gYW4gdW5zaWduZWQgdmFsdWUgLSBzcGVjaWZ5Cit0aGUgY2VsbHNpemUuIENlbGxzaXplIGNhbiBiZSB1c2VkIHRvIHNpbXVsYXRlIGxpbmsgbGF5ZXIgc2NoZW1lcy4gQVRNIGZvcgorZXhhbXBsZSBoYXMgYW4gcGF5bG9hZCBjZWxsc2l6ZSBvZiA0OCBieXRlcyBhbmQgNSBieXRlIHBlciBjZWxsIGhlYWRlci4gSWYgYQorcGFja2V0IGlzIDUwIGJ5dGUgdGhlbiBBVE0gbXVzdCB1c2UgdHdvIGNlbGxzOiAyICogNDggYnl0ZXMgcGF5bG9hZCBpbmNsdWRpbmcgMgorKiA1IGJ5dGUgaGVhZGVyLCB0aHVzIGNvbnN1bWUgMTA2IGJ5dGUgb24gdGhlIHdpcmUuIFRoZSBsYXN0IG9wdGlvbmFsIHZhbHVlCisuSSBDRUxMT1ZFUkhFQUQKK2NhbiBiZSB1c2VkIHRvIHNwZWNpZnkgcGVyIGNlbGwgb3ZlcmhlYWQgLSBmb3Igb3VyIEFUTSBleGFtcGxlIDUuCisuSSBDRUxMT1ZFUkhFQUQKK2NhbiBiZSBuZWdhdGl2ZSwgYnV0IHVzZSBuZWdhdGl2ZSB2YWx1ZXMgd2l0aCBjYXV0aW9uLgorCitOb3RlIHRoYXQgcmF0ZSB0aHJvdHRsaW5nIGlzIGxpbWl0ZWQgYnkgc2V2ZXJhbCBmYWN0b3JzOiB0aGUga2VybmVsIGNsb2NrCitncmFudWxhcml0eSBhdm9pZCBhIHBlcmZlY3Qgc2hhcGluZyBhdCBhIHNwZWNpZmljIGxldmVsLiBUaGlzIHdpbGwgc2hvdyB1cCBpbgorYW4gYXJ0aWZpY2lhbCBwYWNrZXQgY29tcHJlc3Npb24gKGJ1cnN0cykuIEFub3RoZXIgaW5mbHVlbmNlIGZhY3RvciBhcmUgbmV0d29yaworYWRhcHRlciBidWZmZXJzIHdoaWNoIGNhbiBhbHNvIGFkZCBhcnRpZmljaWFsIGRlbGF5LgorCisuU0ggTElNSVRBVElPTlMKK1RoZSBtYWluIGtub3duIGxpbWl0YXRpb24gb2YgTmV0ZW0gYXJlIHJlbGF0ZWQgdG8gdGltZXIgZ3JhbnVsYXJpdHksIHNpbmNlCitMaW51eCBpcyBub3QgYSByZWFsLXRpbWUgb3BlcmF0aW5nIHN5c3RlbS4KKworLlNIIEVYQU1QTEVTCisuUFAKK3RjIHFkaXNjIGFkZCBkZXYgZXRoMCByb290IG5ldGVtIHJhdGUgNWtiaXQgMjAgMTAwIDUKKy5SUyA0CitkZWxheSBhbGwgb3V0Z29pbmcgcGFja2V0cyBvbiBkZXZpY2UgZXRoMCB3aXRoIGEgcmF0ZSBvZiA1a2JpdCwgYSBwZXIgcGFja2V0CitvdmVyaGVhZCBvZiAyMCBieXRlLCBhIGNlbGxzaXplIG9mIDEwMCBieXRlIGFuZCBhIHBlciBjZWxsb3ZlcmhlYWQgb2YgNSBieXRlOgorLlJFCisKKy5TSCBTT1VSQ0VTCisuSVAgIiAxLiAiIDQKK0hlbW1pbmdlciBTLiAsICJOZXR3b3JrIEVtdWxhdGlvbiB3aXRoIE5ldEVtIiwgT3BlbiBTb3VyY2UgRGV2ZWxvcG1lbnQgTGFiLAorQXByaWwgMjAwNQorKGh0dHA6Ly9kZXZyZXNvdXJjZXMubGludXgtZm91bmRhdGlvbi5vcmcvc2hlbW1pbmdlci9uZXRlbS9MQ0EyMDA1X3BhcGVyLnBkZikKKworLklQICIgMi4gIiA0CitOZXRlbSBwYWdlIGZyb20gTGludXggZm91bmRhdGlvbiwgKGh0dHA6Ly93d3cubGludXhmb3VuZGF0aW9uLm9yZy9lbi9OZXQ6TmV0ZW0pCisKKy5JUCAiIDMuICIgNAorU2Fsc2FubyBTLiwgTHVkb3ZpY2kgRi4sIE9yZGluZSBBLiwgIkRlZmluaXRpb24gb2YgYSBnZW5lcmFsIGFuZCBpbnR1aXRpdmUgbG9zcworbW9kZWwgZm9yIHBhY2tldCBuZXR3b3JrcyBhbmQgaXRzIGltcGxlbWVudGF0aW9uIGluIHRoZSBOZXRlbSBtb2R1bGUgaW4gdGhlCitMaW51eCBrZXJuZWwiLCBhdmFpbGFibGUgYXQgaHR0cDovL25ldGdyb3VwLnVuaXJvbWEyLml0L05ldGVtQ0xHCisKKy5TSCBTRUUgQUxTTworLkJSIHRjICg4KSwKKy5CUiB0Yy10YmYgKDgpCisKKy5TSCBBVVRIT1IKK05ldGVtIHdhcyB3cml0dGVuIGJ5IFN0ZXBoZW4gSGVtbWluZ2VyIGF0IExpbnV4IGZvdW5kYXRpb24gYW5kIGlzIGJhc2VkIG9uIE5JU1RuZXQuCitUaGlzIG1hbnBhZ2Ugd2FzIGNyZWF0ZWQgYnkgRmFiaW8gTHVkb3ZpY2kgPGZhYmlvLmx1ZG92aWNpIGF0IHlhaG9vIGRvdCBpdD4gYW5kCitIYWdlbiBQYXVsIFBmZWlmZXIgPGhhZ2VuQGphdXUubmV0PgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWFuL21hbjgvdGMtcGZpZm8uOCBiL2lwcm91dGUyL21hbi9tYW44L3RjLXBmaWZvLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyMzg1MAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L3RjLXBmaWZvLjgKQEAgLTAsMCArMSBAQAorLnNvIG1hbjgvdGMtYmZpZm8uOApkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWFuL21hbjgvdGMtcGZpZm9fZmFzdC44IGIvaXByb3V0ZTIvbWFuL21hbjgvdGMtcGZpZm9fZmFzdC44Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZjM0YjEKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9tYW4vbWFuOC90Yy1wZmlmb19mYXN0LjgKQEAgLTAsMCArMSw1NyBAQAorLlRIIFBGSUZPX0ZBU1QgOCAiMTAgSmFudWFyeSAyMDAyIiAiaXByb3V0ZTIiICJMaW51eCIKKy5TSCBOQU1FCitwZmlmb19mYXN0IFwtIHRocmVlLWJhbmQgZmlyc3QgaW4sIGZpcnN0IG91dCBxdWV1ZQorCisuU0ggREVTQ1JJUFRJT04KK3BmaWZvX2Zhc3QgaXMgdGhlIGRlZmF1bHQgcWRpc2Mgb2YgZWFjaCBpbnRlcmZhY2UuCisKK1doZW5ldmVyIGFuIGludGVyZmFjZSBpcyBjcmVhdGVkLCB0aGUgcGZpZm9fZmFzdCBxZGlzYyBpcyBhdXRvbWF0aWNhbGx5IHVzZWQKK2FzIGEgcXVldWUuIElmIGFub3RoZXIgcWRpc2MgaXMgYXR0YWNoZWQsIGl0IHByZWVtcHRzIHRoZSBkZWZhdWx0CitwZmlmb19mYXN0LCB3aGljaCBhdXRvbWF0aWNhbGx5IHJldHVybnMgdG8gZnVuY3Rpb24gd2hlbiBhbiBleGlzdGluZyBxZGlzYworaXMgZGV0YWNoZWQuCisKK0luIHRoaXMgc2Vuc2UgdGhpcyBxZGlzYyBpcyBtYWdpYywgYW5kIHVubGlrZSBvdGhlciBxZGlzY3MuCisKKy5TSCBBTEdPUklUSE0KK1RoZSBhbGdvcml0aG0gaXMgdmVyeSBzaW1pbGFyIHRvIHRoYXQgb2YgdGhlIGNsYXNzZnVsCisuQlIgdGMtcHJpbyAoOCkKK3FkaXNjLgorLkIgcGZpZm9fZmFzdAoraXMgbGlrZSB0aHJlZQorLkJSIHRjLXBmaWZvICg4KQorcXVldWVzIHNpZGUgYnkgc2lkZSwgd2hlcmUgcGFja2V0cyBjYW4gYmUgZW5xdWV1ZWQgaW4gYW55IG9mIHRoZSB0aHJlZSBiYW5kcworYmFzZWQgb24gdGhlaXIgVHlwZSBvZiBTZXJ2aWNlIGJpdHMgb3IgYXNzaWduZWQgcHJpb3JpdHkuCisKK05vdCBhbGwgdGhyZWUgYmFuZHMgYXJlIGRlcXVldWVkIHNpbXVsdGFuZW91c2x5IC0gYXMgbG9uZyBhcyBsb3dlciBiYW5kcworaGF2ZSB0cmFmZmljLCBoaWdoZXIgYmFuZHMgYXJlIG5ldmVyIGRlcXVldWVkLiBUaGlzIGNhbiBiZSB1c2VkIHRvCitwcmlvcml0aXplIGludGVyYWN0aXZlIHRyYWZmaWMgb3IgcGVuYWxpemUgJ2xvd2VzdCBjb3N0JyB0cmFmZmljLgorCitFYWNoIGJhbmQgY2FuIGJlIHR4cXVldWVsZW4gcGFja2V0cyBsb25nLCBhcyBjb25maWd1cmVkIHdpdGgKKy5CUiBpZmNvbmZpZyAoOCkKK29yCisuQlIgaXAgKDgpLgorQWRkaXRpb25hbCBwYWNrZXRzIGNvbWluZyBpbiBhcmUgbm90IGVucXVldWVkIGJ1dCBhcmUgaW5zdGVhZCBkcm9wcGVkLgorCitTZWUKKy5CUiB0Yy1wcmlvICg4KQorZm9yIGNvbXBsZXRlIGRldGFpbHMgb24gaG93IFRPUyBiaXRzIGFyZSB0cmFuc2xhdGVkIGludG8gYmFuZHMuCisuU0ggUEFSQU1FVEVSUworLlRQCit0eHF1ZXVlbGVuCitUaGUgbGVuZ3RoIG9mIHRoZSB0aHJlZSBiYW5kcyBkZXBlbmRzIG9uIHRoZSBpbnRlcmZhY2UgdHhxdWV1ZWxlbiwgYXMKK3NwZWNpZmllZCB3aXRoCisuQlIgaWZjb25maWcgKDgpCitvcgorLkJSIGlwICg4KS4KKworLlNIIEJVR1MKK0RvZXMgbm90IG1haW50YWluIHN0YXRpc3RpY3MgYW5kIGRvZXMgbm90IHNob3cgdXAgaW4gdGMgcWRpc2MgbHMuIFRoaXMgaXMgYmVjYXVzZQoraXQgaXMgdGhlIGF1dG9tYXRpYyBkZWZhdWx0IGluIHRoZSBhYnNlbmNlIG9mIGEgY29uZmlndXJlZCBxZGlzYy4KKworLlNIIFNFRSBBTFNPCisuQlIgdGMgKDgpCisKKy5TSCBBVVRIT1JTCitBbGV4ZXkgTi4gS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisKK1RoaXMgbWFucGFnZSBtYWludGFpbmVkIGJ5IGJlcnQgaHViZXJ0IDxhaHVAZHM5YS5ubD4KZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L3RjLXBpZS44IGIvaXByb3V0ZTIvbWFuL21hbjgvdGMtcGllLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc4MjkzYgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L3RjLXBpZS44CkBAIC0wLDAgKzEsMTMxIEBACisuVEggUElFIDggIjE2IEphbnVhcnkgMjAxNCIgImlwcm91dGUyIiAiTGludXgiCisuU0ggTkFNRQorUElFIFwtIFByb3BvcnRpb25hbCBJbnRlZ3JhbCBjb250cm9sbGVyLUVuaGFuY2VkIEFRTSBhbGdvcml0aG0KKy5TSCBTWU5PUFNJUworLkIgdGMgcWRpc2MgLi4uIHBpZQorWworLkIgbGltaXQKK1BBQ0tFVFMgXSBbCisuQiB0YXJnZXQKK1RJTUUgXSBbCisuQiB0dXBkYXRlCitUSU1FIF0gWworLkIgYWxwaGEKK2ludCBdIFsKKy5CIGJldGEKK2ludCBdIFsKKy5CIGVjbgorfAorLkIgbm9lY24KK10gWworLkIgYnl0ZW1vZGUKK3wKKy5CIG5vYnl0ZW1vZGUKK10KKworLlNIIERFU0NSSVBUSU9OCitQcm9wb3J0aW9uYWwgSW50ZWdyYWwgY29udHJvbGxlci1FbmhhbmNlZCAoUElFKSBpcyBhIGNvbnRyb2wgdGhlb3JldGljIGFjdGl2ZQorcXVldWUgbWFuYWdlbWVudCBzY2hlbWUuIEl0IGlzIGJhc2VkIG9uIHRoZSBwcm9wb3J0aW9uYWwgaW50ZWdyYWwgY29udHJvbGxlciBidXQKK2FpbXMgdG8gY29udHJvbCBkZWxheS4gVGhlIG1haW4gZGVzaWduIGdvYWxzIGFyZQorIG8gTG93IGxhdGVuY3kgY29udHJvbAorIG8gSGlnaCBsaW5rIHV0aWxpemF0aW9uCisgbyBTaW1wbGUgaW1wbGVtZW50YXRpb24KKyBvIEd1YXJhbnRlZWQgc3RhYmlsaXR5IGFuZCBmYXN0IHJlc3BvbnNpdmVuZXNzCisKKy5TSCBBTEdPUklUSE0KK1BJRSBpcyBkZXNpZ25lZCB0byBjb250cm9sIGRlbGF5IGVmZmVjdGl2ZWx5LiBGaXJzdCwgYW4gYXZlcmFnZSBkZXF1ZXVlIHJhdGUgaXMKK2VzdGltYXRlZCBiYXNlZCBvbiB0aGUgc3RhbmRpbmcgcXVldWUuIFRoZSByYXRlIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBjdXJyZW50CitkZWxheS4gVGhlbiwgb24gYSBwZXJpb2RpYyBiYXNpcywgdGhlIGRlbGF5IGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBkcm9wcGluZworcHJvYmFiaWx0eS4gRmluYWxseSwgb24gYXJyaXZhbCwgYSBwYWNrZXQgaXMgZHJvcHBlZCAob3IgbWFya2VkKSBiYXNlZCBvbiB0aGlzCitwcm9iYWJpbGl0eS4KKworUElFIG1ha2VzIGFkanVzdG1lbnRzIHRvIHRoZSBwcm9iYWJpbGl0eSBiYXNlZCBvbiB0aGUgdHJlbmQgb2YgdGhlIGRlbGF5IGkuZS4KK3doZXRoZXIgaXQgaXMgZ29pbmcgdXAgb3IgZG93bi5UaGUgZGVsYXkgY29udmVyZ2VzIHF1aWNrbHkgdG8gdGhlIHRhcmdldCB2YWx1ZQorc3BlY2lmaWVkLgorCithbHBoYSBhbmQgYmV0YSBhcmUgc3RhdGljYWxseSBjaG9zZW4gcGFyYW1ldGVycyBjaG9zZW4gdG8gY29udHJvbCB0aGUgZHJvcCBwcm9iYWJpbGl0eQorZ3Jvd3RoIGFuZCBhcmUgZGV0ZXJtaW5lZCB0aHJvdWdoIGNvbnRyb2wgdGhlb3JldGljIGFwcHJvYWNoZXMuIGFscGhhIGRldGVybWluZXMgaG93Cit0aGUgZGV2aWF0aW9uIGJldHdlZW4gdGhlIGN1cnJlbnQgYW5kIHRhcmdldCBsYXRlbmN5IGNoYW5nZXMgcHJvYmFiaWxpdHkuIGJldGEgZXhlcnRzCithZGRpdGlvbmFsIGFkanVzdG1lbnRzIGRlcGVuZGluZyBvbiB0aGUgbGF0ZW5jeSB0cmVuZC4KKworVGhlIGRyb3AgcHJvYmFiaWx0eSBpcyB1c2VkIHRvIG1hcmsgcGFja2V0cyBpbiBlY24gbW9kZS4gSG93ZXZlciwgYXMgaW4gUkVELAorYmV5b25kIDEwJSBwYWNrZXRzIGFyZSBkcm9wcGVkIGJhc2VkIG9uIHRoaXMgcHJvYmFiaWxpdHkuIFRoZSBieXRlbW9kZSBpcyB1c2VkCit0byBkcm9wIHBhY2tldHMgcHJvcG9ydGlvbmFsIHRvIHRoZSBwYWNrZXQgc2l6ZS4KKworQWRkaXRpb25hbCBkZXRhaWxzIGNhbiBiZSBmb3VuZCBpbiB0aGUgcGFwZXIgY2l0ZWQgYmVsb3cuCisKKy5TSCBQQVJBTUVURVJTCisuU1MgbGltaXQKK2xpbWl0IG9uIHRoZSBxdWV1ZSBzaXplIGluIHBhY2tldHMuIEluY29taW5nIHBhY2tldHMgYXJlIGRyb3BwZWQgd2hlbiB0aGlzIGxpbWl0CitpcyByZWFjaGVkLiBEZWZhdWx0IGlzIDEwMDAgcGFja2V0cy4KKworLlNTIHRhcmdldAoraXMgdGhlIGV4cGVjdGVkIHF1ZXVlIGRlbGF5LiBUaGUgZGVmYXVsdCB0YXJnZXQgZGVsYXkgaXMgMjBtcy4KKworLlNTIHR1cGRhdGUKK2lzIHRoZSBmcmVxdWVuY3kgYXQgd2hpY2ggdGhlIHN5c3RlbSBkcm9wIHByb2JhYmlsaXR5IGlzIGNhbGN1bGF0ZWQuIFRoZSBkZWZhdWx0IGlzIDMwbXMuCisKKy5TUyBhbHBoYQorLlNTIGJldGEKK2FscGhhIGFuZCBiZXRhIGFyZSBwYXJhbWV0ZXJzIGNob3NlbiB0byBjb250cm9sIHRoZSBkcm9wIHByb2JhYmlsaXR5LiBUaGVzZQorc2hvdWxkIGJlIGluIHRoZSByYW5nZSBiZXR3ZWVuIDAgYW5kIDMyLgorCisuU1MgZWNuIHwgbm9lY24KK2lzIHVzZWQgdG8gbWFyayBwYWNrZXRzIGluc3RlYWQgb2YgZHJvcHBpbmcKKy5CIGVjbgordG8gdHVybiBvbiBlY24gbW9kZSwKKy5CIG5vZWNuCit0byB0dXJuIG9mZiBlY24gbW9kZS4gQnkgZGVmYXVsdCwKKy5CIGVjbgoraXMgdHVybmVkIG9mZi4KKworLlNTIGJ5dGVtb2RlIHwgbm9ieXRlbW9kZQoraXMgdXNlZCB0byBzY2FsZSBkcm9wIHByb2JhYmlsaXR5IHByb3BvcnRpb25hbCB0byBwYWNrZXQgc2l6ZQorLkIgYnl0ZW1vZGUKK3RvIHR1cm4gb24gYnl0ZW1vZGUsCisuQiBub2J5dGVtb2RlCit0byB0dXJuIG9mZiBieXRlbW9kZS4gQnkgZGVmYXVsdCwKKy5CIGJ5dGVtb2RlCitpcyB0dXJuZWQgb2ZmLgorCisuU0ggRVhBTVBMRVMKKyAjIHRjIHFkaXNjIGFkZCBkZXYgZXRoMCByb290IHBpZQorICMgdGMgLXMgcWRpc2Mgc2hvdworICAgcWRpc2MgcGllIDgwMzQ6IGRldiBldGgwIHJvb3QgcmVmY250IDIgbGltaXQgMjAwcCB0YXJnZXQgMTkwMDB1cyB0dXBkYXRlIDI5MDAwdXMgYWxwaGEgMiBiZXRhIDIwCisgICBTZW50IDc0NDM1MjQgYnl0ZXMgNzIwNCBwa3QgKGRyb3BwZWQgOTAwLCBvdmVybGltaXRzIDAgcmVxdWV1ZXMgMCkKKyAgIGJhY2tsb2cgMzg5OThiIDM3cCByZXF1ZXVlcyAwCisgICBwcm9iIDAuMTIzMzg0IGRlbGF5IDI1MDAwdXMgYXZnX2RxX3JhdGUgMTQ2NDg0MAorICAgcGt0c19pbiA3MjQxIG92ZXJsaW1pdCA5MDAgZHJvcHBlZCAwIG1heHEgMTg2IGVjbl9tYXJrIDAKKworICMgdGMgcWRpc2MgYWRkIGRldiBldGgwIHJvb3QgcGllIGxpbWl0IDEwMCB0YXJnZXQgMjBtcyB0dXBkYXRlIDMwbXMgZWNuCisgIyB0YyAtcyBxZGlzYyBzaG93CisgICBxZGlzYyBwaWUgODAzNjogZGV2IGV0aDAgcm9vdCByZWZjbnQgMiBsaW1pdCAyMDBwIHRhcmdldCAxOTAwMCB0dXBkYXRlIDI5MDAwIGFscGhhIDIgYmV0YSAyMCBlY24KKyAgIFNlbnQgMjQ5MTkyMiBieXRlcyAyNTA3IHBrdCAoZHJvcHBlZCAyMTQsIG92ZXJsaW1pdHMgMCByZXF1ZXVlcyAwKQorICAgYmFja2xvZyAzMzcyOGIgMzJwIHJlcXVldWVzIDAKKyAgIHByb2IgMC4xMDIyNjIgZGVsYXkgMjQwMDB1cyBhdmdfZHFfcmF0ZSAxNDY0ODQwCisgICBwa3RzX2luIDI0Njggb3ZlcmxpbWl0IDIxNCBkcm9wcGVkIDAgbWF4cSAxOTIgZWNuX21hcmsgNzEKKworCisgIyB0YyBxZGlzYyBhZGQgZGV2IGV0aDAgcm9vdCBwaWUgbGltaXQgMTAwIHRhcmdldCA1MG1zIHR1cGRhdGUgMzBtcyBieXRlbW9kZQorICMgdGMgLXMgcWRpc2Mgc2hvdworICAgcWRpc2MgcGllIDgwMzY6IGRldiBldGgwIHJvb3QgcmVmY250IDIgbGltaXQgMjAwcCB0YXJnZXQgMTkwMDAgdHVwZGF0ZSAyOTAwMCBhbHBoYSAyIGJldGEgMjAgZWNuCisgICBTZW50IDI0OTE5MjIgYnl0ZXMgMjUwNyBwa3QgKGRyb3BwZWQgMjE0LCBvdmVybGltaXRzIDAgcmVxdWV1ZXMgMCkKKyAgIGJhY2tsb2cgMzM3MjhiIDMycCByZXF1ZXVlcyAwCisgICBwcm9iIDAuMTAyMjYyIGRlbGF5IDI0MDAwdXMgYXZnX2RxX3JhdGUgMTQ2NDg0MAorICAgcGt0c19pbiAyNDY4IG92ZXJsaW1pdCAyMTQgZHJvcHBlZCAwIG1heHEgMTkyIGVjbl9tYXJrIDcxCisKKworLlNIIFNFRSBBTFNPCisuQlIgdGMgKDgpLAorLkJSIHRjLWNvZGVsICg4KQorLkJSIHRjLXJlZCAoOCkKKworLlNIIFNPVVJDRVMKKyBvIElFVEYgZHJhZnQgc3VibWlzc2lvbiBpcyBhdCBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1wYW4tdHN2d2ctcGllLTAwCisgbyBJRUVFICBDb25mZXJlbmNlIG9uIEhpZ2ggUGVyZm9ybWFuY2UgU3dpdGNoaW5nIGFuZCBSb3V0aW5nIDIwMTMgOiAiUElFOiBBCitMaWdodHdlaWdodCBDb250cm9sIFNjaGVtZSB0byBBZGRyZXNzIHRoZSBCdWZmZXJibG9hdCBQcm9ibGVtIgorCisuU0ggQVVUSE9SUworUElFIHdhcyBpbXBsZW1lbnRlZCBieSBWaWpheSBTdWJyYW1hbmlhbiBhbmQgTXl0aGlsaSBQcmFiaHUsIGFsc28gdGhlIGF1dGhvcnMgb2YKK3RoaXMgbWFuIHBhZ2UuIFBsZWFzZSByZXBvcnQgYnVncyBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIExpbnV4IG5ldHdvcmtpbmcKK2RldmVsb3BtZW50IG1haWxpbmcgbGlzdCBhdCA8bmV0ZGV2QHZnZXIua2VybmVsLm9yZz4uCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9tYW4vbWFuOC90Yy1wcmlvLjggYi9pcHJvdXRlMi9tYW4vbWFuOC90Yy1wcmlvLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA1ZjNkMwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L3RjLXByaW8uOApAQCAtMCwwICsxLDE4NSBAQAorLlRIIFBSSU8gOCAiMTYgRGVjZW1iZXIgMjAwMSIgImlwcm91dGUyIiAiTGludXgiCisuU0ggTkFNRQorUFJJTyBcLSBQcmlvcml0eSBxZGlzYworLlNIIFNZTk9QU0lTCisuQiB0YyBxZGlzYyAuLi4gZGV2CitkZXYKKy5CICAoIHBhcmVudAorY2xhc3NpZAorLkIgfCByb290KSBbIGhhbmRsZQorbWFqb3I6CisuQiBdIHByaW8gWyBiYW5kcworYmFuZHMKKy5CIF0gWyBwcmlvbWFwCitiYW5kIGJhbmQgYmFuZC4uLgorLkIgXSBbIGVzdGltYXRvcgoraW50ZXJ2YWwgdGltZWNvbnN0YW50CisuQiBdCisKKy5TSCBERVNDUklQVElPTgorVGhlIFBSSU8gcWRpc2MgaXMgYSBzaW1wbGUgY2xhc3NmdWwgcXVldWVpbmcgZGlzY2lwbGluZSB0aGF0IGNvbnRhaW5zCithbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGNsYXNzZXMgb2YgZGlmZmVyaW5nIHByaW9yaXR5LiBUaGUgY2xhc3NlcyBhcmUKK2RlcXVldWVkIGluIG51bWVyaWNhbCBkZXNjZW5kaW5nIG9yZGVyIG9mIHByaW9yaXR5LiBQUklPIGlzIGEgc2NoZWR1bGVyCithbmQgbmV2ZXIgZGVsYXlzIHBhY2tldHMgLSBpdCBpcyBhIHdvcmstY29uc2VydmluZyBxZGlzYywgdGhvdWdoIHRoZSBxZGlzY3MKK2NvbnRhaW5lZCBpbiB0aGUgY2xhc3NlcyBtYXkgbm90IGJlLgorCitWZXJ5IHVzZWZ1bCBmb3IgbG93ZXJpbmcgbGF0ZW5jeSB3aGVuIHRoZXJlIGlzIG5vIG5lZWQgZm9yIHNsb3dpbmcgZG93bgordHJhZmZpYy4KKworLlNIIEFMR09SSVRITQorT24gY3JlYXRpb24gd2l0aCAndGMgcWRpc2MgYWRkJywgYSBmaXhlZCBudW1iZXIgb2YgYmFuZHMgaXMgY3JlYXRlZC4gRWFjaAorYmFuZCBpcyBhIGNsYXNzLCBhbHRob3VnaCBpcyBub3QgcG9zc2libGUgdG8gYWRkIGNsYXNzZXMgd2l0aCAndGMgcWRpc2MKK2FkZCcsIHRoZSBudW1iZXIgb2YgYmFuZHMgdG8gYmUgY3JlYXRlZCBtdXN0IGluc3RlYWQgYmUgc3BlY2lmaWVkIG9uIHRoZQorY29tbWFuZCBsaW5lIGF0dGFjaGluZyBQUklPIHRvIGl0cyByb290LgorCitXaGVuIGRlcXVldWVpbmcsIGJhbmQgMCBpcyB0cmllZCBmaXJzdCBhbmQgb25seSBpZiBpdCBkaWQgbm90IGRlbGl2ZXIgYQorcGFja2V0IGRvZXMgUFJJTyB0cnkgYmFuZCAxLCBhbmQgc28gb253YXJkcy4gTWF4aW11bSByZWxpYWJpbGl0eSBwYWNrZXRzCitzaG91bGQgdGhlcmVmb3JlIGdvIHRvIGJhbmQgMCwgbWluaW11bSBkZWxheSB0byBiYW5kIDEgYW5kIHRoZSByZXN0IHRvIGJhbmQKKzIuCisKK0FzIHRoZSBQUklPIHFkaXNjIGl0c2VsZiB3aWxsIGhhdmUgbWlub3IgbnVtYmVyIDAsIGJhbmQgMCBpcyBhY3R1YWxseQorbWFqb3I6MSwgYmFuZCAxIGlzIG1ham9yOjIsIGV0Yy4gRm9yIG1ham9yLCBzdWJzdGl0dXRlIHRoZSBtYWpvciBudW1iZXIKK2Fzc2lnbmVkIHRvIHRoZSBxZGlzYyBvbiAndGMgcWRpc2MgYWRkJyB3aXRoIHRoZQorLkIgaGFuZGxlCitwYXJhbWV0ZXIuCisKKy5TSCBDTEFTU0lGSUNBVElPTgorVGhyZWUgbWV0aG9kcyBhcmUgYXZhaWxhYmxlIHRvIFBSSU8gdG8gZGV0ZXJtaW5lIGluIHdoaWNoIGJhbmQgYSBwYWNrZXQgd2lsbAorYmUgZW5xdWV1ZWQuCisuVFAKK0Zyb20gdXNlcnNwYWNlCitBIHByb2Nlc3Mgd2l0aCBzdWZmaWNpZW50IHByaXZpbGVnZXMgY2FuIGVuY29kZSB0aGUgZGVzdGluYXRpb24gY2xhc3MKK2RpcmVjdGx5IHdpdGggU09fUFJJT1JJVFksIHNlZQorLkJSIHNvY2tldCg3KS4KKy5UUAord2l0aCBhIHRjIGZpbHRlcgorQSB0YyBmaWx0ZXIgYXR0YWNoZWQgdG8gdGhlIHJvb3QgcWRpc2MgY2FuIHBvaW50IHRyYWZmaWMgZGlyZWN0bHkgdG8gYSBjbGFzcworLlRQCit3aXRoIHRoZSBwcmlvbWFwCitCYXNlZCBvbiB0aGUgcGFja2V0IHByaW9yaXR5LCB3aGljaCBpbiB0dXJuIGlzIGRlcml2ZWQgZnJvbSB0aGUgVHlwZSBvZgorU2VydmljZSBhc3NpZ25lZCB0byB0aGUgcGFja2V0LgorLlAKK09ubHkgdGhlIHByaW9tYXAgaXMgc3BlY2lmaWMgdG8gdGhpcyBxZGlzYy4KKy5TSCBRRElTQyBQQVJBTUVURVJTCisuVFAKK2JhbmRzCitOdW1iZXIgb2YgYmFuZHMuIElmIGNoYW5nZWQgZnJvbSB0aGUgZGVmYXVsdCBvZiAzLAorLkIgcHJpb21hcAorbXVzdCBiZSB1cGRhdGVkIGFzIHdlbGwuCisuVFAKK3ByaW9tYXAKK1RoZSBwcmlvbWFwIG1hcHMgdGhlIHByaW9yaXR5IG9mCithIHBhY2tldCB0byBhIGNsYXNzLiBUaGUgcHJpb3JpdHkgY2FuIGVpdGhlciBiZSBzZXQgZGlyZWN0bHkgZnJvbSB1c2Vyc3BhY2UsCitvciBiZSBkZXJpdmVkIGZyb20gdGhlIFR5cGUgb2YgU2VydmljZSBvZiB0aGUgcGFja2V0LgorCitEZXRlcm1pbmVzIGhvdyBwYWNrZXQgcHJpb3JpdGllcywgYXMgYXNzaWduZWQgYnkgdGhlIGtlcm5lbCwgbWFwIHRvCitiYW5kcy4gTWFwcGluZyBvY2N1cnMgYmFzZWQgb24gdGhlIFRPUyBvY3RldCBvZiB0aGUgcGFja2V0LCB3aGljaCBsb29rcyBsaWtlCit0aGlzOgorCisubmYKKzAgICAxICAgMiAgIDMgICA0ICAgNSAgIDYgICA3CisrLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICB8ICAgfAorfFBSRUNFREVOQ0UgfCAgICAgIFRPUyAgICAgIHxNQlp8Cit8ICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCAgIHwKKystLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKworLmZpCisKK1RoZSBmb3VyIFRPUyBiaXRzICh0aGUgJ1RPUyBmaWVsZCcpIGFyZSBkZWZpbmVkIGFzOgorCisubmYKK0JpbmFyeSBEZWNpbWFsICBNZWFuaW5nCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMTAwMCAgIDggICAgICAgICBNaW5pbWl6ZSBkZWxheSAobWQpCiswMTAwICAgNCAgICAgICAgIE1heGltaXplIHRocm91Z2hwdXQgKG10KQorMDAxMCAgIDIgICAgICAgICBNYXhpbWl6ZSByZWxpYWJpbGl0eSAobXIpCiswMDAxICAgMSAgICAgICAgIE1pbmltaXplIG1vbmV0YXJ5IGNvc3QgKG1tYykKKzAwMDAgICAwICAgICAgICAgTm9ybWFsIFNlcnZpY2UKKy5maQorCitBcyB0aGVyZSBpcyAxIGJpdCB0byB0aGUgcmlnaHQgb2YgdGhlc2UgZm91ciBiaXRzLCB0aGUgYWN0dWFsIHZhbHVlIG9mIHRoZQorVE9TIGZpZWxkIGlzIGRvdWJsZSB0aGUgdmFsdWUgb2YgdGhlIFRPUyBiaXRzLiBUY3BkdW1wIC12IC12IHNob3dzIHlvdSB0aGUKK3ZhbHVlIG9mIHRoZSBlbnRpcmUgVE9TIGZpZWxkLCBub3QganVzdCB0aGUgZm91ciBiaXRzLiBJdCBpcyB0aGUgdmFsdWUgeW91CitzZWUgaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiB0aGlzIHRhYmxlOgorCisubmYKK1RPUyAgICAgQml0cyAgTWVhbnMgICAgICAgICAgICAgICAgICAgIExpbnV4IFByaW9yaXR5ICAgIEJhbmQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMHgwICAgICAwICAgICBOb3JtYWwgU2VydmljZSAgICAgICAgICAgMCBCZXN0IEVmZm9ydCAgICAgMQorMHgyICAgICAxICAgICBNaW5pbWl6ZSBNb25ldGFyeSBDb3N0ICAgMCBCZXN0IEVmZm9ydCAgICAgMQorMHg0ICAgICAyICAgICBNYXhpbWl6ZSBSZWxpYWJpbGl0eSAgICAgMCBCZXN0IEVmZm9ydCAgICAgMQorMHg2ICAgICAzICAgICBtbWMrbXIgICAgICAgICAgICAgICAgICAgMCBCZXN0IEVmZm9ydCAgICAgMQorMHg4ICAgICA0ICAgICBNYXhpbWl6ZSBUaHJvdWdocHV0ICAgICAgMiBCdWxrICAgICAgICAgICAgMgorMHhhICAgICA1ICAgICBtbWMrbXQgICAgICAgICAgICAgICAgICAgMiBCdWxrICAgICAgICAgICAgMgorMHhjICAgICA2ICAgICBtcittdCAgICAgICAgICAgICAgICAgICAgMiBCdWxrICAgICAgICAgICAgMgorMHhlICAgICA3ICAgICBtbWMrbXIrbXQgICAgICAgICAgICAgICAgMiBCdWxrICAgICAgICAgICAgMgorMHgxMCAgICA4ICAgICBNaW5pbWl6ZSBEZWxheSAgICAgICAgICAgNiBJbnRlcmFjdGl2ZSAgICAgMAorMHgxMiAgICA5ICAgICBtbWMrbWQgICAgICAgICAgICAgICAgICAgNiBJbnRlcmFjdGl2ZSAgICAgMAorMHgxNCAgICAxMCAgICBtcittZCAgICAgICAgICAgICAgICAgICAgNiBJbnRlcmFjdGl2ZSAgICAgMAorMHgxNiAgICAxMSAgICBtbWMrbXIrbWQgICAgICAgICAgICAgICAgNiBJbnRlcmFjdGl2ZSAgICAgMAorMHgxOCAgICAxMiAgICBtdCttZCAgICAgICAgICAgICAgICAgICAgNCBJbnQuIEJ1bGsgICAgICAgMQorMHgxYSAgICAxMyAgICBtbWMrbXQrbWQgICAgICAgICAgICAgICAgNCBJbnQuIEJ1bGsgICAgICAgMQorMHgxYyAgICAxNCAgICBtcittdCttZCAgICAgICAgICAgICAgICAgNCBJbnQuIEJ1bGsgICAgICAgMQorMHgxZSAgICAxNSAgICBtbWMrbXIrbXQrbWQgICAgICAgICAgICAgNCBJbnQuIEJ1bGsgICAgICAgMQorLmZpCisKK1RoZSBzZWNvbmQgY29sdW1uIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgcmVsZXZhbnQKK2ZvdXIgVE9TIGJpdHMsIGZvbGxvd2VkIGJ5IHRoZWlyIHRyYW5zbGF0ZWQgbWVhbmluZy4gRm9yIGV4YW1wbGUsIDE1IHN0YW5kcworZm9yIGEgcGFja2V0IHdhbnRpbmcgTWluaW1hbCBNb25ldGFyeSBDb3N0LCBNYXhpbXVtIFJlbGlhYmlsaXR5LCBNYXhpbXVtCitUaHJvdWdocHV0IEFORCBNaW5pbXVtIERlbGF5LgorCitUaGUgZm91cnRoIGNvbHVtbiBsaXN0cyB0aGUgd2F5IHRoZSBMaW51eCBrZXJuZWwgaW50ZXJwcmV0cyB0aGUgVE9TIGJpdHMsIGJ5CitzaG93aW5nIHRvIHdoaWNoIFByaW9yaXR5IHRoZXkgYXJlIG1hcHBlZC4KKworVGhlIGxhc3QgY29sdW1uIHNob3dzIHRoZSByZXN1bHQgb2YgdGhlIGRlZmF1bHQgcHJpb21hcC4gT24gdGhlIGNvbW1hbmQgbGluZSwKK3RoZSBkZWZhdWx0IHByaW9tYXAgbG9va3MgbGlrZSB0aGlzOgorCisgICAgMSAyIDIgMiAxIDIgMCAwIDEgMSAxIDEgMSAxIDEgMQorCitUaGlzIG1lYW5zIHRoYXQgcHJpb3JpdHkgNCwgZm9yIGV4YW1wbGUsIGdldHMgbWFwcGVkIHRvIGJhbmQgbnVtYmVyIDEuCitUaGUgcHJpb21hcCBhbHNvIGFsbG93cyB5b3UgdG8gbGlzdCBoaWdoZXIgcHJpb3JpdGllcyAoPiA3KSB3aGljaCBkbyBub3QKK2NvcnJlc3BvbmQgdG8gVE9TIG1hcHBpbmdzLCBidXQgd2hpY2ggYXJlIHNldCBieSBvdGhlciBtZWFucy4KKworVGhpcyB0YWJsZSBmcm9tIFJGQyAxMzQ5IChyZWFkIGl0IGZvciBtb3JlIGRldGFpbHMpIGV4cGxhaW5zIGhvdworYXBwbGljYXRpb25zIG1pZ2h0IHZlcnkgd2VsbCBzZXQgdGhlaXIgVE9TIGJpdHM6CisKKy5uZgorVEVMTkVUICAgICAgICAgICAgICAgICAgIDEwMDAgICAgICAgICAgIChtaW5pbWl6ZSBkZWxheSkKK0ZUUAorICAgICAgICBDb250cm9sICAgICAgICAgIDEwMDAgICAgICAgICAgIChtaW5pbWl6ZSBkZWxheSkKKyAgICAgICAgRGF0YSAgICAgICAgICAgICAwMTAwICAgICAgICAgICAobWF4aW1pemUgdGhyb3VnaHB1dCkKKworVEZUUCAgICAgICAgICAgICAgICAgICAgIDEwMDAgICAgICAgICAgIChtaW5pbWl6ZSBkZWxheSkKKworU01UUAorICAgICAgICBDb21tYW5kIHBoYXNlICAgIDEwMDAgICAgICAgICAgIChtaW5pbWl6ZSBkZWxheSkKKyAgICAgICAgREFUQSBwaGFzZSAgICAgICAwMTAwICAgICAgICAgICAobWF4aW1pemUgdGhyb3VnaHB1dCkKKworRG9tYWluIE5hbWUgU2VydmljZQorICAgICAgICBVRFAgUXVlcnkgICAgICAgIDEwMDAgICAgICAgICAgIChtaW5pbWl6ZSBkZWxheSkKKyAgICAgICAgVENQIFF1ZXJ5ICAgICAgICAwMDAwCisgICAgICAgIFpvbmUgVHJhbnNmZXIgICAgMDEwMCAgICAgICAgICAgKG1heGltaXplIHRocm91Z2hwdXQpCisKK05OVFAgICAgICAgICAgICAgICAgICAgICAwMDAxICAgICAgICAgICAobWluaW1pemUgbW9uZXRhcnkgY29zdCkKKworSUNNUAorICAgICAgICBFcnJvcnMgICAgICAgICAgIDAwMDAKKyAgICAgICAgUmVxdWVzdHMgICAgICAgICAwMDAwIChtb3N0bHkpCisgICAgICAgIFJlc3BvbnNlcyAgICAgICAgPHNhbWUgYXMgcmVxdWVzdD4gKG1vc3RseSkKKy5maQorCisKKy5TSCBDTEFTU0VTCitQUklPIGNsYXNzZXMgY2Fubm90IGJlIGNvbmZpZ3VyZWQgZnVydGhlciAtIHRoZXkgYXJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZAord2hlbiB0aGUgUFJJTyBxZGlzYyBpcyBhdHRhY2hlZC4gRWFjaCBjbGFzcyBob3dldmVyIGNhbiBjb250YWluIHlldCBhCitmdXJ0aGVyIHFkaXNjLgorCisuU0ggQlVHUworTGFyZ2UgYW1vdW50cyBvZiB0cmFmZmljIGluIHRoZSBsb3dlciBiYW5kcyBjYW4gY2F1c2Ugc3RhcnZhdGlvbiBvZiBoaWdoZXIKK2JhbmRzLiBDYW4gYmUgcHJldmVudGVkIGJ5IGF0dGFjaGluZyBhIHNoYXBlciAoZm9yIGV4YW1wbGUsCisuQlIgdGMtdGJmKDgpCit0byB0aGVzZSBiYW5kcyB0byBtYWtlIHN1cmUgdGhleSBjYW5ub3QgZG9taW5hdGUgdGhlIGxpbmsuCisKKy5TSCBBVVRIT1JTCitBbGV4ZXkgTi4gS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+LCAgSiBIYWRpIFNhbGltCis8aGFkaUBjeWJlcnVzLmNhPi4gVGhpcyBtYW5wYWdlIG1haW50YWluZWQgYnkgYmVydCBodWJlcnQgPGFodUBkczlhLm5sPgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWFuL21hbjgvdGMtcmVkLjggYi9pcHJvdXRlMi9tYW4vbWFuOC90Yy1yZWQuOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDFhYjc0Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbWFuL21hbjgvdGMtcmVkLjgKQEAgLTAsMCArMSwxNjAgQEAKKy5USCBSRUQgOCAiMTMgRGVjZW1iZXIgMjAwMSIgImlwcm91dGUyIiAiTGludXgiCisuU0ggTkFNRQorcmVkIFwtIFJhbmRvbSBFYXJseSBEZXRlY3Rpb24KKy5TSCBTWU5PUFNJUworLkIgdGMgcWRpc2MgLi4uIHJlZAorLkIgbGltaXQKK2J5dGVzCisuQiBbIG1pbgorYnl0ZXMKKy5CIF0gWyBtYXgKK2J5dGVzCisuQiBdIGF2cGt0CitieXRlcworLkIgWyBidXJzdAorcGFja2V0cworLkIgXSBbIGVjbiBdIFsgaGFyZGRyb3BdIFsgYmFuZHdpZHRoCityYXRlCisuQiBdIFsgcHJvYmFiaWxpdHkKK2NoYW5jZQorLkIgXSBbIGFkYXB0aXZlIF0KKworLlNIIERFU0NSSVBUSU9OCitSYW5kb20gRWFybHkgRGV0ZWN0aW9uIGlzIGEgY2xhc3NsZXNzIHFkaXNjIHdoaWNoIG1hbmFnZXMgaXRzIHF1ZXVlIHNpemUKK3NtYXJ0bHkuIFJlZ3VsYXIgcXVldWVzIHNpbXBseSBkcm9wIHBhY2tldHMgZnJvbSB0aGUgdGFpbCB3aGVuIHRoZXkgYXJlCitmdWxsLCB3aGljaCBtYXkgbm90IGJlIHRoZSBvcHRpbWFsIGJlaGF2aW91ci4gUkVEIGFsc28gcGVyZm9ybXMgdGFpbCBkcm9wLAorYnV0IGRvZXMgc28gaW4gYSBtb3JlIGdyYWR1YWwgd2F5LgorCitPbmNlIHRoZSBxdWV1ZSBoaXRzIGEgY2VydGFpbiBhdmVyYWdlIGxlbmd0aCwgcGFja2V0cyBlbnF1ZXVlZCBoYXZlIGEKK2NvbmZpZ3VyYWJsZSBjaGFuY2Ugb2YgYmVpbmcgbWFya2VkICh3aGljaCBtYXkgbWVhbiBkcm9wcGVkKS4gVGhpcyBjaGFuY2UKK2luY3JlYXNlcyBsaW5lYXJseSB1cCB0byBhIHBvaW50IGNhbGxlZCB0aGUKKy5CIG1heAorYXZlcmFnZSBxdWV1ZSBsZW5ndGgsIGFsdGhvdWdoIHRoZSBxdWV1ZSBtaWdodCBnZXQgYmlnZ2VyLgorCitUaGlzIGhhcyBhIGhvc3Qgb2YgYmVuZWZpdHMgb3ZlciBzaW1wbGUgdGFpbGRyb3AsIHdoaWxlIG5vdCBiZWluZyBwcm9jZXNzb3IKK2ludGVuc2l2ZS4gSXQgcHJldmVudHMgc3luY2hyb25vdXMgcmV0cmFuc21pdHMgYWZ0ZXIgYSBidXJzdCBpbiB0cmFmZmljLAord2hpY2ggY2F1c2UgZnVydGhlciByZXRyYW5zbWl0cywgZXRjLgorCitUaGUgZ29hbCBpcyB0byBoYXZlIGEgc21hbGwgcXVldWUgc2l6ZSwgd2hpY2ggaXMgZ29vZCBmb3IgaW50ZXJhY3Rpdml0eQord2hpbGUgbm90IGRpc3R1cmJpbmcgVENQL0lQIHRyYWZmaWMgd2l0aCB0b28gbWFueSBzdWRkZW4gZHJvcHMgYWZ0ZXIgYSBidXJzdAorb2YgdHJhZmZpYy4KKworRGVwZW5kaW5nIG9uIGlmIEVDTiBpcyBjb25maWd1cmVkLCBtYXJraW5nIGVpdGhlciBtZWFucyBkcm9wcGluZyBvcgorcHVyZWx5IG1hcmtpbmcgYSBwYWNrZXQgYXMgb3ZlcmxpbWl0LgorLlNIIEFMR09SSVRITQorVGhlIGF2ZXJhZ2UgcXVldWUgc2l6ZSBpcyB1c2VkIGZvciBkZXRlcm1pbmluZyB0aGUgbWFya2luZworcHJvYmFiaWxpdHkuIFRoaXMgaXMgY2FsY3VsYXRlZCB1c2luZyBhbiBFeHBvbmVudGlhbCBXZWlnaHRlZCBNb3ZpbmcKK0F2ZXJhZ2UsIHdoaWNoIGNhbiBiZSBtb3JlIG9yIGxlc3Mgc2Vuc2l0aXZlIHRvIGJ1cnN0cy4KKworV2hlbiB0aGUgYXZlcmFnZSBxdWV1ZSBzaXplIGlzIGJlbG93CisuQiBtaW4KK2J5dGVzLCBubyBwYWNrZXQgd2lsbCBldmVyIGJlIG1hcmtlZC4gV2hlbiBpdCBleGNlZWRzCisuQiBtaW4sCit0aGUgcHJvYmFiaWxpdHkgb2YgZG9pbmcgc28gY2xpbWJzIGxpbmVhcmx5IHVwCit0bworLkIgcHJvYmFiaWxpdHksCit1bnRpbCB0aGUgYXZlcmFnZSBxdWV1ZSBzaXplIGhpdHMKKy5CIG1heAorYnl0ZXMuIEJlY2F1c2UKKy5CIHByb2JhYmlsaXR5CitpcyBub3JtYWxseSBub3Qgc2V0IHRvIDEwMCUsIHRoZSBxdWV1ZSBzaXplIG1pZ2h0Citjb25jZWl2YWJseSByaXNlIGFib3ZlCisuQiBtYXgKK2J5dGVzLCBzbyB0aGUKKy5CIGxpbWl0CitwYXJhbWV0ZXIgaXMgcHJvdmlkZWQgdG8gc2V0IGEgaGFyZCBtYXhpbXVtIGZvciB0aGUgc2l6ZSBvZiB0aGUgcXVldWUuCisKKy5TSCBQQVJBTUVURVJTCisuVFAKK21pbgorQXZlcmFnZSBxdWV1ZSBzaXplIGF0IHdoaWNoIG1hcmtpbmcgYmVjb21lcyBhIHBvc3NpYmlsaXR5LiBEZWZhdWx0cyB0bworLkIgbWF4CisvMworCisuVFAKK21heAorQXQgdGhpcyBhdmVyYWdlIHF1ZXVlIHNpemUsIHRoZSBtYXJraW5nIHByb2JhYmlsaXR5IGlzIG1heGltYWwuIFNob3VsZCBiZSBhdAorbGVhc3QgdHdpY2UKKy5CIG1pbgordG8gcHJldmVudCBzeW5jaHJvbm91cyByZXRyYW5zbWl0cywgaGlnaGVyIGZvciBsb3cKKy5CIG1pbi4KK0RlZmF1bHQgdG8KKy5CIGxpbWl0CisvNAorLlRQCitwcm9iYWJpbGl0eQorTWF4aW11bSBwcm9iYWJpbGl0eSBmb3IgbWFya2luZywgc3BlY2lmaWVkIGFzIGEgZmxvYXRpbmcgcG9pbnQKK251bWJlciBmcm9tIDAuMCB0byAxLjAuIFN1Z2dlc3RlZCB2YWx1ZXMgYXJlIDAuMDEgb3IgMC4wMiAoMSBvciAyJSwKK3Jlc3BlY3RpdmVseSkuIERlZmF1bHQgOiAwLjAyCisuVFAKK2xpbWl0CitIYXJkIGxpbWl0IG9uIHRoZSByZWFsIChub3QgYXZlcmFnZSkgcXVldWUgc2l6ZSBpbiBieXRlcy4gRnVydGhlciBwYWNrZXRzCithcmUgZHJvcHBlZC4gU2hvdWxkIGJlIHNldCBoaWdoZXIgdGhhbiBtYXgrYnVyc3QuIEl0IGlzIGFkdmlzZWQgdG8gc2V0IHRoaXMKK2EgZmV3IHRpbWVzIGhpZ2hlciB0aGFuCisuQiBtYXguCisuVFAKK2J1cnN0CitVc2VkIGZvciBkZXRlcm1pbmluZyBob3cgZmFzdCB0aGUgYXZlcmFnZSBxdWV1ZSBzaXplIGlzIGluZmx1ZW5jZWQgYnkgdGhlCityZWFsIHF1ZXVlIHNpemUuIExhcmdlciB2YWx1ZXMgbWFrZSB0aGUgY2FsY3VsYXRpb24gbW9yZSBzbHVnZ2lzaCwgYWxsb3dpbmcKK2xvbmdlciBidXJzdHMgb2YgdHJhZmZpYyBiZWZvcmUgbWFya2luZyBzdGFydHMuIFJlYWwgbGlmZSBleHBlcmltZW50cworc3VwcG9ydCB0aGUgZm9sbG93aW5nIGd1aWRlbGluZTogKG1pbittaW4rbWF4KS8oMyphdnBrdCkuCisuVFAKK2F2cGt0CitTcGVjaWZpZWQgaW4gYnl0ZXMuIFVzZWQgd2l0aCBidXJzdCB0byBkZXRlcm1pbmUgdGhlIHRpbWUgY29uc3RhbnQgZm9yCithdmVyYWdlIHF1ZXVlIHNpemUgY2FsY3VsYXRpb25zLiAxMDAwIGlzIGEgZ29vZCB2YWx1ZS4KKy5UUAorYmFuZHdpZHRoCitUaGlzIHJhdGUgaXMgdXNlZCBmb3IgY2FsY3VsYXRpbmcgdGhlIGF2ZXJhZ2UgcXVldWUgc2l6ZSBhZnRlciBzb21lCitpZGxlIHRpbWUuIFNob3VsZCBiZSBzZXQgdG8gdGhlIGJhbmR3aWR0aCBvZiB5b3VyIGludGVyZmFjZS4gRG9lcyBub3QgbWVhbgordGhhdCBSRUQgd2lsbCBzaGFwZSBmb3IgeW91ISBPcHRpb25hbC4gRGVmYXVsdCA6IDEwTWJpdAorLlRQCitlY24KK0FzIG1lbnRpb25lZCBiZWZvcmUsIFJFRCBjYW4gZWl0aGVyICdtYXJrJyBvciAnZHJvcCcuIEV4cGxpY2l0IENvbmdlc3Rpb24KK05vdGlmaWNhdGlvbiBhbGxvd3MgUkVEIHRvIG5vdGlmeSByZW1vdGUgaG9zdHMgdGhhdCB0aGVpciByYXRlIGV4Y2VlZHMgdGhlCithbW91bnQgb2YgYmFuZHdpZHRoIGF2YWlsYWJsZS4gTm9uLUVDTiBjYXBhYmxlIGhvc3RzIGNhbiBvbmx5IGJlIG5vdGlmaWVkIGJ5Citkcm9wcGluZyBhIHBhY2tldC4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkLCBwYWNrZXRzIHdoaWNoIGluZGljYXRlCit0aGF0IHRoZWlyIGhvc3RzIGhvbm9yIEVDTiB3aWxsIG9ubHkgYmUgbWFya2VkIGFuZCBub3QgZHJvcHBlZCwgdW5sZXNzIHRoZQorcXVldWUgc2l6ZSBoaXRzCisuQiBsaW1pdAorYnl0ZXMuIFJlY29tbWVuZGVkLgorLlRQCitoYXJkZHJvcAorSWYgYXZlcmFnZSBmbG93IHF1ZXVlIHNpemUgaXMgYWJvdmUKKy5CIG1heAorYnl0ZXMsIHRoaXMgcGFyYW1ldGVyIGZvcmNlcyBhIGRyb3AgaW5zdGVhZCBvZiBlY24gbWFya2luZy4KKy5UUAorYWRhcHRpdmUKKyhBZGRlZCBpbiBsaW51eC0zLjMpIFNldHMgUkVEIGluIGFkYXB0aXZlIG1vZGUgYXMgZGVzY3JpYmVkIGluIGh0dHA6Ly9pY2lyLm9yZy9mbG95ZC9wYXBlcnMvYWRhcHRpdmVSZWQucGRmCisubmYKK0dvYWwgb2YgQWRhcHRpdmUgUkVEIGlzIHRvIG1ha2UgJ3Byb2JhYmlsaXR5JyBkeW5hbWljIHZhbHVlIGJldHdlZW4gMSUgYW5kIDUwJSB0byByZWFjaCB0aGUgdGFyZ2V0IGF2ZXJhZ2UgcXVldWUgOgorLkIgKG1heCAtIG1pbikgLyAyCisuZmkKKworLlNIIEVYQU1QTEUKKworLlAKKyMgdGMgcWRpc2MgYWRkIGRldiBldGgwIHBhcmVudCAxOjEgaGFuZGxlIDEwOiByZWQKKyBsaW1pdCA0MDAwMDAgbWluIDMwMDAwIG1heCA5MDAwMCBhdnBrdCAxMDAwCisgYnVyc3QgNTUgZWNuIGFkYXB0aXZlIGJhbmR3aWR0aCAxME1iaXQKKworLlNIIFNFRSBBTFNPCisuQlIgdGMgKDgpLAorLkJSIHRjLWNob2tlICg4KQorCisuU0ggU09VUkNFUworLlRQCitvCitGbG95ZCwgUy4sIGFuZCBKYWNvYnNvbiwgVi4sIFJhbmRvbSBFYXJseSBEZXRlY3Rpb24gZ2F0ZXdheXMgZm9yCitDb25nZXN0aW9uIEF2b2lkYW5jZS4gaHR0cDovL3d3dy5hY2lyaS5vcmcvZmxveWQvcGFwZXJzL3JlZC9yZWQuaHRtbAorLlRQCitvCitTb21lIGNoYW5nZXMgdG8gdGhlIGFsZ29yaXRobSBieSBBbGV4ZXkgTi4gS3V6bmV0c292LgorLlRQCitvCitBZGFwdGl2ZSBSRUQgIDogaHR0cDovL2ljaXIub3JnL2Zsb3lkL3BhcGVycy9hZGFwdGl2ZVJlZC5wZGYKKworLlNIIEFVVEhPUlMKK0FsZXhleSBOLiBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4sICBBbGV4ZXkgTWFrYXJlbmtvCis8bWFrYXJAcGhvZW5peC5raGFya292LnVhPiwgSiBIYWRpIFNhbGltIDxoYWRpQG5vcnRlbG5ldHdvcmtzLmNvbT4sCitFcmljIER1bWF6ZXQgPGVyaWMuZHVtYXpldEBnbWFpbC5jb20+LgorVGhpcyBtYW5wYWdlIG1haW50YWluZWQgYnkgYmVydCBodWJlcnQgPGFodUBkczlhLm5sPgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWFuL21hbjgvdGMtcm91dGUuOCBiL2lwcm91dGUyL21hbi9tYW44L3RjLXJvdXRlLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg2NWNkMQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L3RjLXJvdXRlLjgKQEAgLTAsMCArMSw3NCBAQAorLlRIICJSb3V0ZSBjbGFzc2lmaWVyIGluIHRjIiA4ICIyMSBPY3QgMjAxNSIgImlwcm91dGUyIiAiTGludXgiCisKKy5TSCBOQU1FCityb3V0ZSBcLSByb3V0ZSB0cmFmZmljIGNvbnRyb2wgZmlsdGVyCisuU0ggU1lOT1BTSVMKKy5pbiArOAorLnRpIC04CisuQlIgdGMgIiAiIGZpbHRlciAiIC4uLiAiIHJvdXRlICIgWyAiIGZyb20KKy5JUiBSRUFMTSAiIHwgIgorLkIgZnJvbWlmCisuSVIgVEFHICIgXSBbICIKKy5CIHRvCisuSVIgUkVBTE0gIiBdIFsgIgorLkIgY2xhc3NpZAorLklSIENMQVNTSUQgIiBdIFsgIgorLkIgYWN0aW9uCisuSVIgQUNUSU9OX1NQRUMgIiBdIgorLlNIIERFU0NSSVBUSU9OCitNYXRjaCBwYWNrZXRzIGJhc2VkIG9uIHJvdXRpbmcgdGFibGUgZW50cmllcy4gVGhpcyBmaWx0ZXIgY2VudGVycyBhcm91bmQgdGhlCitwb3NzaWJpbGl0eSB0byBhc3NpZ24gYQorLkIgcmVhbG0KK3RvIHJvdXRpbmcgdGFibGUgZW50cmllcy4gRm9yIGFueSBwYWNrZXQgdG8gYmUgY2xhc3NpZmllZCBieSB0aGlzIGZpbHRlciwgYQorcm91dGluZyB0YWJsZSBsb29rdXAgaXMgcGVyZm9ybWVkIGFuZCB0aGUgcmV0dXJuZWQKKy5CIHJlYWxtCitpcyB1c2VkIHRvIGRlY2lkZSBvbiB3aGV0aGVyIHRoZSBwYWNrZXQgaXMgYSBtYXRjaCBvciBub3QuCisuU0ggT1BUSU9OUworLlRQCisuQkkgYWN0aW9uICIgQUNUSU9OX1NQRUMiCitBcHBseSBhbiBhY3Rpb24gZnJvbSB0aGUgZ2VuZXJpYyBhY3Rpb25zIGZyYW1ld29yayBvbiBtYXRjaGluZyBwYWNrZXRzLgorLlRQCisuQkkgY2xhc3NpZCAiIENMQVNTSUQiCitQdXNoIG1hdGNoaW5nIHBhY2tldHMgaW50byB0aGUgY2xhc3MgaWRlbnRpZmllZCBieQorLklSIENMQVNTSUQgLgorLlRQCisuQkkgZnJvbSAiIFJFQUxNIgorLlRRCisuQkkgZnJvbWlmICIgVEFHIgorUGVyZm9ybSBzb3VyY2Ugcm91dGUgbG9va3Vwcy4KKy5JIFRBRworaXMgdGhlIG5hbWUgb2YgYW4gaW50ZXJmYWNlIHdoaWNoIG11c3QgYmUgcHJlc2VudCBvbiB0aGUgc3lzdGVtIGF0IHRoZSB0aW1lIG9mCisuQiB0YworaW52b2NhdGlvbi4KKy5UUAorLkJJIHRvICIgUkVBTE0iCitNYXRjaCBpZiBub3JtYWwgKGkuZS4sIGRlc3RpbmF0aW9uKSByb3V0aW5nIHJldHVybnMgdGhlIGdpdmVuCisuSVIgUkVBTE0gLgorLlNIIEVYQU1QTEVTCitDb25zaWRlciB0aGUgc3VibmV0IDE5Mi4xNjguMi4wLzI0IGJlaW5nIGF0dGFjaGVkIHRvIGV0aDA6CisKKy5SUworLkVYCitpcCByb3V0ZSBhZGQgMTkyLjE2OC4yLjAvMjQgZGV2IGV0aDAgcmVhbG0gMgorLkVFCisuUkUKKworVGhlIGZvbGxvd2luZworLkIgcm91dGUKK2ZpbHRlciB3aWxsIHRoZW4gbWF0Y2ggcGFja2V0cyBmcm9tIHRoYXQgc3VibmV0OgorCisuUlMKKy5FWAordGMgZmlsdGVyIGFkZCAuLi4gcm91dGUgZnJvbSAyIGNsYXNzaWQgMToyCisuRUUKKy5SRQorCithbmQgcGFzcyBwYWNrZXRzIG9uIHRvIGNsYXNzIDE6Mi4KKy5TSCBOT1RFUworRHVlIHRvIGltcGxlbWVudGF0aW9uIGRldGFpbHMsCisuQiByZWFsbQordmFsdWVzIG11c3QgYmUgaW4gYSByYW5nZSBmcm9tIDAgdG8gMjU1LCBpbmNsdXNpdmUuIEFsdGVybmF0aXZlbHksIGEgdmVyYm9zZQorbmFtZSBkZWZpbmVkIGluIC9ldGMvaXByb3V0ZTIvcnRfcmVhbG1zIG1heSBiZSBnaXZlbiBpbnN0ZWFkLgorLlNIIFNFRSBBTFNPCisuQlIgdGMgKDgpLAorLkJSIGlwLXJvdXRlICg4KQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWFuL21hbjgvdGMtc2ZiLjggYi9pcHJvdXRlMi9tYW4vbWFuOC90Yy1zZmIuOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWQxOWUxCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbWFuL21hbjgvdGMtc2ZiLjgKQEAgLTAsMCArMSwyMTMgQEAKKy5USCBTRkIgOCAiQXVndXN0IDIwMTEiICJpcHJvdXRlMiIgIkxpbnV4IgorLlNIIE5BTUUKK3NmYiBcLSBTdG9jaGFzdGljIEZhaXIgQmx1ZQorLlNIIFNZTk9QU0lTCisuQiB0YyBxZGlzYyAuLi4gYmx1ZQorLkIgcmVoYXNoCittaWxsaXNlY29uZHMKKy5CIGRiCittaWxsaXNlY29uZHMKKy5CIGxpbWl0CitwYWNrZXRzCisuQiBtYXgKK3BhY2tldHMKKy5CIHRhcmdldAorcGFja2V0cworLkIgaW5jcmVtZW50CitmbG9hdAorLkIgZGVjcmVtZW50CitmbG9hdAorLkIgcGVuYWx0eV9yYXRlCitwYWNrZXRzIHBlciBzZWNvbmQKKy5CIHBlbmFsdHlfYnVyc3QKK3BhY2tldHMKKworLlNIIERFU0NSSVBUSU9OCitTdG9jaGFzdGljIEZhaXIgQmx1ZSBpcyBhIGNsYXNzbGVzcyBxZGlzYyB0byBtYW5hZ2UgY29uZ2VzdGlvbiBiYXNlZCBvbgorcGFja2V0IGxvc3MgYW5kIGxpbmsgdXRpbGl6YXRpb24gaGlzdG9yeSB3aGlsZSB0cnlpbmcgdG8gcHJldmVudAorbm9uLXJlc3BvbnNpdmUgZmxvd3MgKGkuZS4gZmxvd3MgdGhhdCBkbyBub3QgcmVhY3QgdG8gY29uZ2VzdGlvbiBtYXJraW5nCitvciBkcm9wcGVkIHBhY2tldHMpIGZyb20gaW1wYWN0aW5nIHBlcmZvcm1hbmNlIG9mIHJlc3BvbnNpdmUgZmxvd3MuCitVbmxpa2UgUkVELCB3aGVyZSB0aGUgbWFya2luZyBwcm9iYWJpbGl0eSBoYXMgdG8gYmUgY29uZmlndXJlZCwgQkxVRQordHJpZXMgdG8gZGV0ZXJtaW5lIHRoZSBpZGVhbCBtYXJraW5nIHByb2JhYmlsaXR5IGF1dG9tYXRpY2FsbHkuCisKKy5TSCBBTEdPUklUSE0KKworVGhlCisuQiBCTFVFCithbGdvcml0aG0gbWFpbnRhaW5zIGEgcHJvYmFiaWxpdHkgd2hpY2ggaXMgdXNlZCB0byBtYXJrIG9yIGRyb3AgcGFja2V0cwordGhhdCBhcmUgdG8gYmUgcXVldWVkLiBJZiB0aGUgcXVldWUgb3ZlcmZsb3dzLCB0aGUgbWFyay9kcm9wIHByb2JhYmlsaXR5CitpcyBpbmNyZWFzZWQuIElmIHRoZSBxdWV1ZSBiZWNvbWVzIGVtcHR5LCB0aGUgcHJvYmFiaWxpdHkgaXMgZGVjcmVhc2VkLiBUaGUKKy5CIFN0b2NoYXN0aWMgRmFpciBCbHVlCisoU0ZCKSBhbGdvcml0aG0gaXMgZGVzaWduZWQgdG8gcHJvdGVjdCBUQ1AgZmxvd3MgYWdhaW5zdCBub24tcmVzcG9uc2l2ZSBmbG93cy4KKworVGhpcyBTRkIgaW1wbGVtZW50YXRpb24gbWFpbnRhaW5zIDggbGV2ZWxzIG9mIDE2IGJpbnMgZWFjaCBmb3IgYWNjb3VudGluZy4KK0VhY2ggZmxvdyBpcyBtYXBwZWQgaW50byBhIGJpbiBvZiBlYWNoIGxldmVsIHVzaW5nIGEgcGVyLWxldmVsIGhhc2ggdmFsdWUuCisKK0V2ZXJ5IGJpbiBtYWludGFpbnMgYSBtYXJraW5nIHByb2JhYmlsaXR5LCB3aGljaCBnZXRzIGluY3JlYXNlZCBvciBkZWNyZWFzZWQKK2Jhc2VkIG9uIGJpbiBvY2N1cGFuY3kuIElmIHRoZSBudW1iZXIgb2YgcGFja2V0cyBleGNlZWRzIHRoZSBzaXplIG9mIHRoYXQKK2JpbiwgdGhlIG1hcmtpbmcgcHJvYmFiaWxpdHkgaXMgaW5jcmVhc2VkLiBJZiB0aGUgbnVtYmVyIGRyb3BzIHRvIHplcm8sIGl0CitpcyBkZWNyZWFzZWQuCisKK1RoZSBtYXJraW5nIHByb2JhYmlsaXR5IGlzIGJhc2VkIG9uIHRoZSBtaW5pbXVtIHZhbHVlIG9mIGFsbCBiaW5zIGEgZmxvdyBpcworbWFwcGVkIGludG8sIHRodXMsIHdoZW4gYSBmbG93IGRvZXMgbm90IHJlc3BvbmQgdG8gbWFya2luZyBvciBncmFkdWFsIHBhY2tldAorZHJvcHMsIHRoZSBtYXJraW5nIHByb2JhYmlsaXR5IHF1aWNrbHkgcmVhY2hlcyBvbmUuCisKK0luIHRoaXMgY2FzZSwgdGhlIGZsb3cgaXMgcmF0ZS1saW1pdGVkIHRvCisuQiBwZW5hbHR5X3JhdGUKK3BhY2tldHMgcGVyIHNlY29uZC4KKworLlNIIExJTUlUQVRJT05TCisKK0R1ZSB0byBTRkJzIG5hdHVyZSwgaXQgaXMgcG9zc2libGUgZm9yIHJlc3BvbnNpdmUgZmxvd3MgdG8gc2hhcmUgYWxsIG9mIGl0cyBiaW5zCit3aXRoIGEgbm9uLXJlc3BvbnNpdmUgZmxvdywgY2F1c2luZyB0aGUgcmVzcG9uc2l2ZSBmbG93IHRvIGJlIG1pc2lkZW50aWZpZWQgYXMKK2JlaW5nIG5vbi1yZXNwb25zaXZlLgorCitUaGUgcHJvYmFiaWxpdHkgb2YgYSByZXNwb25zaXZlIGZsb3cgdG8gYmUgbWlzaWRlbnRpZmllZCBpcyBkZXBlbmRlbnQgb24KK3RoZSBudW1iZXIgb2Ygbm9uLXJlc3BvbnNpdmUgZmxvd3MsIE0uIEl0IGlzICgxIC0gKDEgLSAoMSAvIDE2LjApKSAqKiBNKSAqKjgsCitzbyBmb3IgZXhhbXBsZSB3aXRoIDEwIG5vbi1yZXNwb25zaXZlIGZsb3dzIGFwcHJveGltYXRlbHkgMC4yJSBvZiByZXNwb25zaXZlIGZsb3dzCit3aWxsIGJlIG1pc2lkZW50aWZpZWQuCisKK1RvIG1pdGlnYXRlIHRoaXMsIFNGQiBwZXJmb3JtcyBwZXJmb3JtcyBwZXJpb2RpYyByZS1oYXNoaW5nIHRvIGF2b2lkCittaXNjbGFzc2lmaWNhdGlvbiBmb3IgcHJvbG9uZ2VkIHBlcmlvZHMgb2YgdGltZS4KKworVGhlIGRlZmF1bHQgaGFzaGluZyBtZXRob2Qgd2lsbCB1c2Ugc291cmNlIGFuZCBkZXN0aW5hdGlvbiBpcCBhZGRyZXNzZXMgYW5kIHBvcnQgbnVtYmVycworaWYgcG9zc2libGUsIGFuZCBhbHNvIHN1cHBvcnRzIHR1bm5lbGluZyBwcm90b2NvbHMuCitBbHRlcm5hdGl2ZWx5LCBhbiBleHRlcm5hbCBjbGFzc2lmaWVyIGNhbiBiZSBjb25maWd1cmVkLCB0b28uCisKKy5TSCBQQVJBTUVURVJTCisuVFAKK3JlaGFzaAorVGltZSBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgd2hlbiBxdWV1ZSBwZXJ0dXJiYXRpb24gb2NjdXJzIHRvIGF2b2lkIGVycm9uZW91c2x5CitkZXRlY3RpbmcgdW5yZWxhdGVkLCByZXNwb25zaXZlIGZsb3dzIGFzIGJlaW5nIHBhcnQgb2YgYSBub24tcmVzcG9uc2l2ZSBmbG93IGZvcgorcHJvbG9uZ2VkIHBlcmlvZHMgb2YgdGltZS4KK0RlZmF1bHRzIHRvIDEwIG1pbnV0ZXMuCisuVFAKK2RiCitEb3VibGUgYnVmZmVyaW5nIHdhcm11cCB3YWl0IHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KK1RvIGF2b2lkIGRlc3Ryb3lpbmcgdGhlIHByb2JhYmlsaXR5IGhpc3Rvcnkgd2hlbiByZWhhc2hpbmcgaXMgcGVyZm9ybWVkLCB0aGlzCitpbXBsZW1lbnRhdGlvbiBtYWludGFpbnMgYSBzZWNvbmQgc2V0IG9mIGxldmVscy9iaW5zIGFzIGRlc2NyaWJlZCBpbiBzZWN0aW9uCis0LjQgb2YgdGhlIFNGQiByZWZlcmVuY2UuCitXaGlsZSBvbmUgc2V0IGlzIHVzZWQgdG8gbWFuYWdlIHRoZSBxdWV1ZSwgYSBzZWNvbmQgc2V0IGlzIHdhcm1lZCB1cDoKK1doZW5ldmVyIGEgZmxvdyBpcyB0aGVuIGRldGVybWluZWQgdG8gYmUgbm9uLXJlc3BvbnNpdmUsIHRoZSBtYXJraW5nCitwcm9iYWJpbGl0aWVzIGluIHRoZSBzZWNvbmQgc2V0IGFyZSB1cGRhdGVkLiBXaGVuIHRoZSByZWhhc2hpbmcKK2hhcHBlbnMsIHRoZXNlIGJpbnMgd2lsbCBiZSB1c2VkIHRvIG1hbmFnZSB0aGUgcXVldWUgYW5kIGFsbCBub24tcmVzcG9uc2l2ZQorZmxvd3MgY2FuIGJlIHJhdGUtbGltaXRlZCBpbW1lZGlhdGVseS4KK1RoaXMgdmFsdWUgZGV0ZXJtaW5lcyBob3cgbXVjaCB0aW1lIGhhcyB0byBwYXNzIGJlZm9yZSB0aGUgMm5kIHNldAord2lsbCBzdGFydCB0byBiZSB3YXJtZWQgdXAuCitEZWZhdWx0cyB0byBvbmUgbWludXRlLCBzaG91bGQgYmUgbG93ZXIgdGhhbgorLkIKK3JlaGFzaC4KKy5UUAorbGltaXQKK0hhcmQgbGltaXQgb24gdGhlIHJlYWwgKG5vdCBhdmVyYWdlKSB0b3RhbCBxdWV1ZSBzaXplIGluIHBhY2tldHMuCitGdXJ0aGVyIHBhY2tldHMgYXJlIGRyb3BwZWQuIERlZmF1bHRzIHRvIHRoZSB0cmFuc21pdCBxdWV1ZSBsZW5ndGggb2YgdGhlCitkZXZpY2UgdGhlIHFkaXNjIGlzIGF0dGFjaGVkIHRvLgorLlRQCittYXgKK01heGltdW0gbGVuZ3RoIG9mIGEgYnVja2V0cyBxdWV1ZSwgaW4gcGFja2V0cywgYmVmb3JlIHBhY2tldHMgc3RhcnQgYmVpbmcKK2Ryb3BwZWQuIFNob3VsZCBiZSBzaWdodGx5IGxhcmdlciB0aGFuCisuQiB0YXJnZXQKKywgYnV0IHNob3VsZCBub3QgYmUgc2V0IHRvIHZhbHVlcyBleGNlZWRpbmcgMS41IHRpbWVzIHRoYXQgb2YKKy5CIHRhcmdldCAuCitEZWZhdWx0cyB0byAyNS4KKy5UUAordGFyZ2V0CitUaGUgZGVzaXJlZCBhdmVyYWdlIGJpbiBsZW5ndGguIElmIHRoZSBiaW4gcXVldWUgbGVuZ3RoIHJlYWNoZXMgdGhpcyB2YWx1ZSwKK3RoZSBtYXJraW5nIHByb2JhYmlsaXR5IGlzIGluY3JlYXNlZCBieQorLkIgaW5jcmVtZW50LgorVGhlIGRlZmF1bHQgdmFsdWUgZGVwZW5kcyBvbiB0aGUKKy5CIG1heAorc2V0dGluZywgd2l0aCBtYXggc2V0IHRvIDI1CisuQiB0YXJnZXQKK3dpbGwgZGVmYXVsdCB0byAyMC4KKy5UUAoraW5jcmVtZW50CitBIHZhbHVlIHVzZWQgdG8gaW5jcmVhc2UgdGhlIG1hcmtpbmcgcHJvYmFiaWxpdHkgd2hlbiB0aGUgcXVldWUgYXBwZWFycwordG8gYmUgb3Zlci11c2VkLiBNdXN0IGJlIGJldHdlZW4gMCBhbmQgMS4wLiBEZWZhdWx0cyB0byAwLjAwMDUwLgorLlRQCitkZWNyZW1lbnQKK1ZhbHVlIHVzZWQgdG8gZGVjcmVhc2UgdGhlIG1hcmtpbmcgcHJvYmFiaWxpdHkgd2hlbiB0aGUgcXVldWUgaXMgZm91bmQKK3RvIGJlIGVtcHR5LiBNdXN0IGJlIGJldHdlZW4gMCBhbmQgMS4wLgorRGVmYXVsdHMgdG8gMC4wMDAwNS4KKy5UUAorcGVuYWx0eV9yYXRlCitUaGUgbWF4aW11bSBudW1iZXIgb2YgcGFja2V0cyBiZWxvbmdpbmcgdG8gZmxvd3MgaWRlbnRpZmllZCBhcyBiZWluZworbm9uLXJlc3BvbnNpdmUgdGhhdCBjYW4gYmUgZW5xdWV1ZWQgcGVyIHNlY29uZC4gT25jZSB0aGlzIG51bWJlciBoYXMgYmVlbgorcmVhY2hlZCwgZnVydGhlciBwYWNrZXRzIG9mIHN1Y2ggbm9uLXJlc3BvbnNpdmUgZmxvd3MgYXJlIGRyb3BwZWQuCitTZXQgdGhpcyB0byBhIHJlYXNvbmFibGUgZnJhY3Rpb24gb2YgeW91ciB1cGxpbmsgdGhyb3VnaHB1dDsgdGhlCitkZWZhdWx0IHZhbHVlIG9mIDEwIHBhY2tldHMgaXMgcHJvYmFibHkgdG9vIHNtYWxsLgorLlRQCitwZW5hbHR5X2J1cnN0CitUaGUgbnVtYmVyIG9mIHBhY2tldHMgYSBmbG93IGlzIHBlcm1pdHRlZCB0byBleGNlZWQgdGhlIHBlbmFsdHkgcmF0ZSBiZWZvcmUgcGFja2V0cworc3RhcnQgYmVpbmcgZHJvcHBlZC4KK0RlZmF1bHRzIHRvIDIwIHBhY2tldHMuCisKKy5TSCBTVEFUSVNUSUNTCisKK1RoaXMgcWRpc2MgZXhwb3NlcyBhZGRpdGlvbmFsIHN0YXRpc3RpY3MgdmlhICd0YyAtcyBxZGlzYycgb3V0cHV0LgorVGhlc2UgYXJlOgorLlRQCitlYXJseWRyb3AKK1RoZSBudW1iZXIgb2YgcGFja2V0cyBkcm9wcGVkIGJlZm9yZSBhIHBlci1mbG93IHF1ZXVlIHdhcyBmdWxsLgorLlRQCityYXRlZHJvcAorVGhlIG51bWJlciBvZiBwYWNrZXRzIGRyb3BwZWQgYmVjYXVzZSBvZiByYXRlLWxpbWl0aW5nLgorSWYgdGhpcyB2YWx1ZSBpcyBoaWdoLCB0aGVyZSBhcmUgbWFueSBub24tcmVhY3RpdmUgZmxvd3MgYmVpbmcKK3NlbnQgdGhyb3VnaCBzZmIuIEluIHN1Y2ggY2FzZXMsIGl0IG1pZ2h0IGJlIGJldHRlciB0bworZW1iZWQgc2ZiIHdpdGhpbiBhIGNsYXNzZnVsIHFkaXNjIHRvIGJldHRlciBjb250cm9sIHN1Y2gKK2Zsb3dzIHVzaW5nIGEgZGlmZmVyZW50LCBzaGFwaW5nIHFkaXNjLgorLlRQCitidWNrZXRkcm9wCitUaGUgbnVtYmVyIG9mIHBhY2tldHMgZHJvcHBlZCBiZWNhdXNlIGEgcGVyLWZsb3cgcXVldWUgd2FzIGZ1bGwuCitIaWdoIGJ1Y2tldGRyb3AgbWF5IHBvaW50IHRvIGEgaGlnaCBudW1iZXIgb2YgYWdncmVzc2l2ZSwgc2hvcnQtbGl2ZWQKK2Zsb3dzLgorLlRQCitxdWV1ZWRyb3AKK1RoZSBudW1iZXIgb2YgcGFja2V0cyBkcm9wcGVkIGR1ZSB0byByZWFjaGluZyBsaW1pdC4gVGhpcyBzaG91bGQgbm9ybWFsbHkgYmUgMC4KKy5UUAorbWFya2VkCitUaGUgbnVtYmVyIG9mIHBhY2tldHMgbWFya2VkIHdpdGggRUNOLgorLlRQCittYXhxbGVuCitUaGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50IGxvbmdlc3QgcGVyLWZsb3cgKHZpcnR1YWwpIHF1ZXVlLgorLlRQCittYXhwcm9iCitUaGUgbWF4aW11bSBwZXItZmxvdyBkcm9wIHByb2JhYmlsaXR5LiAxIG1lYW5zIHRoYXQgc29tZQorZmxvd3MgaGF2ZSBiZWVuIGRldGVjdGVkIGFzIG5vbi1yZWFjdGl2ZS4KKworLlNIIE5PVEVTCisKK1NGQiBhdXRvbWF0aWNhbGx5IGVuYWJsZXMgdXNlIG9mIEV4cGxpY2l0IENvbmdlc3Rpb24gTm90aWZpY2F0aW9uIChFQ04pLgorQWxzbywgdGhpcyBTRkIgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcXVldWUgcGFja2V0cyBpdHNlbGYuCitSYXRoZXIsIHBhY2tldHMgYXJlIGVucXVldWVkIHRvIHRoZSBpbm5lciBxZGlzYyAoZGVmYXVsdHMgdG8gcGZpZm8pLgorQmVjYXVzZSBzZmIgbWFpbnRhaW5zIHZpcnR1YWwgcXVldWUgc3RhdGVzLCB0aGUgaW5uZXIgcWRpc2MgbXVzdCBub3QKK2Ryb3AgYSBwYWNrZXQgcHJldmlvdXNseSBxdWV1ZWQuCitGdXJ0aGVybW9yZSwgaWYgYSBidWNrZXRzIHF1ZXVlIGhhcyBhIHZlcnkgaGlnaCBtYXJraW5nIHJhdGUsCit0aGlzIGltcGxlbWVudGF0aW9uIHdpbGwgc3RhcnQgZHJvcHBpbmcgcGFja2V0cyBpbnN0ZWFkIG9mCittYXJraW5nIHRoZW0sIGFzIHN1Y2ggYSBzaXR1YXRpb24gcG9pbnRzIHRvIGVpdGhlciBiYWQgY29uZ2VzdGlvbiwgb3IgYW4KK3VucmVzcG9uc2l2ZSBmbG93LgorCisuU0ggRVhBTVBMRSAmIFVTQUdFCisKK1RvIGF0dGFjaCB0byBpbnRlcmZhY2UgJERFViwgdXNpbmcgZGVmYXVsdCBvcHRpb25zOgorLlAKKyMgdGMgcWRpc2MgYWRkIGRldiAkREVWIGhhbmRsZSAxOiByb290IHNmYgorCitPbmx5IHVzZSBkZXN0aW5hdGlvbiBpcCBhZGRyZXNzZXMgZm9yIGFzc2lnbmluZyBwYWNrZXRzIHRvIGJpbnMsIHBlcnR1cmJpbmcKK2hhc2ggcmVzdWx0cyBldmVyeSAxMCBtaW51dGVzOgorLlAKKyMgdGMgZmlsdGVyIGFkZCBkZXYgJERFViBwYXJlbnQgMTogaGFuZGxlIDEgZmxvdyBoYXNoIGtleXMgZHN0IHBlcnR1cmIgNjAwCisKKy5TSCBTRUUgQUxTTworLkJSIHRjICg4KSwKKy5CUiB0Yy1yZWQgKDgpLAorLkJSIHRjLXNmcSAoOCkKKy5TSCBTT1VSQ0VTCisuVFAKK28KK1cuIEZlbmcsIEQuIEthbmRsdXIsIEQuIFNhaGEsIEsuIFNoaW4sIEJMVUU6IEEgTmV3IENsYXNzIG9mIEFjdGl2ZSBRdWV1ZSBNYW5hZ2VtZW50IEFsZ29yaXRobXMsCitVLiBNaWNoaWdhbiBDU0UtVFItMzg3LTk5LCBBcHJpbCAxOTk5LgorCisuU0ggQVVUSE9SUworCitUaGlzIFNGQiBpbXBsZW1lbnRhdGlvbiB3YXMgY29udHJpYnV0ZWQgYnkgSnVsaXVzeiBDaHJvYm9jemVrIGFuZCBFcmljIER1bWF6ZXQuCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9tYW4vbWFuOC90Yy1zZnEuOCBiL2lwcm91dGUyL21hbi9tYW44L3RjLXNmcS44Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNGQ4YjgKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9tYW4vbWFuOC90Yy1zZnEuOApAQCAtMCwwICsxLDIyMiBAQAorLlRIIFRDIDggIjI0IEphbnVhcnkgMjAxMiIgImlwcm91dGUyIiAiTGludXgiCisuU0ggTkFNRQorc2ZxIFwtIFN0b2NoYXN0aWMgRmFpcm5lc3MgUXVldWVpbmcKKy5TSCBTWU5PUFNJUworLkIgdGMgcWRpc2MgLi4uCisuQiBbIGRpdmlzb3IKK2hhc2h0YWJsZXNpemUKKy5CIF0gWyBsaW1pdAorcGFja2V0cworLkIgXSBbIHBlcnR1cmIKK3NlY29uZHMKKy5CIF0gWyBxdWFudHVtCitieXRlcworLkIgXSBbIGZsb3dzCitudW1iZXIKKy5CIF0gWyBkZXB0aAorbnVtYmVyCisuQiBdIFsgaGVhZGRyb3AKKy5CIF0gWyByZWRmbG93bGltaXQKK2J5dGVzCisuQiBdIFsgbWluCitieXRlcworLkIgXSBbIG1heAorYnl0ZXMKKy5CIF0gWyBhdnBrdAorYnl0ZXMKKy5CIF0gWyBidXJzdAorcGFja2V0cworLkIgXSBbIHByb2JhYmlsaXR5CitQCisuQiBdIFsgZWNuCisuQiBdIFsgaGFyZGRyb3AgXQorLlNIIERFU0NSSVBUSU9OCisKK1N0b2NoYXN0aWMgRmFpcm5lc3MgUXVldWVpbmcgaXMgYSBjbGFzc2xlc3MgcXVldWVpbmcgZGlzY2lwbGluZSBhdmFpbGFibGUgZm9yCit0cmFmZmljIGNvbnRyb2wgd2l0aCB0aGUKKy5CUiB0YyAoOCkKK2NvbW1hbmQuCisKK1NGUSBkb2VzIG5vdCBzaGFwZSB0cmFmZmljIGJ1dCBvbmx5IHNjaGVkdWxlcyB0aGUgdHJhbnNtaXNzaW9uIG9mIHBhY2tldHMsIGJhc2VkIG9uICdmbG93cycuCitUaGUgZ29hbCBpcyB0byBlbnN1cmUgZmFpcm5lc3Mgc28gdGhhdCBlYWNoIGZsb3cgaXMgYWJsZSB0byBzZW5kIGRhdGEgaW4gdHVybiwgdGh1cyBwcmV2ZW50aW5nCithbnkgc2luZ2xlIGZsb3cgZnJvbSBkcm93bmluZyBvdXQgdGhlIHJlc3QuCisKK1RoaXMgbWF5IGluIGZhY3QgaGF2ZSBzb21lIGVmZmVjdCBpbiBtaXRpZ2F0aW5nIGEgRGVuaWFsIG9mIFNlcnZpY2UgYXR0ZW1wdC4KKworU0ZRIGlzIHdvcmstY29uc2VydmluZyBhbmQgdGhlcmVmb3JlIGFsd2F5cyBkZWxpdmVycyBhIHBhY2tldCBpZiBpdCBoYXMgb25lIGF2YWlsYWJsZS4KKy5TSCBBTEdPUklUSE0KK09uIGVucXVldWVpbmcsIGVhY2ggcGFja2V0IGlzIGFzc2lnbmVkIHRvIGEgaGFzaCBidWNrZXQsIGJhc2VkIG9uIHRoZSBwYWNrZXRzIGhhc2ggdmFsdWUuCitUaGlzIGhhc2ggdmFsdWUgaXMgZWl0aGVyIG9idGFpbmVkIGZyb20gYW4gZXh0ZXJuYWwgZmxvdyBjbGFzc2lmaWVyICh1c2UKKy5CCit0YyBmaWx0ZXIKK3RvIHNldCB0aGVtKSwgb3IgYSBkZWZhdWx0IGludGVybmFsIGNsYXNzaWZpZXIgaWYgbm8gZXh0ZXJuYWwgY2xhc3NpZmllciBoYXMgYmVlbiBjb25maWd1cmVkLgorCitXaGVuIHRoZSBpbnRlcm5hbCBjbGFzc2lmaWVyIGlzIHVzZWQsIHNmcSB1c2VzCisuVFAKKyhpKQorU291cmNlIGFkZHJlc3MKKy5UUAorKGlpKQorRGVzdGluYXRpb24gYWRkcmVzcworLlRQCisoaWlpKQorU291cmNlIGFuZCBEZXN0aW5hdGlvbiBwb3J0CisuUAorSWYgdGhlc2UgYXJlIGF2YWlsYWJsZS4gU0ZRIGtub3dzIGFib3V0IGlwdjQgYW5kIGlwdjYgYW5kIGFsc28gVURQLCBUQ1AgYW5kIEVTUC4KK1BhY2tldHMgd2l0aCBvdGhlciBwcm90b2NvbHMgYXJlIGhhc2hlZCBiYXNlZCBvbiB0aGUgMzJiaXRzIHJlcHJlc2VudGF0aW9uIG9mIHRoZWlyCitkZXN0aW5hdGlvbiBhbmQgc291cmNlLiBBIGZsb3cgY29ycmVzcG9uZHMgbW9zdGx5IHRvIGEgVENQL0lQIGNvbm5lY3Rpb24uCisKK0VhY2ggb2YgdGhlc2UgYnVja2V0cyBzaG91bGQgcmVwcmVzZW50IGEgdW5pcXVlIGZsb3cuIEJlY2F1c2UgbXVsdGlwbGUgZmxvd3MgbWF5CitnZXQgaGFzaGVkIHRvIHRoZSBzYW1lIGJ1Y2tldCwgc2ZxcyBpbnRlcm5hbCBoYXNoaW5nIGFsZ29yaXRobSBtYXkgYmUgcGVydHVyYmVkIGF0IGNvbmZpZ3VyYWJsZQoraW50ZXJ2YWxzIHNvIHRoYXQgdGhlIHVuZmFpcm5lc3MgbGFzdHMgb25seSBmb3IgYSBzaG9ydCB3aGlsZS4gUGVydHVyYmF0aW9uIG1heQoraG93ZXZlciBjYXVzZSBzb21lIGluYWR2ZXJ0ZW50IHBhY2tldCByZW9yZGVyaW5nIHRvIG9jY3VyLiBBZnRlciBsaW51eC0zLjMsIHRoZXJlIGlzCitubyBwYWNrZXQgcmVvcmRlcmluZyBwcm9ibGVtLCBidXQgcG9zc2libGUgcGFja2V0IGRyb3BzIGlmIHJlaGFzaGluZyBoaXRzIG9uZSBsaW1pdAorKG51bWJlciBvZiBmbG93cyBvciBwYWNrZXRzIHBlciBmbG93KQorCitXaGVuIGRlcXVldWluZywgZWFjaCBoYXNoYnVja2V0IHdpdGggZGF0YSBpcyBxdWVyaWVkIGluIGEgcm91bmQgcm9iaW4gZmFzaGlvbi4KKworQmVmb3JlIGxpbnV4LTMuMywgdGhlIGNvbXBpbGUgdGltZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgU0ZRIGlzIDEyOCBwYWNrZXRzLCB3aGljaCBjYW4gYmUgc3ByZWFkIG92ZXIKK2F0IG1vc3QgMTI4IGJ1Y2tldHMgb2YgMTAyNCBhdmFpbGFibGUuIEluIGNhc2Ugb2Ygb3ZlcmZsb3csIHRhaWwtZHJvcCBpcyBwZXJmb3JtZWQKK29uIHRoZSBmdWxsZXN0IGJ1Y2tldCwgdGh1cyBtYWludGFpbmluZyBmYWlybmVzcy4KKworQWZ0ZXIgbGludXgtMy4zLCBtYXhpbXVtIGxlbmd0aCBvZiBTRlEgaXMgNjU1MzUgcGFja2V0cywgYW5kIGRpdmlzb3IgbGltaXQgaXMgNjU1MzYuCitJbiBjYXNlIG9mIG92ZXJmbG93LCB0YWlsLWRyb3AgaXMgcGVyZm9ybWVkIG9uIHRoZSBmdWxsZXN0IGJ1Y2tldCwgdW5sZXNzIGhlYWRkcm9wIHdhcyByZXF1ZXN0ZWQuCisKKy5TSCBQQVJBTUVURVJTCisuVFAKK2Rpdmlzb3IKK0NhbiBiZSB1c2VkIHRvIHNldCBhIGRpZmZlcmVudCBoYXNoIHRhYmxlIHNpemUsIGF2YWlsYWJsZSBmcm9tIGtlcm5lbCAyLjYuMzkgb253YXJkcy4KK1RoZSBzcGVjaWZpZWQgZGl2aXNvciBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvIGFuZCBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4gNjU1MzYuCitEZWZhdWx0IHZhbHVlOiAxMDI0LgorLlRQCitsaW1pdAorVXBwZXIgbGltaXQgb2YgdGhlIFNGUS4gQ2FuIGJlIHVzZWQgdG8gcmVkdWNlIHRoZSBkZWZhdWx0IGxlbmd0aCBvZiAxMjcgcGFja2V0cy4KK0FmdGVyIGxpbnV4LTMuMywgaXQgY2FuIGJlIHJhaXNlZC4KKy5UUAorZGVwdGgKK0xpbWl0IG9mIHBhY2tldHMgcGVyIGZsb3cgKGFmdGVyIGxpbnV4LTMuMykuIERlZmF1bHQgdG8gMTI3IGFuZCBjYW4gYmUgbG93ZXJlZC4KKy5UUAorcGVydHVyYgorSW50ZXJ2YWwgaW4gc2Vjb25kcyBmb3IgcXVldWUgYWxnb3JpdGhtIHBlcnR1cmJhdGlvbi4gRGVmYXVsdHMgdG8gMCwgd2hpY2ggbWVhbnMgdGhhdAorbm8gcGVydHVyYmF0aW9uIG9jY3Vycy4gRG8gbm90IHNldCB0b28gbG93IGZvciBlYWNoIHBlcnR1cmJhdGlvbiBtYXkgY2F1c2Ugc29tZSBwYWNrZXQKK3Jlb3JkZXJpbmcgb3IgbG9zc2VzLiBBZHZpc2VkIHZhbHVlOiA2MAorVGhpcyB2YWx1ZSBoYXMgbm8gZWZmZWN0IHdoZW4gZXh0ZXJuYWwgZmxvdyBjbGFzc2lmaWNhdGlvbiBpcyB1c2VkLgorSXRzIGJldHRlciB0byBpbmNyZWFzZSBkaXZpc29yIHZhbHVlIHRvIGxvd2VyIHJpc2sgb2YgaGFzaCBjb2xsaXNpb25zLgorLlRQCitxdWFudHVtCitBbW91bnQgb2YgYnl0ZXMgYSBmbG93IGlzIGFsbG93ZWQgdG8gZGVxdWV1ZSBkdXJpbmcgYSByb3VuZCBvZiB0aGUgcm91bmQgcm9iaW4gcHJvY2Vzcy4KK0RlZmF1bHRzIHRvIHRoZSBNVFUgb2YgdGhlIGludGVyZmFjZSB3aGljaCBpcyBhbHNvIHRoZSBhZHZpc2VkIHZhbHVlIGFuZCB0aGUgbWluaW11bSB2YWx1ZS4KKy5UUAorZmxvd3MKK0FmdGVyIGxpbnV4LTMuMywgaXQgaXMgcG9zc2libGUgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGxpbWl0IG9mIGZsb3dzLgorRGVmYXVsdCB2YWx1ZSBpcyAxMjcKKy5UUAoraGVhZGRyb3AKK0RlZmF1bHQgU0ZRIGJlaGF2aW9yIGlzIHRvIHBlcmZvcm0gdGFpbC1kcm9wIG9mIHBhY2tldHMgZnJvbSBhIGZsb3cuCitZb3UgY2FuIGFzayBhIGhlYWRkcm9wIGluc3RlYWQsIGFzIHRoaXMgaXMga25vd24gdG8gcHJvdmlkZSBhIGJldHRlciBmZWVkYmFjayBmb3IgVENQIGZsb3dzLgorLlRQCityZWRmbG93bGltaXQKK0NvbmZpZ3VyZSB0aGUgb3B0aW9uYWwgUkVEIG1vZHVsZSBvbiB0b3Agb2YgZWFjaCBTRlEgZmxvdy4KK1JhbmRvbSBFYXJseSBEZXRlY3Rpb24gcHJpbmNpcGxlIGlzIHRvIHBlcmZvcm0gcGFja2V0IG1hcmtzIG9yIGRyb3BzIGluIGEgcHJvYmFiaWxpc3RpYyB3YXkuCisobWFuIHRjLXJlZCBmb3IgZGV0YWlscyBhYm91dCBSRUQpCisubmYKK3JlZGZsb3dsaW1pdCBjb25maWd1cmVzIHRoZSBoYXJkIGxpbWl0IG9uIHRoZSByZWFsIChub3QgYXZlcmFnZSkgcXVldWUgc2l6ZSBwZXIgU0ZRIGZsb3cgaW4gYnl0ZXMuCisuZmkKKy5UUAorbWluCitBdmVyYWdlIHF1ZXVlIHNpemUgYXQgd2hpY2ggbWFya2luZyBiZWNvbWVzIGEgcG9zc2liaWxpdHkuIERlZmF1bHRzIHRvCisuQiBtYXgKKy8zCisuVFAKK21heAorQXQgdGhpcyBhdmVyYWdlIHF1ZXVlIHNpemUsIHRoZSBtYXJraW5nIHByb2JhYmlsaXR5IGlzIG1heGltYWwuIERlZmF1bHRzIHRvCisuQiByZWRmbG93bGltaXQKKy80CisuVFAKK3Byb2JhYmlsaXR5CitNYXhpbXVtICBwcm9iYWJpbGl0eSAgZm9yICBtYXJraW5nLCBzcGVjaWZpZWQgYXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgZnJvbSAwLjAgdG8gMS4wLiBEZWZhdWx0IHZhbHVlIGlzIDAuMDIKKy5UUAorYXZwa3QKK1NwZWNpZmllZCBpbiBieXRlcy4gVXNlZCB3aXRoIGJ1cnN0IHRvIGRldGVybWluZSB0aGUgdGltZSBjb25zdGFudCBmb3IgYXZlcmFnZSBxdWV1ZSBzaXplIGNhbGN1bGF0aW9ucy4gRGVmYXVsdCB2YWx1ZSBpcyAxMDAwCisuVFAKK2J1cnN0CitVc2VkIGZvciBkZXRlcm1pbmluZyBob3cgZmFzdCB0aGUgYXZlcmFnZSBxdWV1ZSBzaXplIGlzIGluZmx1ZW5jZWQgYnkgdGhlIHJlYWwgcXVldWUgc2l6ZS4KKy5uZgorRGVmYXVsdCB2YWx1ZSBpcyA6CisuQiAoMiAqIG1pbiArIG1heCkgLyAoMyAqIGF2cGt0KQorLmZpCisuVFAKK2VjbgorUkVEIGNhbiBlaXRoZXIgJ21hcmsnIG9yICdkcm9wJy4gRXhwbGljaXQgQ29uZ2VzdGlvbgorTm90aWZpY2F0aW9uIGFsbG93cyBSRUQgdG8gbm90aWZ5IHJlbW90ZSBob3N0cyB0aGF0IHRoZWlyIHJhdGUgZXhjZWVkcyB0aGUKK2Ftb3VudCBvZiBiYW5kd2lkdGggYXZhaWxhYmxlLiBOb24tRUNOIGNhcGFibGUgaG9zdHMgY2FuIG9ubHkgYmUgbm90aWZpZWQgYnkKK2Ryb3BwaW5nIGEgcGFja2V0LiBJZiB0aGlzIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQsIHBhY2tldHMgd2hpY2ggaW5kaWNhdGUKK3RoYXQgdGhlaXIgaG9zdHMgaG9ub3IgRUNOIHdpbGwgb25seSBiZSBtYXJrZWQgYW5kIG5vdCBkcm9wcGVkLCB1bmxlc3MgdGhlCitxdWV1ZSBzaXplIGhpdHMKKy5CIGRlcHRoCitwYWNrZXRzLgorLlRQCitoYXJkZHJvcAorSWYgYXZlcmFnZSBmbG93IHF1ZXVlIHNpemUgaXMgYWJvdmUKKy5CIG1heAorYnl0ZXMsIHRoaXMgcGFyYW1ldGVyIGZvcmNlcyBhIGRyb3AgaW5zdGVhZCBvZiBlY24gbWFya2luZy4KKy5TSCBFWEFNUExFICYgVVNBR0UKKworVG8gYXR0YWNoIHRvIGRldmljZSBwcHAwOgorLlAKKyMgdGMgcWRpc2MgYWRkIGRldiBwcHAwIHJvb3Qgc2ZxCisuUAorUGxlYXNlIG5vdGUgdGhhdCBTRlEsIGxpa2UgYWxsIG5vbi1zaGFwaW5nICh3b3JrLWNvbnNlcnZpbmcpIHFkaXNjcywgaXMgb25seSB1c2VmdWwKK2lmIGl0IG93bnMgdGhlIHF1ZXVlLgorVGhpcyBpcyB0aGUgY2FzZSB3aGVuIHRoZSBsaW5rIHNwZWVkIGVxdWFscyB0aGUgYWN0dWFsbHkgYXZhaWxhYmxlIGJhbmR3aWR0aC4gVGhpcyBob2xkcworZm9yIHJlZ3VsYXIgcGhvbmUgbW9kZW1zLCBJU0ROIGNvbm5lY3Rpb25zIGFuZCBkaXJlY3Qgbm9uLXN3aXRjaGVkIGV0aGVybmV0IGxpbmtzLgorLlAKK01vc3Qgb2Z0ZW4sIGNhYmxlIG1vZGVtcyBhbmQgRFNMIGRldmljZXMgZG8gbm90IGZhbGwgaW50byB0aGlzIGNhdGVnb3J5LiBUaGUgc2FtZSBob2xkcworZm9yIHdoZW4gY29ubmVjdGVkIHRvIGEgc3dpdGNoICBhbmQgdHJ5aW5nIHRvIHNlbmQgZGF0YSB0byBhIGNvbmdlc3RlZCBzZWdtZW50IGFsc28KK2Nvbm5lY3RlZCB0byB0aGUgc3dpdGNoLgorLlAKK0luIHRoaXMgY2FzZSwgdGhlIGVmZmVjdGl2ZSBxdWV1ZSBkb2VzIG5vdCByZXNpZGUgd2l0aGluIExpbnV4IGFuZCBpcyB0aGVyZWZvcmUgbm90CithdmFpbGFibGUgZm9yIHNjaGVkdWxpbmcuCisuUAorRW1iZWQgU0ZRIGluIGEgY2xhc3NmdWwgcWRpc2MgdG8gbWFrZSBzdXJlIGl0IG93bnMgdGhlIHF1ZXVlLgorCitJdCBpcyBwb3NzaWJsZSB0byB1c2UgZXh0ZXJuYWwgY2xhc3NpZmllcnMgd2l0aCBzZnEsIGZvciBleGFtcGxlIHRvIGhhc2ggdHJhZmZpYyBiYXNlZCBvbmx5CitvbiBzb3VyY2UvZGVzdGluYXRpb24gaXAgYWRkcmVzc2VzOgorLlAKKyMgdGMgZmlsdGVyIGFkZCAuLi4gZmxvdyBoYXNoIGtleXMgc3JjLGRzdCBwZXJ0dXJiIDMwIGRpdmlzb3IgMTAyNAorLlAKK05vdGUgdGhhdCB0aGUgZ2l2ZW4gZGl2aXNvciBzaG91bGQgbWF0Y2ggdGhlIG9uZSB1c2VkIGJ5IHNmcS4gSWYgeW91IGhhdmUKK2NoYW5nZWQgdGhlIHNmcSBkZWZhdWx0IG9mIDEwMjQsIHVzZSB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhlIGZsb3cgaGFzaCBmaWx0ZXIsIHRvby4KKworLlAKK0V4YW1wbGUgb2Ygc2ZxIHdpdGggb3B0aW9uYWwgUkVEIG1vZGUgOgorLlAKKyMgdGMgcWRpc2MgYWRkIGRldiBldGgwIHBhcmVudCAxOjEgaGFuZGxlIDEwOiBzZnEgbGltaXQgMzAwMCBmbG93cyA1MTIgZGl2aXNvciAxNjM4NAorICByZWRmbG93bGltaXQgMTAwMDAwIG1pbiA4MDAwIG1heCA2MDAwMCBwcm9iYWJpbGl0eSAwLjIwIGVjbiBoZWFkZHJvcAorCisuU0ggU09VUkNFCisuVFAKK28KK1BhdWwgRS4gTWNLZW5uZXkgIlN0b2NoYXN0aWMgRmFpcm5lc3MgUXVldWluZyIsCitJRUVFIElORk9DT01NJzkwIFByb2NlZWRpbmdzLCBTYW4gRnJhbmNpc2NvLCAxOTkwLgorCisuVFAKK28KK1BhdWwgRS4gTWNLZW5uZXkgIlN0b2NoYXN0aWMgRmFpcm5lc3MgUXVldWluZyIsCisiSW50ZXJ3b3JraW5nOiBSZXNlYXJjaCBhbmQgRXhwZXJpZW5jZSIsIHYuMiwgMTk5MSwgcC4xMTMtMTMxLgorCisuVFAKK28KK1NlZSBhbHNvOgorTS4gU2hyZWVkaGFyIGFuZCBHZW9yZ2UgVmFyZ2hlc2UgIkVmZmljaWVudCBGYWlyCitRdWV1aW5nIHVzaW5nIERlZmljaXQgUm91bmQgUm9iaW4iLCBQcm9jLiBTSUdDT01NIDk1LgorCisuU0ggU0VFIEFMU08KKy5CUiB0YyAoOCksCisuQlIgdGMtcmVkICg4KQorCisuU0ggQVVUSE9SUworQWxleGV5IE4uIEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PiwKK0VyaWMgRHVtYXpldCA8ZXJpYy5kdW1hemV0QGdtYWlsLmNvbT4uCisuUAorVGhpcyBtYW5wYWdlIG1haW50YWluZWQgYnkgYmVydCBodWJlcnQgPGFodUBkczlhLm5sPgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWFuL21hbjgvdGMtc3RhYi44IGIvaXByb3V0ZTIvbWFuL21hbjgvdGMtc3RhYi44Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyY2FhN2QKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9tYW4vbWFuOC90Yy1zdGFiLjgKQEAgLTAsMCArMSwxNjMgQEAKKy5USCBTVEFCIDggIjMxIE9jdG9iZXIgMjAxMSIgaXByb3V0ZTIgTGludXgKKy4KKy5TSCBOQU1FCit0Y1wtc3RhYiBcLSBHZW5lcmljIHNpemUgdGFibGUgbWFuaXB1bGF0aW9ucworLgorLlNIIFNZTk9QU0lTCisubmYKK3RjIHFkaXNjIGFkZCAuLi4gc3RhYgorLlJTIDQKK1sgXGZCbXR1XGZSIEJZVEVTIF0gWyBcZkJ0c2l6ZVxmUiBTTE9UUyBdCitbIFxmQm1wdVxmUiBCWVRFUyBdIFsgXGZCb3ZlcmhlYWRcZlIgQllURVMgXQorWyBcZkJsaW5rbGF5ZXJcZlIgeyBhZHNsIHwgYXRtIHwgZXRoZXJuZXQgfSBdIC4uLgorLlJFCisuZmkKKworLlNIIE9QVElPTlMKK0ZvciB0aGUgZGVzY3JpcHRpb24gb2YgQllURVMgXC0gcGxlYXNlIHJlZmVyIHRvIHRoZSBcZkJVTklUU1xmUgorc2VjdGlvbiBvZiBcZkJ0Y1xmUig4KS4KKworLklQIFxmQm10dVxmUiA0CisuYnIKK21heGltdW0gcGFja2V0IHNpemUgd2UgY3JlYXRlIHNpemUgdGFibGUgZm9yLCBhc3N1bWVkIDIwNDggaWYgbm90IHNwZWNpZmllZCBleHBsaWNpdGx5CisuSVAgXGZCdHNpemVcZlIKKy5icgorcmVxdWlyZWQgdGFibGUgc2l6ZSwgYXNzdW1lZCA1MTIgaWYgbm90IHNwZWNpZmllZCBleHBsaWNpdGx5CisuSVAgXGZCbXB1XGZSCisuYnIKK21pbmltdW0gcGFja2V0IHNpemUgdXNlZCBpbiBjb21wdXRhdGlvbnMKKy5JUCBcZkJvdmVyaGVhZFxmUgorLmJyCitwZXJcLXBhY2tldCBzaXplIG92ZXJoZWFkIChjYW4gYmUgbmVnYXRpdmUpIHVzZWQgaW4gY29tcHV0YXRpb25zCisuSVAgXGZCbGlua2xheWVyXGZSCisuYnIKK3JlcXVpcmVkIGxpbmtsYXllciBzcGVjaWZpY2F0aW9uLgorLlBQCisuCisuU0ggREVTQ1JJUFRJT04KKy4KK1NpemUgdGFibGVzIGFsbG93IG1hbmlwdWxhdGlvbiBvZiBwYWNrZXQgc2l6ZXMsIGFzIHNlZW4gYnkgdGhlIHdob2xlIHNjaGVkdWxlcgorZnJhbWV3b3JrIChvZiBjb3Vyc2UsIHRoZSBhY3R1YWwgcGFja2V0IHNpemUgcmVtYWlucyB0aGUgc2FtZSkuIEFkanVzdGVkIHBhY2tldAorc2l6ZSBpcyBjYWxjdWxhdGVkIG9ubHkgb25jZSBcLSB3aGVuIGEgcWRpc2MgZW5xdWV1ZXMgdGhlIHBhY2tldC4gSW5pdGlhbCByb290CitlbnF1ZXVlIGluaXRpYWxpemVzIGl0IHRvIHRoZSByZWFsIHBhY2tldCdzIHNpemUuCisKK0VhY2ggcWRpc2MgY2FuIHVzZSBhIGRpZmZlcmVudCBzaXplIHRhYmxlLCBidXQgdGhlIGFkanVzdGVkIHNpemUgaXMgc3RvcmVkIGluCithbiBhcmVhIHNoYXJlZCBieSB3aG9sZSBxZGlzYyBoaWVyYXJjaHkgYXR0YWNoZWQgdG8gdGhlIGludGVyZmFjZS4gVGhlIGVmZmVjdCBpcwordGhhdCBpZiB5b3UgaGF2ZSBzdWNoIGEgc2V0dXAsIHRoZSBsYXN0IHFkaXNjIHdpdGggYSBzdGFiIGluIGEgY2hhaW4gIndpbnMiLiBGb3IKK2V4YW1wbGUsIGNvbnNpZGVyIEhGU0Mgd2l0aCBzaW1wbGUgcGZpZm8gYXR0YWNoZWQgdG8gb25lIG9mIGl0cyBsZWFmIGNsYXNzZXMuCitJZiB0aGF0IHBmaWZvIHFkaXNjIGhhcyBzdGFiIGRlZmluZWQsIGl0IHdpbGwgb3ZlcnJpZGUgbGVuZ3RocyBjYWxjdWxhdGVkCitkdXJpbmcgSEZTQydzIGVucXVldWU7IGFuZCBpbiB0dXJuLCB3aGVuZXZlciBIRlNDIHRyaWVzIHRvIGRlcXVldWUgYSBwYWNrZXQsIGl0Cit3aWxsIHVzZSBhIHBvdGVudGlhbGx5IGludmFsaWQgc2l6ZSBpbiBpdHMgY2FsY3VsYXRpb25zLiBOb3JtYWwgc2V0dXBzIHdpbGwKK3VzdWFsbHkgaW5jbHVkZSBzdGFiIGRlZmluZWQgb25seSBvbiByb290IHFkaXNjLCBidXQgZnVydGhlciBvdmVycmlkaW5nIGdpdmVzCitleHRyYSBmbGV4aWJpbGl0eSBmb3IgbGVzcyB1c3VhbCBzZXR1cHMuCisKK1RoZSBpbml0aWFsIHNpemUgdGFibGUgaXMgY2FsY3VsYXRlZCBieSBcZkJ0Y1xmUiB0b29sIHVzaW5nIFxmQm10dVxmUiBhbmQKK1xmQnRzaXplXGZSIHBhcmFtZXRlcnMuIFRoZSBhbGdvcml0aG0gc2V0cyBlYWNoIHNsb3QncyBzaXplIHRvIHRoZSBzbWFsbGVzdAorcG93ZXIgb2YgMiB2YWx1ZSwgc28gdGhlIHdob2xlIFxmQm10dVxmUiBpcyBjb3ZlcmVkIGJ5IHRoZSBzaXplIHRhYmxlLiBOZWl0aGVyCitcZkJ0c2l6ZVxmUiwgbm9yIFxmQm10dVxmUiBoYXZlIHRvIGJlIHBvd2VyIG9mIDIgdmFsdWUsIHNvIHRoZSBzaXplCit0YWJsZSB3aWxsIHVzdWFsbHkgc3VwcG9ydCBtb3JlIHRoYW4gaXMgcmVxdWlyZWQgYnkgXGZCbXR1XGZSLgorCitGb3IgZXhhbXBsZSwgd2l0aCBcZkJtdHVcZlJcfj1cfjE1MDAgYW5kIFxmQnRzaXplXGZSXH49XH4xMjgsIGEgdGFibGUgd2l0aCAxMjgKK3Nsb3RzIHdpbGwgYmUgY3JlYXRlZCwgd2hlcmUgc2xvdCAwIHdpbGwgY29ycmVzcG9uZCB0byBzaXplcyAwXC0xNiwgc2xvdCAxIHRvCisxN1x+XC1cfjMyLCBcJi4uLiwgc2xvdCAxMjcgdG8gMjAzM1x+XC1cfjIwNDguIFNpemVzIGFzc2lnbmVkIHRvIGVhY2ggc2xvdAorZGVwZW5kIG9uIFxmQmxpbmtsYXllclxmUiBwYXJhbWV0ZXIuCisKK1N0YWIgY2FsY3VsYXRpb24gaXMgYWxzbyBzYWZlIGZvciBhbiB1bnVzdWFsIGNhc2UsIHdoZW4gYSBzaXplIGFzc2lnbmVkIHRvIGEKK3Nsb3Qgd291bGQgYmUgbGFyZ2VyIHRoYW4gMl4xNlwtMSAoeW91IHdpbGwgbG9zZSB0aGUgYWNjdXJhY3kgdGhvdWdoKS4KKworRHVyaW5nIHRoZSBrZXJuZWwgcGFydCBvZiBwYWNrZXQgc2l6ZSBhZGp1c3RtZW50LCBcZkJvdmVyaGVhZFxmUiB3aWxsIGJlIGFkZGVkCit0byBvcmlnaW5hbCBzaXplLCBhbmQgdGhlbiBzbG90IHdpbGwgYmUgY2FsY3VsYXRlZC4gSWYgdGhlIHNpemUgd291bGQgY2F1c2UKK292ZXJmbG93LCBtb3JlIHRoYW4gMSBzbG90IHdpbGwgYmUgdXNlZCB0byBnZXQgdGhlIGZpbmFsIHNpemUuIFRoaXMgb2YgY291cnNlCit3aWxsIGFmZmVjdCBhY2N1cmFjeSwgYnV0IGl0J3Mgb25seSBhIGd1YXJkIGFnYWluc3QgdW51c3VhbCBzaXR1YXRpb25zLgorCitDdXJyZW50bHkgdGhlcmUgYXJlIHR3byBtZXRob2RzIG9mIGNyZWF0aW5nIHZhbHVlcyBzdG9yZWQgaW4gdGhlIHNpemUgdGFibGUgXC0KK2V0aGVybmV0IGFuZCBhdG0gKGFkc2wpOgorCisuSVAgZXRoZXJuZXQgNAorLmJyCitUaGlzIGlzIGJhc2ljYWxseSAxXC0xIG1hcHBpbmcsIHNvIGZvbGxvd2luZyBvdXIgZXhhbXBsZSBmcm9tIGFib3ZlCisoZGlzcmVnYXJkaW5nIFxmQm1wdVxmUiBmb3IgYSBtb21lbnQpIHNsb3QgMCB3b3VsZCBoYXZlIDgsIHNsb3QgMSB3b3VsZCBoYXZlIDE2CithbmQgc28gb24sIHVwIHRvIHNsb3QgMTI3IHdpdGggMjA0OC4gTm90ZSwgdGhhdCBcZkJtcHVcZlJcfj5cfjAgbXVzdCBiZQorc3BlY2lmaWVkLCBhbmQgc2xvdHMgdGhhdCB3b3VsZCBnZXQgbGVzcyB0aGFuIHNwZWNpZmllZCBieSBcZkJtcHVcZlIgd2lsbCBnZXQKK1xmQm1wdVxmUiBpbnN0ZWFkLiBJZiB5b3UgZG9uJ3Qgc3BlY2lmeSBcZkJtcHVcZlIsIHRoZSBzaXplIHRhYmxlIHdpbGwgbm90IGJlCitjcmVhdGVkIGF0IGFsbCAoaXQgd291bGRuJ3QgbWFrZSBhbnkgZGlmZmVyZW5jZSksIGFsdGhvdWdoIGFueSBcZkJvdmVyaGVhZFxmUgordmFsdWUgd2lsbCBiZSByZXNwZWN0ZWQgZHVyaW5nIGNhbGN1bGF0aW9ucy4KKy5JUCAiYXRtLCBhZHNsIgorLmJyCitBVE0gbGlua2xheWVyIGNvbnNpc3RzIG9mIDUzIGJ5dGUgY2VsbHMsIHdoZXJlIGVhY2ggb2YgdGhlbSBwcm92aWRlcyA0OCBieXRlcworZm9yIHBheWxvYWQuIEFsc28gYWxsIHRoZSBjZWxscyBtdXN0IGJlIGZ1bGx5IHV0aWxpemVkLCB0aHVzIHRoZSBsYXN0IG9uZSBpcworcGFkZGVkIGlmL2FzIG5lY2Vzc2FyeS4KKworV2hlbiB0aGUgc2l6ZSB0YWJsZSBpcyBjYWxjdWxhdGVkLCBhZGp1c3RlZCBzaXplIHRoYXQgZml0cyBwcm9wZXJseSBpbnRvIGxvd2VzdAorYW1vdW50IG9mIGNlbGxzIGlzIGFzc2lnbmVkIHRvIGEgc2xvdC4gRm9yIGV4YW1wbGUsIGEgMTAwIGJ5dGUgbG9uZyBwYWNrZXQKK3JlcXVpcmVzIHRocmVlIDQ4XC1ieXRlIHBheWxvYWRzLCBzbyB0aGUgZmluYWwgc2l6ZSB3b3VsZCByZXF1aXJlIDMgQVRNIGNlbGxzCitcLSAxNTkgYnl0ZXMuCisKK0ZvciBBVE0gc2l6ZSB0YWJsZXMsIDE2XH5ieXRlcyBzaXplZCBzbG90cyBhcmUgcGVyZmVjdGx5IGVub3VnaC4gVGhlIGRlZmF1bHQKK3ZhbHVlcyBvZiBcZkJtdHVcZlIgYW5kIFxmQnRzaXplXGZSIGNyZWF0ZSA0XH5ieXRlcyBzaXplZCBzbG90cy4KKy5QUAorLgorLlNIICJUWVBJQ0FMIE9WRVJIRUFEUyIKK1RoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSB0eXBpY2FsIGZvciBkaWZmZXJlbnQgYWRzbCBzY2VuYXJpb3MgKGJhc2VkIG9uCitcZkJbMV1cZlIgYW5kIFxmQlsyXVxmUik6CisKKy5uZgorTExDIGJhc2VkOgorLlJTIDQKK1BQUG9BIFwtIDE0IChQUFAgXC0gMiwgQVRNIFwtIDEyKQorUFBQb0UgXC0gNDArIChQUFBvRSBcLSA4LCBBVE0gXC0gMTgsIGV0aGVybmV0IDE0LCBwb3NzaWJseSBGQ1MgXC0gNCtwYWRkaW5nKQorQnJpZGdlZCBcLSAzMiAoQVRNIFwtIDE4LCBldGhlcm5ldCAxNCwgcG9zc2libHkgRkNTIFwtIDQrcGFkZGluZykKK0lQb0EgXC0gMTYgKEFUTSBcLSAxNikKKy5SRQorCitWQyBNdXggYmFzZWQ6CisuUlMgNAorUFBQb0EgXC0gMTAgKFBQUCBcLSAyLCBBVE0gXC0gOCkKK1BQUG9FIFwtIDMyKyAoUFBQb0UgXC0gOCwgQVRNIFwtIDEwLCBldGhlcm5ldCAxNCwgcG9zc2libHkgRkNTIFwtIDQrcGFkZGluZykKK0JyaWRnZWQgXC0gMjQrIChBVE0gXC0gMTAsIGV0aGVybmV0IDE0LCBwb3NzaWJseSBGQ1MgXC0gNCtwYWRkaW5nKQorSVBvQSBcLSA4IChBVE0gXC0gOCkKKy5SRQorLmZpCitUaGVyZSBhcmUgYSBmZXcgaW1wb3J0YW50IHRoaW5ncyByZWdhcmRpbmcgdGhlIGFib3ZlIG92ZXJoZWFkczoKKy4KKy5JUCBcKGJ1IDQKK0lQb0EgaW4gTExDIGNhc2UgcmVxdWlyZXMgU05BUCwgaW5zdGVhZCBvZiBMTENcLU5MUElEIChzZWUgcmZjMjY4NCkgXC0gdGhpcyBpcwordGhlIHJlYXNvbiB3aHkgaXQgYWN0dWFsbHkgdGFrZXMgbW9yZSBzcGFjZSB0aGFuIFBQUG9BLgorLklQIFwoYnUKK0luIHJhcmUgY2FzZXMsIEZDUyBtaWdodCBiZSBwcmVzZXJ2ZWQgb24gcHJvdG9jb2xzIHRoYXQgaW5jbHVkZSBFdGhlcm5ldCBmcmFtZXMKKyhCcmlkZ2VkIGFuZCBQUFBvRSkuIEluIHN1Y2ggc2l0dWF0aW9uLCBhbnkgRXRoZXJuZXQgc3BlY2lmaWMgcGFkZGluZworZ3VhcmFudGVlaW5nIDY0IGJ5dGVzIGxvbmcgZnJhbWUgc2l6ZSBoYXMgdG8gYmUgaW5jbHVkZWQgYXMgd2VsbCAoc2VlIFJGQzI2ODQpLgorSW4gdGhlIG90aGVyIHdvcmRzLCBpdCBhbHNvIGd1YXJhbnRlZXMgdGhhdCBhbnkgcGFja2V0IHlvdSBzZW5kIHdpbGwgdGFrZQorbWluaW11bSAyIGF0bSBjZWxscy4gWW91IHNob3VsZCBzZXQgXGZCbXB1XGZSIGFjY29yZGluZ2x5IGZvciB0aGF0LgorLklQIFwoYnUKK1doZW4gdGhlIHNpemUgdGFibGUgaXMgY29uc3VsdGVkLCBhbmQgeW91J3JlIHNoYXBpbmcgdHJhZmZpYyBmb3IgdGhlIHNha2Ugb2YKK2Fub3RoZXIgbW9kZW0vcm91dGVyLCBhbiBFdGhlcm5ldCBoZWFkZXIgKHdpdGhvdXQgcGFkZGluZykgd2lsbCBhbHJlYWR5IGJlIGFkZGVkCit0byBpbml0aWFsIHBhY2tldCdzIGxlbmd0aC4gWW91IHNob3VsZCBjb21wZW5zYXRlIGZvciB0aGF0IGJ5IHN1YnRyYWN0aW5nIDE0Citmcm9tIHRoZSBhYm92ZSBvdmVyaGVhZHMgaW4gdGhpcyBjYXNlLiBJZiB5b3UncmUgc2hhcGluZyBkaXJlY3RseSBvbiB0aGUgcm91dGVyCisoZm9yIGV4YW1wbGUsIHdpdGggc3BlZWR0b3VjaCB1c2IgbW9kZW0pIHVzaW5nIHBwcCBkYWVtb24sIHlvdSdyZSB1c2luZyByYXcgaXAKK2ludGVyZmFjZSB3aXRob3V0IHVuZGVybHlpbmcgbGF5ZXIyLCBzbyBub3RoaW5nIHdpbGwgYmUgYWRkZWQuCisKK0ZvciBtb3JlIHRob3JvdWdoIGV4cGxhbmF0aW9ucywgcGxlYXNlIHNlZSBcZkJbMV1cZlIgYW5kIFxmQlsyXVxmUi4KKy4KKy5TSCAiRVRIRVJORVQgQ0FSRFMgQ09OU0lERVJBVElPTlMiCisuCitJdCdzIG9mdGVuIGZvcmdvdHRlbiB0aGF0IG1vZGVybiBuZXR3b3JrIGNhcmRzIChldmVuIGNoZWFwIG9uZXMgb24gZGVza3RvcAorbW90aGVyYm9hcmRzKSBhbmQvb3IgdGhlaXIgZHJpdmVycyBvZnRlbiBzdXBwb3J0IGRpZmZlcmVudCBvZmZsb2FkaW5nCittZWNoYW5pc21zLiBJbiB0aGUgY29udGV4dCBvZiB0cmFmZmljIHNoYXBpbmcsICd0c28nIGFuZCAnZ3NvJyBtaWdodCBjYXVzZQordW5kZXNpcmFibGUgZWZmZWN0cywgZHVlIHRvIG1hc3NpdmUgVENQIHNlZ21lbnRzIGJlaW5nIGNvbnNpZGVyZWQgZHVyaW5nCit0cmFmZmljIHNoYXBpbmcgKGluY2x1ZGluZyBzdGFiIGNhbGN1bGF0aW9ucykuIEZvciBzbG93IHVwbGluayBpbnRlcmZhY2VzLAoraXQncyBnb29kIHRvIHVzZSBcZkJldGh0b29sXGZSIHRvIHR1cm4gb2ZmIG9mZmxvYWRpbmcgZmVhdHVyZXMuCisuCisuU0ggIlNFRSBBTFNPIgorLgorXGZCdGNcZlIoOCksIFxmQnRjXC1oZnNjXGZSKDcpLCBcZkJ0Y1wtaGZzY1xmUig4KSwKKy5icgorXGZCWzFdXGZSIGh0dHA6Ly9hY2VcLWhvc3Quc3R1YXJ0LmlkLmF1L3J1c3NlbGwvZmlsZXMvdGMvdGNcLWF0bS8KKy5icgorXGZCWzJdXGZSIGh0dHA6Ly93d3cuZmFxcy5vcmcvcmZjcy9yZmMyNjg0Lmh0bWwKKworUGxlYXNlIGRpcmVjdCBidWdyZXBvcnRzIGFuZCBwYXRjaGVzIHRvOiA8bmV0Li4uQHZnZXIua2VybmVsLm9yZz4KKy4KKy5TSCAiQVVUSE9SIgorLgorTWFucGFnZSBjcmVhdGVkIGJ5IE1pY2hhbCBTb2x0eXMgKHNvbC4uLkB6aXUuaW5mbykKZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L3RjLXRiZi44IGIvaXByb3V0ZTIvbWFuL21hbjgvdGMtdGJmLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcyMWI1ZAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L3RjLXRiZi44CkBAIC0wLDAgKzEsMTQxIEBACisuVEggVEMgOCAiMTMgRGVjZW1iZXIgMjAwMSIgImlwcm91dGUyIiAiTGludXgiCisuU0ggTkFNRQordGJmIFwtIFRva2VuIEJ1Y2tldCBGaWx0ZXIKKy5TSCBTWU5PUFNJUworLkIgdGMgcWRpc2MgLi4uIHRiZiByYXRlCityYXRlCisuQiBidXJzdAorYnl0ZXMvY2VsbAorLkIgKCBsYXRlbmN5CittcworLkIgfCBsaW1pdAorYnl0ZXMKKy5CICkgWyBtcHUKK2J5dGVzCisuQiBbIHBlYWtyYXRlCityYXRlCisuQiBtdHUKK2J5dGVzL2NlbGwKKy5CIF0gXQorLlAKK2J1cnN0IGlzIGFsc28ga25vd24gYXMgYnVmZmVyIGFuZCBtYXhidXJzdC4gbXR1IGlzIGFsc28ga25vd24gYXMgbWluYnVyc3QuCisuU0ggREVTQ1JJUFRJT04KKworVGhlIFRva2VuIEJ1Y2tldCBGaWx0ZXIgaXMgYSBjbGFzc2Z1bCBxdWV1ZWluZyBkaXNjaXBsaW5lIGF2YWlsYWJsZSBmb3IKK3RyYWZmaWMgY29udHJvbCB3aXRoIHRoZQorLkJSIHRjICg4KQorY29tbWFuZC4KKworVEJGIGlzIGEgcHVyZSBzaGFwZXIgYW5kIG5ldmVyIHNjaGVkdWxlcyB0cmFmZmljLiBJdCBpcyBub24td29yay1jb25zZXJ2aW5nIGFuZCBtYXkgdGhyb3R0bGUKK2l0c2VsZiwgYWx0aG91Z2ggcGFja2V0cyBhcmUgYXZhaWxhYmxlLCB0byBlbnN1cmUgdGhhdCB0aGUgY29uZmlndXJlZCByYXRlIGlzIG5vdCBleGNlZWRlZC4KK0l0IGlzIGFibGUgdG8gc2hhcGUgdXAgdG8gMW1iaXQvcyBvZiBub3JtYWwgdHJhZmZpYyB3aXRoIGlkZWFsIG1pbmltYWwgYnVyc3RpbmVzcywKK3NlbmRpbmcgb3V0IGRhdGEgZXhhY3RseSBhdCB0aGUgY29uZmlndXJlZCByYXRlcy4KKworTXVjaCBoaWdoZXIgcmF0ZXMgYXJlIHBvc3NpYmxlIGJ1dCBhdCB0aGUgY29zdCBvZiBsb3NpbmcgdGhlIG1pbmltYWwgYnVyc3RpbmVzcy4gSW4gdGhhdAorY2FzZSwgZGF0YSBpcyBvbiBhdmVyYWdlIGRlcXVldWVkIGF0IHRoZSBjb25maWd1cmVkIHJhdGUgYnV0IG1heSBiZSBzZW50IG11Y2ggZmFzdGVyIGF0IG1pbGxpc2Vjb25kCit0aW1lc2NhbGVzLiBCZWNhdXNlIG9mIGZ1cnRoZXIgcXVldWVzIGxpdmluZyBpbiBuZXR3b3JrIGFkYXB0b3JzLCB0aGlzIGlzIG9mdGVuIG5vdCBhIHByb2JsZW0uCisKKy5TSCBBTEdPUklUSE0KK0FzIHRoZSBuYW1lIGltcGxpZXMsIHRyYWZmaWMgaXMgZmlsdGVyZWQgYmFzZWQgb24gdGhlIGV4cGVuZGl0dXJlIG9mCisuQiB0b2tlbnMuCitUb2tlbnMgcm91Z2hseSBjb3JyZXNwb25kIHRvIGJ5dGVzLCB3aXRoIHRoZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnQKK3RoYXQgZWFjaCBwYWNrZXQgY29uc3VtZXMgc29tZSB0b2tlbnMsIG5vIG1hdHRlciBob3cgc21hbGwgaXQgaXMuIFRoaXMKK3JlZmxlY3RzIHRoZSBmYWN0IHRoYXQgZXZlbiBhIHplcm8tc2l6ZWQgcGFja2V0IG9jY3VwaWVzIHRoZSBsaW5rIGZvcgorc29tZSB0aW1lLgorCitPbiBjcmVhdGlvbiwgdGhlIFRCRiBpcyBzdG9ja2VkIHdpdGggdG9rZW5zIHdoaWNoIGNvcnJlc3BvbmQgdG8gdGhlIGFtb3VudCBvZiB0cmFmZmljIHRoYXQgY2FuIGJlIGJ1cnN0CitpbiBvbmUgZ28uIFRva2VucyBhcnJpdmUgYXQgYSBzdGVhZHkgcmF0ZSwgdW50aWwgdGhlIGJ1Y2tldCBpcyBmdWxsLgorCitJZiBubyB0b2tlbnMgYXJlIGF2YWlsYWJsZSwgcGFja2V0cyBhcmUgcXVldWVkLCB1cCB0byBhIGNvbmZpZ3VyZWQgbGltaXQuIFRoZSBUQkYgbm93CitjYWxjdWxhdGVzIHRoZSB0b2tlbiBkZWZpY2l0LCBhbmQgdGhyb3R0bGVzIHVudGlsIHRoZSBmaXJzdCBwYWNrZXQgaW4gdGhlIHF1ZXVlIGNhbiBiZSBzZW50LgorCitJZiBpdCBpcyBub3QgYWNjZXB0YWJsZSB0byBidXJzdCBvdXQgcGFja2V0cyBhdCBtYXhpbXVtIHNwZWVkLCBhIHBlYWtyYXRlIGNhbiBiZSBjb25maWd1cmVkCit0byBsaW1pdCB0aGUgc3BlZWQgYXQgd2hpY2ggdGhlIGJ1Y2tldCBlbXB0aWVzLiBUaGlzIHBlYWtyYXRlIGlzIGltcGxlbWVudGVkIGFzIGEgc2Vjb25kIFRCRgord2l0aCBhIHZlcnkgc21hbGwgYnVja2V0LCBzbyB0aGF0IGl0IGRvZXNuJ3QgYnVyc3QuCisKK1RvIGFjaGlldmUgcGVyZmVjdGlvbiwgdGhlIHNlY29uZCBidWNrZXQgbWF5IGNvbnRhaW4gb25seSBhIHNpbmdsZSBwYWNrZXQsIHdoaWNoIGxlYWRzIHRvCit0aGUgZWFybGllciBtZW50aW9uZWQgMW1iaXQvcyBsaW1pdC4KKworVGhpcyBsaW1pdCBpcyBjYXVzZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUga2VybmVsIGNhbiBvbmx5IHRocm90dGxlIGZvciBhdCBtaW5pbXVtIDEgJ2ppZmZ5Jywgd2hpY2ggZGVwZW5kcworb24gSFogYXMgMS9IWi4gRm9yIHBlcmZlY3Qgc2hhcGluZywgb25seSBhIHNpbmdsZSBwYWNrZXQgY2FuIGdldCBzZW50IHBlciBqaWZmeSAtIGZvciBIWj0xMDAsIHRoaXMgbWVhbnMgMTAwCitwYWNrZXRzIG9mIG9uIGF2ZXJhZ2UgMTAwMCBieXRlcyBlYWNoLCB3aGljaCByb3VnaGx5IGNvcnJlc3BvbmRzIHRvIDFtYml0L3MuCisKKy5TSCBQQVJBTUVURVJTCitTZWUKKy5CUiB0YyAoOCkKK2ZvciBob3cgdG8gc3BlY2lmeSB0aGUgdW5pdHMgb2YgdGhlc2UgdmFsdWVzLgorLlRQCitsaW1pdCBvciBsYXRlbmN5CitMaW1pdCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHF1ZXVlZCB3YWl0aW5nIGZvciB0b2tlbnMgdG8gYmVjb21lCithdmFpbGFibGUuIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IHRoaXMgdGhlIG90aGVyIHdheSBhcm91bmQgYnkgc2V0dGluZyB0aGUKK2xhdGVuY3kgcGFyYW1ldGVyLCB3aGljaCBzcGVjaWZpZXMgdGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgYSBwYWNrZXQgY2FuCitzaXQgaW4gdGhlIFRCRi4gVGhlIGxhdHRlciBjYWxjdWxhdGlvbiB0YWtlcyBpbnRvIGFjY291bnQgdGhlIHNpemUgb2YgdGhlCitidWNrZXQsIHRoZSByYXRlIGFuZCBwb3NzaWJseSB0aGUgcGVha3JhdGUgKGlmIHNldCkuIFRoZXNlIHR3byBwYXJhbWV0ZXJzCithcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgorLlRQCitidXJzdAorQWxzbyBrbm93biBhcyBidWZmZXIgb3IgbWF4YnVyc3QuCitTaXplIG9mIHRoZSBidWNrZXQsIGluIGJ5dGVzLiBUaGlzIGlzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBieXRlcyB0aGF0IHRva2VucyBjYW4gYmUgYXZhaWxhYmxlIGZvciBpbnN0YW50YW5lb3VzbHkuCitJbiBnZW5lcmFsLCBsYXJnZXIgc2hhcGluZyByYXRlcyByZXF1aXJlIGEgbGFyZ2VyIGJ1ZmZlci4gRm9yIDEwbWJpdC9zIG9uIEludGVsLCB5b3UgbmVlZCBhdCBsZWFzdCAxMGtieXRlIGJ1ZmZlcgoraWYgeW91IHdhbnQgdG8gcmVhY2ggeW91ciBjb25maWd1cmVkIHJhdGUhCisKK0lmIHlvdXIgYnVmZmVyIGlzIHRvbyBzbWFsbCwgcGFja2V0cyBtYXkgYmUgZHJvcHBlZCBiZWNhdXNlIG1vcmUgdG9rZW5zIGFycml2ZSBwZXIgdGltZXIgdGljayB0aGFuIGZpdCBpbiB5b3VyIGJ1Y2tldC4KK1RoZSBtaW5pbXVtIGJ1ZmZlciBzaXplIGNhbiBiZSBjYWxjdWxhdGVkIGJ5IGRpdmlkaW5nIHRoZSByYXRlIGJ5IEhaLgorCitUb2tlbiB1c2FnZSBjYWxjdWxhdGlvbnMgYXJlIHBlcmZvcm1lZCB1c2luZyBhIHRhYmxlIHdoaWNoIGJ5IGRlZmF1bHQgaGFzIGEgcmVzb2x1dGlvbiBvZiA4IHBhY2tldHMuCitUaGlzIHJlc29sdXRpb24gY2FuIGJlIGNoYW5nZWQgYnkgc3BlY2lmeWluZyB0aGUKKy5CIGNlbGwKK3NpemUgd2l0aCB0aGUgYnVyc3QuIEZvciBleGFtcGxlLCB0byBzcGVjaWZ5IGEgNjAwMCBieXRlIGJ1ZmZlciB3aXRoIGEgMTYKK2J5dGUgY2VsbCBzaXplLCBzZXQgYSBidXJzdCBvZiA2MDAwLzE2LiBZb3Ugd2lsbCBwcm9iYWJseSBuZXZlciBoYXZlIHRvIHNldAordGhpcy4gTXVzdCBiZSBhbiBpbnRlZ3JhbCBwb3dlciBvZiAyLgorLlRQCittcHUKK0EgemVyby1zaXplZCBwYWNrZXQgZG9lcyBub3QgdXNlIHplcm8gYmFuZHdpZHRoLiBGb3IgZXRoZXJuZXQsIG5vIHBhY2tldCB1c2VzIGxlc3MgdGhhbiA2NCBieXRlcy4gVGhlIE1pbmltdW0gUGFja2V0IFVuaXQKK2RldGVybWluZXMgdGhlIG1pbmltYWwgdG9rZW4gdXNhZ2UgKHNwZWNpZmllZCBpbiBieXRlcykgZm9yIGEgcGFja2V0LiBEZWZhdWx0cyB0byB6ZXJvLgorLlRQCityYXRlCitUaGUgc3BlZWQga25vYi4gU2VlIHJlbWFya3MgYWJvdmUgYWJvdXQgbGltaXRzISBTZWUKKy5CUiB0YyAoOCkKK2ZvciB1bml0cy4KKy5QUAorRnVydGhlcm1vcmUsIGlmIGEgcGVha3JhdGUgaXMgZGVzaXJlZCwgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSBhdmFpbGFibGU6CisKKy5UUAorcGVha3JhdGUKK01heGltdW0gZGVwbGV0aW9uIHJhdGUgb2YgdGhlIGJ1Y2tldC4gVGhlIHBlYWtyYXRlIGRvZXMgbm90CituZWVkIHRvIGJlIHNldCwgaXQgaXMgb25seSBuZWNlc3NhcnkgaWYgcGVyZmVjdCBtaWxsaXNlY29uZCB0aW1lc2NhbGUKK3NoYXBpbmcgaXMgcmVxdWlyZWQuCisKKy5UUAorbXR1L21pbmJ1cnN0CitTcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIHBlYWtyYXRlIGJ1Y2tldC4gRm9yIHBlcmZlY3QgYWNjdXJhY3ksIHNob3VsZCBiZSBzZXQgdG8gdGhlIE1UVSBvZiB0aGUgaW50ZXJmYWNlLgorSWYgYSBwZWFrcmF0ZSBpcyBuZWVkZWQsIGJ1dCBzb21lIGJ1cnN0aW5lc3MgaXMgYWNjZXB0YWJsZSwgdGhpcyBzaXplIGNhbiBiZSByYWlzZWQuIEEgMzAwMCBieXRlIG1pbmJ1cnN0CithbGxvd3MgYXJvdW5kIDNtYml0L3Mgb2YgcGVha3JhdGUsIGdpdmVuIDEwMDAgYnl0ZSBwYWNrZXRzLgorCitMaWtlIHRoZSByZWd1bGFyIGJ1cnN0c2l6ZSB5b3UgY2FuIGFsc28gc3BlY2lmeSBhCisuQiBjZWxsCitzaXplLgorLlNIIEVYQU1QTEUgJiBVU0FHRQorCitUbyBhdHRhY2ggYSBUQkYgd2l0aCBhIHN1c3RhaW5lZCBtYXhpbXVtIHJhdGUgb2YgMC41bWJpdC9zLCBhIHBlYWtyYXRlIG9mIDEuMG1iaXQvcywKK2EgNWtpbG9ieXRlIGJ1ZmZlciwgd2l0aCBhIHByZS1idWNrZXQgcXVldWUgc2l6ZSBsaW1pdCBjYWxjdWxhdGVkIHNvIHRoZSBUQkYgY2F1c2VzCithdCBtb3N0IDcwbXMgb2YgbGF0ZW5jeSwgd2l0aCBwZXJmZWN0IHBlYWtyYXRlIGJlaGF2aW91ciwgaXNzdWU6CisuUAorIyB0YyBxZGlzYyBhZGQgZGV2IGV0aDAgaGFuZGxlIDEwOiByb290IHRiZiByYXRlIDAuNW1iaXQgXFwKKyAgYnVyc3QgNWtiIGxhdGVuY3kgNzBtcyBwZWFrcmF0ZSAxbWJpdCAgICAgICBcXAorICBtaW5idXJzdCAxNTQwCisuUAorVG8gYXR0YWNoIGFuIGlubmVyIHFkaXNjLCBmb3IgZXhhbXBsZSBzZnEsIGlzc3VlOgorLlAKKyMgdGMgcWRpc2MgYWRkIGRldiBldGgwIHBhcmVudCAxMDoxIGhhbmRsZSAxMDA6IHNmcQorLlAKK1dpdGhvdXQgaW5uZXIgcWRpc2MgVEJGIHF1ZXVlIGFjdHMgYXMgYmZpZm8uIElmIHRoZSBpbm5lciBxZGlzYyBpcyBjaGFuZ2VkCit0aGUgbGltaXQvbGF0ZW5jeSBpcyBub3QgZWZmZWN0aXZlIGFueW1vcmUuCisuUAorCisuU0ggU0VFIEFMU08KKy5CUiB0YyAoOCkKKworLlNIIEFVVEhPUgorQWxleGV5IE4uIEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1Pi4gVGhpcyBtYW5wYWdlIG1haW50YWluZWQgYnkKK2JlcnQgaHViZXJ0IDxhaHVAZHM5YS5ubD4KZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L3RjLXRjaW5kZXguOCBiL2lwcm91dGUyL21hbi9tYW44L3RjLXRjaW5kZXguOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmNmODI1Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbWFuL21hbjgvdGMtdGNpbmRleC44CkBAIC0wLDAgKzEsNTggQEAKKy5USCAiVHJhZmZpYyBjb250cm9sIGluZGV4IGZpbHRlciIgOCAiMjEgT2N0IDIwMTUiICJpcHJvdXRlMiIgIkxpbnV4IgorCisuU0ggTkFNRQordGNpbmRleCBcLSB0cmFmZmljIGNvbnRyb2wgaW5kZXggZmlsdGVyCisuU0ggU1lOT1BTSVMKKy5pbiArOAorLnRpIC04CisuQlIgdGMgIiAiIGZpbHRlciAiIC4uLiAiIHRjaW5kZXggIiBbICIgaGFzaAorLklSIFNJWkUgIiBdIFsgIgorLkIgbWFzaworLklSIE1BU0sgIiBdIFsgIgorLkIgc2hpZnQKKy5JUiBTSElGVCAiIF0gWyAiCisuQlIgcGFzX29uICIgfCAiIGZhbGxfdGhyb3VnaCAiIF0gWyAiIGNsYXNzaWQKKy5JUiBDTEFTU0lEICIgXSBbICIKKy5CIGFjdGlvbgorLkJSIEFDVElPTl9TUEVDICIgXSIKKy5TSCBERVNDUklQVElPTgorVGhpcyBmaWx0ZXIgYWxsb3dzIHRvIG1hdGNoIHBhY2tldHMgYmFzZWQgb24gdGhlaXIKKy5CIHRjaW5kZXgKK2ZpZWxkIHZhbHVlLCBpLmUuIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgRFNDUCBhbmQgRUNOIGZpZWxkcyBhcyBwcmVzZW50IGluIElQdjQKK2FuZCBJUHY2IGhlYWRlcnMuCisuU0ggT1BUSU9OUworLlRQCisuQkkgYWN0aW9uICIgQUNUSU9OX1NQRUMiCitBcHBseSBhbiBhY3Rpb24gZnJvbSB0aGUgZ2VuZXJpYyBhY3Rpb25zIGZyYW1ld29yayBvbiBtYXRjaGluZyBwYWNrZXRzLgorLlRQCisuQkkgY2xhc3NpZCAiIENMQVNTSUQiCitQdXNoIG1hdGNoaW5nIHBhY2tldHMgaW50byB0aGUgY2xhc3MgaWRlbnRpZmllZCBieQorLklSIENMQVNTSUQgLgorLlRQCisuQkkgaGFzaCAiIFNJWkUiCitIYXNoIHRhYmxlIHNpemUgaW4gZW50cmllcyB0byB1c2UuIERlZmF1bHRzIHRvIDY0LgorLlRQCisuQkkgbWFzayAiIE1BU0siCitBbiBvcHRpb25hbCBiaXRtYXNrIHRvIGJpbmFyeQorLkJSIEFORCAiIHRvIHRoZSBwYWNrZXQncyAiIHRjaW5kZXgKK2ZpZWxkIGJlZm9yZSB1c2UuCisuVFAKKy5CSSBzaGlmdCAiIFNISUZUIgorVGhlIG51bWJlciBvZiBiaXRzIHRvIHJpZ2h0LXNoaWZ0IGEgcGFja2V0J3MKKy5CIHRjaW5kZXgKK3ZhbHVlIGJlZm9yZSB1c2UuIElmIGEKKy5CIG1hc2sKK2hhcyBiZWVuIHNldCwgbWFza2luZyBpcyBkb25lIGJlZm9yZSBzaGlmdGluZy4KKy5UUAorLkIgcGFzc19vbgorSWYgdGhpcyBmbGFnIGlzIHNldCwgZmFpbHVyZSB0byBmaW5kIGEgY2xhc3MgZm9yIHRoZSByZXN1bHRpbmcgSUQgd2lsbCBtYWtlIHRoZQorZmlsdGVyIGZhaWwgYW5kIGxlYWQgdG8gdGhlIG5leHQgZmlsdGVyIGJlaW5nIGNvbnN1bHRlZC4KKy5UUAorLkIgZmFsbF90aHJvdWdoCitUaGlzIGlzIHRoZSBvcHBvc2l0ZSBvZgorLkIgcGFzc19vbgorYW5kIHRoZSBkZWZhdWx0LiBUaGUgZmlsdGVyIHdpbGwgY2xhc3NpZnkgdGhlIHBhY2tldCBldmVuIGlmIHRoZXJlIGlzIG5vIGNsYXNzCitwcmVzZW50IGZvciB0aGUgcmVzdWx0aW5nIGNsYXNzIElELgorCisuU0ggU0VFIEFMU08KKy5CUiB0YyAoOCkKZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L3RjLXUzMi44IGIvaXByb3V0ZTIvbWFuL21hbjgvdGMtdTMyLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdjOGYyZAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L3RjLXUzMi44CkBAIC0wLDAgKzEsNjYzIEBACisuVEggIlVuaXZlcnNhbCAzMmJpdCBjbGFzc2lmaWVyIGluIHRjIiA4ICIyNSBTZXAgMjAxNSIgImlwcm91dGUyIiAiTGludXgiCisKKy5TSCBOQU1FCit1MzIgXC0gdW5pdmVyc2FsIDMyYml0IHRyYWZmaWMgY29udHJvbCBmaWx0ZXIKKy5TSCBTWU5PUFNJUworLmluICs4CisudGkgLTgKKy5CUiB0YyAiICIgZmlsdGVyICIgLi4uIFsgIiBoYW5kbGUKKy5JUiBIQU5ETEUgIiBdICIKKy5CIHUzMgorLklSIE9QVElPTl9MSVNUICIgWyAiCisuQiBvZmZzZXQKKy5JUiBPRkZTRVQgIiBdIFsgIgorLkIgaGFzaGtleQorLklSIEhBU0hLRVkgIiBdIFsgIgorLkIgY2xhc3NpZAorLklSIENMQVNTSUQgIiBdIFsgIgorLkIgZGl2aXNvcgorLklSIHVpbnRfdmFsdWUgIiBdIFsgIgorLkIgb3JkZXIKKy5JUiB1MzJfdmFsdWUgIiBdIFsgIgorLkIgaHQKKy5JUiBIQU5ETEUgIiBdIFsgIgorLkIgc2FtcGxlCisuSVIgU0VMRUNUT1IgIiBbICIKKy5CIGRpdmlzb3IKKy5JUiB1aW50X3ZhbHVlICIgXSBdIFsgIgorLkIgbGluaworLklSIEhBTkRMRSAiIF0gWyAiCisuQiBpbmRldgorLklSIGlmbmFtZSAiIF0gWyAiCisuQlIgaGVscCAiIF0iCisKKy50aSAtOAorLklSIEhBTkRMRSAiIDo9IHsgIgorXGZJdTEyX2hleF9odGlkXGZCOlxmUltcZkl1OF9oZXhfaGFzaFxmQjpcZlJbXGZJdTEyX2hleF9ub2RlaWRcZlJdIHwgXGZCMHhcZkl1MzJfaGV4X3ZhbHVlXGZSIH0KKworLnRpIC04CisuSVIgT1BUSU9OX0xJU1QgIiA6PSBbICIgT1BUSU9OX0xJU1QgIiBdICIgT1BUSU9OCisKKy50aSAtOAorLklSIEhBU0hLRVkgIiA6PSBbICIKKy5CIG1hc2sKKy5JUiB1MzJfaGV4X3ZhbHVlICIgXSBbICIKKy5CIGF0CisuSVIgNCppbnRfdmFsdWUgIiBdIgorCisudGkgLTgKKy5JUiBDTEFTU0lEICIgOj0geyAiCisuQlIgcm9vdCAiIHwgIgorLkJSIG5vbmUgIiB8ICIKK1tcZkl1MTZfbWFqb3JcZlJdXGZCOlxmSXUxNl9taW5vclxmUiB8IFxmSXUzMl9oZXhfdmFsdWVcZlIgfQorCisudGkgLTgKKy5JUiBPRkZTRVQgIiA6PSBbICIKKy5CIHBsdXMKKy5JUiBpbnRfdmFsdWUgIiBdIFsgIgorLkIgYXQKKy5JUiAyKmludF92YWx1ZSAiIF0gWyAiCisuQiBtYXNrCisuSVIgdTE2X2hleF92YWx1ZSAiIF0gWyAiCisuQiBzaGlmdAorLklSIGludF92YWx1ZSAiIF0gWyAiCisuQlIgZWF0ICIgXSIKKworLnRpIC04CisuSVIgT1BUSU9OICIgOj0geyAiCisuQiBtYXRjaAorLklSIFNFTEVDVE9SICIgfCAiCisuQiBhY3Rpb24KKy5JUiBBQ1RJT04gIiB9ICIKKworLnRpIC04CisuSVIgU0VMRUNUT1IgIiA6PSB7ICIKKy5CIHUzMgorLklSIFZBTF9NQVNLXzMyICIgfCAiCisuQiB1MTYKKy5JUiBWQUxfTUFTS18xNiAiIHwgIgorLkIgdTgKKy5JUiBWQUxfTUFTS184ICIgfCAiCisuQiBpcAorLklSIElQICIgfCAiCisuQiBpcDYKKy5JUiBJUDYgIiB8IHsgIgorLkJSIHRjcCAiIHwgIiB1ZHAgIiB9ICIKKy5JUiBUQ1BVRFAgIiB8ICIKKy5CIGljbXAKKy5JUiBJQ01QICIgfCAiCisuQiBtYXJrCisuSVIgVkFMX01BU0tfMzIgIiB8ICIKKy5CIGV0aGVyCisuSVIgRVRIRVIgIiB9IgorCisudGkgLTgKKy5JUiBJUCAiIDo9IHsgeyAiCisuQlIgc3JjICIgfCAiIGRzdCAiIH0geyAiIGRlZmF1bHQgIiB8ICIgYW55ICIgfCAiIGFsbCAiIHwgIgorLklSIGlwX2FkZHJlc3MgIiBbICIKKy5CUiAvICIgeyAiCisuSVIgcHJlZml4bGVuICIgfCAiIG5ldG1hc2sgIiB9IF0gfSAiIEFUICIgfCB7ICIKKy5CUiBkc2ZpZWxkICIgfCAiIGlobCAiIHwgIiBwcm90b2NvbCAiIHwgIiBwcmVjZWRlbmNlICIgfCAiCisuQlIgaWNtcF90eXBlICIgfCAiIGljbXBfY29kZSAiIH0gIgorLklSIFZBTF9NQVNLXzggIiB8IHsgIgorLkJSIHNwb3J0ICIgfCAiIGRwb3J0ICIgfSAiCisuSVIgVkFMX01BU0tfMTYgIiB8ICIKKy5CUiBub2ZyYWcgIiB8ICIgZmlyc3RmcmFnICIgfCAiIGRmICIgfCAiIG1mICIgfSIKKworLnRpIC04CisuSVIgSVA2ICIgOj0geyB7ICIKKy5CUiBzcmMgIiB8ICIgZHN0ICIgfSB7ICIgZGVmYXVsdCAiIHwgIiBhbnkgIiB8ICIgYWxsICIgfCAiCisuSVIgaXA2X2FkZHJlc3MgIiBbLyIgcHJlZml4bGVuICIgXSB9ICIgQVQgIiB8ICIKKy5CIHByaW9yaXR5CisuSVIgVkFMX01BU0tfOCAiIHwgeyAiCisuQlIgcHJvdG9jb2wgIiB8ICIgaWNtcF90eXBlICIgfCAiIGljbXBfY29kZSAiIH0gIgorLklSIFZBTF9NQVNLXzggIiB8ICIKKy5CIGZsb3dsYWJlbAorLklSIFZBTF9NQVNLXzMyICIgfCB7ICIKKy5CUiBzcG9ydCAiIHwgIiBkcG9ydCAiIH0gIgorLklSIFZBTF9NQVNLXzE2ICIgfSIKKworLnRpIC04CisuSVIgVENQVURQICIgOj0geyAiCisuQlIgc3JjICIgfCAiIGRzdCAiIH0gIgorLkkgVkFMX01BU0tfMTYKKworLnRpIC04CisuSVIgSUNNUCAiIDo9IHsgIgorLkIgdHlwZQorLklSIFZBTF9NQVNLXzggIiB8ICIKKy5CIGNvZGUKKy5JUiBWQUxfTUFTS184ICIgfSIKKworLnRpIC04CisuSVIgRVRIRVIgIiA6PSB7ICIKKy5CUiBzcmMgIiB8ICIgZHN0ICIgfSAiCisuSVIgZXRoZXJfYWRkcmVzcyAiICIgQVQKKworLnRpIC04CisuSVIgVkFMX01BU0tfMzIgIiA6PSAiIHUzMl92YWx1ZSAiICIgdTMyX2hleF9tYXNrICIgWyAiIEFUICIgXSIKKworLnRpIC04CisuSVIgVkFMX01BU0tfMTYgIiA6PSAiIHUxNl92YWx1ZSAiICIgdTE2X2hleF9tYXNrICIgWyAiIEFUICIgXSIKKworLnRpIC04CisuSVIgVkFMX01BU0tfOCAiIDo9ICIgdThfdmFsdWUgIiAiIHU4X2hleF9tYXNrICIgWyAiIEFUICIgXSIKKworLnRpIC04CisuSVIgQVQgIiA6PSBbICIKKy5CUiBhdCAiIFsgIiBuZXh0aGRyKyAiIF0gIgorLklSIGludF92YWx1ZSAiIF0iCisuU0ggREVTQ1JJUFRJT04KK1RoZSBVbml2ZXJzYWwvVWdseSAzMmJpdCBmaWx0ZXIgYWxsb3dzIHRvIG1hdGNoIGFyYml0cmFyeSBiaXRmaWVsZHMgaW4gdGhlCitwYWNrZXQuIER1ZSB0byBicmVha2luZyBldmVyeXRoaW5nIGRvd24gdG8gdmFsdWVzLCBtYXNrcyBhbmQgb2Zmc2V0cywgSXQgaXMKK2VxdWFsbHkgcG93ZXJmdWwgYW5kIGhhcmQgdG8gdXNlLiBMdWNraWx5IG1hbnkgYWJzdHJhY3RpbmcgZGlyZWN0aXZlcyBhcmUKK3ByZXNlbnQgd2hpY2ggYWxsb3cgZGVmaW5pbmcgcnVsZXMgb24gYSBoaWdoZXIgbGV2ZWwgYW5kIHRoZXJlZm9yZSBmcmVlIHRoZQordXNlciBmcm9tIGhhdmluZyB0byBmaWRkbGUgd2l0aCBiaXRzIGFuZCBtYXNrcyBpbiBtYW55IGNhc2VzLgorCitUaGVyZSBhcmUgdHdvIGdlbmVyYWwgbW9kZXMgb2YgaW52b2NhdGlvbjogVGhlIGZpcnN0IG1vZGUgY3JlYXRlcyBhIG5ldyBmaWx0ZXIKK3RvIGRlbGVnYXRlIHBhY2tldHMgdG8gZGlmZmVyZW50IGRlc3RpbmF0aW9ucy4gQXBhcnQgZnJvbSB0aGUgb2J2aW91cyBvbmVzLAorbmFtZWx5IGNsYXNzaWZ5aW5nIHRoZSBwYWNrZXQgYnkgc3BlY2lmeWluZyBhCisuSSBDTEFTU0lECitvciBjYWxsaW5nIGFuCisuQlIgYWN0aW9uICwKK29uZSBtYXkKKy5CIGxpbmsKK29uZSBmaWx0ZXIgdG8gYW5vdGhlciBvbmUgKG9yIGV2ZW4gYSBsaXN0IG9mIHRoZW0pLCBlZmZlY3RpdmVseSBvcmdhbml6aW5nCitmaWx0ZXJzIGludG8gYSB0cmVlLWxpa2UgaGllcmFyY2h5LgorCitUeXBpY2FsbHkgZmlsdGVyIGRlbGVnYXRpb24gaXMgZG9uZSBieSBtZWFucyBvZiBhIGhhc2ggdGFibGUsIHdoaWNoIGxlYWRzIHRvIHRoZQorc2Vjb25kIG1vZGUgb2YgaW52b2NhdGlvbjogaXQgbWVyZWx5IHNlcnZlcyB0byBzZXQgdXAgdGhlc2UgaGFzaCB0YWJsZXMuIEZpbHRlcnMKK2NhbiBzZWxlY3QgYSBoYXNoIHRhYmxlIGFuZCBwcm92aWRlIGEga2V5IHNlbGVjdG9yIGZyb20gd2hpY2ggYSBoYXNoIGlzIHRvIGJlCitjb21wdXRlZCBhbmQgdXNlZCBhcyBrZXkgdG8gbG9va3VwIHRoZSB0YWJsZSdzIGJ1Y2tldCB3aGljaCBjb250YWlucyBmaWx0ZXJzIGZvcgorZnVydGhlciBwcm9jZXNzaW5nLiBUaGlzIGlzIHVzZWZ1bCBpZiBhIGhpZ2ggbnVtYmVyIG9mIGZpbHRlcnMgaXMgaW4gdXNlLCBhcyB0aGUKK292ZXJoZWFkIG9mIHBlcmZvcm1pbmcgdGhlIGhhc2ggb3BlcmF0aW9uIGFuZCB0YWJsZSBsb29rdXAgYmVjb21lcyBuZWdsaWdpYmxlIGluCit0aGF0IGNhc2UuIFVzaW5nIGhhc2h0YWJsZXMgd2l0aAorLkIgdTMyCitiYXNpY2FsbHkgaW52b2x2ZXMgdGhlIGZvbGxvd2luZyBwYXR0ZXJuOgorLklQICgxKSA0CitDcmVhdGluZyBhIG5ldyBoYXNoIHRhYmxlLCBzcGVjaWZ5aW5nIGl0J3Mgc2l6ZSB1c2luZyB0aGUKKy5CIGRpdmlzb3IKK3BhcmFtZXRlciBhbmQgaWRlYWxseSBhIGhhbmRsZSBieSB3aGljaCB0aGUgdGFibGUgY2FuIGJlIGlkZW50aWZpZWQuIElmIHRoZQorbGF0dGVyIGlzIG5vdCBnaXZlbiwgdGhlIGtlcm5lbCBjaG9vc2VzIG9uZSBvbiBpdCdzIG93biwgd2hpY2ggaGFzIHRvIGJlCitndWVzc2VkIGxhdGVyLgorLklQICgyKSA0CitDcmVhdGluZyBmaWx0ZXJzIHdoaWNoIGxpbmsgdG8gdGhlIGNyZWF0ZWQgdGFibGUgaW4KKy5JICgxKQordXNpbmcgdGhlCisuQiBsaW5rCitwYXJhbWV0ZXIgYW5kIGRlZmluaW5nIHRoZSBwYWNrZXQgZGF0YSB3aGljaCB0aGUga2VybmVsIHdpbGwgdXNlIHRvIGNhbGN1bGF0ZQordGhlCisuQlIgaGFzaGtleSAuCisuSVAgKDMpIDQKK0FkZGluZyBmaWx0ZXJzIHRvIGJ1Y2tldHMgaW4gdGhlIGhhc2ggdGFibGUgZnJvbQorLklSICgxKSAuCitJbiBvcmRlciB0byBhdm9pZCBoYXZpbmcgdG8ga25vdyBob3cgZXhhY3RseSB0aGUga2VybmVsIGNyZWF0ZXMgdGhlIGhhc2gga2V5LAordGhlcmUgaXMgdGhlCisuQiBzYW1wbGUKK3BhcmFtZXRlciwgd2hpY2ggZ2l2ZXMgc2FtcGxlIGRhdGEgdG8gaGFzaCBhbmQgdGhlcmVieSBkZWZpbmUgdGhlIHRhYmxlIGJ1Y2tldAordGhlIGZpbHRlciBzaG91bGQgYmUgYWRkZWQgdG8uCisKKy5SRQorSW4gZmFjdCwgZXZlbiBpZiBub3QgZXhwbGljaXRseSByZXF1ZXN0ZWQKKy5CIHUzMgorY3JlYXRlcyBhIGhhc2ggdGFibGUgZm9yIGV2ZXJ5CisuQiBwcmlvcml0eQorYSBmaWx0ZXIgaXMgYmVpbmcgYWRkZWQgd2l0aC4gVGhlIHRhYmxlJ3Mgc2l6ZSBpcyAxIHRob3VnaCwgc28gaXQgaXMgaW4gZmFjdAorbWVyZWx5IGEgbGlua2VkIGxpc3QuCisuU0ggVkFMVUVTCitPcHRpb25zIGFuZCBzZWxlY3RvcnMgcmVxdWlyZSB2YWx1ZXMgdG8gYmUgc3BlY2lmaWVkIGluIGEgc3BlY2lmaWMgZm9ybWF0LCB3aGljaAoraXMgb2Z0ZW4gbm9uLWludHVpdGl2ZS4gVGhlcmVmb3JlIHRoZSB0ZXJtaW5hbHMgaW4KKy5JIFNZTk9QU0lTCitoYXZlIGJlZW4gZ2l2ZW4gZGVzY3JpcHRpdmUgbmFtZXMgdG8gaW5kaWNhdGUgdGhlIHJlcXVpcmVkIGZvcm1hdCBhbmQvb3IgbWF4aW11bQorYWxsb3dlZCBudW1lcmljIHZhbHVlOiBQcmVmaXhlcworLklSIHUzMiAiLCAiIHUxNiAiIGFuZCAiIHU4CitpbmRpY2F0ZSBmb3VyLCB0d28gYW5kIHNpbmdsZSBieXRlIHVuc2lnbmVkIHZhbHVlcy4gRS5nLgorLkkgdTE2CitpbmRpY2F0ZXMgYSB0d28gYnl0ZS1zaXplZCB2YWx1ZSBpbiByYW5nZSBiZXR3ZWVuIDAgYW5kIDY1NTM1ICgweEZGRkYpCitpbmNsdXNpdmUuIEEgcHJlZml4IG9mCisuSSBpbnQKK2luZGljYXRlcyBhIGZvdXIgYnl0ZSBzaWduZWQgdmFsdWUuIEEgbWlkZGxlIHBhcnQgb2YKKy5JIF9oZXhfCitpbmRpY2F0ZXMgdGhhdCB0aGUgdmFsdWUgaXMgcGFyc2VkIGluIGhleGFkZWNpbWFsIGZvcm1hdC4gT3RoZXJ3aXNlLCB0aGUKK3ZhbHVlJ3MgYmFzZSBpcyBhdXRvbWF0aWNhbGx5IGRldGVjdGVkLCBpLmUuIHZhbHVlcyBwcmVmaXhlZCB3aXRoCisuSSAweAorYXJlIGNvbnNpZGVyZWQgaGV4YWRlY2ltYWwsIGEgbGVhZGluZworLkkgMAoraW5kaWNhdGVzIG9jdGFsIGZvcm1hdCBhbmQgZGVjaW1hbCBmb3JtYXQgb3RoZXJ3aXNlLiBUaGVyZSBhcmUgc29tZSB2YWx1ZXMgd2l0aAorc3BlY2lhbCBmb3JtYXR0aW5nIGFzIHdlbGw6CisuSVIgaXBfYWRkcmVzcyAiIGFuZCAiIG5ldG1hc2sKK2FyZSBpbiBkb3R0ZWQtcXVhZCBmb3JtYXR0aW5nIGFzIHVzdWFsIGZvciBJUHY0IGFkZHJlc3Nlcy4gQW4KKy5JIGlwNl9hZGRyZXNzCitpcyBzcGVjaWZpZWQgaW4gY29tbW9uLCBjb2xvbi1zZXBhcmF0ZWQgaGV4YWRlY2ltYWwgZm9ybWF0LiBGaW5hbGx5LAorLkkgcHJlZml4bGVuCitpcyBhbiB1bnNpZ25lZCwgZGVjaW1hbCBpbnRlZ2VyIHZhbHVlIGluIHJhbmdlIGZyb20gMCB0byB0aGUgYWRkcmVzcyB3aWR0aCBpbgorYml0cyAoMzIgZm9yIElQdjQgYW5kIDEyOCBmb3IgSVB2NikuCisKK1NvbWV0aW1lcyB2YWx1ZXMgbmVlZCB0byBiZSBkaXZpZGFibGUgYnkgYSBjZXJ0YWluIG51bWJlci4gSW4gdGhhdCBjYXNlIGEgbmFtZQorb2YgdGhlIGZvcm0KKy5JIE4qdmFsCit3YXMgY2hvc2VuLCBpbmRpY2F0aW5nIHRoYXQKKy5JIHZhbAorbXVzdCBiZSBkaXZpZGFibGUgYnkKKy5JUiBOIC4KK09yIHRoZSBvdGhlciB3YXkgYXJvdW5kOiB0aGUgcmVzdWx0aW5nIHZhbHVlIG11c3QgYmUgYSBtdWx0aXBsZSBvZgorLklSIE4gLgorLlNIIE9QVElPTlMKKy5CIFUzMgorcmVjb2duaXplcyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisuVFAKKy5CSSBoYW5kbGUgIiBIQU5ETEUiCitUaGUgaGFuZGxlIGlzIHVzZWQgdG8gcmVmZXJlbmNlIGEgZmlsdGVyIGFuZCB0aGVyZWZvcmUgbXVzdCBiZSB1bmlxdWUuIEl0Citjb25zaXN0cyBvZiBhIGhhc2ggdGFibGUgaWRlbnRpZmllcgorLkIgaHRpZAorYW5kIG9wdGlvbmFsCisuQiBoYXNoCisod2hpY2ggaWRlbnRpZmllcyB0aGUgaGFzaCB0YWJsZSdzIGJ1Y2tldCkgYW5kCisuQlIgbm9kZWlkIC4KK0FsbCB0aGVzZSB2YWx1ZXMgYXJlIHBhcnNlZCBhcyB1bnNpZ25lZCwgaGV4YWRlY2ltYWwgbnVtYmVycyB3aXRoIGxlbmd0aCAxMmJpdHMKKygKKy5CUiBodGlkICIgYW5kICIgbm9kZWlkICkKK29yIDhiaXRzICgKKy5CUiBoYXNoICkuCitBbHRlcm5hdGl2ZWx5IG9uZSBtYXkgc3BlY2lmeSBhIHNpbmdsZSwgMzJiaXQgbG9uZyBoZXggbnVtYmVyIHdoaWNoIGNvbnRhaW5zCit0aGUgdGhyZWUgZmllbGRzIGJpdHMgaW4gY29uY2F0ZW5hdGVkIGZvcm0uIE90aGVyIHRoYW4gdGhlIGZpZWxkcyB0aGVtc2VsdmVzLCBpdAoraGFzIHRvIGJlIHByZWZpeGVkIGJ5CisuQlIgMHggLgorLlRQCisuQkkgb2Zmc2V0ICIgT0ZGU0VUIgorU2V0IGFuIG9mZnNldCB3aGljaCBkZWZpbmVzIHdoZXJlIG1hdGNoZXMgb2Ygc3Vic2VxdWVudCBmaWx0ZXJzIGFyZSBhcHBsaWVkIHRvLgorVGhlcmVmb3JlIHRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBvbmx5IHdoZW4gY29tYmluZWQgd2l0aAorLkJSIGxpbmsgIiBvciBhIGNvbWJpbmF0aW9uIG9mICIgaHQgIiBhbmQgIiBzYW1wbGUgLgorVGhlIG9mZnNldCBtYXkgYmUgZ2l2ZW4gZXhwbGljaXRseSBieSB1c2luZyB0aGUKKy5CIHBsdXMKK2tleXdvcmQsIG9yIGV4dHJhY3RlZCBmcm9tIHRoZSBwYWNrZXQgZGF0YSB3aXRoCisuQlIgYXQgLgorSXQgaXMgcG9zc2libGUgdG8gbWFuZ2xlIHRoZSBsYXR0ZXIgdXNpbmcKKy5CUiBtYXNrICIgYW5kL29yICIgc2hpZnQKK2tleXdvcmRzLiBCeSBkZWZhdWx0LCB0aGlzIG9mZnNldCBpcyByZWNvcmRlZCBidXQgbm90IGltcGxpY2l0bHkgYXBwbGllZC4gSXQgaXMKK3VzZWQgb25seSB0byBzdWJzdGl0dXRlIHRoZQorLkIgbmV4dGhkcisKK3N0YXRlbWVudC4gVXNpbmcgdGhlIGtleXdvcmQKKy5CIGVhdAordGhvdWdoIGludmVyc2VzIHRoaXMgYmVoYXZpb3VyOiB0aGUgb2Zmc2V0IGlzIGFwcGxpZWQgYWx3YXlzLCBhbmQKKy5CIG5leHRoZHIrCit3aWxsIGZhbGwgYmFjayB0byB6ZXJvLgorLlRQCisuQkkgaGFzaGtleSAiIEhBU0hLRVkiCitTcGVmaWZ5IHdoYXQgcGFja2V0IGRhdGEgdG8gdXNlIHRvIGNhbGN1bGF0ZSBhIGhhc2gga2V5IGZvciBidWNrZXQgbG9va3VwLiBUaGUKK2tlcm5lbCBhZGp1c3RzIHRoZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIGhhc2ggdGFibGUncyBzaXplLiBGb3IgdGhpcyB0byB3b3JrLAordGhlIG9wdGlvbgorLkIgbGluaworbXVzdCBiZSBnaXZlbi4KKy5UUAorLkJJIGNsYXNzaWQgIiBDTEFTU0lEIgorQ2xhc3NpZnkgbWF0Y2hpbmcgcGFja2V0cyBpbnRvIHRoZSBnaXZlbgorLklSIENMQVNTSUQgLAord2hpY2ggY29uc2lzdHMgb2YgZWl0aGVyIDE2Yml0CisuQlIgbWFqb3IgIiBhbmQgIiBtaW5vcgorbnVtYmVycyBvciBhIHNpbmdsZSAzMmJpdCB2YWx1ZSBjb21iaW5pbmcgYm90aC4KKy5UUAorLkJJIGRpdmlzb3IgIiB1MzJfdmFsdWUiCitTcGVjaWZ5IGEgbW9kdWxvIHZhbHVlLiBVc2VkIHdoZW4gY3JlYXRpbmcgaGFzaCB0YWJsZXMgdG8gZGVmaW5lIHRoZWlyIHNpemUgb3IKK2ZvciBkZWNsYXJpbmcgYQorLkIgc2FtcGxlCit0byBjYWxjdWxhdGUgaGFzaCB0YWJsZSBrZXlzIGZyb20uIE11c3QgYmUgYSBwb3dlciBvZiB0d28gd2l0aCBleHBvbmVudCBub3QKK2V4Y2VlZGluZyBlaWdodC4KKy5UUAorLkJJIG9yZGVyICIgdTMyX3ZhbHVlIgorQSB2YWx1ZSB0byBvcmRlciBmaWx0ZXJzIGJ5LCBhc2NlbmRpbmcuIENvbmZsaWN0cyB3aXRoCisuQiBoYW5kbGUKK3doaWNoIHNlcnZlcyB0aGUgc2FtZSBwdXJwb3NlLgorLlRQCisuQkkgc2FtcGxlICIgU0VMRUNUT1IiCitVc2VkIHRvZ2V0aGVyIHdpdGgKKy5CIGh0Cit0byBzcGVjaWZ5IHdoaWNoIGJ1Y2tldCB0byBhZGQgdGhpcyBmaWx0ZXIgdG8uIFRoaXMgYWxsb3dzIG9uZSB0byBhdm9pZCBoYXZpbmcKK3RvIGtub3cgaG93IGV4YWN0bHkgdGhlIGtlcm5lbCBjYWxjdWxhdGVzIGhhc2hlcy4gVGhlIGFkZGl0aW9uYWwKKy5CIGRpdmlzb3IKK2RlZmF1bHRzIHRvIDI1Niwgc28gbXVzdCBiZSBnaXZlbiBmb3IgaGFzaCB0YWJsZXMgb2YgZGlmZmVyZW50IHNpemUuCisuVFAKKy5CSSBsaW5rICIgSEFORExFIgorRGVsZWdhdGUgbWF0Y2hpbmcgcGFja2V0cyB0byBmaWx0ZXJzIGluIGEgaGFzaCB0YWJsZS4KKy5JIEhBTkRMRQoraXMgdXNlZCB0byBvbmx5IHNwZWNpZnkgdGhlIGhhc2ggdGFibGUsIHNvIG9ubHkKKy5CUiBodGlkICIgbWF5IGJlIGdpdmVuLCAiIGhhc2ggIiBhbmQgIiBub2RlaWQKK2hhdmUgdG8gYmUgb21pdHRlZC4gQnkgZGVmYXVsdCwgYnVja2V0IG51bWJlciAwIHdpbGwgYmUgdXNlZCBhbmQgY2FuIGJlCitvdmVycmlkZGVuIGJ5IHRoZQorLkIgaGFzaGtleQorb3B0aW9uLgorLlRQCisuQkkgaW5kZXYgIiBpZm5hbWUiCitGaWx0ZXIgb24gdGhlIGluY29taW5nIGludGVyZmFjZSBvZiB0aGUgcGFja2V0LiBPYnZpb3VzbHkgd29ya3Mgb25seSBmb3IKK2ZvcndhcmRlZCB0cmFmZmljLgorLlRQCisuQkkgaGVscAorUHJpbnQgYSBicmllZiBoZWxwIHRleHQgYWJvdXQgcG9zc2libGUgb3B0aW9ucy4KKy5TSCBTRUxFQ1RPUlMKK0Jhc2ljYWxseSB0aGUgb25seSByZWFsIHNlbGVjdG9yIGlzCisuQiB1MzIgLgorQWxsIG90aGVycyBtZXJlbHkgcHJvdmlkZSBhIGhpZ2hlciBsZXZlbCBzeW50YXggYW5kIGFyZSBpbnRlcm5hbGx5IHRyYW5zbGF0ZWQKK2ludG8KKy5CIHUzMiAuCisuVFAKKy5CSSB1MzIgIiBWQUxfTUFTS18zMiIKKy5UUQorLkJJIHUxNiAiIFZBTF9NQVNLXzE2IgorLlRRCisuQkkgdTggIiBWQUxfTUFTS184IgorTWF0Y2ggcGFja2V0IGRhdGEgdG8gYSBnaXZlbiB2YWx1ZS4gVGhlIHNlbGVjdG9yIG5hbWUgZGVmaW5lcyB0aGUgc2FtcGxlIGxlbmd0aAordG8gZXh0cmFjdCAoMzJiaXRzIGZvcgorLkJSIHUzMiAsCisxNmJpdHMgZm9yCisuQiB1MTYKK2FuZCA4Yml0cyBmb3IKKy5CUiB1OCApLgorQmVmb3JlIGNvbXBhcmluZywgdGhlIHNhbXBsZSBpcyBiaW5hcnkgQU5EJ2VkIHdpdGggdGhlIGdpdmVuIG1hc2suIFRoaXMgd2F5Cit1bmludGVyZXN0aW5nIGJpdHMgY2FuIGJlIGNsZWFyZWQgYmVmb3JlIGNvbXBhcmlzb24uIFRoZSBwb3NpdGlvbiBvZiB0aGUgc2FtcGxlCitpcyBkZWZpbmVkIGJ5IHRoZSBvZmZzZXQgc3BlY2lmaWVkIGluCisuSVIgQVQgLgorLlRQCisuQkkgaXAgIiBJUCIKKy5UUQorLkJJIGlwNiAiIElQNiIKK0Fzc3VtZSBwYWNrZXQgc3RhcnRzIHdpdGggYW4gSVB2NCAoCisuQlIgaXAgKQorb3IgSVB2NiAoCisuQlIgaXA2ICkKK2hlYWRlci4KKy5JUiBJUCAvIElQNgordGhlbiBhbGxvd3MgdG8gbWF0Y2ggdmFyaW91cyBoZWFkZXIgZmllbGRzOgorLlJTCisuVFAKKy5CSSBzcmMgIiBBRERSIgorLkJJIGRzdCAiIEFERFIiCitDb21wYXJlIFNvdXJjZSBvciBEZXN0aW5hdGlvbiBBZGRyZXNzIGZpZWxkcyBhZ2FpbnN0IHRoZSB2YWx1ZSBvZgorLklSIEFERFIgLgorVGhlIHJlc2VydmVkIHdvcmRzCisuQlIgZGVmYXVsdCAiLCAiIGFueSAiIGFuZCAiIGFsbAorZWZmZWN0aXZlbHkgbWF0Y2ggYW55IGFkZHJlc3MuIE90aGVyd2lzZSBhbiBJUCBhZGRyZXNzIG9mIHRoZSBwYXJ0aWN1bGFyCitwcm90b2NvbCBpcyBleHBlY3RlZCwgb3B0aW9uYWxseSBzdWZmaXhlZCBieSBhIHByZWZpeCBsZW5ndGggdG8gbWF0Y2ggd2hvbGUKK3N1Ym5ldHMuIEluIGNhc2Ugb2YgSVB2NCBhIG5ldG1hc2sgbWF5IGFsc28gYmUgZ2l2ZW4uCisuVFAKKy5CSSBkc2ZpZWxkICIgVkFMX01BU0tfOCIKK0lQdjQgb25seS4gTWF0Y2ggdGhlIHBhY2tldCBoZWFkZXIncyBEU0NQL0VDTiBmaWVsZC4gU3lub255bXMgdG8gdGhpcyBhcmUKKy5CUiB0b3MgIiBhbmQgIiBwcmVjZWRlbmNlIC4KKy5UUAorLkJJIGlobCAiIFZBTF9NQVNLXzgiCitJUHY0IG9ubHkuIE1hdGNoIHRoZSBJbnRlcm5ldCBIZWFkZXIgTGVuZ3RoIGZpZWxkLiBOb3RlIHRoYXQgdGhlIHZhbHVlJ3MgdW5pdCBpcworMzJiaXRzLCBzbyB0byBtYXRjaCBhIHBhY2tldCB3aXRoIDI0Ynl0ZSBoZWFkZXIgbGVuZ3RoCisuSSB1OF92YWx1ZQoraGFzIHRvIGJlIDYuCisuVFAKKy5CSSBwcm90b2NvbCAiIFZBTF9NQVNLXzgiCitNYXRjaCB0aGUgUHJvdG9jb2wgKElQdjQpIG9yIE5leHQgSGVhZGVyIChJUHY2KSBmaWVsZCB2YWx1ZSwgZS5nLiA2IGZvciBUQ1AuCisuVFAKKy5CSSBpY21wX3R5cGUgIiBWQUxfTUFTS184IgorLlRRCisuQkkgaWNtcF9jb2RlICIgVkFMX01BU0tfOCIKK0Fzc3VtZSBhIG5leHQtaGVhZGVyIHByb3RvY29sIG9mIGljbXAgb3IgaXB2Ni1pY21wIGFuZCBtYXRjaCBUeXBlIG9yIENvZGUKK2ZpZWxkIHZhbHVlcy4gVGhpcyBpcyBkYW5nZXJvdXMsIGFzIHRoZSBjb2RlIGFzc3VtZXMgbWluaW1hbCBoZWFkZXIgc2l6ZSBmb3IKK0lQdjQgYW5kIGxhY2sgb2YgZXh0ZW5zaW9uIGhlYWRlcnMgZm9yIElQdjYuCisuVFAKKy5CSSBzcG9ydCAiIFZBTF9NQVNLXzE2IgorLlRRCisuQkkgZHBvcnQgIiBWQUxfTUFTS18xNiIKK01hdGNoIGxheWVyIGZvdXIgc291cmNlIG9yIGRlc3RpbmF0aW9uIHBvcnRzLiBUaGlzIGlzIGRhbmdlcm91cyBhcyB3ZWxsLCBhcyBpdAorYXNzdW1lcyBhIHN1aXRhYmxlIGxheWVyIGZvdXIgcHJvdG9jb2wgaXMgcHJlc2VudCAod2hpY2ggaGFzIFNvdXJjZSBhbmQKK0Rlc3RpbmF0aW9uIFBvcnQgZmllbGRzIHJpZ2h0IGF0IHRoZSBzdGFydCBvZiB0aGUgaGVhZGVyIGFuZCAxNmJpdCBpbiBzaXplKS4KK0Fsc28gbWluaW1hbCBoZWFkZXIgc2l6ZSBmb3IgSVB2NCBhbmQgbGFjayBvZiBJUHY2IGV4dGVuc2lvbiBoZWFkZXJzIGlzIGFzc3VtZWQuCisuVFAKKy5CIG5vZnJhZworLlRRCisuQiBmaXJzdGZyYWcKKy5UUQorLkIgZGYKKy5UUQorLkIgbWYKK0lQdjQgb25seSwgY2hlY2sgY2VydGFpbiBmbGFncyBhbmQgZnJhZ21lbnQgb2Zmc2V0IHZhbHVlcy4gTWF0Y2ggaWYgdGhlIHBhY2tldAoraXMgbm90IGEgZnJhZ21lbnQKKy5SQiAoIG5vZnJhZyApLAordGhlIGZpcnN0IGZyYWdtZW50CisuUkIgKCBmaXJzdGZyYWcgKSwKK2lmIERvbid0IEZyYWdtZW50CisuUkIgKCBkZiApCitvciBNb3JlIEZyYWdtZW50cworLlJCICggbWYgKQorYml0cyBhcmUgc2V0LgorLlRQCisuQkkgcHJpb3JpdHkgIiBWQUxfTUFTS184IgorSVB2NiBvbmx5LiBNYXRjaCB0aGUgaGVhZGVyJ3MgVHJhZmZpYyBDbGFzcyBmaWVsZCwgd2hpY2ggaGFzIHRoZSBzYW1lIHB1cnBvc2UKK2FuZCBzZW1hbnRpY3Mgb2YgSVB2NCdzIFRvUyBmaWVsZCBzaW5jZSBSRkMgMzE2ODogdXBwZXIgc2l4IGJpdHMgYXJlIERTQ1AsIHRoZQorbG93ZXIgdHdvIEVDTi4KKy5UUAorLkJJIGZsb3dsYWJlbCAiIFZBTF9NQVNLXzMyIgorSVB2NiBvbmx5LiBNYXRjaCB0aGUgRmxvdyBMYWJlbCBmaWVsZCdzIHZhbHVlLiBOb3RlIHRoYXQgRmxvdyBMYWJlbCBpdHNlbGYgaXMKK29ubHkgMjBieXRlcyBsb25nLCB3aGljaCBhcmUgdGhlIGxlYXN0IHNpZ25pZmljYW50IG9uZXMgaGVyZS4gVGhlIHJlbWFpbmluZwordXBwZXIgMTJieXRlcyBtYXRjaCBWZXJzaW9uIGFuZCBUcmFmZmljIENsYXNzIGZpZWxkcy4KKy5SRQorLlRQCisuQkkgdGNwICIgVENQVURQIgorLlRRCisuQkkgdWRwICIgVENQVURQIgorTWF0Y2ggZmllbGRzIG9mIG5leHQgaGVhZGVyIG9mIHByb3RvY29sIFRDUCBvciBVRFAuIFRoZSBwb3NzaWJsZSB2YWx1ZXMgZm9yCisuSSBUQ1BEVVAKK2FyZToKKy5SUworLlRQCisuQkkgc3JjICIgVkFMX01BU0tfMTYiCitNYXRjaCBvbiBTb3VyY2UgUG9ydCBmaWVsZCB2YWx1ZS4KKy5UUAorLkJJIGRzdCAiIFZBTE1BU0tfMTYiCitNYXRjaCBvbiBEZXN0aW5hdGlvbiBQb3J0IGZpZWxkIHZhbHVlLgorLlJFCisuVFAKKy5CSSBpY21wICIgSUNNUCIKK01hdGNoIGZpZWxkcyBvZiBuZXh0IGhlYWRlciBvZiBwcm90b2NvbCBJQ01QLiBUaGUgcG9zc2libGUgdmFsdWVzIGZvcgorLkkgSUNNUAorYXJlOgorLlJTCisuVFAKKy5CSSB0eXBlICIgVkFMX01BU0tfOCIKK01hdGNoIG9uIElDTVAgVHlwZSBmaWVsZC4KKy5UUAorLkJJIGNvZGUgIiBWQUxfTUFTS184IgorTWF0Y2ggb24gSUNNUCBDb2RlIGZpZWxkLgorLlJFCisuVFAKKy5CSSBtYXJrICIgVkFMX01BU0tfMzIiCitNYXRjaCBvbiBuZXRmaWx0ZXIgZndtYXJrIHZhbHVlLgorLlRQCisuQkkgZXRoZXIgIiBFVEhFUiIKK01hdGNoIG9uIGV0aGVybmV0IGhlYWRlciBmaWVsZHMuIFBvc3NpYmxlIHZhbHVlcyBmb3IKKy5JIEVUSEVSCithcmU6CisuUlMKKy5UUAorLkJJIHNyYyAiIGV0aGVyX2FkZHJlc3MiICIgIiBBVAorLlRRCisuQkkgZHN0ICIgZXRoZXJfYWRkcmVzcyIgIiAiIEFUCitNYXRjaCBvbiBzb3VyY2Ugb3IgZGVzdGluYXRpb24gZXRoZXJuZXQgYWRkcmVzcy4gVGhpcyBpcyBkYW5nZXJvdXM6IEl0IGFzc3VtZXMKK2FuIGV0aGVybmV0IGhlYWRlciBpcyBwcmVzZW50IGF0IHRoZSBzdGFydCBvZiB0aGUgcGFja2V0LiBUaGlzIHdpbGwgcHJvYmFibHkKK2xlYWQgdG8gdW5leHBlY3RlZCB0aGluZ3MgaWYgdXNlZCB3aXRoIGxheWVyIHRocmVlIGludGVyZmFjZXMgbGlrZSBlLmcuIHR1biBvcgorcHBwLgorLlNIIEVYQU1QTEVTCisuUlMKKy5FWAordGMgZmlsdGVyIGFkZCBkZXYgZXRoMCBwYXJlbnQgOTk5OjAgcHJpbyA5OSBwcm90b2NvbCBpcCB1MzIgXFwKKyAgICAgICAgbWF0Y2ggaXAgc3JjIDE5Mi4xNjguOC4wLzI0IGNsYXNzaWQgMToxCisuRUUKKy5SRQorCitUaGlzIGF0dGFjaGVzIGEgZmlsdGVyIHRvIHRoZSBxZGlzYyBpZGVudGlmaWVkIGJ5CisuQlIgOTk5OjAuCitJdCdzIHByaW9yaXR5IGlzCisuQlIgOTkgLAord2hpY2ggYWZmZWN0cyBpbiB3aGljaCBvcmRlciBtdWx0aXBsZSBmaWx0ZXJzIGF0dGFjaGVkIHRvIHRoZSBzYW1lCisuQiBwYXJlbnQKK2FyZSBjb25zdWx0ZWQgKHRoZSBsb3dlciB0aGUgZWFybGllcikuIFRoZSBmaWx0ZXIgaGFuZGxlcyBwYWNrZXRzIG9mCisuQiBwcm90b2NvbAordHlwZQorLkJSIGlwICwKK2FuZAorLkJSIG1hdGNoIGVzCitpZiB0aGUgSVAgaGVhZGVyJ3Mgc291cmNlIGFkZHJlc3MgaXMgd2l0aGluIHRoZQorLkIgMTkyLjE2OC44LjAvMjQKK3N1Ym5ldC4gTWF0Y2hpbmcgcGFja2V0cyBhcmUgY2xhc3NpZmllZCBpbnRvIGNsYXNzCisuQlIgMS4xIC4KK1RoZSBlZmZlY3Qgb2YgdGhpcyBjb21tYW5kIG1pZ2h0IGJlIHN1cnByaXNpbmcgYXQgZmlyc3QgZ2xhbmNlOgorCisuUlMKKy5FWAorZmlsdGVyIHBhcmVudCAxOiBwcm90b2NvbCBpcCBwcmVmIDk5IHUzMgorZmlsdGVyIHBhcmVudCAxOiBwcm90b2NvbCBpcCBwcmVmIDk5IHUzMiBcXAorICAgICAgICBmaCA4MDA6IGh0IGRpdmlzb3IgMQorZmlsdGVyIHBhcmVudCAxOiBwcm90b2NvbCBpcCBwcmVmIDk5IHUzMiBcXAorICAgICAgICBmaCA4MDA6OjgwMCBvcmRlciAyMDQ4IGtleSBodCA4MDAgYmt0IDAgZmxvd2lkIDE6MSBcXAorICAgICAgICBtYXRjaCBjMGE4MDgwMC9mZmZmZmYwMCBhdCAxMgorLkVFCisuUkUKKworU28gcGFyZW50CisuQiAxOgoraXMgYXNzaWduZWQgYSBuZXcKKy5CIHUzMgorZmlsdGVyLCB3aGljaCBjb250YWlucyBhIGhhc2ggdGFibGUgb2Ygc2l6ZSAxIChhcyB0aGUKKy5CIGRpdmlzb3IKK2luZGljYXRlcykuIFRoZSB0YWJsZSBJRCBpcworLkJSIDgwMCAuCitUaGUgdGhpcmQgbGluZSB0aGVuIHNob3dzIHRoZSBhY3R1YWwgZmlsdGVyIHdoaWNoIHdhcyBhZGRlZCBhYm92ZTogaXQgc2l0cyBpbgordGFibGUKKy5CIDgwMAorYW5kIGJ1Y2tldAorLkJSIDAgLAorY2xhc3NpZmllcyBwYWNrZXRzIGludG8gY2xhc3MgSUQKKy5CIDE6MQorYW5kIG1hdGNoZXMgdGhlIHVwcGVyIHRocmVlIGJ5dGVzIG9mIHRoZSBmb3VyIGJ5dGUgdmFsdWUgYXQgb2Zmc2V0CisuQiAxMgordG8gYmUKKy5CUiAweGMwYTgwOCAsCit3aGljaCBpcyAxOTIsIDE2OCBhbmQgOC4KKworTm93IGZvciBzb21ldGhpbmcgbW9yZSBjb21wbGljYXRlZCwgbmFtZWx5IGNyZWF0aW5nIGEgY3VzdG9tIGhhc2ggdGFibGU6CisKKy5SUworLkVYCit0YyBmaWx0ZXIgYWRkIGRldiBldGgwIHByaW8gOTkgaGFuZGxlIDE6IHUzMiBkaXZpc29yIDI1NgorLkVFCisuUkUKKworVGhpcyBjcmVhdGVzIGEgdGFibGUgb2Ygc2l6ZSAyNTYgd2l0aCBoYW5kbGUKKy5CIDE6CitpbiBwcmlvcml0eQorLkJSIDk5IC4KK1RoZSBlZmZlY3QgaXMgYXMgZm9sbG93czoKKworLlJTCisuRVgKK2ZpbHRlciBwYXJlbnQgMTogcHJvdG9jb2wgYWxsIHByZWYgOTkgdTMyCitmaWx0ZXIgcGFyZW50IDE6IHByb3RvY29sIGFsbCBwcmVmIDk5IHUzMiBmaCAxOiBodCBkaXZpc29yIDI1NgorZmlsdGVyIHBhcmVudCAxOiBwcm90b2NvbCBhbGwgcHJlZiA5OSB1MzIgZmggODAwOiBodCBkaXZpc29yIDEKKy5FRQorLlJFCisKK1NvIGFsb25nIHdpdGggdGhlIHJlcXVlc3RlZCBoYXNoIHRhYmxlIChoYW5kbGUKKy5CUiAxOiApLAordGhlIGtlcm5lbCBoYXMgY3JlYXRlZCBoaXMgb3duIHRhYmxlIG9mIHNpemUgMSB0byBob2xkIG90aGVyIGZpbHRlcnMgb2YgdGhlIHNhbWUKK3ByaW9yaXR5LgorCitUaGUgbmV4dCBzdGVwIGlzIHRvIGNyZWF0ZSBhIGZpbHRlciB3aGljaCBsaW5rcyB0byB0aGUgY3JlYXRlZCBoYXNoIHRhYmxlOgorCisuUlMKKy5FWAordGMgZmlsdGVyIGFkZCBkZXYgZXRoMCBwYXJlbnQgMTogcHJpbyAxIHUzMiBcXAorICAgICAgICBsaW5rIDE6IGhhc2hrZXkgbWFzayAweDAwMDBmZjAwIGF0IDEyIFxcCisgICAgICAgIG1hdGNoIGlwIHNyYyAxOTIuMTY4LjAuMC8xNgorLkVFCisuUkUKKworVGhlIGZpbHRlciBpcyBnaXZlbiBhIGxvd2VyIHByaW9yaXR5IHRoYW4gdGhlIGhhc2ggdGFibGUgaXRzZWxmIHNvCisuQiB1MzIKK2NvbnN1bHRzIGl0IGJlZm9yZSBtYW51YWxseSB0cmF2ZXJzaW5nIHRoZSBoYXNoIHRhYmxlLiBUaGUgb3B0aW9ucworLkJSIGxpbmsgIiBhbmQgIiBoYXNoa2V5CitkZXRlcm1pbmUgd2hpY2ggdGFibGUgYW5kIGJ1Y2tldCB0byByZWRpcmVjdCB0by4gSW4gdGhpcyBjYXNlIHRoZSBoYXNoIGtleQorc2hvdWxkIGJlIGNvbnN0cnVjdGVkIG91dCBvZiB0aGUgc2Vjb25kIGJ5dGUgYXQgb2Zmc2V0IDEyLCB3aGljaCBjb3JyZXNwb25kcyB0bworYW4gSVAgcGFja2V0J3MgdGhpcmQgYnl0ZSBvZiB0aGUgc291cmNlIGFkZHJlc3MgZmllbGQuIEFsb25nIHdpdGggdGhlCisuQiBtYXRjaAorc3RhdGVtZW50LCB0aGlzIGVmZmVjdGl2ZWx5IG1hcHMgYWxsIGNsYXNzIEMgbmV0d29ya3MgYmVsb3cgMTkyLjE2OC4wLjAvMTYgdG8KK2RpZmZlcmVudCBidWNrZXRzIG9mIHRoZSBoYXNoIHRhYmxlLgorCitGaWx0ZXJzIGZvciBjZXJ0YWluIHN1Ym5ldHMgY2FuIGJlIGNyZWF0ZWQgbGlrZSBzbzoKKworLlJTCisuRVgKK3RjIGZpbHRlciBhZGQgZGV2IGV0aDAgcGFyZW50IDE6IHByaW8gOTkgdTMyIFxcCisgICAgICAgIGh0IDE6IHNhbXBsZSB1MzIgMHgwMDAwMDgwMCAweDAwMDBmZjAwIGF0IDEyIFxcCisgICAgICAgIG1hdGNoIGlwIHNyYyAxOTIuMTY4LjguMC8yNCBjbGFzc2lkIDE6MQorLkVFCisuUkUKKworVGhlIGJ1Y2tldCBpcyBkZWZpbmVkIHVzaW5nIHRoZQorLkIgc2FtcGxlCitvcHRpb246IEluIHRoaXMgY2FzZSwgdGhlIHNlY29uZCBieXRlIGF0IG9mZnNldCAxMiBtdXN0IGJlIDB4MDgsIGV4YWN0bHkuIEluCit0aGlzIGNhc2UsIHRoZSByZXN1bHRpbmcgYnVja2V0IElEIGlzIG9idmlvdXNseSA4LCBidXQgYXMgc29vbiBhcworLkIgc2FtcGxlCitzZWxlY3RzIGFuIGFtb3VudCBvZiBkYXRhIHdoaWNoIGNvdWxkIGV4Y2VlZCB0aGUKKy5CUiBkaXZpc29yICwKK29uZSB3b3VsZCBoYXZlIHRvIGtub3cgdGhlIGtlcm5lbC1pbnRlcm5hbCBhbGdvcml0aG0gdG8gZGVkdWNlIHRoZSBkZXN0aW5hdGlvbgorYnVja2V0LiBUaGlzIGZpbHRlcidzCisuQiBtYXRjaAorc3RhdGVtZW50IGlzIHJlZHVuZGFudCBpbiB0aGlzIGNhc2UsIGFzIHRoZSBlbnRyb3B5IGZvciB0aGUgaGFzaCBrZXkgZG9lcyBub3QKK2V4Y2VlZCB0aGUgdGFibGUgc2l6ZSBhbmQgdGhlcmVmb3JlIG5vIGNvbGxpc2lvbnMgY2FuIG9jY3VyLiBPdGhlcndpc2UgaXQncworbmVjZXNzYXJ5IHRvIHByZXZlbnQgbWF0Y2hpbmcgdW53YW50ZWQgcGFja2V0cy4KKworTWF0Y2hpbmcgdXBwZXIgbGF5ZXIgZmllbGRzIGlzIHByb2JsZW1hdGljIHNpbmNlIElQdjQgaGVhZGVyIGxlbmd0aCBpcyB2YXJpYWJsZQorYW5kIElQdjYgc3VwcG9ydHMgZXh0ZW5zaW9uIGhlYWRlcnMgd2hpY2ggYWZmZWN0IHVwcGVyIGxheWVyIGhlYWRlciBvZmZzZXQuIFRvCitvdmVyY29tZSB0aGlzLCB0aGVyZSBpcyB0aGUgcG9zc2liaWxpdHkgdG8gc3BlY2lmeQorLkIgbmV4dGhkcisKK3doZW4gZ2l2aW5nIGFuIG9mZnNldCwgYW5kIHRvIG1ha2UgdGhpbmdzIGVhc2llciB0aGVyZSBhcmUgdGhlCisuQlIgdGNwICIgYW5kICIgdWRwCittYXRjaGVzIHdoaWNoIHVzZQorLkIgbmV4dGhkcisKK2ltcGxpY2l0bHkuIFRoaXMgb2Zmc2V0IGhhcyB0byBiZSBjYWxjdWxhdGVkIGluIGJlZm9yZWhhbmQgdGhvdWdoLCBhbmQgdGhlIG9ubHkKK3dheSB0byBhY2hpZXZlIHRoYXQgaXMgYnkgZG9pbmcgaXQgaW4gYSBzZXBhcmF0ZSBmaWx0ZXIgd2hpY2ggdGhlbiBsaW5rcyB0byB0aGUKK2ZpbHRlciB3aGljaCB3YW50cyB0byB1c2UgaXQuIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiBkb2luZyBzbzoKKworLlJTCisuRVgKK3RjIGZpbHRlciBhZGQgZGV2IGV0aDAgcGFyZW50IDE6MCBwcm90b2NvbCBpcCBoYW5kbGUgMTogXFwKKyAgICAgICAgdTMyIGRpdmlzb3IgMQordGMgZmlsdGVyIGFkZCBkZXYgZXRoMCBwYXJlbnQgMTowIHByb3RvY29sIGlwIFxcCisgICAgICAgIHUzMiBodCAxOiBcXAorICAgICAgICBtYXRjaCB0Y3Agc3JjIDIyIEZGRkYgXFwKKyAgICAgICAgY2xhc3NpZCAxOjIKK3RjIGZpbHRlciBhZGQgZGV2IGV0aDAgcGFyZW50IDE6MCBwcm90b2NvbCBpcCBcXAorICAgICAgICB1MzIgaHQgODAwOiBcXAorICAgICAgICBtYXRjaCBpcCBwcm90b2NvbCA2IEZGIFxcCisgICAgICAgIG1hdGNoIGlwIGZpcnN0ZnJhZyBcXAorICAgICAgICBvZmZzZXQgYXQgMCBtYXNrIDBmMDAgc2hpZnQgNiBcXAorICAgICAgICBsaW5rIDE6CisuRUUKKy5SRQorCitUaGlzIGlzIHdoYXQgaXMgYmVpbmcgZG9uZTogSW4gdGhlIGZpcnN0IGNhbGwsIGEgc2luZ2xlIGVsZW1lbnQgc2l6ZWQgaGFzaCB0YWJsZQoraXMgY3JlYXRlZCBzbyB0aGVyZSBpcyBhIHBsYWNlIHRvIGhvbGQgdGhlIGxpbmtlZCB0byBmaWx0ZXIgYW5kIGEga25vd24gaGFuZGxlCisuUkIgKCAxOiApCit0byByZWZlcmVuY2UgdG8gaXQuIFRoZSBzZWNvbmQgY2FsbCB0aGVuIGFkZHMgdGhlIGFjdHVhbCBmaWx0ZXIsIHdoaWNoIHB1c2hlcworcGFja2V0cyB3aXRoIFRDUCBzb3VyY2UgcG9ydCAyMiBpbnRvIGNsYXNzCisuQlIgMToyIC4KK1VzaW5nCisuQlIgaHQgLAoraXQgaXMgbW92ZWQgaW50byB0aGUgaGFzaCB0YWJsZSBjcmVhdGVkIGJ5IHRoZSBmaXJzdCBjYWxsLiBUaGUgdGhpcmQgY2FsbCB0aGVuCitkb2VzIHRoZSBhY3R1YWwgbWFnaWM6IEl0IG1hdGNoZXMgSVB2NCBwYWNrZXRzIHdpdGggbmV4dCBsYXllciBwcm90b2NvbCA2IChUQ1ApLAorb25seSBpZiBpdCdzIHRoZSBmaXJzdCBmcmFnbWVudCAodXN1YWxseSBUQ1Agc2V0cyBERiBiaXQsIGJ1dCBpZiBpdCBkb2Vzbid0IGFuZAordGhlIHBhY2tldCBpcyBmcmFnbWVudGVkLCBvbmx5IHRoZSBmaXJzdCBvbmUgY29udGFpbnMgdGhlIFRDUCBoZWFkZXIpLCBhbmQgdGhlbgorc2V0cyB0aGUgb2Zmc2V0IGJhc2VkIG9uIHRoZSBJUCBoZWFkZXIncyBJSEwgZmllbGQgKHJpZ2h0LXNoaWZ0aW5nIGJ5IDYKK2VsaW1pbmF0ZXMgdGhlIG9mZnNldCBvZiB0aGUgZmllbGQgYW5kIGF0IHRoZSBzYW1lIHRpbWUgY29udmVydHMgdGhlIHZhbHVlIGludG8KK2J5dGUgdW5pdCkuIEZpbmFsbHksIHVzaW5nCisuQlIgbGluayAsCit0aGUgaGFzaCB0YWJsZSBmcm9tIGZpcnN0IGNhbGwgaXMgcmVmZXJlbmNlZCB3aGljaCBob2xkcyB0aGUgZmlsdGVyIGZyb20gc2Vjb25kCitjYWxsLgorLlNIIFNFRSBBTFNPCisuQlIgdGMgKDgpLAorLmJyCisuQlIgY2xzX3UzMi50eHQgIiBhdCAiIGh0dHA6Ly9saW51eC10Yy1ub3Rlcy5zb3VyY2Vmb3JnZS5uZXQvCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9tYW4vbWFuOC90Yy44IGIvaXByb3V0ZTIvbWFuL21hbjgvdGMuOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTk5ZGNhCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbWFuL21hbjgvdGMuOApAQCAtMCwwICsxLDczNCBAQAorLlRIIFRDIDggIjE2IERlY2VtYmVyIDIwMDEiICJpcHJvdXRlMiIgIkxpbnV4IgorLlNIIE5BTUUKK3RjIFwtIHNob3cgLyBtYW5pcHVsYXRlIHRyYWZmaWMgY29udHJvbCBzZXR0aW5ncworLlNIIFNZTk9QU0lTCisuQiB0YworLlJJICJbICIgT1BUSU9OUyAiIF0iCisuQiBxZGlzYyBbIGFkZCB8IGNoYW5nZSB8IHJlcGxhY2UgfCBsaW5rIHwgZGVsZXRlIF0gZGV2CitERVYKKy5CCitbIHBhcmVudAorcWRpc2MtaWQKKy5CIHwgcm9vdCBdCisuQiBbIGhhbmRsZQorcWRpc2MtaWQgXSBxZGlzYworWyBxZGlzYyBzcGVjaWZpYyBwYXJhbWV0ZXJzIF0KKy5QCisKKy5CIHRjCisuUkkgIlsgIiBPUFRJT05TICIgXSIKKy5CIGNsYXNzIFsgYWRkIHwgY2hhbmdlIHwgcmVwbGFjZSB8IGRlbGV0ZSBdIGRldgorREVWCisuQiBwYXJlbnQKK3FkaXNjLWlkCisuQiBbIGNsYXNzaWQKK2NsYXNzLWlkIF0gcWRpc2MKK1sgcWRpc2Mgc3BlY2lmaWMgcGFyYW1ldGVycyBdCisuUAorCisuQiB0YworLlJJICJbICIgT1BUSU9OUyAiIF0iCisuQiBmaWx0ZXIgWyBhZGQgfCBjaGFuZ2UgfCByZXBsYWNlIHwgZGVsZXRlIF0gZGV2CitERVYKKy5CIFsgcGFyZW50CitxZGlzYy1pZAorLkIgfCByb290IF0gcHJvdG9jb2wKK3Byb3RvY29sCisuQiBwcmlvCitwcmlvcml0eSBmaWx0ZXJ0eXBlCitbIGZpbHRlcnR5cGUgc3BlY2lmaWMgcGFyYW1ldGVycyBdCisuQiBmbG93aWQKK2Zsb3ctaWQKKworLkIgdGMKKy5SSSAiWyAiIE9QVElPTlMgIiBdIgorLlJJICJbICIgRk9STUFUICIgXSIKKy5CIHFkaXNjIHNob3cgWyBkZXYKK0RFVgorLkIgXQorLlAKKy5CIHRjCisuUkkgIlsgIiBPUFRJT05TICIgXSIKKy5SSSAiWyAiIEZPUk1BVCAiIF0iCisuQiBjbGFzcyBzaG93IGRldgorREVWCisuUAorLkIgdGMKKy5SSSAiWyAiIE9QVElPTlMgIiBdIgorLkIgZmlsdGVyIHNob3cgZGV2CitERVYKKworLlAKKy50aSA4CisuSVIgT1BUSU9OUyAiIDo9IHsiCitcZkJbIC1mb3JjZSBdIC1iXGZSW1xmSWF0Y2hcZlJdIFxmQlsgZmlsZW5hbWUgXSBcZlJ8CitcZkJbIFxmQi1uXGZSW1xmSWV0bnNcZlJdIG5hbWUgXGZCXSBcZlJ8CitcZkJbIFxmQi1ubSBcZlJ8IFxmQi1uYW1cZlJbXGZJZXNcZlJdIFxmQl0gXGZSfAorXGZCWyBcZlJ7IFxmQi1jZiBcZlJ8IFxmQi1jXGZSW1xmSW9uZlxmUl0gXGZSfSBcZkJbIGZpbGVuYW1lIF0gXGZCXSBcZlJ9CisKKy50aSA4CisuSVIgRk9STUFUICIgOj0geyIKK1xmQlwtc1xmUltcZkl0YXRpc3RpY3NcZlJdIHwKK1xmQlwtZFxmUltcZklldGFpbHNcZlJdIHwKK1xmQlwtclxmUltcZklhd1xmUl0gfAorXGZCXC1wXGZSW1xmSXJldHR5XGZSXSB8CitcZkJcLWlcZlJbXGZJZWNcZlJdIHwKK1xmQlwtZ1xmUltcZklyYXBoXGZSXSB9CisKKy5TSCBERVNDUklQVElPTgorLkIgVGMKK2lzIHVzZWQgdG8gY29uZmlndXJlIFRyYWZmaWMgQ29udHJvbCBpbiB0aGUgTGludXgga2VybmVsLiBUcmFmZmljIENvbnRyb2wgY29uc2lzdHMKK29mIHRoZSBmb2xsb3dpbmc6CisKKy5UUAorU0hBUElORworV2hlbiB0cmFmZmljIGlzIHNoYXBlZCwgaXRzIHJhdGUgb2YgdHJhbnNtaXNzaW9uIGlzIHVuZGVyIGNvbnRyb2wuIFNoYXBpbmcgbWF5CitiZSBtb3JlIHRoYW4gbG93ZXJpbmcgdGhlIGF2YWlsYWJsZSBiYW5kd2lkdGggLSBpdCBpcyBhbHNvIHVzZWQgdG8gc21vb3RoIG91dAorYnVyc3RzIGluIHRyYWZmaWMgZm9yIGJldHRlciBuZXR3b3JrIGJlaGF2aW91ci4gU2hhcGluZyBvY2N1cnMgb24gZWdyZXNzLgorCisuVFAKK1NDSEVEVUxJTkcKK0J5IHNjaGVkdWxpbmcgdGhlIHRyYW5zbWlzc2lvbiBvZiBwYWNrZXRzIGl0IGlzIHBvc3NpYmxlIHRvIGltcHJvdmUgaW50ZXJhY3Rpdml0eQorZm9yIHRyYWZmaWMgdGhhdCBuZWVkcyBpdCB3aGlsZSBzdGlsbCBndWFyYW50ZWVpbmcgYmFuZHdpZHRoIHRvIGJ1bGsgdHJhbnNmZXJzLiBSZW9yZGVyaW5nCitpcyBhbHNvIGNhbGxlZCBwcmlvcml0aXppbmcsIGFuZCBoYXBwZW5zIG9ubHkgb24gZWdyZXNzLgorCisuVFAKK1BPTElDSU5HCitXaGVyZWFzIHNoYXBpbmcgZGVhbHMgd2l0aCB0cmFuc21pc3Npb24gb2YgdHJhZmZpYywgcG9saWNpbmcgcGVydGFpbnMgdG8gdHJhZmZpYworYXJyaXZpbmcuIFBvbGljaW5nIHRodXMgb2NjdXJzIG9uIGluZ3Jlc3MuCisKKy5UUAorRFJPUFBJTkcKK1RyYWZmaWMgZXhjZWVkaW5nIGEgc2V0IGJhbmR3aWR0aCBtYXkgYWxzbyBiZSBkcm9wcGVkIGZvcnRod2l0aCwgYm90aCBvbgoraW5ncmVzcyBhbmQgb24gZWdyZXNzLgorCisuUAorUHJvY2Vzc2luZyBvZiB0cmFmZmljIGlzIGNvbnRyb2xsZWQgYnkgdGhyZWUga2luZHMgb2Ygb2JqZWN0czogcWRpc2NzLAorY2xhc3NlcyBhbmQgZmlsdGVycy4KKworLlNIIFFESVNDUworLkIgcWRpc2MKK2lzIHNob3J0IGZvciAncXVldWVpbmcgZGlzY2lwbGluZScgYW5kIGl0IGlzIGVsZW1lbnRhcnkgdG8KK3VuZGVyc3RhbmRpbmcgdHJhZmZpYyBjb250cm9sLiBXaGVuZXZlciB0aGUga2VybmVsIG5lZWRzIHRvIHNlbmQgYQorcGFja2V0IHRvIGFuIGludGVyZmFjZSwgaXQgaXMKKy5CIGVucXVldWVkCit0byB0aGUgcWRpc2MgY29uZmlndXJlZCBmb3IgdGhhdCBpbnRlcmZhY2UuIEltbWVkaWF0ZWx5IGFmdGVyd2FyZHMsIHRoZSBrZXJuZWwKK3RyaWVzIHRvIGdldCBhcyBtYW55IHBhY2tldHMgYXMgcG9zc2libGUgZnJvbSB0aGUgcWRpc2MsIGZvciBnaXZpbmcgdGhlbQordG8gdGhlIG5ldHdvcmsgYWRhcHRvciBkcml2ZXIuCisKK0Egc2ltcGxlIFFESVNDIGlzIHRoZSAncGZpZm8nIG9uZSwgd2hpY2ggZG9lcyBubyBwcm9jZXNzaW5nIGF0IGFsbCBhbmQgaXMgYSBwdXJlCitGaXJzdCBJbiwgRmlyc3QgT3V0IHF1ZXVlLiBJdCBkb2VzIGhvd2V2ZXIgc3RvcmUgdHJhZmZpYyB3aGVuIHRoZSBuZXR3b3JrIGludGVyZmFjZQorY2FuJ3QgaGFuZGxlIGl0IG1vbWVudGFyaWx5LgorCisuU0ggQ0xBU1NFUworU29tZSBxZGlzY3MgY2FuIGNvbnRhaW4gY2xhc3Nlcywgd2hpY2ggY29udGFpbiBmdXJ0aGVyIHFkaXNjcyAtIHRyYWZmaWMgbWF5Cit0aGVuIGJlIGVucXVldWVkIGluIGFueSBvZiB0aGUgaW5uZXIgcWRpc2NzLCB3aGljaCBhcmUgd2l0aGluIHRoZQorLkIgY2xhc3Nlcy4KK1doZW4gdGhlIGtlcm5lbCB0cmllcyB0byBkZXF1ZXVlIGEgcGFja2V0IGZyb20gc3VjaCBhCisuQiBjbGFzc2Z1bCBxZGlzYworaXQgY2FuIGNvbWUgZnJvbSBhbnkgb2YgdGhlIGNsYXNzZXMuIEEgcWRpc2MgbWF5IGZvciBleGFtcGxlIHByaW9yaXRpemUKK2NlcnRhaW4ga2luZHMgb2YgdHJhZmZpYyBieSB0cnlpbmcgdG8gZGVxdWV1ZSBmcm9tIGNlcnRhaW4gY2xhc3NlcworYmVmb3JlIG90aGVycy4KKworLlNIIEZJTFRFUlMKK0EKKy5CIGZpbHRlcgoraXMgdXNlZCBieSBhIGNsYXNzZnVsIHFkaXNjIHRvIGRldGVybWluZSBpbiB3aGljaCBjbGFzcyBhIHBhY2tldCB3aWxsCitiZSBlbnF1ZXVlZC4gV2hlbmV2ZXIgdHJhZmZpYyBhcnJpdmVzIGF0IGEgY2xhc3Mgd2l0aCBzdWJjbGFzc2VzLCBpdCBuZWVkcwordG8gYmUgY2xhc3NpZmllZC4gVmFyaW91cyBtZXRob2RzIG1heSBiZSBlbXBsb3llZCB0byBkbyBzbywgb25lIG9mIHRoZXNlCithcmUgdGhlIGZpbHRlcnMuIEFsbCBmaWx0ZXJzIGF0dGFjaGVkIHRvIHRoZSBjbGFzcyBhcmUgY2FsbGVkLCB1bnRpbCBvbmUgb2YKK3RoZW0gcmV0dXJucyB3aXRoIGEgdmVyZGljdC4gSWYgbm8gdmVyZGljdCB3YXMgbWFkZSwgb3RoZXIgY3JpdGVyaWEgbWF5IGJlCithdmFpbGFibGUuIFRoaXMgZGlmZmVycyBwZXIgcWRpc2MuCisKK0l0IGlzIGltcG9ydGFudCB0byBub3RpY2UgdGhhdCBmaWx0ZXJzIHJlc2lkZQorLkIgd2l0aGluCitxZGlzY3MgLSB0aGV5IGFyZSBub3QgbWFzdGVycyBvZiB3aGF0IGhhcHBlbnMuCisKK1RoZSBhdmFpbGFibGUgZmlsdGVycyBhcmU6CisuVFAKK2Jhc2ljCitGaWx0ZXIgcGFja2V0cyBiYXNlZCBvbiBhbiBlbWF0Y2ggZXhwcmVzc2lvbi4gU2VlCisuQlIgdGMtZW1hdGNoICg4KQorZm9yIGRldGFpbHMuCisuVFAKK2JwZgorRmlsdGVyIHBhY2tldHMgdXNpbmcgKGUpQlBGLCBzZWUKKy5CUiB0Yy1icGYgKDgpCitmb3IgZGV0YWlscy4KKy5UUAorY2dyb3VwCitGaWx0ZXIgcGFja2V0cyBiYXNlZCBvbiB0aGUgY29udHJvbCBncm91cCBvZiB0aGVpciBwcm9jZXNzLiBTZWUKKy4gQlIgdGMtY2dyb3VwICg4KQorZm9yIGRldGFpbHMuCisuVFAKK2Zsb3csIGZsb3dlcgorRmxvdy1iYXNlZCBjbGFzc2lmaWVycywgZmlsdGVyaW5nIHBhY2tldHMgYmFzZWQgb24gdGhlaXIgZmxvdyAoaWRlbnRpZmllZCBieSBzZWxlY3RhYmxlIGtleXMpLiBTZWUKKy5CUiB0Yy1mbG93ICIoOCkgYW5kIgorLkJSIHRjLWZsb3dlciAoOCkKK2ZvciBkZXRhaWxzLgorLlRQCitmdworRmlsdGVyIGJhc2VkIG9uIGZ3bWFyay4gRGlyZWN0bHkgbWFwcyBmd21hcmsgdmFsdWUgdG8gdHJhZmZpYyBjbGFzcy4gU2VlCisuQlIgdGMtZncgKDgpLgorLlRQCityb3V0ZQorRmlsdGVyIHBhY2tldHMgYmFzZWQgb24gcm91dGluZyB0YWJsZS4gU2VlCisuQlIgdGMtcm91dGUgKDgpCitmb3IgZGV0YWlscy4KKy5UUAorcnN2cAorTWF0Y2ggUmVzb3VyY2UgUmVzZXJ2YXRpb24gUHJvdG9jb2wgKFJTVlApIHBhY2tldHMuCisuVFAKK3RjaW5kZXgKK0ZpbHRlciBwYWNrZXRzIGJhc2VkIG9uIHRyYWZmaWMgY29udHJvbCBpbmRleC4gU2VlCisuQlIgdGMtdGNpbmRleCAoOCkuCisuVFAKK3UzMgorR2VuZXJpYyBmaWx0ZXJpbmcgb24gYXJiaXRyYXJ5IHBhY2tldCBkYXRhLCBhc3Npc3RlZCBieSBzeW50YXggdG8gYWJzdHJhY3QgY29tbW9uIG9wZXJhdGlvbnMuIFNlZQorLkJSIHRjLXUzMiAoOCkKK2ZvciBkZXRhaWxzLgorCisuU0ggQ0xBU1NMRVNTIFFESVNDUworVGhlIGNsYXNzbGVzcyBxZGlzY3MgYXJlOgorLlRQCitjaG9rZQorQ0hPS2UgKENIT29zZSBhbmQgS2VlcCBmb3IgcmVzcG9uc2l2ZSBmbG93cywgQ0hPb3NlIGFuZCBLaWxsIGZvciB1bnJlc3BvbnNpdmUKK2Zsb3dzKSBpcyBhIGNsYXNzbGVzcyBxZGlzYyBkZXNpZ25lZCB0byBib3RoIGlkZW50aWZ5IGFuZCBwZW5hbGl6ZSBmbG93cyB0aGF0Cittb25vcG9saXplIHRoZSBxdWV1ZS4gQ0hPS2UgaXMgYSB2YXJpYXRpb24gb2YgUkVELCBhbmQgdGhlIGNvbmZpZ3VyYXRpb24gaXMKK3NpbWlsYXIgdG8gUkVELgorLlRQCitjb2RlbAorQ29EZWwgKHByb25vdW5jZWQgImNvZGRsZSIpIGlzIGFuIGFkYXB0aXZlICJuby1rbm9icyIgYWN0aXZlIHF1ZXVlIG1hbmFnZW1lbnQKK2FsZ29yaXRobSAoQVFNKSBzY2hlbWUgdGhhdCB3YXMgZGV2ZWxvcGVkIHRvIGFkZHJlc3MgdGhlIHNob3J0Y29taW5ncyBvZgorUkVEIGFuZCBpdHMgdmFyaWFudHMuCisuVFAKK1twfGJdZmlmbworU2ltcGxlc3QgdXNhYmxlIHFkaXNjLCBwdXJlIEZpcnN0IEluLCBGaXJzdCBPdXQgYmVoYXZpb3VyLiBMaW1pdGVkIGluCitwYWNrZXRzIG9yIGluIGJ5dGVzLgorLlRQCitmcQorRmFpciBRdWV1ZSBTY2hlZHVsZXIgcmVhbGlzZXMgVENQIHBhY2luZyBhbmQgc2NhbGVzIHRvIG1pbGxpb25zIG9mIGNvbmN1cnJlbnQKK2Zsb3dzIHBlciBxZGlzYy4KKy5UUAorZnFfY29kZWwKK0ZhaXIgUXVldWluZyBDb250cm9sbGVkIERlbGF5IGlzIHF1ZXVpbmcgZGlzY2lwbGluZSB0aGF0IGNvbWJpbmVzIEZhaXIKK1F1ZXVpbmcgd2l0aCB0aGUgQ29EZWwgQVFNIHNjaGVtZS4gRlFfQ29kZWwgdXNlcyBhIHN0b2NoYXN0aWMgbW9kZWwgdG8gY2xhc3NpZnkKK2luY29taW5nIHBhY2tldHMgaW50byBkaWZmZXJlbnQgZmxvd3MgYW5kIGlzIHVzZWQgdG8gcHJvdmlkZSBhIGZhaXIgc2hhcmUgb2YgdGhlCitiYW5kd2lkdGggdG8gYWxsIHRoZSBmbG93cyB1c2luZyB0aGUgcXVldWUuIEVhY2ggc3VjaCBmbG93IGlzIG1hbmFnZWQgYnkgdGhlCitDb0RlbCBxdWV1aW5nIGRpc2NpcGxpbmUuIFJlb3JkZXJpbmcgd2l0aGluIGEgZmxvdyBpcyBhdm9pZGVkIHNpbmNlIENvZGVsCitpbnRlcm5hbGx5IHVzZXMgYSBGSUZPIHF1ZXVlLgorLlRQCitncmVkCitHZW5lcmFsaXplZCBSYW5kb20gRWFybHkgRGV0ZWN0aW9uIGNvbWJpbmVzIG11bHRpcGxlIFJFRCBxdWV1ZXMgaW4gb3JkZXIgdG8KK2FjaGlldmUgbXVsdGlwbGUgZHJvcCBwcmlvcml0aWVzLiBUaGlzIGlzIHJlcXVpcmVkIHRvIHJlYWxpemUgQXNzdXJlZAorRm9yd2FyZGluZyAoUkZDIDI1OTcpLgorLlRQCitoaGYKK0hlYXZ5LUhpdHRlciBGaWx0ZXIgZGlmZmVyZW50aWF0ZXMgYmV0d2VlbiBzbWFsbCBmbG93cyBhbmQgdGhlIG9wcG9zaXRlLAoraGVhdnktaGl0dGVycy4gVGhlIGdvYWwgaXMgdG8gY2F0Y2ggdGhlIGhlYXZ5LWhpdHRlcnMgYW5kIG1vdmUgdGhlbSB0byBhCitzZXBhcmF0ZSBxdWV1ZSB3aXRoIGxlc3MgcHJpb3JpdHkgc28gdGhhdCBidWxrIHRyYWZmaWMgZG9lcyBub3QgYWZmZWN0IHRoZQorbGF0ZW5jeSBvZiBjcml0aWNhbCB0cmFmZmljLgorLlRQCitpbmdyZXNzCitUaGlzIGlzIGEgc3BlY2lhbCBxZGlzYyBhcyBpdCBhcHBsaWVzIHRvIGluY29taW5nIHRyYWZmaWMgb24gYW4gaW50ZXJmYWNlLCBhbGxvd2luZyBmb3IgaXQgdG8gYmUgZmlsdGVyZWQgYW5kIHBvbGljZWQuCisuVFAKK21xcHJpbworVGhlIE11bHRpcXVldWUgUHJpb3JpdHkgUWRpc2MgaXMgYSBzaW1wbGUgcXVldWluZyBkaXNjaXBsaW5lIHRoYXQgYWxsb3dzCittYXBwaW5nIHRyYWZmaWMgZmxvd3MgdG8gaGFyZHdhcmUgcXVldWUgcmFuZ2VzIHVzaW5nIHByaW9yaXRpZXMgYW5kIGEKK2NvbmZpZ3VyYWJsZSBwcmlvcml0eSB0byB0cmFmZmljIGNsYXNzIG1hcHBpbmcuIEEgdHJhZmZpYyBjbGFzcyBpbiB0aGlzIGNvbnRleHQKK2lzIGEgc2V0IG9mIGNvbnRpZ3VvdXMgcWRpc2MgY2xhc3NlcyB3aGljaCBtYXAgMToxIHRvIGEgc2V0IG9mIGhhcmR3YXJlIGV4cG9zZWQKK3F1ZXVlcy4KKy5UUAorbXVsdGlxCitNdWx0aXF1ZXVlIGlzIGEgcWRpc2Mgb3B0aW1pemVkIGZvciBkZXZpY2VzIHdpdGggbXVsdGlwbGUgVHggcXVldWVzLiBJdCBoYXMKK2JlZW4gYWRkZWQgZm9yIGhhcmR3YXJlIHRoYXQgd2lzaGVzIHRvIGF2b2lkIGhlYWQtb2YtbGluZSBibG9ja2luZy4gIEl0IHdpbGwKK2N5Y2xlIHRob3VnaCB0aGUgYmFuZHMgYW5kIHZlcmlmeSB0aGF0IHRoZSBoYXJkd2FyZSBxdWV1ZSBhc3NvY2lhdGVkIHdpdGggdGhlCitiYW5kIGlzIG5vdCBzdG9wcGVkIHByaW9yIHRvIGRlcXVldWluZyBhIHBhY2tldC4KKy5UUAorbmV0ZW0KK05ldHdvcmsgRW11bGF0b3IgaXMgYW4gZW5oYW5jZW1lbnQgb2YgdGhlIExpbnV4IHRyYWZmaWMgY29udHJvbCBmYWNpbGl0aWVzIHRoYXQKK2FsbG93IHRvIGFkZCBkZWxheSwgcGFja2V0IGxvc3MsIGR1cGxpY2F0aW9uIGFuZCBtb3JlIG90aGVyIGNoYXJhY3RlcmlzdGljcyB0bworcGFja2V0cyBvdXRnb2luZyBmcm9tIGEgc2VsZWN0ZWQgbmV0d29yayBpbnRlcmZhY2UuCisuVFAKK3BmaWZvX2Zhc3QKK1N0YW5kYXJkIHFkaXNjIGZvciAnQWR2YW5jZWQgUm91dGVyJyBlbmFibGVkIGtlcm5lbHMuIENvbnNpc3RzIG9mIGEgdGhyZWUtYmFuZAorcXVldWUgd2hpY2ggaG9ub3JzIFR5cGUgb2YgU2VydmljZSBmbGFncywgYXMgd2VsbCBhcyB0aGUgcHJpb3JpdHkgdGhhdCBtYXkgYmUKK2Fzc2lnbmVkIHRvIGEgcGFja2V0LgorLlRQCitwaWUKK1Byb3BvcnRpb25hbCBJbnRlZ3JhbCBjb250cm9sbGVyLUVuaGFuY2VkIChQSUUpIGlzIGEgY29udHJvbCB0aGVvcmV0aWMgYWN0aXZlCitxdWV1ZSBtYW5hZ2VtZW50IHNjaGVtZS4gSXQgaXMgYmFzZWQgb24gdGhlIHByb3BvcnRpb25hbCBpbnRlZ3JhbCBjb250cm9sbGVyIGJ1dAorYWltcyB0byBjb250cm9sIGRlbGF5LgorLlRQCityZWQKK1JhbmRvbSBFYXJseSBEZXRlY3Rpb24gc2ltdWxhdGVzIHBoeXNpY2FsIGNvbmdlc3Rpb24gYnkgcmFuZG9tbHkgZHJvcHBpbmcKK3BhY2tldHMgd2hlbiBuZWFyaW5nIGNvbmZpZ3VyZWQgYmFuZHdpZHRoIGFsbG9jYXRpb24uIFdlbGwgc3VpdGVkIHRvIHZlcnkKK2xhcmdlIGJhbmR3aWR0aCBhcHBsaWNhdGlvbnMuCisuVFAKK3JyCitSb3VuZC1Sb2JpbiBxZGlzYyB3aXRoIHN1cHBvcnQgZm9yIG11bHRpcXVldWUgbmV0d29yayBkZXZpY2VzLiBSZW1vdmVkIGZyb20KK0xpbnV4IHNpbmNlIGtlcm5lbCB2ZXJzaW9uIDIuNi4yNy4KKy5UUAorc2ZiCitTdG9jaGFzdGljIEZhaXIgQmx1ZSBpcyBhIGNsYXNzbGVzcyBxZGlzYyB0byBtYW5hZ2UgY29uZ2VzdGlvbiBiYXNlZCBvbgorcGFja2V0IGxvc3MgYW5kIGxpbmsgdXRpbGl6YXRpb24gaGlzdG9yeSB3aGlsZSB0cnlpbmcgdG8gcHJldmVudAorbm9uLXJlc3BvbnNpdmUgZmxvd3MgKGkuZS4gZmxvd3MgdGhhdCBkbyBub3QgcmVhY3QgdG8gY29uZ2VzdGlvbiBtYXJraW5nCitvciBkcm9wcGVkIHBhY2tldHMpIGZyb20gaW1wYWN0aW5nIHBlcmZvcm1hbmNlIG9mIHJlc3BvbnNpdmUgZmxvd3MuCitVbmxpa2UgUkVELCB3aGVyZSB0aGUgbWFya2luZyBwcm9iYWJpbGl0eSBoYXMgdG8gYmUgY29uZmlndXJlZCwgQkxVRQordHJpZXMgdG8gZGV0ZXJtaW5lIHRoZSBpZGVhbCBtYXJraW5nIHByb2JhYmlsaXR5IGF1dG9tYXRpY2FsbHkuCisuVFAKK3NmcQorU3RvY2hhc3RpYyBGYWlybmVzcyBRdWV1ZWluZyByZW9yZGVycyBxdWV1ZWQgdHJhZmZpYyBzbyBlYWNoICdzZXNzaW9uJworZ2V0cyB0byBzZW5kIGEgcGFja2V0IGluIHR1cm4uCisuVFAKK3RiZgorVGhlIFRva2VuIEJ1Y2tldCBGaWx0ZXIgaXMgc3VpdGVkIGZvciBzbG93aW5nIHRyYWZmaWMgZG93biB0byBhIHByZWNpc2VseQorY29uZmlndXJlZCByYXRlLiBTY2FsZXMgd2VsbCB0byBsYXJnZSBiYW5kd2lkdGhzLgorLlNIIENPTkZJR1VSSU5HIENMQVNTTEVTUyBRRElTQ1MKK0luIHRoZSBhYnNlbmNlIG9mIGNsYXNzZnVsIHFkaXNjcywgY2xhc3NsZXNzIHFkaXNjcyBjYW4gb25seSBiZSBhdHRhY2hlZCBhdAordGhlIHJvb3Qgb2YgYSBkZXZpY2UuIEZ1bGwgc3ludGF4OgorLlAKKy5CIHRjIHFkaXNjIGFkZCBkZXYKK0RFVgorLkIgcm9vdAorUURJU0MgUURJU0MtUEFSQU1FVEVSUworCitUbyByZW1vdmUsIGlzc3VlCisuUAorLkIgdGMgcWRpc2MgZGVsIGRldgorREVWCisuQiByb290CisKK1RoZQorLkIgcGZpZm9fZmFzdAorcWRpc2MgaXMgdGhlIGF1dG9tYXRpYyBkZWZhdWx0IGluIHRoZSBhYnNlbmNlIG9mIGEgY29uZmlndXJlZCBxZGlzYy4KKworLlNIIENMQVNTRlVMIFFESVNDUworVGhlIGNsYXNzZnVsIHFkaXNjcyBhcmU6CisuVFAKK0FUTQorTWFwIGZsb3dzIHRvIHZpcnR1YWwgY2lyY3VpdHMgb2YgYW4gdW5kZXJseWluZyBhc3luY2hyb25vdXMgdHJhbnNmZXIgbW9kZQorZGV2aWNlLgorLlRQCitDQlEKK0NsYXNzIEJhc2VkIFF1ZXVlaW5nIGltcGxlbWVudHMgYSByaWNoIGxpbmtzaGFyaW5nIGhpZXJhcmNoeSBvZiBjbGFzc2VzLgorSXQgY29udGFpbnMgc2hhcGluZyBlbGVtZW50cyBhcyB3ZWxsIGFzIHByaW9yaXRpemluZyBjYXBhYmlsaXRpZXMuIFNoYXBpbmcgaXMKK3BlcmZvcm1lZCB1c2luZyBsaW5rIGlkbGUgdGltZSBjYWxjdWxhdGlvbnMgYmFzZWQgb24gYXZlcmFnZSBwYWNrZXQgc2l6ZSBhbmQKK3VuZGVybHlpbmcgbGluayBiYW5kd2lkdGguIFRoZSBsYXR0ZXIgbWF5IGJlIGlsbC1kZWZpbmVkIGZvciBzb21lIGludGVyZmFjZXMuCisuVFAKK0RSUgorVGhlIERlZmljaXQgUm91bmQgUm9iaW4gU2NoZWR1bGVyIGlzIGEgbW9yZSBmbGV4aWJsZSByZXBsYWNlbWVudCBmb3IgU3RvY2hhc3RpYworRmFpcm5lc3MgUXVldWluZy4gVW5saWtlIFNGUSwgdGhlcmUgYXJlIG5vIGJ1aWx0LWluIHF1ZXVlcyBcLVwtIHlvdSBuZWVkIHRvIGFkZAorY2xhc3NlcyBhbmQgdGhlbiBzZXQgdXAgZmlsdGVycyB0byBjbGFzc2lmeSBwYWNrZXRzIGFjY29yZGluZ2x5LiAgVGhpcyBjYW4gYmUKK3VzZWZ1bCBlLmcuIGZvciB1c2luZyBSRUQgcWRpc2NzIHdpdGggZGlmZmVyZW50IHNldHRpbmdzIGZvciBwYXJ0aWN1bGFyCit0cmFmZmljLiBUaGVyZSBpcyBubyBkZWZhdWx0IGNsYXNzIFwtXC0gaWYgYSBwYWNrZXQgY2Fubm90IGJlIGNsYXNzaWZpZWQsIGl0IGlzCitkcm9wcGVkLgorLlRQCitEU01BUksKK0NsYXNzaWZ5IHBhY2tldHMgYmFzZWQgb24gVE9TIGZpZWxkLCBjaGFuZ2UgVE9TIGZpZWxkIG9mIHBhY2tldHMgYmFzZWQgb24KK2NsYXNzaWZpY2F0aW9uLgorLlRQCitIRlNDCitIaWVyYXJjaGljYWwgRmFpciBTZXJ2aWNlIEN1cnZlIGd1YXJhbnRlZXMgcHJlY2lzZSBiYW5kd2lkdGggYW5kIGRlbGF5IGFsbG9jYXRpb24gZm9yIGxlYWYgY2xhc3NlcyBhbmQgYWxsb2NhdGVzIGV4Y2VzcyBiYW5kd2lkdGggZmFpcmx5LiBVbmxpa2UgSFRCLCBpdCBtYWtlcyB1c2Ugb2YgcGFja2V0IGRyb3BwaW5nIHRvIGFjaGlldmUgbG93IGRlbGF5cyB3aGljaCBpbnRlcmFjdGl2ZSBzZXNzaW9ucyBiZW5lZml0IGZyb20uCisuVFAKK0hUQgorVGhlIEhpZXJhcmNoeSBUb2tlbiBCdWNrZXQgaW1wbGVtZW50cyBhIHJpY2ggbGlua3NoYXJpbmcgaGllcmFyY2h5IG9mCitjbGFzc2VzIHdpdGggYW4gZW1waGFzaXMgb24gY29uZm9ybWluZyB0byBleGlzdGluZyBwcmFjdGljZXMuIEhUQiBmYWNpbGl0YXRlcworZ3VhcmFudGVlaW5nIGJhbmR3aWR0aCB0byBjbGFzc2VzLCB3aGlsZSBhbHNvIGFsbG93aW5nIHNwZWNpZmljYXRpb24gb2YgdXBwZXIKK2xpbWl0cyB0byBpbnRlci1jbGFzcyBzaGFyaW5nLiBJdCBjb250YWlucyBzaGFwaW5nIGVsZW1lbnRzLCBiYXNlZCBvbiBUQkYgYW5kCitjYW4gcHJpb3JpdGl6ZSBjbGFzc2VzLgorLlRQCitQUklPCitUaGUgUFJJTyBxZGlzYyBpcyBhIG5vbi1zaGFwaW5nIGNvbnRhaW5lciBmb3IgYSBjb25maWd1cmFibGUgbnVtYmVyIG9mCitjbGFzc2VzIHdoaWNoIGFyZSBkZXF1ZXVlZCBpbiBvcmRlci4gVGhpcyBhbGxvd3MgZm9yIGVhc3kgcHJpb3JpdGl6YXRpb24KK29mIHRyYWZmaWMsIHdoZXJlIGxvd2VyIGNsYXNzZXMgYXJlIG9ubHkgYWJsZSB0byBzZW5kIGlmIGhpZ2hlciBvbmVzIGhhdmUKK25vIHBhY2tldHMgYXZhaWxhYmxlLiBUbyBmYWNpbGl0YXRlIGNvbmZpZ3VyYXRpb24sIFR5cGUgT2YgU2VydmljZSBiaXRzIGFyZQoraG9ub3JlZCBieSBkZWZhdWx0LgorLlRQCitRRlEKK1F1aWNrIEZhaXIgUXVldWVpbmcgaXMgYW4gTygxKSBzY2hlZHVsZXIgdGhhdCBwcm92aWRlcyBuZWFyLW9wdGltYWwgZ3VhcmFudGVlcywKK2FuZCBpcyB0aGUgZmlyc3QgdG8gYWNoaWV2ZSB0aGF0IGdvYWwgd2l0aCBhIGNvbnN0YW50IGNvc3QgYWxzbyB3aXRoIHJlc3BlY3QgdG8KK3RoZSBudW1iZXIgb2YgZ3JvdXBzIGFuZCB0aGUgcGFja2V0IGxlbmd0aC4gVGhlIFFGUSBhbGdvcml0aG0gaGFzIG5vIGxvb3BzLCBhbmQKK3VzZXMgdmVyeSBzaW1wbGUgaW5zdHJ1Y3Rpb25zIGFuZCBkYXRhIHN0cnVjdHVyZXMgdGhhdCBsZW5kIHRoZW1zZWx2ZXMgdmVyeQord2VsbCB0byBhIGhhcmR3YXJlIGltcGxlbWVudGF0aW9uLgorLlNIIFRIRU9SWSBPRiBPUEVSQVRJT04KK0NsYXNzZXMgZm9ybSBhIHRyZWUsIHdoZXJlIGVhY2ggY2xhc3MgaGFzIGEgc2luZ2xlIHBhcmVudC4KK0EgY2xhc3MgbWF5IGhhdmUgbXVsdGlwbGUgY2hpbGRyZW4uIFNvbWUgcWRpc2NzIGFsbG93IGZvciBydW50aW1lIGFkZGl0aW9uCitvZiBjbGFzc2VzIChDQlEsIEhUQikgd2hpbGUgb3RoZXJzIChQUklPKSBhcmUgY3JlYXRlZCB3aXRoIGEgc3RhdGljIG51bWJlciBvZgorY2hpbGRyZW4uCisKK1FkaXNjcyB3aGljaCBhbGxvdyBkeW5hbWljIGFkZGl0aW9uIG9mIGNsYXNzZXMgY2FuIGhhdmUgemVybyBvciBtb3JlCitzdWJjbGFzc2VzIHRvIHdoaWNoIHRyYWZmaWMgbWF5IGJlIGVucXVldWVkLgorCitGdXJ0aGVybW9yZSwgZWFjaCBjbGFzcyBjb250YWlucyBhCisuQiBsZWFmIHFkaXNjCit3aGljaCBieSBkZWZhdWx0IGhhcworLkIgcGZpZm8KK2JlaGF2aW91ciwgYWx0aG91Z2ggYW5vdGhlciBxZGlzYyBjYW4gYmUgYXR0YWNoZWQgaW4gcGxhY2UuIFRoaXMgcWRpc2MgbWF5IGFnYWluCitjb250YWluIGNsYXNzZXMsIGJ1dCBlYWNoIGNsYXNzIGNhbiBoYXZlIG9ubHkgb25lIGxlYWYgcWRpc2MuCisKK1doZW4gYSBwYWNrZXQgZW50ZXJzIGEgY2xhc3NmdWwgcWRpc2MgaXQgY2FuIGJlCisuQiBjbGFzc2lmaWVkCit0byBvbmUgb2YgdGhlIGNsYXNzZXMgd2l0aGluLiBUaHJlZSBjcml0ZXJpYSBhcmUgYXZhaWxhYmxlLCBhbHRob3VnaCBub3QgYWxsCitxZGlzY3Mgd2lsbCB1c2UgYWxsIHRocmVlOgorLlRQCit0YyBmaWx0ZXJzCitJZiB0YyBmaWx0ZXJzIGFyZSBhdHRhY2hlZCB0byBhIGNsYXNzLCB0aGV5IGFyZSBjb25zdWx0ZWQgZmlyc3QKK2ZvciByZWxldmFudCBpbnN0cnVjdGlvbnMuIEZpbHRlcnMgY2FuIG1hdGNoIG9uIGFsbCBmaWVsZHMgb2YgYSBwYWNrZXQgaGVhZGVyLAorYXMgd2VsbCBhcyBvbiB0aGUgZmlyZXdhbGwgbWFyayBhcHBsaWVkIGJ5IGlwY2hhaW5zIG9yIGlwdGFibGVzLgorLlRQCitUeXBlIG9mIFNlcnZpY2UKK1NvbWUgcWRpc2NzIGhhdmUgYnVpbHQgaW4gcnVsZXMgZm9yIGNsYXNzaWZ5aW5nIHBhY2tldHMgYmFzZWQgb24gdGhlIFRPUyBmaWVsZC4KKy5UUAorc2tiLT5wcmlvcml0eQorVXNlcnNwYWNlIHByb2dyYW1zIGNhbiBlbmNvZGUgYSBjbGFzcy1pZCBpbiB0aGUgJ3NrYi0+cHJpb3JpdHknIGZpZWxkIHVzaW5nCit0aGUgU09fUFJJT1JJVFkgb3B0aW9uLgorLlAKK0VhY2ggbm9kZSB3aXRoaW4gdGhlIHRyZWUgY2FuIGhhdmUgaXRzIG93biBmaWx0ZXJzIGJ1dCBoaWdoZXIgbGV2ZWwgZmlsdGVycworbWF5IGFsc28gcG9pbnQgZGlyZWN0bHkgdG8gbG93ZXIgY2xhc3Nlcy4KKworSWYgY2xhc3NpZmljYXRpb24gZGlkIG5vdCBzdWNjZWVkLCBwYWNrZXRzIGFyZSBlbnF1ZXVlZCB0byB0aGUgbGVhZiBxZGlzYworYXR0YWNoZWQgdG8gdGhhdCBjbGFzcy4gQ2hlY2sgcWRpc2Mgc3BlY2lmaWMgbWFucGFnZXMgZm9yIGRldGFpbHMsIGhvd2V2ZXIuCisKKy5TSCBOQU1JTkcKK0FsbCBxZGlzY3MsIGNsYXNzZXMgYW5kIGZpbHRlcnMgaGF2ZSBJRHMsIHdoaWNoIGNhbiBlaXRoZXIgYmUgc3BlY2lmaWVkCitvciBiZSBhdXRvbWF0aWNhbGx5IGFzc2lnbmVkLgorCitJRHMgY29uc2lzdCBvZiBhCisuQlIgbWFqb3IgIiBudW1iZXIgYW5kIGEgIiBtaW5vcgorbnVtYmVyLCBzZXBhcmF0ZWQgYnkgYSBjb2xvbiAtCisuQlIgbWFqb3IgIjoiIG1pbm9yICIuIgorQm90aAorLkJSIG1ham9yICIgYW5kICIgbWlub3IKK2FyZSBoZXhhZGVjaW1hbCBudW1iZXJzIGFuZCBhcmUgbGltaXRlZCB0byAxNiBiaXRzLiBUaGVyZSBhcmUgdHdvIHNwZWNpYWwKK3ZhbHVlczogcm9vdCBpcyBzaWduaWZpZWQgYnkKKy5CUiBtYWpvciAiIGFuZCAiIG1pbm9yCitvZiBhbGwgb25lcywgYW5kIHVuc3BlY2lmaWVkIGlzIGFsbCB6ZXJvcy4KKworLlRQCitRRElTQ1MKK0EgcWRpc2MsIHdoaWNoIHBvdGVudGlhbGx5IGNhbiBoYXZlIGNoaWxkcmVuLCBnZXRzIGFzc2lnbmVkIGEKKy5CIG1ham9yCitudW1iZXIsIGNhbGxlZCBhICdoYW5kbGUnLCBsZWF2aW5nIHRoZQorLkIgbWlub3IKK251bWJlciBuYW1lc3BhY2UgYXZhaWxhYmxlIGZvciBjbGFzc2VzLiBUaGUgaGFuZGxlIGlzIGV4cHJlc3NlZCBhcyAnMTA6Jy4KK0l0IGlzIGN1c3RvbWFyeSB0byBleHBsaWNpdGx5IGFzc2lnbiBhIGhhbmRsZSB0byBxZGlzY3MgZXhwZWN0ZWQgdG8gaGF2ZSBjaGlsZHJlbi4KKworLlRQCitDTEFTU0VTCitDbGFzc2VzIHJlc2lkaW5nIHVuZGVyIGEgcWRpc2Mgc2hhcmUgdGhlaXIgcWRpc2MKKy5CIG1ham9yCitudW1iZXIsIGJ1dCBlYWNoIGhhdmUgYSBzZXBhcmF0ZQorLkIgbWlub3IKK251bWJlciBjYWxsZWQgYSAnY2xhc3NpZCcgdGhhdCBoYXMgbm8gcmVsYXRpb24gdG8gdGhlaXIKK3BhcmVudCBjbGFzc2VzLCBvbmx5IHRvIHRoZWlyIHBhcmVudCBxZGlzYy4gVGhlIHNhbWUgbmFtaW5nIGN1c3RvbSBhcyBmb3IKK3FkaXNjcyBhcHBsaWVzLgorCisuVFAKK0ZJTFRFUlMKK0ZpbHRlcnMgaGF2ZSBhIHRocmVlIHBhcnQgSUQsIHdoaWNoIGlzIG9ubHkgbmVlZGVkIHdoZW4gdXNpbmcgYSBoYXNoZWQKK2ZpbHRlciBoaWVyYXJjaHkuCisKKy5TSCBQQVJBTUVURVJTCitUaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIHdpZGVseSB1c2VkIGluIFRDLiBGb3Igb3RoZXIgcGFyYW1ldGVycywKK3NlZSB0aGUgbWFuIHBhZ2VzIGZvciBpbmRpdmlkdWFsIHFkaXNjcy4KKworLlRQCitSQVRFUworQmFuZHdpZHRocyBvciByYXRlcy4KK1RoZXNlIHBhcmFtZXRlcnMgYWNjZXB0IGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCBwb3NzaWJseSBmb2xsb3dlZCBieQorYSB1bml0IChib3RoIFNJIGFuZCBJRUMgdW5pdHMgc3VwcG9ydGVkKS4KKy5SUworLlRQCitiaXQgb3IgYSBiYXJlIG51bWJlcgorQml0cyBwZXIgc2Vjb25kCisuVFAKK2tiaXQKK0tpbG9iaXRzIHBlciBzZWNvbmQKKy5UUAorbWJpdAorTWVnYWJpdHMgcGVyIHNlY29uZAorLlRQCitnYml0CitHaWdhYml0cyBwZXIgc2Vjb25kCisuVFAKK3RiaXQKK1RlcmFiaXRzIHBlciBzZWNvbmQKKy5UUAorYnBzCitCeXRlcyBwZXIgc2Vjb25kCisuVFAKK2ticHMKK0tpbG9ieXRlcyBwZXIgc2Vjb25kCisuVFAKK21icHMKK01lZ2FieXRlcyBwZXIgc2Vjb25kCisuVFAKK2dicHMKK0dpZ2FieXRlcyBwZXIgc2Vjb25kCisuVFAKK3RicHMKK1RlcmFieXRlcyBwZXIgc2Vjb25kCisKKy5QCitUbyBzcGVjaWZ5IGluIElFQyB1bml0cywgcmVwbGFjZSB0aGUgU0kgcHJlZml4IChrLSwgbS0sIGctLCB0LSkgd2l0aAorSUVDIHByZWZpeCAoa2ktLCBtaS0sIGdpLSBhbmQgdGktKSByZXNwZWN0aXZlbHkuCisKKy5QCitUQyBzdG9yZSByYXRlcyBhcyBhIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGluIGJwcyBpbnRlcm5hbGx5LAorc28gd2UgY2FuIHNwZWNpZnkgYSBtYXggcmF0ZSBvZiA0Mjk0OTY3Mjk1IGJwcy4KKy5SRQorCisuVFAKK1RJTUVTCitMZW5ndGggb2YgdGltZS4gQ2FuIGJlIHNwZWNpZmllZCBhcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlcgorZm9sbG93ZWQgYnkgYW4gb3B0aW9uYWwgdW5pdDoKKy5SUworLlRQCitzLCBzZWMgb3Igc2VjcworV2hvbGUgc2Vjb25kcworLlRQCittcywgbXNlYyBvciBtc2VjcworTWlsbGlzZWNvbmRzCisuVFAKK3VzLCB1c2VjLCB1c2VjcyBvciBhIGJhcmUgbnVtYmVyCitNaWNyb3NlY29uZHMuCisKKy5QCitUQyBkZWZpbmVkIGl0cyBvd24gdGltZSB1bml0IChlcXVhbCB0byBtaWNyb3NlY29uZCkgYW5kIHN0b3JlcwordGltZSB2YWx1ZXMgYXMgMzItYml0IHVuc2lnbmVkIGludGVnZXIsIHRodXMgd2UgY2FuIHNwZWNpZnkgYSBtYXggdGltZSB2YWx1ZQorb2YgNDI5NDk2NzI5NSB1c2Vjcy4KKy5SRQorCisuVFAKK1NJWkVTCitBbW91bnRzIG9mIGRhdGEuIENhbiBiZSBzcGVjaWZpZWQgYXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIKK2ZvbGxvd2VkIGJ5IGFuIG9wdGlvbmFsIHVuaXQ6CisuUlMKKy5UUAorYiBvciBhIGJhcmUgbnVtYmVyCitCeXRlcy4KKy5UUAora2JpdAorS2lsb2JpdHMKKy5UUAora2Igb3IgaworS2lsb2J5dGVzCisuVFAKK21iaXQKK01lZ2FiaXRzCisuVFAKK21iIG9yIG0KK01lZ2FieXRlcworLlRQCitnYml0CitHaWdhYml0cworLlRQCitnYiBvciBnCitHaWdhYnl0ZXMKKworLlAKK1RDIHN0b3JlcyBzaXplcyBpbnRlcm5hbGx5IGFzIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGluIGJ5dGUsCitzbyB3ZSBjYW4gc3BlY2lmeSBhIG1heCBzaXplIG9mIDQyOTQ5NjcyOTUgYnl0ZXMuCisuUkUKKworLlRQCitWQUxVRVMKK090aGVyIHZhbHVlcyB3aXRob3V0IGEgdW5pdC4KK1RoZXNlIHBhcmFtZXRlcnMgYXJlIGludGVycHJldGVkIGFzIGRlY2ltYWwgYnkgZGVmYXVsdCwgYnV0IHlvdSBjYW4KK2luZGljYXRlIFRDIHRvIGludGVycHJldCB0aGVtIGFzIG9jdGFsIGFuZCBoZXhhZGVjaW1hbCBieSBhZGRpbmcgYSAnMCcKK29yICcweCcgcHJlZml4IHJlc3BlY3RpdmVseS4KKworLlNIIFRDIENPTU1BTkRTCitUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFyZSBhdmFpbGFibGUgZm9yIHFkaXNjcywgY2xhc3NlcyBhbmQgZmlsdGVyOgorLlRQCithZGQKK0FkZCBhIHFkaXNjLCBjbGFzcyBvciBmaWx0ZXIgdG8gYSBub2RlLiBGb3IgYWxsIGVudGl0aWVzLCBhCisuQiBwYXJlbnQKK211c3QgYmUgcGFzc2VkLCBlaXRoZXIgYnkgcGFzc2luZyBpdHMgSUQgb3IgYnkgYXR0YWNoaW5nIGRpcmVjdGx5IHRvIHRoZSByb290IG9mIGEgZGV2aWNlLgorV2hlbiBjcmVhdGluZyBhIHFkaXNjIG9yIGEgZmlsdGVyLCBpdCBjYW4gYmUgbmFtZWQgd2l0aCB0aGUKKy5CIGhhbmRsZQorcGFyYW1ldGVyLiBBIGNsYXNzIGlzIG5hbWVkIHdpdGggdGhlCisuQiBjbGFzc2lkCitwYXJhbWV0ZXIuCisKKy5UUAorZGVsZXRlCitBIHFkaXNjIGNhbiBiZSBkZWxldGVkIGJ5IHNwZWNpZnlpbmcgaXRzIGhhbmRsZSwgd2hpY2ggbWF5IGFsc28gYmUgJ3Jvb3QnLiBBbGwgc3ViY2xhc3NlcyBhbmQgdGhlaXIgbGVhZiBxZGlzY3MKK2FyZSBhdXRvbWF0aWNhbGx5IGRlbGV0ZWQsIGFzIHdlbGwgYXMgYW55IGZpbHRlcnMgYXR0YWNoZWQgdG8gdGhlbS4KKworLlRQCitjaGFuZ2UKK1NvbWUgZW50aXRpZXMgY2FuIGJlIG1vZGlmaWVkICdpbiBwbGFjZScuIFNoYXJlcyB0aGUgc3ludGF4IG9mICdhZGQnLCB3aXRoIHRoZSBleGNlcHRpb24KK3RoYXQgdGhlIGhhbmRsZSBjYW5ub3QgYmUgY2hhbmdlZCBhbmQgbmVpdGhlciBjYW4gdGhlIHBhcmVudC4gSW4gb3RoZXIgd29yZHMsCisuQgorY2hhbmdlCitjYW5ub3QgbW92ZSBhIG5vZGUuCisKKy5UUAorcmVwbGFjZQorUGVyZm9ybXMgYSBuZWFybHkgYXRvbWljIHJlbW92ZS9hZGQgb24gYW4gZXhpc3Rpbmcgbm9kZSBpZC4gSWYgdGhlIG5vZGUgZG9lcyBub3QgZXhpc3QgeWV0CitpdCBpcyBjcmVhdGVkLgorCisuVFAKK2xpbmsKK09ubHkgYXZhaWxhYmxlIGZvciBxZGlzY3MgYW5kIHBlcmZvcm1zIGEgcmVwbGFjZSB3aGVyZSB0aGUgbm9kZQorbXVzdCBleGlzdCBhbHJlYWR5LgorCisuU0ggT1BUSU9OUworCisuVFAKKy5CUiAiXC1iIiwgIiBcLWIgZmlsZW5hbWUiLCAiIFwtYmF0Y2giLCAiIFwtYmF0Y2ggZmlsZW5hbWUiCityZWFkIGNvbW1hbmRzIGZyb20gcHJvdmlkZWQgZmlsZSBvciBzdGFuZGFyZCBpbnB1dCBhbmQgaW52b2tlIHRoZW0uCitGaXJzdCBmYWlsdXJlIHdpbGwgY2F1c2UgdGVybWluYXRpb24gb2YgdGMuCisKKy5UUAorLkJSICJcLWZvcmNlIgorZG9uJ3QgdGVybWluYXRlIHRjIG9uIGVycm9ycyBpbiBiYXRjaCBtb2RlLgorSWYgdGhlcmUgd2VyZSBhbnkgZXJyb3JzIGR1cmluZyBleGVjdXRpb24gb2YgdGhlIGNvbW1hbmRzLCB0aGUgYXBwbGljYXRpb24gcmV0dXJuIGNvZGUgd2lsbCBiZSBub24gemVyby4KKworLlRQCisuQlIgIlwtbiIgLCAiIFwtbmV0IiAsICIgXC1uZXRucyAiIDxORVROUz4KK3N3aXRjaGVzCisuQiB0YwordG8gdGhlIHNwZWNpZmllZCBuZXR3b3JrIG5hbWVzcGFjZQorLklSIE5FVE5TIC4KK0FjdHVhbGx5IGl0IGp1c3Qgc2ltcGxpZmllcyBleGVjdXRpbmcgb2Y6CisKKy5CIGlwIG5ldG5zIGV4ZWMKKy5JUiBORVROUworLkIgdGMKKy5SSSAiWyAiIE9QVElPTlMgIiBdICIgT0JKRUNUICIgeyAiIENPTU1BTkQgIiB8ICIKKy5CUiBoZWxwICIgfSIKKwordG8KKworLkIgdGMKKy5SSSAiLW5bZXRuc10gIiBORVROUyAiIFsgIiBPUFRJT05TICIgXSAiIE9CSkVDVCAiIHsgIiBDT01NQU5EICIgfCAiCisuQlIgaGVscCAiIH0iCisKKy5UUAorLkJSICJcLWNmIiAsICIgXC1jb25mICIgPEZJTEVOQU1FPgorc3BlY2lmaWVzIHBhdGggdG8gdGhlIGNvbmZpZyBmaWxlLiBUaGlzIG9wdGlvbiBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggb3RoZXIgb3B0aW9ucyAoZS5nLgorLkJSIC1ubSAiKS4iCisKKy5TSCBGT1JNQVQKK1RoZSBzaG93IGNvbW1hbmQgaGFzIGFkZGl0aW9uYWwgZm9ybWF0dGluZyBvcHRpb25zOgorCisuVFAKKy5CUiAiXC1zIiAsICIgXC1zdGF0cyIsICIgXC1zdGF0aXN0aWNzIgorb3V0cHV0IG1vcmUgc3RhdGlzdGljcyBhYm91dCBwYWNrZXQgdXNhZ2UuCisKKy5UUAorLkJSICJcLWQiLCAiIFwtZGV0YWlscyIKK291dHB1dCBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHJhdGVzIGFuZCBjZWxsIHNpemVzLgorCisuVFAKKy5CUiAiXC1yIiwgIiBcLXJhdyIKK291dHB1dCByYXcgaGV4IHZhbHVlcyBmb3IgaGFuZGxlcy4KKworLlRQCisuQlIgIlwtcCIsICIgXC1wcmV0dHkiCitkZWNvZGUgZmlsdGVyIG9mZnNldCBhbmQgbWFzayB2YWx1ZXMgdG8gZXF1aXZhbGVudCBmaWx0ZXIgY29tbWFuZHMgYmFzZWQgb24gVENQL0lQLgorCisuVFAKKy5CUiAiXC1pZWMiCitwcmludCByYXRlcyBpbiBJRUMgdW5pdHMgKGllLiAxSyA9IDEwMjQpLgorCisuVFAKKy5CUiAiXC1nIiwgIiBcLWdyYXBoIgorc2hvd3MgY2xhc3NlcyBhcyBBU0NJSSBncmFwaC4gUHJpbnRzIGdlbmVyaWMgc3RhdHMgaW5mbyB1bmRlciBlYWNoIGNsYXNzIGlmCisuQlIgIi1zIgorb3B0aW9uIHdhcyBzcGVjaWZpZWQuIENsYXNzZXMgY2FuIGJlIGZpbHRlcmVkIG9ubHkgYnkKKy5CUiAiZGV2Igorb3B0aW9uLgorCisuVFAKKy5CUiAiXC1ubSIgLCAiIFwtbmFtZSIKK3Jlc29sdmUgY2xhc3MgbmFtZSBmcm9tCisuQiAvZXRjL2lwcm91dGUyL3RjX2NscworZmlsZSBvciBmcm9tIGZpbGUgc3BlY2lmaWVkIGJ5CisuQiAtY2YKK29wdGlvbi4gVGhpcyBmaWxlIGlzIGp1c3QgYSBtYXBwaW5nIG9mCisuQiBjbGFzc2lkCit0byBjbGFzcyBuYW1lOgorCisuUlMgMTAKKyMgSGVyZSBpcyBjb21tZW50CisuUkUKKy5SUyAxMAorMTo0MCAgIHZvaXAgIyBIZXJlIGlzIGFub3RoZXIgY29tbWVudAorLlJFCisuUlMgMTAKKzE6NTAgICB3ZWIKKy5SRQorLlJTIDEwCisxOjYwICAgZnRwCisuUkUKKy5SUyAxMAorMToyICAgIGhvbWUKKy5SRQorCisuUlMKKy5CIHRjCit3aWxsIG5vdCBmYWlsIGlmCisuQiAtbm0KK3dhcyBzcGVjaWZpZWQgd2l0aG91dAorLkIgLWNmCitvcHRpb24gYnV0CisuQiAvZXRjL2lwcm91dGUyL3RjX2NscworZmlsZSBkb2VzIG5vdCBleGlzdCwgd2hpY2ggbWFrZXMgaXQgcG9zc2libGUgdG8gcGFzcworLkIgLW5tCitvcHRpb24gZm9yIGNyZWF0aW5nCisuQiB0YworYWxpYXMuCisuUkUKKworLlNIICJFWEFNUExFUyIKKy5QUAordGMgLWcgY2xhc3Mgc2hvdyBkZXYgZXRoMAorLlJTIDQKK1Nob3dzIGNsYXNzZXMgYXMgQVNDSUkgZ3JhcGggb24gZXRoMCBpbnRlcmZhY2UuCisuUkUKKy5QUAordGMgLWcgLXMgY2xhc3Mgc2hvdyBkZXYgZXRoMAorLlJTIDQKK1Nob3dzIGNsYXNzZXMgYXMgQVNDSUkgZ3JhcGggd2l0aCBzdGF0cyBpbmZvIHVuZGVyIGVhY2ggY2xhc3MuCisKKy5TSCBISVNUT1JZCisuQiB0Yword2FzIHdyaXR0ZW4gYnkgQWxleGV5IE4uIEt1em5ldHNvdiBhbmQgYWRkZWQgaW4gTGludXggMi4yLgorLlNIIFNFRSBBTFNPCisuQlIgdGMtYmFzaWMgKDgpLAorLkJSIHRjLWJmaWZvICg4KSwKKy5CUiB0Yy1icGYgKDgpLAorLkJSIHRjLWNicSAoOCksCisuQlIgdGMtY2dyb3VwICg4KSwKKy5CUiB0Yy1jaG9rZSAoOCksCisuQlIgdGMtY29kZWwgKDgpLAorLkJSIHRjLWRyciAoOCksCisuQlIgdGMtZW1hdGNoICg4KSwKKy5CUiB0Yy1mbG93ICg4KSwKKy5CUiB0Yy1mbG93ZXIgKDgpLAorLkJSIHRjLWZxICg4KSwKKy5CUiB0Yy1mcV9jb2RlbCAoOCksCisuQlIgdGMtZncgKDgpLAorLkJSIHRjLWhmc2MgKDcpLAorLkJSIHRjLWhmc2MgKDgpLAorLkJSIHRjLWh0YiAoOCksCisuQlIgdGMtbXFwcmlvICg4KSwKKy5CUiB0Yy1wZmlmbyAoOCksCisuQlIgdGMtcGZpZm9fZmFzdCAoOCksCisuQlIgdGMtcmVkICg4KSwKKy5CUiB0Yy1yb3V0ZSAoOCksCisuQlIgdGMtc2ZiICg4KSwKKy5CUiB0Yy1zZnEgKDgpLAorLkJSIHRjLXN0YWIgKDgpLAorLkJSIHRjLXRiZiAoOCksCisuQlIgdGMtdGNpbmRleCAoOCksCisuQlIgdGMtdTMyICg4KSwKKy5icgorLlJCICJVc2VyIGRvY3VtZW50YXRpb24gYXQgIiBodHRwOi8vbGFydGMub3JnLyAiLCBidXQgcGxlYXNlIGRpcmVjdCBidWdyZXBvcnRzIGFuZCBwYXRjaGVzIHRvOiAiIDxuZXRkZXZAdmdlci5rZXJuZWwub3JnPgorCisuU0ggQVVUSE9SCitNYW5wYWdlIG1haW50YWluZWQgYnkgYmVydCBodWJlcnQgKGFodUBkczlhLm5sKQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWFuL21hbjgvdGlwYy1iZWFyZXIuOCBiL2lwcm91dGUyL21hbi9tYW44L3RpcGMtYmVhcmVyLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY1ZWUwMQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L3RpcGMtYmVhcmVyLjgKQEAgLTAsMCArMSwyMzEgQEAKKy5USCBUSVBDLUJFQVJFUiA4ICIwMiBKdW4gMjAxNSIgImlwcm91dGUyIiAiTGludXgiCisKKy5cIiBGb3IgY29uc2lzdGVuY3ksIHBsZWFzZSBrZWVwIHBhZGRpbmcgcmlnaHQgYWxpZ25lZC4KKy5cIiBGb3IgZXhhbXBsZSAnLkIgImZvbyAiIGJhcicgYW5kIG5vdCAnLkIgZm9vICIgYmFyIicKKworLlNIIE5BTUUKK3RpcGMtYmVhcmVyIFwtIHNob3cgb3IgbW9kaWZ5IFRJUEMgYmVhcmVycworCisuU0ggU1lOT1BTSVMKKy5hZCBsCisuaW4gKzgKKworLnRpIC04CisuQiB0aXBjIGJlYXJlciBlbmFibGUKKy5SQiAiWyAiIGRvbWFpbgorLklSIERPTUFJTiAiIF0iCisuUkIgIlsgIiBwcmlvcml0eQorLklSIFBSSU9SSVRZICIgXSIKKy5CUiBtZWRpYQorLmJyCisuUkIgInsgeyAiIGV0aCAiIHwgIiBpYiAiIH0gIiBkZXZpY2UKKy5JUiAiREVWSUNFIiAiIH0iCisuUkIgInwiCisuYnIKKy5SQgkieyAiIHVkcAorLkIgbmFtZQorLklSIE5BTUUKKy5CIGxvY2FsaXAKKy5JUiBMT0NBTElQCisuUkIgIlsgIiBsb2NhbHBvcnQKKy5JUiBMT0NBTFBPUlQgIiBdIgorLlJCICJbICIgcmVtb3RlaXAKKy5JUiBSRU1PVEVJUCAiIF0iCisuUkIgIlsgIiByZW1vdGVwb3J0CisuSVIgUkVNT1RFUE9SVCAiIF0gfSIKKy5icgorCisudGkgLTgKKy5CIHRpcGMgYmVhcmVyIGRpc2FibGUgbWVkaWEKKy5icgorLlJCICJ7IHsgIiBldGggIiB8ICIgaWIgIiB9ICIgZGV2aWNlCisuSVIgREVWSUNFCisuUkIgInwiCisuYnIKKy5SQiAieyAiIHVkcAorLkIgbmFtZQorLklSIE5BTUUKKy5CIGxvY2FsaXAKKy5JUiBMT0NBTElQICIgfSB9IgorLmJyCisKKy50aSAtOAorLkIgdGlwYyBiZWFyZXIgc2V0CisuUkIgInsgIiAicHJpb3JpdHkgIgorLklSIFBSSU9SSVRZCisuUkIgInwgIiB0b2xlcmFuY2UKKy5JUiBUT0xFUkFOQ0UKKy5SQiAifCAiIHdpbmRvdworLklSIFdJTkRPVworLlJCICJ9ICIgbWVkaWEKKy5icgorLlJCICJ7IHsgIiBldGggIiB8ICIgaWIgIiB9ICIgZGV2aWNlCisuSVIgIkRFVklDRSIgIiB9IgorLlJCICJ8IgorLmJyCisuUkIgInsgIiB1ZHAKKy5CIG5hbWUKKy5JUiBOQU1FCisuQiBsb2NhbGlwCisuSVIgTE9DQUxJUCAiIH0gfSIKKy5icgorCisudGkgLTgKKy5CIHRpcGMgYmVhcmVyIGdldAorLlJCICJ7ICIgInByaW9yaXR5IiAiIHwgIiB0b2xlcmFuY2UgIiB8ICIgd2luZG93ICIgfSAiIG1lZGlhCisuYnIKKy5SQiAieyB7ICIgZXRoICIgfCAiIGliICIgfSAiIGRldmljZQorLklSICJERVZJQ0UiICIgfSIKKy5SQiAifCIKKy5icgorLlJCICJ7ICIgdWRwCisuQiBuYW1lCisuSVIgTkFNRQorLkIgbG9jYWxpcAorLklSIExPQ0FMSVAgIiB9IH0iCisuYnIKKworLnRpIC04CisuQiB0aXBjIGJlYXJlciBsaXN0CisuYnIKKworLlNIIE9QVElPTlMKK09wdGlvbnMgKGZsYWdzKSB0aGF0IGNhbiBiZSBwYXNzZWQgYW55d2hlcmUgaW4gdGhlIGNvbW1hbmQgY2hhaW4uCisuVFAKKy5CUiAiXC1oIiAsICIgLS1oZWxwIgorU2hvdyBoZWxwIGFib3V0IGxhc3QgdmFsaWQgY29tbWFuZC4gRm9yIGV4YW1wbGUKKy5CIHRpcGMgYmVhcmVyIC0taGVscAord2lsbCBzaG93IGJlYXJlciBoZWxwIGFuZAorLkIgdGlwYyAtLWhlbHAKK3dpbGwgc2hvdyBnZW5lcmFsIGhlbHAuIFRoZSBwb3NpdGlvbiBvZiB0aGUgb3B0aW9uIGluIHRoZSBzdHJpbmcgaXMgaXJyZWxldmFudC4KKy5TSCBERVNDUklQVElPTgorCisuU1MgQmVhcmVyIGlkZW50aWZpY2F0aW9uCisuVFAKKy5CSSAibWVkaWEgIiBNRURJQQorLmJyCitTcGVjaWZpZXMgdGhlIFRJUEMgbWVkaWEgdHlwZSBmb3IgYSBwYXJ0aWN1bGFyIGJlYXJlciB0byBvcGVyYXRlIG9uLgorRGlmZmVyZW50IG1lZGlhIHR5cGVzIGhhdmUgZGlmZmVyZW50IHdheXMgb2YgaWRlbnRpZnlpbmcgYSB1bmlxdWUgYmVhcmVyLgorRm9yIGV4YW1wbGUsCisuQlIgImliICIgImFuZCAiIGV0aAoraWRlbnRpZnkgYSBiZWFyZXIgd2l0aCBhCisuSSBERVZJQ0UKK3doaWxlCisuQiB1ZHAKK2lkZW50aWZ5IGEgYmVhcmVyIHdpdGggYQorLklSICJMT0NBTElQICIgImFuZCBhICIgTkFNRQorCisuQiBpYgorLSBJbmZpbmliYW5kCisuc3AKKy5CIGV0aAorLSBFdGhlcm5ldAorLnNwCisuQiB1ZHAKKy0gVXNlciBEYXRhZ3JhbSBQcm90b2NvbCAoVURQKQorLnNwCisKKy5UUAorLkJJICJuYW1lICIgTkFNRQorLmJyCitMb2dpY2FsIGJlYXJlciBpZGVudGlmaWVyIHZhbGlkIGZvciBiZWFyZXJzIG9uCisuQiB1ZHAKK21lZGlhLgorCisuVFAKKy5CSSAiZGV2aWNlICIgREVWSUNFCisuYnIKK1BoeXNpY2FsIGJlYXJlciBkZXZpY2UgdmFsaWQgZm9yIGJlYXJlcnMgb24KKy5CIGV0aAorYW5kCisuQiBpYgorbWVkaWEuCisKKy5TUyBCZWFyZXIgcHJvcGVydGllcworCisuVFAKKy5CIGRvbWFpbgorLmJyCitUaGUgYWRkcmVzc2luZyBkb21haW4gKHJlZ2lvbikgaW4gd2hpY2ggYSBiZWFyZXIgd2lsbCBlc3RhYmxpc2ggbGlua3MgYW5kIGFjY2VwdAorbGluayBlc3RhYmxpc2ggcmVxdWVzdHMuCisKKy5UUAorLkIgcHJpb3JpdHkKKy5icgorRGVmYXVsdCBsaW5rIHByaW9yaXR5IGluaGVyaXRlZCBieSBhbGwgbGlua3Mgc3Vic2VxdWVudGx5IGVzdGFibGlzaGVkIG92ZXIgYQorYmVhcmVyLiBBIHNpbmdsZSBiZWFyZXIgY2FuIG9ubHkgaG9zdCBvbmUgbGluayB0byBhIHBhcnRpY3VsYXIgbm9kZS4gVGhpcyBtZWFucwordGhlIGRlZmF1bHQgbGluayBwcmlvcml0eSBmb3IgYSBiZWFyZXIgdHlwaWNhbGx5IGFmZmVjdHMgd2hpY2ggYmVhcmVyIHRvIHVzZQord2hlbiBjb21tdW5pY2F0aW5nIHdpdGggYSBwYXJ0aWN1bGFyIG5vZGUgaW4gYW4gbXVsdGkgYmVhcmVyIHNldHVwLiBGb3IgbW9yZQoraW5mbyBhYm91dCBsaW5rIHByaW9yaXR5IHNlZQorLkJSIHRpcGMtbGluayAoOCkKKworLlRQCisuQiB0b2xlcmFuY2UKKy5icgorRGVmYXVsdCBsaW5rIHRvbGVyYW5jZSBpbmhlcml0ZWQgYnkgYWxsIGxpbmtzIHN1YnNlcXVlbnRseSBlc3RhYmxpc2hlZCBvdmVyIGEKK2JlYXJlci4gRm9yIG1vcmUgaW5mbyBhYm91dCBsaW5rIHRvbGVyYW5jZSBzZWUKKy5CUiB0aXBjLWxpbmsgKDgpCisKKy5UUAorLkIgd2luZG93CisuYnIKK0RlZmF1bHQgbGluayB3aW5kb3cgaW5oZXJpdGVkIGJ5IGFsbCBsaW5rcyBzdWJzZXF1ZW50bHkgZXN0YWJsaXNoZWQgb3ZlciBhCitiZWFyZXIuIEZvciBtb3JlIGluZm8gYWJvdXQgdGhlIGxpbmsgd2luZG93IHNpemUgc2VlCisuQlIgdGlwYy1saW5rICg4KQorCisuU1MgVURQIGJlYXJlciBvcHRpb25zCisKKy5UUAorLkJJICJsb2NhbGlwICIgTE9DQUxJUAorLmJyCitTcGVjaWZ5IGEgbG9jYWwgSVAgdjQvdjYgYWRkcmVzcyBmb3IgYQorLkIgdWRwCitiZWFyZXIuCisKKy5UUAorLkJJICJsb2NhbHBvcnQgIiBMT0NBTFBPUlQKKy5icgorU3BlY2lmeSB0aGUgbG9jYWwgcG9ydCBmb3IgYQorLkIgdWRwCitiZWFyZXIuIFRoZSBkZWZhdWx0IHBvcnQgNjExOCBpcyB1c2VkIGlmIG5vIHBvcnQgaXMgc3BlY2lmaWVkLgorCisuVFAKKy5CSSAicmVtb3RlaXAgIiBSRU1PVEVJUAorLmJyCitTcGVjaWZ5IGEgcmVtb3RlIElQIGZvciBhCisuQiB1ZHAKK2JlYXJlci4gSWYgbm8gcmVtb3RlIElQIGlzIHNwZWNpZmllZCBhCisuQiB1ZHAKK2JlYXJlciBydW5zIGluIG11bHRpY2FzdCBtb2RlIGFuZCB0cmllcyB0byBhdXRvLWRpc2NvdmVyIGl0cyBuZWlnaGJvdXJzLgorVGhlIG11bHRpY2FzdCBJUCBhZGRyZXNzIGlzIGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUgVElQQyBuZXR3b3JrIElELiBJZiBhIHJlbW90ZQorSVAgaXMgc3BlY2lmaWVkIHRoZQorLkIgdWRwCitiZWFyZXIgcnVucyBpbiBwb2ludC10by1wb2ludCBtb2RlLgorCisuVFAKKy5CSSAicmVtb3RlcG9ydCAiIFJFTU9URVBPUlQKKy5icgorU3BlY2lmeSB0aGUgcmVtb3RlIHBvcnQgZm9yIGEKKy5CIHVkcAorYmVhcmVyLiBUaGUgZGVmYXVsdCBwb3J0IDYxMTggaXMgdXNlZCBpZiBubyBwb3J0IGlzIHNwZWNpZmllZC4KKworLlNIIEVYSVQgU1RBVFVTCitFeGl0IHN0YXR1cyBpcyAwIGlmIGNvbW1hbmQgd2FzIHN1Y2Nlc3NmdWwgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIHVwb24gZmFpbHVyZS4KKworLlNIIFNFRSBBTFNPCisuQlIgdGlwYyAoOCksCisuQlIgdGlwYy1saW5rICg4KSwKKy5CUiB0aXBjLW1lZGlhICg4KSwKKy5CUiB0aXBjLW5hbWV0YWJsZSAoOCksCisuQlIgdGlwYy1ub2RlICg4KSwKKy5CUiB0aXBjLXBlZXIgKDgpLAorLkJSIHRpcGMtc29ja2V0ICg4KQorLmJyCisuU0ggUkVQT1JUSU5HIEJVR1MKK1JlcG9ydCBhbnkgYnVncyB0byB0aGUgTmV0d29yayBEZXZlbG9wZXJzIG1haWxpbmcgbGlzdAorLkIgPG5ldGRldkB2Z2VyLmtlcm5lbC5vcmc+Cit3aGVyZSB0aGUgZGV2ZWxvcG1lbnQgYW5kIG1haW50ZW5hbmNlIGlzIHByaW1hcmlseSBkb25lLgorWW91IGRvIG5vdCBoYXZlIHRvIGJlIHN1YnNjcmliZWQgdG8gdGhlIGxpc3QgdG8gc2VuZCBhIG1lc3NhZ2UgdGhlcmUuCisKKy5TSCBBVVRIT1IKK1JpY2hhcmQgQWxwZSA8cmljaGFyZC5hbHBlQGVyaWNzc29uLmNvbT4KZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L3RpcGMtbGluay44IGIvaXByb3V0ZTIvbWFuL21hbjgvdGlwYy1saW5rLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVlMDNhMAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L3RpcGMtbGluay44CkBAIC0wLDAgKzEsMjI2IEBACisuVEggVElQQy1MSU5LIDggIjAyIEp1biAyMDE1IiAiaXByb3V0ZTIiICJMaW51eCIKKworLlwiIEZvciBjb25zaXN0ZW5jeSwgcGxlYXNlIGtlZXAgcGFkZGluZyByaWdodCBhbGlnbmVkLgorLlwiIEZvciBleGFtcGxlICcuQiAiZm9vICIgYmFyJyBhbmQgbm90ICcuQiBmb28gIiBiYXIiJworCisuU0ggTkFNRQordGlwYy1saW5rIFwtIHNob3cgbGlua3Mgb3IgbW9kaWZ5IGxpbmsgcHJvcGVydGllcworCisuU0ggU1lOT1BTSVMKKy5hZCBsCisuaW4gKzgKKworLnRpIC04CisKKy50aSAtOAorLkIgdGlwYyBsaW5rIHNldAorLlJCICJ7ICIgInByaW9yaXR5ICIKKy5JUiBQUklPUklUWQorLlJCICJ8ICIgdG9sZXJhbmNlCisuSVIgVE9MRVJBTkNFCisuUkIgInwgIiB3aW5kb3cKKy5JUiAiV0lORE9XICIgfQorLkJJICJsaW5rICIgTElOSworCisudGkgLTgKKy5CIHRpcGMgbGluayBnZXQKKy5SQiAieyAiICJwcmlvcml0eSIgIiB8ICIgdG9sZXJhbmNlICIgfCAiIHdpbmRvdyAiIH0gIiBsaW5rCisuSSBMSU5LCisKKy50aSAtOAorLkIgdGlwYyBsaW5rIHN0YXRpc3RpY3MKKy5SQiAieyAiICJzaG93ICIgIlsgIiBsaW5rCisuSSBMSU5LCisuUkIgIl0gfCAiICJyZXNldAorLkJJICJsaW5rICIgIkxJTksgIgorfQorCisudGkgLTgKKy5CIHRpcGMgbGluayBsaXN0CisuYnIKKworLlNIIE9QVElPTlMKK09wdGlvbnMgKGZsYWdzKSB0aGF0IGNhbiBiZSBwYXNzZWQgYW55d2hlcmUgaW4gdGhlIGNvbW1hbmQgY2hhaW4uCisuVFAKKy5CUiAiXC1oIiAsICIgLS1oZWxwIgorU2hvdyBoZWxwIGFib3V0IGxhc3QgdmFsaWQgY29tbWFuZC4gRm9yIGV4YW1wbGUKKy5CIHRpcGMgbGluayAtLWhlbHAKK3dpbGwgc2hvdyBsaW5rIGhlbHAgYW5kCisuQiB0aXBjIC0taGVscAord2lsbCBzaG93IGdlbmVyYWwgaGVscC4gVGhlIHBvc2l0aW9uIG9mIHRoZSBvcHRpb24gaW4gdGhlIHN0cmluZyBpcyBpcnJlbGV2YW50LgorLlNIIERFU0NSSVBUSU9OCisKKy5TUyBMaW5rIHN0YXRpc3RpY3MKKworLlRQCisuQlIgIkFDVElWRSAiICJsaW5rIHN0YXRlIgorLmJyCitBbgorLkIgQUNUSVZFCitsaW5rIGlzIHNlcnZpbmcgdHJhZmZpYy4gVHdvIGxpbmtzIHRvIHRoZSBzYW1lIG5vZGUgY2FuIGJlY29tZQorLkIgQUNUSVZFCitpZiB0aGV5IGhhdmUgdGhlIHNhbWUgbGluaworLkJSIHByaW9yaXR5IC4KK0lmIHRoZXJlIGlzIG1vcmUgdGhhbiB0d28gbGlua3Mgd2l0aCB0aGUgc2FtZSBwcmlvcml0eSB0aGUgYWRkaXRpb25hbCBsaW5rcyB3aWxsCitiZSBwdXQgaW4KKy5CIFNUQU5EQlkKK3N0YXRlLgorCisuVFAKKy5CUiAiU1RBTkRCWSAiICJsaW5rIHN0YXRlIgorLmJyCitBCisuQiBTVEFOREJZCitsaW5rIGhhcyBsb3dlciBsaW5rIHByaW9yaXR5IHRoYW4gYW4KKy5CIEFDVElWRQorbGluay4gQQorLkIgU1RBTkRCWQorbGluayBoYXMgY29udHJvbCB0cmFmZmljIGZsb3dpbmcgYW5kIGlzIHJlYWR5IHRvIHRha2Ugb3ZlciBzaG91bGQgdGhlCisuQiBBQ1RJVkUKK2xpbmsocykgZ28gZG93bi4KKworLlRQCisuQiBNVFUKKy5icgorVGhlIE1heGltdW0gVHJhbnNtaXNzaW9uIFVuaXQuIFRoZSB0d28gZW5kcG9pbnRzIGFkdmVydGlzZSB0aGVpciBkZWZhdWx0IG9yCitjb25maWd1cmVkCisuQiBNVFUKK2F0IGluaXRpYWwgbGluayBzZXR1cCBhbmQgd2lsbCBhZ3JlZSB0byB1c2UgdGhlIGxvd2VyIG9mIHRoZSB0d28gdmFsdWVzIHNob3VsZAordGhleSBkaWZmZXIuCisKKy5UUAorLkIgUGFja2V0cworLmJyCitUaGUgdG90YWwgYW1vdW50IG9mIHRyYW5zbWl0dGVkIG9yIHJlY2VpdmVkIFRJUEMgcGFja2V0cyBvbiBhIGxpbmsuIEluY2x1ZGluZworLkJSICJmcmFnbWVudGVkICIgImFuZCAiICJidW5kbGVkICIgcGFja2V0cy4KKworLlRQCisuQiBGcmFnbWVudHMKKy5icgorUmVwcmVzZW50ZWQgaW4gdGhlIGZvcm0KKy5CUiBmcmFnbWVudHMgLyBmcmFnbWVudGVkIC4KK1doZXJlCisuQiBmcmFnbWVudGVkCitpcyB0aGUgYW1vdW50IG9mIGRhdGEgbWVzc2FnZXMgd2hpY2ggaGF2ZSBiZWVuIGJyb2tlbiBpbnRvCisuQlIgZnJhZ21lbnRzIC4KK1N1YnNlcXVlbnRseSB0aGUKKy5CIGZyYWdtZW50cworYXJlIHRoZSB0b3RhbCBhbW91bnQgb2YgcGFja2V0cyB0aGF0IHRoZQorLkIgZnJhZ21lbnRlZAorbWVzc2FnZXMgaGFzIGJlZW4gYnJva2VuIGludG8uCisKKy5UUAorLkIgQnVuZGxlcworLmJyCitSZXByZXNlbnRlZCBpbiB0aGUgZm9ybQorLkJSIGJ1bmRsZXMgLyBidW5kbGVkIC4KK0lmIGEgbGluayBiZWNvbWVzIGNvbmdlc3RlZCB0aGUgbGluayB3aWxsIGF0dGVtcHQgdG8gYnVuZGxlIGRhdGEgZnJvbSBzbWFsbAorLkIgYnVuZGxlZAorcGFja2V0cyBpbnRvCisuQiBidW5kbGVzCitvZiBmdWxsIE1UVSBzaXplIHBhY2tldHMgYmVmb3JlIHRoZXkgYXJlIHRyYW5zbWl0dGVkLgorCisuVFAKKy5CIFByb2ZpbGUKKy5icgorU2hvd3MgdGhlCisuQiBhdmVyYWdlCitwYWNrZXQgc2l6ZSBpbiBvY3RldHMvYnl0ZXMgZm9yIGEKKy5CIHNhbXBsZQorb2YgcGFja2V0cy4gSXQgYWxzbyBzaG93cyB0aGUgcGFja2V0IHNpemUgZGlzdHJpYnV0aW9uIG9mIHRoZQorLkIgc2FtcGxlZAorcGFja2V0cyBpbiB0aGUgaW50ZXJ2YWxzCisKKzAtNjQgYnl0ZXMKKy5icgorNjQtMjU2IGJ5dGVzCisuYnIKKzI1Ni0xMDI0IGJ5dGVzCisuYnIKKzEwMjQtNDA5NiBieXRlcworLmJyCis0MDk2LTE2Mzg0IGJ5dGVzCisuYnIKKzE2Mzg0LTMyNzY4IGJ5dGVzCisuYnIKKzMyNzY4LTY2MDAwIGJ5dGVzCisKKy5UUAorLkIgTWVzc2FnZSBjb3VudGVycworCisuQiBzdGF0ZXMKKy0gTnVtYmVyIG9mIGxpbmsgc3RhdGUgbWVzc2FnZXMKKy5zcAorCisuQiBwcm9iZXMKKy0gTGluayBzdGF0ZSBtZXNzYWdlcyB3aXRoIHByb2JlIGZsYWcgc2V0LiBUeXBpY2FsbHkgc2VudCB3aGVuIGEgbGluayBpcyBpZGxlCisuc3AKKworLkIgbmFja3MKKy0gTnVtYmVyIG9mIG5lZ2F0aXZlIGFja25vd2xlZGdlbWVudCAoTkFDSykgcGFja2V0cyBzZW50IGFuZCByZWNlaXZlZCBieSB0aGUKK2xpbmsKKy5zcAorCisuQiBkZWZzCistIE51bWJlciBvZiBwYWNrZXRzIHJlY2VpdmVkIG91dCBvZiBvcmRlcgorLnNwCisKKy5CIGR1cHMKKy0gTnVtYmVyIG9mIGR1cGxpY2F0ZSBwYWNrZXRzIHJlY2VpdmVkCisKKy5UUAorLkIgQ29uZ2VzdGlvbiBsaW5rCitUaGUgbnVtYmVyIG9mIHRpbWVzIGFuIGFwcGxpY2F0aW9uIGhhcyB0cmllZCB0byBzZW5kIGRhdGEgd2hlbiB0aGUgVElQQyBsaW5rCit3YXMgY29uZ2VzdGVkCisKKy5UUAorLkIgU2VuZCBxdWV1ZQorLkIgTWF4CitpcyB0aGUgbWF4aW11bSBhbW91bnQgb2YgbWVzc2FnZXMgdGhhdCBoYXMgcmVzaWRlZCBpbiB0aGUgb3V0IHF1ZXVlIGR1cmluZyB0aGUKK3N0YXRpc3RpY3MgY29sbGVjdGlvbiBwZXJpb2Qgb2YgYSBsaW5rLgorCisuQiBBdmcKK2lzIHRoZSBhdmVyYWdlIG91dHF1ZXVlIHNpemUgZHVyaW5nIHRoZSBsaWZldGltZSBvZiBhIGxpbmsuCisKKy5TUyBMaW5rIHByb3BlcnRpZXMKKworLlRQCisuQiBwcmlvcml0eQorLmJyCitUaGUgcHJpb3JpdHkgYmV0d2VlbiBsb2dpY2FsIFRJUEMgbGlua3MgdG8gYSBwYXJ0aWN1bGFyIG5vZGUuIExpbmsgcHJpb3JpdHkgY2FuCityYW5nZSBmcm9tIDAgKGxvd2VzdCkgdG8gMzEgKGhpZ2hlc3QpLgorCisuVFAKKy5CIHRvbGVyYW5jZQorLmJyCitMaW5rIHRvbGVyYW5jZSBzcGVjaWZpZXMgdGhlIG1heGltdW0gdGltZSBpbiBtaWxsaXNlY29uZHMgdGhhdCBUSVBDIHdpbGwgYWxsb3cKK2EgY29tbXVuaWNhdGlvbiBwcm9ibGVtIHRvIGV4aXN0IGJlZm9yZSB0YWtpbmcgdGhlIGxpbmsgZG93bi4gVGhlIGRlZmF1bHQgdmFsdWUKK2lzIDE1MDAgbWlsbGlzZWNvbmRzLgorCisuVFAKKy5CIHdpbmRvdworLmJyCitUaGUgbGluayB3aW5kb3cgY29udHJvbHMgaG93IG1hbnkgdW5hY2tub3dsZWRnZWQgbWVzc2FnZXMgYSBsaW5rIGVuZHBvaW50IGNhbgoraGF2ZSBpbiBpdHMgdHJhbnNtaXQgcXVldWUgYmVmb3JlIFRJUEMncyBjb25nZXN0aW9uIGNvbnRyb2wgbWVjaGFuaXNtIGlzCithY3RpdmF0ZWQuCisKKy5TSCBFWElUIFNUQVRVUworRXhpdCBzdGF0dXMgaXMgMCBpZiBjb21tYW5kIHdhcyBzdWNjZXNzZnVsIG9yIGEgcG9zaXRpdmUgaW50ZWdlciB1cG9uIGZhaWx1cmUuCisKKy5TSCBTRUUgQUxTTworLkJSIHRpcGMgKDgpLAorLkJSIHRpcGMtbWVkaWEgKDgpLAorLkJSIHRpcGMtYmVhcmVyICg4KSwKKy5CUiB0aXBjLW5hbWV0YWJsZSAoOCksCisuQlIgdGlwYy1ub2RlICg4KSwKKy5CUiB0aXBjLXBlZXIgKDgpLAorLkJSIHRpcGMtc29ja2V0ICg4KQorLmJyCisuU0ggUkVQT1JUSU5HIEJVR1MKK1JlcG9ydCBhbnkgYnVncyB0byB0aGUgTmV0d29yayBEZXZlbG9wZXJzIG1haWxpbmcgbGlzdAorLkIgPG5ldGRldkB2Z2VyLmtlcm5lbC5vcmc+Cit3aGVyZSB0aGUgZGV2ZWxvcG1lbnQgYW5kIG1haW50ZW5hbmNlIGlzIHByaW1hcmlseSBkb25lLgorWW91IGRvIG5vdCBoYXZlIHRvIGJlIHN1YnNjcmliZWQgdG8gdGhlIGxpc3QgdG8gc2VuZCBhIG1lc3NhZ2UgdGhlcmUuCisKKy5TSCBBVVRIT1IKK1JpY2hhcmQgQWxwZSA8cmljaGFyZC5hbHBlQGVyaWNzc29uLmNvbT4KZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L3RpcGMtbWVkaWEuOCBiL2lwcm91dGUyL21hbi9tYW44L3RpcGMtbWVkaWEuOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Njg5Y2IzCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbWFuL21hbjgvdGlwYy1tZWRpYS44CkBAIC0wLDAgKzEsODcgQEAKKy5USCBUSVBDLU1FRElBIDggIjAyIEp1biAyMDE1IiAiaXByb3V0ZTIiICJMaW51eCIKKworLlwiIEZvciBjb25zaXN0ZW5jeSwgcGxlYXNlIGtlZXAgcGFkZGluZyByaWdodCBhbGlnbmVkLgorLlwiIEZvciBleGFtcGxlICcuQiAiZm9vICIgYmFyJyBhbmQgbm90ICcuQiBmb28gIiBiYXIiJworCisuU0ggTkFNRQordGlwYy1tZWRpYSBcLSBsaXN0IG9yIG1vZGlmeSBtZWRpYSBwcm9wZXJ0aWVzCisKKy5TSCBTWU5PUFNJUworLmFkIGwKKy5pbiArOAorCisudGkgLTgKKworLnRpIC04CisuQiB0aXBjIG1lZGlhIHNldAorLlJCICJ7ICIgInByaW9yaXR5ICIKKy5JUiBQUklPUklUWQorLlJCICJ8ICIgdG9sZXJhbmNlCisuSVIgVE9MRVJBTkNFCisuUkIgInwgIiB3aW5kb3cKKy5JUiAiV0lORE9XICIgfQorLkJJICJtZWRpYSAiIE1FRElBCisKKy50aSAtOAorLkIgdGlwYyBtZWRpYSBnZXQKKy5SQiAieyAiICJwcmlvcml0eSIgIiB8ICIgdG9sZXJhbmNlICIgfCAiIHdpbmRvdyAiIH0gIiBtZWRpYQorLkkgTUVESUEKKworLnRpIC04CisuQiB0aXBjIG1lZGlhIGxpc3QKKy5icgorCisuU0ggT1BUSU9OUworT3B0aW9ucyAoZmxhZ3MpIHRoYXQgY2FuIGJlIHBhc3NlZCBhbnl3aGVyZSBpbiB0aGUgY29tbWFuZCBjaGFpbi4KKy5UUAorLkJSICJcLWgiICwgIiAtLWhlbHAiCitTaG93IGhlbHAgYWJvdXQgbGFzdCB2YWxpZCBjb21tYW5kLiBGb3IgZXhhbXBsZQorLkIgdGlwYyBtZWRpYSAtLWhlbHAKK3dpbGwgc2hvdyBtZWRpYSBoZWxwIGFuZAorLkIgdGlwYyAtLWhlbHAKK3dpbGwgc2hvdyBnZW5lcmFsIGhlbHAuIFRoZSBwb3NpdGlvbiBvZiB0aGUgb3B0aW9uIGluIHRoZSBzdHJpbmcgaXMgaXJyZWxldmFudC4KKy5TSCBERVNDUklQVElPTgorCisuU1MgTWVkaWEgcHJvcGVydGllcworCisuVFAKKy5CIHByaW9yaXR5CisuYnIKK0RlZmF1bHQgbGluayBwcmlvcml0eSBpbmhlcml0ZWQgYnkgYWxsIGJlYXJlcnMgc3Vic2VxdWVudGx5IGVuYWJsZWQgb24gYQorbWVkaWEuIEZvciBtb3JlIGluZm8gYWJvdXQgbGluayBwcmlvcml0eSBzZWUKKy5CUiB0aXBjLWxpbmsgKDgpCisKKy5UUAorLkIgdG9sZXJhbmNlCisuYnIKK0RlZmF1bHQgbGluayB0b2xlcmFuY2UgaW5oZXJpdGVkIGJ5IGFsbCBiZWFyZXJzIHN1YnNlcXVlbnRseSBlbmFibGVkIG9uIGEKK21lZGlhLiBGb3IgbW9yZSBpbmZvIGFib3V0IGxpbmsgdG9sZXJhbmNlIHNlZQorLkJSIHRpcGMtbGluayAoOCkKKworLlRQCisuQiB3aW5kb3cKKy5icgorRGVmYXVsdCBsaW5rIHdpbmRvdyBpbmhlcml0ZWQgYnkgYWxsIGJlYXJlcnMgc3Vic2VxdWVudGx5IGVuYWJsZWQgb24gYQorbWVkaWEuIEZvciBtb3JlIGluZm8gYWJvdXQgbGluayB3aW5kb3cgc2VlCisuQlIgdGlwYy1saW5rICg4KQorCisuU0ggRVhJVCBTVEFUVVMKK0V4aXQgc3RhdHVzIGlzIDAgaWYgY29tbWFuZCB3YXMgc3VjY2Vzc2Z1bCBvciBhIHBvc2l0aXZlIGludGVnZXIgdXBvbiBmYWlsdXJlLgorCisuU0ggU0VFIEFMU08KKy5CUiB0aXBjICg4KSwKKy5CUiB0aXBjLWJlYXJlciAoOCksCisuQlIgdGlwYy1saW5rICg4KSwKKy5CUiB0aXBjLW5hbWV0YWJsZSAoOCksCisuQlIgdGlwYy1ub2RlICg4KSwKKy5CUiB0aXBjLXBlZXIgKDgpLAorLkJSIHRpcGMtc29ja2V0ICg4KQorLmJyCisuU0ggUkVQT1JUSU5HIEJVR1MKK1JlcG9ydCBhbnkgYnVncyB0byB0aGUgTmV0d29yayBEZXZlbG9wZXJzIG1haWxpbmcgbGlzdAorLkIgPG5ldGRldkB2Z2VyLmtlcm5lbC5vcmc+Cit3aGVyZSB0aGUgZGV2ZWxvcG1lbnQgYW5kIG1haW50ZW5hbmNlIGlzIHByaW1hcmlseSBkb25lLgorWW91IGRvIG5vdCBoYXZlIHRvIGJlIHN1YnNjcmliZWQgdG8gdGhlIGxpc3QgdG8gc2VuZCBhIG1lc3NhZ2UgdGhlcmUuCisKKy5TSCBBVVRIT1IKK1JpY2hhcmQgQWxwZSA8cmljaGFyZC5hbHBlQGVyaWNzc29uLmNvbT4KZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L3RpcGMtbmFtZXRhYmxlLjggYi9pcHJvdXRlMi9tYW4vbWFuOC90aXBjLW5hbWV0YWJsZS44Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiY2VmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9tYW4vbWFuOC90aXBjLW5hbWV0YWJsZS44CkBAIC0wLDAgKzEsMTAwIEBACisuVEggVElQQy1OQU1FVEFCTEUgOCAiMDIgSnVuIDIwMTUiICJpcHJvdXRlMiIgIkxpbnV4IgorCisuXCIgRm9yIGNvbnNpc3RlbmN5LCBwbGVhc2Uga2VlcCBwYWRkaW5nIHJpZ2h0IGFsaWduZWQuCisuXCIgRm9yIGV4YW1wbGUgJy5CICJmb28gIiBiYXInIGFuZCBub3QgJy5CIGZvbyAiIGJhciInCisKKy5TSCBOQU1FCit0aXBjLW5hbWV0YWJsZSBcLSBzaG93IFRJUEMgbmFtZXRhYmxlCisKKy5TSCBTWU5PUFNJUworLmFkIGwKKy5pbiArOAorCisudGkgLTgKKy5CIHRpcGMgbmFtZXRhYmxlIHNob3cKKy5icgorCisuU0ggT1BUSU9OUworT3B0aW9ucyAoZmxhZ3MpIHRoYXQgY2FuIGJlIHBhc3NlZCBhbnl3aGVyZSBpbiB0aGUgY29tbWFuZCBjaGFpbi4KKy5UUAorLkJSICJcLWgiICwgIiAtLWhlbHAiCitTaG93IGhlbHAgYWJvdXQgbGFzdCB2YWxpZCBjb21tYW5kLiBGb3IgZXhhbXBsZQorLkIgdGlwYyBuYW1ldGFibGUgLS1oZWxwCit3aWxsIHNob3cgbmFtZXRhYmxlIGhlbHAgYW5kCisuQiB0aXBjIC0taGVscAord2lsbCBzaG93IGdlbmVyYWwgaGVscC4gVGhlIHBvc2l0aW9uIG9mIHRoZSBvcHRpb24gaW4gdGhlIHN0cmluZyBpcyBpcnJlbGV2YW50LgorCisuU0ggREVTQ1JJUFRJT04KK1RoZSBuYW1ldGFibGUgc2hvd3MgVElQQyBwdWJsaWNhdGlvbiBpbmZvcm1hdGlvbi4KKworLlNTIE5hbWV0YWJsZSBmb3JtYXQKKworLlRQCisuQiBUeXBlCisuYnIKK1RoZSAzMi1iaXQgdHlwZSBmaWVsZCBvZiB0aGUgcG9ydCBuYW1lLiBUaGUgdHlwZSBmaWVsZCBvZnRlbiBpbmRpY2F0ZXMgdGhlIGNsYXNzIG9mIHNlcnZpY2UKK3Byb3ZpZGVkIGJ5IGEgcG9ydC4KKworLlRQCisuQiBMb3dlcgorLmJyCitUaGUgbG93ZXIgYm91bmQgb2YgdGhlIDMyLWJpdCBpbnN0YW5jZSBmaWVsZCBvZiB0aGUgcG9ydCBuYW1lLgorVGhlIGluc3RhbmNlIGZpZWxkIGlzIG9mdGVuIHVzZWQgYXMgYXMgYSBzdWItY2xhc3MgaW5kaWNhdG9yLgorCisuVFAKKy5CIFVwcGVyCisuYnIKK1RoZSB1cHBlciBib3VuZCBvZiB0aGUgMzItYml0IGluc3RhbmNlIGZpZWxkIG9mIHRoZSBwb3J0IG5hbWUuCitUaGUgaW5zdGFuY2UgZmllbGQgaXMgb2Z0ZW4gdXNlZCBhcyBhcyBhIHN1Yi1jbGFzcyBpbmRpY2F0b3IuCitBIGRpZmZlcmVuY2UgaW4KKy5CUiAibG93ZXIgIiAiYW5kICIgdXBwZXIKK21lYW5zIHRoZSBzb2NrZXQgaXMgYm91bmQgdG8gdGhlIHBvcnQgbmFtZSByYW5nZSBbbG93ZXIsdXBwZXJdCisKKy5UUAorLkIgUG9ydCBJZGVudGl0eQorLmJyCitUaGUgdW5pcXVlIHNvY2tldCAocG9ydCkgaWRlbnRpZmllciB3aXRoaW4gdGhlIFRJUEMgY2x1c3Rlci4gVGhlCisuQiBwb3J0IGlkZW50aXR5Citjb25zaXN0cyBvZiBhIG5vZGUgaWRlbnRpdHkgZm9sbG93ZWQgYnkgYSBzb2NrZXQgcmVmZXJlbmNlIG51bWJlci4KKworLlRQCisuQiBQdWJsaWNhdGlvbgorLmJyCitUaGUKKy5CIHB1YmxpY2F0aW9uCitJRCBpcyBhIHJhbmRvbSBudW1iZXIgdXNlZCBpbnRlcm5hbGx5IHRvIHJlcHJlc2VudCBhIHB1YmxpY2F0aW9uLgorCisuVFAKKy5CIFNjb3BlCisuYnIKK1RoZSBwdWJsaWNhdGlvbgorLkIgc2NvcGUKK3NwZWNpZmllcyB0aGUgdmlzaWJpbGl0eSBvZiBhIGJvdW5kIHBvcnQgbmFtZS4KK1RoZQorLkIgc2NvcGUKK2NhbiBiZSBzcGVjaWZpZWQgdG8gY29tcHJpc2UgdGhyZWUgZGlmZmVyZW50IGRvbWFpbnM6CisuQlIgbm9kZSAiLCAiICJjbHVzdGVyICIgImFuZCAiIHpvbmUuCitBcHBsaWNhdGlvbnMgcmVzaWRpbmcgd2l0aGluIHRoZSBzcGVjaWZpZWQKKy5CIHNjb3BlCitjYW4gc2VlIGFuZCBhY2Nlc3MgdGhlIHBvcnQgdXNpbmcgdGhlIGRpc3BsYXllZCBwb3J0IG5hbWUuCisKKy5TSCBFWElUIFNUQVRVUworRXhpdCBzdGF0dXMgaXMgMCBpZiBjb21tYW5kIHdhcyBzdWNjZXNzZnVsIG9yIGEgcG9zaXRpdmUgaW50ZWdlciB1cG9uIGZhaWx1cmUuCisKKy5TSCBTRUUgQUxTTworLkJSIHRpcGMgKDgpLAorLkJSIHRpcGMtYmVhcmVyICg4KSwKKy5CUiB0aXBjLWxpbmsgKDgpLAorLkJSIHRpcGMtbWVkaWEgKDgpLAorLkJSIHRpcGMtbm9kZSAoOCksCisuQlIgdGlwYy1wZWVyICg4KSwKKy5CUiB0aXBjLXNvY2tldCAoOCkKKy5icgorLlNIIFJFUE9SVElORyBCVUdTCitSZXBvcnQgYW55IGJ1Z3MgdG8gdGhlIE5ldHdvcmsgRGV2ZWxvcGVycyBtYWlsaW5nIGxpc3QKKy5CIDxuZXRkZXZAdmdlci5rZXJuZWwub3JnPgord2hlcmUgdGhlIGRldmVsb3BtZW50IGFuZCBtYWludGVuYW5jZSBpcyBwcmltYXJpbHkgZG9uZS4KK1lvdSBkbyBub3QgaGF2ZSB0byBiZSBzdWJzY3JpYmVkIHRvIHRoZSBsaXN0IHRvIHNlbmQgYSBtZXNzYWdlIHRoZXJlLgorCisuU0ggQVVUSE9SCitSaWNoYXJkIEFscGUgPHJpY2hhcmQuYWxwZUBlcmljc3Nvbi5jb20+CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9tYW4vbWFuOC90aXBjLW5vZGUuOCBiL2lwcm91dGUyL21hbi9tYW44L3RpcGMtbm9kZS44Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MmE0MDkKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9tYW4vbWFuOC90aXBjLW5vZGUuOApAQCAtMCwwICsxLDcyIEBACisuVEggVElQQy1OT0RFIDggIjAyIEp1biAyMDE1IiAiaXByb3V0ZTIiICJMaW51eCIKKworLlwiIEZvciBjb25zaXN0ZW5jeSwgcGxlYXNlIGtlZXAgcGFkZGluZyByaWdodCBhbGlnbmVkLgorLlwiIEZvciBleGFtcGxlICcuQiAiZm9vICIgYmFyJyBhbmQgbm90ICcuQiBmb28gIiBiYXIiJworCisuU0ggTkFNRQordGlwYy1ub2RlIFwtIG1vZGlmeSBhbmQgc2hvdyBsb2NhbCBub2RlIHBhcmFtZXRlcnMgb3IgbGlzdCBwZWVyIG5vZGVzCisKKy5TSCBTWU5PUFNJUworLmFkIGwKKy5pbiArOAorCisudGkgLTgKKy5CIHRpcGMgbm9kZSBzZXQKKy5SQiAieyAiICJhZGRyZXNzICIKKy5JUiBBRERSRVNTCisuUkIgInwgIiBuZXRpZAorLklSIE5FVElECisuUkIgIn0gIgorCisudGkgLTgKKy5CIHRpcGMgbm9kZSBnZXQKKy5SQiAieyAiICJhZGRyZXNzIiAiIHwgIiBuZXRpZCAiIH0gIgorCisudGkgLTgKKy5CIHRpcGMgbm9kZSBsaXN0CisuYnIKKworLlNIIE9QVElPTlMKK09wdGlvbnMgKGZsYWdzKSB0aGF0IGNhbiBiZSBwYXNzZWQgYW55d2hlcmUgaW4gdGhlIGNvbW1hbmQgY2hhaW4uCisuVFAKKy5CUiAiXC1oIiAsICIgLS1oZWxwIgorU2hvdyBoZWxwIGFib3V0IGxhc3QgdmFsaWQgY29tbWFuZC4gRm9yIGV4YW1wbGUKKy5CIHRpcGMgbm9kZSAtLWhlbHAKK3dpbGwgc2hvdyBub2RlIGhlbHAgYW5kCisuQiB0aXBjIC0taGVscAord2lsbCBzaG93IGdlbmVyYWwgaGVscC4gVGhlIHBvc2l0aW9uIG9mIHRoZSBvcHRpb24gaW4gdGhlIHN0cmluZyBpcyBpcnJlbGV2YW50LgorLlNIIERFU0NSSVBUSU9OCisKKy5TUyBOb2RlIHBhcmFtZXRlcnMKKy5UUAorLkJJIGFkZHJlc3MKKy5icgorVGhlIFRJUEMgbG9naWNhbCBhZGRyZXNzLiBPbiB0aGUgZm9ybSB4LnkueiB3aGVyZSB4LCB5IGFuZCB6IGFyZSB1bnNpZ25lZAoraW50ZWdlcnMuCisKKy5UUAorLkJJIG5ldGlkCisuYnIKK05ldHdvcmsgaWRlbnRpdHkuIENhbiBieSB1c2VkIHRvIGNyZWF0ZSBpbmRpdmlkdWFsIFRJUEMgY2x1c3RlcnMgb24gdGhlIHNhbWUKK21lZGlhLgorCisuU0ggRVhJVCBTVEFUVVMKK0V4aXQgc3RhdHVzIGlzIDAgaWYgY29tbWFuZCB3YXMgc3VjY2Vzc2Z1bCBvciBhIHBvc2l0aXZlIGludGVnZXIgdXBvbiBmYWlsdXJlLgorCisuU0ggU0VFIEFMU08KKy5CUiB0aXBjICg4KSwKKy5CUiB0aXBjLWJlYXJlciAoOCksCisuQlIgdGlwYy1saW5rICg4KSwKKy5CUiB0aXBjLW1lZGlhICg4KSwKKy5CUiB0aXBjLW5hbWV0YWJsZSAoOCksCisuQlIgdGlwYy1wZWVyICg4KSwKKy5CUiB0aXBjLXNvY2tldCAoOCkKKy5icgorLlNIIFJFUE9SVElORyBCVUdTCitSZXBvcnQgYW55IGJ1Z3MgdG8gdGhlIE5ldHdvcmsgRGV2ZWxvcGVycyBtYWlsaW5nIGxpc3QKKy5CIDxuZXRkZXZAdmdlci5rZXJuZWwub3JnPgord2hlcmUgdGhlIGRldmVsb3BtZW50IGFuZCBtYWludGVuYW5jZSBpcyBwcmltYXJpbHkgZG9uZS4KK1lvdSBkbyBub3QgaGF2ZSB0byBiZSBzdWJzY3JpYmVkIHRvIHRoZSBsaXN0IHRvIHNlbmQgYSBtZXNzYWdlIHRoZXJlLgorCisuU0ggQVVUSE9SCitSaWNoYXJkIEFscGUgPHJpY2hhcmQuYWxwZUBlcmljc3Nvbi5jb20+CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9tYW4vbWFuOC90aXBjLXBlZXIuOCBiL2lwcm91dGUyL21hbi9tYW44L3RpcGMtcGVlci44Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMDY1MWYKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9tYW4vbWFuOC90aXBjLXBlZXIuOApAQCAtMCwwICsxLDUyIEBACisuVEggVElQQy1QRUVSIDggIjA0IERlYyAyMDE1IiAiaXByb3V0ZTIiICJMaW51eCIKKworLlwiIEZvciBjb25zaXN0ZW5jeSwgcGxlYXNlIGtlZXAgcGFkZGluZyByaWdodCBhbGlnbmVkLgorLlwiIEZvciBleGFtcGxlICcuQiAiZm9vICIgYmFyJyBhbmQgbm90ICcuQiBmb28gIiBiYXIiJworCisuU0ggTkFNRQordGlwYy1wZWVyIFwtIG1vZGlmeSBwZWVyIGluZm9ybWF0aW9uCisKKy5TSCBTWU5PUFNJUworLmFkIGwKKy5pbiArOAorCisudGkgLTgKKy5CIHRpcGMgcGVlciByZW1vdmUgYWRkcmVzcworLklSIEFERFJFU1MKKworLlNIIE9QVElPTlMKK09wdGlvbnMgKGZsYWdzKSB0aGF0IGNhbiBiZSBwYXNzZWQgYW55d2hlcmUgaW4gdGhlIGNvbW1hbmQgY2hhaW4uCisuVFAKKy5CUiAiXC1oIiAsICIgLS1oZWxwIgorU2hvdyBoZWxwIGFib3V0IGxhc3QgdmFsaWQgY29tbWFuZC4gRm9yIGV4YW1wbGUKKy5CIHRpcGMgcGVlciAtLWhlbHAKK3dpbGwgc2hvdyBwZWVyIGhlbHAgYW5kCisuQiB0aXBjIC0taGVscAord2lsbCBzaG93IGdlbmVyYWwgaGVscC4gVGhlIHBvc2l0aW9uIG9mIHRoZSBvcHRpb24gaW4gdGhlIHN0cmluZyBpcyBpcnJlbGV2YW50LgorLlNIIERFU0NSSVBUSU9OCisKKy5TUyBQZWVyIHJlbW92ZQorUmVtb3ZlIGFuIG9mZmxpbmUgcGVlciBub2RlIGZyb20gdGhlIGxvY2FsIGRhdGEgc3RydWN0dXJlcy4gVGhlIHBlZXIgaXMKK2lkZW50aWZpZWQgYnkgaXRzCisuQiBhZGRyZXNzCisKKy5TSCBFWElUIFNUQVRVUworRXhpdCBzdGF0dXMgaXMgMCBpZiBjb21tYW5kIHdhcyBzdWNjZXNzZnVsIG9yIGEgcG9zaXRpdmUgaW50ZWdlciB1cG9uIGZhaWx1cmUuCisKKy5TSCBTRUUgQUxTTworLkJSIHRpcGMgKDgpLAorLkJSIHRpcGMtYmVhcmVyICg4KSwKKy5CUiB0aXBjLWxpbmsgKDgpLAorLkJSIHRpcGMtbWVkaWEgKDgpLAorLkJSIHRpcGMtbmFtZXRhYmxlICg4KSwKKy5CUiB0aXBjLW5vZGUgKDgpLAorLkJSIHRpcGMtc29ja2V0ICg4KQorLmJyCisuU0ggUkVQT1JUSU5HIEJVR1MKK1JlcG9ydCBhbnkgYnVncyB0byB0aGUgTmV0d29yayBEZXZlbG9wZXJzIG1haWxpbmcgbGlzdAorLkIgPG5ldGRldkB2Z2VyLmtlcm5lbC5vcmc+Cit3aGVyZSB0aGUgZGV2ZWxvcG1lbnQgYW5kIG1haW50ZW5hbmNlIGlzIHByaW1hcmlseSBkb25lLgorWW91IGRvIG5vdCBoYXZlIHRvIGJlIHN1YnNjcmliZWQgdG8gdGhlIGxpc3QgdG8gc2VuZCBhIG1lc3NhZ2UgdGhlcmUuCisKKy5TSCBBVVRIT1IKK1JpY2hhcmQgQWxwZSA8cmljaGFyZC5hbHBlQGVyaWNzc29uLmNvbT4KZGlmZiAtLWdpdCBhL2lwcm91dGUyL21hbi9tYW44L3RpcGMtc29ja2V0LjggYi9pcHJvdXRlMi9tYW4vbWFuOC90aXBjLXNvY2tldC44Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZWMxZTUKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9tYW4vbWFuOC90aXBjLXNvY2tldC44CkBAIC0wLDAgKzEsNTkgQEAKKy5USCBUSVBDLVNPQ0tFVCA4ICIwMiBKdW4gMjAxNSIgImlwcm91dGUyIiAiTGludXgiCisKKy5cIiBGb3IgY29uc2lzdGVuY3ksIHBsZWFzZSBrZWVwIHBhZGRpbmcgcmlnaHQgYWxpZ25lZC4KKy5cIiBGb3IgZXhhbXBsZSAnLkIgImZvbyAiIGJhcicgYW5kIG5vdCAnLkIgZm9vICIgYmFyIicKKworLlNIIE5BTUUKK3RpcGMtc29ja2V0IFwtIHNob3cgVElQQyBzb2NrZXQgKHBvcnQpIGluZm9ybWF0aW9uCisKKy5TSCBTWU5PUFNJUworLmFkIGwKKy5pbiArOAorCisudGkgLTgKKy5CIHRpcGMgc29ja2V0IGxpc3QKKworLlNIIE9QVElPTlMKK09wdGlvbnMgKGZsYWdzKSB0aGF0IGNhbiBiZSBwYXNzZWQgYW55d2hlcmUgaW4gdGhlIGNvbW1hbmQgY2hhaW4uCisuVFAKKy5CUiAiXC1oIiAsICIgLS1oZWxwIgorU2hvdyBoZWxwIGFib3V0IGxhc3QgdmFsaWQgY29tbWFuZC4gRm9yIGV4YW1wbGUKKy5CIHRpcGMgc29ja2V0IC0taGVscAord2lsbCBzaG93IHNvY2tldCBoZWxwIGFuZAorLkIgdGlwYyAtLWhlbHAKK3dpbGwgc2hvdyBnZW5lcmFsIGhlbHAuIFRoZSBwb3NpdGlvbiBvZiB0aGUgb3B0aW9uIGluIHRoZSBzdHJpbmcgaXMgaXJyZWxldmFudC4KKworLlNIIERFU0NSSVBUSU9OCitBIFRJUEMgc29ja2V0IGlzIHJlcHJlc2VudGVkIGJ5IGFuIHVuc2lnbmVkIGludGVnZXIuCisKKy5UUAorLlNTIEJvdW5kIHN0YXRlCitBIGJvdW5kIHNvY2tldCBoYXMgYSBsb2dpY2FsIFRJUEMgcG9ydCBuYW1lIGFzc29jaWF0ZWQgd2l0aCBpdC4KKworLlRQCisuU1MgQ29ubmVjdGVkIHN0YXRlCitBIGNvbm5lY3RlZCBzb2NrZXQgaXMgZGlyZWN0bHkgY29ubmVjdGVkIHRvIGFub3RoZXIgc29ja2V0IGNyZWF0aW5nIGEgcG9pbnQKK3RvIHBvaW50IGNvbm5lY3Rpb24gYmV0d2VlbiBUSVBDIHNvY2tldHMuIElmIHRoZSBjb25uZWN0aW9uIHRvIFggd2FzIG1hZGUgdXNpbmcKK2EgbG9naWNhbCBwb3J0IG5hbWUgWSB0aGF0IG5hbWUgd2lsbCBzaG93IHVwIGFzCisuQlIgImNvbm5lY3RlZCB0byAiICJYICIgInZpYSAiIFkKKy4KKworLlNIIEVYSVQgU1RBVFVTCitFeGl0IHN0YXR1cyBpcyAwIGlmIGNvbW1hbmQgd2FzIHN1Y2Nlc3NmdWwgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIHVwb24gZmFpbHVyZS4KKworLlNIIFNFRSBBTFNPCisuQlIgdGlwYyAoOCksCisuQlIgdGlwYy1iZWFyZXIgKDgpCisuQlIgdGlwYy1saW5rICg4KSwKKy5CUiB0aXBjLW1lZGlhICg4KSwKKy5CUiB0aXBjLW5hbWV0YWJsZSAoOCksCisuQlIgdGlwYy1ub2RlICg4KSwKKy5icgorLlNIIFJFUE9SVElORyBCVUdTCitSZXBvcnQgYW55IGJ1Z3MgdG8gdGhlIE5ldHdvcmsgRGV2ZWxvcGVycyBtYWlsaW5nIGxpc3QKKy5CIDxuZXRkZXZAdmdlci5rZXJuZWwub3JnPgord2hlcmUgdGhlIGRldmVsb3BtZW50IGFuZCBtYWludGVuYW5jZSBpcyBwcmltYXJpbHkgZG9uZS4KK1lvdSBkbyBub3QgaGF2ZSB0byBiZSBzdWJzY3JpYmVkIHRvIHRoZSBsaXN0IHRvIHNlbmQgYSBtZXNzYWdlIHRoZXJlLgorCisuU0ggQVVUSE9SCitSaWNoYXJkIEFscGUgPHJpY2hhcmQuYWxwZUBlcmljc3Nvbi5jb20+CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9tYW4vbWFuOC90aXBjLjggYi9pcHJvdXRlMi9tYW4vbWFuOC90aXBjLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI5NDNmYQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21hbi9tYW44L3RpcGMuOApAQCAtMCwwICsxLDEwMCBAQAorLlRIIFRJUEMgOCAiMDIgSnVuIDIwMTUiICJpcHJvdXRlMiIgIkxpbnV4IgorLlNIIE5BTUUKK3RpcGMgXC0gYSBUSVBDIGNvbmZpZ3VyYXRpb24gYW5kIG1hbmFnZW1lbnQgdG9vbAorLlNIIFNZTk9QU0lTCisKKy5hZCBsCisuaW4gKzgKKy50aSAtOAorLkIgdGlwYworLlJJICJbICIgT1BUSU9OUyAiIF0gIiBDT01NQU5EICIgIiBBUkdVTUVOVFMgIgorLnNwCisKKy50aSAtOAorLklSIENPTU1BTkQgIiA6PSB7ICIKKy5CUiBiZWFyZXIgIiB8ICIgbGluayAiIHwgIiBtZWRpYSAiIHwgIiBuYW1ldGFibGUgIiB8ICIgbm9kZSAiIHwgIiBzb2NrZXQgIiB9Cisuc3AKKworLnRpIC04CisuSVIgT1BUSU9OUyAiIDo9IHsgIgorXGZCXC1oXGZSW1xmSWhlbHBcZlJdIH0KKworLlNIIERFU0NSSVBUSU9OCitUaGUgVHJhbnNwYXJlbnQgSW50ZXItUHJvY2VzcyBDb21tdW5pY2F0aW9uIChUSVBDKSBwcm90b2NvbCBvZmZlcnMgdG90YWwgYWRkcmVzcwordHJhbnNwYXJlbmN5IGJldHdlZW4gcHJvY2Vzc2VzIHdoaWNoIGFsbG93cyBhcHBsaWNhdGlvbnMgaW4gYSBjbHVzdGVyZWQgY29tcHV0ZXIKK2Vudmlyb25tZW50IHRvIGNvbW11bmljYXRlIHF1aWNrbHkgYW5kIHJlbGlhYmx5IHdpdGggZWFjaCBvdGhlciwgcmVnYXJkbGVzcyBvZgordGhlaXIgbG9jYXRpb24gd2l0aGluIHRoZSBjbHVzdGVyLgorCitUSVBDIG9yaWdpbmF0ZWQgYXQgdGhlIHRlbGVjb21tdW5pY2F0aW9ucyBtYW51ZmFjdHVyZXIgRXJpY3Nzb24uIFRoZSBmaXJzdCBvcGVuCitzb3VyY2UgdmVyc2lvbiBvZiBUSVBDIHdhcyBjcmVhdGVkIGluIDIwMDAgd2hlbiBFcmljc3NvbiByZWxlYXNlZCBpdHMgZmlyc3QKK0xpbnV4IHZlcnNpb24gb2YgVElQQy4gVElQQyB3YXMgaW50cm9kdWNlZCBpbiB0aGUgbWFpbmxpbmUgTGludXgga2VybmVsIGluIDIwMDYKK2FuZCBpcyBub3cgd2lkZWx5IHVzZWQgYm90aCB3aXRoaW4gYW5kIG91dHNpZGUgb2YgRXJpY3Nzb24uCisKKy5TSCBPUFRJT05TCisKKy5UUAorLkJSICJcLWgiICwgIiAtLWhlbHAiCitTaG93IGhlbHAgYWJvdXQgbGFzdCBnaXZlbiBjb21tYW5kLiBGb3IgZXhhbXBsZQorLkIgdGlwYyBiZWFyZXIgLS1oZWxwCit3aWxsIHNob3cgYmVhcmVyIGhlbHAgYW5kCisuQiB0aXBjIC0taGVscAord2lsbCBzaG93IGdlbmVyYWwgaGVscC4gVGhlIHBvc2l0aW9uIG9mIHRoZSBvcHRpb24gaW4gdGhlIHN0cmluZyBpcyBpcnJlbGV2YW50LgorCisuU0ggQ09NTUFORFMKKworLlRQCisuQiBCRUFSRVIKKy0gU2hvdyBvciBtb2RpZnkgVElQQyBiZWFyZXJzCisKKy5UUAorLkIgTElOSworLSBTaG93IG9yIG1vZGlmeSBUSVBDIGxpbmtzCisKKy5UUAorLkIgTUVESUEKKy0gU2hvdyBvciBtb2RpZnkgVElQQyBtZWRpYQorCisuVFAKKy5CIE5BTUVUQUJMRQorLSBTaG93IFRJUEMgbmFtZXRhYmxlCisKKy5UUAorLkIgTk9ERQorLSBTaG93IG9yIG1vZGlmeSBUSVBDIG5vZGUgcGFyYW1ldGVycworCisuVFAKKy5CIFNPQ0tFVAorLSBTaG93IFRJUEMgc29ja2V0cworCisuU0ggQVJHVU1FTlRTCisKK0NvbW1hbmQgYXJndW1lbnRzIGFyZSBkZXNjcmliZWQgaW4gYSBjb21tYW5kIHNwZWNpZmljIG1hbiBwYWdlIGFuZCB0eXBpY2FsbHkKK2NvbnNpc3RzIG9mIG5lc3RlZCBjb21tYW5kcyBhbG9uZyB3aXRoIGtleSB2YWx1ZSBwYWlycy4KK0lmIG5vIGFyZ3VtZW50cyBhcmUgZ2l2ZW4gYSBjb21tYW5kIHR5cGljYWxseSBzaG93cyBpdHMgaGVscCB0ZXh0LiBUaGUgZXhwbGljaXQKK2hlbHAgb3B0aW9uCisuQiAtaAorb3IKKy5CIC0taGVscAorY2FuIG9jY3VyIGFueXdoZXJlIGFtb25nIHRoZSBhcmd1bWVudHMgYW5kIHdpbGwgc2hvdyBoZWxwIGZvciB0aGUgbGFzdCB2YWxpZAorY29tbWFuZCBnaXZlbi4KKworLlNIIEVYSVQgU1RBVFVTCitFeGl0IHN0YXR1cyBpcyAwIGlmIGNvbW1hbmQgd2FzIHN1Y2Nlc3NmdWwgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIHVwb24gZmFpbHVyZS4KKworLlNIIFNFRSBBTFNPCisuQlIgdGlwYy1iZWFyZXIgKDgpLAorLkJSIHRpcGMtbGluayAoOCksCisuQlIgdGlwYy1tZWRpYSAoOCksCisuQlIgdGlwYy1uYW1ldGFibGUgKDgpLAorLkJSIHRpcGMtbm9kZSAoOCksCisuQlIgdGlwYy1wZWVyICg4KSwKKy5CUiB0aXBjLXNvY2tldCAoOCkKKy5icgorLlNIIFJFUE9SVElORyBCVUdTCitSZXBvcnQgYW55IGJ1Z3MgdG8gdGhlIE5ldHdvcmsgRGV2ZWxvcGVycyBtYWlsaW5nIGxpc3QKKy5CIDxuZXRkZXZAdmdlci5rZXJuZWwub3JnPgord2hlcmUgdGhlIGRldmVsb3BtZW50IGFuZCBtYWludGVuYW5jZSBpcyBwcmltYXJpbHkgZG9uZS4KK1lvdSBkbyBub3QgaGF2ZSB0byBiZSBzdWJzY3JpYmVkIHRvIHRoZSBsaXN0IHRvIHNlbmQgYSBtZXNzYWdlIHRoZXJlLgorCisuU0ggQVVUSE9SCitSaWNoYXJkIEFscGUgPHJpY2hhcmQuYWxwZUBlcmljc3Nvbi5jb20+CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9taXNjL0FuZHJvaWQubWsgYi9pcHJvdXRlMi9taXNjL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg2Nzg5NQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21pc2MvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM3IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQorCitMT0NBTF9TUkNfRklMRVMgOj0gc3MuYyBzc2ZpbHRlci55CisKK0xPQ0FMX01PRFVMRSA6PSBzcworCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBkZWJ1ZworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmlwcm91dGV1dGlsIGxpYm5ldGxpbmsKKworTE9DQUxfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpLy4uL2luY2x1ZGUKKworIyMKKyMgIi14IGMiIGZvcmNlcyB0aGUgbGV4L3lhY2MgZmlsZXMgdG8gYmUgY29tcGlsZWQgYXMgYyB0aGUgYnVpbGQgc3lzdGVtCisjIG90aGVyd2lzZSBmb3JjZXMgdGhlbSB0byBiZSBjKysuCit5YWNjX2ZsYWdzIDo9IC14IGMKKworTE9DQUxfQ0ZMQUdTIDo9IFwKKyAgICAtTzIgLWcgXAorICAgIC1XIC1XYWxsIFwKKyAgICAtV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIFwKKyAgICAtV25vLXNpZ24tY29tcGFyZSBcCisgICAgLVduby10YXV0b2xvZ2ljYWwtcG9pbnRlci1jb21wYXJlIFwKKyAgICAtV25vLXVudXNlZC1wYXJhbWV0ZXIgXAorICAgIC1XZXJyb3IgXAorICAgICctRHNldGhvc3RlbnQoeCk9JyBcCisgICAgJCh5YWNjX2ZsYWdzKSBcCisgICAgLURIQVZFX1NFVE5TCisKK0xPQ0FMX0NQUEZMQUdTIDo9ICQoeWFjY19mbGFncykKKworTE9DQUxfTERGTEFHUyA6PSAtV2wsLWV4cG9ydC1keW5hbWljCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWlzYy9NYWtlZmlsZSBiL2lwcm91dGUyL21pc2MvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUwZTc0MAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21pc2MvTWFrZWZpbGUKQEAgLTAsMCArMSw0OCBAQAorU1NPQko9c3MubyBzc2ZpbHRlci5vCitMTlNUQVRPQko9bG5zdGF0Lm8gbG5zdGF0X3V0aWwubworCitUQVJHRVRTPXNzIG5zdGF0IGlmc3RhdCBydGFjY3QgbG5zdGF0CisKK2luY2x1ZGUgLi4vQ29uZmlnCisKK2lmZXEgKCQoSEFWRV9CRVJLRUxFWV9EQikseSkKKwlUQVJHRVRTICs9IGFycGQKK2VuZGlmCisKK2lmZXEgKCQoSEFWRV9TRUxJTlVYKSx5KQorCUxETElCUyArPSAkKHNoZWxsICQoUEtHX0NPTkZJRykgLS1saWJzIGxpYnNlbGludXgpCisJQ0ZMQUdTICs9ICQoc2hlbGwgJChQS0dfQ09ORklHKSAtLWNmbGFncyBsaWJzZWxpbnV4KSAtREhBVkVfU0VMSU5VWAorZW5kaWYKKworaWZlcSAoJChJUF9DT05GSUdfU0VUTlMpLHkpCisJQ0ZMQUdTICs9IC1ESEFWRV9TRVROUworZW5kaWYKKworYWxsOiAkKFRBUkdFVFMpCisKK3NzOiAkKFNTT0JKKQorCituc3RhdDogbnN0YXQuYworCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vIG5zdGF0IG5zdGF0LmMgJChMSUJORVRMSU5LKSAtbG0KKworaWZzdGF0OiBpZnN0YXQuYworCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vIGlmc3RhdCBpZnN0YXQuYyAkKExJQk5FVExJTkspIC1sbQorCitydGFjY3Q6IHJ0YWNjdC5jCisJJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gcnRhY2N0IHJ0YWNjdC5jICQoTElCTkVUTElOSykgLWxtCisKK2FycGQ6IGFycGQuYworCSQoQ0MpICQoQ0ZMQUdTKSAtSSQoREJNX0lOQ0xVREUpICQoTERGTEFHUykgLW8gYXJwZCBhcnBkLmMgJChMSUJORVRMSU5LKSAtbGRiIC1scHRocmVhZAorCitzc2ZpbHRlci5jOiBzc2ZpbHRlci55CisJYmlzb24gc3NmaWx0ZXIueSAtbyBzc2ZpbHRlci5jCisKK2xuc3RhdDogJChMTlNUQVRPQkopCisKK2luc3RhbGw6IGFsbAorCWluc3RhbGwgLW0gMDc1NSAkKFRBUkdFVFMpICQoREVTVERJUikkKFNCSU5ESVIpCisJbG4gLXNmIGxuc3RhdCAkKERFU1RESVIpJChTQklORElSKS9ydHN0YXQKKwlsbiAtc2YgbG5zdGF0ICQoREVTVERJUikkKFNCSU5ESVIpL2N0c3RhdAorCitjbGVhbjoKKwlybSAtZiAqLm8gJChUQVJHRVRTKSBzc2ZpbHRlci5jCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9taXNjL2FycGQuYyBiL2lwcm91dGUyL21pc2MvYXJwZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYjliZDEKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9taXNjL2FycGQuYwpAQCAtMCwwICsxLDg0MSBAQAorLyoKKyAqIGFycGQuYwlBUlAgaGVscGVyIGRhZW1vbi4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxkYl8xODUuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfcGFja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+CisKKyNpbmNsdWRlICJsaWJuZXRsaW5rLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJydF9uYW1lcy5oIgorCitpbnQgcmVzb2x2ZV9ob3N0czsKKworREIJKmRiYXNlOworY2hhcgkqZGJuYW1lID0gIi92YXIvbGliL2FycGQvYXJwZC5kYiI7CisKK2ludAlpZm51bTsKK2ludAkqaWZ2ZWM7CitjaGFyCSoqaWZuYW1lczsKKworc3RydWN0IGRia2V5Cit7CisJX191MzIJaWZhY2U7CisJX191MzIJYWRkcjsKK307CisKKyNkZWZpbmUgSVNfTkVHKHgpCSgoKF9fdTgqKSh4KSlbMF0gPT0gMHhGRikKKyNkZWZpbmUgTkVHX1RJTUUoeCkJKCgoeClbMl08PDI0KXwoKHgpWzNdPDwxNil8KCh4KVs0XTw8OCl8KHgpWzVdKQorI2RlZmluZSBORUdfQUdFKHgpCSgoX191MzIpdGltZShOVUxMKSAtIE5FR19USU1FKChfX3U4Kil4KSkKKyNkZWZpbmUgTkVHX1ZBTElEKHgpCShORUdfQUdFKHgpIDwgbmVnYXRpdmVfdGltZW91dCkKKyNkZWZpbmUgTkVHX0NOVCh4KQkoKChfX3U4KikoeCkpWzFdKQorCitzdHJ1Y3QgcnRubF9oYW5kbGUgcnRoOworCitzdHJ1Y3QgcG9sbGZkIHBzZXRbMl07CitpbnQgdWRwX3NvY2sgPSAtMTsKKwordm9sYXRpbGUgaW50IGRvX2V4aXQ7Cit2b2xhdGlsZSBpbnQgZG9fc3luYzsKK3ZvbGF0aWxlIGludCBkb19zdGF0czsKKworc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGFycF9uZXc7CisJdW5zaWduZWQgbG9uZyBhcnBfY2hhbmdlOworCisJdW5zaWduZWQgbG9uZyBhcHBfcmVjdjsKKwl1bnNpZ25lZCBsb25nIGFwcF9zdWNjZXNzOworCXVuc2lnbmVkIGxvbmcgYXBwX2JhZDsKKwl1bnNpZ25lZCBsb25nIGFwcF9uZWc7CisJdW5zaWduZWQgbG9uZyBhcHBfc3VwcHJlc3NlZDsKKworCXVuc2lnbmVkIGxvbmcga2Vybl9uZWc7CisJdW5zaWduZWQgbG9uZyBrZXJuX25ldzsKKwl1bnNpZ25lZCBsb25nIGtlcm5fY2hhbmdlOworCisJdW5zaWduZWQgbG9uZyBwcm9iZXNfc2VudDsKKwl1bnNpZ25lZCBsb25nIHByb2Jlc19zdXBwcmVzc2VkOworfSBzdGF0czsKKworaW50IGFjdGl2ZV9wcm9iaW5nOworaW50IG5lZ2F0aXZlX3RpbWVvdXQgPSA2MDsKK2ludCBub19rZXJuZWxfYnJvYWRjYXN0czsKK2ludCBicm9hZGNhc3RfcmF0ZSA9IDEwMDA7CitpbnQgYnJvYWRjYXN0X2J1cnN0ID0gMzAwMDsKK2ludCBwb2xsX3RpbWVvdXQgPSAzMDAwMDsKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwKKwkJIlVzYWdlOiBhcnBkIFsgLWxraD8gXSBbIC1hIE4gXSBbIC1iIGRiYXNlIF0gWyAtQiBudW1iZXIgXSIKKwkJIiBbIC1mIGZpbGUgXSBbIC1uIHRpbWUgXSBbLXAgaW50ZXJ2YWwgXSBbIC1SIHJhdGUgXSBbIGludGVyZmFjZXMgXVxuIik7CisJZXhpdCgxKTsKK30KKworc3RhdGljIGludCBoYW5kbGVfaWYoaW50IGlmaW5kZXgpCit7CisJaW50IGk7CisKKwlpZiAoaWZudW0gPT0gMCkKKwkJcmV0dXJuIDE7CisKKwlmb3IgKGk9MDsgaTxpZm51bTsgaSsrKQorCQlpZiAoaWZ2ZWNbaV0gPT0gaWZpbmRleCkKKwkJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitpbnQgc3lzY3RsX2FkanVzdGVkOworCitzdGF0aWMgdm9pZCBkb19zeXNjdGxfYWRqdXN0bWVudHModm9pZCkKK3sKKwlpbnQgaTsKKworCWlmICghaWZudW0pCisJCXJldHVybjsKKworCWZvciAoaT0wOyBpPGlmbnVtOyBpKyspIHsKKwkJY2hhciBidWZbMTI4XTsKKwkJRklMRSAqZnA7CisKKwkJaWYgKGFjdGl2ZV9wcm9iaW5nKSB7CisJCQlzcHJpbnRmKGJ1ZiwgIi9wcm9jL3N5cy9uZXQvaXB2NC9uZWlnaC8lcy9tY2FzdF9zb2xpY2l0IiwgaWZuYW1lc1tpXSk7CisJCQlpZiAoKGZwID0gZm9wZW4oYnVmLCAidyIpKSAhPSBOVUxMKSB7CisJCQkJaWYgKG5vX2tlcm5lbF9icm9hZGNhc3RzKQorCQkJCQlzdHJjcHkoYnVmLCAiMFxuIik7CisJCQkJZWxzZQorCQkJCQlzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBhY3RpdmVfcHJvYmluZz49MiA/IDEgOiAzLWFjdGl2ZV9wcm9iaW5nKTsKKwkJCQlmcHV0cyhidWYsIGZwKTsKKwkJCQlmY2xvc2UoZnApOworCQkJfQorCQl9CisKKwkJc3ByaW50ZihidWYsICIvcHJvYy9zeXMvbmV0L2lwdjQvbmVpZ2gvJXMvYXBwX3NvbGljaXQiLCBpZm5hbWVzW2ldKTsKKwkJaWYgKChmcCA9IGZvcGVuKGJ1ZiwgInciKSkgIT0gTlVMTCkgeworCQkJc3ByaW50ZihidWYsICIlZFxuIiwgYWN0aXZlX3Byb2Jpbmc8PTEgPyAxIDogYWN0aXZlX3Byb2JpbmcpOworCQkJZnB1dHMoYnVmLCBmcCk7CisJCQlmY2xvc2UoZnApOworCQl9CisJfQorCXN5c2N0bF9hZGp1c3RlZCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHVuZG9fc3lzY3RsX2FkanVzdG1lbnRzKHZvaWQpCit7CisJaW50IGk7CisKKwlpZiAoIXN5c2N0bF9hZGp1c3RlZCkKKwkJcmV0dXJuOworCisJZm9yIChpPTA7IGk8aWZudW07IGkrKykgeworCQljaGFyIGJ1ZlsxMjhdOworCQlGSUxFICpmcDsKKworCQlpZiAoYWN0aXZlX3Byb2JpbmcpIHsKKwkJCXNwcmludGYoYnVmLCAiL3Byb2Mvc3lzL25ldC9pcHY0L25laWdoLyVzL21jYXN0X3NvbGljaXQiLCBpZm5hbWVzW2ldKTsKKwkJCWlmICgoZnAgPSBmb3BlbihidWYsICJ3IikpICE9IE5VTEwpIHsKKwkJCQlzdHJjcHkoYnVmLCAiM1xuIik7CisJCQkJZnB1dHMoYnVmLCBmcCk7CisJCQkJZmNsb3NlKGZwKTsKKwkJCX0KKwkJfQorCQlzcHJpbnRmKGJ1ZiwgIi9wcm9jL3N5cy9uZXQvaXB2NC9uZWlnaC8lcy9hcHBfc29saWNpdCIsIGlmbmFtZXNbaV0pOworCQlpZiAoKGZwID0gZm9wZW4oYnVmLCAidyIpKSAhPSBOVUxMKSB7CisJCQlzdHJjcHkoYnVmLCAiMFxuIik7CisJCQlmcHV0cyhidWYsIGZwKTsKKwkJCWZjbG9zZShmcCk7CisJCX0KKwl9CisJc3lzY3RsX2FkanVzdGVkID0gMDsKK30KKworCitzdGF0aWMgaW50IHNlbmRfcHJvYmUoaW50IGlmaW5kZXgsIF9fdTMyIGFkZHIpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gZHN0OworCXNvY2tsZW5fdCBsZW47CisJdW5zaWduZWQgY2hhciBidWZbMjU2XTsKKwlzdHJ1Y3QgYXJwaGRyICphaCA9IChzdHJ1Y3QgYXJwaGRyKilidWY7CisJdW5zaWduZWQgY2hhciAqcCA9ICh1bnNpZ25lZCBjaGFyICopKGFoKzEpOworCXN0cnVjdCBzb2NrYWRkcl9sbCBzbGw7CisKKwltZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOworCWlmci5pZnJfaWZpbmRleCA9IGlmaW5kZXg7CisJaWYgKGlvY3RsKHVkcF9zb2NrLCBTSU9DR0lGTkFNRSwgJmlmcikpCisJCXJldHVybiAtMTsKKwlpZiAoaW9jdGwodWRwX3NvY2ssIFNJT0NHSUZIV0FERFIsICZpZnIpKQorCQlyZXR1cm4gLTE7CisJaWYgKGlmci5pZnJfaHdhZGRyLnNhX2ZhbWlseSAhPSBBUlBIUkRfRVRIRVIpCisJCXJldHVybiAtMTsKKwlpZiAoc2V0c29ja29wdCh1ZHBfc29jaywgU09MX1NPQ0tFVCwgU09fQklORFRPREVWSUNFLCBpZnIuaWZyX25hbWUsIHN0cmxlbihpZnIuaWZyX25hbWUpKzEpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJZHN0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWRzdC5zaW5fcG9ydCA9IGh0b25zKDEwMjUpOworCWRzdC5zaW5fYWRkci5zX2FkZHIgPSBhZGRyOworCWlmIChjb25uZWN0KHVkcF9zb2NrLCAoc3RydWN0IHNvY2thZGRyKikmZHN0LCBzaXplb2YoZHN0KSkgPCAwKQorCQlyZXR1cm4gLTE7CisJbGVuID0gc2l6ZW9mKGRzdCk7CisJaWYgKGdldHNvY2tuYW1lKHVkcF9zb2NrLCAoc3RydWN0IHNvY2thZGRyKikmZHN0LCAmbGVuKSA8IDApCisJCXJldHVybiAtMTsKKworCWFoLT5hcl9ocmQgPSBodG9ucyhpZnIuaWZyX2h3YWRkci5zYV9mYW1pbHkpOworCWFoLT5hcl9wcm8gPSBodG9ucyhFVEhfUF9JUCk7CisJYWgtPmFyX2hsbiA9IDY7CisJYWgtPmFyX3BsbiA9IDQ7CisJYWgtPmFyX29wICA9IGh0b25zKEFSUE9QX1JFUVVFU1QpOworCisJbWVtY3B5KHAsIGlmci5pZnJfaHdhZGRyLnNhX2RhdGEsIGFoLT5hcl9obG4pOworCXAgKz0gYWgtPmFyX2hsbjsKKworCW1lbWNweShwLCAmZHN0LnNpbl9hZGRyLCA0KTsKKwlwKz00OworCisJc2xsLnNsbF9mYW1pbHkgPSBBRl9QQUNLRVQ7CisJbWVtc2V0KHNsbC5zbGxfYWRkciwgMHhGRiwgc2l6ZW9mKHNsbC5zbGxfYWRkcikpOworCXNsbC5zbGxfaWZpbmRleCA9IGlmaW5kZXg7CisJc2xsLnNsbF9wcm90b2NvbCA9IGh0b25zKEVUSF9QX0FSUCk7CisJbWVtY3B5KHAsICZzbGwuc2xsX2FkZHIsIGFoLT5hcl9obG4pOworCXArPWFoLT5hcl9obG47CisKKwltZW1jcHkocCwgJmFkZHIsIDQpOworCXArPTQ7CisKKwlpZiAoc2VuZHRvKHBzZXRbMF0uZmQsIGJ1ZiwgcC1idWYsIDAsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzbGwsIHNpemVvZihzbGwpKSA8IDApCisJCXJldHVybiAtMTsKKwlzdGF0cy5wcm9iZXNfc2VudCsrOworCXJldHVybiAwOworfQorCisvKiBCZSB2ZXJ5IHRvdWdoIG9uIHNlbmRpbmcgcHJvYmVzOiAxIHBlciBzZWNvbmQgd2l0aCBidXJzdCBvZiAzLiAqLworCitzdGF0aWMgaW50IHF1ZXVlX2FjdGl2ZV9wcm9iZShpbnQgaWZpbmRleCwgX191MzIgYWRkcikKK3sKKwlzdGF0aWMgc3RydWN0IHRpbWV2YWwgcHJldjsKKwlzdGF0aWMgaW50IGJ1Y2tldHM7CisJc3RydWN0IHRpbWV2YWwgbm93OworCisJZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpOworCWlmIChwcmV2LnR2X3NlYykgeworCQlpbnQgZGlmZiA9IChub3cudHZfc2VjLXByZXYudHZfc2VjKSoxMDAwKyhub3cudHZfdXNlYy1wcmV2LnR2X3VzZWMpLzEwMDA7CisJCWJ1Y2tldHMgKz0gZGlmZjsKKwl9IGVsc2UgeworCQlidWNrZXRzID0gYnJvYWRjYXN0X2J1cnN0OworCX0KKwlpZiAoYnVja2V0cyA+IGJyb2FkY2FzdF9idXJzdCkKKwkJYnVja2V0cyA9IGJyb2FkY2FzdF9idXJzdDsKKwlpZiAoYnVja2V0cyA+PSBicm9hZGNhc3RfcmF0ZSAmJiAhc2VuZF9wcm9iZShpZmluZGV4LCBhZGRyKSkgeworCQlidWNrZXRzIC09IGJyb2FkY2FzdF9yYXRlOworCQlwcmV2ID0gbm93OworCQlyZXR1cm4gMDsKKwl9CisJc3RhdHMucHJvYmVzX3N1cHByZXNzZWQrKzsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgcmVzcG9uZF90b19rZXJuZWwoaW50IGlmaW5kZXgsIF9fdTMyIGFkZHIsIGNoYXIgKmxsYSwgaW50IGxsYWxlbikKK3sKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgbmxtc2doZHIgCW47CisJCXN0cnVjdCBuZG1zZyAJCW5kbTsKKwkJY2hhciAgIAkJCWJ1ZlsyNTZdOworCX0gcmVxOworCisJbWVtc2V0KCZyZXEubiwgMCwgc2l6ZW9mKHJlcS5uKSk7CisJbWVtc2V0KCZyZXEubmRtLCAwLCBzaXplb2YocmVxLm5kbSkpOworCisJcmVxLm4ubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgbmRtc2cpKTsKKwlyZXEubi5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1Q7CisJcmVxLm4ubmxtc2dfdHlwZSA9IFJUTV9ORVdORUlHSDsKKwlyZXEubmRtLm5kbV9mYW1pbHkgPSBBRl9JTkVUOworCXJlcS5uZG0ubmRtX3N0YXRlID0gTlVEX1NUQUxFOworCXJlcS5uZG0ubmRtX2lmaW5kZXggPSBpZmluZGV4OworCXJlcS5uZG0ubmRtX3R5cGUgPSBSVE5fVU5JQ0FTVDsKKworCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBOREFfRFNULCAmYWRkciwgNCk7CisJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIE5EQV9MTEFERFIsIGxsYSwgbGxhbGVuKTsKKwlyZXR1cm4gcnRubF9zZW5kKCZydGgsICZyZXEsIHJlcS5uLm5sbXNnX2xlbikgPD0gMDsKK30KKworc3RhdGljIHZvaWQgcHJlcGFyZV9uZWdfZW50cnkoX191OCAqbmRhdGEsIF9fdTMyIHN0YW1wKQoreworCW5kYXRhWzBdID0gMHhGRjsKKwluZGF0YVsxXSA9IDA7CisJbmRhdGFbMl0gPSBzdGFtcD4+MjQ7CisJbmRhdGFbM10gPSBzdGFtcD4+MTY7CisJbmRhdGFbNF0gPSBzdGFtcD4+ODsKKwluZGF0YVs1XSA9IHN0YW1wOworfQorCisKK3N0YXRpYyBpbnQgZG9fb25lX3JlcXVlc3Qoc3RydWN0IG5sbXNnaGRyICpuKQoreworCXN0cnVjdCBuZG1zZyAqbmRtID0gTkxNU0dfREFUQShuKTsKKwlpbnQgbGVuID0gbi0+bmxtc2dfbGVuOworCXN0cnVjdCBydGF0dHIgKiB0YltOREFfTUFYKzFdOworCXN0cnVjdCBkYmtleSBrZXk7CisJREJUIGRia2V5LCBkYmRhdDsKKwlpbnQgZG9fYWNjdCA9IDA7CisKKwlpZiAobi0+bmxtc2dfdHlwZSA9PSBOTE1TR19ET05FKSB7CisJCWRiYXNlLT5zeW5jKGRiYXNlLCAwKTsKKworCQkvKiBOb3cgd2UgaGF2ZSBhdCBsZWFzdCBtaXJyb3Igb2Yga2VybmVsIGRiLCBzbyB0aGF0CisJCSAqIG1heSBzdGFydCByZWFsIHJlc29sdXRpb24uCisJCSAqLworCQlkb19zeXNjdGxfYWRqdXN0bWVudHMoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG4tPm5sbXNnX3R5cGUgIT0gUlRNX0dFVE5FSUdIICYmIG4tPm5sbXNnX3R5cGUgIT0gUlRNX05FV05FSUdIKQorCQlyZXR1cm4gMDsKKworCWxlbiAtPSBOTE1TR19MRU5HVEgoc2l6ZW9mKCpuZG0pKTsKKwlpZiAobGVuIDwgMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKG5kbS0+bmRtX2ZhbWlseSAhPSBBRl9JTkVUIHx8CisJICAgIChpZm51bSAmJiAhaGFuZGxlX2lmKG5kbS0+bmRtX2lmaW5kZXgpKSB8fAorCSAgICBuZG0tPm5kbV9mbGFncyB8fAorCSAgICBuZG0tPm5kbV90eXBlICE9IFJUTl9VTklDQVNUIHx8CisJICAgICEobmRtLT5uZG1fc3RhdGUmfk5VRF9OT0FSUCkpCisJCXJldHVybiAwOworCisJcGFyc2VfcnRhdHRyKHRiLCBOREFfTUFYLCBOREFfUlRBKG5kbSksIGxlbik7CisKKwlpZiAoIXRiW05EQV9EU1RdKQorCQlyZXR1cm4gMDsKKworCWtleS5pZmFjZSA9IG5kbS0+bmRtX2lmaW5kZXg7CisJbWVtY3B5KCZrZXkuYWRkciwgUlRBX0RBVEEodGJbTkRBX0RTVF0pLCA0KTsKKwlkYmtleS5kYXRhID0gJmtleTsKKwlkYmtleS5zaXplID0gc2l6ZW9mKGtleSk7CisKKwlpZiAoZGJhc2UtPmdldChkYmFzZSwgJmRia2V5LCAmZGJkYXQsIDApICE9IDApIHsKKwkJZGJkYXQuZGF0YSA9IDA7CisJCWRiZGF0LnNpemUgPSAwOworCX0KKworCWlmIChuLT5ubG1zZ190eXBlID09IFJUTV9HRVRORUlHSCkgeworCQlpZiAoIShuLT5ubG1zZ19mbGFncyZOTE1fRl9SRVFVRVNUKSkKKwkJCXJldHVybiAwOworCisJCWlmICghKG5kbS0+bmRtX3N0YXRlJihOVURfUFJPQkV8TlVEX0lOQ09NUExFVEUpKSkgeworCQkJc3RhdHMuYXBwX2JhZCsrOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAobmRtLT5uZG1fc3RhdGUmTlVEX1BST0JFKSB7CisJCQkvKiBJZiB3ZSBnZXQgdGhpcywga2VybmVsIHN0aWxsIGhhcyBzb21lIHZhbGlkCisJCQkgKiBhZGRyZXNzLCBidXQgdW5pY2FzdCBwcm9iaW5nIGZhaWxlZCBhbmQgaG9zdAorCQkJICogaXMgZWl0aGVyIGRlYWQgb3IgY2hhbmdlZCBpdHMgbWFjIGFkZHJlc3MuCisJCQkgKiBLZXJuZWwgaXMgZ29pbmcgdG8gaW5pdGlhdGUgYnJvYWRjYXN0IHJlc29sdXRpb24uCisJCQkgKiBPSywgd2UgaW52YWxpZGF0ZSBvdXIgaW5mb3JtYXRpb24gYXMgd2VsbC4KKwkJCSAqLworCQkJaWYgKGRiZGF0LmRhdGEgJiYgIUlTX05FRyhkYmRhdC5kYXRhKSkKKwkJCQlzdGF0cy5hcHBfbmVnKys7CisKKwkJCWRiYXNlLT5kZWwoZGJhc2UsICZkYmtleSwgMCk7CisJCX0gZWxzZSB7CisJCQkvKiBJZiB3ZSBnZXQgdGhpcyBrZXJuZWwgZG9lcyBub3QgaGF2ZSBhbnkgaW5mb3JtYXRpb24uCisJCQkgKiBJZiB3ZSBoYXZlIHNvbWV0aGluZyB0ZWxsIHRoaXMgdG8ga2VybmVsLiAqLworCQkJc3RhdHMuYXBwX3JlY3YrKzsKKwkJCWlmIChkYmRhdC5kYXRhICYmICFJU19ORUcoZGJkYXQuZGF0YSkpIHsKKwkJCQlzdGF0cy5hcHBfc3VjY2VzcysrOworCQkJCXJlc3BvbmRfdG9fa2VybmVsKGtleS5pZmFjZSwga2V5LmFkZHIsIGRiZGF0LmRhdGEsIGRiZGF0LnNpemUpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQkvKiBTaGVlaXQhIFdlIGhhdmUgbm90aGluZyB0byB0ZWxsLiAqLworCQkJLyogSWYgd2UgaGF2ZSByZWNlbnQgbmVnYXRpdmUgZW50cnksIGJlIHNpbGVudC4gKi8KKwkJCWlmIChkYmRhdC5kYXRhICYmIE5FR19WQUxJRChkYmRhdC5kYXRhKSkgeworCQkJCWlmIChORUdfQ05UKGRiZGF0LmRhdGEpID49IGFjdGl2ZV9wcm9iaW5nKSB7CisJCQkJCXN0YXRzLmFwcF9zdXBwcmVzc2VkKys7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlkb19hY2N0ID0gMTsKKwkJCX0KKwkJfQorCisJCWlmIChhY3RpdmVfcHJvYmluZyAmJgorCQkgICAgcXVldWVfYWN0aXZlX3Byb2JlKG5kbS0+bmRtX2lmaW5kZXgsIGtleS5hZGRyKSA9PSAwICYmCisJCSAgICBkb19hY2N0KSB7CisJCQlORUdfQ05UKGRiZGF0LmRhdGEpKys7CisJCQlkYmFzZS0+cHV0KGRiYXNlLCAmZGJrZXksICZkYmRhdCwgMCk7CisJCX0KKwl9IGVsc2UgaWYgKG4tPm5sbXNnX3R5cGUgPT0gUlRNX05FV05FSUdIKSB7CisJCWlmIChuLT5ubG1zZ19mbGFncyZOTE1fRl9SRVFVRVNUKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKG5kbS0+bmRtX3N0YXRlJk5VRF9GQUlMRUQpIHsKKwkJCS8qIEtlcm5lbCB3YXMgbm90IGFibGUgdG8gcmVzb2x2ZS4gSG9zdCBpcyBkZWFkLgorCQkJICogQ3JlYXRlIG5lZ2F0aXZlIGVudHJ5IGlmIGl0IGlzIG5vdCBwcmVzZW50CisJCQkgKiBvciByZW5ldyBpdCBpZiBpdCBpcyB0b28gb2xkLiAqLworCQkJaWYgKCFkYmRhdC5kYXRhIHx8CisJCQkgICAgIUlTX05FRyhkYmRhdC5kYXRhKSB8fAorCQkJICAgICFORUdfVkFMSUQoZGJkYXQuZGF0YSkpIHsKKwkJCQlfX3U4IG5kYXRhWzZdOworCQkJCXN0YXRzLmtlcm5fbmVnKys7CisJCQkJcHJlcGFyZV9uZWdfZW50cnkobmRhdGEsIHRpbWUoTlVMTCkpOworCQkJCWRiZGF0LmRhdGEgPSBuZGF0YTsKKwkJCQlkYmRhdC5zaXplID0gc2l6ZW9mKG5kYXRhKTsKKwkJCQlkYmFzZS0+cHV0KGRiYXNlLCAmZGJrZXksICZkYmRhdCwgMCk7CisJCQl9CisJCX0gZWxzZSBpZiAodGJbTkRBX0xMQUREUl0pIHsKKwkJCWlmIChkYmRhdC5kYXRhICYmICFJU19ORUcoZGJkYXQuZGF0YSkpIHsKKwkJCQlpZiAobWVtY21wKFJUQV9EQVRBKHRiW05EQV9MTEFERFJdKSwgZGJkYXQuZGF0YSwgZGJkYXQuc2l6ZSkgPT0gMCkKKwkJCQkJcmV0dXJuIDA7CisJCQkJc3RhdHMua2Vybl9jaGFuZ2UrKzsKKwkJCX0gZWxzZSB7CisJCQkJc3RhdHMua2Vybl9uZXcrKzsKKwkJCX0KKwkJCWRiZGF0LmRhdGEgPSBSVEFfREFUQSh0YltOREFfTExBRERSXSk7CisJCQlkYmRhdC5zaXplID0gUlRBX1BBWUxPQUQodGJbTkRBX0xMQUREUl0pOworCQkJZGJhc2UtPnB1dChkYmFzZSwgJmRia2V5LCAmZGJkYXQsIDApOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBsb2FkX2luaXRpYWxfdGFibGUodm9pZCkKK3sKKwlpZiAocnRubF93aWxkZHVtcF9yZXF1ZXN0KCZydGgsIEFGX0lORVQsIFJUTV9HRVRORUlHSCkgPCAwKSB7CisJCXBlcnJvcigiZHVtcCByZXF1ZXN0IGZhaWxlZCIpOworCQlleGl0KDEpOworCX0KKworfQorCitzdGF0aWMgdm9pZCBnZXRfa2Vybl9tc2codm9pZCkKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBubG1zZ2hkciAqaDsKKwlzdHJ1Y3Qgc29ja2FkZHJfbmwgbmxhZGRyOworCXN0cnVjdCBpb3ZlYyBpb3Y7CisJY2hhciAgIGJ1Zls4MTkyXTsKKwlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsKKwkJKHZvaWQqKSZubGFkZHIsIHNpemVvZihubGFkZHIpLAorCQkmaW92LAkxLAorCQlOVUxMLAkwLAorCQkwCisJfTsKKworCW1lbXNldCgmbmxhZGRyLCAwLCBzaXplb2YobmxhZGRyKSk7CisKKwlpb3YuaW92X2Jhc2UgPSBidWY7CisJaW92Lmlvdl9sZW4gPSBzaXplb2YoYnVmKTsKKworCXN0YXR1cyA9IHJlY3Ztc2cocnRoLmZkLCAmbXNnLCBNU0dfRE9OVFdBSVQpOworCisJaWYgKHN0YXR1cyA8PSAwKQorCQlyZXR1cm47CisKKwlpZiAobXNnLm1zZ19uYW1lbGVuICE9IHNpemVvZihubGFkZHIpKQorCQlyZXR1cm47CisKKwlpZiAobmxhZGRyLm5sX3BpZCkKKwkJcmV0dXJuOworCisJZm9yIChoID0gKHN0cnVjdCBubG1zZ2hkciopYnVmOyBzdGF0dXMgPj0gc2l6ZW9mKCpoKTsgKSB7CisJCWludCBsZW4gPSBoLT5ubG1zZ19sZW47CisJCWludCBsID0gbGVuIC0gc2l6ZW9mKCpoKTsKKworCQlpZiAobCA8IDAgfHwgbGVuID4gc3RhdHVzKQorCQkJcmV0dXJuOworCisJCWlmIChkb19vbmVfcmVxdWVzdChoKSA8IDApCisJCQlyZXR1cm47CisKKwkJc3RhdHVzIC09IE5MTVNHX0FMSUdOKGxlbik7CisJCWggPSAoc3RydWN0IG5sbXNnaGRyKikoKGNoYXIqKWggKyBOTE1TR19BTElHTihsZW4pKTsKKwl9Cit9CisKKy8qIFJlY2VpdmUgZ3JhdHVpdG91cyBBUlAgbWVzc2FnZXMgYW5kIHN0b3JlIHRoZW0sIHRoYXQncyBhbGwuICovCitzdGF0aWMgdm9pZCBnZXRfYXJwX3BrdCh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgYnVmWzEwMjRdOworCXN0cnVjdCBzb2NrYWRkcl9sbCBzbGw7CisJc29ja2xlbl90IHNsbF9sZW4gPSBzaXplb2Yoc2xsKTsKKwlzdHJ1Y3QgYXJwaGRyICphID0gKHN0cnVjdCBhcnBoZHIqKWJ1ZjsKKwlzdHJ1Y3QgZGJrZXkga2V5OworCURCVCBkYmtleSwgZGJkYXQ7CisJaW50IG47CisKKwluID0gcmVjdmZyb20ocHNldFswXS5mZCwgYnVmLCBzaXplb2YoYnVmKSwgTVNHX0RPTlRXQUlULAorCQkgICAgIChzdHJ1Y3Qgc29ja2FkZHIqKSZzbGwsICZzbGxfbGVuKTsKKwlpZiAobiA8IDApIHsKKwkJaWYgKGVycm5vICE9IEVJTlRSICYmIGVycm5vICE9IEVBR0FJTikKKwkJCXN5c2xvZyhMT0dfRVJSLCAicmVjdmZyb206ICVtIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaWZudW0gJiYgIWhhbmRsZV9pZihzbGwuc2xsX2lmaW5kZXgpKQorCQlyZXR1cm47CisKKwkvKiBTYW5pdHkgY2hlY2tzICovCisKKwlpZiAobiA8IHNpemVvZigqYSkgfHwKKwkgICAgKGEtPmFyX29wICE9IGh0b25zKEFSUE9QX1JFUVVFU1QpICYmCisJICAgICBhLT5hcl9vcCAhPSBodG9ucyhBUlBPUF9SRVBMWSkpIHx8CisJICAgIGEtPmFyX3BsbiAhPSA0IHx8CisJICAgIGEtPmFyX3BybyAhPSBodG9ucyhFVEhfUF9JUCkgfHwKKwkgICAgYS0+YXJfaGxuICE9IHNsbC5zbGxfaGFsZW4gfHwKKwkgICAgc2l6ZW9mKCphKSArIDIqNCArIDIqYS0+YXJfaGxuID4gbikKKwkJcmV0dXJuOworCisJa2V5LmlmYWNlID0gc2xsLnNsbF9pZmluZGV4OworCW1lbWNweSgma2V5LmFkZHIsIChjaGFyKikoYSsxKSArIGEtPmFyX2hsbiwgNCk7CisKKwkvKiBEQUQgbWVzc2FnZSwgaWdub3JlLiAqLworCWlmIChrZXkuYWRkciA9PSAwKQorCQlyZXR1cm47CisKKwlkYmtleS5kYXRhID0gJmtleTsKKwlkYmtleS5zaXplID0gc2l6ZW9mKGtleSk7CisKKwlpZiAoZGJhc2UtPmdldChkYmFzZSwgJmRia2V5LCAmZGJkYXQsIDApID09IDAgJiYgIUlTX05FRyhkYmRhdC5kYXRhKSkgeworCQlpZiAobWVtY21wKGRiZGF0LmRhdGEsIGErMSwgZGJkYXQuc2l6ZSkgPT0gMCkKKwkJCXJldHVybjsKKwkJc3RhdHMuYXJwX2NoYW5nZSsrOworCX0gZWxzZSB7CisJCXN0YXRzLmFycF9uZXcrKzsKKwl9CisKKwlkYmRhdC5kYXRhID0gYSsxOworCWRiZGF0LnNpemUgPSBhLT5hcl9obG47CisJZGJhc2UtPnB1dChkYmFzZSwgJmRia2V5LCAmZGJkYXQsIDApOworfQorCitzdGF0aWMgdm9pZCBjYXRjaF9zaWduYWwoaW50IHNpZywgdm9pZCAoKmhhbmRsZXIpKGludCkpCit7CisJc3RydWN0IHNpZ2FjdGlvbiBzYTsKKworCW1lbXNldCgmc2EsIDAsIHNpemVvZihzYSkpOworCXNhLnNhX2hhbmRsZXIgPSBoYW5kbGVyOworI2lmZGVmIFNBX0lOVEVSUlVQVAorCXNhLnNhX2ZsYWdzID0gU0FfSU5URVJSVVBUOworI2VuZGlmCisJc2lnYWN0aW9uKHNpZywgJnNhLCBOVUxMKTsKK30KKworI2luY2x1ZGUgPHNldGptcC5oPgorc2lnam1wX2J1ZiBlbnY7Cit2b2xhdGlsZSBpbnQgaW5fcG9sbDsKKworc3RhdGljIHZvaWQgc2lnX2V4aXQoaW50IHNpZ25vKQoreworCWRvX2V4aXQgPSAxOworCWlmIChpbl9wb2xsKQorCQlzaWdsb25nam1wKGVudiwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHNpZ19zeW5jKGludCBzaWdubykKK3sKKwlkb19zeW5jID0gMTsKKwlpZiAoaW5fcG9sbCkKKwkJc2lnbG9uZ2ptcChlbnYsIDEpOworfQorCitzdGF0aWMgdm9pZCBzaWdfc3RhdHMoaW50IHNpZ25vKQoreworCWRvX3N5bmMgPSAxOworCWRvX3N0YXRzID0gMTsKKwlpZiAoaW5fcG9sbCkKKwkJc2lnbG9uZ2ptcChlbnYsIDEpOworfQorCitzdGF0aWMgdm9pZCBzZW5kX3N0YXRzKHZvaWQpCit7CisJc3lzbG9nKExPR19JTkZPLCAiYXJwX3JjdjogbiVsdSBjJWx1IGFwcF9yY3Y6IHRvdCAlbHUgaGl0cyAlbHUgYmFkICVsdSBuZWcgJWx1IHN1cCAlbHUiLAorCSAgICAgICBzdGF0cy5hcnBfbmV3LCBzdGF0cy5hcnBfY2hhbmdlLAorCisJICAgICAgIHN0YXRzLmFwcF9yZWN2LCBzdGF0cy5hcHBfc3VjY2VzcywKKwkgICAgICAgc3RhdHMuYXBwX2JhZCwgc3RhdHMuYXBwX25lZywgc3RhdHMuYXBwX3N1cHByZXNzZWQKKwkgICAgICAgKTsKKwlzeXNsb2coTE9HX0lORk8sICJrZXJuOiBuJWx1IGMlbHUgbmVnICVsdSBhcnBfc2VuZDogJWx1IHJsaW0gJWx1IiwKKwkgICAgICAgc3RhdHMua2Vybl9uZXcsIHN0YXRzLmtlcm5fY2hhbmdlLCBzdGF0cy5rZXJuX25lZywKKworCSAgICAgICBzdGF0cy5wcm9iZXNfc2VudCwgc3RhdHMucHJvYmVzX3N1cHByZXNzZWQKKwkgICAgICAgKTsKKwlkb19zdGF0cyA9IDA7Cit9CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBvcHQ7CisJaW50IGRvX2xpc3QgPSAwOworCWNoYXIgKmRvX2xvYWQgPSBOVUxMOworCisJd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgImg/YjpsZjphOm46cDprUjpCOiIpKSAhPSBFT0YpIHsKKwkJc3dpdGNoIChvcHQpIHsKKwkgICAgICAgIGNhc2UgJ2InOgorCQkJZGJuYW1lID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ2YnOgorCQkJaWYgKGRvX2xvYWQpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkR1cGxpY2F0ZSBvcHRpb24gLWZcbiIpOworCQkJCXVzYWdlKCk7CisJCQl9CisJCQlkb19sb2FkID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ2wnOgorCQkJZG9fbGlzdCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnYSc6CisJCQlhY3RpdmVfcHJvYmluZyA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCW5lZ2F0aXZlX3RpbWVvdXQgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnayc6CisJCQlub19rZXJuZWxfYnJvYWRjYXN0cyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlpZiAoKHBvbGxfdGltZW91dCA9IDEwMDAgKiBzdHJ0b2Qob3B0YXJnLCBOVUxMKSkgPCAxMDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwiSW52YWxpZCBwb2xsIHRpbWVvdXRcbiIpOworCQkJCWV4aXQoLTEpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ1InOgorCQkJaWYgKChicm9hZGNhc3RfcmF0ZSA9IGF0b2kob3B0YXJnKSkgPD0gMCB8fAorCQkJICAgIChicm9hZGNhc3RfcmF0ZSA9IDEwMDAvYnJvYWRjYXN0X3JhdGUpIDw9IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgQVJQIHJhdGVcbiIpOworCQkJCWV4aXQoLTEpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ0InOgorCQkJaWYgKChicm9hZGNhc3RfYnVyc3QgPSBhdG9pKG9wdGFyZykpIDw9IDAgfHwKKwkJCSAgICAoYnJvYWRjYXN0X2J1cnN0ID0gMTAwMCpicm9hZGNhc3RfYnVyc3QpIDw9IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgQVJQIGJ1cnN0XG4iKTsKKwkJCQlleGl0KC0xKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdoJzoKKwkJY2FzZSAnPyc6CisJCWRlZmF1bHQ6CisJCQl1c2FnZSgpOworCQl9CisJfQorCWFyZ2MgLT0gb3B0aW5kOworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKGFyZ2MgPiAwKSB7CisJCWlmbnVtID0gYXJnYzsKKwkJaWZuYW1lcyA9IGFyZ3Y7CisJCWlmdmVjID0gbWFsbG9jKGFyZ2Mqc2l6ZW9mKGludCkpOworCQlpZiAoIWlmdmVjKSB7CisJCQlwZXJyb3IoIm1hbGxvYyIpOworCQkJZXhpdCgtMSk7CisJCX0KKwl9CisKKwlpZiAoKHVkcF9zb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApKSA8IDApIHsKKwkJcGVycm9yKCJzb2NrZXQiKTsKKwkJZXhpdCgtMSk7CisJfQorCisgICAgICAgIGlmIChpZm51bSkgeworCQlpbnQgaTsKKwkJc3RydWN0IGlmcmVxIGlmcjsKKwkJbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKKwkJZm9yIChpPTA7IGk8aWZudW07IGkrKykgeworCQkJc3RybmNweShpZnIuaWZyX25hbWUsIGlmbmFtZXNbaV0sIElGTkFNU0laKTsKKwkJCWlmIChpb2N0bCh1ZHBfc29jaywgU0lPQ0dJRklOREVYLCAmaWZyKSkgeworCQkJCXBlcnJvcigiaW9jdGwoU0lPQ0dJRklOREVYKSIpOworCQkJCWV4aXQoLTEpOzsKKwkJCX0KKwkJCWlmdmVjW2ldID0gaWZyLmlmcl9pZmluZGV4OworCQl9CisJfQorCisJZGJhc2UgPSBkYm9wZW4oZGJuYW1lLCBPX0NSRUFUfE9fUkRXUiwgMDY0NCwgREJfSEFTSCwgTlVMTCk7CisJaWYgKGRiYXNlID09IE5VTEwpIHsKKwkJcGVycm9yKCJkYl9vcGVuIik7CisJCWV4aXQoLTEpOworCX0KKworCWlmIChkb19sb2FkKSB7CisJCWNoYXIgYnVmWzEyOF07CisJCUZJTEUgKmZwOworCQlzdHJ1Y3QgZGJrZXkgazsKKwkJREJUIGRia2V5LCBkYmRhdDsKKworCQlkYmtleS5kYXRhID0gJms7CisJCWRia2V5LnNpemUgPSBzaXplb2Yoayk7CisKKwkJaWYgKHN0cmNtcChkb19sb2FkLCAiLSIpID09IDAgfHwgc3RyY21wKGRvX2xvYWQsICItLSIpID09IDApIHsKKwkJCWZwID0gc3RkaW47CisJCX0gZWxzZSBpZiAoKGZwID0gZm9wZW4oZG9fbG9hZCwgInIiKSkgPT0gTlVMTCkgeworCQkJcGVycm9yKCJmb3BlbiIpOworCQkJZ290byBkb19hYm9ydDsKKwkJfQorCisJCWJ1ZltzaXplb2YoYnVmKS0xXSA9IDA7CisJCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkpIHsKKwkJCV9fdTggYjFbNl07CisJCQljaGFyIGlwYnVmWzEyOF07CisJCQljaGFyIG1hY2J1ZlsxMjhdOworCisJCQlpZiAoYnVmWzBdID09ICcjJykKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHNzY2FuZihidWYsICIldSVzJXMiLCAmay5pZmFjZSwgaXBidWYsIG1hY2J1ZikgIT0gMykgeworCQkJCWZwcmludGYoc3RkZXJyLCAiV3JvbmcgZm9ybWF0IG9mIGlucHV0IGZpbGUgXCIlc1wiXG4iLCBkb19sb2FkKTsKKwkJCQlnb3RvIGRvX2Fib3J0OworCQkJfQorCQkJaWYgKHN0cm5jbXAobWFjYnVmLCAiRkFJTEVEOiIsIDcpID09IDApCisJCQkJY29udGludWU7CisJCQlpZiAoIWluZXRfYXRvbihpcGJ1ZiwgKHN0cnVjdCBpbl9hZGRyKikmay5hZGRyKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBJUCBhZGRyZXNzOiBcIiVzXCJcbiIsIGlwYnVmKTsKKwkJCQlnb3RvIGRvX2Fib3J0OworCQkJfQorCisJCQlpZiAobGxfYWRkcl9hMm4oKGNoYXIgKikgYjEsIDYsIG1hY2J1ZikgIT0gNikKKwkJCQlnb3RvIGRvX2Fib3J0OworCQkJZGJkYXQuc2l6ZSA9IDY7CisKKwkJCWlmIChkYmFzZS0+cHV0KGRiYXNlLCAmZGJrZXksICZkYmRhdCwgMCkpIHsKKwkJCQlwZXJyb3IoImhhc2gtPnB1dCIpOworCQkJCWdvdG8gZG9fYWJvcnQ7CisJCQl9CisJCX0KKwkJZGJhc2UtPnN5bmMoZGJhc2UsIDApOworCQlpZiAoZnAgIT0gc3RkaW4pCisJCQlmY2xvc2UoZnApOworCX0KKworCWlmIChkb19saXN0KSB7CisJCURCVCBkYmtleSwgZGJkYXQ7CisJCXByaW50ZigiJS04cyAlLTE1cyAlc1xuIiwgIiNJZmluZGV4IiwgIklQIiwgIk1BQyIpOworCQl3aGlsZSAoZGJhc2UtPnNlcShkYmFzZSwgJmRia2V5LCAmZGJkYXQsIFJfTkVYVCkgPT0gMCkgeworCQkJc3RydWN0IGRia2V5ICprZXkgPSBkYmtleS5kYXRhOworCQkJaWYgKGhhbmRsZV9pZihrZXktPmlmYWNlKSkgeworCQkJCWlmICghSVNfTkVHKGRiZGF0LmRhdGEpKSB7CisJCQkJCWNoYXIgYjFbMThdOworCQkJCQlwcmludGYoIiUtOGQgJS0xNXMgJXNcbiIsCisJCQkJCSAgICAgICBrZXktPmlmYWNlLAorCQkJCQkgICAgICAgaW5ldF9udG9hKCooc3RydWN0IGluX2FkZHIqKSZrZXktPmFkZHIpLAorCQkJCQkgICAgICAgbGxfYWRkcl9uMmEoZGJkYXQuZGF0YSwgNiwgQVJQSFJEX0VUSEVSLCBiMSwgMTgpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmludGYoIiUtOGQgJS0xNXMgRkFJTEVEOiAlZHNlYyBhZ29cbiIsCisJCQkJCSAgICAgICBrZXktPmlmYWNlLAorCQkJCQkgICAgICAgaW5ldF9udG9hKCooc3RydWN0IGluX2FkZHIqKSZrZXktPmFkZHIpLAorCQkJCQkgICAgICAgTkVHX0FHRShkYmRhdC5kYXRhKSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYgKGRvX2xvYWQgfHwgZG9fbGlzdCkKKwkJZ290byBvdXQ7CisKKwlwc2V0WzBdLmZkID0gc29ja2V0KFBGX1BBQ0tFVCwgU09DS19ER1JBTSwgMCk7CisJaWYgKHBzZXRbMF0uZmQgPCAwKSB7CisJCXBlcnJvcigic29ja2V0Iik7CisJCWV4aXQoLTEpOworCX0KKworCWlmICgxKSB7CisJCXN0cnVjdCBzb2NrYWRkcl9sbCBzbGw7CisJCW1lbXNldCgmc2xsLCAwLCBzaXplb2Yoc2xsKSk7CisJCXNsbC5zbGxfZmFtaWx5ID0gQUZfUEFDS0VUOworCQlzbGwuc2xsX3Byb3RvY29sID0gaHRvbnMoRVRIX1BfQVJQKTsKKwkJc2xsLnNsbF9pZmluZGV4ID0gKGlmbnVtID09IDEgPyBpZnZlY1swXSA6IDApOworCQlpZiAoYmluZChwc2V0WzBdLmZkLCAoc3RydWN0IHNvY2thZGRyKikmc2xsLCBzaXplb2Yoc2xsKSkgPCAwKSB7CisJCQlwZXJyb3IoImJpbmQiKTsKKwkJCWdvdG8gZG9fYWJvcnQ7CisJCX0KKwl9CisKKwlpZiAocnRubF9vcGVuKCZydGgsIFJUTUdSUF9ORUlHSCkgPCAwKSB7CisJCXBlcnJvcigicnRubF9vcGVuIik7CisJCWdvdG8gZG9fYWJvcnQ7CisJfQorCXBzZXRbMV0uZmQgPSBydGguZmQ7CisKKwlsb2FkX2luaXRpYWxfdGFibGUoKTsKKworCWlmIChkYWVtb24oMCwgMCkpIHsKKwkJcGVycm9yKCJhcnBkOiBkYWVtb24iKTsKKwkJZ290byBkb19hYm9ydDsKKwl9CisKKwlvcGVubG9nKCJhcnBkIiwgTE9HX1BJRCB8IExPR19DT05TLCBMT0dfREFFTU9OKTsKKwljYXRjaF9zaWduYWwoU0lHSU5ULCBzaWdfZXhpdCk7CisJY2F0Y2hfc2lnbmFsKFNJR1RFUk0sIHNpZ19leGl0KTsKKwljYXRjaF9zaWduYWwoU0lHSFVQLCBzaWdfc3luYyk7CisJY2F0Y2hfc2lnbmFsKFNJR1VTUjEsIHNpZ19zdGF0cyk7CisKKyNkZWZpbmUgRVZFTlRTIChQT0xMSU58UE9MTFBSSXxQT0xMRVJSfFBPTExIVVApCisJcHNldFswXS5ldmVudHMgPSBFVkVOVFM7CisJcHNldFswXS5yZXZlbnRzID0gMDsKKwlwc2V0WzFdLmV2ZW50cyA9IEVWRU5UUzsKKwlwc2V0WzFdLnJldmVudHMgPSAwOworCisJc2lnc2V0am1wKGVudiwgMSk7CisKKwlmb3IgKDs7KSB7CisJCWluX3BvbGwgPSAxOworCisJCWlmIChkb19leGl0KQorCQkJYnJlYWs7CisJCWlmIChkb19zeW5jKSB7CisJCQlpbl9wb2xsID0gMDsKKwkJCWRiYXNlLT5zeW5jKGRiYXNlLCAwKTsKKwkJCWRvX3N5bmMgPSAwOworCQkJaW5fcG9sbCA9IDE7CisJCX0KKwkJaWYgKGRvX3N0YXRzKQorCQkJc2VuZF9zdGF0cygpOworCQlpZiAocG9sbChwc2V0LCAyLCBwb2xsX3RpbWVvdXQpID4gMCkgeworCQkJaW5fcG9sbCA9IDA7CisJCQlpZiAocHNldFswXS5yZXZlbnRzJkVWRU5UUykKKwkJCQlnZXRfYXJwX3BrdCgpOworCQkJaWYgKHBzZXRbMV0ucmV2ZW50cyZFVkVOVFMpCisJCQkJZ2V0X2tlcm5fbXNnKCk7CisJCX0gZWxzZSB7CisJCQlkb19zeW5jID0gMTsKKwkJfQorCX0KKworCXVuZG9fc3lzY3RsX2FkanVzdG1lbnRzKCk7CitvdXQ6CisJZGJhc2UtPmNsb3NlKGRiYXNlKTsKKwlleGl0KDApOworCitkb19hYm9ydDoKKwlkYmFzZS0+Y2xvc2UoZGJhc2UpOworCWV4aXQoLTEpOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWlzYy9pZnN0YXQuYyBiL2lwcm91dGUyL21pc2MvaWZzdGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM1YzI5YwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21pc2MvaWZzdGF0LmMKQEAgLTAsMCArMSw4NzUgQEAKKy8qCisgKiBpZnN0YXQuYwloYW5keSB1dGlsaXR5IHRvIHJlYWQgbmV0IGludGVyZmFjZSBzdGF0aXN0aWNzCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorCisjaW5jbHVkZSA8bGlibmV0bGluay5oPgorI2luY2x1ZGUgPGpzb25fd3JpdGVyLmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9saW5rLmg+CisKKyNpbmNsdWRlIDxTTkFQU0hPVC5oPgorCitpbnQgZHVtcF96ZXJvcyA9IDA7CitpbnQgcmVzZXRfaGlzdG9yeSA9IDA7CitpbnQgaWdub3JlX2hpc3RvcnkgPSAwOworaW50IG5vX291dHB1dCA9IDA7CitpbnQganNvbl9vdXRwdXQgPSAwOworaW50IG5vX3VwZGF0ZSA9IDA7CitpbnQgc2Nhbl9pbnRlcnZhbCA9IDA7CitpbnQgdGltZV9jb25zdGFudCA9IDA7CitpbnQgc2hvd19lcnJvcnMgPSAwOworaW50IHByZXR0eTsKK2RvdWJsZSBXOworY2hhciAqKnBhdHRlcm5zOworaW50IG5wYXR0ZXJuczsKKworY2hhciBpbmZvX3NvdXJjZVsxMjhdOworaW50IHNvdXJjZV9taXNtYXRjaDsKKworI2RlZmluZSBNQVhTIChzaXplb2Yoc3RydWN0IHJ0bmxfbGlua19zdGF0cykvc2l6ZW9mKF9fdTMyKSkKKworc3RydWN0IGlmc3RhdF9lbnQKK3sKKwlzdHJ1Y3QgaWZzdGF0X2VudAkqbmV4dDsKKwljaGFyCQkJKm5hbWU7CisJaW50CQkJaWZpbmRleDsKKwl1bnNpZ25lZCBsb25nIGxvbmcJdmFsW01BWFNdOworCWRvdWJsZQkJCXJhdGVbTUFYU107CisJX191MzIJCQlpdmFsW01BWFNdOworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnN0YXRzW01BWFNdID0geworCSJyeF9wYWNrZXRzIiwKKwkidHhfcGFja2V0cyIsCisJInJ4X2J5dGVzIiwKKwkidHhfYnl0ZXMiLAorCSJyeF9lcnJvcnMiLAorCSJ0eF9lcnJvcnMiLAorCSJyeF9kcm9wcGVkIiwKKwkidHhfZHJvcHBlZCIsCisJIm11bHRpY2FzdCIsCisJImNvbGxpc2lvbnMiLAorCSJyeF9sZW5ndGhfZXJyb3JzIiwKKwkicnhfb3Zlcl9lcnJvcnMiLAorCSJyeF9jcmNfZXJyb3JzIiwKKwkicnhfZnJhbWVfZXJyb3JzIiwKKwkicnhfZmlmb19lcnJvcnMiLAorCSJyeF9taXNzZWRfZXJyb3JzIiwKKwkidHhfYWJvcnRlZF9lcnJvcnMiLAorCSJ0eF9jYXJyaWVyX2Vycm9ycyIsCisJInR4X2ZpZm9fZXJyb3JzIiwKKwkidHhfaGVhcnRiZWF0X2Vycm9ycyIsCisJInR4X3dpbmRvd19lcnJvcnMiLAorCSJyeF9jb21wcmVzc2VkIiwKKwkidHhfY29tcHJlc3NlZCIKK307CisKK3N0cnVjdCBpZnN0YXRfZW50ICprZXJuX2RiOworc3RydWN0IGlmc3RhdF9lbnQgKmhpc3RfZGI7CisKK3N0YXRpYyBpbnQgbWF0Y2goY29uc3QgY2hhciAqaWQpCit7CisJaW50IGk7CisKKwlpZiAobnBhdHRlcm5zID09IDApCisJCXJldHVybiAxOworCisJZm9yIChpPTA7IGk8bnBhdHRlcm5zOyBpKyspIHsKKwkJaWYgKCFmbm1hdGNoKHBhdHRlcm5zW2ldLCBpZCwgMCkpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X25sbXNnKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLAorCQkgICAgIHN0cnVjdCBubG1zZ2hkciAqbSwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBpZmluZm9tc2cgKmlmaSA9IE5MTVNHX0RBVEEobSk7CisJc3RydWN0IHJ0YXR0ciAqIHRiW0lGTEFfTUFYKzFdOworCWludCBsZW4gPSBtLT5ubG1zZ19sZW47CisJc3RydWN0IGlmc3RhdF9lbnQgKm47CisJaW50IGk7CisKKwlpZiAobS0+bmxtc2dfdHlwZSAhPSBSVE1fTkVXTElOSykKKwkJcmV0dXJuIDA7CisKKwlsZW4gLT0gTkxNU0dfTEVOR1RIKHNpemVvZigqaWZpKSk7CisJaWYgKGxlbiA8IDApCisJCXJldHVybiAtMTsKKworCWlmICghKGlmaS0+aWZpX2ZsYWdzJklGRl9VUCkpCisJCXJldHVybiAwOworCisJcGFyc2VfcnRhdHRyKHRiLCBJRkxBX01BWCwgSUZMQV9SVEEoaWZpKSwgbGVuKTsKKwlpZiAodGJbSUZMQV9JRk5BTUVdID09IE5VTEwgfHwgdGJbSUZMQV9TVEFUU10gPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwluID0gbWFsbG9jKHNpemVvZigqbikpOworCWlmICghbikKKwkJYWJvcnQoKTsKKwluLT5pZmluZGV4ID0gaWZpLT5pZmlfaW5kZXg7CisJbi0+bmFtZSA9IHN0cmR1cChSVEFfREFUQSh0YltJRkxBX0lGTkFNRV0pKTsKKwltZW1jcHkoJm4tPml2YWwsIFJUQV9EQVRBKHRiW0lGTEFfU1RBVFNdKSwgc2l6ZW9mKG4tPml2YWwpKTsKKwltZW1zZXQoJm4tPnJhdGUsIDAsIHNpemVvZihuLT5yYXRlKSk7CisJZm9yIChpPTA7IGk8TUFYUzsgaSsrKQorCQluLT52YWxbaV0gPSBuLT5pdmFsW2ldOworCW4tPm5leHQgPSBrZXJuX2RiOworCWtlcm5fZGIgPSBuOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBsb2FkX2luZm8odm9pZCkKK3sKKwlzdHJ1Y3QgaWZzdGF0X2VudCAqZGIsICpuOworCXN0cnVjdCBydG5sX2hhbmRsZSBydGg7CisKKwlpZiAocnRubF9vcGVuKCZydGgsIDApIDwgMCkKKwkJZXhpdCgxKTsKKworCWlmIChydG5sX3dpbGRkdW1wX3JlcXVlc3QoJnJ0aCwgQUZfSU5FVCwgUlRNX0dFVExJTkspIDwgMCkgeworCQlwZXJyb3IoIkNhbm5vdCBzZW5kIGR1bXAgcmVxdWVzdCIpOworCQlleGl0KDEpOworCX0KKworCWlmIChydG5sX2R1bXBfZmlsdGVyKCZydGgsIGdldF9ubG1zZywgTlVMTCkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRHVtcCB0ZXJtaW5hdGVkXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlydG5sX2Nsb3NlKCZydGgpOworCisJZGIgPSBrZXJuX2RiOworCWtlcm5fZGIgPSBOVUxMOworCisJd2hpbGUgKGRiKSB7CisJCW4gPSBkYjsKKwkJZGIgPSBkYi0+bmV4dDsKKwkJbi0+bmV4dCA9IGtlcm5fZGI7CisJCWtlcm5fZGIgPSBuOworCX0KK30KKworc3RhdGljIHZvaWQgbG9hZF9yYXdfdGFibGUoRklMRSAqZnApCit7CisJY2hhciBidWZbNDA5Nl07CisJc3RydWN0IGlmc3RhdF9lbnQgKmRiID0gTlVMTDsKKwlzdHJ1Y3QgaWZzdGF0X2VudCAqbjsKKworCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkgIT0gTlVMTCkgeworCQljaGFyICpwOworCQljaGFyICpuZXh0OworCQlpbnQgaTsKKworCQlpZiAoYnVmWzBdID09ICcjJykgeworCQkJYnVmW3N0cmxlbihidWYpLTFdID0gMDsKKwkJCWlmIChpbmZvX3NvdXJjZVswXSAmJiBzdHJjbXAoaW5mb19zb3VyY2UsIGJ1ZisxKSkKKwkJCQlzb3VyY2VfbWlzbWF0Y2ggPSAxOworCQkJc3RybmNweShpbmZvX3NvdXJjZSwgYnVmKzEsIHNpemVvZihpbmZvX3NvdXJjZSktMSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKG4gPSBtYWxsb2Moc2l6ZW9mKCpuKSkpID09IE5VTEwpCisJCQlhYm9ydCgpOworCisJCWlmICghKHAgPSBzdHJjaHIoYnVmLCAnICcpKSkKKwkJCWFib3J0KCk7CisJCSpwKysgPSAwOworCisJCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmbi0+aWZpbmRleCkgIT0gMSkKKwkJCWFib3J0KCk7CisJCWlmICghKG5leHQgPSBzdHJjaHIocCwgJyAnKSkpCisJCQlhYm9ydCgpOworCQkqbmV4dCsrID0gMDsKKworCQluLT5uYW1lID0gc3RyZHVwKHApOworCQlwID0gbmV4dDsKKworCQlmb3IgKGk9MDsgaTxNQVhTOyBpKyspIHsKKwkJCXVuc2lnbmVkIHJhdGU7CisJCQlpZiAoIShuZXh0ID0gc3RyY2hyKHAsICcgJykpKQorCQkJCWFib3J0KCk7CisJCQkqbmV4dCsrID0gMDsKKwkJCWlmIChzc2NhbmYocCwgIiVsbHUiLCBuLT52YWwraSkgIT0gMSkKKwkJCQlhYm9ydCgpOworCQkJbi0+aXZhbFtpXSA9IChfX3UzMiluLT52YWxbaV07CisJCQlwID0gbmV4dDsKKwkJCWlmICghKG5leHQgPSBzdHJjaHIocCwgJyAnKSkpCisJCQkJYWJvcnQoKTsKKwkJCSpuZXh0KysgPSAwOworCQkJaWYgKHNzY2FuZihwLCAiJXUiLCAmcmF0ZSkgIT0gMSkKKwkJCQlhYm9ydCgpOworCQkJbi0+cmF0ZVtpXSA9IHJhdGU7CisJCQlwID0gbmV4dDsKKwkJfQorCQluLT5uZXh0ID0gZGI7CisJCWRiID0gbjsKKwl9CisKKwl3aGlsZSAoZGIpIHsKKwkJbiA9IGRiOworCQlkYiA9IGRiLT5uZXh0OworCQluLT5uZXh0ID0ga2Vybl9kYjsKKwkJa2Vybl9kYiA9IG47CisJfQorfQorCitzdGF0aWMgdm9pZCBkdW1wX3Jhd19kYihGSUxFICpmcCwgaW50IHRvX2hpc3QpCit7CisJanNvbl93cml0ZXJfdCAqancgPSBqc29uX291dHB1dCA/IGpzb253X25ldyhmcCkgOiBOVUxMOworCXN0cnVjdCBpZnN0YXRfZW50ICpuLCAqaDsKKworCWggPSBoaXN0X2RiOworCWlmIChqdykgeworCQlqc29ud19wcmV0dHkoancsIHByZXR0eSk7CisJCWpzb253X25hbWUoancsIGluZm9fc291cmNlKTsKKwkJanNvbndfc3RhcnRfb2JqZWN0KGp3KTsKKwl9IGVsc2UKKwkJZnByaW50ZihmcCwgIiMlc1xuIiwgaW5mb19zb3VyY2UpOworCisJZm9yIChuPWtlcm5fZGI7IG47IG49bi0+bmV4dCkgeworCQlpbnQgaTsKKwkJdW5zaWduZWQgbG9uZyBsb25nICp2YWxzID0gbi0+dmFsOworCQlkb3VibGUgKnJhdGVzID0gbi0+cmF0ZTsKKwkJaWYgKCFtYXRjaChuLT5uYW1lKSkgeworCQkJc3RydWN0IGlmc3RhdF9lbnQgKmgxOworCQkJaWYgKCF0b19oaXN0KQorCQkJCWNvbnRpbnVlOworCQkJZm9yIChoMSA9IGg7IGgxOyBoMSA9IGgxLT5uZXh0KSB7CisJCQkJaWYgKGgxLT5pZmluZGV4ID09IG4tPmlmaW5kZXgpIHsKKwkJCQkJdmFscyA9IGgxLT52YWw7CisJCQkJCXJhdGVzID0gaDEtPnJhdGU7CisJCQkJCWggPSBoMS0+bmV4dDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKGp3KSB7CisJCQlqc29ud19uYW1lKGp3LCBuLT5uYW1lKTsKKwkJCWpzb253X3N0YXJ0X29iamVjdChqdyk7CisKKwkJCWZvciAoaT0wOyBpPE1BWFMgJiYgc3RhdHNbaV07IGkrKykKKwkJCQlqc29ud191aW50X2ZpZWxkKGp3LCBzdGF0c1tpXSwgdmFsc1tpXSk7CisJCQlqc29ud19lbmRfb2JqZWN0KGp3KTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoZnAsICIlZCAlcyAiLCBuLT5pZmluZGV4LCBuLT5uYW1lKTsKKwkJCWZvciAoaT0wOyBpPE1BWFM7IGkrKykKKwkJCQlmcHJpbnRmKGZwLCAiJWxsdSAldSAiLCB2YWxzW2ldLAorCQkJCQkodW5zaWduZWQpcmF0ZXNbaV0pOworCQkJZnByaW50ZihmcCwgIlxuIik7CisJCX0KKwl9CisJaWYgKGp3KSB7CisJCWpzb253X2VuZF9vYmplY3QoancpOworCQlqc29ud19kZXN0cm95KCZqdyk7CisJfQorfQorCisvKiB1c2UgY29tbXVuaWNhdGlvbiBkZWZpbml0aW9ucyBvZiBtZWcva2lsbyBldGMgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgZ2lnYSA9IDEwMDAwMDAwMDB1bGw7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIG1lZ2EgPSAxMDAwMDAwOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBraWxvID0gMTAwMDsKKworc3RhdGljIHZvaWQgZm9ybWF0X3JhdGUoRklMRSAqZnAsIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqdmFscywKKwkJCWNvbnN0IGRvdWJsZSAqcmF0ZXMsIGludCBpKQoreworCWNoYXIgdGVtcFs2NF07CisKKwlpZiAodmFsc1tpXSA+IGdpZ2EpCisJCWZwcmludGYoZnAsICIlN2xsdU0gIiwgdmFsc1tpXS9tZWdhKTsKKwllbHNlIGlmICh2YWxzW2ldID4gbWVnYSkKKwkJZnByaW50ZihmcCwgIiU3bGx1SyAiLCB2YWxzW2ldL2tpbG8pOworCWVsc2UKKwkJZnByaW50ZihmcCwgIiU4bGx1ICIsIHZhbHNbaV0pOworCisJaWYgKHJhdGVzW2ldID4gbWVnYSkgeworCQlzcHJpbnRmKHRlbXAsICIldU0iLCAodW5zaWduZWQpKHJhdGVzW2ldL21lZ2EpKTsKKwkJZnByaW50ZihmcCwgIiUtNnMgIiwgdGVtcCk7CisJfSBlbHNlIGlmIChyYXRlc1tpXSA+IGtpbG8pIHsKKwkJc3ByaW50Zih0ZW1wLCAiJXVLIiwgKHVuc2lnbmVkKShyYXRlc1tpXS9raWxvKSk7CisJCWZwcmludGYoZnAsICIlLTZzICIsIHRlbXApOworCX0gZWxzZQorCQlmcHJpbnRmKGZwLCAiJS02dSAiLCAodW5zaWduZWQpcmF0ZXNbaV0pOworfQorCitzdGF0aWMgdm9pZCBmb3JtYXRfcGFpcihGSUxFICpmcCwgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICp2YWxzLCBpbnQgaSwgaW50IGspCit7CisJY2hhciB0ZW1wWzY0XTsKKwlpZiAodmFsc1tpXSA+IGdpZ2EpCisJCWZwcmludGYoZnAsICIlN2xsdU0gIiwgdmFsc1tpXS9tZWdhKTsKKwllbHNlIGlmICh2YWxzW2ldID4gbWVnYSkKKwkJZnByaW50ZihmcCwgIiU3bGx1SyAiLCB2YWxzW2ldL2tpbG8pOworCWVsc2UKKwkJZnByaW50ZihmcCwgIiU4bGx1ICIsIHZhbHNbaV0pOworCisJaWYgKHZhbHNba10gPiBnaWdhKSB7CisJCXNwcmludGYodGVtcCwgIiV1TSIsICh1bnNpZ25lZCkodmFsc1trXS9tZWdhKSk7CisJCWZwcmludGYoZnAsICIlLTZzICIsIHRlbXApOworCX0gZWxzZSBpZiAodmFsc1trXSA+IG1lZ2EpIHsKKwkJc3ByaW50Zih0ZW1wLCAiJXVLIiwgKHVuc2lnbmVkKSh2YWxzW2tdL2tpbG8pKTsKKwkJZnByaW50ZihmcCwgIiUtNnMgIiwgdGVtcCk7CisJfSBlbHNlCisJCWZwcmludGYoZnAsICIlLTZ1ICIsICh1bnNpZ25lZCl2YWxzW2tdKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfaGVhZChGSUxFICpmcCkKK3sKKwlmcHJpbnRmKGZwLCAiIyVzXG4iLCBpbmZvX3NvdXJjZSk7CisJZnByaW50ZihmcCwgIiUtMTVzICIsICJJbnRlcmZhY2UiKTsKKworCWZwcmludGYoZnAsICIlOHMvJS02cyAiLCAiUlggUGt0cyIsICJSYXRlIik7CisJZnByaW50ZihmcCwgIiU4cy8lLTZzICIsICJUWCBQa3RzIiwgIlJhdGUiKTsKKwlmcHJpbnRmKGZwLCAiJThzLyUtNnMgIiwgIlJYIERhdGEiLCAiUmF0ZSIpOworCWZwcmludGYoZnAsICIlOHMvJS02c1xuIiwiVFggRGF0YSIsICJSYXRlIik7CisKKwlpZiAoIXNob3dfZXJyb3JzKSB7CisJCWZwcmludGYoZnAsICIlLTE1cyAiLCAiIik7CisJCWZwcmludGYoZnAsICIlOHMvJS02cyAiLCAiUlggRXJycyIsICJEcm9wIik7CisJCWZwcmludGYoZnAsICIlOHMvJS02cyAiLCAiVFggRXJycyIsICJEcm9wIik7CisJCWZwcmludGYoZnAsICIlOHMvJS02cyAiLCAiUlggT3ZlciIsICJSYXRlIik7CisJCWZwcmludGYoZnAsICIlOHMvJS02c1xuIiwiVFggQ29sbCIsICJSYXRlIik7CisJfSBlbHNlIHsKKwkJZnByaW50ZihmcCwgIiUtMTVzICIsICIiKTsKKwkJZnByaW50ZihmcCwgIiU4cy8lLTZzICIsICJSWCBFcnJzIiwgIlJhdGUiKTsKKwkJZnByaW50ZihmcCwgIiU4cy8lLTZzICIsICJSWCBEcm9wIiwgIlJhdGUiKTsKKwkJZnByaW50ZihmcCwgIiU4cy8lLTZzICIsICJSWCBPdmVyIiwgIlJhdGUiKTsKKwkJZnByaW50ZihmcCwgIiU4cy8lLTZzXG4iLCJSWCBMZW5nIiwgIlJhdGUiKTsKKworCQlmcHJpbnRmKGZwLCAiJS0xNXMgIiwgIiIpOworCQlmcHJpbnRmKGZwLCAiJThzLyUtNnMgIiwgIlJYIENyYyIsICJSYXRlIik7CisJCWZwcmludGYoZnAsICIlOHMvJS02cyAiLCAiUlggRnJtIiwgIlJhdGUiKTsKKwkJZnByaW50ZihmcCwgIiU4cy8lLTZzICIsICJSWCBGaWZvIiwgIlJhdGUiKTsKKwkJZnByaW50ZihmcCwgIiU4cy8lLTZzXG4iLCJSWCBNaXNzIiwgIlJhdGUiKTsKKworCQlmcHJpbnRmKGZwLCAiJS0xNXMgIiwgIiIpOworCQlmcHJpbnRmKGZwLCAiJThzLyUtNnMgIiwgIlRYIEVycnMiLCAiUmF0ZSIpOworCQlmcHJpbnRmKGZwLCAiJThzLyUtNnMgIiwgIlRYIERyb3AiLCAiUmF0ZSIpOworCQlmcHJpbnRmKGZwLCAiJThzLyUtNnMgIiwgIlRYIENvbGwiLCAiUmF0ZSIpOworCQlmcHJpbnRmKGZwLCAiJThzLyUtNnNcbiIsIlRYIENhcnIiLCAiUmF0ZSIpOworCisJCWZwcmludGYoZnAsICIlLTE1cyAiLCAiIik7CisJCWZwcmludGYoZnAsICIlOHMvJS02cyAiLCAiVFggQWJydCIsICJSYXRlIik7CisJCWZwcmludGYoZnAsICIlOHMvJS02cyAiLCAiVFggRmlmbyIsICJSYXRlIik7CisJCWZwcmludGYoZnAsICIlOHMvJS02cyAiLCAiVFggSGVhciIsICJSYXRlIik7CisJCWZwcmludGYoZnAsICIlOHMvJS02c1xuIiwiVFggV2luZCIsICJSYXRlIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBwcmludF9vbmVfanNvbihqc29uX3dyaXRlcl90ICpqdywgY29uc3Qgc3RydWN0IGlmc3RhdF9lbnQgKm4sCisJCQkgICBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKnZhbHMpCit7CisJaW50IGksIG0gPSBzaG93X2Vycm9ycyA/IDIwIDogMTA7CisKKwlqc29ud19uYW1lKGp3LCBuLT5uYW1lKTsKKwlqc29ud19zdGFydF9vYmplY3QoancpOworCisJZm9yIChpPTA7IGkgPCBtICYmIHN0YXRzW2ldOyBpKyspCisJCWpzb253X3VpbnRfZmllbGQoancsIHN0YXRzW2ldLCB2YWxzW2ldKTsKKworCWpzb253X2VuZF9vYmplY3QoancpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9vbmVfaWYoRklMRSAqZnAsIGNvbnN0IHN0cnVjdCBpZnN0YXRfZW50ICpuLAorCQkJIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqdmFscykKK3sKKwlpbnQgaTsKKworCWZwcmludGYoZnAsICIlLTE1cyAiLCBuLT5uYW1lKTsKKwlmb3IgKGk9MDsgaTw0OyBpKyspCisJCWZvcm1hdF9yYXRlKGZwLCB2YWxzLCBuLT5yYXRlLCBpKTsKKwlmcHJpbnRmKGZwLCAiXG4iKTsKKworCWlmICghc2hvd19lcnJvcnMpIHsKKwkJZnByaW50ZihmcCwgIiUtMTVzICIsICIiKTsKKwkJZm9ybWF0X3BhaXIoZnAsIHZhbHMsIDQsIDYpOworCQlmb3JtYXRfcGFpcihmcCwgdmFscywgNSwgNyk7CisJCWZvcm1hdF9yYXRlKGZwLCB2YWxzLCBuLT5yYXRlLCAxMSk7CisJCWZvcm1hdF9yYXRlKGZwLCB2YWxzLCBuLT5yYXRlLCA5KTsKKwkJZnByaW50ZihmcCwgIlxuIik7CisJfSBlbHNlIHsKKwkJZnByaW50ZihmcCwgIiUtMTVzICIsICIiKTsKKwkJZm9ybWF0X3JhdGUoZnAsIHZhbHMsIG4tPnJhdGUsIDQpOworCQlmb3JtYXRfcmF0ZShmcCwgdmFscywgbi0+cmF0ZSwgNik7CisJCWZvcm1hdF9yYXRlKGZwLCB2YWxzLCBuLT5yYXRlLCAxMSk7CisJCWZvcm1hdF9yYXRlKGZwLCB2YWxzLCBuLT5yYXRlLCAxMCk7CisJCWZwcmludGYoZnAsICJcbiIpOworCisJCWZwcmludGYoZnAsICIlLTE1cyAiLCAiIik7CisJCWZvcm1hdF9yYXRlKGZwLCB2YWxzLCBuLT5yYXRlLCAxMik7CisJCWZvcm1hdF9yYXRlKGZwLCB2YWxzLCBuLT5yYXRlLCAxMyk7CisJCWZvcm1hdF9yYXRlKGZwLCB2YWxzLCBuLT5yYXRlLCAxNCk7CisJCWZvcm1hdF9yYXRlKGZwLCB2YWxzLCBuLT5yYXRlLCAxNSk7CisJCWZwcmludGYoZnAsICJcbiIpOworCisJCWZwcmludGYoZnAsICIlLTE1cyAiLCAiIik7CisJCWZvcm1hdF9yYXRlKGZwLCB2YWxzLCBuLT5yYXRlLCA1KTsKKwkJZm9ybWF0X3JhdGUoZnAsIHZhbHMsIG4tPnJhdGUsIDcpOworCQlmb3JtYXRfcmF0ZShmcCwgdmFscywgbi0+cmF0ZSwgOSk7CisJCWZvcm1hdF9yYXRlKGZwLCB2YWxzLCBuLT5yYXRlLCAxNyk7CisJCWZwcmludGYoZnAsICJcbiIpOworCisJCWZwcmludGYoZnAsICIlLTE1cyAiLCAiIik7CisJCWZvcm1hdF9yYXRlKGZwLCB2YWxzLCBuLT5yYXRlLCAxNik7CisJCWZvcm1hdF9yYXRlKGZwLCB2YWxzLCBuLT5yYXRlLCAxOCk7CisJCWZvcm1hdF9yYXRlKGZwLCB2YWxzLCBuLT5yYXRlLCAxOSk7CisJCWZvcm1hdF9yYXRlKGZwLCB2YWxzLCBuLT5yYXRlLCAyMCk7CisJCWZwcmludGYoZnAsICJcbiIpOworCX0KK30KKworc3RhdGljIHZvaWQgZHVtcF9rZXJuX2RiKEZJTEUgKmZwKQoreworCWpzb25fd3JpdGVyX3QgKmp3ID0ganNvbl9vdXRwdXQgPyBqc29ud19uZXcoZnApIDogTlVMTDsKKwlzdHJ1Y3QgaWZzdGF0X2VudCAqbjsKKworCWlmIChqdykgeworCQlqc29ud19wcmV0dHkoancsIHByZXR0eSk7CisJCWpzb253X25hbWUoancsIGluZm9fc291cmNlKTsKKwkJanNvbndfc3RhcnRfb2JqZWN0KGp3KTsKKwl9IGVsc2UKKwkJcHJpbnRfaGVhZChmcCk7CisKKwlmb3IgKG49a2Vybl9kYjsgbjsgbj1uLT5uZXh0KSB7CisJCWlmICghbWF0Y2gobi0+bmFtZSkpCisJCQljb250aW51ZTsKKworCQlpZiAoancpCisJCQlwcmludF9vbmVfanNvbihqdywgbiwgbi0+dmFsKTsKKwkJZWxzZQorCQkJcHJpbnRfb25lX2lmKGZwLCBuLCBuLT52YWwpOworCX0KKwlpZiAoanNvbl9vdXRwdXQpCisJCWZwcmludGYoZnAsICJcbn0gfVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfaW5jcl9kYihGSUxFICpmcCkKK3sKKwlzdHJ1Y3QgaWZzdGF0X2VudCAqbiwgKmg7CisJanNvbl93cml0ZXJfdCAqancgPSBqc29uX291dHB1dCA/IGpzb253X25ldyhmcCkgOiBOVUxMOworCisJaCA9IGhpc3RfZGI7CisJaWYgKGp3KSB7CisJCWpzb253X3ByZXR0eShqdywgcHJldHR5KTsKKwkJanNvbndfbmFtZShqdywgaW5mb19zb3VyY2UpOworCQlqc29ud19zdGFydF9vYmplY3QoancpOworCX0gZWxzZQorCQlwcmludF9oZWFkKGZwKTsKKworCWZvciAobj1rZXJuX2RiOyBuOyBuPW4tPm5leHQpIHsKKwkJaW50IGk7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyB2YWxzW01BWFNdOworCQlzdHJ1Y3QgaWZzdGF0X2VudCAqaDE7CisKKwkJbWVtY3B5KHZhbHMsIG4tPnZhbCwgc2l6ZW9mKHZhbHMpKTsKKworCQlmb3IgKGgxID0gaDsgaDE7IGgxID0gaDEtPm5leHQpIHsKKwkJCWlmIChoMS0+aWZpbmRleCA9PSBuLT5pZmluZGV4KSB7CisJCQkJZm9yIChpID0gMDsgaSA8IE1BWFM7IGkrKykKKwkJCQkJdmFsc1tpXSAtPSBoMS0+dmFsW2ldOworCQkJCWggPSBoMS0+bmV4dDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIW1hdGNoKG4tPm5hbWUpKQorCQkJY29udGludWU7CisKKwkJaWYgKGp3KQorCQkJcHJpbnRfb25lX2pzb24oancsIG4sIG4tPnZhbCk7CisJCWVsc2UKKwkJCXByaW50X29uZV9pZihmcCwgbiwgdmFscyk7CisJfQorCisJaWYgKGp3KSB7CisJCWpzb253X2VuZF9vYmplY3QoancpOworCQlqc29ud19kZXN0cm95KCZqdyk7CisJfQorfQorCitzdGF0aWMgaW50IGNoaWxkcmVuOworCitzdGF0aWMgdm9pZCBzaWdjaGlsZChpbnQgc2lnbm8pCit7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9kYihpbnQgaW50ZXJ2YWwpCit7CisJc3RydWN0IGlmc3RhdF9lbnQgKm4sICpoOworCisJbiA9IGtlcm5fZGI7CisJa2Vybl9kYiA9IE5VTEw7CisKKwlsb2FkX2luZm8oKTsKKworCWggPSBrZXJuX2RiOworCWtlcm5fZGIgPSBuOworCisJZm9yIChuID0ga2Vybl9kYjsgbjsgbiA9IG4tPm5leHQpIHsKKwkJc3RydWN0IGlmc3RhdF9lbnQgKmgxOworCQlmb3IgKGgxID0gaDsgaDE7IGgxID0gaDEtPm5leHQpIHsKKwkJCWlmIChoMS0+aWZpbmRleCA9PSBuLT5pZmluZGV4KSB7CisJCQkJaW50IGk7CisJCQkJZm9yIChpID0gMDsgaSA8IE1BWFM7IGkrKykgeworCQkJCQlpZiAoKGxvbmcpKGgxLT5pdmFsW2ldIC0gbi0+aXZhbFtpXSkgPCAwKSB7CisJCQkJCQltZW1zZXQobi0+aXZhbCwgMCwgc2l6ZW9mKG4tPml2YWwpKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCWZvciAoaSA9IDA7IGkgPCBNQVhTOyBpKyspIHsKKwkJCQkJZG91YmxlIHNhbXBsZTsKKwkJCQkJdW5zaWduZWQgbG9uZyBpbmNyID0gaDEtPml2YWxbaV0gLSBuLT5pdmFsW2ldOworCQkJCQluLT52YWxbaV0gKz0gaW5jcjsKKwkJCQkJbi0+aXZhbFtpXSA9IGgxLT5pdmFsW2ldOworCQkJCQlzYW1wbGUgPSAoZG91YmxlKShpbmNyKjEwMDApL2ludGVydmFsOworCQkJCQlpZiAoaW50ZXJ2YWwgPj0gc2Nhbl9pbnRlcnZhbCkgeworCQkJCQkJbi0+cmF0ZVtpXSArPSBXKihzYW1wbGUtbi0+cmF0ZVtpXSk7CisJCQkJCX0gZWxzZSBpZiAoaW50ZXJ2YWwgPj0gMTAwMCkgeworCQkJCQkJaWYgKGludGVydmFsID49IHRpbWVfY29uc3RhbnQpIHsKKwkJCQkJCQluLT5yYXRlW2ldID0gc2FtcGxlOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlkb3VibGUgdyA9IFcqKGRvdWJsZSlpbnRlcnZhbC9zY2FuX2ludGVydmFsOworCQkJCQkJCW4tPnJhdGVbaV0gKz0gdyooc2FtcGxlLW4tPnJhdGVbaV0pOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJCQkJd2hpbGUgKGggIT0gaDEpIHsKKwkJCQkJc3RydWN0IGlmc3RhdF9lbnQgKnRtcCA9IGg7CisJCQkJCWggPSBoLT5uZXh0OworCQkJCQlmcmVlKHRtcC0+bmFtZSk7CisJCQkJCWZyZWUodG1wKTsKKwkJCQl9OworCQkJCWggPSBoMS0+bmV4dDsKKwkJCQlmcmVlKGgxLT5uYW1lKTsKKwkJCQlmcmVlKGgxKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKworI2RlZmluZSBUX0RJRkYoYSxiKSAoKChhKS50dl9zZWMtKGIpLnR2X3NlYykqMTAwMCArICgoYSkudHZfdXNlYy0oYikudHZfdXNlYykvMTAwMCkKKworCitzdGF0aWMgdm9pZCBzZXJ2ZXJfbG9vcChpbnQgZmQpCit7CisJc3RydWN0IHRpbWV2YWwgc25hcHRpbWUgPSB7IDAgfTsKKwlzdHJ1Y3QgcG9sbGZkIHA7CisJcC5mZCA9IGZkOworCXAuZXZlbnRzID0gcC5yZXZlbnRzID0gUE9MTElOOworCisJc3ByaW50ZihpbmZvX3NvdXJjZSwgIiVkLiVsdSBzYW1wbGluZ19pbnRlcnZhbD0lZCB0aW1lX2NvbnN0PSVkIiwKKwkJZ2V0cGlkKCksICh1bnNpZ25lZCBsb25nKXJhbmRvbSgpLCBzY2FuX2ludGVydmFsLzEwMDAsIHRpbWVfY29uc3RhbnQvMTAwMCk7CisKKwlsb2FkX2luZm8oKTsKKworCWZvciAoOzspIHsKKwkJaW50IHN0YXR1czsKKwkJaW50IHRkaWZmOworCQlzdHJ1Y3QgdGltZXZhbCBub3c7CisKKwkJZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpOworCQl0ZGlmZiA9IFRfRElGRihub3csIHNuYXB0aW1lKTsKKwkJaWYgKHRkaWZmID49IHNjYW5faW50ZXJ2YWwpIHsKKwkJCXVwZGF0ZV9kYih0ZGlmZik7CisJCQlzbmFwdGltZSA9IG5vdzsKKwkJCXRkaWZmID0gMDsKKwkJfQorCisJCWlmIChwb2xsKCZwLCAxLCB0ZGlmZiArIHNjYW5faW50ZXJ2YWwpID4gMAorCQkgICAgJiYgKHAucmV2ZW50cyZQT0xMSU4pKSB7CisJCQlpbnQgY2xudCA9IGFjY2VwdChmZCwgTlVMTCwgTlVMTCk7CisJCQlpZiAoY2xudCA+PSAwKSB7CisJCQkJcGlkX3QgcGlkOworCQkJCWlmIChjaGlsZHJlbiA+PSA1KSB7CisJCQkJCWNsb3NlKGNsbnQpOworCQkJCX0gZWxzZSBpZiAoKHBpZCA9IGZvcmsoKSkgIT0gMCkgeworCQkJCQlpZiAocGlkPjApCisJCQkJCQljaGlsZHJlbisrOworCQkJCQljbG9zZShjbG50KTsKKwkJCQl9IGVsc2UgeworCQkJCQlGSUxFICpmcCA9IGZkb3BlbihjbG50LCAidyIpOworCQkJCQlpZiAoZnApIHsKKwkJCQkJCWlmICh0ZGlmZiA+IDApCisJCQkJCQkJdXBkYXRlX2RiKHRkaWZmKTsKKwkJCQkJCWR1bXBfcmF3X2RiKGZwLCAwKTsKKwkJCQkJfQorCQkJCQlleGl0KDApOworCQkJCX0KKwkJCX0KKwkJfQorCQl3aGlsZSAoY2hpbGRyZW4gJiYgd2FpdHBpZCgtMSwgJnN0YXR1cywgV05PSEFORykgPiAwKQorCQkJY2hpbGRyZW4tLTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdmVyaWZ5X2ZvcmdpbmcoaW50IGZkKQoreworCXN0cnVjdCB1Y3JlZCBjcmVkOworCXNvY2tsZW5fdCBvbGVuID0gc2l6ZW9mKGNyZWQpOworCisJaWYgKGdldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1BFRVJDUkVELCAodm9pZCopJmNyZWQsICZvbGVuKSB8fAorCSAgICBvbGVuIDwgc2l6ZW9mKGNyZWQpKQorCQlyZXR1cm4gLTE7CisJaWYgKGNyZWQudWlkID09IGdldHVpZCgpIHx8IGNyZWQudWlkID09IDApCisJCXJldHVybiAwOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwKKyJVc2FnZTogaWZzdGF0IFtPUFRJT05dIFsgUEFUVEVSTiBbIFBBVFRFUk4gXSBdXG4iCisiICAgLWgsIC0taGVscAkJdGhpcyBtZXNzYWdlXG4iCisiICAgLWEsIC0taWdub3JlCWlnbm9yZSBoaXN0b3J5XG4iCisiICAgLWQsIC0tc2Nhbj1TRUNTCXNhbXBsZSBldmVyeSBzdGF0aXN0aWNzIGV2ZXJ5IFNFQ1NcbiIKKyIgICAtZSwgLS1lcnJvcnMJc2hvdyBlcnJvcnNcbiIKKyIgICAtaiwgLS1qc29uICAgICAgICAgIGZvcm1hdCBvdXRwdXQgaW4gSlNPTlxuIgorIiAgIC1uLCAtLW5vb3V0cHV0CWRvIGhpc3Rvcnkgb25seVxuIgorIiAgIC1wLCAtLXByZXR0eSAgICAgICAgcHJldHR5IHByaW50XG4iCisiICAgLXIsIC0tcmVzZXQJCXJlc2V0IGhpc3RvcnlcbiIKKyIgICAtcywgLS1ub3VwZGF0ZQlkb25cJ3QgdXBkYXRlIGhpc3RvcnlcbiIKKyIgICAtdCwgLS1pbnRlcnZhbD1TRUNTCXJlcG9ydCBhdmVyYWdlIG92ZXIgdGhlIGxhc3QgU0VDU1xuIgorIiAgIC1WLCAtLXZlcnNpb24Jb3V0cHV0IHZlcnNpb24gaW5mb3JtYXRpb25cbiIKKyIgICAteiwgLS16ZXJvcwkJc2hvdyBlbnRyaWVzIHdpdGggemVybyBhY3Rpdml0eVxuIik7CisKKwlleGl0KC0xKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gbG9uZ29wdHNbXSA9IHsKKwl7ICJoZWxwIiwgMCwgMCwgJ2gnIH0sCisJeyAiaWdub3JlIiwgIDAsICAwLCAnYScgfSwKKwl7ICJzY2FuIiwgMSwgMCwgJ2QnfSwKKwl7ICJlcnJvcnMiLCAwLCAwLCAnZScgfSwKKwl7ICJub291dHB1dCIsIDAsIDAsICduJyB9LAorCXsgImpzb24iLCAwLCAwLCAnaicgfSwKKwl7ICJyZXNldCIsIDAsIDAsICdyJyB9LAorCXsgInByZXR0eSIsIDAsIDAsICdwJyB9LAorCXsgIm5vdXBkYXRlIiwgMCwgMCwgJ3MnIH0sCisJeyAiaW50ZXJ2YWwiLCAxLCAwLCAndCcgfSwKKwl7ICJ2ZXJzaW9uIiwgMCwgMCwgJ1YnIH0sCisJeyAiemVyb3MiLCAwLCAwLCAneicgfSwKKwl7IDAgfQorfTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwljaGFyIGhpc3RfbmFtZVsxMjhdOworCXN0cnVjdCBzb2NrYWRkcl91biBzdW47CisJRklMRSAqaGlzdF9mcCA9IE5VTEw7CisJaW50IGNoOworCWludCBmZDsKKworCXdoaWxlICgoY2ggPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiaGpwdlZ6cm5hc2Q6dDplIiwKKwkJCWxvbmdvcHRzLCBOVUxMKSkgIT0gRU9GKSB7CisJCXN3aXRjaChjaCkgeworCQljYXNlICd6JzoKKwkJCWR1bXBfemVyb3MgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQkJcmVzZXRfaGlzdG9yeSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnYSc6CisJCQlpZ25vcmVfaGlzdG9yeSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlub191cGRhdGUgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ24nOgorCQkJbm9fb3V0cHV0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdlJzoKKwkJCXNob3dfZXJyb3JzID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdqJzoKKwkJCWpzb25fb3V0cHV0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdwJzoKKwkJCXByZXR0eSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnZCc6CisJCQlzY2FuX2ludGVydmFsID0gYXRvaShvcHRhcmcpICogMTAwMDsKKwkJCWlmIChzY2FuX2ludGVydmFsIDw9IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgImlmc3RhdDogaW52YWxpZCBzY2FuIGludGVydmFsXG4iKTsKKwkJCQlleGl0KC0xKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICd0JzoKKwkJCXRpbWVfY29uc3RhbnQgPSBhdG9pKG9wdGFyZyk7CisJCQlpZiAodGltZV9jb25zdGFudCA8PSAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJpZnN0YXQ6IGludmFsaWQgdGltZSBjb25zdGFudCBkaXZpc29yXG4iKTsKKwkJCQlleGl0KC0xKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICd2JzoKKwkJY2FzZSAnVic6CisJCQlwcmludGYoImlmc3RhdCB1dGlsaXR5LCBpcHJvdXRlMi1zcyVzXG4iLCBTTkFQU0hPVCk7CisJCQlleGl0KDApOworCQljYXNlICdoJzoKKwkJY2FzZSAnPyc6CisJCWRlZmF1bHQ6CisJCQl1c2FnZSgpOworCQl9CisJfQorCisJYXJnYyAtPSBvcHRpbmQ7CisJYXJndiArPSBvcHRpbmQ7CisKKwlzdW4uc3VuX2ZhbWlseSA9IEFGX1VOSVg7CisJc3VuLnN1bl9wYXRoWzBdID0gMDsKKwlzcHJpbnRmKHN1bi5zdW5fcGF0aCsxLCAiaWZzdGF0JWQiLCBnZXR1aWQoKSk7CisKKwlpZiAoc2Nhbl9pbnRlcnZhbCA+IDApIHsKKwkJaWYgKHRpbWVfY29uc3RhbnQgPT0gMCkKKwkJCXRpbWVfY29uc3RhbnQgPSA2MDsKKwkJdGltZV9jb25zdGFudCAqPSAxMDAwOworCQlXID0gMSAtIDEvZXhwKGxvZygxMCkqKGRvdWJsZSlzY2FuX2ludGVydmFsL3RpbWVfY29uc3RhbnQpOworCQlpZiAoKGZkID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKSkgPCAwKSB7CisJCQlwZXJyb3IoImlmc3RhdDogc29ja2V0Iik7CisJCQlleGl0KC0xKTsKKwkJfQorCQlpZiAoYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciopJnN1biwgMisxK3N0cmxlbihzdW4uc3VuX3BhdGgrMSkpIDwgMCkgeworCQkJcGVycm9yKCJpZnN0YXQ6IGJpbmQiKTsKKwkJCWV4aXQoLTEpOworCQl9CisJCWlmIChsaXN0ZW4oZmQsIDUpIDwgMCkgeworCQkJcGVycm9yKCJpZnN0YXQ6IGxpc3RlbiIpOworCQkJZXhpdCgtMSk7CisJCX0KKwkJaWYgKGRhZW1vbigwLCAwKSkgeworCQkJcGVycm9yKCJpZnN0YXQ6IGRhZW1vbiIpOworCQkJZXhpdCgtMSk7CisJCX0KKwkJc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworCQlzaWduYWwoU0lHQ0hMRCwgc2lnY2hpbGQpOworCQlzZXJ2ZXJfbG9vcChmZCk7CisJCWV4aXQoMCk7CisJfQorCisJcGF0dGVybnMgPSBhcmd2OworCW5wYXR0ZXJucyA9IGFyZ2M7CisKKwlpZiAoZ2V0ZW52KCJJRlNUQVRfSElTVE9SWSIpKQorCQlzbnByaW50ZihoaXN0X25hbWUsIHNpemVvZihoaXN0X25hbWUpLAorCQkJICIlcyIsIGdldGVudigiSUZTVEFUX0hJU1RPUlkiKSk7CisJZWxzZQorCQlzbnByaW50ZihoaXN0X25hbWUsIHNpemVvZihoaXN0X25hbWUpLAorCQkJICIlcy8uaWZzdGF0LnUlZCIsIFBfdG1wZGlyLCBnZXR1aWQoKSk7CisKKwlpZiAocmVzZXRfaGlzdG9yeSkKKwkJdW5saW5rKGhpc3RfbmFtZSk7CisKKwlpZiAoIWlnbm9yZV9oaXN0b3J5IHx8ICFub191cGRhdGUpIHsKKwkJc3RydWN0IHN0YXQgc3RiOworCisJCWZkID0gb3BlbihoaXN0X25hbWUsIE9fUkRXUnxPX0NSRUFUfE9fTk9GT0xMT1csIDA2MDApOworCQlpZiAoZmQgPCAwKSB7CisJCQlwZXJyb3IoImlmc3RhdDogb3BlbiBoaXN0b3J5IGZpbGUiKTsKKwkJCWV4aXQoLTEpOworCQl9CisJCWlmICgoaGlzdF9mcCA9IGZkb3BlbihmZCwgInIrIikpID09IE5VTEwpIHsKKwkJCXBlcnJvcigiaWZzdGF0OiBmZG9wZW4gaGlzdG9yeSBmaWxlIik7CisJCQlleGl0KC0xKTsKKwkJfQorCQlpZiAoZmxvY2soZmlsZW5vKGhpc3RfZnApLCBMT0NLX0VYKSkgeworCQkJcGVycm9yKCJpZnN0YXQ6IGZsb2NrIGhpc3RvcnkgZmlsZSIpOworCQkJZXhpdCgtMSk7CisJCX0KKwkJaWYgKGZzdGF0KGZpbGVubyhoaXN0X2ZwKSwgJnN0YikgIT0gMCkgeworCQkJcGVycm9yKCJpZnN0YXQ6IGZzdGF0IGhpc3RvcnkgZmlsZSIpOworCQkJZXhpdCgtMSk7CisJCX0KKwkJaWYgKHN0Yi5zdF9ubGluayAhPSAxIHx8IHN0Yi5zdF91aWQgIT0gZ2V0dWlkKCkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiaWZzdGF0OiBzb21ldGhpbmcgaXMgc28gd3Jvbmcgd2l0aCBoaXN0b3J5IGZpbGUsIHRoYXQgSSBwcmVmZXIgbm90IHRvIHByb2NlZWQuXG4iKTsKKwkJCWV4aXQoLTEpOworCQl9CisJCWlmICghaWdub3JlX2hpc3RvcnkpIHsKKwkJCUZJTEUgKnRmcDsKKwkJCWxvbmcgdXB0aW1lID0gLTE7CisJCQlpZiAoKHRmcCA9IGZvcGVuKCIvcHJvYy91cHRpbWUiLCAiciIpKSAhPSBOVUxMKSB7CisJCQkJaWYgKGZzY2FuZih0ZnAsICIlbGQiLCAmdXB0aW1lKSAhPSAxKQorCQkJCQl1cHRpbWUgPSAtMTsKKwkJCQlmY2xvc2UodGZwKTsKKwkJCX0KKwkJCWlmICh1cHRpbWUgPj0gMCAmJiB0aW1lKE5VTEwpID49IHN0Yi5zdF9tdGltZSt1cHRpbWUpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgImlmc3RhdDogaGlzdG9yeSBpcyBhZ2VkIG91dCwgcmVzZXR0aW5nXG4iKTsKKwkJCQlpZiAoZnRydW5jYXRlKGZpbGVubyhoaXN0X2ZwKSwgMCkpCisJCQkJCXBlcnJvcigiaWZzdGF0OiBmdHJ1bmNhdGUiKTsKKwkJCX0KKwkJfQorCisJCWxvYWRfcmF3X3RhYmxlKGhpc3RfZnApOworCisJCWhpc3RfZGIgPSBrZXJuX2RiOworCQlrZXJuX2RiID0gTlVMTDsKKwl9CisKKwlpZiAoKGZkID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKSkgPj0gMCAmJgorCSAgICAoY29ubmVjdChmZCwgKHN0cnVjdCBzb2NrYWRkciopJnN1biwgMisxK3N0cmxlbihzdW4uc3VuX3BhdGgrMSkpID09IDAKKwkgICAgIHx8IChzdHJjcHkoc3VuLnN1bl9wYXRoKzEsICJpZnN0YXQwIiksCisJCSBjb25uZWN0KGZkLCAoc3RydWN0IHNvY2thZGRyKikmc3VuLCAyKzErc3RybGVuKHN1bi5zdW5fcGF0aCsxKSkgPT0gMCkpCisJICAgICYmIHZlcmlmeV9mb3JnaW5nKGZkKSA9PSAwKSB7CisJCUZJTEUgKnNmcCA9IGZkb3BlbihmZCwgInIiKTsKKwkJbG9hZF9yYXdfdGFibGUoc2ZwKTsKKwkJaWYgKGhpc3RfZGIgJiYgc291cmNlX21pc21hdGNoKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImlmc3RhdDogaGlzdG9yeSBpcyBzdGFsZSwgaWdub3JpbmcgaXQuXG4iKTsKKwkJCWhpc3RfZGIgPSBOVUxMOworCQl9CisJCWZjbG9zZShzZnApOworCX0gZWxzZSB7CisJCWlmIChmZCA+PSAwKQorCQkJY2xvc2UoZmQpOworCQlpZiAoaGlzdF9kYiAmJiBpbmZvX3NvdXJjZVswXSAmJiBzdHJjbXAoaW5mb19zb3VyY2UsICJrZXJuZWwiKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJpZnN0YXQ6IGhpc3RvcnkgaXMgc3RhbGUsIGlnbm9yaW5nIGl0LlxuIik7CisJCQloaXN0X2RiID0gTlVMTDsKKwkJCWluZm9fc291cmNlWzBdID0gMDsKKwkJfQorCQlsb2FkX2luZm8oKTsKKwkJaWYgKGluZm9fc291cmNlWzBdID09IDApCisJCQlzdHJjcHkoaW5mb19zb3VyY2UsICJrZXJuZWwiKTsKKwl9CisKKwlpZiAoIW5vX291dHB1dCkgeworCQlpZiAoaWdub3JlX2hpc3RvcnkgfHwgaGlzdF9kYiA9PSBOVUxMKQorCQkJZHVtcF9rZXJuX2RiKHN0ZG91dCk7CisJCWVsc2UKKwkJCWR1bXBfaW5jcl9kYihzdGRvdXQpOworCX0KKworCWlmICghbm9fdXBkYXRlKSB7CisJCWlmIChmdHJ1bmNhdGUoZmlsZW5vKGhpc3RfZnApLCAwKSkKKwkJCXBlcnJvcigiaWZzdGF0OiBmdHJ1bmNhdGUiKTsKKwkJcmV3aW5kKGhpc3RfZnApOworCisJCWpzb25fb3V0cHV0ID0gMDsKKwkJZHVtcF9yYXdfZGIoaGlzdF9mcCwgMSk7CisJCWZjbG9zZShoaXN0X2ZwKTsKKwl9CisJZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL21pc2MvbG5zdGF0LmMgYi9pcHJvdXRlMi9taXNjL2xuc3RhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NGM5NTMKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9taXNjL2xuc3RhdC5jCkBAIC0wLDAgKzEsMzgwIEBACisvKiBsbnN0YXQgLSBVbmlmaWVkIGxpbnV4IG5ldHdvcmsgc3RhdGlzdGljcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIERldmVsb3BtZW50IG9mIHRoaXMgY29kZSB3YXMgZnVuZGVkIGJ5IEFzdGFybyBBRywgaHR0cDovL3d3dy5hc3Rhcm8uY29tLworICoKKyAqIEJhc2VkIG9uIG9yaWdpbmFsIGNvbmNlcHQgYW5kIGlkZWFzIGZyb20gcHJlZGVjZXNzb3IgcnRzdGF0LmM6CisgKgorICogQ29weXJpZ2h0IDIwMDEgYnkgUm9iZXJ0IE9sc3NvbiA8cm9iZXJ0Lm9sc3NvbkBpdHMudXUuc2U+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwcHNhbGEgVW5pdmVyc2l0eSwgU3dlZGVuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworLyogTWF4aW11bSBudW1iZXIgb2YgZmllbGRzIHRoYXQgY2FuIGJlIGRpc3BsYXllZCAqLworI2RlZmluZSBNQVhfRklFTERTCQkxMjgKKworLyogTWF4aW11bSBudW1iZXIgb2YgaGVhZGVyIGxpbmVzICovCisjZGVmaW5lIEhEUl9MSU5FUwkJMTAKKworLyogZGVmYXVsdCBmaWVsZCB3aWR0aCBpZiBub25lIHNwZWNpZmllZCAqLworI2RlZmluZSBGSUVMRF9XSURUSF9ERUZBVUxUCTgKKyNkZWZpbmUgRklFTERfV0lEVEhfTUFYCQkyMAorCisjZGVmaW5lIERFRkFVTFRfSU5URVJWQUwJMgorCisjZGVmaW5lIEhEUl9MSU5FX0xFTkdUSAkJKE1BWF9GSUVMRFMqRklFTERfV0lEVEhfTUFYKQorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKworI2luY2x1ZGUgPGpzb25fd3JpdGVyLmg+CisjaW5jbHVkZSAibG5zdGF0LmgiCisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdHNbXSA9IHsKKwl7ICJ2ZXJzaW9uIiwgMCwgTlVMTCwgJ1YnIH0sCisJeyAiY291bnQiLCAxLCBOVUxMLCAnYycgfSwKKwl7ICJkdW1wIiwgMCwgTlVMTCwgJ2QnIH0sCisJeyAianNvbiIsIDAsIE5VTEwsICdqJyB9LAorCXsgImZpbGUiLCAxLCBOVUxMLCAnZicgfSwKKwl7ICJoZWxwIiwgMCwgTlVMTCwgJ2gnIH0sCisJeyAiaW50ZXJ2YWwiLCAxLCBOVUxMLCAnaScgfSwKKwl7ICJrZXlzIiwgMSwgTlVMTCwgJ2snIH0sCisJeyAic3ViamVjdCIsIDEsIE5VTEwsICdzJyB9LAorCXsgIndpZHRoIiwgMSwgTlVMTCwgJ3cnIH0sCisJeyAib25lbGluZSIsIDAsIE5VTEwsIDAgfSwKK307CisKK3N0YXRpYyBpbnQgdXNhZ2UoY2hhciAqbmFtZSwgaW50IGV4aXRfY29kZSkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIiVzIFZlcnNpb24gJXNcbiIsIG5hbWUsIExOU1RBVF9WRVJTSU9OKTsKKwlmcHJpbnRmKHN0ZGVyciwgIkNvcHlyaWdodCAoQykgMjAwNCBieSBIYXJhbGQgV2VsdGUgIgorCQkJIjxsYWZvcmdlQGdudW1vbmtzLm9yZz5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmUgbGljZW5zZWQgdW5kZXIgR05VIEdQTHYyIgorCQkJIlxud2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLlxuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlBhcmFtZXRlcnM6XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0LVYgLS12ZXJzaW9uXHRcdFByaW50IFZlcnNpb24gb2YgUHJvZ3JhbVxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdC1jIC0tY291bnQgPGNvdW50Plx0IgorCQkJIlByaW50IDxjb3VudD4gbnVtYmVyIG9mIGludGVydmFsc1xuIik7CisJZnByaW50ZihzdGRlcnIsICJcdC1kIC0tZHVtcFx0XHQiCisJCQkiRHVtcCBsaXN0IG9mIGF2YWlsYWJsZSBmaWxlcy9rZXlzXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0LWogLS1qc29uXHRcdCIKKwkJCSJEaXNwbGF5IGluIEpTT04gZm9ybWF0XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0LWYgLS1maWxlIDxmaWxlPlx0U3RhdGlzdGljcyBmaWxlIHRvIHVzZVxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdC1oIC0taGVscFx0XHRUaGlzIGhlbHAgbWVzc2FnZVxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdC1pIC0taW50ZXJ2YWwgPGludHY+XHQiCisJCQkiU2V0IGludGVydmFsIHRvICdpbnR2JyBzZWNvbmRzXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0LWsgLS1rZXlzIGssayxrLC4uLlx0RGlzcGxheSBvbmx5IGtleXMgc3BlY2lmaWVkXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0LXMgLS1zdWJqZWN0IFswLTJdXHRDb250cm9sIGhlYWRlciBwcmludGluZzpcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHRcdFx0XHQwID0gbmV2ZXJcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHRcdFx0XHQxID0gb25jZVxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdFx0XHRcdDIgPSBldmVyeSAyMCBsaW5lcyAoZGVmYXVsdCkpXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0LXcgLS13aWR0aCBuLG4sbiwuLi5cdFdpZHRoIGZvciBlYWNoIGZpZWxkXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisKKwlleGl0KGV4aXRfY29kZSk7Cit9CisKK3N0cnVjdCBmaWVsZF9wYXJhbSB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgbG5zdGF0X2ZpZWxkICpsZjsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBpbnQgd2lkdGg7CisJfSBwcmludDsKK307CisKK3N0cnVjdCBmaWVsZF9wYXJhbXMgeworCXVuc2lnbmVkIGludCBudW07CisJc3RydWN0IGZpZWxkX3BhcmFtIHBhcmFtc1tNQVhfRklFTERTXTsKK307CisKK3N0YXRpYyB2b2lkIHByaW50X2xpbmUoRklMRSAqb2YsIGNvbnN0IHN0cnVjdCBsbnN0YXRfZmlsZSAqbG5zdGF0X2ZpbGVzLAorCQkgICAgICAgY29uc3Qgc3RydWN0IGZpZWxkX3BhcmFtcyAqZnApCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZnAtPm51bTsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBsbnN0YXRfZmllbGQgKmxmID0gZnAtPnBhcmFtc1tpXS5sZjsKKworCQlmcHJpbnRmKG9mLCAiJSpsdXwiLCBmcC0+cGFyYW1zW2ldLnByaW50LndpZHRoLCBsZi0+cmVzdWx0KTsKKwl9CisJZnB1dGMoJ1xuJywgb2YpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9qc29uKEZJTEUgKm9mLCBjb25zdCBzdHJ1Y3QgbG5zdGF0X2ZpbGUgKmxuc3RhdF9maWxlcywKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBmaWVsZF9wYXJhbXMgKmZwKQoreworCWpzb25fd3JpdGVyX3QgKmp3ID0ganNvbndfbmV3KG9mKTsKKwlpbnQgaTsKKworCWpzb253X3N0YXJ0X29iamVjdChqdyk7CisJZm9yIChpID0gMDsgaSA8IGZwLT5udW07IGkrKykgeworCQljb25zdCBzdHJ1Y3QgbG5zdGF0X2ZpZWxkICpsZiA9IGZwLT5wYXJhbXNbaV0ubGY7CisKKwkJanNvbndfdWludF9maWVsZChqdywgbGYtPm5hbWUsIGxmLT5yZXN1bHQpOworCX0KKwlqc29ud19lbmRfb2JqZWN0KGp3KTsKKwlqc29ud19kZXN0cm95KCZqdyk7Cit9CisKKy8qIGZpbmQgbG5zdGF0X2ZpZWxkIGFjY29yZGluZyB0byB1c2VyIHNwZWNpZmljYXRpb24gKi8KK3N0YXRpYyBpbnQgbWFwX2ZpZWxkX3BhcmFtcyhzdHJ1Y3QgbG5zdGF0X2ZpbGUgKmxuc3RhdF9maWxlcywKKwkJCSAgICBzdHJ1Y3QgZmllbGRfcGFyYW1zICpmcHMsIGludCBpbnRlcnZhbCkKK3sKKwlpbnQgaSwgaiA9IDA7CisJc3RydWN0IGxuc3RhdF9maWxlICpsZjsKKworCS8qIG5vIGZpZWxkIHNwZWNpZmljYXRpb24gb24gY29tbWFuZGxpbmUsIG5lZWQgdG8gYnVpbGQgZGVmYXVsdCAqLworCWlmICghZnBzLT5udW0pIHsKKwkJZm9yIChsZiA9IGxuc3RhdF9maWxlczsgbGY7IGxmID0gbGYtPm5leHQpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBsZi0+bnVtX2ZpZWxkczsgaSsrKSB7CisJCQkJZnBzLT5wYXJhbXNbal0ubGYgPSAmbGYtPmZpZWxkc1tpXTsKKwkJCQlmcHMtPnBhcmFtc1tqXS5sZi0+ZmlsZS0+aW50ZXJ2YWwudHZfc2VjID0KKwkJCQkJCQkJaW50ZXJ2YWw7CisJCQkJaWYgKCFmcHMtPnBhcmFtc1tqXS5wcmludC53aWR0aCkKKwkJCQkJZnBzLT5wYXJhbXNbal0ucHJpbnQud2lkdGggPQorCQkJCQkJCUZJRUxEX1dJRFRIX0RFRkFVTFQ7CisKKwkJCQlpZiAoKytqID49IE1BWF9GSUVMRFMgLSAxKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkJIldBUk46IE1BWF9GSUVMRFMgKCVkKSByZWFjaGVkLCIKKwkJCQkJCSIgdHJ1bmNhdGluZyBudW1iZXIgb2Yga2V5c1xuIiwKKwkJCQkJCU1BWF9GSUVMRFMpOworCQkJCQlnb3RvIGZ1bGw7CisJCQkJfQorCQkJfQorCQl9CisJZnVsbDoKKwkJZnBzLT5udW0gPSBqOworCQlyZXR1cm4gMTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZnBzLT5udW07IGkrKykgeworCQlmcHMtPnBhcmFtc1tpXS5sZiA9IGxuc3RhdF9maW5kX2ZpZWxkKGxuc3RhdF9maWxlcywKKwkJCQkJCSAgICAgIGZwcy0+cGFyYW1zW2ldLm5hbWUpOworCQlpZiAoIWZwcy0+cGFyYW1zW2ldLmxmKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkZpZWxkIGAlcycgdW5rbm93blxuIiwKKwkJCQlmcHMtPnBhcmFtc1tpXS5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJCWZwcy0+cGFyYW1zW2ldLmxmLT5maWxlLT5pbnRlcnZhbC50dl9zZWMgPSBpbnRlcnZhbDsKKwkJaWYgKCFmcHMtPnBhcmFtc1tpXS5wcmludC53aWR0aCkKKwkJCWZwcy0+cGFyYW1zW2ldLnByaW50LndpZHRoID0gRklFTERfV0lEVEhfREVGQVVMVDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCB0YWJsZV9oZHIgeworCWludCBudW1fbGluZXM7CisJY2hhciAqaGRyW0hEUl9MSU5FU107Cit9OworCitzdGF0aWMgc3RydWN0IHRhYmxlX2hkciAqYnVpbGRfaGRyX3N0cmluZyhzdHJ1Y3QgbG5zdGF0X2ZpbGUgKmxuc3RhdF9maWxlcywKKwkJCQkJICBzdHJ1Y3QgZmllbGRfcGFyYW1zICpmcHMsCisJCQkJCSAgaW50IGxpbmV3aWR0aCkKK3sKKwlpbnQgaCxpOworCXN0YXRpYyBzdHJ1Y3QgdGFibGVfaGRyIHRoOworCWludCBvZnMgPSAwOworCisJZm9yIChpID0gMDsgaSA8IEhEUl9MSU5FUzsgaSsrKSB7CisJCXRoLmhkcltpXSA9IG1hbGxvYyhIRFJfTElORV9MRU5HVEgpOworCQltZW1zZXQodGguaGRyW2ldLCAwLCBIRFJfTElORV9MRU5HVEgpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBmcHMtPm51bTsgaSsrKSB7CisJCWNoYXIgKmNuYW1lLCAqZm5hbWUgPSBmcHMtPnBhcmFtc1tpXS5sZi0+bmFtZTsKKwkJdW5zaWduZWQgaW50IHdpZHRoID0gZnBzLT5wYXJhbXNbaV0ucHJpbnQud2lkdGg7CisKKwkJc25wcmludGYodGguaGRyWzBdK29mcywgd2lkdGgrMiwgIiUqLipzfCIsIHdpZHRoLCB3aWR0aCwKKwkJCSBmcHMtPnBhcmFtc1tpXS5sZi0+ZmlsZS0+YmFzZW5hbWUpOworCisJCWNuYW1lID0gZm5hbWU7CisJCWZvciAoaCA9IDE7IGggPCBIRFJfTElORVM7IGgrKykgeworCQkJaWYgKGNuYW1lIC0gZm5hbWUgPj0gc3RybGVuKGZuYW1lKSkKKwkJCQlzbnByaW50Zih0aC5oZHJbaF0rb2ZzLCB3aWR0aCsyLAorCQkJCQkgIiUqLipzfCIsIHdpZHRoLCB3aWR0aCwgIiIpOworCQkJZWxzZSB7CisJCQkJdGgubnVtX2xpbmVzID0gaCsxOworCQkJCXNucHJpbnRmKHRoLmhkcltoXStvZnMsIHdpZHRoKzIsCisJCQkJCSAiJSouKnN8Iiwgd2lkdGgsIHdpZHRoLCBjbmFtZSk7CisJCQl9CisJCQljbmFtZSArPSB3aWR0aDsKKwkJfQorCQlvZnMgKz0gd2lkdGgrMTsKKwl9CisJLyogZmlsbCBpbiBzcGFjZXMgKi8KKwlmb3IgKGggPSAxOyBoIDw9IHRoLm51bV9saW5lczsgaCsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBvZnM7IGkrKykgeworCQkJaWYgKHRoLmhkcltoXVtpXSA9PSAnXDAnKQorCQkJCXRoLmhkcltoXVtpXSA9ICcgJzsKKwkJfQorCX0KKworCXJldHVybiAmdGg7Cit9CisKK3N0YXRpYyBpbnQgcHJpbnRfaGRyKEZJTEUgKm9mLCBzdHJ1Y3QgdGFibGVfaGRyICp0aCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB0aC0+bnVtX2xpbmVzOyBpKyspIHsKKwkJZnB1dHModGgtPmhkcltpXSwgb2YpOworCQlmcHV0YygnXG4nLCBvZik7CisJfQorCXJldHVybiAwOworfQorCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgbG5zdGF0X2ZpbGUgKmxuc3RhdF9maWxlczsKKwljb25zdCBjaGFyICpiYXNlbmFtZTsKKwlpbnQgaSwgYzsKKwlpbnQgaW50ZXJ2YWwgPSBERUZBVUxUX0lOVEVSVkFMOworCWludCBoZHIgPSAyOworCWVudW0geworCQlNT0RFX0RVTVAsCisJCU1PREVfSlNPTiwKKwkJTU9ERV9OT1JNQUwsCisJfSBtb2RlID0gTU9ERV9OT1JNQUw7CisJdW5zaWduZWQgbG9uZyBjb3VudCA9IDA7CisJc3RydWN0IHRhYmxlX2hkciAqaGVhZGVyOworCXN0YXRpYyBzdHJ1Y3QgZmllbGRfcGFyYW1zIGZwOworCWludCBudW1fcmVxX2ZpbGVzID0gMDsKKwljaGFyICpyZXFfZmlsZXNbTE5TVEFUX01BWF9GSUxFU107CisKKwkvKiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBtb2RlIGZvciBvbGQgdG9vbHMgKi8KKwliYXNlbmFtZSA9IHN0cnJjaHIoYXJndlswXSwgJy8nKTsKKwlpZiAoYmFzZW5hbWUpCisJCWJhc2VuYW1lICs9IDE7CSAgLyogbmFtZSBhZnRlciBzbGFzaCAqLworCWVsc2UKKwkJYmFzZW5hbWUgPSBhcmd2WzBdOyAvKiBubyBzbGFzaCAqLworCisJaWYgKCFzdHJjbXAoYmFzZW5hbWUsICJydHN0YXQiKSkgeworCQkvKiBydHN0YXQgY29tcGF0aWJpbGl0eSBtb2RlICovCisJCXJlcV9maWxlc1swXSA9ICJydF9jYWNoZSI7CisJCW51bV9yZXFfZmlsZXMgPSAxOworCX0gZWxzZSBpZiAoIXN0cmNtcChiYXNlbmFtZSwgImN0c3RhdCIpKSB7CisJCS8qIGN0c3RhdCBjb21wYXRpYmlsaXR5IG1vZGUgKi8KKwkJcmVxX2ZpbGVzWzBdID0gImlwX2Nvbm50cmFjayI7CisJCW51bV9yZXFfZmlsZXMgPSAxOworCX0KKworCXdoaWxlICgoYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsIlZjOmRqcGY6aD9pOms6czp3OiIsCisJCQkJb3B0cywgTlVMTCkpICE9IC0xKSB7CisJCWludCBsZW4gPSAwOworCQljaGFyICp0bXAsICp0b2s7CisKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ2MnOgorCQkJY291bnQgPSBzdHJ0b3VsKG9wdGFyZywgTlVMTCwgMCk7CisJCQlicmVhazsKKwkJY2FzZSAnZCc6CisJCQltb2RlID0gTU9ERV9EVU1QOworCQkJYnJlYWs7CisJCWNhc2UgJ2onOgorCQkJbW9kZSA9IE1PREVfSlNPTjsKKwkJCWJyZWFrOworCQljYXNlICdmJzoKKwkJCXJlcV9maWxlc1tudW1fcmVxX2ZpbGVzKytdID0gc3RyZHVwKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCWNhc2UgJ2gnOgorCQkJdXNhZ2UoYXJndlswXSwgMCk7CisJCQlicmVhazsKKwkJY2FzZSAnaSc6CisJCQlzc2NhbmYob3B0YXJnLCAiJXUiLCAmaW50ZXJ2YWwpOworCQkJYnJlYWs7CisJCWNhc2UgJ2snOgorCQkJdG1wID0gc3RyZHVwKG9wdGFyZyk7CisJCQlpZiAoIXRtcCkKKwkJCQlicmVhazsKKwkJCWZvciAodG9rID0gc3RydG9rKHRtcCwgIiwiKTsKKwkJCSAgICAgdG9rOworCQkJICAgICB0b2sgPSBzdHJ0b2soTlVMTCwgIiwiKSkgeworCQkJCWlmIChmcC5udW0gPj0gTUFYX0ZJRUxEUykgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJCSJXQVJOOiB0b28gbWFueSBrZXlzIgorCQkJCQkJIiByZXF1ZXN0ZWQ6ICglZCBtYXgpXG4iLAorCQkJCQkJTUFYX0ZJRUxEUyk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlmcC5wYXJhbXNbZnAubnVtKytdLm5hbWUgPSB0b2s7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlzc2NhbmYob3B0YXJnLCAiJXUiLCAmaGRyKTsKKwkJCWJyZWFrOworCQljYXNlICd3JzoKKwkJCXRtcCA9IHN0cmR1cChvcHRhcmcpOworCQkJaWYgKCF0bXApCisJCQkJYnJlYWs7CisJCQlpID0gMDsKKwkJCWZvciAodG9rID0gc3RydG9rKHRtcCwgIiwiKTsKKwkJCSAgICAgdG9rOworCQkJICAgICB0b2sgPSBzdHJ0b2soTlVMTCwgIiwiKSkgeworCQkJCWxlbiAgPSBzdHJ0b3VsKHRvaywgTlVMTCwgMCk7CisJCQkJaWYgKGxlbiA+IEZJRUxEX1dJRFRIX01BWCkKKwkJCQkJbGVuID0gRklFTERfV0lEVEhfTUFYOworCQkJCWZwLnBhcmFtc1tpXS5wcmludC53aWR0aCA9IGxlbjsKKwkJCQlpKys7CisJCQl9CisJCQlpZiAoaSA9PSAxKSB7CisJCQkJZm9yIChpID0gMDsgaSA8IE1BWF9GSUVMRFM7IGkrKykKKwkJCQkJZnAucGFyYW1zW2ldLnByaW50LndpZHRoID0gbGVuOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl1c2FnZShhcmd2WzBdLCAxKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJbG5zdGF0X2ZpbGVzID0gbG5zdGF0X3NjYW5fZGlyKFBST0NfTkVUX1NUQVQsIG51bV9yZXFfZmlsZXMsCisJCQkJICAgICAgIChjb25zdCBjaGFyICoqKSByZXFfZmlsZXMpOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBNT0RFX0RVTVA6CisJCWxuc3RhdF9kdW1wKHN0ZG91dCwgbG5zdGF0X2ZpbGVzKTsKKwkJYnJlYWs7CisKKwljYXNlIE1PREVfTk9STUFMOgorCWNhc2UgTU9ERV9KU09OOgorCQlpZiAoIW1hcF9maWVsZF9wYXJhbXMobG5zdGF0X2ZpbGVzLCAmZnAsIGludGVydmFsKSkKKwkJCWV4aXQoMSk7CisKKwkJaGVhZGVyID0gYnVpbGRfaGRyX3N0cmluZyhsbnN0YXRfZmlsZXMsICZmcCwgODApOworCQlpZiAoIWhlYWRlcikKKwkJCWV4aXQoMSk7CisKKwkJaWYgKGludGVydmFsIDwgMSApCisJCQlpbnRlcnZhbCA9IDE7CisKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50IHx8ICFjb3VudDsgaSsrKSB7CisJCQlsbnN0YXRfdXBkYXRlKGxuc3RhdF9maWxlcyk7CisJCQlpZiAobW9kZSA9PSBNT0RFX0pTT04pCisJCQkJcHJpbnRfanNvbihzdGRvdXQsIGxuc3RhdF9maWxlcywgJmZwKTsKKwkJCWVsc2UgeworCQkJCWlmICAoKGhkciA+IDEgJiYgIShpICUgMjApKSB8fAorCQkJCSAgICAgKGhkciA9PSAxICYmIGkgPT0gMCkpCisJCQkJCXByaW50X2hkcihzdGRvdXQsIGhlYWRlcik7CisJCQkJcHJpbnRfbGluZShzdGRvdXQsIGxuc3RhdF9maWxlcywgJmZwKTsKKwkJCX0KKwkJCWZmbHVzaChzdGRvdXQpOworCQkJaWYgKGkgPCBjb3VudCAtIDEgfHwgIWNvdW50KQorCQkJCXNsZWVwKGludGVydmFsKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL21pc2MvbG5zdGF0LmggYi9pcHJvdXRlMi9taXNjL2xuc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZGFkOTcKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9taXNjL2xuc3RhdC5oCkBAIC0wLDAgKzEsNDQgQEAKKyNpZm5kZWYgX0xOU1RBVF9ICisjZGVmaW5lIF9MTlNUQVRfSAorCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorCisjZGVmaW5lIExOU1RBVF9WRVJTSU9OICIwLjAyIDA0MTAwMiIKKworI2RlZmluZSBQUk9DX05FVF9TVEFUCSIvcHJvYy9uZXQvc3RhdCIKKworI2RlZmluZSBMTlNUQVRfTUFYX0ZJTEVTCQkJMzIKKyNkZWZpbmUgTE5TVEFUX01BWF9GSUVMRFNfUEVSX0xJTkUJCTMyCisjZGVmaW5lIExOU1RBVF9NQVhfRklFTERfTkFNRV9MRU4JCTMyCisKK3N0cnVjdCBsbnN0YXRfZmlsZTsKKworc3RydWN0IGxuc3RhdF9maWVsZCB7CisJc3RydWN0IGxuc3RhdF9maWxlICpmaWxlOworCXVuc2lnbmVkIGludCBudW07CQkJLyogZmllbGQgbnVtYmVyIGluIGxpbmUgKi8KKwljaGFyIG5hbWVbTE5TVEFUX01BWF9GSUVMRF9OQU1FX0xFTisxXTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlc1syXTsJCS8qIHR3byBidWZmZXJzIGZvciB2YWx1ZXMgKi8KKwl1bnNpZ25lZCBsb25nIHJlc3VsdDsKK307CisKK3N0cnVjdCBsbnN0YXRfZmlsZSB7CisJc3RydWN0IGxuc3RhdF9maWxlICpuZXh0OworCWNoYXIgcGF0aFtQQVRIX01BWCsxXTsKKwljaGFyIGJhc2VuYW1lW05BTUVfTUFYKzFdOworCXN0cnVjdCB0aW1ldmFsIGxhc3RfcmVhZDsJCS8qIGxhc3QgdGltZSBvZiByZWFkICovCisJc3RydWN0IHRpbWV2YWwgaW50ZXJ2YWw7CQkvKiBpbnRlcnZhbCAqLworCWludCBjb21wYXQ7CQkJCS8qIDEgPT0gYmFja3dhcmRzIGNvbXBhdCBtb2RlICovCisJRklMRSAqZnA7CisJdW5zaWduZWQgaW50IG51bV9maWVsZHM7CQkvKiBudW1iZXIgb2YgZmllbGRzICovCisJc3RydWN0IGxuc3RhdF9maWVsZCBmaWVsZHNbTE5TVEFUX01BWF9GSUVMRFNfUEVSX0xJTkVdOworfTsKKworCitzdHJ1Y3QgbG5zdGF0X2ZpbGUgKmxuc3RhdF9zY2FuX2Rpcihjb25zdCBjaGFyICpwYXRoLCBjb25zdCBpbnQgbnVtX3JlcV9maWxlcywKKwkJCQkgICAgY29uc3QgY2hhciAqKnJlcV9maWxlcyk7CitpbnQgbG5zdGF0X3VwZGF0ZShzdHJ1Y3QgbG5zdGF0X2ZpbGUgKmxuc3RhdF9maWxlcyk7CitpbnQgbG5zdGF0X2R1bXAoRklMRSAqb3V0ZmQsIHN0cnVjdCBsbnN0YXRfZmlsZSAqbG5zdGF0X2ZpbGVzKTsKK3N0cnVjdCBsbnN0YXRfZmllbGQgKmxuc3RhdF9maW5kX2ZpZWxkKHN0cnVjdCBsbnN0YXRfZmlsZSAqbG5zdGF0X2ZpbGVzLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKKyNlbmRpZiAvKiBfTE5TVEFUX0ggKi8KZGlmZiAtLWdpdCBhL2lwcm91dGUyL21pc2MvbG5zdGF0X3V0aWwuYyBiL2lwcm91dGUyL21pc2MvbG5zdGF0X3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjU4MzY2Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbWlzYy9sbnN0YXRfdXRpbC5jCkBAIC0wLDAgKzEsMzMyIEBACisvKiBsbnN0YXQuYzogIFVuaWZpZWQgbGludXggbmV0d29yayBzdGF0aXN0aWNzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogRGV2ZWxvcG1lbnQgb2YgdGhpcyBjb2RlIHdhcyBmdW5kZWQgYnkgQXN0YXJvIEFHLCBodHRwOi8vd3d3LmFzdGFyby5jb20vCisgKgorICogQmFzZWQgb24gb3JpZ2luYWwgY29uY2VwdCBhbmQgaWRlYXMgZnJvbSBwcmVkZWNlc3NvciBydHN0YXQuYzoKKyAqCisgKiBDb3B5cmlnaHQgMjAwMSBieSBSb2JlcnQgT2xzc29uIDxyb2JlcnQub2xzc29uQGl0cy51dS5zZT4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBwc2FsYSBVbml2ZXJzaXR5LCBTd2VkZW4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAibG5zdGF0LmgiCisKKy8qIHNpemUgb2YgdGVtcCBidWZmZXIgdXNlZCB0byByZWFkIGxpbmVzIGZyb20gcHJvY2ZpbGVzICovCisjZGVmaW5lIEZHRVRTX0JVRl9TSVpFIDEwMjQKKworCisjZGVmaW5lIFJUU1RBVF9DT01QQVRfTElORSAiZW50cmllcyAgaW5faGl0IGluX3Nsb3dfdG90IGluX25vX3JvdXRlIGluX2JyZCBpbl9tYXJ0aWFuX2RzdCBpbl9tYXJ0aWFuX3NyYyAgb3V0X2hpdCBvdXRfc2xvd190b3Qgb3V0X3Nsb3dfbWMgIGdjX3RvdGFsIGdjX2lnbm9yZWQgZ2NfZ29hbF9taXNzIGdjX2RzdF9vdmVyZmxvdyBpbl9obGlzdF9zZWFyY2ggb3V0X2hsaXN0X3NlYXJjaFxuIgorCisvKiBSZWFkIChhbmQgc3VtbWFyaXplIGZvciBTTVApIHRoZSBkaWZmZXJlbnQgc3RhdHMgdmFycy4gKi8KK3N0YXRpYyBpbnQgc2Nhbl9saW5lcyhzdHJ1Y3QgbG5zdGF0X2ZpbGUgKmxmLCBpbnQgaSkKK3sKKwljaGFyIGJ1ZltGR0VUU19CVUZfU0laRV07CisJaW50IGosIG51bV9saW5lcyA9IDA7CisKKwlmb3IgKGogPSAwOyBqIDwgbGYtPm51bV9maWVsZHM7IGorKykKKwkJbGYtPmZpZWxkc1tqXS52YWx1ZXNbaV0gPSAwOworCisJcmV3aW5kKGxmLT5mcCk7CisJLyogc2tpcCBmaXJzdCBsaW5lICovCisJaWYgKCFsZi0+Y29tcGF0ICYmICFmZ2V0cyhidWYsIHNpemVvZihidWYpLTEsIGxmLT5mcCkpCisJCXJldHVybiAtMTsKKworCXdoaWxlKCFmZW9mKGxmLT5mcCkgJiYgZmdldHMoYnVmLCBzaXplb2YoYnVmKS0xLCBsZi0+ZnApKSB7CisJCWNoYXIgKnB0ciA9IGJ1ZjsKKworCQludW1fbGluZXMrKzsKKworCQlnZXR0aW1lb2ZkYXkoJmxmLT5sYXN0X3JlYWQsIE5VTEwpOworCisJCWZvciAoaiA9IDA7IGogPCBsZi0+bnVtX2ZpZWxkczsgaisrKSB7CisJCQl1bnNpZ25lZCBsb25nIGYgPSBzdHJ0b3VsKHB0ciwgJnB0ciwgMTYpOworCQkJaWYgKGogPT0gMCkKKwkJCQlsZi0+ZmllbGRzW2pdLnZhbHVlc1tpXSA9IGY7CisJCQllbHNlCisJCQkJbGYtPmZpZWxkc1tqXS52YWx1ZXNbaV0gKz0gZjsKKwkJfQorCX0KKwlyZXR1cm4gbnVtX2xpbmVzOworfQorCitzdGF0aWMgaW50IHRpbWVfYWZ0ZXIoc3RydWN0IHRpbWV2YWwgKmxhc3QsCisJCSAgICAgIHN0cnVjdCB0aW1ldmFsICp0b3V0LAorCQkgICAgICBzdHJ1Y3QgdGltZXZhbCAqbm93KQoreworCWlmIChub3ctPnR2X3NlYyA+IGxhc3QtPnR2X3NlYyArIHRvdXQtPnR2X3NlYykKKwkJcmV0dXJuIDE7CisKKwlpZiAobm93LT50dl9zZWMgPT0gbGFzdC0+dHZfc2VjICsgdG91dC0+dHZfc2VjKSB7CisJCWlmIChub3ctPnR2X3VzZWMgPiBsYXN0LT50dl91c2VjICsgdG91dC0+dHZfdXNlYykKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgbG5zdGF0X3VwZGF0ZShzdHJ1Y3QgbG5zdGF0X2ZpbGUgKmxuc3RhdF9maWxlcykKK3sKKwlzdHJ1Y3QgbG5zdGF0X2ZpbGUgKmxmOworCXN0cnVjdCB0aW1ldmFsIHR2OworCisJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisKKwlmb3IgKGxmID0gbG5zdGF0X2ZpbGVzOyBsZjsgbGYgPSBsZi0+bmV4dCkgeworCQlpZiAodGltZV9hZnRlcigmbGYtPmxhc3RfcmVhZCwgJmxmLT5pbnRlcnZhbCwgJnR2KSkgeworCQkJaW50IGk7CisJCQlzdHJ1Y3QgbG5zdGF0X2ZpZWxkICpsZmk7CisKKwkJCXNjYW5fbGluZXMobGYsIDEpOworCisJCQlmb3IgKGkgPSAwLCBsZmkgPSAmbGYtPmZpZWxkc1tpXTsKKwkJCSAgICAgaSA8IGxmLT5udW1fZmllbGRzOyBpKyssIGxmaSA9ICZsZi0+ZmllbGRzW2ldKSB7CisJCQkJaWYgKGkgPT0gMCkKKwkJCQkJbGZpLT5yZXN1bHQgPSBsZmktPnZhbHVlc1sxXTsKKwkJCQllbHNlCisJCQkJCWxmaS0+cmVzdWx0ID0gKGxmaS0+dmFsdWVzWzFdLWxmaS0+dmFsdWVzWzBdKQorCQkJCSAgICAJCQkvIGxmLT5pbnRlcnZhbC50dl9zZWM7CisJCQl9CisKKwkJCXNjYW5fbGluZXMobGYsIDApOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHNjYW4gZmlyc3QgdGVtcGxhdGUgbGluZSBhbmQgZmlsbCBpbiBwZXItZmllbGQgZGF0YSBzdHJ1Y3R1cmVzICovCitzdGF0aWMgaW50IF9fbG5zdGF0X3NjYW5fZmllbGRzKHN0cnVjdCBsbnN0YXRfZmlsZSAqbGYsIGNoYXIgKmJ1ZikKK3sKKwljaGFyICp0b2s7CisJaW50IGk7CisKKwl0b2sgPSBzdHJ0b2soYnVmLCAiIFx0XG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgTE5TVEFUX01BWF9GSUVMRFNfUEVSX0xJTkU7IGkrKykgeworCQlsZi0+ZmllbGRzW2ldLmZpbGUgPSBsZjsKKwkJc3RybmNweShsZi0+ZmllbGRzW2ldLm5hbWUsIHRvaywgTE5TVEFUX01BWF9GSUVMRF9OQU1FX0xFTik7CisJCS8qIGhhcyB0byBiZSBudWxsLXRlcm1pbmF0ZSBzaW5jZSB3ZSBpbml0aWFsaXplIHRvIHplcm8KKwkJICogYW5kIGZpZWxkIHNpemUgaXMgTkFNRV9MRU4gKyAxICovCisJCXRvayA9IHN0cnRvayhOVUxMLCAiIFx0XG4iKTsKKwkJaWYgKCF0b2spIHsKKwkJCWxmLT5udW1fZmllbGRzID0gaSsxOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbG5zdGF0X3NjYW5fZmllbGRzKHN0cnVjdCBsbnN0YXRfZmlsZSAqbGYpCit7CisJY2hhciBidWZbRkdFVFNfQlVGX1NJWkVdOworCisJcmV3aW5kKGxmLT5mcCk7CisJaWYgKCFmZ2V0cyhidWYsIHNpemVvZihidWYpLTEsIGxmLT5mcCkpCisJCXJldHVybiAtMTsKKworCXJldHVybiBfX2xuc3RhdF9zY2FuX2ZpZWxkcyhsZiwgYnVmKTsKK30KKworLyogZmFrZSBmdW5jdGlvbiBlbXVsYXRpbmcgbG5zdGF0X3NjYW5fZmllbGRzKCkgZm9yIG9sZCBrZXJuZWxzICovCitzdGF0aWMgaW50IGxuc3RhdF9zY2FuX2NvbXBhdF9ydHN0YXRfZmllbGRzKHN0cnVjdCBsbnN0YXRfZmlsZSAqbGYpCit7CisJY2hhciBidWZbRkdFVFNfQlVGX1NJWkVdOworCisJc3RybmNweShidWYsIFJUU1RBVF9DT01QQVRfTElORSwgc2l6ZW9mKGJ1ZiktMSk7CisKKwlyZXR1cm4gX19sbnN0YXRfc2Nhbl9maWVsZHMobGYsIGJ1Zik7Cit9CisKKy8qIGZpbmQgb3V0IHdoZXRoZXIgc3RyaW5nICduYW1lOyBpcyBpbiBnaXZlbiBzdHJpbmcgYXJyYXkgKi8KK3N0YXRpYyBpbnQgbmFtZV9pbl9hcnJheShjb25zdCBpbnQgbnVtLCBjb25zdCBjaGFyICoqYXJyLCBjb25zdCBjaGFyICpuYW1lKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQlpZiAoIXN0cmNtcChhcnJbaV0sIG5hbWUpKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKiBhbGxvY2F0ZSBsbnN0YXRfZmlsZSBhbmQgb3BlbiBnaXZlbiBmaWxlICovCitzdGF0aWMgc3RydWN0IGxuc3RhdF9maWxlICphbGxvY19hbmRfb3Blbihjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpmaWxlKQoreworCXN0cnVjdCBsbnN0YXRfZmlsZSAqbGY7CisKKwkvKiBhbGxvY2F0ZSAqLworCWxmID0gbWFsbG9jKHNpemVvZigqbGYpKTsKKwlpZiAoIWxmKSB7CisJCWZwcmludGYoc3RkZXJyLCAib3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIGluaXRpYWxpemUgKi8KKwltZW1zZXQobGYsIDAsIHNpemVvZigqbGYpKTsKKworCS8qIGRlLT5kX25hbWUgaXMgZ3VhcmFudGVlZCB0byBiZSA8PSBOQU1FX01BWCAqLworCXN0cmNweShsZi0+YmFzZW5hbWUsIGZpbGUpOworCXN0cmNweShsZi0+cGF0aCwgcGF0aCk7CisJc3RyY2F0KGxmLT5wYXRoLCAiLyIpOworCXN0cmNhdChsZi0+cGF0aCwgbGYtPmJhc2VuYW1lKTsKKworCS8qIGluaXRpYWxpemUgdG8gZGVmYXVsdCAqLworCWxmLT5pbnRlcnZhbC50dl9zZWMgPSAxOworCisJLyogb3BlbiAqLworCWxmLT5mcCA9IGZvcGVuKGxmLT5wYXRoLCAiciIpOworCWlmICghbGYtPmZwKSB7CisJCXBlcnJvcihsZi0+cGF0aCk7CisJCWZyZWUobGYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gbGY7Cit9CisKKworLyogbG5zdGF0X3NjYW5fZGlyIC0gZmluZCBhbmQgcGFyc2UgYWxsIGF2YWlsYWJsZSBzdGF0aXN0aWNzIGZpbGVzL2ZpZWxkcyAqLworc3RydWN0IGxuc3RhdF9maWxlICpsbnN0YXRfc2Nhbl9kaXIoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgaW50IG51bV9yZXFfZmlsZXMsCisJCQkJICAgIGNvbnN0IGNoYXIgKipyZXFfZmlsZXMpCit7CisJRElSICpkaXI7CisJc3RydWN0IGxuc3RhdF9maWxlICpsbnN0YXRfZmlsZXMgPSBOVUxMOworCXN0cnVjdCBkaXJlbnQgKmRlOworCisJaWYgKCFwYXRoKQorCQlwYXRoID0gUFJPQ19ORVRfU1RBVDsKKworCWRpciA9IG9wZW5kaXIocGF0aCk7CisJaWYgKCFkaXIpIHsKKwkJc3RydWN0IGxuc3RhdF9maWxlICpsZjsKKwkJLyogT2xkIGtlcm5lbCwgYmVmb3JlIC9wcm9jL25ldC9zdGF0IHdhcyBpbnRyb2R1Y2VkICovCisJCWZwcmludGYoc3RkZXJyLCAiWW91ciBrZXJuZWwgZG9lc24ndCBoYXZlIGxuc3RhdCBzdXBwb3J0LiAiKTsKKworCQkvKiB3ZSBvbmx5IHN1cHBvcnQgcnRzdGF0LCBub3QgbXVsdGlwbGUgZmlsZXMgKi8KKwkJaWYgKG51bV9yZXFfZmlsZXMgPj0gMikgeworCQkJZnB1dGMoJ1xuJywgc3RkZXJyKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJLyogd2UgcmVhbGx5IG9ubHkgYWNjZXB0IHJ0X2NhY2hlICovCisJCWlmIChudW1fcmVxX2ZpbGVzICYmICFuYW1lX2luX2FycmF5KG51bV9yZXFfZmlsZXMsCisJCQkJCQkgICAgcmVxX2ZpbGVzLCAicnRfY2FjaGUiKSkgeworCQkJZnB1dGMoJ1xuJywgc3RkZXJyKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJZnByaW50ZihzdGRlcnIsICJGYWxsYmFjayB0byBvbGQgcnRzdGF0LW9ubHkgb3BlcmF0aW9uXG4iKTsKKworCQlsZiA9IGFsbG9jX2FuZF9vcGVuKCIvcHJvYy9uZXQiLCAicnRfY2FjaGVfc3RhdCIpOworCQlpZiAoIWxmKQorCQkJcmV0dXJuIE5VTEw7CisJCWxmLT5jb21wYXQgPSAxOworCQlzdHJuY3B5KGxmLT5iYXNlbmFtZSwgInJ0X2NhY2hlIiwgc2l6ZW9mKGxmLT5iYXNlbmFtZSkpOworCisJCS8qIEZJWE1FOiBzdXBwb3J0IGZvciBvbGQgZmlsZXMgKi8KKwkJaWYgKGxuc3RhdF9zY2FuX2NvbXBhdF9ydHN0YXRfZmllbGRzKGxmKSA8IDApCisJCQlyZXR1cm4gTlVMTDsKKworCQlsZi0+bmV4dCA9IGxuc3RhdF9maWxlczsKKwkJbG5zdGF0X2ZpbGVzID0gbGY7CisJCXJldHVybiBsbnN0YXRfZmlsZXM7CisJfQorCisJd2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkpIHsKKwkJc3RydWN0IGxuc3RhdF9maWxlICpsZjsKKworCQlpZiAoZGUtPmRfdHlwZSAhPSBEVF9SRUcpCisJCQljb250aW51ZTsKKworCQlpZiAobnVtX3JlcV9maWxlcyAmJiAhbmFtZV9pbl9hcnJheShudW1fcmVxX2ZpbGVzLAorCQkJCQkJICAgIHJlcV9maWxlcywgZGUtPmRfbmFtZSkpCisJCQljb250aW51ZTsKKworCQlsZiA9IGFsbG9jX2FuZF9vcGVuKHBhdGgsIGRlLT5kX25hbWUpOworCQlpZiAoIWxmKSB7CisJCQljbG9zZWRpcihkaXIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQkvKiBmaWxsIGluIGZpZWxkIHN0cnVjdHVyZSAqLworCQlpZiAobG5zdGF0X3NjYW5fZmllbGRzKGxmKSA8IDApIHsKKwkJCWNsb3NlZGlyKGRpcik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCS8qIHByZXBlbmQgdG8gZ2xvYmFsIGxpc3QgKi8KKwkJbGYtPm5leHQgPSBsbnN0YXRfZmlsZXM7CisJCWxuc3RhdF9maWxlcyA9IGxmOworCX0KKwljbG9zZWRpcihkaXIpOworCisJcmV0dXJuIGxuc3RhdF9maWxlczsKK30KKworaW50IGxuc3RhdF9kdW1wKEZJTEUgKm91dGZkLCBzdHJ1Y3QgbG5zdGF0X2ZpbGUgKmxuc3RhdF9maWxlcykKK3sKKwlzdHJ1Y3QgbG5zdGF0X2ZpbGUgKmxmOworCisJZm9yIChsZiA9IGxuc3RhdF9maWxlczsgbGY7IGxmID0gbGYtPm5leHQpIHsKKwkJaW50IGk7CisKKwkJZnByaW50ZihvdXRmZCwgIiVzOlxuIiwgbGYtPnBhdGgpOworCisJCWZvciAoaSA9IDA7IGkgPCBsZi0+bnVtX2ZpZWxkczsgaSsrKQorCQkJZnByaW50ZihvdXRmZCwgIlx0JTJ1OiAlc1xuIiwgaSsxLCBsZi0+ZmllbGRzW2ldLm5hbWUpOworCisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3QgbG5zdGF0X2ZpZWxkICpsbnN0YXRfZmluZF9maWVsZChzdHJ1Y3QgbG5zdGF0X2ZpbGUgKmxuc3RhdF9maWxlcywKKwkJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbG5zdGF0X2ZpbGUgKmxmOworCXN0cnVjdCBsbnN0YXRfZmllbGQgKnJldCA9IE5VTEw7CisJY29uc3QgY2hhciAqY29sb24gPSBzdHJjaHIobmFtZSwgJzonKTsKKwljaGFyICpmaWxlOworCWNvbnN0IGNoYXIgKmZpZWxkOworCisJaWYgKGNvbG9uKSB7CisJCWZpbGUgPSBzdHJuZHVwKG5hbWUsIGNvbG9uLW5hbWUpOworCQlmaWVsZCA9IGNvbG9uKzE7CisJfSBlbHNlIHsKKwkJZmlsZSA9IE5VTEw7CisJCWZpZWxkID0gbmFtZTsKKwl9CisKKwlmb3IgKGxmID0gbG5zdGF0X2ZpbGVzOyBsZjsgbGYgPSBsZi0+bmV4dCkgeworCQlpbnQgaTsKKworCQlpZiAoZmlsZSAmJiBzdHJjbXAoZmlsZSwgbGYtPmJhc2VuYW1lKSkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoaSA9IDA7IGkgPCBsZi0+bnVtX2ZpZWxkczsgaSsrKSB7CisJCQlpZiAoIXN0cmNtcChmaWVsZCwgbGYtPmZpZWxkc1tpXS5uYW1lKSkgeworCQkJCXJldCA9ICZsZi0+ZmllbGRzW2ldOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJfQorb3V0OgorCWZyZWUoZmlsZSk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWlzYy9uc3RhdC5jIGIvaXByb3V0ZTIvbWlzYy9uc3RhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NzA1MjgKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9taXNjL25zdGF0LmMKQEAgLTAsMCArMSw3MDYgQEAKKy8qCisgKiBuc3RhdC5jCWhhbmR5IHV0aWxpdHkgdG8gcmVhZCBjb3VudGVycyAvcHJvYy9uZXQvbmV0c3RhdCBhbmQgc25tcAorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8Zm5tYXRjaC5oPgorI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKworI2luY2x1ZGUgPGpzb25fd3JpdGVyLmg+CisjaW5jbHVkZSA8U05BUFNIT1QuaD4KKworaW50IGR1bXBfemVyb3MgPSAwOworaW50IHJlc2V0X2hpc3RvcnkgPSAwOworaW50IGlnbm9yZV9oaXN0b3J5ID0gMDsKK2ludCBub19vdXRwdXQgPSAwOworaW50IGpzb25fb3V0cHV0ID0gMDsKK2ludCBwcmV0dHkgPSAwOworaW50IG5vX3VwZGF0ZSA9IDA7CitpbnQgc2Nhbl9pbnRlcnZhbCA9IDA7CitpbnQgdGltZV9jb25zdGFudCA9IDA7Citkb3VibGUgVzsKK2NoYXIgKipwYXR0ZXJuczsKK2ludCBucGF0dGVybnM7CisKK2NoYXIgaW5mb19zb3VyY2VbMTI4XTsKK2ludCBzb3VyY2VfbWlzbWF0Y2g7CisKK3N0YXRpYyBpbnQgZ2VuZXJpY19wcm9jX29wZW4oY29uc3QgY2hhciAqZW52LCBjaGFyICpuYW1lKQoreworCWNoYXIgc3RvcmVbMTI4XTsKKwljaGFyICpwID0gZ2V0ZW52KGVudik7CisJaWYgKCFwKSB7CisJCXAgPSBnZXRlbnYoIlBST0NfUk9PVCIpID8gOiAiL3Byb2MiOworCQlzbnByaW50ZihzdG9yZSwgc2l6ZW9mKHN0b3JlKS0xLCAiJXMvJXMiLCBwLCBuYW1lKTsKKwkJcCA9IHN0b3JlOworCX0KKwlyZXR1cm4gb3BlbihwLCBPX1JET05MWSk7Cit9CisKK3N0YXRpYyBpbnQgbmV0X25ldHN0YXRfb3Blbih2b2lkKQoreworCXJldHVybiBnZW5lcmljX3Byb2Nfb3BlbigiUFJPQ19ORVRfTkVUU1RBVCIsICJuZXQvbmV0c3RhdCIpOworfQorCitzdGF0aWMgaW50IG5ldF9zbm1wX29wZW4odm9pZCkKK3sKKwlyZXR1cm4gZ2VuZXJpY19wcm9jX29wZW4oIlBST0NfTkVUX1NOTVAiLCAibmV0L3NubXAiKTsKK30KKworc3RhdGljIGludCBuZXRfc25tcDZfb3Blbih2b2lkKQoreworCXJldHVybiBnZW5lcmljX3Byb2Nfb3BlbigiUFJPQ19ORVRfU05NUDYiLCAibmV0L3NubXA2Iik7Cit9CisKK3N0cnVjdCBuc3RhdF9lbnQKK3sKKwlzdHJ1Y3QgbnN0YXRfZW50ICpuZXh0OworCWNoYXIJCSAqaWQ7CisJdW5zaWduZWQgbG9uZyBsb25nIHZhbDsKKwlkb3VibGUJCSAgIHJhdGU7Cit9OworCitzdHJ1Y3QgbnN0YXRfZW50ICprZXJuX2RiOworc3RydWN0IG5zdGF0X2VudCAqaGlzdF9kYjsKKworc3RhdGljIGNvbnN0IGNoYXIgKnVzZWxlc3NfbnVtYmVyc1tdID0geworCSJJcEZvcndhcmRpbmciLCAiSXBEZWZhdWx0VFRMIiwKKwkiVGNwUnRvQWxnb3JpdGhtIiwgIlRjcFJ0b01pbiIsICJUY3BSdG9NYXgiLAorCSJUY3BNYXhDb25uIiwgIlRjcEN1cnJFc3RhYiIKK307CisKK3N0YXRpYyBpbnQgdXNlbGVzc19udW1iZXIoY29uc3QgY2hhciAqaWQpCit7CisJaW50IGk7CisJZm9yIChpPTA7IGk8c2l6ZW9mKHVzZWxlc3NfbnVtYmVycykvc2l6ZW9mKCp1c2VsZXNzX251bWJlcnMpOyBpKyspCisJCWlmIChzdHJjbXAoaWQsIHVzZWxlc3NfbnVtYmVyc1tpXSkgPT0gMCkKKwkJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hdGNoKGNvbnN0IGNoYXIgKmlkKQoreworCWludCBpOworCisJaWYgKG5wYXR0ZXJucyA9PSAwKQorCQlyZXR1cm4gMTsKKworCWZvciAoaT0wOyBpPG5wYXR0ZXJuczsgaSsrKSB7CisJCWlmICghZm5tYXRjaChwYXR0ZXJuc1tpXSwgaWQsIDApKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBsb2FkX2dvb2RfdGFibGUoRklMRSAqZnApCit7CisJY2hhciBidWZbNDA5Nl07CisJc3RydWN0IG5zdGF0X2VudCAqZGIgPSBOVUxMOworCXN0cnVjdCBuc3RhdF9lbnQgKm47CisKKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApICE9IE5VTEwpIHsKKwkJaW50IG5yOworCQl1bnNpZ25lZCBsb25nIGxvbmcgdmFsOworCQlkb3VibGUgcmF0ZTsKKwkJY2hhciBpZGJ1ZltzaXplb2YoYnVmKV07CisJCWlmIChidWZbMF0gPT0gJyMnKSB7CisJCQlidWZbc3RybGVuKGJ1ZiktMV0gPSAwOworCQkJaWYgKGluZm9fc291cmNlWzBdICYmIHN0cmNtcChpbmZvX3NvdXJjZSwgYnVmKzEpKQorCQkJCXNvdXJjZV9taXNtYXRjaCA9IDE7CisJCQlpbmZvX3NvdXJjZVswXSA9IDA7CisJCQlzdHJuY2F0KGluZm9fc291cmNlLCBidWYrMSwgc2l6ZW9mKGluZm9fc291cmNlKS0xKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIGlkYnVmIGlzIGFzIGJpZyBhcyBidWYsIHNvIHRoaXMgaXMgc2FmZSAqLworCQluciA9IHNzY2FuZihidWYsICIlcyVsbHUlbGciLCBpZGJ1ZiwgJnZhbCwgJnJhdGUpOworCQlpZiAobnIgPCAyKQorCQkJYWJvcnQoKTsKKwkJaWYgKG5yIDwgMykKKwkJCXJhdGUgPSAwOworCQlpZiAodXNlbGVzc19udW1iZXIoaWRidWYpKQorCQkJY29udGludWU7CisJCWlmICgobiA9IG1hbGxvYyhzaXplb2YoKm4pKSkgPT0gTlVMTCkKKwkJCWFib3J0KCk7CisJCW4tPmlkID0gc3RyZHVwKGlkYnVmKTsKKwkJbi0+dmFsID0gdmFsOworCQluLT5yYXRlID0gcmF0ZTsKKwkJbi0+bmV4dCA9IGRiOworCQlkYiA9IG47CisJfQorCisJd2hpbGUgKGRiKSB7CisJCW4gPSBkYjsKKwkJZGIgPSBkYi0+bmV4dDsKKwkJbi0+bmV4dCA9IGtlcm5fZGI7CisJCWtlcm5fZGIgPSBuOworCX0KK30KKworc3RhdGljIGludCBjb3VudF9zcGFjZXMoY29uc3QgY2hhciAqbGluZSkKK3sKKwlpbnQgY291bnQgPSAwOworCWNoYXIgYzsKKworCXdoaWxlICgoYyA9ICpsaW5lKyspICE9IDApCisJCWNvdW50ICs9IGMgPT0gJyAnIHx8IGMgPT0gJ1xuJzsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIGxvYWRfdWdseV90YWJsZShGSUxFICpmcCkKK3sKKwljaGFyIGJ1Zls0MDk2XTsKKwlzdHJ1Y3QgbnN0YXRfZW50ICpkYiA9IE5VTEw7CisJc3RydWN0IG5zdGF0X2VudCAqbjsKKworCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkgIT0gTlVMTCkgeworCQljaGFyIGlkYnVmW3NpemVvZihidWYpXTsKKwkJaW50ICBvZmY7CisJCWNoYXIgKnA7CisJCWludCBjb3VudDEsIGNvdW50Miwgc2tpcCA9IDA7CisKKwkJcCA9IHN0cmNocihidWYsICc6Jyk7CisJCWlmICghcCkKKwkJCWFib3J0KCk7CisJCWNvdW50MSA9IGNvdW50X3NwYWNlcyhidWYpOworCQkqcCA9IDA7CisJCWlkYnVmWzBdID0gMDsKKwkJc3RybmNhdChpZGJ1ZiwgYnVmLCBzaXplb2YoaWRidWYpIC0gMSk7CisJCW9mZiA9IHAgLSBidWY7CisJCXAgKz0gMjsKKworCQl3aGlsZSAoKnApIHsKKwkJCWNoYXIgKm5leHQ7CisJCQlpZiAoKG5leHQgPSBzdHJjaHIocCwgJyAnKSkgIT0gTlVMTCkKKwkJCQkqbmV4dCsrID0gMDsKKwkJCWVsc2UgaWYgKChuZXh0ID0gc3RyY2hyKHAsICdcbicpKSAhPSBOVUxMKQorCQkJCSpuZXh0KysgPSAwOworCQkJaWYgKG9mZiA8IHNpemVvZihpZGJ1ZikpIHsKKwkJCQlpZGJ1ZltvZmZdID0gMDsKKwkJCQlzdHJuY2F0KGlkYnVmLCBwLCBzaXplb2YoaWRidWYpIC0gb2ZmIC0gMSk7CisJCQl9CisJCQluID0gbWFsbG9jKHNpemVvZigqbikpOworCQkJaWYgKCFuKQorCQkJCWFib3J0KCk7CisJCQluLT5pZCA9IHN0cmR1cChpZGJ1Zik7CisJCQluLT5yYXRlID0gMDsKKwkJCW4tPm5leHQgPSBkYjsKKwkJCWRiID0gbjsKKwkJCXAgPSBuZXh0OworCQl9CisJCW4gPSBkYjsKKwkJaWYgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKSA9PSBOVUxMKQorCQkJYWJvcnQoKTsKKwkJY291bnQyID0gY291bnRfc3BhY2VzKGJ1Zik7CisJCWlmIChjb3VudDIgPiBjb3VudDEpCisJCQlza2lwID0gY291bnQyIC0gY291bnQxOworCQlkbyB7CisJCQlwID0gc3RycmNocihidWYsICcgJyk7CisJCQlpZiAoIXApCisJCQkJYWJvcnQoKTsKKwkJCSpwID0gMDsKKwkJCWlmIChzc2NhbmYocCsxLCAiJWxsdSIsICZuLT52YWwpICE9IDEpCisJCQkJYWJvcnQoKTsKKwkJCS8qIFRyaWNrIHRvIHNraXAgImR1bW15IiB0cmFpbGluZyBJQ01QIE1JQiBpbiAyLjQgKi8KKwkJCWlmIChza2lwKQorCQkJCXNraXAtLTsKKwkJCWVsc2UKKwkJCQluID0gbi0+bmV4dDsKKwkJfSB3aGlsZSAocCA+IGJ1ZiArIG9mZiArIDIpOworCX0KKworCXdoaWxlIChkYikgeworCQluID0gZGI7CisJCWRiID0gZGItPm5leHQ7CisJCWlmICh1c2VsZXNzX251bWJlcihuLT5pZCkpIHsKKwkJCWZyZWUobi0+aWQpOworCQkJZnJlZShuKTsKKwkJfSBlbHNlIHsKKwkJCW4tPm5leHQgPSBrZXJuX2RiOworCQkJa2Vybl9kYiA9IG47CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGxvYWRfc25tcCh2b2lkKQoreworCUZJTEUgKmZwID0gZmRvcGVuKG5ldF9zbm1wX29wZW4oKSwgInIiKTsKKwlpZiAoZnApIHsKKwkJbG9hZF91Z2x5X3RhYmxlKGZwKTsKKwkJZmNsb3NlKGZwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGxvYWRfc25tcDYodm9pZCkKK3sKKwlGSUxFICpmcCA9IGZkb3BlbihuZXRfc25tcDZfb3BlbigpLCAiciIpOworCWlmIChmcCkgeworCQlsb2FkX2dvb2RfdGFibGUoZnApOworCQlmY2xvc2UoZnApOworCX0KK30KKworc3RhdGljIHZvaWQgbG9hZF9uZXRzdGF0KHZvaWQpCit7CisJRklMRSAqZnAgPSBmZG9wZW4obmV0X25ldHN0YXRfb3BlbigpLCAiciIpOworCWlmIChmcCkgeworCQlsb2FkX3VnbHlfdGFibGUoZnApOworCQlmY2xvc2UoZnApOworCX0KK30KKworCitzdGF0aWMgdm9pZCBkdW1wX2tlcm5fZGIoRklMRSAqZnAsIGludCB0b19oaXN0KQoreworCWpzb25fd3JpdGVyX3QgKmp3ID0ganNvbl9vdXRwdXQgPyBqc29ud19uZXcoZnApIDogTlVMTDsKKwlzdHJ1Y3QgbnN0YXRfZW50ICpuLCAqaDsKKworCWggPSBoaXN0X2RiOworCWlmIChqdykgeworCQlqc29ud19wcmV0dHkoancsIHByZXR0eSk7CisJCWpzb253X25hbWUoancsIGluZm9fc291cmNlKTsKKwkJanNvbndfc3RhcnRfb2JqZWN0KGp3KTsKKwl9IGVsc2UKKwkJZnByaW50ZihmcCwgIiMlc1xuIiwgaW5mb19zb3VyY2UpOworCisJZm9yIChuPWtlcm5fZGI7IG47IG49bi0+bmV4dCkgeworCQl1bnNpZ25lZCBsb25nIGxvbmcgdmFsID0gbi0+dmFsOworCQlpZiAoIWR1bXBfemVyb3MgJiYgIXZhbCAmJiAhbi0+cmF0ZSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIW1hdGNoKG4tPmlkKSkgeworCQkJc3RydWN0IG5zdGF0X2VudCAqaDE7CisJCQlpZiAoIXRvX2hpc3QpCisJCQkJY29udGludWU7CisJCQlmb3IgKGgxID0gaDsgaDE7IGgxID0gaDEtPm5leHQpIHsKKwkJCQlpZiAoc3RyY21wKGgxLT5pZCwgbi0+aWQpID09IDApIHsKKwkJCQkJdmFsID0gaDEtPnZhbDsKKwkJCQkJaCA9IGgxLT5uZXh0OworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoancpCisJCQlqc29ud191aW50X2ZpZWxkKGp3LCBuLT5pZCwgdmFsKTsKKwkJZWxzZQorCQkJZnByaW50ZihmcCwgIiUtMzJzJS0xNmxsdSU2LjFmXG4iLCBuLT5pZCwgdmFsLCBuLT5yYXRlKTsKKwl9CisKKwlpZiAoancpIHsKKwkJanNvbndfZW5kX29iamVjdChqdyk7CisJCWpzb253X2Rlc3Ryb3koJmp3KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfaW5jcl9kYihGSUxFICpmcCkKK3sKKwlqc29uX3dyaXRlcl90ICpqdyA9IGpzb25fb3V0cHV0ID8ganNvbndfbmV3KGZwKSA6IE5VTEw7CisJc3RydWN0IG5zdGF0X2VudCAqbiwgKmg7CisKKwloID0gaGlzdF9kYjsKKwlpZiAoancpIHsKKwkJanNvbndfcHJldHR5KGp3LCBwcmV0dHkpOworCQlqc29ud19uYW1lKGp3LCBpbmZvX3NvdXJjZSk7CisJCWpzb253X3N0YXJ0X29iamVjdChqdyk7CisJfSBlbHNlCisJCWZwcmludGYoZnAsICIjJXNcbiIsIGluZm9fc291cmNlKTsKKworCWZvciAobj1rZXJuX2RiOyBuOyBuPW4tPm5leHQpIHsKKwkJaW50IG92ZmwgPSAwOworCQl1bnNpZ25lZCBsb25nIGxvbmcgdmFsID0gbi0+dmFsOworCQlzdHJ1Y3QgbnN0YXRfZW50ICpoMTsKKwkJZm9yIChoMSA9IGg7IGgxOyBoMSA9IGgxLT5uZXh0KSB7CisJCQlpZiAoc3RyY21wKGgxLT5pZCwgbi0+aWQpID09IDApIHsKKwkJCQlpZiAodmFsIDwgaDEtPnZhbCkgeworCQkJCQlvdmZsID0gMTsKKwkJCQkJdmFsID0gaDEtPnZhbDsKKwkJCQl9CisJCQkJdmFsIC09IGgxLT52YWw7CisJCQkJaCA9IGgxLT5uZXh0OworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghZHVtcF96ZXJvcyAmJiAhdmFsICYmICFuLT5yYXRlKQorCQkJY29udGludWU7CisJCWlmICghbWF0Y2gobi0+aWQpKQorCQkJY29udGludWU7CisKKwkJaWYgKGp3KQorCQkJanNvbndfdWludF9maWVsZChqdywgbi0+aWQsIHZhbCk7CisJCWVsc2UKKwkJCWZwcmludGYoZnAsICIlLTMycyUtMTZsbHUlNi4xZiVzXG4iLCBuLT5pZCwgdmFsLAorCQkJCW4tPnJhdGUsIG92Zmw/IiAob3ZlcmZsb3cpIjoiIik7CisJfQorCisJaWYgKGp3KSB7CisJCWpzb253X2VuZF9vYmplY3QoancpOworCQlqc29ud19kZXN0cm95KCZqdyk7CisJfQorfQorCitzdGF0aWMgaW50IGNoaWxkcmVuOworCitzdGF0aWMgdm9pZCBzaWdjaGlsZChpbnQgc2lnbm8pCit7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9kYihpbnQgaW50ZXJ2YWwpCit7CisJc3RydWN0IG5zdGF0X2VudCAqbiwgKmg7CisKKwluID0ga2Vybl9kYjsKKwlrZXJuX2RiID0gTlVMTDsKKworCWxvYWRfbmV0c3RhdCgpOworCWxvYWRfc25tcDYoKTsKKwlsb2FkX3NubXAoKTsKKworCWggPSBrZXJuX2RiOworCWtlcm5fZGIgPSBuOworCisJZm9yIChuID0ga2Vybl9kYjsgbjsgbiA9IG4tPm5leHQpIHsKKwkJc3RydWN0IG5zdGF0X2VudCAqaDE7CisJCWZvciAoaDEgPSBoOyBoMTsgaDEgPSBoMS0+bmV4dCkgeworCQkJaWYgKHN0cmNtcChoMS0+aWQsIG4tPmlkKSA9PSAwKSB7CisJCQkJZG91YmxlIHNhbXBsZTsKKwkJCQl1bnNpZ25lZCBsb25nIGxvbmcgaW5jciA9IGgxLT52YWwgLSBuLT52YWw7CisKKwkJCQluLT52YWwgPSBoMS0+dmFsOworCQkJCXNhbXBsZSA9IChkb3VibGUpaW5jciAqIDEwMDAuMCAvIGludGVydmFsOworCQkJCWlmIChpbnRlcnZhbCA+PSBzY2FuX2ludGVydmFsKSB7CisJCQkJCW4tPnJhdGUgKz0gVyooc2FtcGxlLW4tPnJhdGUpOworCQkJCX0gZWxzZSBpZiAoaW50ZXJ2YWwgPj0gMTAwMCkgeworCQkJCQlpZiAoaW50ZXJ2YWwgPj0gdGltZV9jb25zdGFudCkgeworCQkJCQkJbi0+cmF0ZSA9IHNhbXBsZTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWRvdWJsZSB3ID0gVyooZG91YmxlKWludGVydmFsL3NjYW5faW50ZXJ2YWw7CisJCQkJCQluLT5yYXRlICs9IHcqKHNhbXBsZS1uLT5yYXRlKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCXdoaWxlIChoICE9IGgxKSB7CisJCQkJCXN0cnVjdCBuc3RhdF9lbnQgKnRtcCA9IGg7CisJCQkJCWggPSBoLT5uZXh0OworCQkJCQlmcmVlKHRtcC0+aWQpOworCQkJCQlmcmVlKHRtcCk7CisJCQkJfTsKKwkJCQloID0gaDEtPm5leHQ7CisJCQkJZnJlZShoMS0+aWQpOworCQkJCWZyZWUoaDEpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCisjZGVmaW5lIFRfRElGRihhLGIpICgoKGEpLnR2X3NlYy0oYikudHZfc2VjKSoxMDAwICsgKChhKS50dl91c2VjLShiKS50dl91c2VjKS8xMDAwKQorCisKK3N0YXRpYyB2b2lkIHNlcnZlcl9sb29wKGludCBmZCkKK3sKKwlzdHJ1Y3QgdGltZXZhbCBzbmFwdGltZSA9IHsgMCB9OworCXN0cnVjdCBwb2xsZmQgcDsKKwlwLmZkID0gZmQ7CisJcC5ldmVudHMgPSBwLnJldmVudHMgPSBQT0xMSU47CisKKwlzcHJpbnRmKGluZm9fc291cmNlLCAiJWQuJWx1IHNhbXBsaW5nX2ludGVydmFsPSVkIHRpbWVfY29uc3Q9JWQiLAorCQlnZXRwaWQoKSwgKHVuc2lnbmVkIGxvbmcpcmFuZG9tKCksIHNjYW5faW50ZXJ2YWwvMTAwMCwgdGltZV9jb25zdGFudC8xMDAwKTsKKworCWxvYWRfbmV0c3RhdCgpOworCWxvYWRfc25tcDYoKTsKKwlsb2FkX3NubXAoKTsKKworCWZvciAoOzspIHsKKwkJaW50IHN0YXR1czsKKwkJaW50IHRkaWZmOworCQlzdHJ1Y3QgdGltZXZhbCBub3c7CisJCWdldHRpbWVvZmRheSgmbm93LCBOVUxMKTsKKwkJdGRpZmYgPSBUX0RJRkYobm93LCBzbmFwdGltZSk7CisJCWlmICh0ZGlmZiA+PSBzY2FuX2ludGVydmFsKSB7CisJCQl1cGRhdGVfZGIodGRpZmYpOworCQkJc25hcHRpbWUgPSBub3c7CisJCQl0ZGlmZiA9IDA7CisJCX0KKwkJaWYgKHBvbGwoJnAsIDEsIHRkaWZmICsgc2Nhbl9pbnRlcnZhbCkgPiAwCisJCSAgICAmJiAocC5yZXZlbnRzJlBPTExJTikpIHsKKwkJCWludCBjbG50ID0gYWNjZXB0KGZkLCBOVUxMLCBOVUxMKTsKKwkJCWlmIChjbG50ID49IDApIHsKKwkJCQlwaWRfdCBwaWQ7CisJCQkJaWYgKGNoaWxkcmVuID49IDUpIHsKKwkJCQkJY2xvc2UoY2xudCk7CisJCQkJfSBlbHNlIGlmICgocGlkID0gZm9yaygpKSAhPSAwKSB7CisJCQkJCWlmIChwaWQ+MCkKKwkJCQkJCWNoaWxkcmVuKys7CisJCQkJCWNsb3NlKGNsbnQpOworCQkJCX0gZWxzZSB7CisJCQkJCUZJTEUgKmZwID0gZmRvcGVuKGNsbnQsICJ3Iik7CisJCQkJCWlmIChmcCkgeworCQkJCQkJaWYgKHRkaWZmID4gMCkKKwkJCQkJCQl1cGRhdGVfZGIodGRpZmYpOworCQkJCQkJZHVtcF9rZXJuX2RiKGZwLCAwKTsKKwkJCQkJfQorCQkJCQlleGl0KDApOworCQkJCX0KKwkJCX0KKwkJfQorCQl3aGlsZSAoY2hpbGRyZW4gJiYgd2FpdHBpZCgtMSwgJnN0YXR1cywgV05PSEFORykgPiAwKQorCQkJY2hpbGRyZW4tLTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdmVyaWZ5X2ZvcmdpbmcoaW50IGZkKQoreworCXN0cnVjdCB1Y3JlZCBjcmVkOworCXNvY2tsZW5fdCBvbGVuID0gc2l6ZW9mKGNyZWQpOworCisJaWYgKGdldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1BFRVJDUkVELCAodm9pZCopJmNyZWQsICZvbGVuKSB8fAorCSAgICBvbGVuIDwgc2l6ZW9mKGNyZWQpKQorCQlyZXR1cm4gLTE7CisJaWYgKGNyZWQudWlkID09IGdldHVpZCgpIHx8IGNyZWQudWlkID09IDApCisJCXJldHVybiAwOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwKKyJVc2FnZTogbnN0YXQgW09QVElPTl0gWyBQQVRURVJOIFsgUEFUVEVSTiBdIF1cbiIKKyIgICAtaCwgLS1oZWxwCQl0aGlzIG1lc3NhZ2VcbiIKKyIgICAtYSwgLS1pZ25vcmUJaWdub3JlIGhpc3RvcnlcbiIKKyIgICAtZCwgLS1zY2FuPVNFQ1MJc2FtcGxlIGV2ZXJ5IHN0YXRpc3RpY3MgZXZlcnkgU0VDU1xuIgorIiAgIC1qLCAtLWpzb24gICAgICAgICAgZm9ybWF0IG91dHB1dCBpbiBKU09OXG4iCisiICAgLW4sIC0tbm9vdXRwdXQJZG8gaGlzdG9yeSBvbmx5XG4iCisiICAgLXAsIC0tcHJldHR5ICAgICAgICBwcmV0dHkgcHJpbnRcbiIKKyIgICAtciwgLS1yZXNldAkJcmVzZXQgaGlzdG9yeVxuIgorIiAgIC1zLCAtLW5vdXBkYXRlCWRvblwndCB1cGRhdGUgaGlzdG9yeVxuIgorIiAgIC10LCAtLWludGVydmFsPVNFQ1MJcmVwb3J0IGF2ZXJhZ2Ugb3ZlciB0aGUgbGFzdCBTRUNTXG4iCisiICAgLVYsIC0tdmVyc2lvbglvdXRwdXQgdmVyc2lvbiBpbmZvcm1hdGlvblxuIgorIiAgIC16LCAtLXplcm9zCQlzaG93IGVudHJpZXMgd2l0aCB6ZXJvIGFjdGl2aXR5XG4iKTsKKwlleGl0KC0xKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gbG9uZ29wdHNbXSA9IHsKKwl7ICJoZWxwIiwgMCwgMCwgJ2gnIH0sCisJeyAiaWdub3JlIiwgIDAsICAwLCAnYScgfSwKKwl7ICJzY2FuIiwgMSwgMCwgJ2QnfSwKKwl7ICJub291dHB1dCIsIDAsIDAsICduJyB9LAorCXsgImpzb24iLCAwLCAwLCAnaicgfSwKKwl7ICJyZXNldCIsIDAsIDAsICdyJyB9LAorCXsgIm5vdXBkYXRlIiwgMCwgMCwgJ3MnIH0sCisJeyAicHJldHR5IiwgMCwgMCwgJ3AnIH0sCisJeyAiaW50ZXJ2YWwiLCAxLCAwLCAndCcgfSwKKwl7ICJ2ZXJzaW9uIiwgMCwgMCwgJ1YnIH0sCisJeyAiemVyb3MiLCAwLCAwLCAneicgfSwKKwl7IDAgfQorfTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwljaGFyICpoaXN0X25hbWU7CisJc3RydWN0IHNvY2thZGRyX3VuIHN1bjsKKwlGSUxFICpoaXN0X2ZwID0gTlVMTDsKKwlpbnQgY2g7CisJaW50IGZkOworCisJd2hpbGUgKChjaCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJoP3ZWenJuYXNkOnQ6anAiLAorCQkJCSBsb25nb3B0cywgTlVMTCkpICE9IEVPRikgeworCQlzd2l0Y2goY2gpIHsKKwkJY2FzZSAneic6CisJCQlkdW1wX3plcm9zID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCXJlc2V0X2hpc3RvcnkgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2EnOgorCQkJaWdub3JlX2hpc3RvcnkgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJbm9fdXBkYXRlID0gMTsKKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCW5vX291dHB1dCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnZCc6CisJCQlzY2FuX2ludGVydmFsID0gMTAwMCphdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQlpZiAoc3NjYW5mKG9wdGFyZywgIiVkIiwgJnRpbWVfY29uc3RhbnQpICE9IDEgfHwKKwkJCSAgICB0aW1lX2NvbnN0YW50IDw9IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIm5zdGF0OiBpbnZhbGlkIHRpbWUgY29uc3RhbnQgZGl2aXNvclxuIik7CisJCQkJZXhpdCgtMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnaic6CisJCQlqc29uX291dHB1dCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlwcmV0dHkgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3YnOgorCQljYXNlICdWJzoKKwkJCXByaW50ZigibnN0YXQgdXRpbGl0eSwgaXByb3V0ZTItc3Mlc1xuIiwgU05BUFNIT1QpOworCQkJZXhpdCgwKTsKKwkJY2FzZSAnaCc6CisJCWNhc2UgJz8nOgorCQlkZWZhdWx0OgorCQkJdXNhZ2UoKTsKKwkJfQorCX0KKworCWFyZ2MgLT0gb3B0aW5kOworCWFyZ3YgKz0gb3B0aW5kOworCisJc3VuLnN1bl9mYW1pbHkgPSBBRl9VTklYOworCXN1bi5zdW5fcGF0aFswXSA9IDA7CisJc3ByaW50ZihzdW4uc3VuX3BhdGgrMSwgIm5zdGF0JWQiLCBnZXR1aWQoKSk7CisKKwlpZiAoc2Nhbl9pbnRlcnZhbCA+IDApIHsKKwkJaWYgKHRpbWVfY29uc3RhbnQgPT0gMCkKKwkJCXRpbWVfY29uc3RhbnQgPSA2MDsKKwkJdGltZV9jb25zdGFudCAqPSAxMDAwOworCQlXID0gMSAtIDEvZXhwKGxvZygxMCkqKGRvdWJsZSlzY2FuX2ludGVydmFsL3RpbWVfY29uc3RhbnQpOworCQlpZiAoKGZkID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKSkgPCAwKSB7CisJCQlwZXJyb3IoIm5zdGF0OiBzb2NrZXQiKTsKKwkJCWV4aXQoLTEpOworCQl9CisJCWlmIChiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyKikmc3VuLCAyKzErc3RybGVuKHN1bi5zdW5fcGF0aCsxKSkgPCAwKSB7CisJCQlwZXJyb3IoIm5zdGF0OiBiaW5kIik7CisJCQlleGl0KC0xKTsKKwkJfQorCQlpZiAobGlzdGVuKGZkLCA1KSA8IDApIHsKKwkJCXBlcnJvcigibnN0YXQ6IGxpc3RlbiIpOworCQkJZXhpdCgtMSk7CisJCX0KKwkJaWYgKGRhZW1vbigwLCAwKSkgeworCQkJcGVycm9yKCJuc3RhdDogZGFlbW9uIik7CisJCQlleGl0KC0xKTsKKwkJfQorCQlzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisJCXNpZ25hbChTSUdDSExELCBzaWdjaGlsZCk7CisJCXNlcnZlcl9sb29wKGZkKTsKKwkJZXhpdCgwKTsKKwl9CisKKwlwYXR0ZXJucyA9IGFyZ3Y7CisJbnBhdHRlcm5zID0gYXJnYzsKKworCWlmICgoaGlzdF9uYW1lID0gZ2V0ZW52KCJOU1RBVF9ISVNUT1JZIikpID09IE5VTEwpIHsKKwkJaGlzdF9uYW1lID0gbWFsbG9jKDEyOCk7CisJCXNwcmludGYoaGlzdF9uYW1lLCAiL3RtcC8ubnN0YXQudSVkIiwgZ2V0dWlkKCkpOworCX0KKworCWlmIChyZXNldF9oaXN0b3J5KQorCQl1bmxpbmsoaGlzdF9uYW1lKTsKKworCWlmICghaWdub3JlX2hpc3RvcnkgfHwgIW5vX3VwZGF0ZSkgeworCQlzdHJ1Y3Qgc3RhdCBzdGI7CisKKwkJZmQgPSBvcGVuKGhpc3RfbmFtZSwgT19SRFdSfE9fQ1JFQVR8T19OT0ZPTExPVywgMDYwMCk7CisJCWlmIChmZCA8IDApIHsKKwkJCXBlcnJvcigibnN0YXQ6IG9wZW4gaGlzdG9yeSBmaWxlIik7CisJCQlleGl0KC0xKTsKKwkJfQorCQlpZiAoKGhpc3RfZnAgPSBmZG9wZW4oZmQsICJyKyIpKSA9PSBOVUxMKSB7CisJCQlwZXJyb3IoIm5zdGF0OiBmZG9wZW4gaGlzdG9yeSBmaWxlIik7CisJCQlleGl0KC0xKTsKKwkJfQorCQlpZiAoZmxvY2soZmlsZW5vKGhpc3RfZnApLCBMT0NLX0VYKSkgeworCQkJcGVycm9yKCJuc3RhdDogZmxvY2sgaGlzdG9yeSBmaWxlIik7CisJCQlleGl0KC0xKTsKKwkJfQorCQlpZiAoZnN0YXQoZmlsZW5vKGhpc3RfZnApLCAmc3RiKSAhPSAwKSB7CisJCQlwZXJyb3IoIm5zdGF0OiBmc3RhdCBoaXN0b3J5IGZpbGUiKTsKKwkJCWV4aXQoLTEpOworCQl9CisJCWlmIChzdGIuc3RfbmxpbmsgIT0gMSB8fCBzdGIuc3RfdWlkICE9IGdldHVpZCgpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIm5zdGF0OiBzb21ldGhpbmcgaXMgc28gd3Jvbmcgd2l0aCBoaXN0b3J5IGZpbGUsIHRoYXQgSSBwcmVmZXIgbm90IHRvIHByb2NlZWQuXG4iKTsKKwkJCWV4aXQoLTEpOworCQl9CisJCWlmICghaWdub3JlX2hpc3RvcnkpIHsKKwkJCUZJTEUgKnRmcDsKKwkJCWxvbmcgdXB0aW1lID0gLTE7CisJCQlpZiAoKHRmcCA9IGZvcGVuKCIvcHJvYy91cHRpbWUiLCAiciIpKSAhPSBOVUxMKSB7CisJCQkJaWYgKGZzY2FuZih0ZnAsICIlbGQiLCAmdXB0aW1lKSAhPSAxKQorCQkJCQl1cHRpbWUgPSAtMTsKKwkJCQlmY2xvc2UodGZwKTsKKwkJCX0KKwkJCWlmICh1cHRpbWUgPj0gMCAmJiB0aW1lKE5VTEwpID49IHN0Yi5zdF9tdGltZSt1cHRpbWUpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIm5zdGF0OiBoaXN0b3J5IGlzIGFnZWQgb3V0LCByZXNldHRpbmdcbiIpOworCQkJCWlmIChmdHJ1bmNhdGUoZmlsZW5vKGhpc3RfZnApLCAwKSA8IDApCisJCQkJCXBlcnJvcigibnN0YXQ6IGZ0cnVuY2F0ZSIpOworCQkJfQorCQl9CisKKwkJbG9hZF9nb29kX3RhYmxlKGhpc3RfZnApOworCisJCWhpc3RfZGIgPSBrZXJuX2RiOworCQlrZXJuX2RiID0gTlVMTDsKKwl9CisKKwlpZiAoKGZkID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKSkgPj0gMCAmJgorCSAgICAoY29ubmVjdChmZCwgKHN0cnVjdCBzb2NrYWRkciopJnN1biwgMisxK3N0cmxlbihzdW4uc3VuX3BhdGgrMSkpID09IDAKKwkgICAgIHx8IChzdHJjcHkoc3VuLnN1bl9wYXRoKzEsICJuc3RhdDAiKSwKKwkJIGNvbm5lY3QoZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzdW4sIDIrMStzdHJsZW4oc3VuLnN1bl9wYXRoKzEpKSA9PSAwKSkKKwkgICAgJiYgdmVyaWZ5X2ZvcmdpbmcoZmQpID09IDApIHsKKwkJRklMRSAqc2ZwID0gZmRvcGVuKGZkLCAiciIpOworCQlsb2FkX2dvb2RfdGFibGUoc2ZwKTsKKwkJaWYgKGhpc3RfZGIgJiYgc291cmNlX21pc21hdGNoKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIm5zdGF0OiBoaXN0b3J5IGlzIHN0YWxlLCBpZ25vcmluZyBpdC5cbiIpOworCQkJaGlzdF9kYiA9IE5VTEw7CisJCX0KKwkJZmNsb3NlKHNmcCk7CisJfSBlbHNlIHsKKwkJaWYgKGZkID49IDApCisJCQljbG9zZShmZCk7CisJCWlmIChoaXN0X2RiICYmIGluZm9fc291cmNlWzBdICYmIHN0cmNtcChpbmZvX3NvdXJjZSwgImtlcm5lbCIpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIm5zdGF0OiBoaXN0b3J5IGlzIHN0YWxlLCBpZ25vcmluZyBpdC5cbiIpOworCQkJaGlzdF9kYiA9IE5VTEw7CisJCQlpbmZvX3NvdXJjZVswXSA9IDA7CisJCX0KKwkJbG9hZF9uZXRzdGF0KCk7CisJCWxvYWRfc25tcDYoKTsKKwkJbG9hZF9zbm1wKCk7CisJCWlmIChpbmZvX3NvdXJjZVswXSA9PSAwKQorCQkJc3RyY3B5KGluZm9fc291cmNlLCAia2VybmVsIik7CisJfQorCisJaWYgKCFub19vdXRwdXQpIHsKKwkJaWYgKGlnbm9yZV9oaXN0b3J5IHx8IGhpc3RfZGIgPT0gTlVMTCkKKwkJCWR1bXBfa2Vybl9kYihzdGRvdXQsIDApOworCQllbHNlCisJCQlkdW1wX2luY3JfZGIoc3Rkb3V0KTsKKwl9CisJaWYgKCFub191cGRhdGUpIHsKKwkJaWYgKGZ0cnVuY2F0ZShmaWxlbm8oaGlzdF9mcCksIDApIDwgMCkKKwkJCXBlcnJvcigibnN0YXQ6IGZ0cnVuY2F0ZSIpOworCQlyZXdpbmQoaGlzdF9mcCk7CisKKwkJanNvbl9vdXRwdXQgPSAwOworCQlkdW1wX2tlcm5fZGIoaGlzdF9mcCwgMSk7CisJCWZjbG9zZShoaXN0X2ZwKTsKKwl9CisJZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL21pc2MvcnRhY2N0LmMgYi9pcHJvdXRlMi9taXNjL3J0YWNjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiOGM5MGYKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9taXNjL3J0YWNjdC5jCkBAIC0wLDAgKzEsNjMwIEBACisvKgorICogcnRhY2N0LmMJCUFwcGxldCB0byBkaXNwbGF5IGNvbnRlbnRzIG9mIC9wcm9jL25ldC9ydF9hY2N0LgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPGZubWF0Y2guaD4KKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdW4uaD4KKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgInJ0X25hbWVzLmgiCisKKyNpbmNsdWRlIDxTTkFQU0hPVC5oPgorCitpbnQgcmVzZXRfaGlzdG9yeSA9IDA7CitpbnQgaWdub3JlX2hpc3RvcnkgPSAwOworaW50IG5vX291dHB1dCA9IDA7CitpbnQgbm9fdXBkYXRlID0gMDsKK2ludCBzY2FuX2ludGVydmFsID0gMDsKK2ludCB0aW1lX2NvbnN0YW50ID0gMDsKK2ludCBkdW1wX3plcm9zID0gMDsKK3Vuc2lnbmVkIGxvbmcgbWFnaWNfbnVtYmVyID0gMDsKK2RvdWJsZSBXOworCitzdGF0aWMgaW50IGdlbmVyaWNfcHJvY19vcGVuKGNvbnN0IGNoYXIgKmVudiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwljaGFyIHN0b3JlWzEwMjRdOworCWNoYXIgKnAgPSBnZXRlbnYoZW52KTsKKwlpZiAoIXApIHsKKwkJcCA9IGdldGVudigiUFJPQ19ST09UIikgPyA6ICIvcHJvYyI7CisJCXNucHJpbnRmKHN0b3JlLCBzaXplb2Yoc3RvcmUpLTEsICIlcy8lcyIsIHAsIG5hbWUpOworCQlwID0gc3RvcmU7CisJfQorCXJldHVybiBvcGVuKHAsIE9fUkRPTkxZKTsKK30KKworc3RhdGljIGludCBuZXRfcnRhY2N0X29wZW4odm9pZCkKK3sKKwlyZXR1cm4gZ2VuZXJpY19wcm9jX29wZW4oIlBST0NfTkVUX1JUQUNDVCIsICJuZXQvcnRfYWNjdCIpOworfQorCitzdGF0aWMgX191MzIgcm1hcFsyNTYvNF07CisKK3N0cnVjdCBydGFjY3RfZGF0YQoreworCV9fdTMyCQkJaXZhbFsyNTYqNF07CisKKwl1bnNpZ25lZCBsb25nIGxvbmcJdmFsWzI1Nio0XTsKKwlkb3VibGUJCQlyYXRlWzI1Nio0XTsKKwljaGFyCQkJc2lnbmF0dXJlWzEyOF07Cit9OworCitzdGF0aWMgc3RydWN0IHJ0YWNjdF9kYXRhIGtlcm5fZGJfc3RhdGljOworCitzdGF0aWMgc3RydWN0IHJ0YWNjdF9kYXRhICprZXJuX2RiID0gJmtlcm5fZGJfc3RhdGljOworc3RhdGljIHN0cnVjdCBydGFjY3RfZGF0YSAqaGlzdF9kYjsKKworc3RhdGljIHZvaWQgbnJlYWQoaW50IGZkLCBjaGFyICpidWYsIGludCB0b3QpCit7CisJaW50IGNvdW50ID0gMDsKKworCXdoaWxlIChjb3VudCA8IHRvdCkgeworCQlpbnQgbiA9IHJlYWQoZmQsIGJ1Zitjb3VudCwgdG90LWNvdW50KTsKKwkJaWYgKG4gPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQkJY29udGludWU7CisJCQlleGl0KC0xKTsKKwkJfQorCQlpZiAobiA9PSAwKQorCQkJZXhpdCgtMSk7CisJCWNvdW50ICs9IG47CisJfQorfQorCitzdGF0aWMgX191MzIgKnJlYWRfa2Vybl90YWJsZShfX3UzMiAqdGJsKQoreworCXN0YXRpYyBfX3UzMiAqdGJsX3B0cjsKKwlpbnQgZmQ7CisKKwlpZiAobWFnaWNfbnVtYmVyKSB7CisJCWlmICh0YmxfcHRyICE9IE5VTEwpCisJCQlyZXR1cm4gdGJsX3B0cjsKKworCQlmZCA9IG9wZW4oIi9kZXYvbWVtIiwgT19SRE9OTFkpOworCQlpZiAoZmQgPCAwKSB7CisJCQlwZXJyb3IoIm1hZ2ljIG9wZW4iKTsKKwkJCWV4aXQoLTEpOworCQl9CisJCXRibF9wdHIgPSBtbWFwKE5VTEwsIDQwOTYsCisJCQkgICAgICAgUFJPVF9SRUFELAorCQkJICAgICAgIE1BUF9TSEFSRUQsCisJCQkgICAgICAgZmQsIG1hZ2ljX251bWJlcik7CisJCWlmICgodW5zaWduZWQgbG9uZyl0YmxfcHRyID09IH4wVUwpIHsKKwkJCXBlcnJvcigibWFnaWMgbW1hcCIpOworCQkJZXhpdCgtMSk7CisJCX0KKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gdGJsX3B0cjsKKwl9CisKKwlmZCA9IG5ldF9ydGFjY3Rfb3BlbigpOworCWlmIChmZCA+PSAwKSB7CisJCW5yZWFkKGZkLCAoY2hhciopdGJsLCAyNTYqMTYpOworCQljbG9zZShmZCk7CisJfSBlbHNlIHsKKwkJbWVtc2V0KHRibCwgMCwgMjU2KjE2KTsKKwl9CisJcmV0dXJuIHRibDsKK30KKworc3RhdGljIHZvaWQgZm9ybWF0X3JhdGUoRklMRSAqZnAsIGRvdWJsZSByYXRlKQoreworCWNoYXIgdGVtcFs2NF07CisKKwlpZiAocmF0ZSA+IDEwMjQqMTAyNCkgeworCQlzcHJpbnRmKHRlbXAsICIldU0iLCAodW5zaWduZWQpcmludChyYXRlLygxMDI0KjEwMjQpKSk7CisJCWZwcmludGYoZnAsICIgJS0xMHMiLCB0ZW1wKTsKKwl9IGVsc2UgaWYgKHJhdGUgPiAxMDI0KSB7CisJCXNwcmludGYodGVtcCwgIiV1SyIsICh1bnNpZ25lZClyaW50KHJhdGUvMTAyNCkpOworCQlmcHJpbnRmKGZwLCAiICUtMTBzIiwgdGVtcCk7CisJfSBlbHNlCisJCWZwcmludGYoZnAsICIgJS0xMHUiLCAodW5zaWduZWQpcmF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGZvcm1hdF9jb3VudChGSUxFICpmcCwgdW5zaWduZWQgbG9uZyBsb25nIHZhbCkKK3sKKwlpZiAodmFsID4gMTAyNCoxMDI0KjEwMjQpCisJCWZwcmludGYoZnAsICIgJTEwbGx1TSIsIHZhbC8oMTAyNCoxMDI0KSk7CisJZWxzZSBpZiAodmFsID4gMTAyNCoxMDI0KQorCQlmcHJpbnRmKGZwLCAiICUxMGxsdUsiLCB2YWwvMTAyNCk7CisJZWxzZQorCQlmcHJpbnRmKGZwLCAiICUxMGxsdSIsIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfYWJzX2RiKEZJTEUgKmZwKQoreworCWludCByZWFsbTsKKwljaGFyIGIxWzE2XTsKKworCWlmICghbm9fb3V0cHV0KSB7CisJCWZwcmludGYoZnAsICIjJXNcbiIsIGtlcm5fZGItPnNpZ25hdHVyZSk7CisJCWZwcmludGYoZnAsCisiJS0xMHMgIgorIiUtMTBzICIKKyIlLTEwcyAiCisiJS0xMHMgIgorIiUtMTBzICIKKyJcbiIKKwkJICAgICAgICwgIlJlYWxtIiwgIkJ5dGVzVG8iLCAiUGt0c1RvIiwgIkJ5dGVzRnJvbSIsICJQa3RzRnJvbSIpOworCQlmcHJpbnRmKGZwLAorIiUtMTBzICIKKyIlLTEwcyAiCisiJS0xMHMgIgorIiUtMTBzICIKKyIlLTEwcyAiCisiXG4iCisJCSAgICAgICAsICIiLCAiQlBTVG8iLCAiUFBTVG8iLCAiQlBTRnJvbSIsICJQUFNGcm9tIik7CisKKwl9CisKKwlmb3IgKHJlYWxtPTA7IHJlYWxtPDI1NjsgcmVhbG0rKykgeworCQlpbnQgaTsKKwkJdW5zaWduZWQgbG9uZyBsb25nICp2YWw7CisJCWRvdWJsZQkJICAgKnJhdGU7CisKKwkJaWYgKCEocm1hcFtyZWFsbT4+NV0gJiAoMTw8KHJlYWxtJjB4MWYpKSkpCisJCQljb250aW51ZTsKKworCQl2YWwgPSAma2Vybl9kYi0+dmFsW3JlYWxtKjRdOworCQlyYXRlID0gJmtlcm5fZGItPnJhdGVbcmVhbG0qNF07CisKKwkJaWYgKCFkdW1wX3plcm9zICYmCisJCSAgICAhdmFsWzBdICYmICFyYXRlWzBdICYmCisJCSAgICAhdmFsWzFdICYmICFyYXRlWzFdICYmCisJCSAgICAhdmFsWzJdICYmICFyYXRlWzJdICYmCisJCSAgICAhdmFsWzNdICYmICFyYXRlWzNdKQorCQkJY29udGludWU7CisKKwkJaWYgKGhpc3RfZGIpIHsKKwkJCW1lbWNweSgmaGlzdF9kYi0+dmFsW3JlYWxtKjRdLCB2YWwsIHNpemVvZigqdmFsKSo0KTsKKwkJfQorCisJCWlmIChub19vdXRwdXQpCisJCQljb250aW51ZTsKKworCQlmcHJpbnRmKGZwLCAiJS0xMHMiLCBydG5sX3J0cmVhbG1fbjJhKHJlYWxtLCBiMSwgc2l6ZW9mKGIxKSkpOworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQkJZm9ybWF0X2NvdW50KGZwLCB2YWxbaV0pOworCQlmcHJpbnRmKGZwLCAiXG4lLTEwcyIsICIiKTsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJCWZvcm1hdF9yYXRlKGZwLCByYXRlW2ldKTsKKwkJZnByaW50ZihmcCwgIlxuIik7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGR1bXBfaW5jcl9kYihGSUxFICpmcCkKK3sKKwlpbnQgaywgcmVhbG07CisJY2hhciBiMVsxNl07CisKKwlpZiAoIW5vX291dHB1dCkgeworCQlmcHJpbnRmKGZwLCAiIyVzXG4iLCBrZXJuX2RiLT5zaWduYXR1cmUpOworCQlmcHJpbnRmKGZwLAorIiUtMTBzICIKKyIlLTEwcyAiCisiJS0xMHMgIgorIiUtMTBzICIKKyIlLTEwcyAiCisiXG4iCisJCSAgICAgICAsICJSZWFsbSIsICJCeXRlc1RvIiwgIlBrdHNUbyIsICJCeXRlc0Zyb20iLCAiUGt0c0Zyb20iKTsKKwkJZnByaW50ZihmcCwKKyIlLTEwcyAiCisiJS0xMHMgIgorIiUtMTBzICIKKyIlLTEwcyAiCisiJS0xMHMgIgorIlxuIgorCQkgICAgICAgLCAiIiwgIkJQU1RvIiwgIlBQU1RvIiwgIkJQU0Zyb20iLCAiUFBTRnJvbSIpOworCX0KKworCWZvciAocmVhbG09MDsgcmVhbG08MjU2OyByZWFsbSsrKSB7CisJCWludCBvdmZsID0gMDsKKwkJaW50IGk7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyAqdmFsOworCQlkb3VibGUJCSAgICpyYXRlOworCQl1bnNpZ25lZCBsb25nIGxvbmcgcnZhbFs0XTsKKworCQlpZiAoIShybWFwW3JlYWxtPj41XSAmICgxPDwocmVhbG0mMHgxZikpKSkKKwkJCWNvbnRpbnVlOworCisJCXZhbCA9ICZrZXJuX2RiLT52YWxbcmVhbG0qNF07CisJCXJhdGUgPSAma2Vybl9kYi0+cmF0ZVtyZWFsbSo0XTsKKworCQlmb3IgKGs9MDsgazw0OyBrKyspIHsKKwkJCXJ2YWxba10gPSB2YWxba107CisJCQlpZiAocnZhbFtrXSA8IGhpc3RfZGItPnZhbFtyZWFsbSo0K2tdKQorCQkJCW92ZmwgPSAxOworCQkJZWxzZQorCQkJCXJ2YWxba10gLT0gaGlzdF9kYi0+dmFsW3JlYWxtKjQra107CisJCX0KKwkJaWYgKG92ZmwpIHsKKwkJCWZvciAoaz0wOyBrPDQ7IGsrKykKKwkJCQlydmFsW2tdID0gdmFsW2tdOworCQl9CisJCWlmIChoaXN0X2RiKSB7CisJCQltZW1jcHkoJmhpc3RfZGItPnZhbFtyZWFsbSo0XSwgdmFsLCBzaXplb2YoKnZhbCkqNCk7CisJCX0KKworCQlpZiAobm9fb3V0cHV0KQorCQkJY29udGludWU7CisKKwkJaWYgKCFkdW1wX3plcm9zICYmCisJCSAgICAhcnZhbFswXSAmJiAhcmF0ZVswXSAmJgorCQkgICAgIXJ2YWxbMV0gJiYgIXJhdGVbMV0gJiYKKwkJICAgICFydmFsWzJdICYmICFyYXRlWzJdICYmCisJCSAgICAhcnZhbFszXSAmJiAhcmF0ZVszXSkKKwkJCWNvbnRpbnVlOworCisKKwkJZnByaW50ZihmcCwgIiUtMTBzIiwgcnRubF9ydHJlYWxtX24yYShyZWFsbSwgYjEsIHNpemVvZihiMSkpKTsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJCWZvcm1hdF9jb3VudChmcCwgcnZhbFtpXSk7CisJCWZwcmludGYoZnAsICJcbiUtMTBzIiwgIiIpOworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQkJZm9ybWF0X3JhdGUoZnAsIHJhdGVbaV0pOworCQlmcHJpbnRmKGZwLCAiXG4iKTsKKwl9Cit9CisKKworc3RhdGljIGludCBjaGlsZHJlbjsKKworc3RhdGljIHZvaWQgc2lnY2hpbGQoaW50IHNpZ25vKQoreworfQorCisvKiBTZXJ2ZXIgc2lkZSBvbmx5OiByZWFkIGtlcm5lbCBkYXRhLCB1cGRhdGUgdGFibGVzLCBjYWxjdWxhdGUgcmF0ZXMuICovCisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9kYihpbnQgaW50ZXJ2YWwpCit7CisJaW50IGk7CisJX191MzIgKml2YWw7CisJX191MzIgX2l2YWxbMjU2KjRdOworCisJaXZhbCA9IHJlYWRfa2Vybl90YWJsZShfaXZhbCk7CisKKwlmb3IgKGk9MDsgaTwyNTYqNDsgaSsrKSB7CisJCWRvdWJsZSBzYW1wbGU7CisJCV9fdTMyIGluY3IgPSBpdmFsW2ldIC0ga2Vybl9kYi0+aXZhbFtpXTsKKworCQlpZiAoaXZhbFtpXSA9PSAwICYmIGluY3IgPT0gMCAmJgorCQkgICAga2Vybl9kYi0+dmFsW2ldID09IDAgJiYga2Vybl9kYi0+cmF0ZVtpXSA9PSAwKQorCQkJY29udGludWU7CisKKwkJa2Vybl9kYi0+dmFsW2ldICs9IGluY3I7CisJCWtlcm5fZGItPml2YWxbaV0gPSBpdmFsW2ldOworCQlzYW1wbGUgPSAoZG91YmxlKShpbmNyKjEwMDApL2ludGVydmFsOworCQlpZiAoaW50ZXJ2YWwgPj0gc2Nhbl9pbnRlcnZhbCkgeworCQkJa2Vybl9kYi0+cmF0ZVtpXSArPSBXKihzYW1wbGUta2Vybl9kYi0+cmF0ZVtpXSk7CisJCX0gZWxzZSBpZiAoaW50ZXJ2YWwgPj0gMTAwMCkgeworCQkJaWYgKGludGVydmFsID49IHRpbWVfY29uc3RhbnQpIHsKKwkJCQlrZXJuX2RiLT5yYXRlW2ldID0gc2FtcGxlOworCQkJfSBlbHNlIHsKKwkJCQlkb3VibGUgdyA9IFcqKGRvdWJsZSlpbnRlcnZhbC9zY2FuX2ludGVydmFsOworCQkJCWtlcm5fZGItPnJhdGVbaV0gKz0gdyooc2FtcGxlLWtlcm5fZGItPnJhdGVbaV0pOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBzZW5kX2RiKGludCBmZCkKK3sKKwlpbnQgdG90ID0gMDsKKworCXdoaWxlICh0b3QgPCBzaXplb2YoKmtlcm5fZGIpKSB7CisJCWludCBuID0gd3JpdGUoZmQsICgoY2hhciopa2Vybl9kYikgKyB0b3QsIHNpemVvZigqa2Vybl9kYiktdG90KTsKKwkJaWYgKG4gPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQkJY29udGludWU7CisJCQlyZXR1cm47CisJCX0KKwkJdG90ICs9IG47CisJfQorfQorCisKKworI2RlZmluZSBUX0RJRkYoYSxiKSAoKChhKS50dl9zZWMtKGIpLnR2X3NlYykqMTAwMCArICgoYSkudHZfdXNlYy0oYikudHZfdXNlYykvMTAwMCkKKworCitzdGF0aWMgdm9pZCBwYWRfa2Vybl90YWJsZShzdHJ1Y3QgcnRhY2N0X2RhdGEgKmRhdCwgX191MzIgKml2YWwpCit7CisJaW50IGk7CisJbWVtc2V0KGRhdC0+cmF0ZSwgMCwgc2l6ZW9mKGRhdC0+cmF0ZSkpOworCWlmIChkYXQtPml2YWwgIT0gaXZhbCkKKwkJbWVtY3B5KGRhdC0+aXZhbCwgaXZhbCwgc2l6ZW9mKGRhdC0+aXZhbCkpOworCWZvciAoaT0wOyBpPDI1Nio0OyBpKyspCisJCWRhdC0+dmFsW2ldID0gaXZhbFtpXTsKK30KKworc3RhdGljIHZvaWQgc2VydmVyX2xvb3AoaW50IGZkKQoreworCXN0cnVjdCB0aW1ldmFsIHNuYXB0aW1lID0geyAwIH07CisJc3RydWN0IHBvbGxmZCBwOworCXAuZmQgPSBmZDsKKwlwLmV2ZW50cyA9IHAucmV2ZW50cyA9IFBPTExJTjsKKworCXNwcmludGYoa2Vybl9kYi0+c2lnbmF0dXJlLAorCQkiJXUuJWx1IHNhbXBsaW5nX2ludGVydmFsPSVkIHRpbWVfY29uc3Q9JWQiLAorCQkodW5zaWduZWQpIGdldHBpZCgpLCAodW5zaWduZWQgbG9uZylyYW5kb20oKSwKKwkJc2Nhbl9pbnRlcnZhbC8xMDAwLCB0aW1lX2NvbnN0YW50LzEwMDApOworCisJcGFkX2tlcm5fdGFibGUoa2Vybl9kYiwgcmVhZF9rZXJuX3RhYmxlKGtlcm5fZGItPml2YWwpKTsKKworCWZvciAoOzspIHsKKwkJaW50IHN0YXR1czsKKwkJaW50IHRkaWZmOworCQlzdHJ1Y3QgdGltZXZhbCBub3c7CisJCWdldHRpbWVvZmRheSgmbm93LCBOVUxMKTsKKwkJdGRpZmYgPSBUX0RJRkYobm93LCBzbmFwdGltZSk7CisJCWlmICh0ZGlmZiA+PSBzY2FuX2ludGVydmFsKSB7CisJCQl1cGRhdGVfZGIodGRpZmYpOworCQkJc25hcHRpbWUgPSBub3c7CisJCQl0ZGlmZiA9IDA7CisJCX0KKwkJaWYgKHBvbGwoJnAsIDEsIHRkaWZmICsgc2Nhbl9pbnRlcnZhbCkgPiAwCisJCSAgICAmJiAocC5yZXZlbnRzJlBPTExJTikpIHsKKwkJCWludCBjbG50ID0gYWNjZXB0KGZkLCBOVUxMLCBOVUxMKTsKKwkJCWlmIChjbG50ID49IDApIHsKKwkJCQlwaWRfdCBwaWQ7CisJCQkJaWYgKGNoaWxkcmVuID49IDUpIHsKKwkJCQkJY2xvc2UoY2xudCk7CisJCQkJfSBlbHNlIGlmICgocGlkID0gZm9yaygpKSAhPSAwKSB7CisJCQkJCWlmIChwaWQ+MCkKKwkJCQkJCWNoaWxkcmVuKys7CisJCQkJCWNsb3NlKGNsbnQpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICh0ZGlmZiA+IDApCisJCQkJCQl1cGRhdGVfZGIodGRpZmYpOworCQkJCQlzZW5kX2RiKGNsbnQpOworCQkJCQlleGl0KDApOworCQkJCX0KKwkJCX0KKwkJfQorCQl3aGlsZSAoY2hpbGRyZW4gJiYgd2FpdHBpZCgtMSwgJnN0YXR1cywgV05PSEFORykgPiAwKQorCQkJY2hpbGRyZW4tLTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdmVyaWZ5X2ZvcmdpbmcoaW50IGZkKQoreworCXN0cnVjdCB1Y3JlZCBjcmVkOworCXNvY2tsZW5fdCBvbGVuID0gc2l6ZW9mKGNyZWQpOworCisJaWYgKGdldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1BFRVJDUkVELCAodm9pZCopJmNyZWQsICZvbGVuKSB8fAorCSAgICBvbGVuIDwgc2l6ZW9mKGNyZWQpKQorCQlyZXR1cm4gLTE7CisJaWYgKGNyZWQudWlkID09IGdldHVpZCgpIHx8IGNyZWQudWlkID09IDApCisJCXJldHVybiAwOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwKKyJVc2FnZTogcnRhY2N0IFsgLWg/dlZ6cm5hc2Q6dDogXSBbIExpc3RPZlJlYWxtcyBdXG4iCisJCSk7CisJZXhpdCgtMSk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJY2hhciBoaXN0X25hbWVbMTI4XTsKKwlzdHJ1Y3Qgc29ja2FkZHJfdW4gc3VuOworCWludCBjaDsKKwlpbnQgZmQ7CisKKwl3aGlsZSAoKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJoP3ZWenJNOm5hc2Q6dDoiKSkgIT0gRU9GKSB7CisJCXN3aXRjaChjaCkgeworCQljYXNlICd6JzoKKwkJCWR1bXBfemVyb3MgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQkJcmVzZXRfaGlzdG9yeSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnYSc6CisJCQlpZ25vcmVfaGlzdG9yeSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlub191cGRhdGUgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ24nOgorCQkJbm9fb3V0cHV0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCXNjYW5faW50ZXJ2YWwgPSAxMDAwKmF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICd0JzoKKwkJCWlmIChzc2NhbmYob3B0YXJnLCAiJWQiLCAmdGltZV9jb25zdGFudCkgIT0gMSB8fAorCQkJICAgIHRpbWVfY29uc3RhbnQgPD0gMCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAicnRhY2N0OiBpbnZhbGlkIHRpbWUgY29uc3RhbnQgZGl2aXNvclxuIik7CisJCQkJZXhpdCgtMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAndic6CisJCWNhc2UgJ1YnOgorCQkJcHJpbnRmKCJydGFjY3QgdXRpbGl0eSwgaXByb3V0ZTItc3Mlc1xuIiwgU05BUFNIT1QpOworCQkJZXhpdCgwKTsKKwkJY2FzZSAnTSc6CisJCQkvKiBTb21lIHNlY3JldCB1bmRvY3VtZW50ZWQgb3B0aW9uLCBub2JvZHkKKwkJCSAqIGlzIGV4cGVjdGVkIHRvIGFzayBhYm91dCBpdHMgc2Vuc2UuIFNlZT8KKwkJCSAqLworCQkJc3NjYW5mKG9wdGFyZywgIiVseCIsICZtYWdpY19udW1iZXIpOworCQkJYnJlYWs7CisJCWNhc2UgJ2gnOgorCQljYXNlICc/JzoKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKCk7CisJCX0KKwl9CisKKwlhcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmIChhcmdjKSB7CisJCXdoaWxlIChhcmdjID4gMCkgeworCQkJX191MzIgcmVhbG07CisJCQlpZiAocnRubF9ydHJlYWxtX2EybigmcmVhbG0sIGFyZ3ZbMF0pKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiByZWFsbSBcIiVzXCIgZG9lcyBub3QgZXhpc3QuXG4iLCBhcmd2WzBdKTsKKwkJCQlleGl0KC0xKTsKKwkJCX0KKwkJCXJtYXBbcmVhbG0+PjVdIHw9ICgxPDwocmVhbG0mMHgxZikpOworCQkJYXJnYy0tOyBhcmd2Kys7CisJCX0KKwl9IGVsc2UgeworCQltZW1zZXQocm1hcCwgfjAsIHNpemVvZihybWFwKSk7CisJCS8qIEFsd2F5cyBzdXBwcmVzcyB6ZXJvcy4gKi8KKwkJZHVtcF96ZXJvcyA9IDA7CisJfQorCisJc3VuLnN1bl9mYW1pbHkgPSBBRl9VTklYOworCXN1bi5zdW5fcGF0aFswXSA9IDA7CisJc3ByaW50ZihzdW4uc3VuX3BhdGgrMSwgInJ0YWNjdCVkIiwgZ2V0dWlkKCkpOworCisJaWYgKHNjYW5faW50ZXJ2YWwgPiAwKSB7CisJCWlmICh0aW1lX2NvbnN0YW50ID09IDApCisJCQl0aW1lX2NvbnN0YW50ID0gNjA7CisJCXRpbWVfY29uc3RhbnQgKj0gMTAwMDsKKwkJVyA9IDEgLSAxL2V4cChsb2coMTApKihkb3VibGUpc2Nhbl9pbnRlcnZhbC90aW1lX2NvbnN0YW50KTsKKwkJaWYgKChmZCA9IHNvY2tldChBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCkpIDwgMCkgeworCQkJcGVycm9yKCJydGFjY3Q6IHNvY2tldCIpOworCQkJZXhpdCgtMSk7CisJCX0KKwkJaWYgKGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzdW4sIDIrMStzdHJsZW4oc3VuLnN1bl9wYXRoKzEpKSA8IDApIHsKKwkJCXBlcnJvcigicnRhY2N0OiBiaW5kIik7CisJCQlleGl0KC0xKTsKKwkJfQorCQlpZiAobGlzdGVuKGZkLCA1KSA8IDApIHsKKwkJCXBlcnJvcigicnRhY2N0OiBsaXN0ZW4iKTsKKwkJCWV4aXQoLTEpOworCQl9CisJCWlmIChkYWVtb24oMCwgMCkpIHsKKwkJCXBlcnJvcigicnRhY2N0OiBkYWVtb24iKTsKKwkJCWV4aXQoLTEpOworCQl9CisJCXNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKwkJc2lnbmFsKFNJR0NITEQsIHNpZ2NoaWxkKTsKKwkJc2VydmVyX2xvb3AoZmQpOworCQlleGl0KDApOworCX0KKworCWlmIChnZXRlbnYoIlJUQUNDVF9ISVNUT1JZIikpCisJCXNucHJpbnRmKGhpc3RfbmFtZSwgc2l6ZW9mKGhpc3RfbmFtZSksICIlcyIsIGdldGVudigiUlRBQ0NUX0hJU1RPUlkiKSk7CisJZWxzZQorCQlzcHJpbnRmKGhpc3RfbmFtZSwgIi90bXAvLnJ0YWNjdC51JWQiLCBnZXR1aWQoKSk7CisKKwlpZiAocmVzZXRfaGlzdG9yeSkKKwkJdW5saW5rKGhpc3RfbmFtZSk7CisKKwlpZiAoIWlnbm9yZV9oaXN0b3J5IHx8ICFub191cGRhdGUpIHsKKwkJc3RydWN0IHN0YXQgc3RiOworCisJCWZkID0gb3BlbihoaXN0X25hbWUsIE9fUkRXUnxPX0NSRUFUfE9fTk9GT0xMT1csIDA2MDApOworCQlpZiAoZmQgPCAwKSB7CisJCQlwZXJyb3IoInJ0YWNjdDogb3BlbiBoaXN0b3J5IGZpbGUiKTsKKwkJCWV4aXQoLTEpOworCQl9CisJCWlmIChmbG9jayhmZCwgTE9DS19FWCkpIHsKKwkJCXBlcnJvcigicnRhY2N0OiBmbG9jayBoaXN0b3J5IGZpbGUiKTsKKwkJCWV4aXQoLTEpOworCQl9CisJCWlmIChmc3RhdChmZCwgJnN0YikgIT0gMCkgeworCQkJcGVycm9yKCJydGFjY3Q6IGZzdGF0IGhpc3RvcnkgZmlsZSIpOworCQkJZXhpdCgtMSk7CisJCX0KKwkJaWYgKHN0Yi5zdF9ubGluayAhPSAxIHx8IHN0Yi5zdF91aWQgIT0gZ2V0dWlkKCkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAicnRhY2N0OiBzb21ldGhpbmcgaXMgc28gd3Jvbmcgd2l0aCBoaXN0b3J5IGZpbGUsIHRoYXQgSSBwcmVmZXIgbm90IHRvIHByb2NlZWQuXG4iKTsKKwkJCWV4aXQoLTEpOworCQl9CisJCWlmIChzdGIuc3Rfc2l6ZSAhPSBzaXplb2YoKmhpc3RfZGIpKQorCQkJaWYgKHdyaXRlKGZkLCBrZXJuX2RiLCBzaXplb2YoKmhpc3RfZGIpKSA8IDApIHsKKwkJCQlwZXJyb3IoInJ0YWNjdDogd3JpdGUgaGlzdG9yeSBmaWxlIik7CisJCQkJZXhpdCgtMSk7CisJCQl9CisKKwkJaGlzdF9kYiA9IG1tYXAoTlVMTCwgc2l6ZW9mKCpoaXN0X2RiKSwKKwkJCSAgICAgICBQUk9UX1JFQUR8UFJPVF9XUklURSwKKwkJCSAgICAgICBub191cGRhdGUgPyBNQVBfUFJJVkFURSA6IE1BUF9TSEFSRUQsCisJCQkgICAgICAgZmQsIDApOworCisJCWlmICgodW5zaWduZWQgbG9uZyloaXN0X2RiID09IH4wVUwpIHsKKwkJCXBlcnJvcigibW1hcCIpOworCQkJZXhpdCgtMSk7CisJCX0KKworCQlpZiAoIWlnbm9yZV9oaXN0b3J5KSB7CisJCQlGSUxFICp0ZnA7CisJCQlsb25nIHVwdGltZSA9IC0xOworCQkJaWYgKCh0ZnAgPSBmb3BlbigiL3Byb2MvdXB0aW1lIiwgInIiKSkgIT0gTlVMTCkgeworCQkJCWlmIChmc2NhbmYodGZwLCAiJWxkIiwgJnVwdGltZSkgIT0gMSkKKwkJCQkJdXB0aW1lID0gLTE7CisJCQkJZmNsb3NlKHRmcCk7CisJCQl9CisKKwkJCWlmICh1cHRpbWUgPj0gMCAmJiB0aW1lKE5VTEwpID49IHN0Yi5zdF9tdGltZSt1cHRpbWUpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgInJ0YWNjdDogaGlzdG9yeSBpcyBhZ2VkIG91dCwgcmVzZXR0aW5nXG4iKTsKKwkJCQltZW1zZXQoaGlzdF9kYiwgMCwgc2l6ZW9mKCpoaXN0X2RiKSk7CisJCQl9CisJCX0KKworCQljbG9zZShmZCk7CisJfQorCisJaWYgKChmZCA9IHNvY2tldChBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCkpID49IDAgJiYKKwkgICAgKGNvbm5lY3QoZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzdW4sIDIrMStzdHJsZW4oc3VuLnN1bl9wYXRoKzEpKSA9PSAwCisJICAgICB8fCAoc3RyY3B5KHN1bi5zdW5fcGF0aCsxLCAicnRhY2N0MCIpLAorCQkgY29ubmVjdChmZCwgKHN0cnVjdCBzb2NrYWRkciopJnN1biwgMisxK3N0cmxlbihzdW4uc3VuX3BhdGgrMSkpID09IDApKQorCSAgICAmJiB2ZXJpZnlfZm9yZ2luZyhmZCkgPT0gMCkgeworCQlucmVhZChmZCwgKGNoYXIqKWtlcm5fZGIsIHNpemVvZigqa2Vybl9kYikpOworCQlpZiAoaGlzdF9kYiAmJiBoaXN0X2RiLT5zaWduYXR1cmVbMF0gJiYKKwkJICAgIHN0cmNtcChrZXJuX2RiLT5zaWduYXR1cmUsIGhpc3RfZGItPnNpZ25hdHVyZSkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAicnRhY2N0OiBoaXN0b3J5IGlzIHN0YWxlLCBpZ25vcmluZyBpdC5cbiIpOworCQkJaGlzdF9kYiA9IE5VTEw7CisJCX0KKwkJY2xvc2UoZmQpOworCX0gZWxzZSB7CisJCWlmIChmZCA+PSAwKQorCQkJY2xvc2UoZmQpOworCisJCWlmIChoaXN0X2RiICYmIGhpc3RfZGItPnNpZ25hdHVyZVswXSAmJgorCQkgICAgc3RyY21wKGhpc3RfZGItPnNpZ25hdHVyZSwgImtlcm5lbCIpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgInJ0YWNjdDogaGlzdG9yeSBpcyBzdGFsZSwgaWdub3JpbmcgaXQuXG4iKTsKKwkJCWhpc3RfZGIgPSBOVUxMOworCQl9CisKKwkJcGFkX2tlcm5fdGFibGUoa2Vybl9kYiwgcmVhZF9rZXJuX3RhYmxlKGtlcm5fZGItPml2YWwpKTsKKwkJc3RyY3B5KGtlcm5fZGItPnNpZ25hdHVyZSwgImtlcm5lbCIpOworCX0KKworCWlmIChpZ25vcmVfaGlzdG9yeSB8fCBoaXN0X2RiID09IE5VTEwpCisJCWR1bXBfYWJzX2RiKHN0ZG91dCk7CisJZWxzZQorCQlkdW1wX2luY3JfZGIoc3Rkb3V0KTsKKworCWV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9taXNjL3NzLmMgYi9pcHJvdXRlMi9taXNjL3NzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNmY2M4ZgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL21pc2Mvc3MuYwpAQCAtMCwwICsxLDM5ODUgQEAKKy8qCisgKiBzcy5jCQkic29ja3N0YXQiLCBzb2NrZXQgc3RhdGlzdGljcworICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJydF9uYW1lcy5oIgorI2luY2x1ZGUgImxsX21hcC5oIgorI2luY2x1ZGUgImxpYm5ldGxpbmsuaCIKKyNpbmNsdWRlICJuYW1lc3BhY2UuaCIKKyNpbmNsdWRlICJTTkFQU0hPVC5oIgorCisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvc29ja19kaWFnLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldF9kaWFnLmg+CisjaW5jbHVkZSA8bGludXgvdW5peF9kaWFnLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CS8qIGZvciBNQVhfQUREUl9MRU4gKi8KKyNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWNrZXRfZGlhZy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmtfZGlhZy5oPgorCisjZGVmaW5lIE1BR0lDX1NFUSAxMjM0NTYKKworI2RlZmluZSBESUFHX1JFUVVFU1QoX3JlcSwgX3IpCQkJCQkJICAgIFwKKwlzdHJ1Y3QgewkJCQkJCQkgICAgXAorCQlzdHJ1Y3Qgbmxtc2doZHIgbmxoOwkJCQkJICAgIFwKKwkJX3I7CQkJCQkJCSAgICBcCisJfSBfcmVxID0gewkJCQkJCQkgICAgXAorCQkubmxoID0gewkJCQkJCSAgICBcCisJCQkubmxtc2dfdHlwZSA9IFNPQ0tfRElBR19CWV9GQU1JTFksCQkgICAgXAorCQkJLm5sbXNnX2ZsYWdzID0gTkxNX0ZfUk9PVHxOTE1fRl9NQVRDSHxOTE1fRl9SRVFVRVNULFwKKwkJCS5ubG1zZ19zZXEgPSBNQUdJQ19TRVEsCQkJCSAgICBcCisJCQkubmxtc2dfbGVuID0gc2l6ZW9mKF9yZXEpLAkJCSAgICBcCisJCX0sCQkJCQkJCSAgICBcCisJfQorCisjaWYgSEFWRV9TRUxJTlVYCisjaW5jbHVkZSA8c2VsaW51eC9zZWxpbnV4Lmg+CisjZWxzZQorLyogU3R1YnMgZm9yIFNFTGludXggZnVuY3Rpb25zICovCitzdGF0aWMgaW50IGlzX3NlbGludXhfZW5hYmxlZCh2b2lkKQoreworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBnZXRwaWRjb24ocGlkX3QgcGlkLCBjaGFyICoqY29udGV4dCkKK3sKKwkqY29udGV4dCA9IE5VTEw7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGdldGZpbGVjb24oY2hhciAqcGF0aCwgY2hhciAqKmNvbnRleHQpCit7CisJKmNvbnRleHQgPSBOVUxMOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBzZWN1cml0eV9nZXRfaW5pdGlhbF9jb250ZXh0KGNoYXIgKm5hbWUsICBjaGFyICoqY29udGV4dCkKK3sKKwkqY29udGV4dCA9IE5VTEw7CisJcmV0dXJuIC0xOworfQorI2VuZGlmCisKK2ludCByZXNvbHZlX2hvc3RzID0gMDsKK2ludCByZXNvbHZlX3NlcnZpY2VzID0gMTsKK2ludCBwcmVmZXJyZWRfZmFtaWx5ID0gQUZfVU5TUEVDOworaW50IHNob3dfb3B0aW9ucyA9IDA7CitpbnQgc2hvd19kZXRhaWxzID0gMDsKK2ludCBzaG93X3VzZXJzID0gMDsKK2ludCBzaG93X21lbSA9IDA7CitpbnQgc2hvd190Y3BpbmZvID0gMDsKK2ludCBzaG93X2JwZiA9IDA7CitpbnQgc2hvd19wcm9jX2N0eCA9IDA7CitpbnQgc2hvd19zb2NrX2N0eCA9IDA7CisvKiBJZiBzaG93X3VzZXJzICYgc2hvd19wcm9jX2N0eCBvbmx5IGRvIHVzZXJfZW50X2hhc2hfYnVpbGQoKSBvbmNlICovCitpbnQgdXNlcl9lbnRfaGFzaF9idWlsZF9pbml0ID0gMDsKK2ludCBmb2xsb3dfZXZlbnRzID0gMDsKKworaW50IG5ldGlkX3dpZHRoOworaW50IHN0YXRlX3dpZHRoOworaW50IGFkZHJwX3dpZHRoOworaW50IGFkZHJfd2lkdGg7CitpbnQgc2Vydl93aWR0aDsKK2ludCBzY3JlZW5fd2lkdGg7CisKK3N0YXRpYyBjb25zdCBjaGFyICpUQ1BfUFJPVE8gPSAidGNwIjsKK3N0YXRpYyBjb25zdCBjaGFyICpVRFBfUFJPVE8gPSAidWRwIjsKK3N0YXRpYyBjb25zdCBjaGFyICpSQVdfUFJPVE8gPSAicmF3IjsKK3N0YXRpYyBjb25zdCBjaGFyICpkZ19wcm90byA9IE5VTEw7CisKK2VudW0KK3sKKwlUQ1BfREIsCisJRENDUF9EQiwKKwlVRFBfREIsCisJUkFXX0RCLAorCVVOSVhfREdfREIsCisJVU5JWF9TVF9EQiwKKwlVTklYX1NRX0RCLAorCVBBQ0tFVF9ER19EQiwKKwlQQUNLRVRfUl9EQiwKKwlORVRMSU5LX0RCLAorCU1BWF9EQgorfTsKKworI2RlZmluZSBQQUNLRVRfREJNICgoMTw8UEFDS0VUX0RHX0RCKXwoMTw8UEFDS0VUX1JfREIpKQorI2RlZmluZSBVTklYX0RCTSAoKDE8PFVOSVhfREdfREIpfCgxPDxVTklYX1NUX0RCKXwoMTw8VU5JWF9TUV9EQikpCisjZGVmaW5lIEFMTF9EQiAoKDE8PE1BWF9EQiktMSkKKyNkZWZpbmUgSU5FVF9EQk0gKCgxPDxUQ1BfREIpfCgxPDxVRFBfREIpfCgxPDxEQ0NQX0RCKXwoMTw8UkFXX0RCKSkKKworZW51bSB7CisJU1NfVU5LTk9XTiwKKwlTU19FU1RBQkxJU0hFRCwKKwlTU19TWU5fU0VOVCwKKwlTU19TWU5fUkVDViwKKwlTU19GSU5fV0FJVDEsCisJU1NfRklOX1dBSVQyLAorCVNTX1RJTUVfV0FJVCwKKwlTU19DTE9TRSwKKwlTU19DTE9TRV9XQUlULAorCVNTX0xBU1RfQUNLLAorCVNTX0xJU1RFTiwKKwlTU19DTE9TSU5HLAorCVNTX01BWAorfTsKKworI2RlZmluZSBTU19BTEwgKCgxIDw8IFNTX01BWCkgLSAxKQorI2RlZmluZSBTU19DT05OIChTU19BTEwgJiB+KCgxPDxTU19MSVNURU4pfCgxPDxTU19DTE9TRSl8KDE8PFNTX1RJTUVfV0FJVCl8KDE8PFNTX1NZTl9SRUNWKSkpCisKKyNpbmNsdWRlICJzc2ZpbHRlci5oIgorCitzdHJ1Y3QgZmlsdGVyCit7CisJaW50IGRiczsKKwlpbnQgc3RhdGVzOworCWludCBmYW1pbGllczsKKwlzdHJ1Y3Qgc3NmaWx0ZXIgKmY7CisJYm9vbCBraWxsOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWx0ZXIgZGVmYXVsdF9kYnNbTUFYX0RCXSA9IHsKKwlbVENQX0RCXSA9IHsKKwkJLnN0YXRlcyAgID0gU1NfQ09OTiwKKwkJLmZhbWlsaWVzID0gKDEgPDwgQUZfSU5FVCkgfCAoMSA8PCBBRl9JTkVUNiksCisJfSwKKwlbRENDUF9EQl0gPSB7CisJCS5zdGF0ZXMgICA9IFNTX0NPTk4sCisJCS5mYW1pbGllcyA9ICgxIDw8IEFGX0lORVQpIHwgKDEgPDwgQUZfSU5FVDYpLAorCX0sCisJW1VEUF9EQl0gPSB7CisJCS5zdGF0ZXMgICA9ICgxIDw8IFNTX0VTVEFCTElTSEVEKSwKKwkJLmZhbWlsaWVzID0gKDEgPDwgQUZfSU5FVCkgfCAoMSA8PCBBRl9JTkVUNiksCisJfSwKKwlbUkFXX0RCXSA9IHsKKwkJLnN0YXRlcyAgID0gKDEgPDwgU1NfRVNUQUJMSVNIRUQpLAorCQkuZmFtaWxpZXMgPSAoMSA8PCBBRl9JTkVUKSB8ICgxIDw8IEFGX0lORVQ2KSwKKwl9LAorCVtVTklYX0RHX0RCXSA9IHsKKwkJLnN0YXRlcyAgID0gKDEgPDwgU1NfQ0xPU0UpLAorCQkuZmFtaWxpZXMgPSAoMSA8PCBBRl9VTklYKSwKKwl9LAorCVtVTklYX1NUX0RCXSA9IHsKKwkJLnN0YXRlcyAgID0gU1NfQ09OTiwKKwkJLmZhbWlsaWVzID0gKDEgPDwgQUZfVU5JWCksCisJfSwKKwlbVU5JWF9TUV9EQl0gPSB7CisJCS5zdGF0ZXMgICA9IFNTX0NPTk4sCisJCS5mYW1pbGllcyA9ICgxIDw8IEFGX1VOSVgpLAorCX0sCisJW1BBQ0tFVF9ER19EQl0gPSB7CisJCS5zdGF0ZXMgICA9ICgxIDw8IFNTX0NMT1NFKSwKKwkJLmZhbWlsaWVzID0gKDEgPDwgQUZfUEFDS0VUKSwKKwl9LAorCVtQQUNLRVRfUl9EQl0gPSB7CisJCS5zdGF0ZXMgICA9ICgxIDw8IFNTX0NMT1NFKSwKKwkJLmZhbWlsaWVzID0gKDEgPDwgQUZfUEFDS0VUKSwKKwl9LAorCVtORVRMSU5LX0RCXSA9IHsKKwkJLnN0YXRlcyAgID0gKDEgPDwgU1NfQ0xPU0UpLAorCQkuZmFtaWxpZXMgPSAoMSA8PCBBRl9ORVRMSU5LKSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWx0ZXIgZGVmYXVsdF9hZnNbQUZfTUFYXSA9IHsKKwlbQUZfSU5FVF0gPSB7CisJCS5kYnMgICAgPSBJTkVUX0RCTSwKKwkJLnN0YXRlcyA9IFNTX0NPTk4sCisJfSwKKwlbQUZfSU5FVDZdID0geworCQkuZGJzICAgID0gSU5FVF9EQk0sCisJCS5zdGF0ZXMgPSBTU19DT05OLAorCX0sCisJW0FGX1VOSVhdID0geworCQkuZGJzICAgID0gVU5JWF9EQk0sCisJCS5zdGF0ZXMgPSBTU19DT05OLAorCX0sCisJW0FGX1BBQ0tFVF0gPSB7CisJCS5kYnMgICAgPSBQQUNLRVRfREJNLAorCQkuc3RhdGVzID0gKDEgPDwgU1NfQ0xPU0UpLAorCX0sCisJW0FGX05FVExJTktdID0geworCQkuZGJzICAgID0gKDEgPDwgTkVUTElOS19EQiksCisJCS5zdGF0ZXMgPSAoMSA8PCBTU19DTE9TRSksCisJfSwKK307CisKK3N0YXRpYyBpbnQgZG9fZGVmYXVsdCA9IDE7CitzdGF0aWMgc3RydWN0IGZpbHRlciBjdXJyZW50X2ZpbHRlcjsKKworc3RhdGljIHZvaWQgZmlsdGVyX2RiX3NldChzdHJ1Y3QgZmlsdGVyICpmLCBpbnQgZGIpCit7CisJZi0+c3RhdGVzICAgfD0gZGVmYXVsdF9kYnNbZGJdLnN0YXRlczsKKwlmLT5kYnMJICAgIHw9IDEgPDwgZGI7CisJZG9fZGVmYXVsdCAgID0gMDsKK30KKworc3RhdGljIHZvaWQgZmlsdGVyX2FmX3NldChzdHJ1Y3QgZmlsdGVyICpmLCBpbnQgYWYpCit7CisJZi0+c3RhdGVzCSAgIHw9IGRlZmF1bHRfYWZzW2FmXS5zdGF0ZXM7CisJZi0+ZmFtaWxpZXMJICAgfD0gMSA8PCBhZjsKKwlkb19kZWZhdWx0CSAgICA9IDA7CisJcHJlZmVycmVkX2ZhbWlseSAgICA9IGFmOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9hZl9nZXQoc3RydWN0IGZpbHRlciAqZiwgaW50IGFmKQoreworCXJldHVybiBmLT5mYW1pbGllcyAmICgxIDw8IGFmKTsKK30KKworc3RhdGljIHZvaWQgZmlsdGVyX2RlZmF1bHRfZGJzKHN0cnVjdCBmaWx0ZXIgKmYpCit7CisJZmlsdGVyX2RiX3NldChmLCBVRFBfREIpOworCWZpbHRlcl9kYl9zZXQoZiwgRENDUF9EQik7CisJZmlsdGVyX2RiX3NldChmLCBUQ1BfREIpOworCWZpbHRlcl9kYl9zZXQoZiwgUkFXX0RCKTsKKwlmaWx0ZXJfZGJfc2V0KGYsIFVOSVhfU1RfREIpOworCWZpbHRlcl9kYl9zZXQoZiwgVU5JWF9ER19EQik7CisJZmlsdGVyX2RiX3NldChmLCBVTklYX1NRX0RCKTsKKwlmaWx0ZXJfZGJfc2V0KGYsIFBBQ0tFVF9SX0RCKTsKKwlmaWx0ZXJfZGJfc2V0KGYsIFBBQ0tFVF9ER19EQik7CisJZmlsdGVyX2RiX3NldChmLCBORVRMSU5LX0RCKTsKK30KKworc3RhdGljIHZvaWQgZmlsdGVyX3N0YXRlc19zZXQoc3RydWN0IGZpbHRlciAqZiwgaW50IHN0YXRlcykKK3sKKwlpZiAoc3RhdGVzKQorCQlmLT5zdGF0ZXMgPSAoZi0+c3RhdGVzIHwgc3RhdGVzKSAmIHN0YXRlczsKK30KKworc3RhdGljIHZvaWQgZmlsdGVyX21lcmdlX2RlZmF1bHRzKHN0cnVjdCBmaWx0ZXIgKmYpCit7CisJaW50IGRiOworCWludCBhZjsKKworCWZvciAoZGIgPSAwOyBkYiA8IE1BWF9EQjsgZGIrKykgeworCQlpZiAoIShmLT5kYnMgJiAoMSA8PCBkYikpKQorCQkJY29udGludWU7CisKKwkJaWYgKCEoZGVmYXVsdF9kYnNbZGJdLmZhbWlsaWVzICYgZi0+ZmFtaWxpZXMpKQorCQkJZi0+ZmFtaWxpZXMgfD0gZGVmYXVsdF9kYnNbZGJdLmZhbWlsaWVzOworCX0KKwlmb3IgKGFmID0gMDsgYWYgPCBBRl9NQVg7IGFmKyspIHsKKwkJaWYgKCEoZi0+ZmFtaWxpZXMgJiAoMSA8PCBhZikpKQorCQkJY29udGludWU7CisKKwkJaWYgKCEoZGVmYXVsdF9hZnNbYWZdLmRicyAmIGYtPmRicykpCisJCQlmLT5kYnMgfD0gZGVmYXVsdF9hZnNbYWZdLmRiczsKKwl9Cit9CisKK3N0YXRpYyBGSUxFICpnZW5lcmljX3Byb2Nfb3Blbihjb25zdCBjaGFyICplbnYsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY29uc3QgY2hhciAqcCA9IGdldGVudihlbnYpOworCWNoYXIgc3RvcmVbMTI4XTsKKworCWlmICghcCkgeworCQlwID0gZ2V0ZW52KCJQUk9DX1JPT1QiKSA/IDogIi9wcm9jIjsKKwkJc25wcmludGYoc3RvcmUsIHNpemVvZihzdG9yZSktMSwgIiVzLyVzIiwgcCwgbmFtZSk7CisJCXAgPSBzdG9yZTsKKwl9CisKKwlyZXR1cm4gZm9wZW4ocCwgInIiKTsKK30KKworc3RhdGljIEZJTEUgKm5ldF90Y3Bfb3Blbih2b2lkKQoreworCXJldHVybiBnZW5lcmljX3Byb2Nfb3BlbigiUFJPQ19ORVRfVENQIiwgIm5ldC90Y3AiKTsKK30KKworc3RhdGljIEZJTEUgKm5ldF90Y3A2X29wZW4odm9pZCkKK3sKKwlyZXR1cm4gZ2VuZXJpY19wcm9jX29wZW4oIlBST0NfTkVUX1RDUDYiLCAibmV0L3RjcDYiKTsKK30KKworc3RhdGljIEZJTEUgKm5ldF91ZHBfb3Blbih2b2lkKQoreworCXJldHVybiBnZW5lcmljX3Byb2Nfb3BlbigiUFJPQ19ORVRfVURQIiwgIm5ldC91ZHAiKTsKK30KKworc3RhdGljIEZJTEUgKm5ldF91ZHA2X29wZW4odm9pZCkKK3sKKwlyZXR1cm4gZ2VuZXJpY19wcm9jX29wZW4oIlBST0NfTkVUX1VEUDYiLCAibmV0L3VkcDYiKTsKK30KKworc3RhdGljIEZJTEUgKm5ldF9yYXdfb3Blbih2b2lkKQoreworCXJldHVybiBnZW5lcmljX3Byb2Nfb3BlbigiUFJPQ19ORVRfUkFXIiwgIm5ldC9yYXciKTsKK30KKworc3RhdGljIEZJTEUgKm5ldF9yYXc2X29wZW4odm9pZCkKK3sKKwlyZXR1cm4gZ2VuZXJpY19wcm9jX29wZW4oIlBST0NfTkVUX1JBVzYiLCAibmV0L3JhdzYiKTsKK30KKworc3RhdGljIEZJTEUgKm5ldF91bml4X29wZW4odm9pZCkKK3sKKwlyZXR1cm4gZ2VuZXJpY19wcm9jX29wZW4oIlBST0NfTkVUX1VOSVgiLCAibmV0L3VuaXgiKTsKK30KKworc3RhdGljIEZJTEUgKm5ldF9wYWNrZXRfb3Blbih2b2lkKQoreworCXJldHVybiBnZW5lcmljX3Byb2Nfb3BlbigiUFJPQ19ORVRfUEFDS0VUIiwgIm5ldC9wYWNrZXQiKTsKK30KKworc3RhdGljIEZJTEUgKm5ldF9uZXRsaW5rX29wZW4odm9pZCkKK3sKKwlyZXR1cm4gZ2VuZXJpY19wcm9jX29wZW4oIlBST0NfTkVUX05FVExJTksiLCAibmV0L25ldGxpbmsiKTsKK30KKworc3RhdGljIEZJTEUgKnNsYWJpbmZvX29wZW4odm9pZCkKK3sKKwlyZXR1cm4gZ2VuZXJpY19wcm9jX29wZW4oIlBST0NfU0xBQklORk8iLCAic2xhYmluZm8iKTsKK30KKworc3RhdGljIEZJTEUgKm5ldF9zb2Nrc3RhdF9vcGVuKHZvaWQpCit7CisJcmV0dXJuIGdlbmVyaWNfcHJvY19vcGVuKCJQUk9DX05FVF9TT0NLU1RBVCIsICJuZXQvc29ja3N0YXQiKTsKK30KKworc3RhdGljIEZJTEUgKm5ldF9zb2Nrc3RhdDZfb3Blbih2b2lkKQoreworCXJldHVybiBnZW5lcmljX3Byb2Nfb3BlbigiUFJPQ19ORVRfU09DS1NUQVQ2IiwgIm5ldC9zb2Nrc3RhdDYiKTsKK30KKworc3RhdGljIEZJTEUgKm5ldF9zbm1wX29wZW4odm9pZCkKK3sKKwlyZXR1cm4gZ2VuZXJpY19wcm9jX29wZW4oIlBST0NfTkVUX1NOTVAiLCAibmV0L3NubXAiKTsKK30KKworc3RhdGljIEZJTEUgKmVwaGVtZXJhbF9wb3J0c19vcGVuKHZvaWQpCit7CisJcmV0dXJuIGdlbmVyaWNfcHJvY19vcGVuKCJQUk9DX0lQX0xPQ0FMX1BPUlRfUkFOR0UiLCAic3lzL25ldC9pcHY0L2lwX2xvY2FsX3BvcnRfcmFuZ2UiKTsKK30KKworc3RydWN0IHVzZXJfZW50IHsKKwlzdHJ1Y3QgdXNlcl9lbnQJKm5leHQ7CisJdW5zaWduZWQgaW50CWlubzsKKwlpbnQJCXBpZDsKKwlpbnQJCWZkOworCWNoYXIJCSpwcm9jZXNzOworCWNoYXIJCSpwcm9jZXNzX2N0eDsKKwljaGFyCQkqc29ja2V0X2N0eDsKK307CisKKyNkZWZpbmUgVVNFUl9FTlRfSEFTSF9TSVpFCTI1Ngorc3RydWN0IHVzZXJfZW50ICp1c2VyX2VudF9oYXNoW1VTRVJfRU5UX0hBU0hfU0laRV07CisKK3N0YXRpYyBpbnQgdXNlcl9lbnRfaGFzaGZuKHVuc2lnbmVkIGludCBpbm8pCit7CisJaW50IHZhbCA9IChpbm8gPj4gMjQpIF4gKGlubyA+PiAxNikgXiAoaW5vID4+IDgpIF4gaW5vOworCisJcmV0dXJuIHZhbCAmIChVU0VSX0VOVF9IQVNIX1NJWkUgLSAxKTsKK30KKworc3RhdGljIHZvaWQgdXNlcl9lbnRfYWRkKHVuc2lnbmVkIGludCBpbm8sIGNoYXIgKnByb2Nlc3MsCisJCQkJCWludCBwaWQsIGludCBmZCwKKwkJCQkJY2hhciAqcHJvY19jdHgsCisJCQkJCWNoYXIgKnNvY2tfY3R4KQoreworCXN0cnVjdCB1c2VyX2VudCAqcCwgKipwcDsKKworCXAgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2VyX2VudCkpOworCWlmICghcCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInNzOiBmYWlsZWQgdG8gbWFsbG9jIGJ1ZmZlclxuIik7CisJCWFib3J0KCk7CisJfQorCXAtPm5leHQgPSBOVUxMOworCXAtPmlubyA9IGlubzsKKwlwLT5waWQgPSBwaWQ7CisJcC0+ZmQgPSBmZDsKKwlwLT5wcm9jZXNzID0gc3RyZHVwKHByb2Nlc3MpOworCXAtPnByb2Nlc3NfY3R4ID0gc3RyZHVwKHByb2NfY3R4KTsKKwlwLT5zb2NrZXRfY3R4ID0gc3RyZHVwKHNvY2tfY3R4KTsKKworCXBwID0gJnVzZXJfZW50X2hhc2hbdXNlcl9lbnRfaGFzaGZuKGlubyldOworCXAtPm5leHQgPSAqcHA7CisJKnBwID0gcDsKK30KKworc3RhdGljIHZvaWQgdXNlcl9lbnRfZGVzdHJveSh2b2lkKQoreworCXN0cnVjdCB1c2VyX2VudCAqcCwgKnBfbmV4dDsKKwlpbnQgY250ID0gMDsKKworCXdoaWxlIChjbnQgIT0gVVNFUl9FTlRfSEFTSF9TSVpFKSB7CisJCXAgPSB1c2VyX2VudF9oYXNoW2NudF07CisJCXdoaWxlIChwKSB7CisJCQlmcmVlKHAtPnByb2Nlc3MpOworCQkJZnJlZShwLT5wcm9jZXNzX2N0eCk7CisJCQlmcmVlKHAtPnNvY2tldF9jdHgpOworCQkJcF9uZXh0ID0gcC0+bmV4dDsKKwkJCWZyZWUocCk7CisJCQlwID0gcF9uZXh0OworCQl9CisJCWNudCsrOworCX0KK30KKworc3RhdGljIHZvaWQgdXNlcl9lbnRfaGFzaF9idWlsZCh2b2lkKQoreworCWNvbnN0IGNoYXIgKnJvb3QgPSBnZXRlbnYoIlBST0NfUk9PVCIpID8gOiAiL3Byb2MvIjsKKwlzdHJ1Y3QgZGlyZW50ICpkOworCWNoYXIgbmFtZVsxMDI0XTsKKwlpbnQgbmFtZW9mZjsKKwlESVIgKmRpcjsKKwljaGFyICpwaWRfY29udGV4dDsKKwljaGFyICpzb2NrX2NvbnRleHQ7CisJY29uc3QgY2hhciAqbm9fY3R4ID0gInVuYXZhaWxhYmxlIjsKKworCS8qIElmIHNob3dfdXNlcnMgJiBzaG93X3Byb2NfY3R4IHNldCBvbmx5IGRvIHRoaXMgb25jZSAqLworCWlmICh1c2VyX2VudF9oYXNoX2J1aWxkX2luaXQgIT0gMCkKKwkJcmV0dXJuOworCisJdXNlcl9lbnRfaGFzaF9idWlsZF9pbml0ID0gMTsKKworCXN0cm5jcHkobmFtZSwgcm9vdCwgc2l6ZW9mKG5hbWUpLTEpOworCW5hbWVbc2l6ZW9mKG5hbWUpLTFdID0gMDsKKworCWlmIChzdHJsZW4obmFtZSkgPT0gMCB8fCBuYW1lW3N0cmxlbihuYW1lKS0xXSAhPSAnLycpCisJCXN0cmNhdChuYW1lLCAiLyIpOworCisJbmFtZW9mZiA9IHN0cmxlbihuYW1lKTsKKworCWRpciA9IG9wZW5kaXIobmFtZSk7CisJaWYgKCFkaXIpCisJCXJldHVybjsKKworCXdoaWxlICgoZCA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQlzdHJ1Y3QgZGlyZW50ICpkMTsKKwkJY2hhciBwcm9jZXNzWzE2XTsKKwkJY2hhciAqcDsKKwkJaW50IHBpZCwgcG9zOworCQlESVIgKmRpcjE7CisJCWNoYXIgY3JhcDsKKworCQlpZiAoc3NjYW5mKGQtPmRfbmFtZSwgIiVkJWMiLCAmcGlkLCAmY3JhcCkgIT0gMSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChnZXRwaWRjb24ocGlkLCAmcGlkX2NvbnRleHQpICE9IDApCisJCQlwaWRfY29udGV4dCA9IHN0cmR1cChub19jdHgpOworCisJCXNucHJpbnRmKG5hbWUgKyBuYW1lb2ZmLCBzaXplb2YobmFtZSkgLSBuYW1lb2ZmLCAiJWQvZmQvIiwgcGlkKTsKKwkJcG9zID0gc3RybGVuKG5hbWUpOworCQlpZiAoKGRpcjEgPSBvcGVuZGlyKG5hbWUpKSA9PSBOVUxMKSB7CisJCQlmcmVlKHBpZF9jb250ZXh0KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcHJvY2Vzc1swXSA9ICdcMCc7CisJCXAgPSBwcm9jZXNzOworCisJCXdoaWxlICgoZDEgPSByZWFkZGlyKGRpcjEpKSAhPSBOVUxMKSB7CisJCQljb25zdCBjaGFyICpwYXR0ZXJuID0gInNvY2tldDpbIjsKKwkJCXVuc2lnbmVkIGludCBpbm87CisJCQljaGFyIGxua1s2NF07CisJCQlpbnQgZmQ7CisJCQlzc2l6ZV90IGxpbmtfbGVuOworCQkJY2hhciB0bXBbMTAyNF07CisKKwkJCWlmIChzc2NhbmYoZDEtPmRfbmFtZSwgIiVkJWMiLCAmZmQsICZjcmFwKSAhPSAxKQorCQkJCWNvbnRpbnVlOworCisJCQlzbnByaW50ZihuYW1lK3Bvcywgc2l6ZW9mKG5hbWUpIC0gcG9zLCAiJWQiLCBmZCk7CisKKwkJCWxpbmtfbGVuID0gcmVhZGxpbmsobmFtZSwgbG5rLCBzaXplb2YobG5rKS0xKTsKKwkJCWlmIChsaW5rX2xlbiA9PSAtMSkKKwkJCQljb250aW51ZTsKKwkJCWxua1tsaW5rX2xlbl0gPSAnXDAnOworCisJCQlpZiAoc3RybmNtcChsbmssIHBhdHRlcm4sIHN0cmxlbihwYXR0ZXJuKSkpCisJCQkJY29udGludWU7CisKKwkJCXNzY2FuZihsbmssICJzb2NrZXQ6WyV1XSIsICZpbm8pOworCisJCQlzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiJXMvJWQvZmQvJXMiLAorCQkJCQlyb290LCBwaWQsIGQxLT5kX25hbWUpOworCisJCQlpZiAoZ2V0ZmlsZWNvbih0bXAsICZzb2NrX2NvbnRleHQpIDw9IDApCisJCQkJc29ja19jb250ZXh0ID0gc3RyZHVwKG5vX2N0eCk7CisKKwkJCWlmICgqcCA9PSAnXDAnKSB7CisJCQkJRklMRSAqZnA7CisKKwkJCQlzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiJXMvJWQvc3RhdCIsCisJCQkJCXJvb3QsIHBpZCk7CisJCQkJaWYgKChmcCA9IGZvcGVuKHRtcCwgInIiKSkgIT0gTlVMTCkgeworCQkJCQlpZiAoZnNjYW5mKGZwLCAiJSpkICglW14pXSkiLCBwKSA8IDEpCisJCQkJCQk7IC8qIGlnbm9yZSAqLworCQkJCQlmY2xvc2UoZnApOworCQkJCX0KKwkJCX0KKwkJCXVzZXJfZW50X2FkZChpbm8sIHAsIHBpZCwgZmQsCisJCQkJCXBpZF9jb250ZXh0LCBzb2NrX2NvbnRleHQpOworCQkJZnJlZShzb2NrX2NvbnRleHQpOworCQl9CisJCWZyZWUocGlkX2NvbnRleHQpOworCQljbG9zZWRpcihkaXIxKTsKKwl9CisJY2xvc2VkaXIoZGlyKTsKK30KKworZW51bSBlbnRyeV90eXBlcyB7CisJVVNFUlMsCisJUFJPQ19DVFgsCisJUFJPQ19TT0NLX0NUWAorfTsKKworI2RlZmluZSBFTlRSWV9CVUZfU0laRSA1MTIKK3N0YXRpYyBpbnQgZmluZF9lbnRyeSh1bnNpZ25lZCBpbm8sIGNoYXIgKipidWYsIGludCB0eXBlKQoreworCXN0cnVjdCB1c2VyX2VudCAqcDsKKwlpbnQgY250ID0gMDsKKwljaGFyICpwdHI7CisJY2hhciAqbmV3X2J1ZjsKKwlpbnQgbGVuLCBuZXdfYnVmX2xlbjsKKwlpbnQgYnVmX3VzZWQgPSAwOworCWludCBidWZfbGVuID0gMDsKKworCWlmICghaW5vKQorCQlyZXR1cm4gMDsKKworCXAgPSB1c2VyX2VudF9oYXNoW3VzZXJfZW50X2hhc2hmbihpbm8pXTsKKwlwdHIgPSAqYnVmID0gTlVMTDsKKwl3aGlsZSAocCkgeworCQlpZiAocC0+aW5vICE9IGlubykKKwkJCWdvdG8gbmV4dDsKKworCQl3aGlsZSAoMSkgeworCQkJcHRyID0gKmJ1ZiArIGJ1Zl91c2VkOworCQkJc3dpdGNoICh0eXBlKSB7CisJCQljYXNlIFVTRVJTOgorCQkJCWxlbiA9IHNucHJpbnRmKHB0ciwgYnVmX2xlbiAtIGJ1Zl91c2VkLAorCQkJCQkiKFwiJXNcIixwaWQ9JWQsZmQ9JWQpLCIsCisJCQkJCXAtPnByb2Nlc3MsIHAtPnBpZCwgcC0+ZmQpOworCQkJCWJyZWFrOworCQkJY2FzZSBQUk9DX0NUWDoKKwkJCQlsZW4gPSBzbnByaW50ZihwdHIsIGJ1Zl9sZW4gLSBidWZfdXNlZCwKKwkJCQkJIihcIiVzXCIscGlkPSVkLHByb2NfY3R4PSVzLGZkPSVkKSwiLAorCQkJCQlwLT5wcm9jZXNzLCBwLT5waWQsCisJCQkJCXAtPnByb2Nlc3NfY3R4LCBwLT5mZCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFBST0NfU09DS19DVFg6CisJCQkJbGVuID0gc25wcmludGYocHRyLCBidWZfbGVuIC0gYnVmX3VzZWQsCisJCQkJCSIoXCIlc1wiLHBpZD0lZCxwcm9jX2N0eD0lcyxmZD0lZCxzb2NrX2N0eD0lcyksIiwKKwkJCQkJcC0+cHJvY2VzcywgcC0+cGlkLAorCQkJCQlwLT5wcm9jZXNzX2N0eCwgcC0+ZmQsCisJCQkJCXAtPnNvY2tldF9jdHgpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlmcHJpbnRmKHN0ZGVyciwgInNzOiBpbnZhbGlkIHR5cGU6ICVkXG4iLCB0eXBlKTsKKwkJCQlhYm9ydCgpOworCQkJfQorCisJCQlpZiAobGVuIDwgMCB8fCBsZW4gPj0gYnVmX2xlbiAtIGJ1Zl91c2VkKSB7CisJCQkJbmV3X2J1Zl9sZW4gPSBidWZfbGVuICsgRU5UUllfQlVGX1NJWkU7CisJCQkJbmV3X2J1ZiA9IHJlYWxsb2MoKmJ1ZiwgbmV3X2J1Zl9sZW4pOworCQkJCWlmICghbmV3X2J1ZikgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgInNzOiBmYWlsZWQgdG8gbWFsbG9jIGJ1ZmZlclxuIik7CisJCQkJCWFib3J0KCk7CisJCQkJfQorCQkJCSpidWYgPSBuZXdfYnVmOworCQkJCWJ1Zl9sZW4gPSBuZXdfYnVmX2xlbjsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJYnVmX3VzZWQgKz0gbGVuOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWNudCsrOworbmV4dDoKKwkJcCA9IHAtPm5leHQ7CisJfQorCWlmIChidWZfdXNlZCkgeworCQlwdHIgPSAqYnVmICsgYnVmX3VzZWQ7CisJCXB0clstMV0gPSAnXDAnOworCX0KKwlyZXR1cm4gY250OworfQorCisvKiBHZXQgc3RhdHMgZnJvbSBzbGFiICovCisKK3N0cnVjdCBzbGFic3RhdAoreworCWludCBzb2NrczsKKwlpbnQgdGNwX3BvcnRzOworCWludCB0Y3BfdHdzOworCWludCB0Y3Bfc3luczsKKwlpbnQgc2ticzsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2xhYnN0YXQgc2xhYnN0YXQ7CisKK3N0YXRpYyBjb25zdCBjaGFyICpzbGFic3RhdF9pZHNbXSA9Cit7CisJInNvY2siLAorCSJ0Y3BfYmluZF9idWNrZXQiLAorCSJ0Y3BfdHdfYnVja2V0IiwKKwkidGNwX29wZW5fcmVxdWVzdCIsCisJInNrYnVmZl9oZWFkX2NhY2hlIiwKK307CisKK3N0YXRpYyBpbnQgZ2V0X3NsYWJzdGF0KHN0cnVjdCBzbGFic3RhdCAqcykKK3sKKwljaGFyIGJ1ZlsyNTZdOworCUZJTEUgKmZwOworCWludCBjbnQ7CisJc3RhdGljIGludCBzbGFic3RhdF92YWxpZDsKKworCWlmIChzbGFic3RhdF92YWxpZCkKKwkJcmV0dXJuIDA7CisKKwltZW1zZXQocywgMCwgc2l6ZW9mKCpzKSk7CisKKwlmcCA9IHNsYWJpbmZvX29wZW4oKTsKKwlpZiAoIWZwKQorCQlyZXR1cm4gLTE7CisKKwljbnQgPSBzaXplb2YoKnMpL3NpemVvZihpbnQpOworCisJaWYgKCFmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkpIHsKKwkJZmNsb3NlKGZwKTsKKwkJcmV0dXJuIC0xOworCX0KKwl3aGlsZShmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkgIT0gTlVMTCkgeworCQlpbnQgaTsKKwkJZm9yIChpPTA7IGk8c2l6ZW9mKHNsYWJzdGF0X2lkcykvc2l6ZW9mKHNsYWJzdGF0X2lkc1swXSk7IGkrKykgeworCQkJaWYgKG1lbWNtcChidWYsIHNsYWJzdGF0X2lkc1tpXSwgc3RybGVuKHNsYWJzdGF0X2lkc1tpXSkpID09IDApIHsKKwkJCQlzc2NhbmYoYnVmLCAiJSpzJWQiLCAoKGludCAqKXMpICsgaSk7CisJCQkJY250LS07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGNudCA8PSAwKQorCQkJYnJlYWs7CisJfQorCisJc2xhYnN0YXRfdmFsaWQgPSAxOworCisJZmNsb3NlKGZwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBjb29raWVfc2tfZ2V0KGNvbnN0IHVpbnQzMl90ICpjb29raWUpCit7CisJcmV0dXJuICgoKHVuc2lnbmVkIGxvbmcgbG9uZyljb29raWVbMV0gPDwgMzEpIDw8IDEpIHwgY29va2llWzBdOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqc3N0YXRlX25hbWVbXSA9IHsKKwkiVU5LTk9XTiIsCisJW1NTX0VTVEFCTElTSEVEXSA9ICJFU1RBQiIsCisJW1NTX1NZTl9TRU5UXSA9ICJTWU4tU0VOVCIsCisJW1NTX1NZTl9SRUNWXSA9ICJTWU4tUkVDViIsCisJW1NTX0ZJTl9XQUlUMV0gPSAiRklOLVdBSVQtMSIsCisJW1NTX0ZJTl9XQUlUMl0gPSAiRklOLVdBSVQtMiIsCisJW1NTX1RJTUVfV0FJVF0gPSAiVElNRS1XQUlUIiwKKwlbU1NfQ0xPU0VdID0gIlVOQ09OTiIsCisJW1NTX0NMT1NFX1dBSVRdID0gIkNMT1NFLVdBSVQiLAorCVtTU19MQVNUX0FDS10gPSAiTEFTVC1BQ0siLAorCVtTU19MSVNURU5dID0gCSJMSVNURU4iLAorCVtTU19DTE9TSU5HXSA9ICJDTE9TSU5HIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpzc3RhdGVfbmFtZWxbXSA9IHsKKwkiVU5LTk9XTiIsCisJW1NTX0VTVEFCTElTSEVEXSA9ICJlc3RhYmxpc2hlZCIsCisJW1NTX1NZTl9TRU5UXSA9ICJzeW4tc2VudCIsCisJW1NTX1NZTl9SRUNWXSA9ICJzeW4tcmVjdiIsCisJW1NTX0ZJTl9XQUlUMV0gPSAiZmluLXdhaXQtMSIsCisJW1NTX0ZJTl9XQUlUMl0gPSAiZmluLXdhaXQtMiIsCisJW1NTX1RJTUVfV0FJVF0gPSAidGltZS13YWl0IiwKKwlbU1NfQ0xPU0VdID0gInVuY29ubmVjdGVkIiwKKwlbU1NfQ0xPU0VfV0FJVF0gPSAiY2xvc2Utd2FpdCIsCisJW1NTX0xBU1RfQUNLXSA9ICJsYXN0LWFjayIsCisJW1NTX0xJU1RFTl0gPSAJImxpc3RlbmluZyIsCisJW1NTX0NMT1NJTkddID0gImNsb3NpbmciLAorfTsKKworc3RydWN0IHNvY2tzdGF0Cit7CisJc3RydWN0IHNvY2tzdGF0CSAgICpuZXh0OworCXVuc2lnbmVkIGludAkgICAgdHlwZTsKKwl1aW50MTZfdAkgICAgcHJvdDsKKwlpbmV0X3ByZWZpeAkgICAgbG9jYWw7CisJaW5ldF9wcmVmaXgJICAgIHJlbW90ZTsKKwlpbnQJCSAgICBscG9ydDsKKwlpbnQJCSAgICBycG9ydDsKKwlpbnQJCSAgICBzdGF0ZTsKKwlpbnQJCSAgICBycSwgd3E7CisJdW5zaWduZWQJICAgIGlubzsKKwl1bnNpZ25lZAkgICAgdWlkOworCWludAkJICAgIHJlZmNudDsKKwl1bnNpZ25lZCBpbnQJICAgIGlmYWNlOworCXVuc2lnbmVkIGxvbmcgbG9uZyAgc2s7CisJY2hhciAqbmFtZTsKKwljaGFyICpwZWVyX25hbWU7Cit9OworCitzdHJ1Y3QgZGN0Y3BzdGF0Cit7CisJdW5zaWduZWQgaW50CWNlX3N0YXRlOworCXVuc2lnbmVkIGludAlhbHBoYTsKKwl1bnNpZ25lZCBpbnQJYWJfZWNuOworCXVuc2lnbmVkIGludAlhYl90b3Q7CisJYm9vbAkJZW5hYmxlZDsKK307CisKK3N0cnVjdCB0Y3BzdGF0Cit7CisJc3RydWN0IHNvY2tzdGF0CSAgICBzczsKKwlpbnQJCSAgICB0aW1lcjsKKwlpbnQJCSAgICB0aW1lb3V0OworCWludAkJICAgIHByb2JlczsKKwljaGFyCQkgICAgY29uZ19hbGdbMTZdOworCWRvdWJsZQkJICAgIHJ0bywgYXRvLCBydHQsIHJ0dHZhcjsKKwlpbnQJCSAgICBxYWNrLCBjd25kLCBzc3RocmVzaCwgYmFja29mZjsKKwlkb3VibGUJCSAgICBzZW5kX2JwczsKKwlpbnQJCSAgICBzbmRfd3NjYWxlOworCWludAkJICAgIHJjdl93c2NhbGU7CisJaW50CQkgICAgbXNzOworCXVuc2lnbmVkIGludAkgICAgbGFzdHNuZDsKKwl1bnNpZ25lZCBpbnQJICAgIGxhc3RyY3Y7CisJdW5zaWduZWQgaW50CSAgICBsYXN0YWNrOworCWRvdWJsZQkJICAgIHBhY2luZ19yYXRlOworCWRvdWJsZQkJICAgIHBhY2luZ19yYXRlX21heDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgIGJ5dGVzX2Fja2VkOworCXVuc2lnbmVkIGxvbmcgbG9uZyAgYnl0ZXNfcmVjZWl2ZWQ7CisJdW5zaWduZWQgaW50CSAgICBzZWdzX291dDsKKwl1bnNpZ25lZCBpbnQJICAgIHNlZ3NfaW47CisJdW5zaWduZWQgaW50CSAgICB1bmFja2VkOworCXVuc2lnbmVkIGludAkgICAgcmV0cmFuczsKKwl1bnNpZ25lZCBpbnQJICAgIHJldHJhbnNfdG90YWw7CisJdW5zaWduZWQgaW50CSAgICBsb3N0OworCXVuc2lnbmVkIGludAkgICAgc2Fja2VkOworCXVuc2lnbmVkIGludAkgICAgZmFja2V0czsKKwl1bnNpZ25lZCBpbnQJICAgIHJlb3JkZXJpbmc7CisJZG91YmxlCQkgICAgcmN2X3J0dDsKKwlpbnQJCSAgICByY3Zfc3BhY2U7CisJYm9vbAkJICAgIGhhc190c19vcHQ7CisJYm9vbAkJICAgIGhhc19zYWNrX29wdDsKKwlib29sCQkgICAgaGFzX2Vjbl9vcHQ7CisJYm9vbAkJICAgIGhhc19lY25zZWVuX29wdDsKKwlib29sCQkgICAgaGFzX2Zhc3RvcGVuX29wdDsKKwlib29sCQkgICAgaGFzX3dzY2FsZV9vcHQ7CisJc3RydWN0IGRjdGNwc3RhdCAgICAqZGN0Y3A7Cit9OworCitzdGF0aWMgdm9pZCBzb2NrX3N0YXRlX3ByaW50KHN0cnVjdCBzb2Nrc3RhdCAqcywgY29uc3QgY2hhciAqc29ja19uYW1lKQoreworCWlmIChuZXRpZF93aWR0aCkKKwkJcHJpbnRmKCIlLSpzICIsIG5ldGlkX3dpZHRoLCBzb2NrX25hbWUpOworCWlmIChzdGF0ZV93aWR0aCkKKwkJcHJpbnRmKCIlLSpzICIsIHN0YXRlX3dpZHRoLCBzc3RhdGVfbmFtZVtzLT5zdGF0ZV0pOworCisJcHJpbnRmKCIlLTZkICUtNmQgIiwgcy0+cnEsIHMtPndxKTsKK30KKworc3RhdGljIHZvaWQgc29ja19kZXRhaWxzX3ByaW50KHN0cnVjdCBzb2Nrc3RhdCAqcykKK3sKKwlpZiAocy0+dWlkKQorCQlwcmludGYoIiB1aWQ6JXUiLCBzLT51aWQpOworCisJcHJpbnRmKCIgaW5vOiV1Iiwgcy0+aW5vKTsKKwlwcmludGYoIiBzazolbGx4Iiwgcy0+c2spOworfQorCitzdGF0aWMgdm9pZCBzb2NrX2FkZHJfcHJpbnRfd2lkdGgoaW50IGFkZHJfbGVuLCBjb25zdCBjaGFyICphZGRyLCBjaGFyICpkZWxpbSwKKwkJaW50IHBvcnRfbGVuLCBjb25zdCBjaGFyICpwb3J0LCBjb25zdCBjaGFyICppZm5hbWUpCit7CisJaWYgKGlmbmFtZSkgeworCQlwcmludGYoIiUqcyUlJXMlcyUtKnMgIiwgYWRkcl9sZW4sIGFkZHIsIGlmbmFtZSwgZGVsaW0sCisJCQkJcG9ydF9sZW4sIHBvcnQpOworCX0KKwllbHNlIHsKKwkJcHJpbnRmKCIlKnMlcyUtKnMgIiwgYWRkcl9sZW4sIGFkZHIsIGRlbGltLCBwb3J0X2xlbiwgcG9ydCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzb2NrX2FkZHJfcHJpbnQoY29uc3QgY2hhciAqYWRkciwgY2hhciAqZGVsaW0sIGNvbnN0IGNoYXIgKnBvcnQsCisJCWNvbnN0IGNoYXIgKmlmbmFtZSkKK3sKKwlzb2NrX2FkZHJfcHJpbnRfd2lkdGgoYWRkcl93aWR0aCwgYWRkciwgZGVsaW0sIHNlcnZfd2lkdGgsIHBvcnQsIGlmbmFtZSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICp0bXJfbmFtZVtdID0geworCSJvZmYiLAorCSJvbiIsCisJImtlZXBhbGl2ZSIsCisJInRpbWV3YWl0IiwKKwkicGVyc2lzdCIsCisJInVua25vd24iCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqcHJpbnRfbXNfdGltZXIoaW50IHRpbWVvdXQpCit7CisJc3RhdGljIGNoYXIgYnVmWzY0XTsKKwlpbnQgc2VjcywgbXNlY3MsIG1pbnV0ZXM7CisJaWYgKHRpbWVvdXQgPCAwKQorCQl0aW1lb3V0ID0gMDsKKwlzZWNzID0gdGltZW91dC8xMDAwOworCW1pbnV0ZXMgPSBzZWNzLzYwOworCXNlY3MgPSBzZWNzJTYwOworCW1zZWNzID0gdGltZW91dCUxMDAwOworCWJ1ZlswXSA9IDA7CisJaWYgKG1pbnV0ZXMpIHsKKwkJbXNlY3MgPSAwOworCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLTE2LCAiJWRtaW4iLCBtaW51dGVzKTsKKwkJaWYgKG1pbnV0ZXMgPiA5KQorCQkJc2VjcyA9IDA7CisJfQorCWlmIChzZWNzKSB7CisJCWlmIChzZWNzID4gOSkKKwkJCW1zZWNzID0gMDsKKwkJc3ByaW50ZihidWYrc3RybGVuKGJ1ZiksICIlZCVzIiwgc2VjcywgbXNlY3MgPyAiLiIgOiAic2VjIik7CisJfQorCWlmIChtc2VjcykKKwkJc3ByaW50ZihidWYrc3RybGVuKGJ1ZiksICIlMDNkbXMiLCBtc2Vjcyk7CisJcmV0dXJuIGJ1ZjsKK30KKworc3RydWN0IHNjYWNoZSB7CisJc3RydWN0IHNjYWNoZSAqbmV4dDsKKwlpbnQgcG9ydDsKKwljaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKnByb3RvOworfTsKKworc3RydWN0IHNjYWNoZSAqcmxpc3Q7CisKK3N0YXRpYyB2b2lkIGluaXRfc2VydmljZV9yZXNvbHZlcih2b2lkKQoreworCWNoYXIgYnVmWzEyOF07CisJRklMRSAqZnAgPSBwb3BlbigiL3Vzci9zYmluL3JwY2luZm8gLXAgMj4vZGV2L251bGwiLCAiciIpOworCisJaWYgKCFmcCkKKwkJcmV0dXJuOworCisJaWYgKCFmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkpIHsKKwkJcGNsb3NlKGZwKTsKKwkJcmV0dXJuOworCX0KKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApICE9IE5VTEwpIHsKKwkJdW5zaWduZWQgaW50IHByb2duLCBwb3J0OworCQljaGFyIHByb3RvWzEyOF0sIHByb2dbMTI4XSA9ICJycGMuIjsKKwkJc3RydWN0IHNjYWNoZSAqYzsKKworCQlpZiAoc3NjYW5mKGJ1ZiwgIiV1ICUqZCAlcyAldSAlcyIsCisJCSAgICAgICAgICAgJnByb2duLCBwcm90bywgJnBvcnQsIHByb2crNCkgIT0gNCkKKwkJCWNvbnRpbnVlOworCisJCWlmICghKGMgPSBtYWxsb2Moc2l6ZW9mKCpjKSkpKQorCQkJY29udGludWU7CisKKwkJYy0+cG9ydCA9IHBvcnQ7CisJCWMtPm5hbWUgPSBzdHJkdXAocHJvZyk7CisJCWlmIChzdHJjbXAocHJvdG8sIFRDUF9QUk9UTykgPT0gMCkKKwkJCWMtPnByb3RvID0gVENQX1BST1RPOworCQllbHNlIGlmIChzdHJjbXAocHJvdG8sIFVEUF9QUk9UTykgPT0gMCkKKwkJCWMtPnByb3RvID0gVURQX1BST1RPOworCQllbHNlCisJCQljLT5wcm90byA9IE5VTEw7CisJCWMtPm5leHQgPSBybGlzdDsKKwkJcmxpc3QgPSBjOworCX0KKwlwY2xvc2UoZnApOworfQorCisvKiBFdmVuIGRvIG5vdCB0cnkgZGVmYXVsdCBsaW51eCBlcGhlbWVyYWwgcG9ydCByYW5nZXM6CisgKiBkZWZhdWx0IC9ldGMvc2VydmljZXMgY29udGFpbnMgc28gbXVjaCBvZiB1c2VsZXNzIGNyYXAKKyAqIHdvdWxkYmUgImFsbG9jYXRlZCIgdG8gdGhpcyBhcmVhIHRoYXQgcmVzb2x1dGlvbgorICogaXMgcmVhbGx5IGhhcm1mdWwuIEkgc2hydWcgZWFjaCB0aW1lIHdoZW4gc2VlaW5nCisgKiAic29ja3MiIG9yICJjZmluZ2VyIiBpbiBkdW1wcy4KKyAqLworc3RhdGljIGludCBpc19lcGhlbWVyYWwoaW50IHBvcnQpCit7CisJc3RhdGljIGludCBtaW4gPSAwLCBtYXggPSAwOworCisJaWYgKCFtaW4pIHsKKwkJRklMRSAqZiA9IGVwaGVtZXJhbF9wb3J0c19vcGVuKCk7CisJCWlmICghZiB8fCBmc2NhbmYoZiwgIiVkICVkIiwgJm1pbiwgJm1heCkgPCAyKSB7CisJCQltaW4gPSAxMDI0OworCQkJbWF4ID0gNDk5OTsKKwkJfQorCQlpZiAoZikKKwkJCWZjbG9zZShmKTsKKwl9CisJcmV0dXJuIHBvcnQgPj0gbWluICYmIHBvcnQgPD0gbWF4OworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICpfX3Jlc29sdmVfc2VydmljZShpbnQgcG9ydCkKK3sKKwlzdHJ1Y3Qgc2NhY2hlICpjOworCisJZm9yIChjID0gcmxpc3Q7IGM7IGMgPSBjLT5uZXh0KSB7CisJCWlmIChjLT5wb3J0ID09IHBvcnQgJiYgYy0+cHJvdG8gPT0gZGdfcHJvdG8pCisJCQlyZXR1cm4gYy0+bmFtZTsKKwl9CisKKwlpZiAoIWlzX2VwaGVtZXJhbChwb3J0KSkgeworCQlzdGF0aWMgaW50IG5vdGZpcnN0OworCQlzdHJ1Y3Qgc2VydmVudCAqc2U7CisJCWlmICghbm90Zmlyc3QpIHsKKwkJCXNldHNlcnZlbnQoMSk7CisJCQlub3RmaXJzdCA9IDE7CisJCX0KKwkJc2UgPSBnZXRzZXJ2Ynlwb3J0KGh0b25zKHBvcnQpLCBkZ19wcm90byk7CisJCWlmIChzZSkKKwkJCXJldHVybiBzZS0+c19uYW1lOworCX0KKworCXJldHVybiBOVUxMOworfQorCisjZGVmaW5lIFNDQUNIRV9CVUNLRVRTIDEwMjQKK3N0YXRpYyBzdHJ1Y3Qgc2NhY2hlICpjYWNoZV9odGFiW1NDQUNIRV9CVUNLRVRTXTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnJlc29sdmVfc2VydmljZShpbnQgcG9ydCkKK3sKKwlzdGF0aWMgY2hhciBidWZbMTI4XTsKKwlzdHJ1Y3Qgc2NhY2hlICpjOworCWNvbnN0IGNoYXIgKnJlczsKKwlpbnQgaGFzaDsKKworCWlmIChwb3J0ID09IDApIHsKKwkJYnVmWzBdID0gJyonOworCQlidWZbMV0gPSAwOworCQlyZXR1cm4gYnVmOworCX0KKworCWlmICghcmVzb2x2ZV9zZXJ2aWNlcykKKwkJZ290byBkb19udW1lcmljOworCisJaWYgKGRnX3Byb3RvID09IFJBV19QUk9UTykKKwkJcmV0dXJuIGluZXRfcHJvdG9fbjJhKHBvcnQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCisKKwloYXNoID0gKHBvcnReKCgodW5zaWduZWQgbG9uZylkZ19wcm90byk+PjIpKSAlIFNDQUNIRV9CVUNLRVRTOworCisJZm9yIChjID0gY2FjaGVfaHRhYltoYXNoXTsgYzsgYyA9IGMtPm5leHQpIHsKKwkJaWYgKGMtPnBvcnQgPT0gcG9ydCAmJiBjLT5wcm90byA9PSBkZ19wcm90bykKKwkJCWdvdG8gZG9fY2FjaGU7CisJfQorCisJYyA9IG1hbGxvYyhzaXplb2YoKmMpKTsKKwlpZiAoIWMpCisJCWdvdG8gZG9fbnVtZXJpYzsKKwlyZXMgPSBfX3Jlc29sdmVfc2VydmljZShwb3J0KTsKKwljLT5wb3J0ID0gcG9ydDsKKwljLT5uYW1lID0gcmVzID8gc3RyZHVwKHJlcykgOiBOVUxMOworCWMtPnByb3RvID0gZGdfcHJvdG87CisJYy0+bmV4dCA9IGNhY2hlX2h0YWJbaGFzaF07CisJY2FjaGVfaHRhYltoYXNoXSA9IGM7CisKK2RvX2NhY2hlOgorCWlmIChjLT5uYW1lKQorCQlyZXR1cm4gYy0+bmFtZTsKKworZG9fbnVtZXJpYzoKKwlzcHJpbnRmKGJ1ZiwgIiV1IiwgcG9ydCk7CisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIHZvaWQgaW5ldF9hZGRyX3ByaW50KGNvbnN0IGluZXRfcHJlZml4ICphLCBpbnQgcG9ydCwgdW5zaWduZWQgaW50IGlmaW5kZXgpCit7CisJY2hhciBidWZbMTAyNF07CisJY29uc3QgY2hhciAqYXAgPSBidWY7CisJaW50IGVzdF9sZW4gPSBhZGRyX3dpZHRoOworCWNvbnN0IGNoYXIgKmlmbmFtZSA9IE5VTEw7CisKKwlpZiAoYS0+ZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJaWYgKGEtPmRhdGFbMF0gPT0gMCkgeworCQkJYnVmWzBdID0gJyonOworCQkJYnVmWzFdID0gMDsKKwkJfSBlbHNlIHsKKwkJCWFwID0gZm9ybWF0X2hvc3QoQUZfSU5FVCwgNCwgYS0+ZGF0YSwgYnVmLCBzaXplb2YoYnVmKSk7CisJCX0KKwl9IGVsc2UgeworCQlhcCA9IGZvcm1hdF9ob3N0KGEtPmZhbWlseSwgMTYsIGEtPmRhdGEsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCQllc3RfbGVuID0gc3RybGVuKGFwKTsKKwkJaWYgKGVzdF9sZW4gPD0gYWRkcl93aWR0aCkKKwkJCWVzdF9sZW4gPSBhZGRyX3dpZHRoOworCQllbHNlCisJCQllc3RfbGVuID0gYWRkcl93aWR0aCArICgoZXN0X2xlbi1hZGRyX3dpZHRoKzMpLzQpKjQ7CisJfQorCisJaWYgKGlmaW5kZXgpIHsKKwkJaWZuYW1lICAgPSBsbF9pbmRleF90b19uYW1lKGlmaW5kZXgpOworCQllc3RfbGVuIC09IHN0cmxlbihpZm5hbWUpICsgMTsgIC8qICsxIGZvciBwZXJjZW50IGNoYXIgKi8KKwkJaWYgKGVzdF9sZW4gPCAwKQorCQkJZXN0X2xlbiA9IDA7CisJfQorCisJc29ja19hZGRyX3ByaW50X3dpZHRoKGVzdF9sZW4sIGFwLCAiOiIsIHNlcnZfd2lkdGgsIHJlc29sdmVfc2VydmljZShwb3J0KSwKKwkJCWlmbmFtZSk7Cit9CisKK3N0cnVjdCBhYWZpbHRlcgoreworCWluZXRfcHJlZml4CWFkZHI7CisJaW50CQlwb3J0OworCXN0cnVjdCBhYWZpbHRlciAqbmV4dDsKK307CisKK3N0YXRpYyBpbnQgaW5ldDJfYWRkcl9tYXRjaChjb25zdCBpbmV0X3ByZWZpeCAqYSwgY29uc3QgaW5ldF9wcmVmaXggKnAsCisJCQkgICAgaW50IHBsZW4pCit7CisJaWYgKCFpbmV0X2FkZHJfbWF0Y2goYSwgcCwgcGxlbikpCisJCXJldHVybiAwOworCisJLyogQ3Vyc2VkICJ2NCBtYXBwZWQiIGFkZHJlc3NlczogdjQgbWFwcGVkIHNvY2tldCBtYXRjaGVzCisJICogcHVyZSBJUHY0IHJ1bGUsIGJ1dCB2NC1tYXBwZWQgcnVsZSBzZWxlY3RzIG9ubHkgdjQtbWFwcGVkCisJICogc29ja2V0cy4gRmFpcj8gKi8KKwlpZiAocC0+ZmFtaWx5ID09IEFGX0lORVQgJiYgYS0+ZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCWlmIChhLT5kYXRhWzBdID09IDAgJiYgYS0+ZGF0YVsxXSA9PSAwICYmCisJCSAgICBhLT5kYXRhWzJdID09IGh0b25sKDB4ZmZmZikpIHsKKwkJCWluZXRfcHJlZml4IHRtcCA9ICphOworCQkJdG1wLmRhdGFbMF0gPSBhLT5kYXRhWzNdOworCQkJcmV0dXJuIGluZXRfYWRkcl9tYXRjaCgmdG1wLCBwLCBwbGVuKTsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB1bml4X21hdGNoKGNvbnN0IGluZXRfcHJlZml4ICphLCBjb25zdCBpbmV0X3ByZWZpeCAqcCkKK3sKKwljaGFyICphZGRyLCAqcGF0dGVybjsKKwltZW1jcHkoJmFkZHIsIGEtPmRhdGEsIHNpemVvZihhZGRyKSk7CisJbWVtY3B5KCZwYXR0ZXJuLCBwLT5kYXRhLCBzaXplb2YocGF0dGVybikpOworCWlmIChwYXR0ZXJuID09IE5VTEwpCisJCXJldHVybiAxOworCWlmIChhZGRyID09IE5VTEwpCisJCWFkZHIgPSAiIjsKKwlyZXR1cm4gIWZubWF0Y2gocGF0dGVybiwgYWRkciwgMCk7Cit9CisKK3N0YXRpYyBpbnQgcnVuX3NzZmlsdGVyKHN0cnVjdCBzc2ZpbHRlciAqZiwgc3RydWN0IHNvY2tzdGF0ICpzKQoreworCXN3aXRjaCAoZi0+dHlwZSkgeworCQljYXNlIFNTRl9TX0FVVE86CisJeworCQlpZiAocy0+bG9jYWwuZmFtaWx5ID09IEFGX1VOSVgpIHsKKwkJCWNoYXIgKnA7CisJCQltZW1jcHkoJnAsIHMtPmxvY2FsLmRhdGEsIHNpemVvZihwKSk7CisJCQlyZXR1cm4gcCA9PSBOVUxMIHx8IChwWzBdID09ICdAJyAmJiBzdHJsZW4ocCkgPT0gNiAmJgorCQkJCQkgICAgIHN0cnNwbihwKzEsICIwMTIzNDU2Nzg5YWJjZGVmIikgPT0gNSk7CisJCX0KKwkJaWYgKHMtPmxvY2FsLmZhbWlseSA9PSBBRl9QQUNLRVQpCisJCQlyZXR1cm4gcy0+bHBvcnQgPT0gMCAmJiBzLT5sb2NhbC5kYXRhWzBdID09IDA7CisJCWlmIChzLT5sb2NhbC5mYW1pbHkgPT0gQUZfTkVUTElOSykKKwkJCXJldHVybiBzLT5scG9ydCA8IDA7CisKKwkJcmV0dXJuIGlzX2VwaGVtZXJhbChzLT5scG9ydCk7CisJfQorCQljYXNlIFNTRl9EQ09ORDoKKwl7CisJCXN0cnVjdCBhYWZpbHRlciAqYSA9ICh2b2lkKilmLT5wcmVkOworCQlpZiAoYS0+YWRkci5mYW1pbHkgPT0gQUZfVU5JWCkKKwkJCXJldHVybiB1bml4X21hdGNoKCZzLT5yZW1vdGUsICZhLT5hZGRyKTsKKwkJaWYgKGEtPnBvcnQgIT0gLTEgJiYgYS0+cG9ydCAhPSBzLT5ycG9ydCkKKwkJCXJldHVybiAwOworCQlpZiAoYS0+YWRkci5iaXRsZW4pIHsKKwkJCWRvIHsKKwkJCQlpZiAoIWluZXQyX2FkZHJfbWF0Y2goJnMtPnJlbW90ZSwgJmEtPmFkZHIsIGEtPmFkZHIuYml0bGVuKSkKKwkJCQkJcmV0dXJuIDE7CisJCQl9IHdoaWxlICgoYSA9IGEtPm5leHQpICE9IE5VTEwpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCQljYXNlIFNTRl9TQ09ORDoKKwl7CisJCXN0cnVjdCBhYWZpbHRlciAqYSA9ICh2b2lkKilmLT5wcmVkOworCQlpZiAoYS0+YWRkci5mYW1pbHkgPT0gQUZfVU5JWCkKKwkJCXJldHVybiB1bml4X21hdGNoKCZzLT5sb2NhbCwgJmEtPmFkZHIpOworCQlpZiAoYS0+cG9ydCAhPSAtMSAmJiBhLT5wb3J0ICE9IHMtPmxwb3J0KQorCQkJcmV0dXJuIDA7CisJCWlmIChhLT5hZGRyLmJpdGxlbikgeworCQkJZG8geworCQkJCWlmICghaW5ldDJfYWRkcl9tYXRjaCgmcy0+bG9jYWwsICZhLT5hZGRyLCBhLT5hZGRyLmJpdGxlbikpCisJCQkJCXJldHVybiAxOworCQkJfSB3aGlsZSAoKGEgPSBhLT5uZXh0KSAhPSBOVUxMKTsKKwkJCXJldHVybiAwOworCQl9CisJCXJldHVybiAxOworCX0KKwkJY2FzZSBTU0ZfRF9HRToKKwl7CisJCXN0cnVjdCBhYWZpbHRlciAqYSA9ICh2b2lkKilmLT5wcmVkOworCQlyZXR1cm4gcy0+cnBvcnQgPj0gYS0+cG9ydDsKKwl9CisJCWNhc2UgU1NGX0RfTEU6CisJeworCQlzdHJ1Y3QgYWFmaWx0ZXIgKmEgPSAodm9pZCopZi0+cHJlZDsKKwkJcmV0dXJuIHMtPnJwb3J0IDw9IGEtPnBvcnQ7CisJfQorCQljYXNlIFNTRl9TX0dFOgorCXsKKwkJc3RydWN0IGFhZmlsdGVyICphID0gKHZvaWQqKWYtPnByZWQ7CisJCXJldHVybiBzLT5scG9ydCA+PSBhLT5wb3J0OworCX0KKwkJY2FzZSBTU0ZfU19MRToKKwl7CisJCXN0cnVjdCBhYWZpbHRlciAqYSA9ICh2b2lkKilmLT5wcmVkOworCQlyZXR1cm4gcy0+bHBvcnQgPD0gYS0+cG9ydDsKKwl9CisKKwkJLyogWXVwLiBJdCBpcyByZWN1cnNpb24uIFNvcnJ5LiAqLworCQljYXNlIFNTRl9BTkQ6CisJCXJldHVybiBydW5fc3NmaWx0ZXIoZi0+cHJlZCwgcykgJiYgcnVuX3NzZmlsdGVyKGYtPnBvc3QsIHMpOworCQljYXNlIFNTRl9PUjoKKwkJcmV0dXJuIHJ1bl9zc2ZpbHRlcihmLT5wcmVkLCBzKSB8fCBydW5fc3NmaWx0ZXIoZi0+cG9zdCwgcyk7CisJCWNhc2UgU1NGX05PVDoKKwkJcmV0dXJuICFydW5fc3NmaWx0ZXIoZi0+cHJlZCwgcyk7CisJCWRlZmF1bHQ6CisJCWFib3J0KCk7CisJfQorfQorCisvKiBSZWxvY2F0ZSBleHRlcm5hbCBqdW1wcyBieSByZWxvYy4gKi8KK3N0YXRpYyB2b2lkIHNzZmlsdGVyX3BhdGNoKGNoYXIgKmEsIGludCBsZW4sIGludCByZWxvYykKK3sKKwl3aGlsZSAobGVuID4gMCkgeworCQlzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wICpvcCA9IChzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wKilhOworCQlpZiAob3AtPm5vID09IGxlbis0KQorCQkJb3AtPm5vICs9IHJlbG9jOworCQlsZW4gLT0gb3AtPnllczsKKwkJYSArPSBvcC0+eWVzOworCX0KKwlpZiAobGVuIDwgMCkKKwkJYWJvcnQoKTsKK30KKworc3RhdGljIGludCBzc2ZpbHRlcl9ieXRlY29tcGlsZShzdHJ1Y3Qgc3NmaWx0ZXIgKmYsIGNoYXIgKipieXRlY29kZSkKK3sKKwlzd2l0Y2ggKGYtPnR5cGUpIHsKKwkJY2FzZSBTU0ZfU19BVVRPOgorCXsKKwkJaWYgKCEoKmJ5dGVjb2RlPW1hbGxvYyg0KSkpIGFib3J0KCk7CisJCSgoc3RydWN0IGluZXRfZGlhZ19iY19vcCopKmJ5dGVjb2RlKVswXSA9IChzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wKXsgSU5FVF9ESUFHX0JDX0FVVE8sIDQsIDggfTsKKwkJcmV0dXJuIDQ7CisJfQorCQljYXNlIFNTRl9EQ09ORDoKKwkJY2FzZSBTU0ZfU0NPTkQ6CisJeworCQlzdHJ1Y3QgYWFmaWx0ZXIgKmEgPSAodm9pZCopZi0+cHJlZDsKKwkJc3RydWN0IGFhZmlsdGVyICpiOworCQljaGFyICpwdHI7CisJCWludCAgY29kZSA9IChmLT50eXBlID09IFNTRl9EQ09ORCA/IElORVRfRElBR19CQ19EX0NPTkQgOiBJTkVUX0RJQUdfQkNfU19DT05EKTsKKwkJaW50IGxlbiA9IDA7CisKKwkJZm9yIChiPWE7IGI7IGI9Yi0+bmV4dCkgeworCQkJbGVuICs9IDQgKyBzaXplb2Yoc3RydWN0IGluZXRfZGlhZ19ob3N0Y29uZCk7CisJCQlpZiAoYS0+YWRkci5mYW1pbHkgPT0gQUZfSU5FVDYpCisJCQkJbGVuICs9IDE2OworCQkJZWxzZQorCQkJCWxlbiArPSA0OworCQkJaWYgKGItPm5leHQpCisJCQkJbGVuICs9IDQ7CisJCX0KKwkJaWYgKCEocHRyID0gbWFsbG9jKGxlbikpKSBhYm9ydCgpOworCQkqYnl0ZWNvZGUgPSBwdHI7CisJCWZvciAoYj1hOyBiOyBiPWItPm5leHQpIHsKKwkJCXN0cnVjdCBpbmV0X2RpYWdfYmNfb3AgKm9wID0gKHN0cnVjdCBpbmV0X2RpYWdfYmNfb3AgKilwdHI7CisJCQlpbnQgYWxlbiA9IChhLT5hZGRyLmZhbWlseSA9PSBBRl9JTkVUNiA/IDE2IDogNCk7CisJCQlpbnQgb3BsZW4gPSBhbGVuICsgNCArIHNpemVvZihzdHJ1Y3QgaW5ldF9kaWFnX2hvc3Rjb25kKTsKKwkJCXN0cnVjdCBpbmV0X2RpYWdfaG9zdGNvbmQgKmNvbmQgPSAoc3RydWN0IGluZXRfZGlhZ19ob3N0Y29uZCopKHB0cis0KTsKKworCQkJKm9wID0gKHN0cnVjdCBpbmV0X2RpYWdfYmNfb3ApeyBjb2RlLCBvcGxlbiwgb3BsZW4rNCB9OworCQkJY29uZC0+ZmFtaWx5ID0gYS0+YWRkci5mYW1pbHk7CisJCQljb25kLT5wb3J0ID0gYS0+cG9ydDsKKwkJCWNvbmQtPnByZWZpeF9sZW4gPSBhLT5hZGRyLmJpdGxlbjsKKwkJCW1lbWNweShjb25kLT5hZGRyLCBhLT5hZGRyLmRhdGEsIGFsZW4pOworCQkJcHRyICs9IG9wbGVuOworCQkJaWYgKGItPm5leHQpIHsKKwkJCQlvcCA9IChzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wICopcHRyOworCQkJCSpvcCA9IChzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wKXsgSU5FVF9ESUFHX0JDX0pNUCwgNCwgbGVuIC0gKHB0ci0qYnl0ZWNvZGUpfTsKKwkJCQlwdHIgKz0gNDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcHRyIC0gKmJ5dGVjb2RlOworCX0KKwkJY2FzZSBTU0ZfRF9HRToKKwl7CisJCXN0cnVjdCBhYWZpbHRlciAqeCA9ICh2b2lkKilmLT5wcmVkOworCQlpZiAoISgqYnl0ZWNvZGU9bWFsbG9jKDgpKSkgYWJvcnQoKTsKKwkJKChzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wKikqYnl0ZWNvZGUpWzBdID0gKHN0cnVjdCBpbmV0X2RpYWdfYmNfb3ApeyBJTkVUX0RJQUdfQkNfRF9HRSwgOCwgMTIgfTsKKwkJKChzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wKikqYnl0ZWNvZGUpWzFdID0gKHN0cnVjdCBpbmV0X2RpYWdfYmNfb3ApeyAwLCAwLCB4LT5wb3J0IH07CisJCXJldHVybiA4OworCX0KKwkJY2FzZSBTU0ZfRF9MRToKKwl7CisJCXN0cnVjdCBhYWZpbHRlciAqeCA9ICh2b2lkKilmLT5wcmVkOworCQlpZiAoISgqYnl0ZWNvZGU9bWFsbG9jKDgpKSkgYWJvcnQoKTsKKwkJKChzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wKikqYnl0ZWNvZGUpWzBdID0gKHN0cnVjdCBpbmV0X2RpYWdfYmNfb3ApeyBJTkVUX0RJQUdfQkNfRF9MRSwgOCwgMTIgfTsKKwkJKChzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wKikqYnl0ZWNvZGUpWzFdID0gKHN0cnVjdCBpbmV0X2RpYWdfYmNfb3ApeyAwLCAwLCB4LT5wb3J0IH07CisJCXJldHVybiA4OworCX0KKwkJY2FzZSBTU0ZfU19HRToKKwl7CisJCXN0cnVjdCBhYWZpbHRlciAqeCA9ICh2b2lkKilmLT5wcmVkOworCQlpZiAoISgqYnl0ZWNvZGU9bWFsbG9jKDgpKSkgYWJvcnQoKTsKKwkJKChzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wKikqYnl0ZWNvZGUpWzBdID0gKHN0cnVjdCBpbmV0X2RpYWdfYmNfb3ApeyBJTkVUX0RJQUdfQkNfU19HRSwgOCwgMTIgfTsKKwkJKChzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wKikqYnl0ZWNvZGUpWzFdID0gKHN0cnVjdCBpbmV0X2RpYWdfYmNfb3ApeyAwLCAwLCB4LT5wb3J0IH07CisJCXJldHVybiA4OworCX0KKwkJY2FzZSBTU0ZfU19MRToKKwl7CisJCXN0cnVjdCBhYWZpbHRlciAqeCA9ICh2b2lkKilmLT5wcmVkOworCQlpZiAoISgqYnl0ZWNvZGU9bWFsbG9jKDgpKSkgYWJvcnQoKTsKKwkJKChzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wKikqYnl0ZWNvZGUpWzBdID0gKHN0cnVjdCBpbmV0X2RpYWdfYmNfb3ApeyBJTkVUX0RJQUdfQkNfU19MRSwgOCwgMTIgfTsKKwkJKChzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wKikqYnl0ZWNvZGUpWzFdID0gKHN0cnVjdCBpbmV0X2RpYWdfYmNfb3ApeyAwLCAwLCB4LT5wb3J0IH07CisJCXJldHVybiA4OworCX0KKworCQljYXNlIFNTRl9BTkQ6CisJeworCQljaGFyICphMSwgKmEyLCAqYTsKKwkJaW50IGwxLCBsMjsKKwkJbDEgPSBzc2ZpbHRlcl9ieXRlY29tcGlsZShmLT5wcmVkLCAmYTEpOworCQlsMiA9IHNzZmlsdGVyX2J5dGVjb21waWxlKGYtPnBvc3QsICZhMik7CisJCWlmICghKGEgPSBtYWxsb2MobDErbDIpKSkgYWJvcnQoKTsKKwkJbWVtY3B5KGEsIGExLCBsMSk7CisJCW1lbWNweShhK2wxLCBhMiwgbDIpOworCQlmcmVlKGExKTsgZnJlZShhMik7CisJCXNzZmlsdGVyX3BhdGNoKGEsIGwxLCBsMik7CisJCSpieXRlY29kZSA9IGE7CisJCXJldHVybiBsMStsMjsKKwl9CisJCWNhc2UgU1NGX09SOgorCXsKKwkJY2hhciAqYTEsICphMiwgKmE7CisJCWludCBsMSwgbDI7CisJCWwxID0gc3NmaWx0ZXJfYnl0ZWNvbXBpbGUoZi0+cHJlZCwgJmExKTsKKwkJbDIgPSBzc2ZpbHRlcl9ieXRlY29tcGlsZShmLT5wb3N0LCAmYTIpOworCQlpZiAoIShhID0gbWFsbG9jKGwxK2wyKzQpKSkgYWJvcnQoKTsKKwkJbWVtY3B5KGEsIGExLCBsMSk7CisJCW1lbWNweShhK2wxKzQsIGEyLCBsMik7CisJCWZyZWUoYTEpOyBmcmVlKGEyKTsKKwkJKihzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wKikoYStsMSkgPSAoc3RydWN0IGluZXRfZGlhZ19iY19vcCl7IElORVRfRElBR19CQ19KTVAsIDQsIGwyKzQgfTsKKwkJKmJ5dGVjb2RlID0gYTsKKwkJcmV0dXJuIGwxK2wyKzQ7CisJfQorCQljYXNlIFNTRl9OT1Q6CisJeworCQljaGFyICphMSwgKmE7CisJCWludCBsMTsKKwkJbDEgPSBzc2ZpbHRlcl9ieXRlY29tcGlsZShmLT5wcmVkLCAmYTEpOworCQlpZiAoIShhID0gbWFsbG9jKGwxKzQpKSkgYWJvcnQoKTsKKwkJbWVtY3B5KGEsIGExLCBsMSk7CisJCWZyZWUoYTEpOworCQkqKHN0cnVjdCBpbmV0X2RpYWdfYmNfb3AqKShhK2wxKSA9IChzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wKXsgSU5FVF9ESUFHX0JDX0pNUCwgNCwgOCB9OworCQkqYnl0ZWNvZGUgPSBhOworCQlyZXR1cm4gbDErNDsKKwl9CisJCWRlZmF1bHQ6CisJCWFib3J0KCk7CisJfQorfQorCitzdGF0aWMgaW50IHJlbWVtYmVyX2hlKHN0cnVjdCBhYWZpbHRlciAqYSwgc3RydWN0IGhvc3RlbnQgKmhlKQoreworCWNoYXIgKipwdHIgPSBoZS0+aF9hZGRyX2xpc3Q7CisJaW50IGNudCA9IDA7CisJaW50IGxlbjsKKworCWlmIChoZS0+aF9hZGRydHlwZSA9PSBBRl9JTkVUKQorCQlsZW4gPSA0OworCWVsc2UgaWYgKGhlLT5oX2FkZHJ0eXBlID09IEFGX0lORVQ2KQorCQlsZW4gPSAxNjsKKwllbHNlCisJCXJldHVybiAwOworCisJd2hpbGUgKCpwdHIpIHsKKwkJc3RydWN0IGFhZmlsdGVyICpiID0gYTsKKwkJaWYgKGEtPmFkZHIuYml0bGVuKSB7CisJCQlpZiAoKGIgPSBtYWxsb2Moc2l6ZW9mKCpiKSkpID09IE5VTEwpCisJCQkJcmV0dXJuIGNudDsKKwkJCSpiID0gKmE7CisJCQliLT5uZXh0ID0gYS0+bmV4dDsKKwkJCWEtPm5leHQgPSBiOworCQl9CisJCW1lbWNweShiLT5hZGRyLmRhdGEsICpwdHIsIGxlbik7CisJCWItPmFkZHIuYnl0ZWxlbiA9IGxlbjsKKwkJYi0+YWRkci5iaXRsZW4gPSBsZW4qODsKKwkJYi0+YWRkci5mYW1pbHkgPSBoZS0+aF9hZGRydHlwZTsKKwkJcHRyKys7CisJCWNudCsrOworCX0KKwlyZXR1cm4gY250OworfQorCitzdGF0aWMgaW50IGdldF9kbnNfaG9zdChzdHJ1Y3QgYWFmaWx0ZXIgKmEsIGNvbnN0IGNoYXIgKmFkZHIsIGludCBmYW0pCit7CisJc3RhdGljIGludCBub3RmaXJzdDsKKwlpbnQgY250ID0gMDsKKwlzdHJ1Y3QgaG9zdGVudCAqaGU7CisKKwlhLT5hZGRyLmJpdGxlbiA9IDA7CisJaWYgKCFub3RmaXJzdCkgeworCQlzZXRob3N0ZW50KDEpOworCQlub3RmaXJzdCA9IDE7CisJfQorCWhlID0gZ2V0aG9zdGJ5bmFtZTIoYWRkciwgZmFtID09IEFGX1VOU1BFQyA/IEFGX0lORVQgOiBmYW0pOworCWlmIChoZSkKKwkJY250ID0gcmVtZW1iZXJfaGUoYSwgaGUpOworCWlmIChmYW0gPT0gQUZfVU5TUEVDKSB7CisJCWhlID0gZ2V0aG9zdGJ5bmFtZTIoYWRkciwgQUZfSU5FVDYpOworCQlpZiAoaGUpCisJCQljbnQgKz0gcmVtZW1iZXJfaGUoYSwgaGUpOworCX0KKwlyZXR1cm4gIWNudDsKK30KKworc3RhdGljIGludCB4bGxfaW5pdHRlZCA9IDA7CisKK3N0YXRpYyB2b2lkIHhsbF9pbml0KHZvaWQpCit7CisJc3RydWN0IHJ0bmxfaGFuZGxlIHJ0aDsKKwlpZiAocnRubF9vcGVuKCZydGgsIDApIDwgMCkKKwkJZXhpdCgxKTsKKworCWxsX2luaXRfbWFwKCZydGgpOworCXJ0bmxfY2xvc2UoJnJ0aCk7CisJeGxsX2luaXR0ZWQgPSAxOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqeGxsX2luZGV4X3RvX25hbWUoaW50IGluZGV4KQoreworCWlmICgheGxsX2luaXR0ZWQpCisJCXhsbF9pbml0KCk7CisJcmV0dXJuIGxsX2luZGV4X3RvX25hbWUoaW5kZXgpOworfQorCitzdGF0aWMgaW50IHhsbF9uYW1lX3RvX2luZGV4KGNvbnN0IGNoYXIgKmRldikKK3sKKwlpZiAoIXhsbF9pbml0dGVkKQorCQl4bGxfaW5pdCgpOworCXJldHVybiBsbF9uYW1lX3RvX2luZGV4KGRldik7Cit9CisKK3ZvaWQgKnBhcnNlX2hvc3Rjb25kKGNoYXIgKmFkZHIsIGJvb2wgaXNfcG9ydCkKK3sKKwljaGFyICpwb3J0ID0gTlVMTDsKKwlzdHJ1Y3QgYWFmaWx0ZXIgYSA9IHsgLnBvcnQgPSAtMSB9OworCXN0cnVjdCBhYWZpbHRlciAqcmVzOworCWludCBmYW0gPSBwcmVmZXJyZWRfZmFtaWx5OworCXN0cnVjdCBmaWx0ZXIgKmYgPSAmY3VycmVudF9maWx0ZXI7CisKKwlpZiAoZmFtID09IEFGX1VOSVggfHwgc3RybmNtcChhZGRyLCAidW5peDoiLCA1KSA9PSAwKSB7CisJCWNoYXIgKnA7CisJCWEuYWRkci5mYW1pbHkgPSBBRl9VTklYOworCQlpZiAoc3RybmNtcChhZGRyLCAidW5peDoiLCA1KSA9PSAwKQorCQkJYWRkcis9NTsKKwkJcCA9IHN0cmR1cChhZGRyKTsKKwkJYS5hZGRyLmJpdGxlbiA9IDgqc3RybGVuKHApOworCQltZW1jcHkoYS5hZGRyLmRhdGEsICZwLCBzaXplb2YocCkpOworCQlmYW0gPSBBRl9VTklYOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZmFtID09IEFGX1BBQ0tFVCB8fCBzdHJuY21wKGFkZHIsICJsaW5rOiIsIDUpID09IDApIHsKKwkJYS5hZGRyLmZhbWlseSA9IEFGX1BBQ0tFVDsKKwkJYS5hZGRyLmJpdGxlbiA9IDA7CisJCWlmIChzdHJuY21wKGFkZHIsICJsaW5rOiIsIDUpID09IDApCisJCQlhZGRyKz01OworCQlwb3J0ID0gc3RyY2hyKGFkZHIsICc6Jyk7CisJCWlmIChwb3J0KSB7CisJCQkqcG9ydCA9IDA7CisJCQlpZiAocG9ydFsxXSAmJiBzdHJjbXAocG9ydCsxLCAiKiIpKSB7CisJCQkJaWYgKGdldF9pbnRlZ2VyKCZhLnBvcnQsIHBvcnQrMSwgMCkpIHsKKwkJCQkJaWYgKChhLnBvcnQgPSB4bGxfbmFtZV90b19pbmRleChwb3J0KzEpKSA8PSAwKQorCQkJCQkJcmV0dXJuIE5VTEw7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChhZGRyWzBdICYmIHN0cmNtcChhZGRyLCAiKiIpKSB7CisJCQl1bnNpZ25lZCBzaG9ydCB0bXA7CisJCQlhLmFkZHIuYml0bGVuID0gMzI7CisJCQlpZiAobGxfcHJvdG9fYTJuKCZ0bXAsIGFkZHIpKQorCQkJCXJldHVybiBOVUxMOworCQkJYS5hZGRyLmRhdGFbMF0gPSBudG9ocyh0bXApOworCQl9CisJCWZhbSA9IEFGX1BBQ0tFVDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGZhbSA9PSBBRl9ORVRMSU5LIHx8IHN0cm5jbXAoYWRkciwgIm5ldGxpbms6IiwgOCkgPT0gMCkgeworCQlhLmFkZHIuZmFtaWx5ID0gQUZfTkVUTElOSzsKKwkJYS5hZGRyLmJpdGxlbiA9IDA7CisJCWlmIChzdHJuY21wKGFkZHIsICJuZXRsaW5rOiIsIDgpID09IDApCisJCQlhZGRyKz04OworCQlwb3J0ID0gc3RyY2hyKGFkZHIsICc6Jyk7CisJCWlmIChwb3J0KSB7CisJCQkqcG9ydCA9IDA7CisJCQlpZiAocG9ydFsxXSAmJiBzdHJjbXAocG9ydCsxLCAiKiIpKSB7CisJCQkJaWYgKGdldF9pbnRlZ2VyKCZhLnBvcnQsIHBvcnQrMSwgMCkpIHsKKwkJCQkJaWYgKHN0cmNtcChwb3J0KzEsICJrZXJuZWwiKSA9PSAwKQorCQkJCQkJYS5wb3J0ID0gMDsKKwkJCQkJZWxzZQorCQkJCQkJcmV0dXJuIE5VTEw7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChhZGRyWzBdICYmIHN0cmNtcChhZGRyLCAiKiIpKSB7CisJCQlhLmFkZHIuYml0bGVuID0gMzI7CisJCQlpZiAobmxfcHJvdG9fYTJuKCZhLmFkZHIuZGF0YVswXSwgYWRkcikgPT0gLTEpCisJCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJZmFtID0gQUZfTkVUTElOSzsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGZhbSA9PSBBRl9JTkVUIHx8ICFzdHJuY21wKGFkZHIsICJpbmV0OiIsIDUpKSB7CisJCWZhbSA9IEFGX0lORVQ7CisJCWlmICghc3RybmNtcChhZGRyLCAiaW5ldDoiLCA1KSkKKwkJCWFkZHIgKz0gNTsKKwl9IGVsc2UgaWYgKGZhbSA9PSBBRl9JTkVUNiB8fCAhc3RybmNtcChhZGRyLCAiaW5ldDY6IiwgNikpIHsKKwkJZmFtID0gQUZfSU5FVDY7CisJCWlmICghc3RybmNtcChhZGRyLCAiaW5ldDY6IiwgNikpCisJCQlhZGRyICs9IDY7CisJfQorCisJLyogVVJMLWxpa2UgbGl0ZXJhbCBbXSAqLworCWlmIChhZGRyWzBdID09ICdbJykgeworCQlhZGRyKys7CisJCWlmICgocG9ydCA9IHN0cmNocihhZGRyLCAnXScpKSA9PSBOVUxMKQorCQkJcmV0dXJuIE5VTEw7CisJCSpwb3J0KysgPSAwOworCX0gZWxzZSBpZiAoYWRkclswXSA9PSAnKicpIHsKKwkJcG9ydCA9IGFkZHIrMTsKKwl9IGVsc2UgeworCQlwb3J0ID0gc3RycmNocihzdHJjaHIoYWRkciwgJy8nKSA/IDogYWRkciwgJzonKTsKKwl9CisKKwlpZiAoaXNfcG9ydCkKKwkJcG9ydCA9IGFkZHI7CisKKwlpZiAocG9ydCAmJiAqcG9ydCkgeworCQlpZiAoKnBvcnQgPT0gJzonKQorCQkJKnBvcnQrKyA9IDA7CisKKwkJaWYgKCpwb3J0ICYmICpwb3J0ICE9ICcqJykgeworCQkJaWYgKGdldF9pbnRlZ2VyKCZhLnBvcnQsIHBvcnQsIDApKSB7CisJCQkJc3RydWN0IHNlcnZlbnQgKnNlMSA9IE5VTEw7CisJCQkJc3RydWN0IHNlcnZlbnQgKnNlMiA9IE5VTEw7CisJCQkJaWYgKGN1cnJlbnRfZmlsdGVyLmRicyYoMTw8VURQX0RCKSkKKwkJCQkJc2UxID0gZ2V0c2VydmJ5bmFtZShwb3J0LCBVRFBfUFJPVE8pOworCQkJCWlmIChjdXJyZW50X2ZpbHRlci5kYnMmKDE8PFRDUF9EQikpCisJCQkJCXNlMiA9IGdldHNlcnZieW5hbWUocG9ydCwgVENQX1BST1RPKTsKKwkJCQlpZiAoc2UxICYmIHNlMiAmJiBzZTEtPnNfcG9ydCAhPSBzZTItPnNfcG9ydCkgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBhbWJpZ3VvdXMgcG9ydCBcIiVzXCIuXG4iLCBwb3J0KTsKKwkJCQkJcmV0dXJuIE5VTEw7CisJCQkJfQorCQkJCWlmICghc2UxKQorCQkJCQlzZTEgPSBzZTI7CisJCQkJaWYgKHNlMSkgeworCQkJCQlhLnBvcnQgPSBudG9ocyhzZTEtPnNfcG9ydCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJc3RydWN0IHNjYWNoZSAqczsKKwkJCQkJZm9yIChzID0gcmxpc3Q7IHM7IHMgPSBzLT5uZXh0KSB7CisJCQkJCQlpZiAoKHMtPnByb3RvID09IFVEUF9QUk9UTyAmJgorCQkJCQkJICAgICAoY3VycmVudF9maWx0ZXIuZGJzJigxPDxVRFBfREIpKSkgfHwKKwkJCQkJCSAgICAocy0+cHJvdG8gPT0gVENQX1BST1RPICYmCisJCQkJCQkgICAgIChjdXJyZW50X2ZpbHRlci5kYnMmKDE8PFRDUF9EQikpKSkgeworCQkJCQkJCWlmIChzLT5uYW1lICYmIHN0cmNtcChzLT5uYW1lLCBwb3J0KSA9PSAwKSB7CisJCQkJCQkJCWlmIChhLnBvcnQgPiAwICYmIGEucG9ydCAhPSBzLT5wb3J0KSB7CisJCQkJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBhbWJpZ3VvdXMgcG9ydCBcIiVzXCIuXG4iLCBwb3J0KTsKKwkJCQkJCQkJCXJldHVybiBOVUxMOworCQkJCQkJCQl9CisJCQkJCQkJCWEucG9ydCA9IHMtPnBvcnQ7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmIChhLnBvcnQgPD0gMCkgeworCQkJCQkJZnByaW50ZihzdGRlcnIsICJFcnJvcjogXCIlc1wiIGRvZXMgbm90IGxvb2sgbGlrZSBhIHBvcnQuXG4iLCBwb3J0KTsKKwkJCQkJCXJldHVybiBOVUxMOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmICghaXNfcG9ydCAmJiBhZGRyICYmICphZGRyICYmICphZGRyICE9ICcqJykgeworCQlpZiAoZ2V0X3ByZWZpeF8xKCZhLmFkZHIsIGFkZHIsIGZhbSkpIHsKKwkJCWlmIChnZXRfZG5zX2hvc3QoJmEsIGFkZHIsIGZhbSkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBhbiBpbmV0IHByZWZpeCBpcyBleHBlY3RlZCByYXRoZXIgdGhhbiBcIiVzXCIuXG4iLCBhZGRyKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCX0KKworb3V0OgorCWlmIChmYW0gIT0gQUZfVU5TUEVDKSB7CisJCWYtPmZhbWlsaWVzID0gMDsKKwkJZmlsdGVyX2FmX3NldChmLCBmYW0pOworCQlmaWx0ZXJfc3RhdGVzX3NldChmLCAwKTsKKwl9CisKKwlyZXMgPSBtYWxsb2Moc2l6ZW9mKCpyZXMpKTsKKwlpZiAocmVzKQorCQltZW1jcHkocmVzLCAmYSwgc2l6ZW9mKGEpKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgY2hhciAqcHJvdG9fbmFtZShpbnQgcHJvdG9jb2wpCit7CisJc3dpdGNoIChwcm90b2NvbCkgeworCWNhc2UgMDoKKwkJcmV0dXJuICJyYXciOworCWNhc2UgSVBQUk9UT19VRFA6CisJCXJldHVybiAidWRwIjsKKwljYXNlIElQUFJPVE9fVENQOgorCQlyZXR1cm4gInRjcCI7CisJY2FzZSBJUFBST1RPX0RDQ1A6CisJCXJldHVybiAiZGNjcCI7CisJfQorCisJcmV0dXJuICI/Pz8iOworfQorCitzdGF0aWMgdm9pZCBpbmV0X3N0YXRzX3ByaW50KHN0cnVjdCBzb2Nrc3RhdCAqcywgaW50IHByb3RvY29sKQoreworCWNoYXIgKmJ1ZiA9IE5VTEw7CisKKwlzb2NrX3N0YXRlX3ByaW50KHMsIHByb3RvX25hbWUocHJvdG9jb2wpKTsKKworCWluZXRfYWRkcl9wcmludCgmcy0+bG9jYWwsIHMtPmxwb3J0LCBzLT5pZmFjZSk7CisJaW5ldF9hZGRyX3ByaW50KCZzLT5yZW1vdGUsIHMtPnJwb3J0LCAwKTsKKworCWlmIChzaG93X3Byb2NfY3R4IHx8IHNob3dfc29ja19jdHgpIHsKKwkJaWYgKGZpbmRfZW50cnkocy0+aW5vLCAmYnVmLAorCQkJCShzaG93X3Byb2NfY3R4ICYgc2hvd19zb2NrX2N0eCkgPworCQkJCVBST0NfU09DS19DVFggOiBQUk9DX0NUWCkgPiAwKSB7CisJCQlwcmludGYoIiB1c2VyczooJXMpIiwgYnVmKTsKKwkJCWZyZWUoYnVmKTsKKwkJfQorCX0gZWxzZSBpZiAoc2hvd191c2VycykgeworCQlpZiAoZmluZF9lbnRyeShzLT5pbm8sICZidWYsIFVTRVJTKSA+IDApIHsKKwkJCXByaW50ZigiIHVzZXJzOiglcykiLCBidWYpOworCQkJZnJlZShidWYpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IHByb2NfcGFyc2VfaW5ldF9hZGRyKGNoYXIgKmxvYywgY2hhciAqcmVtLCBpbnQgZmFtaWx5LCBzdHJ1Y3QKKwkJc29ja3N0YXQgKnMpCit7CisJcy0+bG9jYWwuZmFtaWx5ID0gcy0+cmVtb3RlLmZhbWlseSA9IGZhbWlseTsKKwlpZiAoZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJc3NjYW5mKGxvYywgIiV4OiV4Iiwgcy0+bG9jYWwuZGF0YSwgKHVuc2lnbmVkKikmcy0+bHBvcnQpOworCQlzc2NhbmYocmVtLCAiJXg6JXgiLCBzLT5yZW1vdGUuZGF0YSwgKHVuc2lnbmVkKikmcy0+cnBvcnQpOworCQlzLT5sb2NhbC5ieXRlbGVuID0gcy0+cmVtb3RlLmJ5dGVsZW4gPSA0OworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlzc2NhbmYobG9jLCAiJTA4eCUwOHglMDh4JTA4eDoleCIsCisJCSAgICAgICBzLT5sb2NhbC5kYXRhLAorCQkgICAgICAgcy0+bG9jYWwuZGF0YSArIDEsCisJCSAgICAgICBzLT5sb2NhbC5kYXRhICsgMiwKKwkJICAgICAgIHMtPmxvY2FsLmRhdGEgKyAzLAorCQkgICAgICAgJnMtPmxwb3J0KTsKKwkJc3NjYW5mKHJlbSwgIiUwOHglMDh4JTA4eCUwOHg6JXgiLAorCQkgICAgICAgcy0+cmVtb3RlLmRhdGEsCisJCSAgICAgICBzLT5yZW1vdGUuZGF0YSArIDEsCisJCSAgICAgICBzLT5yZW1vdGUuZGF0YSArIDIsCisJCSAgICAgICBzLT5yZW1vdGUuZGF0YSArIDMsCisJCSAgICAgICAmcy0+cnBvcnQpOworCQlzLT5sb2NhbC5ieXRlbGVuID0gcy0+cmVtb3RlLmJ5dGVsZW4gPSAxNjsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBwcm9jX2luZXRfc3BsaXRfbGluZShjaGFyICpsaW5lLCBjaGFyICoqbG9jLCBjaGFyICoqcmVtLCBjaGFyICoqZGF0YSkKK3sKKwljaGFyICpwOworCisJaWYgKChwID0gc3RyY2hyKGxpbmUsICc6JykpID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCSpsb2MgPSBwKzI7CisJaWYgKChwID0gc3RyY2hyKCpsb2MsICc6JykpID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBbNV0gPSAwOworCSpyZW0gPSBwKzY7CisJaWYgKChwID0gc3RyY2hyKCpyZW0sICc6JykpID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBbNV0gPSAwOworCSpkYXRhID0gcCs2OworCXJldHVybiAwOworfQorCitzdGF0aWMgY2hhciAqc3ByaW50X2J3KGNoYXIgKmJ1ZiwgZG91YmxlIGJ3KQoreworCWlmIChidyA+IDEwMDAwMDAuKQorCQlzcHJpbnRmKGJ1ZiwiJS4xZk0iLCBidyAvIDEwMDAwMDAuKTsKKwllbHNlIGlmIChidyA+IDEwMDAuKQorCQlzcHJpbnRmKGJ1ZiwiJS4xZksiLCBidyAvIDEwMDAuKTsKKwllbHNlCisJCXNwcmludGYoYnVmLCAiJWciLCBidyk7CisKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgdm9pZCB0Y3Bfc3RhdHNfcHJpbnQoc3RydWN0IHRjcHN0YXQgKnMpCit7CisJY2hhciBiMVs2NF07CisKKwlpZiAocy0+aGFzX3RzX29wdCkKKwkJcHJpbnRmKCIgdHMiKTsKKwlpZiAocy0+aGFzX3NhY2tfb3B0KQorCQlwcmludGYoIiBzYWNrIik7CisJaWYgKHMtPmhhc19lY25fb3B0KQorCQlwcmludGYoIiBlY24iKTsKKwlpZiAocy0+aGFzX2VjbnNlZW5fb3B0KQorCQlwcmludGYoIiBlY25zZWVuIik7CisJaWYgKHMtPmhhc19mYXN0b3Blbl9vcHQpCisJCXByaW50ZigiIGZhc3RvcGVuIik7CisJaWYgKHMtPmNvbmdfYWxnWzBdKQorCQlwcmludGYoIiAlcyIsIHMtPmNvbmdfYWxnKTsKKwlpZiAocy0+aGFzX3dzY2FsZV9vcHQpCisJCXByaW50ZigiIHdzY2FsZTolZCwlZCIsIHMtPnNuZF93c2NhbGUsIHMtPnJjdl93c2NhbGUpOworCWlmIChzLT5ydG8pCisJCXByaW50ZigiIHJ0bzolZyIsIHMtPnJ0byk7CisJaWYgKHMtPmJhY2tvZmYpCisJCXByaW50ZigiIGJhY2tvZmY6JXUiLCBzLT5iYWNrb2ZmKTsKKwlpZiAocy0+cnR0KQorCQlwcmludGYoIiBydHQ6JWcvJWciLCBzLT5ydHQsIHMtPnJ0dHZhcik7CisJaWYgKHMtPmF0bykKKwkJcHJpbnRmKCIgYXRvOiVnIiwgcy0+YXRvKTsKKworCWlmIChzLT5xYWNrKQorCQlwcmludGYoIiBxYWNrOiVkIiwgcy0+cWFjayk7CisJaWYgKHMtPnFhY2sgJiAxKQorCQlwcmludGYoIiBiaWRpciIpOworCisJaWYgKHMtPm1zcykKKwkJcHJpbnRmKCIgbXNzOiVkIiwgcy0+bXNzKTsKKwlpZiAocy0+Y3duZCkKKwkJcHJpbnRmKCIgY3duZDolZCIsIHMtPmN3bmQpOworCWlmIChzLT5zc3RocmVzaCkKKwkJcHJpbnRmKCIgc3N0aHJlc2g6JWQiLCBzLT5zc3RocmVzaCk7CisKKwlpZiAocy0+Ynl0ZXNfYWNrZWQpCisJCXByaW50ZigiIGJ5dGVzX2Fja2VkOiVsbHUiLCBzLT5ieXRlc19hY2tlZCk7CisJaWYgKHMtPmJ5dGVzX3JlY2VpdmVkKQorCQlwcmludGYoIiBieXRlc19yZWNlaXZlZDolbGx1Iiwgcy0+Ynl0ZXNfcmVjZWl2ZWQpOworCWlmIChzLT5zZWdzX291dCkKKwkJcHJpbnRmKCIgc2Vnc19vdXQ6JXUiLCBzLT5zZWdzX291dCk7CisJaWYgKHMtPnNlZ3NfaW4pCisJCXByaW50ZigiIHNlZ3NfaW46JXUiLCBzLT5zZWdzX2luKTsKKworCWlmIChzLT5kY3RjcCAmJiBzLT5kY3RjcC0+ZW5hYmxlZCkgeworCQlzdHJ1Y3QgZGN0Y3BzdGF0ICpkY3RjcCA9IHMtPmRjdGNwOworCisJCXByaW50ZigiIGRjdGNwOihjZV9zdGF0ZToldSxhbHBoYToldSxhYl9lY246JXUsYWJfdG90OiV1KSIsCisJCQkJZGN0Y3AtPmNlX3N0YXRlLCBkY3RjcC0+YWxwaGEsIGRjdGNwLT5hYl9lY24sCisJCQkJZGN0Y3AtPmFiX3RvdCk7CisJfSBlbHNlIGlmIChzLT5kY3RjcCkgeworCQlwcmludGYoIiBkY3RjcDpmYWxsYmFja19tb2RlIik7CisJfQorCisJaWYgKHMtPnNlbmRfYnBzKQorCQlwcmludGYoIiBzZW5kICVzYnBzIiwgc3ByaW50X2J3KGIxLCBzLT5zZW5kX2JwcykpOworCWlmIChzLT5sYXN0c25kKQorCQlwcmludGYoIiBsYXN0c25kOiV1Iiwgcy0+bGFzdHNuZCk7CisJaWYgKHMtPmxhc3RyY3YpCisJCXByaW50ZigiIGxhc3RyY3Y6JXUiLCBzLT5sYXN0cmN2KTsKKwlpZiAocy0+bGFzdGFjaykKKwkJcHJpbnRmKCIgbGFzdGFjazoldSIsIHMtPmxhc3RhY2spOworCisJaWYgKHMtPnBhY2luZ19yYXRlKSB7CisJCXByaW50ZigiIHBhY2luZ19yYXRlICVzYnBzIiwgc3ByaW50X2J3KGIxLCBzLT5wYWNpbmdfcmF0ZSkpOworCQlpZiAocy0+cGFjaW5nX3JhdGVfbWF4KQorCQkJCXByaW50ZigiLyVzYnBzIiwgc3ByaW50X2J3KGIxLAorCQkJCQkJCXMtPnBhY2luZ19yYXRlX21heCkpOworCX0KKworCWlmIChzLT51bmFja2VkKQorCQlwcmludGYoIiB1bmFja2VkOiV1Iiwgcy0+dW5hY2tlZCk7CisJaWYgKHMtPnJldHJhbnMgfHwgcy0+cmV0cmFuc190b3RhbCkKKwkJcHJpbnRmKCIgcmV0cmFuczoldS8ldSIsIHMtPnJldHJhbnMsIHMtPnJldHJhbnNfdG90YWwpOworCWlmIChzLT5sb3N0KQorCQlwcmludGYoIiBsb3N0OiV1Iiwgcy0+bG9zdCk7CisJaWYgKHMtPnNhY2tlZCAmJiBzLT5zcy5zdGF0ZSAhPSBTU19MSVNURU4pCisJCXByaW50ZigiIHNhY2tlZDoldSIsIHMtPnNhY2tlZCk7CisJaWYgKHMtPmZhY2tldHMpCisJCXByaW50ZigiIGZhY2tldHM6JXUiLCBzLT5mYWNrZXRzKTsKKwlpZiAocy0+cmVvcmRlcmluZyAhPSAzKQorCQlwcmludGYoIiByZW9yZGVyaW5nOiVkIiwgcy0+cmVvcmRlcmluZyk7CisJaWYgKHMtPnJjdl9ydHQpCisJCXByaW50ZigiIHJjdl9ydHQ6JWciLCBzLT5yY3ZfcnR0KTsKKwlpZiAocy0+cmN2X3NwYWNlKQorCQlwcmludGYoIiByY3Zfc3BhY2U6JWQiLCBzLT5yY3Zfc3BhY2UpOworfQorCitzdGF0aWMgdm9pZCB0Y3BfdGltZXJfcHJpbnQoc3RydWN0IHRjcHN0YXQgKnMpCit7CisJaWYgKHMtPnRpbWVyKSB7CisJCWlmIChzLT50aW1lciA+IDQpCisJCQlzLT50aW1lciA9IDU7CisJCXByaW50ZigiIHRpbWVyOiglcywlcywlZCkiLAorCQkJCXRtcl9uYW1lW3MtPnRpbWVyXSwKKwkJCQlwcmludF9tc190aW1lcihzLT50aW1lb3V0KSwKKwkJCQlzLT5yZXRyYW5zKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdGNwX3Nob3dfbGluZShjaGFyICpsaW5lLCBjb25zdCBzdHJ1Y3QgZmlsdGVyICpmLCBpbnQgZmFtaWx5KQoreworCWludCBydG8gPSAwLCBhdG8gPSAwOworCXN0cnVjdCB0Y3BzdGF0IHMgPSB7fTsKKwljaGFyICpsb2MsICpyZW0sICpkYXRhOworCWNoYXIgb3B0WzI1Nl07CisJaW50IG47CisJaW50IGh6ID0gZ2V0X3VzZXJfaHooKTsKKworCWlmIChwcm9jX2luZXRfc3BsaXRfbGluZShsaW5lLCAmbG9jLCAmcmVtLCAmZGF0YSkpCisJCXJldHVybiAtMTsKKworCWludCBzdGF0ZSA9IChkYXRhWzFdID49ICdBJykgPyAoZGF0YVsxXSAtICdBJyArIDEwKSA6IChkYXRhWzFdIC0gJzAnKTsKKwlpZiAoIShmLT5zdGF0ZXMgJiAoMSA8PCBzdGF0ZSkpKQorCQlyZXR1cm4gMDsKKworCXByb2NfcGFyc2VfaW5ldF9hZGRyKGxvYywgcmVtLCBmYW1pbHksICZzLnNzKTsKKworCWlmIChmLT5mICYmIHJ1bl9zc2ZpbHRlcihmLT5mLCAmcy5zcykgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlvcHRbMF0gPSAwOworCW4gPSBzc2NhbmYoZGF0YSwgIiV4ICV4OiV4ICV4OiV4ICV4ICVkICVkICV1ICVkICVsbHggJWQgJWQgJWQgJWQgJWQgJVteXG5dXG4iLAorCQkgICAmcy5zcy5zdGF0ZSwgJnMuc3Mud3EsICZzLnNzLnJxLAorCQkgICAmcy50aW1lciwgJnMudGltZW91dCwgJnMucmV0cmFucywgJnMuc3MudWlkLCAmcy5wcm9iZXMsCisJCSAgICZzLnNzLmlubywgJnMuc3MucmVmY250LCAmcy5zcy5zaywgJnJ0bywgJmF0bywgJnMucWFjaywgJnMuY3duZCwKKwkJICAgJnMuc3N0aHJlc2gsIG9wdCk7CisKKwlpZiAobiA8IDE3KQorCQlvcHRbMF0gPSAwOworCisJaWYgKG4gPCAxMikgeworCQlydG8gPSAwOworCQlzLmN3bmQgPSAyOworCQlzLnNzdGhyZXNoID0gLTE7CisJCWF0byA9IHMucWFjayA9IDA7CisJfQorCisJcy5yZXRyYW5zICAgPSBzLnRpbWVyICE9IDEgPyBzLnByb2JlcyA6IHMucmV0cmFuczsKKwlzLnRpbWVvdXQgICA9IChzLnRpbWVvdXQgKiAxMDAwICsgaHogLSAxKSAvIGh6OworCXMuYXRvCSAgICA9IChkb3VibGUpYXRvIC8gaHo7CisJcy5xYWNrCSAgIC89IDI7CisJcy5ydG8JICAgID0gKGRvdWJsZSlydG87CisJcy5zc3RocmVzaCAgPSBzLnNzdGhyZXNoID09IC0xID8gMCA6IHMuc3N0aHJlc2g7CisJcy5ydG8JICAgID0gcy5ydG8gIT0gMyAqIGh6ICA/IHMucnRvIC8gaHogOiAwOworCisJaW5ldF9zdGF0c19wcmludCgmcy5zcywgSVBQUk9UT19UQ1ApOworCisJaWYgKHNob3dfb3B0aW9ucykKKwkJdGNwX3RpbWVyX3ByaW50KCZzKTsKKworCWlmIChzaG93X2RldGFpbHMpIHsKKwkJc29ja19kZXRhaWxzX3ByaW50KCZzLnNzKTsKKwkJaWYgKG9wdFswXSkKKwkJCXByaW50ZigiIG9wdDpcIiVzXCIiLCBvcHQpOworCX0KKworCWlmIChzaG93X3RjcGluZm8pCisJCXRjcF9zdGF0c19wcmludCgmcyk7CisKKwlwcmludGYoIlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2VuZXJpY19yZWNvcmRfcmVhZChGSUxFICpmcCwKKwkJCSAgICAgICBpbnQgKCp3b3JrZXIpKGNoYXIqLCBjb25zdCBzdHJ1Y3QgZmlsdGVyICosIGludCksCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGZpbHRlciAqZiwgaW50IGZhbSkKK3sKKwljaGFyIGxpbmVbMjU2XTsKKworCS8qIHNraXAgaGVhZGVyICovCisJaWYgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApID09IE5VTEwpCisJCWdvdG8gb3V0ZXJyOworCisJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApICE9IE5VTEwpIHsKKwkJaW50IG4gPSBzdHJsZW4obGluZSk7CisJCWlmIChuID09IDAgfHwgbGluZVtuLTFdICE9ICdcbicpIHsKKwkJCWVycm5vID0gLUVJTlZBTDsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlsaW5lW24tMV0gPSAwOworCisJCWlmICh3b3JrZXIobGluZSwgZiwgZmFtKSA8IDApCisJCQlyZXR1cm4gMDsKKwl9CitvdXRlcnI6CisKKwlyZXR1cm4gZmVycm9yKGZwKSA/IC0xIDogMDsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfc2ttZW1pbmZvKHN0cnVjdCBydGF0dHIgKnRiW10sIGludCBhdHRydHlwZSkKK3sKKwljb25zdCBfX3UzMiAqc2ttZW1pbmZvOworCisJaWYgKCF0YlthdHRydHlwZV0pIHsKKwkJaWYgKGF0dHJ0eXBlID09IElORVRfRElBR19TS01FTUlORk8pIHsKKwkJCWlmICghdGJbSU5FVF9ESUFHX01FTUlORk9dKQorCQkJCXJldHVybjsKKworCQkJY29uc3Qgc3RydWN0IGluZXRfZGlhZ19tZW1pbmZvICptaW5mbyA9CisJCQkJUlRBX0RBVEEodGJbSU5FVF9ESUFHX01FTUlORk9dKTsKKworCQkJcHJpbnRmKCIgbWVtOihyJXUsdyV1LGYldSx0JXUpIiwKKwkJCQkJbWluZm8tPmlkaWFnX3JtZW0sCisJCQkJCW1pbmZvLT5pZGlhZ193bWVtLAorCQkJCQltaW5mby0+aWRpYWdfZm1lbSwKKwkJCQkJbWluZm8tPmlkaWFnX3RtZW0pOworCQl9CisJCXJldHVybjsKKwl9CisKKwlza21lbWluZm8gPSBSVEFfREFUQSh0YlthdHRydHlwZV0pOworCisJcHJpbnRmKCIgc2ttZW06KHIldSxyYiV1LHQldSx0YiV1LGYldSx3JXUsbyV1IiwKKwkgICAgICAgc2ttZW1pbmZvW1NLX01FTUlORk9fUk1FTV9BTExPQ10sCisJICAgICAgIHNrbWVtaW5mb1tTS19NRU1JTkZPX1JDVkJVRl0sCisJICAgICAgIHNrbWVtaW5mb1tTS19NRU1JTkZPX1dNRU1fQUxMT0NdLAorCSAgICAgICBza21lbWluZm9bU0tfTUVNSU5GT19TTkRCVUZdLAorCSAgICAgICBza21lbWluZm9bU0tfTUVNSU5GT19GV0RfQUxMT0NdLAorCSAgICAgICBza21lbWluZm9bU0tfTUVNSU5GT19XTUVNX1FVRVVFRF0sCisJICAgICAgIHNrbWVtaW5mb1tTS19NRU1JTkZPX09QVE1FTV0pOworCisJaWYgKFJUQV9QQVlMT0FEKHRiW2F0dHJ0eXBlXSkgPj0KKwkJKFNLX01FTUlORk9fQkFDS0xPRyArIDEpICogc2l6ZW9mKF9fdTMyKSkKKwkJcHJpbnRmKCIsYmwldSIsIHNrbWVtaW5mb1tTS19NRU1JTkZPX0JBQ0tMT0ddKTsKKworCXByaW50ZigiKSIpOworfQorCisjZGVmaW5lIFRDUElfSEFTX09QVChpbmZvLCBvcHQpICEhKGluZm8tPnRjcGlfb3B0aW9ucyAmIChvcHQpKQorCitzdGF0aWMgdm9pZCB0Y3Bfc2hvd19pbmZvKGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoLCBzdHJ1Y3QgaW5ldF9kaWFnX21zZyAqciwKKwkJc3RydWN0IHJ0YXR0ciAqdGJbXSkKK3sKKwlkb3VibGUgcnR0ID0gMDsKKwlzdHJ1Y3QgdGNwc3RhdCBzID0ge307CisKKwlzLnNzLnN0YXRlID0gci0+aWRpYWdfc3RhdGU7CisKKwlwcmludF9za21lbWluZm8odGIsIElORVRfRElBR19TS01FTUlORk8pOworCisJaWYgKHRiW0lORVRfRElBR19JTkZPXSkgeworCQlzdHJ1Y3QgdGNwX2luZm8gKmluZm87CisJCWludCBsZW4gPSBSVEFfUEFZTE9BRCh0YltJTkVUX0RJQUdfSU5GT10pOworCisJCS8qIHdvcmthcm91bmQgZm9yIG9sZGVyIGtlcm5lbHMgd2l0aCBsZXNzIGZpZWxkcyAqLworCQlpZiAobGVuIDwgc2l6ZW9mKCppbmZvKSkgeworCQkJaW5mbyA9IGFsbG9jYShzaXplb2YoKmluZm8pKTsKKwkJCW1lbWNweShpbmZvLCBSVEFfREFUQSh0YltJTkVUX0RJQUdfSU5GT10pLCBsZW4pOworCQkJbWVtc2V0KChjaGFyICopaW5mbyArIGxlbiwgMCwgc2l6ZW9mKCppbmZvKSAtIGxlbik7CisJCX0gZWxzZQorCQkJaW5mbyA9IFJUQV9EQVRBKHRiW0lORVRfRElBR19JTkZPXSk7CisKKwkJaWYgKHNob3dfb3B0aW9ucykgeworCQkJcy5oYXNfdHNfb3B0CSAgID0gVENQSV9IQVNfT1BUKGluZm8sIFRDUElfT1BUX1RJTUVTVEFNUFMpOworCQkJcy5oYXNfc2Fja19vcHQJICAgPSBUQ1BJX0hBU19PUFQoaW5mbywgVENQSV9PUFRfU0FDSyk7CisJCQlzLmhhc19lY25fb3B0CSAgID0gVENQSV9IQVNfT1BUKGluZm8sIFRDUElfT1BUX0VDTik7CisJCQlzLmhhc19lY25zZWVuX29wdCAgPSBUQ1BJX0hBU19PUFQoaW5mbywgVENQSV9PUFRfRUNOX1NFRU4pOworCQkJcy5oYXNfZmFzdG9wZW5fb3B0ID0gVENQSV9IQVNfT1BUKGluZm8sIFRDUElfT1BUX1NZTl9EQVRBKTsKKwkJfQorCisJCWlmICh0YltJTkVUX0RJQUdfQ09OR10pCisJCQlzdHJuY3B5KHMuY29uZ19hbGcsCisJCQkJcnRhX2dldGF0dHJfc3RyKHRiW0lORVRfRElBR19DT05HXSksCisJCQkJc2l6ZW9mKHMuY29uZ19hbGcpIC0gMSk7CisKKwkJaWYgKFRDUElfSEFTX09QVChpbmZvLCBUQ1BJX09QVF9XU0NBTEUpKSB7CisJCQlzLmhhc193c2NhbGVfb3B0ICA9IHRydWU7CisJCQlzLnNuZF93c2NhbGUJICA9IGluZm8tPnRjcGlfc25kX3dzY2FsZTsKKwkJCXMucmN2X3dzY2FsZQkgID0gaW5mby0+dGNwaV9yY3Zfd3NjYWxlOworCQl9CisKKwkJaWYgKGluZm8tPnRjcGlfcnRvICYmIGluZm8tPnRjcGlfcnRvICE9IDMwMDAwMDApCisJCQlzLnJ0byA9IChkb3VibGUpaW5mby0+dGNwaV9ydG8gLyAxMDAwOworCisJCXMuYmFja29mZgkgPSBpbmZvLT50Y3BpX2JhY2tvZmY7CisJCXMucnR0CQkgPSAoZG91YmxlKWluZm8tPnRjcGlfcnR0IC8gMTAwMDsKKwkJcy5ydHR2YXIJID0gKGRvdWJsZSlpbmZvLT50Y3BpX3J0dHZhciAvIDEwMDA7CisJCXMuYXRvCQkgPSAoZG91YmxlKWluZm8tPnRjcGlfYXRvIC8gMTAwMDsKKwkJcy5tc3MJCSA9IGluZm8tPnRjcGlfc25kX21zczsKKwkJcy5yY3Zfc3BhY2UJID0gaW5mby0+dGNwaV9yY3Zfc3BhY2U7CisJCXMucmN2X3J0dAkgPSAoZG91YmxlKWluZm8tPnRjcGlfcmN2X3J0dCAvIDEwMDA7CisJCXMubGFzdHNuZAkgPSBpbmZvLT50Y3BpX2xhc3RfZGF0YV9zZW50OworCQlzLmxhc3RyY3YJID0gaW5mby0+dGNwaV9sYXN0X2RhdGFfcmVjdjsKKwkJcy5sYXN0YWNrCSA9IGluZm8tPnRjcGlfbGFzdF9hY2tfcmVjdjsKKwkJcy51bmFja2VkCSA9IGluZm8tPnRjcGlfdW5hY2tlZDsKKwkJcy5yZXRyYW5zCSA9IGluZm8tPnRjcGlfcmV0cmFuczsKKwkJcy5yZXRyYW5zX3RvdGFsICA9IGluZm8tPnRjcGlfdG90YWxfcmV0cmFuczsKKwkJcy5sb3N0CQkgPSBpbmZvLT50Y3BpX2xvc3Q7CisJCXMuc2Fja2VkCSA9IGluZm8tPnRjcGlfc2Fja2VkOworCQlzLnJlb3JkZXJpbmcJID0gaW5mby0+dGNwaV9yZW9yZGVyaW5nOworCQlzLnJjdl9zcGFjZQkgPSBpbmZvLT50Y3BpX3Jjdl9zcGFjZTsKKwkJcy5jd25kCQkgPSBpbmZvLT50Y3BpX3NuZF9jd25kOworCisJCWlmIChpbmZvLT50Y3BpX3NuZF9zc3RocmVzaCA8IDB4RkZGRikKKwkJCXMuc3N0aHJlc2ggPSBpbmZvLT50Y3BpX3NuZF9zc3RocmVzaDsKKworCQlydHQgPSAoZG91YmxlKSBpbmZvLT50Y3BpX3J0dDsKKwkJaWYgKHRiW0lORVRfRElBR19WRUdBU0lORk9dKSB7CisJCQljb25zdCBzdHJ1Y3QgdGNwdmVnYXNfaW5mbyAqdmluZm8KKwkJCQk9IFJUQV9EQVRBKHRiW0lORVRfRElBR19WRUdBU0lORk9dKTsKKworCQkJaWYgKHZpbmZvLT50Y3B2X2VuYWJsZWQgJiYKKwkJCQkJdmluZm8tPnRjcHZfcnR0ICYmIHZpbmZvLT50Y3B2X3J0dCAhPSAweDdmZmZmZmZmKQorCQkJCXJ0dCA9ICB2aW5mby0+dGNwdl9ydHQ7CisJCX0KKworCQlpZiAodGJbSU5FVF9ESUFHX0RDVENQSU5GT10pIHsKKwkJCXN0cnVjdCBkY3RjcHN0YXQgKmRjdGNwID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QKKwkJCQkJCWRjdGNwc3RhdCkpOworCisJCQljb25zdCBzdHJ1Y3QgdGNwX2RjdGNwX2luZm8gKmRpbmZvCisJCQkJPSBSVEFfREFUQSh0YltJTkVUX0RJQUdfRENUQ1BJTkZPXSk7CisKKwkJCWRjdGNwLT5lbmFibGVkCT0gISFkaW5mby0+ZGN0Y3BfZW5hYmxlZDsKKwkJCWRjdGNwLT5jZV9zdGF0ZSA9IGRpbmZvLT5kY3RjcF9jZV9zdGF0ZTsKKwkJCWRjdGNwLT5hbHBoYQk9IGRpbmZvLT5kY3RjcF9hbHBoYTsKKwkJCWRjdGNwLT5hYl9lY24JPSBkaW5mby0+ZGN0Y3BfYWJfZWNuOworCQkJZGN0Y3AtPmFiX3RvdAk9IGRpbmZvLT5kY3RjcF9hYl90b3Q7CisJCQlzLmRjdGNwCQk9IGRjdGNwOworCQl9CisKKwkJaWYgKHJ0dCA+IDAgJiYgaW5mby0+dGNwaV9zbmRfbXNzICYmIGluZm8tPnRjcGlfc25kX2N3bmQpIHsKKwkJCXMuc2VuZF9icHMgPSAoZG91YmxlKSBpbmZvLT50Y3BpX3NuZF9jd25kICoKKwkJCQkoZG91YmxlKWluZm8tPnRjcGlfc25kX21zcyAqIDgwMDAwMDAuIC8gcnR0OworCQl9CisKKwkJaWYgKGluZm8tPnRjcGlfcGFjaW5nX3JhdGUgJiYKKwkJCQlpbmZvLT50Y3BpX3BhY2luZ19yYXRlICE9IH4wVUxMKSB7CisJCQlzLnBhY2luZ19yYXRlID0gaW5mby0+dGNwaV9wYWNpbmdfcmF0ZSAqIDguOworCisJCQlpZiAoaW5mby0+dGNwaV9tYXhfcGFjaW5nX3JhdGUgJiYKKwkJCQkJaW5mby0+dGNwaV9tYXhfcGFjaW5nX3JhdGUgIT0gfjBVTEwpCisJCQkJcy5wYWNpbmdfcmF0ZV9tYXggPSBpbmZvLT50Y3BpX21heF9wYWNpbmdfcmF0ZSAqIDguOworCQl9CisJCXMuYnl0ZXNfYWNrZWQgPSBpbmZvLT50Y3BpX2J5dGVzX2Fja2VkOworCQlzLmJ5dGVzX3JlY2VpdmVkID0gaW5mby0+dGNwaV9ieXRlc19yZWNlaXZlZDsKKwkJcy5zZWdzX291dCA9IGluZm8tPnRjcGlfc2Vnc19vdXQ7CisJCXMuc2Vnc19pbiA9IGluZm8tPnRjcGlfc2Vnc19pbjsKKwkJdGNwX3N0YXRzX3ByaW50KCZzKTsKKwkJZnJlZShzLmRjdGNwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaW5ldF9zaG93X3NvY2soc3RydWN0IG5sbXNnaGRyICpubGgsIHN0cnVjdCBmaWx0ZXIgKmYsIGludCBwcm90b2NvbCkKK3sKKwlzdHJ1Y3QgcnRhdHRyICogdGJbSU5FVF9ESUFHX01BWCsxXTsKKwlzdHJ1Y3QgaW5ldF9kaWFnX21zZyAqciA9IE5MTVNHX0RBVEEobmxoKTsKKwlzdHJ1Y3Qgc29ja3N0YXQgcyA9IHt9OworCisJcGFyc2VfcnRhdHRyKHRiLCBJTkVUX0RJQUdfTUFYLCAoc3RydWN0IHJ0YXR0ciopKHIrMSksCisJCSAgICAgbmxoLT5ubG1zZ19sZW4gLSBOTE1TR19MRU5HVEgoc2l6ZW9mKCpyKSkpOworCisJcy5zdGF0ZQkJPSByLT5pZGlhZ19zdGF0ZTsKKwlzLmxvY2FsLmZhbWlseSAgPSBzLnJlbW90ZS5mYW1pbHkgPSByLT5pZGlhZ19mYW1pbHk7CisJcy5scG9ydAkJPSBudG9ocyhyLT5pZC5pZGlhZ19zcG9ydCk7CisJcy5ycG9ydAkJPSBudG9ocyhyLT5pZC5pZGlhZ19kcG9ydCk7CisJcy53cQkJPSByLT5pZGlhZ193cXVldWU7CisJcy5ycQkJPSByLT5pZGlhZ19ycXVldWU7CisJcy5pbm8JCT0gci0+aWRpYWdfaW5vZGU7CisJcy51aWQJCT0gci0+aWRpYWdfdWlkOworCXMuaWZhY2UJCT0gci0+aWQuaWRpYWdfaWY7CisJcy5zawkJPSBjb29raWVfc2tfZ2V0KCZyLT5pZC5pZGlhZ19jb29raWVbMF0pOworCisJaWYgKHMubG9jYWwuZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJcy5sb2NhbC5ieXRlbGVuID0gcy5yZW1vdGUuYnl0ZWxlbiA9IDQ7CisJfSBlbHNlIHsKKwkJcy5sb2NhbC5ieXRlbGVuID0gcy5yZW1vdGUuYnl0ZWxlbiA9IDE2OworCX0KKworCW1lbWNweShzLmxvY2FsLmRhdGEsIHItPmlkLmlkaWFnX3NyYywgcy5sb2NhbC5ieXRlbGVuKTsKKwltZW1jcHkocy5yZW1vdGUuZGF0YSwgci0+aWQuaWRpYWdfZHN0LCBzLmxvY2FsLmJ5dGVsZW4pOworCisJaWYgKGYgJiYgZi0+ZiAmJiBydW5fc3NmaWx0ZXIoZi0+ZiwgJnMpID09IDApCisJCXJldHVybiAwOworCisJaWYgKHRiW0lORVRfRElBR19QUk9UT0NPTF0pCisJCXByb3RvY29sID0gKihfX3U4ICopUlRBX0RBVEEodGJbSU5FVF9ESUFHX1BST1RPQ09MXSk7CisKKwlpbmV0X3N0YXRzX3ByaW50KCZzLCBwcm90b2NvbCk7CisKKwlpZiAoc2hvd19vcHRpb25zKSB7CisJCXN0cnVjdCB0Y3BzdGF0IHQgPSB7fTsKKworCQl0LnRpbWVyID0gci0+aWRpYWdfdGltZXI7CisJCXQudGltZW91dCA9IHItPmlkaWFnX2V4cGlyZXM7CisJCXQucmV0cmFucyA9IHItPmlkaWFnX3JldHJhbnM7CisJCXRjcF90aW1lcl9wcmludCgmdCk7CisJfQorCisJaWYgKHNob3dfZGV0YWlscykgeworCQlzb2NrX2RldGFpbHNfcHJpbnQoJnMpOworCQlpZiAocy5sb2NhbC5mYW1pbHkgPT0gQUZfSU5FVDYgJiYgdGJbSU5FVF9ESUFHX1NLVjZPTkxZXSkgeworCQkJdW5zaWduZWQgY2hhciB2Nm9ubHk7CisJCQl2Nm9ubHkgPSAqKF9fdTggKilSVEFfREFUQSh0YltJTkVUX0RJQUdfU0tWNk9OTFldKTsKKwkJCXByaW50ZigiIHY2b25seToldSIsIHY2b25seSk7CisJCX0KKwkJaWYgKHRiW0lORVRfRElBR19TSFVURE9XTl0pIHsKKwkJCXVuc2lnbmVkIGNoYXIgbWFzazsKKwkJCW1hc2sgPSAqKF9fdTggKilSVEFfREFUQSh0YltJTkVUX0RJQUdfU0hVVERPV05dKTsKKwkJCXByaW50ZigiICVjLSVjIiwgbWFzayAmIDEgPyAnLScgOiAnPCcsIG1hc2sgJiAyID8gJy0nIDogJz4nKTsKKwkJfQorCX0KKworCWlmIChzaG93X21lbSB8fCBzaG93X3RjcGluZm8pIHsKKwkJcHJpbnRmKCJcblx0Iik7CisJCXRjcF9zaG93X2luZm8obmxoLCByLCB0Yik7CisJfQorCisJcHJpbnRmKCJcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRjcGRpYWdfc2VuZChpbnQgZmQsIGludCBwcm90b2NvbCwgc3RydWN0IGZpbHRlciAqZikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfbmwgbmxhZGRyOworCXN0cnVjdCB7CisJCXN0cnVjdCBubG1zZ2hkciBubGg7CisJCXN0cnVjdCBpbmV0X2RpYWdfcmVxIHI7CisJfSByZXE7CisJY2hhciAgICAqYmMgPSBOVUxMOworCWludAliY2xlbjsKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlzdHJ1Y3QgcnRhdHRyIHJ0YTsKKwlzdHJ1Y3QgaW92ZWMgaW92WzNdOworCisJaWYgKHByb3RvY29sID09IElQUFJPVE9fVURQKQorCQlyZXR1cm4gLTE7CisKKwltZW1zZXQoJm5sYWRkciwgMCwgc2l6ZW9mKG5sYWRkcikpOworCW5sYWRkci5ubF9mYW1pbHkgPSBBRl9ORVRMSU5LOworCisJcmVxLm5saC5ubG1zZ19sZW4gPSBzaXplb2YocmVxKTsKKwlpZiAocHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApCisJCXJlcS5ubGgubmxtc2dfdHlwZSA9IFRDUERJQUdfR0VUU09DSzsKKwllbHNlCisJCXJlcS5ubGgubmxtc2dfdHlwZSA9IERDQ1BESUFHX0dFVFNPQ0s7CisJcmVxLm5saC5ubG1zZ19mbGFncyA9IE5MTV9GX1JPT1R8TkxNX0ZfTUFUQ0h8TkxNX0ZfUkVRVUVTVDsKKwlyZXEubmxoLm5sbXNnX3BpZCA9IDA7CisJcmVxLm5saC5ubG1zZ19zZXEgPSBNQUdJQ19TRVE7CisJbWVtc2V0KCZyZXEuciwgMCwgc2l6ZW9mKHJlcS5yKSk7CisJcmVxLnIuaWRpYWdfZmFtaWx5ID0gQUZfSU5FVDsKKwlyZXEuci5pZGlhZ19zdGF0ZXMgPSBmLT5zdGF0ZXM7CisJaWYgKHNob3dfbWVtKSB7CisJCXJlcS5yLmlkaWFnX2V4dCB8PSAoMTw8KElORVRfRElBR19NRU1JTkZPLTEpKTsKKwkJcmVxLnIuaWRpYWdfZXh0IHw9ICgxPDwoSU5FVF9ESUFHX1NLTUVNSU5GTy0xKSk7CisJfQorCisJaWYgKHNob3dfdGNwaW5mbykgeworCQlyZXEuci5pZGlhZ19leHQgfD0gKDE8PChJTkVUX0RJQUdfSU5GTy0xKSk7CisJCXJlcS5yLmlkaWFnX2V4dCB8PSAoMTw8KElORVRfRElBR19WRUdBU0lORk8tMSkpOworCQlyZXEuci5pZGlhZ19leHQgfD0gKDE8PChJTkVUX0RJQUdfQ09ORy0xKSk7CisJfQorCisJaW92WzBdID0gKHN0cnVjdCBpb3ZlYyl7CisJCS5pb3ZfYmFzZSA9ICZyZXEsCisJCS5pb3ZfbGVuID0gc2l6ZW9mKHJlcSkKKwl9OworCWlmIChmLT5mKSB7CisJCWJjbGVuID0gc3NmaWx0ZXJfYnl0ZWNvbXBpbGUoZi0+ZiwgJmJjKTsKKwkJcnRhLnJ0YV90eXBlID0gSU5FVF9ESUFHX1JFUV9CWVRFQ09ERTsKKwkJcnRhLnJ0YV9sZW4gPSBSVEFfTEVOR1RIKGJjbGVuKTsKKwkJaW92WzFdID0gKHN0cnVjdCBpb3ZlYyl7ICZydGEsIHNpemVvZihydGEpIH07CisJCWlvdlsyXSA9IChzdHJ1Y3QgaW92ZWMpeyBiYywgYmNsZW4gfTsKKwkJcmVxLm5saC5ubG1zZ19sZW4gKz0gUlRBX0xFTkdUSChiY2xlbik7CisJfQorCisJbXNnID0gKHN0cnVjdCBtc2doZHIpIHsKKwkJLm1zZ19uYW1lID0gKHZvaWQqKSZubGFkZHIsCisJCS5tc2dfbmFtZWxlbiA9IHNpemVvZihubGFkZHIpLAorCQkubXNnX2lvdiA9IGlvdiwKKwkJLm1zZ19pb3ZsZW4gPSBmLT5mID8gMyA6IDEsCisJfTsKKworCWlmIChzZW5kbXNnKGZkLCAmbXNnLCAwKSA8IDApIHsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc29ja2RpYWdfc2VuZChpbnQgZmFtaWx5LCBpbnQgZmQsIGludCBwcm90b2NvbCwgc3RydWN0IGZpbHRlciAqZikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfbmwgbmxhZGRyOworCURJQUdfUkVRVUVTVChyZXEsIHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyIHIpOworCWNoYXIgICAgKmJjID0gTlVMTDsKKwlpbnQJYmNsZW47CisJc3RydWN0IG1zZ2hkciBtc2c7CisJc3RydWN0IHJ0YXR0ciBydGE7CisJc3RydWN0IGlvdmVjIGlvdlszXTsKKworCWlmIChmYW1pbHkgPT0gUEZfVU5TUEVDKQorCQlyZXR1cm4gdGNwZGlhZ19zZW5kKGZkLCBwcm90b2NvbCwgZik7CisKKwltZW1zZXQoJm5sYWRkciwgMCwgc2l6ZW9mKG5sYWRkcikpOworCW5sYWRkci5ubF9mYW1pbHkgPSBBRl9ORVRMSU5LOworCisJbWVtc2V0KCZyZXEuciwgMCwgc2l6ZW9mKHJlcS5yKSk7CisJcmVxLnIuc2RpYWdfZmFtaWx5ID0gZmFtaWx5OworCXJlcS5yLnNkaWFnX3Byb3RvY29sID0gcHJvdG9jb2w7CisJcmVxLnIuaWRpYWdfc3RhdGVzID0gZi0+c3RhdGVzOworCWlmIChzaG93X21lbSkgeworCQlyZXEuci5pZGlhZ19leHQgfD0gKDE8PChJTkVUX0RJQUdfTUVNSU5GTy0xKSk7CisJCXJlcS5yLmlkaWFnX2V4dCB8PSAoMTw8KElORVRfRElBR19TS01FTUlORk8tMSkpOworCX0KKworCWlmIChzaG93X3RjcGluZm8pIHsKKwkJcmVxLnIuaWRpYWdfZXh0IHw9ICgxPDwoSU5FVF9ESUFHX0lORk8tMSkpOworCQlyZXEuci5pZGlhZ19leHQgfD0gKDE8PChJTkVUX0RJQUdfVkVHQVNJTkZPLTEpKTsKKwkJcmVxLnIuaWRpYWdfZXh0IHw9ICgxPDwoSU5FVF9ESUFHX0NPTkctMSkpOworCX0KKworCWlvdlswXSA9IChzdHJ1Y3QgaW92ZWMpeworCQkuaW92X2Jhc2UgPSAmcmVxLAorCQkuaW92X2xlbiA9IHNpemVvZihyZXEpCisJfTsKKwlpZiAoZi0+ZikgeworCQliY2xlbiA9IHNzZmlsdGVyX2J5dGVjb21waWxlKGYtPmYsICZiYyk7CisJCXJ0YS5ydGFfdHlwZSA9IElORVRfRElBR19SRVFfQllURUNPREU7CisJCXJ0YS5ydGFfbGVuID0gUlRBX0xFTkdUSChiY2xlbik7CisJCWlvdlsxXSA9IChzdHJ1Y3QgaW92ZWMpeyAmcnRhLCBzaXplb2YocnRhKSB9OworCQlpb3ZbMl0gPSAoc3RydWN0IGlvdmVjKXsgYmMsIGJjbGVuIH07CisJCXJlcS5ubGgubmxtc2dfbGVuICs9IFJUQV9MRU5HVEgoYmNsZW4pOworCX0KKworCW1zZyA9IChzdHJ1Y3QgbXNnaGRyKSB7CisJCS5tc2dfbmFtZSA9ICh2b2lkKikmbmxhZGRyLAorCQkubXNnX25hbWVsZW4gPSBzaXplb2YobmxhZGRyKSwKKwkJLm1zZ19pb3YgPSBpb3YsCisJCS5tc2dfaW92bGVuID0gZi0+ZiA/IDMgOiAxLAorCX07CisKKwlpZiAoc2VuZG1zZyhmZCwgJm1zZywgMCkgPCAwKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgaW5ldF9kaWFnX2FyZyB7CisJc3RydWN0IGZpbHRlciAqZjsKKwlpbnQgcHJvdG9jb2w7CisJc3RydWN0IHJ0bmxfaGFuZGxlICpydGg7Cit9OworCitzdGF0aWMgaW50IGtpbGxfaW5ldF9zb2NrKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqYWRkciwKKwkJc3RydWN0IG5sbXNnaGRyICpoLCB2b2lkICphcmcpCit7CisJc3RydWN0IGluZXRfZGlhZ19tc2cgKmQgPSBOTE1TR19EQVRBKGgpOworCXN0cnVjdCBpbmV0X2RpYWdfYXJnICpkaWFnX2FyZyA9IGFyZzsKKwlzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0aCA9IGRpYWdfYXJnLT5ydGg7CisJRElBR19SRVFVRVNUKHJlcSwgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgcik7CisKKwlyZXEubmxoLm5sbXNnX3R5cGUgPSBTT0NLX0RFU1RST1k7CisJcmVxLm5saC5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1QgfCBOTE1fRl9BQ0s7CisJcmVxLm5saC5ubG1zZ19zZXEgPSArK3J0aC0+c2VxOworCXJlcS5yLnNkaWFnX2ZhbWlseSA9IGQtPmlkaWFnX2ZhbWlseTsKKwlyZXEuci5zZGlhZ19wcm90b2NvbCA9IGRpYWdfYXJnLT5wcm90b2NvbDsKKwlyZXEuci5pZCA9IGQtPmlkOworCisJcmV0dXJuIHJ0bmxfdGFsayhydGgsICZyZXEubmxoLCBOVUxMLCAwKTsKK30KKworc3RhdGljIGludCBzaG93X29uZV9pbmV0X3NvY2soY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICphZGRyLAorCQlzdHJ1Y3Qgbmxtc2doZHIgKmgsIHZvaWQgKmFyZykKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBpbmV0X2RpYWdfYXJnICpkaWFnX2FyZyA9IGFyZzsKKwlzdHJ1Y3QgaW5ldF9kaWFnX21zZyAqciA9IE5MTVNHX0RBVEEoaCk7CisKKwlpZiAoIShkaWFnX2FyZy0+Zi0+ZmFtaWxpZXMgJiAoMSA8PCByLT5pZGlhZ19mYW1pbHkpKSkKKwkJcmV0dXJuIDA7CisJaWYgKGRpYWdfYXJnLT5mLT5raWxsICYmIGtpbGxfaW5ldF9zb2NrKGFkZHIsIGgsIGFyZykgIT0gMCkgeworCQlpZiAoZXJybm8gPT0gRU9QTk9UU1VQUCB8fCBlcnJubyA9PSBFTk9FTlQpIHsKKwkJCS8qIFNvY2tldCBjYW4ndCBiZSBjbG9zZWQsIG9yIGlzIGFscmVhZHkgY2xvc2VkLiAqLworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlwZXJyb3IoIlNPQ0tfREVTVFJPWSBhbnN3ZXJzIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJaWYgKChlcnIgPSBpbmV0X3Nob3dfc29jayhoLCBkaWFnX2FyZy0+ZiwgZGlhZ19hcmctPnByb3RvY29sKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5ldF9zaG93X25ldGxpbmsoc3RydWN0IGZpbHRlciAqZiwgRklMRSAqZHVtcF9mcCwgaW50IHByb3RvY29sKQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBydG5sX2hhbmRsZSBydGgsIHJ0aDI7CisJaW50IGZhbWlseSA9IFBGX0lORVQ7CisJc3RydWN0IGluZXRfZGlhZ19hcmcgYXJnID0geyAuZiA9IGYsIC5wcm90b2NvbCA9IHByb3RvY29sIH07CisKKwlpZiAocnRubF9vcGVuX2J5cHJvdG8oJnJ0aCwgMCwgTkVUTElOS19TT0NLX0RJQUcpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoZi0+a2lsbCkgeworCQlpZiAocnRubF9vcGVuX2J5cHJvdG8oJnJ0aDIsIDAsIE5FVExJTktfU09DS19ESUFHKSkgeworCQkJcnRubF9jbG9zZSgmcnRoKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlhcmcucnRoID0gJnJ0aDI7CisJfQorCisJcnRoLmR1bXAgPSBNQUdJQ19TRVE7CisJcnRoLmR1bXBfZnAgPSBkdW1wX2ZwOworCWlmIChwcmVmZXJyZWRfZmFtaWx5ID09IFBGX0lORVQ2KQorCQlmYW1pbHkgPSBQRl9JTkVUNjsKKworYWdhaW46CisJaWYgKChlcnIgPSBzb2NrZGlhZ19zZW5kKGZhbWlseSwgcnRoLmZkLCBwcm90b2NvbCwgZikpKQorCQlnb3RvIEV4aXQ7CisKKwlpZiAoKGVyciA9IHJ0bmxfZHVtcF9maWx0ZXIoJnJ0aCwgc2hvd19vbmVfaW5ldF9zb2NrLCAmYXJnKSkpIHsKKwkJaWYgKGZhbWlseSAhPSBQRl9VTlNQRUMpIHsKKwkJCWZhbWlseSA9IFBGX1VOU1BFQzsKKwkJCWdvdG8gYWdhaW47CisJCX0KKwkJZ290byBFeGl0OworCX0KKwlpZiAoZmFtaWx5ID09IFBGX0lORVQgJiYgcHJlZmVycmVkX2ZhbWlseSAhPSBQRl9JTkVUKSB7CisJCWZhbWlseSA9IFBGX0lORVQ2OworCQlnb3RvIGFnYWluOworCX0KKworRXhpdDoKKwlydG5sX2Nsb3NlKCZydGgpOworCWlmIChhcmcucnRoKQorCQlydG5sX2Nsb3NlKGFyZy5ydGgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdGNwX3Nob3dfbmV0bGlua19maWxlKHN0cnVjdCBmaWx0ZXIgKmYpCit7CisJRklMRQkqZnA7CisJY2hhcglidWZbMTYzODRdOworCisJaWYgKChmcCA9IGZvcGVuKGdldGVudigiVENQRElBR19GSUxFIiksICJyIikpID09IE5VTEwpIHsKKwkJcGVycm9yKCJmb3BlbigkVENQRElBR19GSUxFKSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJd2hpbGUgKDEpIHsKKwkJaW50IHN0YXR1cywgZXJyOworCQlzdHJ1Y3Qgbmxtc2doZHIgKmggPSAoc3RydWN0IG5sbXNnaGRyKilidWY7CisKKwkJc3RhdHVzID0gZnJlYWQoYnVmLCAxLCBzaXplb2YoKmgpLCBmcCk7CisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQlwZXJyb3IoIlJlYWRpbmcgaGVhZGVyIGZyb20gJFRDUERJQUdfRklMRSIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChzdGF0dXMgIT0gc2l6ZW9mKCpoKSkgeworCQkJcGVycm9yKCJVbmV4cGVjdGVkIEVPRiByZWFkaW5nICRUQ1BESUFHX0ZJTEUiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXN0YXR1cyA9IGZyZWFkKGgrMSwgMSwgTkxNU0dfQUxJR04oaC0+bmxtc2dfbGVuLXNpemVvZigqaCkpLCBmcCk7CisKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCXBlcnJvcigiUmVhZGluZyAkVENQRElBR19GSUxFIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKHN0YXR1cyArIHNpemVvZigqaCkgPCBoLT5ubG1zZ19sZW4pIHsKKwkJCXBlcnJvcigiVW5leHBlY3RlZCBFT0YgcmVhZGluZyAkVENQRElBR19GSUxFIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQkvKiBUaGUgb25seSBsZWdhbCBleGl0IHBvaW50ICovCisJCWlmIChoLT5ubG1zZ190eXBlID09IE5MTVNHX0RPTkUpCisJCQlyZXR1cm4gMDsKKworCQlpZiAoaC0+bmxtc2dfdHlwZSA9PSBOTE1TR19FUlJPUikgeworCQkJc3RydWN0IG5sbXNnZXJyICplcnIgPSAoc3RydWN0IG5sbXNnZXJyKilOTE1TR19EQVRBKGgpOworCQkJaWYgKGgtPm5sbXNnX2xlbiA8IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IG5sbXNnZXJyKSkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIHRydW5jYXRlZFxuIik7CisJCQl9IGVsc2UgeworCQkJCWVycm5vID0gLWVyci0+ZXJyb3I7CisJCQkJcGVycm9yKCJUQ1BESUFHIGFuc3dlcmVkIik7CisJCQl9CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQllcnIgPSBpbmV0X3Nob3dfc29jayhoLCBmLCBJUFBST1RPX1RDUCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdGNwX3Nob3coc3RydWN0IGZpbHRlciAqZiwgaW50IHNvY2t0eXBlKQoreworCUZJTEUgKmZwID0gTlVMTDsKKwljaGFyICpidWYgPSBOVUxMOworCWludCBidWZzaXplID0gNjQqMTAyNDsKKworCWlmICghZmlsdGVyX2FmX2dldChmLCBBRl9JTkVUKSAmJiAhZmlsdGVyX2FmX2dldChmLCBBRl9JTkVUNikpCisJCXJldHVybiAwOworCisJZGdfcHJvdG8gPSBUQ1BfUFJPVE87CisKKwlpZiAoZ2V0ZW52KCJUQ1BESUFHX0ZJTEUiKSkKKwkJcmV0dXJuIHRjcF9zaG93X25ldGxpbmtfZmlsZShmKTsKKworCWlmICghZ2V0ZW52KCJQUk9DX05FVF9UQ1AiKSAmJiAhZ2V0ZW52KCJQUk9DX1JPT1QiKQorCSAgICAmJiBpbmV0X3Nob3dfbmV0bGluayhmLCBOVUxMLCBzb2NrdHlwZSkgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBTaWdoLi4uIFdlIGhhdmUgdG8gcGFyc2UgL3Byb2MvbmV0L3RjcC4uLiAqLworCisKKwkvKiBFc3RpbWF0ZSBhbW91bnQgb2Ygc29ja2V0cyBhbmQgdHJ5IHRvIGFsbG9jYXRlCisJICogaHVnZSBidWZmZXIgdG8gcmVhZCBhbGwgdGhlIHRhYmxlIGF0IG9uZSByZWFkLgorCSAqIExpbWl0IGl0IGJ5IDE2TUIgdGhvdWdoLiBUaGUgYXNzdW1wdGlvbiBpczogYXMgc29vbiBhcworCSAqIGtlcm5lbCB3YXMgYWJsZSB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IE4gY29ubmVjdGlvbnMsCisJICogaXQgaXMgYWJsZSB0byBnaXZlIHVzIHNvbWUgbWVtb3J5IGZvciBzbmFwc2hvdC4KKwkgKi8KKwlpZiAoMSkgeworCQlnZXRfc2xhYnN0YXQoJnNsYWJzdGF0KTsKKworCQlpbnQgZ3Vlc3MgPSBzbGFic3RhdC5zb2NrcytzbGFic3RhdC50Y3Bfc3luczsKKwkJaWYgKGYtPnN0YXRlcyYoMTw8U1NfVElNRV9XQUlUKSkKKwkJCWd1ZXNzICs9IHNsYWJzdGF0LnRjcF90d3M7CisJCWlmIChndWVzcyA+ICgxNioxMDI0KjEwMjQpLzEyOCkKKwkJCWd1ZXNzID0gKDE2KjEwMjQqMTAyNCkvMTI4OworCQlndWVzcyAqPSAxMjg7CisJCWlmIChndWVzcyA+IGJ1ZnNpemUpCisJCQlidWZzaXplID0gZ3Vlc3M7CisJfQorCXdoaWxlIChidWZzaXplID49IDY0KjEwMjQpIHsKKwkJaWYgKChidWYgPSBtYWxsb2MoYnVmc2l6ZSkpICE9IE5VTEwpCisJCQlicmVhazsKKwkJYnVmc2l6ZSAvPSAyOworCX0KKwlpZiAoYnVmID09IE5VTEwpIHsKKwkJZXJybm8gPSBFTk9NRU07CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoZi0+ZmFtaWxpZXMgJiAoMTw8QUZfSU5FVCkpIHsKKwkJaWYgKChmcCA9IG5ldF90Y3Bfb3BlbigpKSA9PSBOVUxMKQorCQkJZ290byBvdXRlcnI7CisKKwkJc2V0YnVmZmVyKGZwLCBidWYsIGJ1ZnNpemUpOworCQlpZiAoZ2VuZXJpY19yZWNvcmRfcmVhZChmcCwgdGNwX3Nob3dfbGluZSwgZiwgQUZfSU5FVCkpCisJCQlnb3RvIG91dGVycjsKKwkJZmNsb3NlKGZwKTsKKwl9CisKKwlpZiAoKGYtPmZhbWlsaWVzICYgKDE8PEFGX0lORVQ2KSkgJiYKKwkgICAgKGZwID0gbmV0X3RjcDZfb3BlbigpKSAhPSBOVUxMKSB7CisJCXNldGJ1ZmZlcihmcCwgYnVmLCBidWZzaXplKTsKKwkJaWYgKGdlbmVyaWNfcmVjb3JkX3JlYWQoZnAsIHRjcF9zaG93X2xpbmUsIGYsIEFGX0lORVQ2KSkKKwkJCWdvdG8gb3V0ZXJyOworCQlmY2xvc2UoZnApOworCX0KKworCWZyZWUoYnVmKTsKKwlyZXR1cm4gMDsKKworb3V0ZXJyOgorCWRvIHsKKwkJaW50IHNhdmVkX2Vycm5vID0gZXJybm87CisJCWZyZWUoYnVmKTsKKwkJaWYgKGZwKQorCQkJZmNsb3NlKGZwKTsKKwkJZXJybm8gPSBzYXZlZF9lcnJubzsKKwkJcmV0dXJuIC0xOworCX0gd2hpbGUgKDApOworfQorCisKK3N0YXRpYyBpbnQgZGdyYW1fc2hvd19saW5lKGNoYXIgKmxpbmUsIGNvbnN0IHN0cnVjdCBmaWx0ZXIgKmYsIGludCBmYW1pbHkpCit7CisJc3RydWN0IHNvY2tzdGF0IHMgPSB7fTsKKwljaGFyICpsb2MsICpyZW0sICpkYXRhOworCWNoYXIgb3B0WzI1Nl07CisJaW50IG47CisKKwlpZiAocHJvY19pbmV0X3NwbGl0X2xpbmUobGluZSwgJmxvYywgJnJlbSwgJmRhdGEpKQorCQlyZXR1cm4gLTE7CisKKwlpbnQgc3RhdGUgPSAoZGF0YVsxXSA+PSAnQScpID8gKGRhdGFbMV0gLSAnQScgKyAxMCkgOiAoZGF0YVsxXSAtICcwJyk7CisJaWYgKCEoZi0+c3RhdGVzICYgKDEgPDwgc3RhdGUpKSkKKwkJcmV0dXJuIDA7CisKKwlwcm9jX3BhcnNlX2luZXRfYWRkcihsb2MsIHJlbSwgZmFtaWx5LCAmcyk7CisKKwlpZiAoZi0+ZiAmJiBydW5fc3NmaWx0ZXIoZi0+ZiwgJnMpID09IDApCisJCXJldHVybiAwOworCisJb3B0WzBdID0gMDsKKwluID0gc3NjYW5mKGRhdGEsICIleCAleDoleCAlKng6JSp4ICUqeCAlZCAlKmQgJXUgJWQgJWxseCAlW15cbl1cbiIsCisJICAgICAgICZzLnN0YXRlLCAmcy53cSwgJnMucnEsCisJICAgICAgICZzLnVpZCwgJnMuaW5vLAorCSAgICAgICAmcy5yZWZjbnQsICZzLnNrLCBvcHQpOworCisJaWYgKG4gPCA5KQorCQlvcHRbMF0gPSAwOworCisJaW5ldF9zdGF0c19wcmludCgmcywgZGdfcHJvdG8gPT0gVURQX1BST1RPID8gSVBQUk9UT19VRFAgOiAwKTsKKworCWlmIChzaG93X2RldGFpbHMgJiYgb3B0WzBdKQorCQlwcmludGYoIiBvcHQ6XCIlc1wiIiwgb3B0KTsKKworCXByaW50ZigiXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1ZHBfc2hvdyhzdHJ1Y3QgZmlsdGVyICpmKQoreworCUZJTEUgKmZwID0gTlVMTDsKKworCWlmICghZmlsdGVyX2FmX2dldChmLCBBRl9JTkVUKSAmJiAhZmlsdGVyX2FmX2dldChmLCBBRl9JTkVUNikpCisJCXJldHVybiAwOworCisJZGdfcHJvdG8gPSBVRFBfUFJPVE87CisKKwlpZiAoIWdldGVudigiUFJPQ19ORVRfVURQIikgJiYgIWdldGVudigiUFJPQ19ST09UIikKKwkgICAgJiYgaW5ldF9zaG93X25ldGxpbmsoZiwgTlVMTCwgSVBQUk9UT19VRFApID09IDApCisJCXJldHVybiAwOworCisJaWYgKGYtPmZhbWlsaWVzJigxPDxBRl9JTkVUKSkgeworCQlpZiAoKGZwID0gbmV0X3VkcF9vcGVuKCkpID09IE5VTEwpCisJCQlnb3RvIG91dGVycjsKKwkJaWYgKGdlbmVyaWNfcmVjb3JkX3JlYWQoZnAsIGRncmFtX3Nob3dfbGluZSwgZiwgQUZfSU5FVCkpCisJCQlnb3RvIG91dGVycjsKKwkJZmNsb3NlKGZwKTsKKwl9CisKKwlpZiAoKGYtPmZhbWlsaWVzJigxPDxBRl9JTkVUNikpICYmCisJICAgIChmcCA9IG5ldF91ZHA2X29wZW4oKSkgIT0gTlVMTCkgeworCQlpZiAoZ2VuZXJpY19yZWNvcmRfcmVhZChmcCwgZGdyYW1fc2hvd19saW5lLCBmLCBBRl9JTkVUNikpCisJCQlnb3RvIG91dGVycjsKKwkJZmNsb3NlKGZwKTsKKwl9CisJcmV0dXJuIDA7CisKK291dGVycjoKKwlkbyB7CisJCWludCBzYXZlZF9lcnJubyA9IGVycm5vOworCQlpZiAoZnApCisJCQlmY2xvc2UoZnApOworCQllcnJubyA9IHNhdmVkX2Vycm5vOworCQlyZXR1cm4gLTE7CisJfSB3aGlsZSAoMCk7Cit9CisKK3N0YXRpYyBpbnQgcmF3X3Nob3coc3RydWN0IGZpbHRlciAqZikKK3sKKwlGSUxFICpmcCA9IE5VTEw7CisKKwlpZiAoIWZpbHRlcl9hZl9nZXQoZiwgQUZfSU5FVCkgJiYgIWZpbHRlcl9hZl9nZXQoZiwgQUZfSU5FVDYpKQorCQlyZXR1cm4gMDsKKworCWRnX3Byb3RvID0gUkFXX1BST1RPOworCisJaWYgKGYtPmZhbWlsaWVzJigxPDxBRl9JTkVUKSkgeworCQlpZiAoKGZwID0gbmV0X3Jhd19vcGVuKCkpID09IE5VTEwpCisJCQlnb3RvIG91dGVycjsKKwkJaWYgKGdlbmVyaWNfcmVjb3JkX3JlYWQoZnAsIGRncmFtX3Nob3dfbGluZSwgZiwgQUZfSU5FVCkpCisJCQlnb3RvIG91dGVycjsKKwkJZmNsb3NlKGZwKTsKKwl9CisKKwlpZiAoKGYtPmZhbWlsaWVzJigxPDxBRl9JTkVUNikpICYmCisJICAgIChmcCA9IG5ldF9yYXc2X29wZW4oKSkgIT0gTlVMTCkgeworCQlpZiAoZ2VuZXJpY19yZWNvcmRfcmVhZChmcCwgZGdyYW1fc2hvd19saW5lLCBmLCBBRl9JTkVUNikpCisJCQlnb3RvIG91dGVycjsKKwkJZmNsb3NlKGZwKTsKKwl9CisJcmV0dXJuIDA7CisKK291dGVycjoKKwlkbyB7CisJCWludCBzYXZlZF9lcnJubyA9IGVycm5vOworCQlpZiAoZnApCisJCQlmY2xvc2UoZnApOworCQllcnJubyA9IHNhdmVkX2Vycm5vOworCQlyZXR1cm4gLTE7CisJfSB3aGlsZSAoMCk7Cit9CisKK2ludCB1bml4X3N0YXRlX21hcFtdID0geyBTU19DTE9TRSwgU1NfU1lOX1NFTlQsCisJCQkgU1NfRVNUQUJMSVNIRUQsIFNTX0NMT1NJTkcgfTsKKworI2RlZmluZSBNQVhfVU5JWF9SRU1FTUJFUiAoMTAyNCoxMDI0L3NpemVvZihzdHJ1Y3Qgc29ja3N0YXQpKQorCitzdGF0aWMgdm9pZCB1bml4X2xpc3RfZnJlZShzdHJ1Y3Qgc29ja3N0YXQgKmxpc3QpCit7CisJd2hpbGUgKGxpc3QpIHsKKwkJc3RydWN0IHNvY2tzdGF0ICpzID0gbGlzdDsKKworCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwkJZnJlZShzLT5uYW1lKTsKKwkJZnJlZShzKTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICp1bml4X25ldGlkX25hbWUoaW50IHR5cGUpCit7CisJY29uc3QgY2hhciAqbmV0aWQ7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNPQ0tfU1RSRUFNOgorCQluZXRpZCA9ICJ1X3N0ciI7CisJCWJyZWFrOworCWNhc2UgU09DS19TRVFQQUNLRVQ6CisJCW5ldGlkID0gInVfc2VxIjsKKwkJYnJlYWs7CisJY2FzZSBTT0NLX0RHUkFNOgorCWRlZmF1bHQ6CisJCW5ldGlkID0gInVfZGdyIjsKKwkJYnJlYWs7CisJfQorCXJldHVybiBuZXRpZDsKK30KKworc3RhdGljIGJvb2wgdW5peF90eXBlX3NraXAoc3RydWN0IHNvY2tzdGF0ICpzLCBzdHJ1Y3QgZmlsdGVyICpmKQoreworCWlmIChzLT50eXBlID09IFNPQ0tfU1RSRUFNICYmICEoZi0+ZGJzJigxPDxVTklYX1NUX0RCKSkpCisJCXJldHVybiB0cnVlOworCWlmIChzLT50eXBlID09IFNPQ0tfREdSQU0gJiYgIShmLT5kYnMmKDE8PFVOSVhfREdfREIpKSkKKwkJcmV0dXJuIHRydWU7CisJaWYgKHMtPnR5cGUgPT0gU09DS19TRVFQQUNLRVQgJiYgIShmLT5kYnMmKDE8PFVOSVhfU1FfREIpKSkKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCB1bml4X3VzZV9wcm9jKHZvaWQpCit7CisJcmV0dXJuIGdldGVudigiUFJPQ19ORVRfVU5JWCIpIHx8IGdldGVudigiUFJPQ19ST09UIik7Cit9CisKK3N0YXRpYyB2b2lkIHVuaXhfc3RhdHNfcHJpbnQoc3RydWN0IHNvY2tzdGF0ICpsaXN0LCBzdHJ1Y3QgZmlsdGVyICpmKQoreworCXN0cnVjdCBzb2Nrc3RhdCAqczsKKwljaGFyICpwZWVyOworCWNoYXIgKmN0eF9idWYgPSBOVUxMOworCWJvb2wgdXNlX3Byb2MgPSB1bml4X3VzZV9wcm9jKCk7CisJY2hhciBwb3J0X25hbWVbMzBdID0ge307CisKKwlmb3IgKHMgPSBsaXN0OyBzOyBzID0gcy0+bmV4dCkgeworCQlpZiAoIShmLT5zdGF0ZXMgJiAoMSA8PCBzLT5zdGF0ZSkpKQorCQkJY29udGludWU7CisJCWlmICh1bml4X3R5cGVfc2tpcChzLCBmKSkKKwkJCWNvbnRpbnVlOworCisJCXBlZXIgPSAiKiI7CisJCWlmIChzLT5wZWVyX25hbWUpCisJCQlwZWVyID0gcy0+cGVlcl9uYW1lOworCisJCWlmIChzLT5ycG9ydCAmJiB1c2VfcHJvYykgeworCQkJc3RydWN0IHNvY2tzdGF0ICpwOworCisJCQlmb3IgKHAgPSBsaXN0OyBwOyBwID0gcC0+bmV4dCkgeworCQkJCWlmIChzLT5ycG9ydCA9PSBwLT5scG9ydCkKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICghcCkgeworCQkJCXBlZXIgPSAiPyI7CisJCQl9IGVsc2UgeworCQkJCXBlZXIgPSBwLT5uYW1lID8gOiAiKiI7CisJCQl9CisJCX0KKworCQlpZiAodXNlX3Byb2MgJiYgZi0+ZikgeworCQkJc3RydWN0IHNvY2tzdGF0IHN0OworCQkJc3QubG9jYWwuZmFtaWx5ID0gQUZfVU5JWDsKKwkJCXN0LnJlbW90ZS5mYW1pbHkgPSBBRl9VTklYOworCQkJbWVtY3B5KHN0LmxvY2FsLmRhdGEsICZzLT5uYW1lLCBzaXplb2Yocy0+bmFtZSkpOworCQkJaWYgKHN0cmNtcChwZWVyLCAiKiIpID09IDApCisJCQkJbWVtc2V0KHN0LnJlbW90ZS5kYXRhLCAwLCBzaXplb2YocGVlcikpOworCQkJZWxzZQorCQkJCW1lbWNweShzdC5yZW1vdGUuZGF0YSwgJnBlZXIsIHNpemVvZihwZWVyKSk7CisJCQlpZiAocnVuX3NzZmlsdGVyKGYtPmYsICZzdCkgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCXNvY2tfc3RhdGVfcHJpbnQocywgdW5peF9uZXRpZF9uYW1lKHMtPnR5cGUpKTsKKworCQlzb2NrX2FkZHJfcHJpbnQocy0+bmFtZSA/OiAiKiIsICIgIiwKKwkJCQlpbnRfdG9fc3RyKHMtPmxwb3J0LCBwb3J0X25hbWUpLCBOVUxMKTsKKwkJc29ja19hZGRyX3ByaW50KHBlZXIsICIgIiwgaW50X3RvX3N0cihzLT5ycG9ydCwgcG9ydF9uYW1lKSwKKwkJCQlOVUxMKTsKKworCQlpZiAoc2hvd19wcm9jX2N0eCB8fCBzaG93X3NvY2tfY3R4KSB7CisJCQlpZiAoZmluZF9lbnRyeShzLT5pbm8sICZjdHhfYnVmLAorCQkJCQkoc2hvd19wcm9jX2N0eCAmIHNob3dfc29ja19jdHgpID8KKwkJCQkJUFJPQ19TT0NLX0NUWCA6IFBST0NfQ1RYKSA+IDApIHsKKwkJCQlwcmludGYoIiB1c2VyczooJXMpIiwgY3R4X2J1Zik7CisJCQkJZnJlZShjdHhfYnVmKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzaG93X3VzZXJzKSB7CisJCQlpZiAoZmluZF9lbnRyeShzLT5pbm8sICZjdHhfYnVmLCBVU0VSUykgPiAwKSB7CisJCQkJcHJpbnRmKCIgdXNlcnM6KCVzKSIsIGN0eF9idWYpOworCQkJCWZyZWUoY3R4X2J1Zik7CisJCQl9CisJCX0KKwkJcHJpbnRmKCJcbiIpOworCX0KK30KKworc3RhdGljIGludCB1bml4X3Nob3dfc29jayhjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKmFkZHIsIHN0cnVjdCBubG1zZ2hkciAqbmxoLAorCQl2b2lkICphcmcpCit7CisJc3RydWN0IGZpbHRlciAqZiA9IChzdHJ1Y3QgZmlsdGVyICopYXJnOworCXN0cnVjdCB1bml4X2RpYWdfbXNnICpyID0gTkxNU0dfREFUQShubGgpOworCXN0cnVjdCBydGF0dHIgKnRiW1VOSVhfRElBR19NQVgrMV07CisJY2hhciBuYW1lWzEyOF07CisJc3RydWN0IHNvY2tzdGF0IHN0YXQgPSB7IC5uYW1lID0gIioiLCAucGVlcl9uYW1lID0gIioiIH07CisKKwlwYXJzZV9ydGF0dHIodGIsIFVOSVhfRElBR19NQVgsIChzdHJ1Y3QgcnRhdHRyKikocisxKSwKKwkJICAgICBubGgtPm5sbXNnX2xlbiAtIE5MTVNHX0xFTkdUSChzaXplb2YoKnIpKSk7CisKKwlzdGF0LnR5cGUgID0gci0+dWRpYWdfdHlwZTsKKwlzdGF0LnN0YXRlID0gci0+dWRpYWdfc3RhdGU7CisJc3RhdC5pbm8gICA9IHN0YXQubHBvcnQgPSByLT51ZGlhZ19pbm87CisJc3RhdC5sb2NhbC5mYW1pbHkgPSBzdGF0LnJlbW90ZS5mYW1pbHkgPSBBRl9VTklYOworCisJaWYgKHVuaXhfdHlwZV9za2lwKCZzdGF0LCBmKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAodGJbVU5JWF9ESUFHX1JRTEVOXSkgeworCQlzdHJ1Y3QgdW5peF9kaWFnX3JxbGVuICpycWwgPSBSVEFfREFUQSh0YltVTklYX0RJQUdfUlFMRU5dKTsKKwkJc3RhdC5ycSA9IHJxbC0+dWRpYWdfcnF1ZXVlOworCQlzdGF0LndxID0gcnFsLT51ZGlhZ193cXVldWU7CisJfQorCWlmICh0YltVTklYX0RJQUdfTkFNRV0pIHsKKwkJaW50IGxlbiA9IFJUQV9QQVlMT0FEKHRiW1VOSVhfRElBR19OQU1FXSk7CisKKwkJbWVtY3B5KG5hbWUsIFJUQV9EQVRBKHRiW1VOSVhfRElBR19OQU1FXSksIGxlbik7CisJCW5hbWVbbGVuXSA9ICdcMCc7CisJCWlmIChuYW1lWzBdID09ICdcMCcpCisJCQluYW1lWzBdID0gJ0AnOworCQlzdGF0Lm5hbWUgPSAmbmFtZVswXTsKKwkJbWVtY3B5KHN0YXQubG9jYWwuZGF0YSwgJnN0YXQubmFtZSwgc2l6ZW9mKHN0YXQubmFtZSkpOworCX0KKwlpZiAodGJbVU5JWF9ESUFHX1BFRVJdKQorCQlzdGF0LnJwb3J0ID0gcnRhX2dldGF0dHJfdTMyKHRiW1VOSVhfRElBR19QRUVSXSk7CisKKwlpZiAoZi0+ZiAmJiBydW5fc3NmaWx0ZXIoZi0+ZiwgJnN0YXQpID09IDApCisJCXJldHVybiAwOworCisJdW5peF9zdGF0c19wcmludCgmc3RhdCwgZik7CisKKwlpZiAoc2hvd19tZW0pIHsKKwkJcHJpbnRmKCJcdCIpOworCQlwcmludF9za21lbWluZm8odGIsIFVOSVhfRElBR19NRU1JTkZPKTsKKwl9CisJaWYgKHNob3dfZGV0YWlscykgeworCQlpZiAodGJbVU5JWF9ESUFHX1NIVVRET1dOXSkgeworCQkJdW5zaWduZWQgY2hhciBtYXNrOworCQkJbWFzayA9ICooX191OCAqKVJUQV9EQVRBKHRiW1VOSVhfRElBR19TSFVURE9XTl0pOworCQkJcHJpbnRmKCIgJWMtJWMiLCBtYXNrICYgMSA/ICctJyA6ICc8JywgbWFzayAmIDIgPyAnLScgOiAnPicpOworCQl9CisJfQorCWlmIChzaG93X21lbSB8fCBzaG93X2RldGFpbHMpCisJCXByaW50ZigiXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9uZXRsaW5rX3JlcXVlc3Qoc3RydWN0IGZpbHRlciAqZiwgc3RydWN0IG5sbXNnaGRyICpyZXEsCisJCXNpemVfdCBzaXplLCBydG5sX2ZpbHRlcl90IHNob3dfb25lX3NvY2spCit7CisJaW50IHJldCA9IC0xOworCXN0cnVjdCBydG5sX2hhbmRsZSBydGg7CisKKwlpZiAocnRubF9vcGVuX2J5cHJvdG8oJnJ0aCwgMCwgTkVUTElOS19TT0NLX0RJQUcpKQorCQlyZXR1cm4gLTE7CisKKwlydGguZHVtcCA9IE1BR0lDX1NFUTsKKworCWlmIChydG5sX3NlbmQoJnJ0aCwgcmVxLCBzaXplKSA8IDApCisJCWdvdG8gRXhpdDsKKworCWlmIChydG5sX2R1bXBfZmlsdGVyKCZydGgsIHNob3dfb25lX3NvY2ssIGYpKQorCQlnb3RvIEV4aXQ7CisKKwlyZXQgPSAwOworRXhpdDoKKwlydG5sX2Nsb3NlKCZydGgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdW5peF9zaG93X25ldGxpbmsoc3RydWN0IGZpbHRlciAqZikKK3sKKwlESUFHX1JFUVVFU1QocmVxLCBzdHJ1Y3QgdW5peF9kaWFnX3JlcSByKTsKKworCXJlcS5yLnNkaWFnX2ZhbWlseSA9IEFGX1VOSVg7CisJcmVxLnIudWRpYWdfc3RhdGVzID0gZi0+c3RhdGVzOworCXJlcS5yLnVkaWFnX3Nob3cgPSBVRElBR19TSE9XX05BTUUgfCBVRElBR19TSE9XX1BFRVIgfCBVRElBR19TSE9XX1JRTEVOOworCWlmIChzaG93X21lbSkKKwkJcmVxLnIudWRpYWdfc2hvdyB8PSBVRElBR19TSE9XX01FTUlORk87CisKKwlyZXR1cm4gaGFuZGxlX25ldGxpbmtfcmVxdWVzdChmLCAmcmVxLm5saCwgc2l6ZW9mKHJlcSksIHVuaXhfc2hvd19zb2NrKTsKK30KKworc3RhdGljIGludCB1bml4X3Nob3coc3RydWN0IGZpbHRlciAqZikKK3sKKwlGSUxFICpmcDsKKwljaGFyIGJ1ZlsyNTZdOworCWNoYXIgbmFtZVsxMjhdOworCWludCAgbmV3Zm9ybWF0ID0gMDsKKwlpbnQgIGNudDsKKwlzdHJ1Y3Qgc29ja3N0YXQgKmxpc3QgPSBOVUxMOworCisJaWYgKCFmaWx0ZXJfYWZfZ2V0KGYsIEFGX1VOSVgpKQorCQlyZXR1cm4gMDsKKworCWlmICghdW5peF91c2VfcHJvYygpICYmIHVuaXhfc2hvd19uZXRsaW5rKGYpID09IDApCisJCXJldHVybiAwOworCisJaWYgKChmcCA9IG5ldF91bml4X29wZW4oKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCWlmICghZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApKSB7CisJCWZjbG9zZShmcCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAobWVtY21wKGJ1ZiwgIlBlZXIiLCA0KSA9PSAwKQorCQluZXdmb3JtYXQgPSAxOworCWNudCA9IDA7CisKKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApKSB7CisJCXN0cnVjdCBzb2Nrc3RhdCAqdSwgKippbnNwOworCQlpbnQgZmxhZ3M7CisKKwkJaWYgKCEodSA9IGNhbGxvYygxLCBzaXplb2YoKnUpKSkpCisJCQlicmVhazsKKwkJdS0+bmFtZSA9IE5VTEw7CisJCXUtPnBlZXJfbmFtZSA9IE5VTEw7CisKKwkJaWYgKHNzY2FuZihidWYsICIleDogJXggJXggJXggJXggJXggJWQgJXMiLAorCQkJICAgJnUtPnJwb3J0LCAmdS0+cnEsICZ1LT53cSwgJmZsYWdzLCAmdS0+dHlwZSwKKwkJCSAgICZ1LT5zdGF0ZSwgJnUtPmlubywgbmFtZSkgPCA4KQorCQkJbmFtZVswXSA9IDA7CisKKwkJdS0+bHBvcnQgPSB1LT5pbm87CisJCXUtPmxvY2FsLmZhbWlseSA9IHUtPnJlbW90ZS5mYW1pbHkgPSBBRl9VTklYOworCisJCWlmIChmbGFncyAmICgxIDw8IDE2KSkgeworCQkJdS0+c3RhdGUgPSBTU19MSVNURU47CisJCX0gZWxzZSB7CisJCQl1LT5zdGF0ZSA9IHVuaXhfc3RhdGVfbWFwW3UtPnN0YXRlLTFdOworCQkJaWYgKHUtPnR5cGUgPT0gU09DS19ER1JBTSAmJiB1LT5zdGF0ZSA9PSBTU19DTE9TRSAmJiB1LT5ycG9ydCkKKwkJCQl1LT5zdGF0ZSA9IFNTX0VTVEFCTElTSEVEOworCQl9CisKKwkJaWYgKCFuZXdmb3JtYXQpIHsKKwkJCXUtPnJwb3J0ID0gMDsKKwkJCXUtPnJxID0gMDsKKwkJCXUtPndxID0gMDsKKwkJfQorCisJCWluc3AgPSAmbGlzdDsKKwkJd2hpbGUgKCppbnNwKSB7CisJCQlpZiAodS0+dHlwZSA8ICgqaW5zcCktPnR5cGUgfHwKKwkJCSAgICAodS0+dHlwZSA9PSAoKmluc3ApLT50eXBlICYmCisJCQkgICAgIHUtPmlubyA8ICgqaW5zcCktPmlubykpCisJCQkJYnJlYWs7CisJCQlpbnNwID0gJigqaW5zcCktPm5leHQ7CisJCX0KKwkJdS0+bmV4dCA9ICppbnNwOworCQkqaW5zcCA9IHU7CisKKwkJaWYgKG5hbWVbMF0pIHsKKwkJCWlmICgodS0+bmFtZSA9IG1hbGxvYyhzdHJsZW4obmFtZSkrMSkpID09IE5VTEwpCisJCQkJYnJlYWs7CisJCQlzdHJjcHkodS0+bmFtZSwgbmFtZSk7CisJCX0KKwkJaWYgKCsrY250ID4gTUFYX1VOSVhfUkVNRU1CRVIpIHsKKwkJCXVuaXhfc3RhdHNfcHJpbnQobGlzdCwgZik7CisJCQl1bml4X2xpc3RfZnJlZShsaXN0KTsKKwkJCWxpc3QgPSBOVUxMOworCQkJY250ID0gMDsKKwkJfQorCX0KKwlmY2xvc2UoZnApOworCWlmIChsaXN0KSB7CisJCXVuaXhfc3RhdHNfcHJpbnQobGlzdCwgZik7CisJCXVuaXhfbGlzdF9mcmVlKGxpc3QpOworCQlsaXN0ID0gTlVMTDsKKwkJY250ID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYWNrZXRfc3RhdHNfcHJpbnQoc3RydWN0IHNvY2tzdGF0ICpzLCBjb25zdCBzdHJ1Y3QgZmlsdGVyICpmKQoreworCWNoYXIgKmJ1ZiA9IE5VTEw7CisJY29uc3QgY2hhciAqYWRkciwgKnBvcnQ7CisJY2hhciBsbF9uYW1lWzE2XTsKKworCWlmIChmLT5mKSB7CisJCXMtPmxvY2FsLmZhbWlseSA9IEFGX1BBQ0tFVDsKKwkJcy0+cmVtb3RlLmZhbWlseSA9IEFGX1BBQ0tFVDsKKwkJcy0+bG9jYWwuZGF0YVswXSA9IHMtPnByb3Q7CisJCWlmIChydW5fc3NmaWx0ZXIoZi0+ZiwgcykgPT0gMCkKKwkJCXJldHVybiAxOworCX0KKworCXNvY2tfc3RhdGVfcHJpbnQocywgcy0+dHlwZSA9PSBTT0NLX1JBVyA/ICJwX3JhdyIgOiAicF9kZ3IiKTsKKworCWlmIChzLT5wcm90ID09IDMpCisJCWFkZHIgPSAiKiI7CisJZWxzZQorCQlhZGRyID0gbGxfcHJvdG9fbjJhKGh0b25zKHMtPnByb3QpLCBsbF9uYW1lLCBzaXplb2YobGxfbmFtZSkpOworCisJaWYgKHMtPmlmYWNlID09IDApCisJCXBvcnQgPSAiKiI7CisJZWxzZQorCQlwb3J0ID0geGxsX2luZGV4X3RvX25hbWUocy0+aWZhY2UpOworCisJc29ja19hZGRyX3ByaW50KGFkZHIsICI6IiwgcG9ydCwgTlVMTCk7CisJc29ja19hZGRyX3ByaW50KCIiLCAiKiIsICIiLCBOVUxMKTsKKworCWlmIChzaG93X3Byb2NfY3R4IHx8IHNob3dfc29ja19jdHgpIHsKKwkJaWYgKGZpbmRfZW50cnkocy0+aW5vLCAmYnVmLAorCQkJCQkoc2hvd19wcm9jX2N0eCAmIHNob3dfc29ja19jdHgpID8KKwkJCQkJUFJPQ19TT0NLX0NUWCA6IFBST0NfQ1RYKSA+IDApIHsKKwkJCXByaW50ZigiIHVzZXJzOiglcykiLCBidWYpOworCQkJZnJlZShidWYpOworCQl9CisJfSBlbHNlIGlmIChzaG93X3VzZXJzKSB7CisJCWlmIChmaW5kX2VudHJ5KHMtPmlubywgJmJ1ZiwgVVNFUlMpID4gMCkgeworCQkJcHJpbnRmKCIgdXNlcnM6KCVzKSIsIGJ1Zik7CisJCQlmcmVlKGJ1Zik7CisJCX0KKwl9CisKKwlpZiAoc2hvd19kZXRhaWxzKQorCQlzb2NrX2RldGFpbHNfcHJpbnQocyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGFja2V0X3Nob3dfcmluZyhzdHJ1Y3QgcGFja2V0X2RpYWdfcmluZyAqcmluZykKK3sKKwlwcmludGYoImJsa19zaXplOiVkIiwgcmluZy0+cGRyX2Jsb2NrX3NpemUpOworCXByaW50ZigiLGJsa19ucjolZCIsIHJpbmctPnBkcl9ibG9ja19ucik7CisJcHJpbnRmKCIsZnJtX3NpemU6JWQiLCByaW5nLT5wZHJfZnJhbWVfc2l6ZSk7CisJcHJpbnRmKCIsZnJtX25yOiVkIiwgcmluZy0+cGRyX2ZyYW1lX25yKTsKKwlwcmludGYoIix0bW86JWQiLCByaW5nLT5wZHJfcmV0aXJlX3Rtbyk7CisJcHJpbnRmKCIsZmVhdHVyZXM6MHgleCIsIHJpbmctPnBkcl9mZWF0dXJlcyk7Cit9CisKK3N0YXRpYyBpbnQgcGFja2V0X3Nob3dfc29jayhjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKmFkZHIsCisJCXN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpCit7CisJY29uc3Qgc3RydWN0IGZpbHRlciAqZiA9IGFyZzsKKwlzdHJ1Y3QgcGFja2V0X2RpYWdfbXNnICpyID0gTkxNU0dfREFUQShubGgpOworCXN0cnVjdCBwYWNrZXRfZGlhZ19pbmZvICpwaW5mbyA9IE5VTEw7CisJc3RydWN0IHBhY2tldF9kaWFnX3JpbmcgKnJpbmdfcnggPSBOVUxMLCAqcmluZ190eCA9IE5VTEw7CisJc3RydWN0IHJ0YXR0ciAqdGJbUEFDS0VUX0RJQUdfTUFYKzFdOworCXN0cnVjdCBzb2Nrc3RhdCBzdGF0ID0ge307CisJdWludDMyX3QgZmFub3V0ID0gMDsKKwlib29sIGhhc19mYW5vdXQgPSBmYWxzZTsKKworCXBhcnNlX3J0YXR0cih0YiwgUEFDS0VUX0RJQUdfTUFYLCAoc3RydWN0IHJ0YXR0ciopKHIrMSksCisJCSAgICAgbmxoLT5ubG1zZ19sZW4gLSBOTE1TR19MRU5HVEgoc2l6ZW9mKCpyKSkpOworCisJLyogdXNlIC9wcm9jL25ldC9wYWNrZXQgaWYgYWxsIGluZm8gYXJlIG5vdCBhdmFpbGFibGUgKi8KKwlpZiAoIXRiW1BBQ0tFVF9ESUFHX01FTUlORk9dKQorCQlyZXR1cm4gLTE7CisKKwlzdGF0LnR5cGUgICA9IHItPnBkaWFnX3R5cGU7CisJc3RhdC5wcm90ICAgPSByLT5wZGlhZ19udW07CisJc3RhdC5pbm8gICAgPSByLT5wZGlhZ19pbm87CisJc3RhdC5zdGF0ZSAgPSBTU19DTE9TRTsKKwlzdGF0LnNrCSAgICA9IGNvb2tpZV9za19nZXQoJnItPnBkaWFnX2Nvb2tpZVswXSk7CisKKwlpZiAodGJbUEFDS0VUX0RJQUdfTUVNSU5GT10pIHsKKwkJX191MzIgKnNrbWVtaW5mbyA9IFJUQV9EQVRBKHRiW1BBQ0tFVF9ESUFHX01FTUlORk9dKTsKKwkJc3RhdC5ycSA9IHNrbWVtaW5mb1tTS19NRU1JTkZPX1JNRU1fQUxMT0NdOworCX0KKworCWlmICh0YltQQUNLRVRfRElBR19JTkZPXSkgeworCQlwaW5mbyA9IFJUQV9EQVRBKHRiW1BBQ0tFVF9ESUFHX0lORk9dKTsKKwkJc3RhdC5scG9ydCA9IHN0YXQuaWZhY2UgPSBwaW5mby0+cGRpX2luZGV4OworCX0KKworCWlmICh0YltQQUNLRVRfRElBR19VSURdKQorCQlzdGF0LnVpZCA9ICooX191MzIgKilSVEFfREFUQSh0YltQQUNLRVRfRElBR19VSURdKTsKKworCWlmICh0YltQQUNLRVRfRElBR19SWF9SSU5HXSkKKwkJcmluZ19yeCA9IFJUQV9EQVRBKHRiW1BBQ0tFVF9ESUFHX1JYX1JJTkddKTsKKworCWlmICh0YltQQUNLRVRfRElBR19UWF9SSU5HXSkKKwkJcmluZ190eCA9IFJUQV9EQVRBKHRiW1BBQ0tFVF9ESUFHX1RYX1JJTkddKTsKKworCWlmICh0YltQQUNLRVRfRElBR19GQU5PVVRdKSB7CisJCWhhc19mYW5vdXQgPSB0cnVlOworCQlmYW5vdXQgPSAqKHVpbnQzMl90ICopUlRBX0RBVEEodGJbUEFDS0VUX0RJQUdfRkFOT1VUXSk7CisJfQorCisJaWYgKHBhY2tldF9zdGF0c19wcmludCgmc3RhdCwgZikpCisJCXJldHVybiAwOworCisJaWYgKHNob3dfZGV0YWlscykgeworCQlpZiAocGluZm8pIHsKKwkJCXByaW50ZigiXG5cdHZlcjolZCIsIHBpbmZvLT5wZGlfdmVyc2lvbik7CisJCQlwcmludGYoIiBjcHlfdGhyZXNoOiVkIiwgcGluZm8tPnBkaV9jb3B5X3RocmVzaCk7CisJCQlwcmludGYoIiBmbGFncyggIik7CisJCQlpZiAocGluZm8tPnBkaV9mbGFncyAmIFBESV9SVU5OSU5HKQorCQkJCXByaW50ZigicnVubmluZyIpOworCQkJaWYgKHBpbmZvLT5wZGlfZmxhZ3MgJiBQRElfQVVYREFUQSkKKwkJCQlwcmludGYoIiBhdXhkYXRhIik7CisJCQlpZiAocGluZm8tPnBkaV9mbGFncyAmIFBESV9PUklHREVWKQorCQkJCXByaW50ZigiIG9yaWdkZXYiKTsKKwkJCWlmIChwaW5mby0+cGRpX2ZsYWdzICYgUERJX1ZORVRIRFIpCisJCQkJcHJpbnRmKCIgdm5ldGhkciIpOworCQkJaWYgKHBpbmZvLT5wZGlfZmxhZ3MgJiBQRElfTE9TUykKKwkJCQlwcmludGYoIiBsb3NzIik7CisJCQlpZiAoIXBpbmZvLT5wZGlfZmxhZ3MpCisJCQkJcHJpbnRmKCIwIik7CisJCQlwcmludGYoIiApIik7CisJCX0KKwkJaWYgKHJpbmdfcngpIHsKKwkJCXByaW50ZigiXG5cdHJpbmdfcngoIik7CisJCQlwYWNrZXRfc2hvd19yaW5nKHJpbmdfcngpOworCQkJcHJpbnRmKCIpIik7CisJCX0KKwkJaWYgKHJpbmdfdHgpIHsKKwkJCXByaW50ZigiXG5cdHJpbmdfdHgoIik7CisJCQlwYWNrZXRfc2hvd19yaW5nKHJpbmdfdHgpOworCQkJcHJpbnRmKCIpIik7CisJCX0KKwkJaWYgKGhhc19mYW5vdXQpIHsKKwkJCXVpbnQxNl90IHR5cGUgPSAoZmFub3V0ID4+IDE2KSAmIDB4ZmZmZjsKKworCQkJcHJpbnRmKCJcblx0ZmFub3V0KCIpOworCQkJcHJpbnRmKCJpZDolZCwiLCBmYW5vdXQgJiAweGZmZmYpOworCQkJcHJpbnRmKCJ0eXBlOiIpOworCisJCQlpZiAodHlwZSA9PSAwKQorCQkJCXByaW50ZigiaGFzaCIpOworCQkJZWxzZSBpZiAodHlwZSA9PSAxKQorCQkJCXByaW50ZigibGIiKTsKKwkJCWVsc2UgaWYgKHR5cGUgPT0gMikKKwkJCQlwcmludGYoImNwdSIpOworCQkJZWxzZSBpZiAodHlwZSA9PSAzKQorCQkJCXByaW50Zigicm9sbCIpOworCQkJZWxzZSBpZiAodHlwZSA9PSA0KQorCQkJCXByaW50ZigicmFuZG9tIik7CisJCQllbHNlIGlmICh0eXBlID09IDUpCisJCQkJcHJpbnRmKCJxbSIpOworCQkJZWxzZQorCQkJCXByaW50ZigiMHgleCIsIHR5cGUpOworCisJCQlwcmludGYoIikiKTsKKwkJfQorCX0KKworCWlmIChzaG93X2JwZiAmJiB0YltQQUNLRVRfRElBR19GSUxURVJdKSB7CisJCXN0cnVjdCBzb2NrX2ZpbHRlciAqZmlsID0KKwkJICAgICAgIFJUQV9EQVRBKHRiW1BBQ0tFVF9ESUFHX0ZJTFRFUl0pOworCQlpbnQgbnVtID0gUlRBX1BBWUxPQUQodGJbUEFDS0VUX0RJQUdfRklMVEVSXSkgLworCQkJICBzaXplb2Yoc3RydWN0IHNvY2tfZmlsdGVyKTsKKworCQlwcmludGYoIlxuXHRicGYgZmlsdGVyICglZCk6ICIsIG51bSk7CisJCXdoaWxlIChudW0pIHsKKwkJCXByaW50ZigiIDB4JTAyeCAldSAldSAldSwiLAorCQkJICAgICAgZmlsLT5jb2RlLCBmaWwtPmp0LCBmaWwtPmpmLCBmaWwtPmspOworCQkJbnVtLS07CisJCQlmaWwrKzsKKwkJfQorCX0KKwlwcmludGYoIlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFja2V0X3Nob3dfbmV0bGluayhzdHJ1Y3QgZmlsdGVyICpmKQoreworCURJQUdfUkVRVUVTVChyZXEsIHN0cnVjdCBwYWNrZXRfZGlhZ19yZXEgcik7CisKKwlyZXEuci5zZGlhZ19mYW1pbHkgPSBBRl9QQUNLRVQ7CisJcmVxLnIucGRpYWdfc2hvdyA9IFBBQ0tFVF9TSE9XX0lORk8gfCBQQUNLRVRfU0hPV19NRU1JTkZPIHwKKwkJUEFDS0VUX1NIT1dfRklMVEVSIHwgUEFDS0VUX1NIT1dfUklOR19DRkcgfCBQQUNLRVRfU0hPV19GQU5PVVQ7CisKKwlyZXR1cm4gaGFuZGxlX25ldGxpbmtfcmVxdWVzdChmLCAmcmVxLm5saCwgc2l6ZW9mKHJlcSksIHBhY2tldF9zaG93X3NvY2spOworfQorCitzdGF0aWMgaW50IHBhY2tldF9zaG93X2xpbmUoY2hhciAqYnVmLCBjb25zdCBzdHJ1Y3QgZmlsdGVyICpmLCBpbnQgZmFtKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBzazsKKwlzdHJ1Y3Qgc29ja3N0YXQgc3RhdCA9IHt9OworCWludCB0eXBlLCBwcm90LCBpZmFjZSwgc3RhdGUsIHJxLCB1aWQsIGlubzsKKworCXNzY2FuZihidWYsICIlbGx4ICUqZCAlZCAleCAlZCAlZCAldSAldSAldSIsCisJCQkmc2ssCisJCQkmdHlwZSwgJnByb3QsICZpZmFjZSwgJnN0YXRlLAorCQkJJnJxLCAmdWlkLCAmaW5vKTsKKworCWlmIChzdGF0LnR5cGUgPT0gU09DS19SQVcgJiYgIShmLT5kYnMmKDE8PFBBQ0tFVF9SX0RCKSkpCisJCXJldHVybiAwOworCWlmIChzdGF0LnR5cGUgPT0gU09DS19ER1JBTSAmJiAhKGYtPmRicyYoMTw8UEFDS0VUX0RHX0RCKSkpCisJCXJldHVybiAwOworCisJc3RhdC50eXBlICA9IHR5cGU7CisJc3RhdC5wcm90ICA9IHByb3Q7CisJc3RhdC5scG9ydCA9IHN0YXQuaWZhY2UgPSBpZmFjZTsKKwlzdGF0LnN0YXRlID0gc3RhdGU7CisJc3RhdC5ycSAgICA9IHJxOworCXN0YXQudWlkICAgPSB1aWQ7CisJc3RhdC5pbm8gICA9IGlubzsKKwlzdGF0LnN0YXRlID0gU1NfQ0xPU0U7CisKKwlpZiAocGFja2V0X3N0YXRzX3ByaW50KCZzdGF0LCBmKSkKKwkJcmV0dXJuIDA7CisKKwlwcmludGYoIlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFja2V0X3Nob3coc3RydWN0IGZpbHRlciAqZikKK3sKKwlGSUxFICpmcDsKKwlpbnQgcmMgPSAwOworCisJaWYgKCFmaWx0ZXJfYWZfZ2V0KGYsIEFGX1BBQ0tFVCkgfHwgIShmLT5zdGF0ZXMgJiAoMSA8PCBTU19DTE9TRSkpKQorCQlyZXR1cm4gMDsKKworCWlmICghZ2V0ZW52KCJQUk9DX05FVF9QQUNLRVQiKSAmJiAhZ2V0ZW52KCJQUk9DX1JPT1QiKSAmJgorCQkJcGFja2V0X3Nob3dfbmV0bGluayhmKSA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmICgoZnAgPSBuZXRfcGFja2V0X29wZW4oKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCWlmIChnZW5lcmljX3JlY29yZF9yZWFkKGZwLCBwYWNrZXRfc2hvd19saW5lLCBmLCBBRl9QQUNLRVQpKQorCQlyYyA9IC0xOworCisJZmNsb3NlKGZwKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbmV0bGlua19zaG93X29uZShzdHJ1Y3QgZmlsdGVyICpmLAorCQkJCWludCBwcm90LCBpbnQgcGlkLCB1bnNpZ25lZCBncm91cHMsCisJCQkJaW50IHN0YXRlLCBpbnQgZHN0X3BpZCwgdW5zaWduZWQgZHN0X2dyb3VwLAorCQkJCWludCBycSwgaW50IHdxLAorCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyBzaywgdW5zaWduZWQgbG9uZyBsb25nIGNiKQoreworCXN0cnVjdCBzb2Nrc3RhdCBzdDsKKwlTUFJJTlRfQlVGKHByb3RfYnVmKSA9IHt9OworCWNvbnN0IGNoYXIgKnByb3RfbmFtZTsKKwljaGFyIHByb2NuYW1lWzY0XSA9IHt9OworCisJc3Quc3RhdGUgPSBTU19DTE9TRTsKKwlzdC5ycQkgPSBycTsKKwlzdC53cQkgPSB3cTsKKworCWlmIChmLT5mKSB7CisJCXN0LmxvY2FsLmZhbWlseSA9IEFGX05FVExJTks7CisJCXN0LnJlbW90ZS5mYW1pbHkgPSBBRl9ORVRMSU5LOworCQlzdC5ycG9ydCA9IC0xOworCQlzdC5scG9ydCA9IHBpZDsKKwkJc3QubG9jYWwuZGF0YVswXSA9IHByb3Q7CisJCWlmIChydW5fc3NmaWx0ZXIoZi0+ZiwgJnN0KSA9PSAwKQorCQkJcmV0dXJuIDE7CisJfQorCisJc29ja19zdGF0ZV9wcmludCgmc3QsICJubCIpOworCisJaWYgKHJlc29sdmVfc2VydmljZXMpCisJCXByb3RfbmFtZSA9IG5sX3Byb3RvX24yYShwcm90LCBwcm90X2J1Ziwgc2l6ZW9mKHByb3RfYnVmKSk7CisJZWxzZQorCQlwcm90X25hbWUgPSBpbnRfdG9fc3RyKHByb3QsIHByb3RfYnVmKTsKKworCWlmIChwaWQgPT0gLTEpIHsKKwkJcHJvY25hbWVbMF0gPSAnKic7CisJfSBlbHNlIGlmIChyZXNvbHZlX3NlcnZpY2VzKSB7CisJCWludCBkb25lID0gMDsKKwkJaWYgKCFwaWQpIHsKKwkJCWRvbmUgPSAxOworCQkJc3RybmNweShwcm9jbmFtZSwgImtlcm5lbCIsIDYpOworCQl9IGVsc2UgaWYgKHBpZCA+IDApIHsKKwkJCUZJTEUgKmZwOworCQkJc25wcmludGYocHJvY25hbWUsIHNpemVvZihwcm9jbmFtZSksICIlcy8lZC9zdGF0IiwKKwkJCQlnZXRlbnYoIlBST0NfUk9PVCIpID8gOiAiL3Byb2MiLCBwaWQpOworCQkJaWYgKChmcCA9IGZvcGVuKHByb2NuYW1lLCAiciIpKSAhPSBOVUxMKSB7CisJCQkJaWYgKGZzY2FuZihmcCwgIiUqZCAoJVteKV0pIiwgcHJvY25hbWUpID09IDEpIHsKKwkJCQkJc25wcmludGYocHJvY25hbWUrc3RybGVuKHByb2NuYW1lKSwKKwkJCQkJCXNpemVvZihwcm9jbmFtZSktc3RybGVuKHByb2NuYW1lKSwKKwkJCQkJCSIvJWQiLCBwaWQpOworCQkJCQlkb25lID0gMTsKKwkJCQl9CisJCQkJZmNsb3NlKGZwKTsKKwkJCX0KKwkJfQorCQlpZiAoIWRvbmUpCisJCQlpbnRfdG9fc3RyKHBpZCwgcHJvY25hbWUpOworCX0gZWxzZSB7CisJCWludF90b19zdHIocGlkLCBwcm9jbmFtZSk7CisJfQorCisJc29ja19hZGRyX3ByaW50KHByb3RfbmFtZSwgIjoiLCBwcm9jbmFtZSwgTlVMTCk7CisKKwlpZiAoc3RhdGUgPT0gTkVUTElOS19DT05ORUNURUQpIHsKKwkJY2hhciBkc3RfZ3JvdXBfYnVmWzMwXTsKKwkJY2hhciBkc3RfcGlkX2J1ZlszMF07CisJCXNvY2tfYWRkcl9wcmludChpbnRfdG9fc3RyKGRzdF9ncm91cCwgZHN0X2dyb3VwX2J1ZiksICI6IiwKKwkJCQlpbnRfdG9fc3RyKGRzdF9waWQsIGRzdF9waWRfYnVmKSwgTlVMTCk7CisJfSBlbHNlIHsKKwkJc29ja19hZGRyX3ByaW50KCIiLCAiKiIsICIiLCBOVUxMKTsKKwl9CisKKwljaGFyICpwaWRfY29udGV4dCA9IE5VTEw7CisJaWYgKHNob3dfcHJvY19jdHgpIHsKKwkJLyogVGhlIHBpZCB2YWx1ZSB3aWxsIGVpdGhlciBiZToKKwkJICogICAwIGlmIGRlc3RpbmF0aW9uIGtlcm5lbCAtIHNob3cga2VybmVsIGluaXRpYWwgY29udGV4dC4KKwkJICogICBBIHZhbGlkIHByb2Nlc3MgcGlkIC0gdXNlIGdldHBpZGNvbi4KKwkJICogICBBIHVuaXF1ZSB2YWx1ZSBhbGxvY2F0ZWQgYnkgdGhlIGtlcm5lbCBvciBuZXRsaW5rIHVzZXIKKwkJICogICB0byB0aGUgcHJvY2VzcyAtIHNob3cgY29udGV4dCBhcyAibm90IGF2YWlsYWJsZSIuCisJCSAqLworCQlpZiAoIXBpZCkKKwkJCXNlY3VyaXR5X2dldF9pbml0aWFsX2NvbnRleHQoImtlcm5lbCIsICZwaWRfY29udGV4dCk7CisJCWVsc2UgaWYgKHBpZCA+IDApCisJCQlnZXRwaWRjb24ocGlkLCAmcGlkX2NvbnRleHQpOworCisJCWlmIChwaWRfY29udGV4dCAhPSBOVUxMKSB7CisJCQlwcmludGYoInByb2NfY3R4PSUtKnMgIiwgc2Vydl93aWR0aCwgcGlkX2NvbnRleHQpOworCQkJZnJlZShwaWRfY29udGV4dCk7CisJCX0gZWxzZSB7CisJCQlwcmludGYoInByb2NfY3R4PSUtKnMgIiwgc2Vydl93aWR0aCwgInVuYXZhaWxhYmxlIik7CisJCX0KKwl9CisKKwlpZiAoc2hvd19kZXRhaWxzKSB7CisJCXByaW50ZigiIHNrPSVsbHggY2I9JWxseCBncm91cHM9MHglMDh4Iiwgc2ssIGNiLCBncm91cHMpOworCX0KKwlwcmludGYoIlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXRsaW5rX3Nob3dfc29jayhjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKmFkZHIsCisJCXN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpCit7CisJc3RydWN0IGZpbHRlciAqZiA9IChzdHJ1Y3QgZmlsdGVyICopYXJnOworCXN0cnVjdCBuZXRsaW5rX2RpYWdfbXNnICpyID0gTkxNU0dfREFUQShubGgpOworCXN0cnVjdCBydGF0dHIgKnRiW05FVExJTktfRElBR19NQVgrMV07CisJaW50IHJxID0gMCwgd3EgPSAwOworCXVuc2lnbmVkIGxvbmcgZ3JvdXBzID0gMDsKKworCXBhcnNlX3J0YXR0cih0YiwgTkVUTElOS19ESUFHX01BWCwgKHN0cnVjdCBydGF0dHIqKShyKzEpLAorCQkgICAgIG5saC0+bmxtc2dfbGVuIC0gTkxNU0dfTEVOR1RIKHNpemVvZigqcikpKTsKKworCWlmICh0YltORVRMSU5LX0RJQUdfR1JPVVBTXSAmJiBSVEFfUEFZTE9BRCh0YltORVRMSU5LX0RJQUdfR1JPVVBTXSkpCisJCWdyb3VwcyA9ICoodW5zaWduZWQgbG9uZyAqKSBSVEFfREFUQSh0YltORVRMSU5LX0RJQUdfR1JPVVBTXSk7CisKKwlpZiAodGJbTkVUTElOS19ESUFHX01FTUlORk9dKSB7CisJCWNvbnN0IF9fdTMyICpza21lbWluZm87CisJCXNrbWVtaW5mbyA9IFJUQV9EQVRBKHRiW05FVExJTktfRElBR19NRU1JTkZPXSk7CisKKwkJcnEgPSBza21lbWluZm9bU0tfTUVNSU5GT19STUVNX0FMTE9DXTsKKwkJd3EgPSBza21lbWluZm9bU0tfTUVNSU5GT19XTUVNX0FMTE9DXTsKKwl9CisKKwlpZiAobmV0bGlua19zaG93X29uZShmLCByLT5uZGlhZ19wcm90b2NvbCwgci0+bmRpYWdfcG9ydGlkLCBncm91cHMsCisJCQkgci0+bmRpYWdfc3RhdGUsIHItPm5kaWFnX2RzdF9wb3J0aWQsIHItPm5kaWFnX2RzdF9ncm91cCwKKwkJCSBycSwgd3EsIDAsIDApKSB7CisJCXJldHVybiAwOworCX0KKworCWlmIChzaG93X21lbSkgeworCQlwcmludGYoIlx0Iik7CisJCXByaW50X3NrbWVtaW5mbyh0YiwgTkVUTElOS19ESUFHX01FTUlORk8pOworCQlwcmludGYoIlxuIik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmV0bGlua19zaG93X25ldGxpbmsoc3RydWN0IGZpbHRlciAqZikKK3sKKwlESUFHX1JFUVVFU1QocmVxLCBzdHJ1Y3QgbmV0bGlua19kaWFnX3JlcSByKTsKKworCXJlcS5yLnNkaWFnX2ZhbWlseSA9IEFGX05FVExJTks7CisJcmVxLnIuc2RpYWdfcHJvdG9jb2wgPSBORElBR19QUk9UT19BTEw7CisJcmVxLnIubmRpYWdfc2hvdyA9IE5ESUFHX1NIT1dfR1JPVVBTIHwgTkRJQUdfU0hPV19NRU1JTkZPOworCisJcmV0dXJuIGhhbmRsZV9uZXRsaW5rX3JlcXVlc3QoZiwgJnJlcS5ubGgsIHNpemVvZihyZXEpLCBuZXRsaW5rX3Nob3dfc29jayk7Cit9CisKK3N0YXRpYyBpbnQgbmV0bGlua19zaG93KHN0cnVjdCBmaWx0ZXIgKmYpCit7CisJRklMRSAqZnA7CisJY2hhciBidWZbMjU2XTsKKwlpbnQgcHJvdCwgcGlkOworCXVuc2lnbmVkIGdyb3VwczsKKwlpbnQgcnEsIHdxLCByYzsKKwl1bnNpZ25lZCBsb25nIGxvbmcgc2ssIGNiOworCisJaWYgKCFmaWx0ZXJfYWZfZ2V0KGYsIEFGX05FVExJTkspIHx8ICEoZi0+c3RhdGVzICYgKDEgPDwgU1NfQ0xPU0UpKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWdldGVudigiUFJPQ19ORVRfTkVUTElOSyIpICYmICFnZXRlbnYoIlBST0NfUk9PVCIpICYmCisJCW5ldGxpbmtfc2hvd19uZXRsaW5rKGYpID09IDApCisJCXJldHVybiAwOworCisJaWYgKChmcCA9IG5ldF9uZXRsaW5rX29wZW4oKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCWlmICghZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApKSB7CisJCWZjbG9zZShmcCk7CisJCXJldHVybiAtMTsKKwl9CisKKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApKSB7CisJCXNzY2FuZihidWYsICIlbGx4ICVkICVkICV4ICVkICVkICVsbHggJWQiLAorCQkgICAgICAgJnNrLAorCQkgICAgICAgJnByb3QsICZwaWQsICZncm91cHMsICZycSwgJndxLCAmY2IsICZyYyk7CisKKwkJbmV0bGlua19zaG93X29uZShmLCBwcm90LCBwaWQsIGdyb3VwcywgMCwgMCwgMCwgcnEsIHdxLCBzaywgY2IpOworCX0KKworCWZjbG9zZShmcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzb2NrX2RpYWdfbXNnIHsKKwlfX3U4IHNkaWFnX2ZhbWlseTsKK307CisKK3N0YXRpYyBpbnQgZ2VuZXJpY19zaG93X3NvY2soY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICphZGRyLAorCQlzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBzb2NrX2RpYWdfbXNnICpyID0gTkxNU0dfREFUQShubGgpOworCXN0cnVjdCBpbmV0X2RpYWdfYXJnIGluZXRfYXJnID0geyAuZiA9IGFyZywgLnByb3RvY29sID0gSVBQUk9UT19NQVggfTsKKworCXN3aXRjaCAoci0+c2RpYWdfZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCWNhc2UgQUZfSU5FVDY6CisJCXJldHVybiBzaG93X29uZV9pbmV0X3NvY2soYWRkciwgbmxoLCAmaW5ldF9hcmcpOworCWNhc2UgQUZfVU5JWDoKKwkJcmV0dXJuIHVuaXhfc2hvd19zb2NrKGFkZHIsIG5saCwgYXJnKTsKKwljYXNlIEFGX1BBQ0tFVDoKKwkJcmV0dXJuIHBhY2tldF9zaG93X3NvY2soYWRkciwgbmxoLCBhcmcpOworCWNhc2UgQUZfTkVUTElOSzoKKwkJcmV0dXJuIG5ldGxpbmtfc2hvd19zb2NrKGFkZHIsIG5saCwgYXJnKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfQorfQorCitzdGF0aWMgaW50IGhhbmRsZV9mb2xsb3dfcmVxdWVzdChzdHJ1Y3QgZmlsdGVyICpmKQoreworCWludCByZXQgPSAtMTsKKwlpbnQgZ3JvdXBzID0gMDsKKwlzdHJ1Y3QgcnRubF9oYW5kbGUgcnRoOworCisJaWYgKGYtPmZhbWlsaWVzICYgKDEgPDwgQUZfSU5FVCkgJiYgZi0+ZGJzICYgKDEgPDwgVENQX0RCKSkKKwkJZ3JvdXBzIHw9IDEgPDwgKFNLTkxHUlBfSU5FVF9UQ1BfREVTVFJPWSAtIDEpOworCWlmIChmLT5mYW1pbGllcyAmICgxIDw8IEFGX0lORVQpICYmIGYtPmRicyAmICgxIDw8IFVEUF9EQikpCisJCWdyb3VwcyB8PSAxIDw8IChTS05MR1JQX0lORVRfVURQX0RFU1RST1kgLSAxKTsKKwlpZiAoZi0+ZmFtaWxpZXMgJiAoMSA8PCBBRl9JTkVUNikgJiYgZi0+ZGJzICYgKDEgPDwgVENQX0RCKSkKKwkJZ3JvdXBzIHw9IDEgPDwgKFNLTkxHUlBfSU5FVDZfVENQX0RFU1RST1kgLSAxKTsKKwlpZiAoZi0+ZmFtaWxpZXMgJiAoMSA8PCBBRl9JTkVUNikgJiYgZi0+ZGJzICYgKDEgPDwgVURQX0RCKSkKKwkJZ3JvdXBzIHw9IDEgPDwgKFNLTkxHUlBfSU5FVDZfVURQX0RFU1RST1kgLSAxKTsKKworCWlmIChncm91cHMgPT0gMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKHJ0bmxfb3Blbl9ieXByb3RvKCZydGgsIGdyb3VwcywgTkVUTElOS19TT0NLX0RJQUcpKQorCQlyZXR1cm4gLTE7CisKKwlydGguZHVtcCA9IDA7CisJcnRoLmxvY2FsLm5sX3BpZCA9IDA7CisKKwlpZiAocnRubF9kdW1wX2ZpbHRlcigmcnRoLCBnZW5lcmljX3Nob3dfc29jaywgZikpCisJCWdvdG8gRXhpdDsKKworCXJldCA9IDA7CitFeGl0OgorCXJ0bmxfY2xvc2UoJnJ0aCk7CisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IHNubXBzdGF0Cit7CisJaW50IHRjcF9lc3RhYjsKK307CisKK3N0YXRpYyBpbnQgZ2V0X3NubXBfaW50KGNoYXIgKnByb3RvLCBjaGFyICprZXksIGludCAqcmVzdWx0KQoreworCWNoYXIgYnVmWzEwMjRdOworCUZJTEUgKmZwOworCWludCBwcm90b2xlbiA9IHN0cmxlbihwcm90byk7CisJaW50IGtleWxlbiA9IHN0cmxlbihrZXkpOworCisJKnJlc3VsdCA9IDA7CisKKwlpZiAoKGZwID0gbmV0X3NubXBfb3BlbigpKSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApICE9IE5VTEwpIHsKKwkJY2hhciAqcCA9IGJ1ZjsKKwkJaW50ICBwb3MgPSAwOworCQlpZiAobWVtY21wKGJ1ZiwgcHJvdG8sIHByb3RvbGVuKSkKKwkJCWNvbnRpbnVlOworCQl3aGlsZSAoKHAgPSBzdHJjaHIocCwgJyAnKSkgIT0gTlVMTCkgeworCQkJcG9zKys7CisJCQlwKys7CisJCQlpZiAobWVtY21wKHAsIGtleSwga2V5bGVuKSA9PSAwICYmCisJCQkgICAgKHBba2V5bGVuXSA9PSAnICcgfHwgcFtrZXlsZW5dID09ICdcbicpKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlpZiAobWVtY21wKGJ1ZiwgcHJvdG8sIHByb3RvbGVuKSkKKwkJCWJyZWFrOworCQlwID0gYnVmOworCQl3aGlsZSAoKHAgPSBzdHJjaHIocCwgJyAnKSkgIT0gTlVMTCkgeworCQkJcCsrOworCQkJaWYgKC0tcG9zID09IDApIHsKKwkJCQlzc2NhbmYocCwgIiVkIiwgcmVzdWx0KTsKKwkJCQlmY2xvc2UoZnApOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCisJZmNsb3NlKGZwKTsKKwllcnJubyA9IEVTUkNIOworCXJldHVybiAtMTsKK30KKworCisvKiBHZXQgc3RhdHMgZnJvbSBzb2Nrc3RhdCAqLworCitzdHJ1Y3Qgc3N1bW1hcnkKK3sKKwlpbnQgc29ja3M7CisJaW50IHRjcF9tZW07CisJaW50IHRjcF90b3RhbDsKKwlpbnQgdGNwX29ycGhhbnM7CisJaW50IHRjcF90d3M7CisJaW50IHRjcDRfaGFzaGVkOworCWludCB1ZHA0OworCWludCByYXc0OworCWludCBmcmFnNDsKKwlpbnQgZnJhZzRfbWVtOworCWludCB0Y3A2X2hhc2hlZDsKKwlpbnQgdWRwNjsKKwlpbnQgcmF3NjsKKwlpbnQgZnJhZzY7CisJaW50IGZyYWc2X21lbTsKK307CisKK3N0YXRpYyB2b2lkIGdldF9zb2Nrc3RhdF9saW5lKGNoYXIgKmxpbmUsIHN0cnVjdCBzc3VtbWFyeSAqcykKK3sKKwljaGFyIGlkWzI1Nl0sIHJlbVsyNTZdOworCisJaWYgKHNzY2FuZihsaW5lLCAiJVteIF0gJVteXG5dXG4iLCBpZCwgcmVtKSAhPSAyKQorCQlyZXR1cm47CisKKwlpZiAoc3RyY21wKGlkLCAic29ja2V0czoiKSA9PSAwKQorCQlzc2NhbmYocmVtLCAiJSpzJWQiLCAmcy0+c29ja3MpOworCWVsc2UgaWYgKHN0cmNtcChpZCwgIlVEUDoiKSA9PSAwKQorCQlzc2NhbmYocmVtLCAiJSpzJWQiLCAmcy0+dWRwNCk7CisJZWxzZSBpZiAoc3RyY21wKGlkLCAiVURQNjoiKSA9PSAwKQorCQlzc2NhbmYocmVtLCAiJSpzJWQiLCAmcy0+dWRwNik7CisJZWxzZSBpZiAoc3RyY21wKGlkLCAiUkFXOiIpID09IDApCisJCXNzY2FuZihyZW0sICIlKnMlZCIsICZzLT5yYXc0KTsKKwllbHNlIGlmIChzdHJjbXAoaWQsICJSQVc2OiIpID09IDApCisJCXNzY2FuZihyZW0sICIlKnMlZCIsICZzLT5yYXc2KTsKKwllbHNlIGlmIChzdHJjbXAoaWQsICJUQ1A2OiIpID09IDApCisJCXNzY2FuZihyZW0sICIlKnMlZCIsICZzLT50Y3A2X2hhc2hlZCk7CisJZWxzZSBpZiAoc3RyY21wKGlkLCAiRlJBRzoiKSA9PSAwKQorCQlzc2NhbmYocmVtLCAiJSpzJWQlKnMlZCIsICZzLT5mcmFnNCwgJnMtPmZyYWc0X21lbSk7CisJZWxzZSBpZiAoc3RyY21wKGlkLCAiRlJBRzY6IikgPT0gMCkKKwkJc3NjYW5mKHJlbSwgIiUqcyVkJSpzJWQiLCAmcy0+ZnJhZzYsICZzLT5mcmFnNl9tZW0pOworCWVsc2UgaWYgKHN0cmNtcChpZCwgIlRDUDoiKSA9PSAwKQorCQlzc2NhbmYocmVtLCAiJSpzJWQlKnMlZCUqcyVkJSpzJWQlKnMlZCIsCisJCSAgICAgICAmcy0+dGNwNF9oYXNoZWQsCisJCSAgICAgICAmcy0+dGNwX29ycGhhbnMsICZzLT50Y3BfdHdzLCAmcy0+dGNwX3RvdGFsLCAmcy0+dGNwX21lbSk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3NvY2tzdGF0KHN0cnVjdCBzc3VtbWFyeSAqcykKK3sKKwljaGFyIGJ1ZlsyNTZdOworCUZJTEUgKmZwOworCisJbWVtc2V0KHMsIDAsIHNpemVvZigqcykpOworCisJaWYgKChmcCA9IG5ldF9zb2Nrc3RhdF9vcGVuKCkpID09IE5VTEwpCisJCXJldHVybiAtMTsKKwl3aGlsZShmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkgIT0gTlVMTCkKKwkJZ2V0X3NvY2tzdGF0X2xpbmUoYnVmLCBzKTsKKwlmY2xvc2UoZnApOworCisJaWYgKChmcCA9IG5ldF9zb2Nrc3RhdDZfb3BlbigpKSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwl3aGlsZShmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkgIT0gTlVMTCkKKwkJZ2V0X3NvY2tzdGF0X2xpbmUoYnVmLCBzKTsKKwlmY2xvc2UoZnApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJpbnRfc3VtbWFyeSh2b2lkKQoreworCXN0cnVjdCBzc3VtbWFyeSBzOworCXN0cnVjdCBzbm1wc3RhdCBzbjsKKworCWlmIChnZXRfc29ja3N0YXQoJnMpIDwgMCkKKwkJcGVycm9yKCJzczogZ2V0X3NvY2tzdGF0Iik7CisJaWYgKGdldF9zbm1wX2ludCgiVGNwOiIsICJDdXJyRXN0YWIiLCAmc24udGNwX2VzdGFiKSA8IDApCisJCXBlcnJvcigic3M6IGdldF9zbm1wc3RhdCIpOworCisJZ2V0X3NsYWJzdGF0KCZzbGFic3RhdCk7CisKKwlwcmludGYoIlRvdGFsOiAlZCAoa2VybmVsICVkKVxuIiwgcy5zb2Nrcywgc2xhYnN0YXQuc29ja3MpOworCisJcHJpbnRmKCJUQ1A6ICAgJWQgKGVzdGFiICVkLCBjbG9zZWQgJWQsIG9ycGhhbmVkICVkLCBzeW5yZWN2ICVkLCB0aW1ld2FpdCAlZC8lZCksIHBvcnRzICVkXG4iLAorCSAgICAgICBzLnRjcF90b3RhbCArIHNsYWJzdGF0LnRjcF9zeW5zICsgcy50Y3BfdHdzLAorCSAgICAgICBzbi50Y3BfZXN0YWIsCisJICAgICAgIHMudGNwX3RvdGFsIC0gKHMudGNwNF9oYXNoZWQrcy50Y3A2X2hhc2hlZC1zLnRjcF90d3MpLAorCSAgICAgICBzLnRjcF9vcnBoYW5zLAorCSAgICAgICBzbGFic3RhdC50Y3Bfc3lucywKKwkgICAgICAgcy50Y3BfdHdzLCBzbGFic3RhdC50Y3BfdHdzLAorCSAgICAgICBzbGFic3RhdC50Y3BfcG9ydHMKKwkgICAgICAgKTsKKworCXByaW50ZigiXG4iKTsKKwlwcmludGYoIlRyYW5zcG9ydCBUb3RhbCAgICAgSVAgICAgICAgIElQdjZcbiIpOworCXByaW50ZigiKgkgICUtOWQgJS05cyAlLTlzXG4iLCBzbGFic3RhdC5zb2NrcywgIi0iLCAiLSIpOworCXByaW50ZigiUkFXCSAgJS05ZCAlLTlkICUtOWRcbiIsIHMucmF3NCtzLnJhdzYsIHMucmF3NCwgcy5yYXc2KTsKKwlwcmludGYoIlVEUAkgICUtOWQgJS05ZCAlLTlkXG4iLCBzLnVkcDQrcy51ZHA2LCBzLnVkcDQsIHMudWRwNik7CisJcHJpbnRmKCJUQ1AJICAlLTlkICUtOWQgJS05ZFxuIiwgcy50Y3A0X2hhc2hlZCtzLnRjcDZfaGFzaGVkLCBzLnRjcDRfaGFzaGVkLCBzLnRjcDZfaGFzaGVkKTsKKwlwcmludGYoIklORVQJICAlLTlkICUtOWQgJS05ZFxuIiwKKwkgICAgICAgcy5yYXc0K3MudWRwNCtzLnRjcDRfaGFzaGVkKworCSAgICAgICBzLnJhdzYrcy51ZHA2K3MudGNwNl9oYXNoZWQsCisJICAgICAgIHMucmF3NCtzLnVkcDQrcy50Y3A0X2hhc2hlZCwKKwkgICAgICAgcy5yYXc2K3MudWRwNitzLnRjcDZfaGFzaGVkKTsKKwlwcmludGYoIkZSQUcJICAlLTlkICUtOWQgJS05ZFxuIiwgcy5mcmFnNCtzLmZyYWc2LCBzLmZyYWc0LCBzLmZyYWc2KTsKKworCXByaW50ZigiXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfdXNhZ2UoRklMRSAqZGVzdCkKK3sKKwlmcHJpbnRmKGRlc3QsCisiVXNhZ2U6IHNzIFsgT1BUSU9OUyBdXG4iCisiICAgICAgIHNzIFsgT1BUSU9OUyBdIFsgRklMVEVSIF1cbiIKKyIgICAtaCwgLS1oZWxwICAgICAgICAgIHRoaXMgbWVzc2FnZVxuIgorIiAgIC1WLCAtLXZlcnNpb24gICAgICAgb3V0cHV0IHZlcnNpb24gaW5mb3JtYXRpb25cbiIKKyIgICAtbiwgLS1udW1lcmljICAgICAgIGRvbid0IHJlc29sdmUgc2VydmljZSBuYW1lc1xuIgorIiAgIC1yLCAtLXJlc29sdmUgICAgICAgcmVzb2x2ZSBob3N0IG5hbWVzXG4iCisiICAgLWEsIC0tYWxsICAgICAgICAgICBkaXNwbGF5IGFsbCBzb2NrZXRzXG4iCisiICAgLWwsIC0tbGlzdGVuaW5nICAgICBkaXNwbGF5IGxpc3RlbmluZyBzb2NrZXRzXG4iCisiICAgLW8sIC0tb3B0aW9ucyAgICAgICBzaG93IHRpbWVyIGluZm9ybWF0aW9uXG4iCisiICAgLWUsIC0tZXh0ZW5kZWQgICAgICBzaG93IGRldGFpbGVkIHNvY2tldCBpbmZvcm1hdGlvblxuIgorIiAgIC1tLCAtLW1lbW9yeSAgICAgICAgc2hvdyBzb2NrZXQgbWVtb3J5IHVzYWdlXG4iCisiICAgLXAsIC0tcHJvY2Vzc2VzICAgICBzaG93IHByb2Nlc3MgdXNpbmcgc29ja2V0XG4iCisiICAgLWksIC0taW5mbyAgICAgICAgICBzaG93IGludGVybmFsIFRDUCBpbmZvcm1hdGlvblxuIgorIiAgIC1zLCAtLXN1bW1hcnkgICAgICAgc2hvdyBzb2NrZXQgdXNhZ2Ugc3VtbWFyeVxuIgorIiAgIC1iLCAtLWJwZiAgICAgICAgICAgc2hvdyBicGYgZmlsdGVyIHNvY2tldCBpbmZvcm1hdGlvblxuIgorIiAgIC1FLCAtLWV2ZW50cyAgICAgICAgY29udGludWFsbHkgZGlzcGxheSBzb2NrZXRzIGFzIHRoZXkgYXJlIGRlc3Ryb3llZFxuIgorIiAgIC1aLCAtLWNvbnRleHQgICAgICAgZGlzcGxheSBwcm9jZXNzIFNFTGludXggc2VjdXJpdHkgY29udGV4dHNcbiIKKyIgICAteiwgLS1jb250ZXh0cyAgICAgIGRpc3BsYXkgcHJvY2VzcyBhbmQgc29ja2V0IFNFTGludXggc2VjdXJpdHkgY29udGV4dHNcbiIKKyIgICAtTiwgLS1uZXQgICAgICAgICAgIHN3aXRjaCB0byB0aGUgc3BlY2lmaWVkIG5ldHdvcmsgbmFtZXNwYWNlIG5hbWVcbiIKKyJcbiIKKyIgICAtNCwgLS1pcHY0ICAgICAgICAgIGRpc3BsYXkgb25seSBJUCB2ZXJzaW9uIDQgc29ja2V0c1xuIgorIiAgIC02LCAtLWlwdjYgICAgICAgICAgZGlzcGxheSBvbmx5IElQIHZlcnNpb24gNiBzb2NrZXRzXG4iCisiICAgLTAsIC0tcGFja2V0ICAgICAgICBkaXNwbGF5IFBBQ0tFVCBzb2NrZXRzXG4iCisiICAgLXQsIC0tdGNwICAgICAgICAgICBkaXNwbGF5IG9ubHkgVENQIHNvY2tldHNcbiIKKyIgICAtdSwgLS11ZHAgICAgICAgICAgIGRpc3BsYXkgb25seSBVRFAgc29ja2V0c1xuIgorIiAgIC1kLCAtLWRjY3AgICAgICAgICAgZGlzcGxheSBvbmx5IERDQ1Agc29ja2V0c1xuIgorIiAgIC13LCAtLXJhdyAgICAgICAgICAgZGlzcGxheSBvbmx5IFJBVyBzb2NrZXRzXG4iCisiICAgLXgsIC0tdW5peCAgICAgICAgICBkaXNwbGF5IG9ubHkgVW5peCBkb21haW4gc29ja2V0c1xuIgorIiAgIC1mLCAtLWZhbWlseT1GQU1JTFkgZGlzcGxheSBzb2NrZXRzIG9mIHR5cGUgRkFNSUxZXG4iCisiXG4iCisiICAgLUssIC0ta2lsbCAgICAgICAgICBmb3JjaWJseSBjbG9zZSBzb2NrZXRzLCBkaXNwbGF5IHdoYXQgd2FzIGNsb3NlZFxuIgorIlxuIgorIiAgIC1BLCAtLXF1ZXJ5PVFVRVJZLCAtLXNvY2tldD1RVUVSWVxuIgorIiAgICAgICBRVUVSWSA6PSB7YWxsfGluZXR8dGNwfHVkcHxyYXd8dW5peHx1bml4X2RncmFtfHVuaXhfc3RyZWFtfHVuaXhfc2VxcGFja2V0fHBhY2tldHxuZXRsaW5rfVssUVVFUlldXG4iCisiXG4iCisiICAgLUQsIC0tZGlhZz1GSUxFICAgICBEdW1wIHJhdyBpbmZvcm1hdGlvbiBhYm91dCBUQ1Agc29ja2V0cyB0byBGSUxFXG4iCisiICAgLUYsIC0tZmlsdGVyPUZJTEUgICByZWFkIGZpbHRlciBpbmZvcm1hdGlvbiBmcm9tIEZJTEVcbiIKKyIgICAgICAgRklMVEVSIDo9IFsgc3RhdGUgU1RBVEUtRklMVEVSIF0gWyBFWFBSRVNTSU9OIF1cbiIKKyIgICAgICAgU1RBVEUtRklMVEVSIDo9IHthbGx8Y29ubmVjdGVkfHN5bmNocm9uaXplZHxidWNrZXR8YmlnfFRDUC1TVEFURVN9XG4iCisiICAgICAgICAgVENQLVNUQVRFUyA6PSB7ZXN0YWJsaXNoZWR8c3luLXNlbnR8c3luLXJlY3Z8ZmluLXdhaXQtezEsMn18dGltZS13YWl0fGNsb3NlZHxjbG9zZS13YWl0fGxhc3QtYWNrfGxpc3RlbnxjbG9zaW5nfVxuIgorIiAgICAgICAgICBjb25uZWN0ZWQgOj0ge2VzdGFibGlzaGVkfHN5bi1zZW50fHN5bi1yZWN2fGZpbi13YWl0LXsxLDJ9fHRpbWUtd2FpdHxjbG9zZS13YWl0fGxhc3QtYWNrfGNsb3Npbmd9XG4iCisiICAgICAgIHN5bmNocm9uaXplZCA6PSB7ZXN0YWJsaXNoZWR8c3luLXJlY3Z8ZmluLXdhaXQtezEsMn18dGltZS13YWl0fGNsb3NlLXdhaXR8bGFzdC1hY2t8Y2xvc2luZ31cbiIKKyIgICAgICAgICAgICAgYnVja2V0IDo9IHtzeW4tcmVjdnx0aW1lLXdhaXR9XG4iCisiICAgICAgICAgICAgICAgIGJpZyA6PSB7ZXN0YWJsaXNoZWR8c3luLXNlbnR8ZmluLXdhaXQtezEsMn18Y2xvc2VkfGNsb3NlLXdhaXR8bGFzdC1hY2t8bGlzdGVufGNsb3Npbmd9XG4iCisJCSk7Cit9CisKK3N0YXRpYyB2b2lkIGhlbHAodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKK3N0YXRpYyB2b2lkIGhlbHAodm9pZCkKK3sKKwlfdXNhZ2Uoc3Rkb3V0KTsKKwlleGl0KDApOworfQorCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlfdXNhZ2Uoc3RkZXJyKTsKKwlleGl0KC0xKTsKK30KKworCitzdGF0aWMgaW50IHNjYW5fc3RhdGUoY29uc3QgY2hhciAqc3RhdGUpCit7CisJaW50IGk7CisJaWYgKHN0cmNhc2VjbXAoc3RhdGUsICJjbG9zZSIpID09IDAgfHwKKwkgICAgc3RyY2FzZWNtcChzdGF0ZSwgImNsb3NlZCIpID09IDApCisJCXJldHVybiAoMTw8U1NfQ0xPU0UpOworCWlmIChzdHJjYXNlY21wKHN0YXRlLCAic3luLXJjdiIpID09IDApCisJCXJldHVybiAoMTw8U1NfU1lOX1JFQ1YpOworCWlmIChzdHJjYXNlY21wKHN0YXRlLCAiZXN0YWJsaXNoZWQiKSA9PSAwKQorCQlyZXR1cm4gKDE8PFNTX0VTVEFCTElTSEVEKTsKKwlpZiAoc3RyY2FzZWNtcChzdGF0ZSwgImFsbCIpID09IDApCisJCXJldHVybiBTU19BTEw7CisJaWYgKHN0cmNhc2VjbXAoc3RhdGUsICJjb25uZWN0ZWQiKSA9PSAwKQorCQlyZXR1cm4gU1NfQUxMICYgfigoMTw8U1NfQ0xPU0UpfCgxPDxTU19MSVNURU4pKTsKKwlpZiAoc3RyY2FzZWNtcChzdGF0ZSwgInN5bmNocm9uaXplZCIpID09IDApCisJCXJldHVybiBTU19BTEwgJiB+KCgxPDxTU19DTE9TRSl8KDE8PFNTX0xJU1RFTil8KDE8PFNTX1NZTl9TRU5UKSk7CisJaWYgKHN0cmNhc2VjbXAoc3RhdGUsICJidWNrZXQiKSA9PSAwKQorCQlyZXR1cm4gKDE8PFNTX1NZTl9SRUNWKXwoMTw8U1NfVElNRV9XQUlUKTsKKwlpZiAoc3RyY2FzZWNtcChzdGF0ZSwgImJpZyIpID09IDApCisJCXJldHVybiBTU19BTEwgJiB+KCgxPDxTU19TWU5fUkVDVil8KDE8PFNTX1RJTUVfV0FJVCkpOworCWZvciAoaT0wOyBpPFNTX01BWDsgaSsrKSB7CisJCWlmIChzdHJjYXNlY21wKHN0YXRlLCBzc3RhdGVfbmFtZWxbaV0pID09IDApCisJCQlyZXR1cm4gKDE8PGkpOworCX0KKworCWZwcmludGYoc3RkZXJyLCAic3M6IHdyb25nIHN0YXRlIG5hbWU6ICVzXG4iLCBzdGF0ZSk7CisJZXhpdCgtMSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0c1tdID0geworCXsgIm51bWVyaWMiLCAwLCAwLCAnbicgfSwKKwl7ICJyZXNvbHZlIiwgMCwgMCwgJ3InIH0sCisJeyAib3B0aW9ucyIsIDAsIDAsICdvJyB9LAorCXsgImV4dGVuZGVkIiwgMCwgMCwgJ2UnIH0sCisJeyAibWVtb3J5IiwgMCwgMCwgJ20nIH0sCisJeyAiaW5mbyIsIDAsIDAsICdpJyB9LAorCXsgInByb2Nlc3NlcyIsIDAsIDAsICdwJyB9LAorCXsgImJwZiIsIDAsIDAsICdiJyB9LAorCXsgImV2ZW50cyIsIDAsIDAsICdFJyB9LAorCXsgImRjY3AiLCAwLCAwLCAnZCcgfSwKKwl7ICJ0Y3AiLCAwLCAwLCAndCcgfSwKKwl7ICJ1ZHAiLCAwLCAwLCAndScgfSwKKwl7ICJyYXciLCAwLCAwLCAndycgfSwKKwl7ICJ1bml4IiwgMCwgMCwgJ3gnIH0sCisJeyAiYWxsIiwgMCwgMCwgJ2EnIH0sCisJeyAibGlzdGVuaW5nIiwgMCwgMCwgJ2wnIH0sCisJeyAiaXB2NCIsIDAsIDAsICc0JyB9LAorCXsgImlwdjYiLCAwLCAwLCAnNicgfSwKKwl7ICJwYWNrZXQiLCAwLCAwLCAnMCcgfSwKKwl7ICJmYW1pbHkiLCAxLCAwLCAnZicgfSwKKwl7ICJzb2NrZXQiLCAxLCAwLCAnQScgfSwKKwl7ICJxdWVyeSIsIDEsIDAsICdBJyB9LAorCXsgInN1bW1hcnkiLCAwLCAwLCAncycgfSwKKwl7ICJkaWFnIiwgMSwgMCwgJ0QnIH0sCisJeyAiZmlsdGVyIiwgMSwgMCwgJ0YnIH0sCisJeyAidmVyc2lvbiIsIDAsIDAsICdWJyB9LAorCXsgImhlbHAiLCAwLCAwLCAnaCcgfSwKKwl7ICJjb250ZXh0IiwgMCwgMCwgJ1onIH0sCisJeyAiY29udGV4dHMiLCAwLCAwLCAneicgfSwKKwl7ICJuZXQiLCAxLCAwLCAnTicgfSwKKwl7ICJraWxsIiwgMCwgMCwgJ0snIH0sCisJeyAwIH0KKworfTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgc2F3X3N0YXRlcyA9IDA7CisJaW50IHNhd19xdWVyeSA9IDA7CisJaW50IGRvX3N1bW1hcnkgPSAwOworCWNvbnN0IGNoYXIgKmR1bXBfdGNwZGlhZyA9IE5VTEw7CisJRklMRSAqZmlsdGVyX2ZwID0gTlVMTDsKKwlpbnQgY2g7CisJaW50IHN0YXRlX2ZpbHRlciA9IDA7CisKKwl3aGlsZSAoKGNoID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImRoYWxldHV3eG5ybzQ2MHNwYkVmOm1pQTpEOkY6dlZ6Wk46SyIsCisJCQkJIGxvbmdfb3B0cywgTlVMTCkpICE9IEVPRikgeworCQlzd2l0Y2goY2gpIHsKKwkJY2FzZSAnbic6CisJCQlyZXNvbHZlX3NlcnZpY2VzID0gMDsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCXJlc29sdmVfaG9zdHMgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ28nOgorCQkJc2hvd19vcHRpb25zID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdlJzoKKwkJCXNob3dfb3B0aW9ucyA9IDE7CisJCQlzaG93X2RldGFpbHMrKzsKKwkJCWJyZWFrOworCQljYXNlICdtJzoKKwkJCXNob3dfbWVtID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdpJzoKKwkJCXNob3dfdGNwaW5mbyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlzaG93X3VzZXJzKys7CisJCQl1c2VyX2VudF9oYXNoX2J1aWxkKCk7CisJCQlicmVhazsKKwkJY2FzZSAnYic6CisJCQlzaG93X29wdGlvbnMgPSAxOworCQkJc2hvd19icGYrKzsKKwkJCWJyZWFrOworCQljYXNlICdFJzoKKwkJCWZvbGxvd19ldmVudHMgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJZmlsdGVyX2RiX3NldCgmY3VycmVudF9maWx0ZXIsIERDQ1BfREIpOworCQkJYnJlYWs7CisJCWNhc2UgJ3QnOgorCQkJZmlsdGVyX2RiX3NldCgmY3VycmVudF9maWx0ZXIsIFRDUF9EQik7CisJCQlicmVhazsKKwkJY2FzZSAndSc6CisJCQlmaWx0ZXJfZGJfc2V0KCZjdXJyZW50X2ZpbHRlciwgVURQX0RCKTsKKwkJCWJyZWFrOworCQljYXNlICd3JzoKKwkJCWZpbHRlcl9kYl9zZXQoJmN1cnJlbnRfZmlsdGVyLCBSQVdfREIpOworCQkJYnJlYWs7CisJCWNhc2UgJ3gnOgorCQkJZmlsdGVyX2FmX3NldCgmY3VycmVudF9maWx0ZXIsIEFGX1VOSVgpOworCQkJYnJlYWs7CisJCWNhc2UgJ2EnOgorCQkJc3RhdGVfZmlsdGVyID0gU1NfQUxMOworCQkJYnJlYWs7CisJCWNhc2UgJ2wnOgorCQkJc3RhdGVfZmlsdGVyID0gKDEgPDwgU1NfTElTVEVOKSB8ICgxIDw8IFNTX0NMT1NFKTsKKwkJCWJyZWFrOworCQljYXNlICc0JzoKKwkJCWZpbHRlcl9hZl9zZXQoJmN1cnJlbnRfZmlsdGVyLCBBRl9JTkVUKTsKKwkJCWJyZWFrOworCQljYXNlICc2JzoKKwkJCWZpbHRlcl9hZl9zZXQoJmN1cnJlbnRfZmlsdGVyLCBBRl9JTkVUNik7CisJCQlicmVhazsKKwkJY2FzZSAnMCc6CisJCQlmaWx0ZXJfYWZfc2V0KCZjdXJyZW50X2ZpbHRlciwgQUZfUEFDS0VUKTsKKwkJCWJyZWFrOworCQljYXNlICdmJzoKKwkJCWlmIChzdHJjbXAob3B0YXJnLCAiaW5ldCIpID09IDApCisJCQkJZmlsdGVyX2FmX3NldCgmY3VycmVudF9maWx0ZXIsIEFGX0lORVQpOworCQkJZWxzZSBpZiAoc3RyY21wKG9wdGFyZywgImluZXQ2IikgPT0gMCkKKwkJCQlmaWx0ZXJfYWZfc2V0KCZjdXJyZW50X2ZpbHRlciwgQUZfSU5FVDYpOworCQkJZWxzZSBpZiAoc3RyY21wKG9wdGFyZywgImxpbmsiKSA9PSAwKQorCQkJCWZpbHRlcl9hZl9zZXQoJmN1cnJlbnRfZmlsdGVyLCBBRl9QQUNLRVQpOworCQkJZWxzZSBpZiAoc3RyY21wKG9wdGFyZywgInVuaXgiKSA9PSAwKQorCQkJCWZpbHRlcl9hZl9zZXQoJmN1cnJlbnRfZmlsdGVyLCBBRl9VTklYKTsKKwkJCWVsc2UgaWYgKHN0cmNtcChvcHRhcmcsICJuZXRsaW5rIikgPT0gMCkKKwkJCQlmaWx0ZXJfYWZfc2V0KCZjdXJyZW50X2ZpbHRlciwgQUZfTkVUTElOSyk7CisJCQllbHNlIGlmIChzdHJjbXAob3B0YXJnLCAiaGVscCIpID09IDApCisJCQkJaGVscCgpOworCQkJZWxzZSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJzczogXCIlc1wiIGlzIGludmFsaWQgZmFtaWx5XG4iLAorCQkJCQkJb3B0YXJnKTsKKwkJCQl1c2FnZSgpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ0EnOgorCQl7CisJCQljaGFyICpwLCAqcDE7CisJCQlpZiAoIXNhd19xdWVyeSkgeworCQkJCWN1cnJlbnRfZmlsdGVyLmRicyA9IDA7CisJCQkJc3RhdGVfZmlsdGVyID0gc3RhdGVfZmlsdGVyID8KKwkJCQkgICAgICAgICAgICAgICBzdGF0ZV9maWx0ZXIgOiBTU19DT05OOworCQkJCXNhd19xdWVyeSA9IDE7CisJCQkJZG9fZGVmYXVsdCA9IDA7CisJCQl9CisJCQlwID0gcDEgPSBvcHRhcmc7CisJCQlkbyB7CisJCQkJaWYgKChwMSA9IHN0cmNocihwLCAnLCcpKSAhPSBOVUxMKQorCQkJCQkqcDEgPSAwOworCQkJCWlmIChzdHJjbXAocCwgImFsbCIpID09IDApIHsKKwkJCQkJZmlsdGVyX2RlZmF1bHRfZGJzKCZjdXJyZW50X2ZpbHRlcik7CisJCQkJfSBlbHNlIGlmIChzdHJjbXAocCwgImluZXQiKSA9PSAwKSB7CisJCQkJCWZpbHRlcl9kYl9zZXQoJmN1cnJlbnRfZmlsdGVyLCBVRFBfREIpOworCQkJCQlmaWx0ZXJfZGJfc2V0KCZjdXJyZW50X2ZpbHRlciwgRENDUF9EQik7CisJCQkJCWZpbHRlcl9kYl9zZXQoJmN1cnJlbnRfZmlsdGVyLCBUQ1BfREIpOworCQkJCQlmaWx0ZXJfZGJfc2V0KCZjdXJyZW50X2ZpbHRlciwgUkFXX0RCKTsKKwkJCQl9IGVsc2UgaWYgKHN0cmNtcChwLCAidWRwIikgPT0gMCkgeworCQkJCQlmaWx0ZXJfZGJfc2V0KCZjdXJyZW50X2ZpbHRlciwgVURQX0RCKTsKKwkJCQl9IGVsc2UgaWYgKHN0cmNtcChwLCAiZGNjcCIpID09IDApIHsKKwkJCQkJZmlsdGVyX2RiX3NldCgmY3VycmVudF9maWx0ZXIsIERDQ1BfREIpOworCQkJCX0gZWxzZSBpZiAoc3RyY21wKHAsICJ0Y3AiKSA9PSAwKSB7CisJCQkJCWZpbHRlcl9kYl9zZXQoJmN1cnJlbnRfZmlsdGVyLCBUQ1BfREIpOworCQkJCX0gZWxzZSBpZiAoc3RyY21wKHAsICJyYXciKSA9PSAwKSB7CisJCQkJCWZpbHRlcl9kYl9zZXQoJmN1cnJlbnRfZmlsdGVyLCBSQVdfREIpOworCQkJCX0gZWxzZSBpZiAoc3RyY21wKHAsICJ1bml4IikgPT0gMCkgeworCQkJCQlmaWx0ZXJfZGJfc2V0KCZjdXJyZW50X2ZpbHRlciwgVU5JWF9TVF9EQik7CisJCQkJCWZpbHRlcl9kYl9zZXQoJmN1cnJlbnRfZmlsdGVyLCBVTklYX0RHX0RCKTsKKwkJCQkJZmlsdGVyX2RiX3NldCgmY3VycmVudF9maWx0ZXIsIFVOSVhfU1FfREIpOworCQkJCX0gZWxzZSBpZiAoc3RyY2FzZWNtcChwLCAidW5peF9zdHJlYW0iKSA9PSAwIHx8CisJCQkJCSAgIHN0cmNtcChwLCAidV9zdHIiKSA9PSAwKSB7CisJCQkJCWZpbHRlcl9kYl9zZXQoJmN1cnJlbnRfZmlsdGVyLCBVTklYX1NUX0RCKTsKKwkJCQl9IGVsc2UgaWYgKHN0cmNhc2VjbXAocCwgInVuaXhfZGdyYW0iKSA9PSAwIHx8CisJCQkJCSAgIHN0cmNtcChwLCAidV9kZ3IiKSA9PSAwKSB7CisJCQkJCWZpbHRlcl9kYl9zZXQoJmN1cnJlbnRfZmlsdGVyLCBVTklYX0RHX0RCKTsKKwkJCQl9IGVsc2UgaWYgKHN0cmNhc2VjbXAocCwgInVuaXhfc2VxcGFja2V0IikgPT0gMCB8fAorCQkJCQkgICBzdHJjbXAocCwgInVfc2VxIikgPT0gMCkgeworCQkJCQlmaWx0ZXJfZGJfc2V0KCZjdXJyZW50X2ZpbHRlciwgVU5JWF9TUV9EQik7CisJCQkJfSBlbHNlIGlmIChzdHJjbXAocCwgInBhY2tldCIpID09IDApIHsKKwkJCQkJZmlsdGVyX2RiX3NldCgmY3VycmVudF9maWx0ZXIsIFBBQ0tFVF9SX0RCKTsKKwkJCQkJZmlsdGVyX2RiX3NldCgmY3VycmVudF9maWx0ZXIsIFBBQ0tFVF9ER19EQik7CisJCQkJfSBlbHNlIGlmIChzdHJjbXAocCwgInBhY2tldF9yYXciKSA9PSAwIHx8CisJCQkJCSAgIHN0cmNtcChwLCAicF9yYXciKSA9PSAwKSB7CisJCQkJCWZpbHRlcl9kYl9zZXQoJmN1cnJlbnRfZmlsdGVyLCBQQUNLRVRfUl9EQik7CisJCQkJfSBlbHNlIGlmIChzdHJjbXAocCwgInBhY2tldF9kZ3JhbSIpID09IDAgfHwKKwkJCQkJICAgc3RyY21wKHAsICJwX2RnciIpID09IDApIHsKKwkJCQkJZmlsdGVyX2RiX3NldCgmY3VycmVudF9maWx0ZXIsIFBBQ0tFVF9ER19EQik7CisJCQkJfSBlbHNlIGlmIChzdHJjbXAocCwgIm5ldGxpbmsiKSA9PSAwKSB7CisJCQkJCWZpbHRlcl9kYl9zZXQoJmN1cnJlbnRfZmlsdGVyLCBORVRMSU5LX0RCKTsKKwkJCQl9IGVsc2UgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgInNzOiBcIiVzXCIgaXMgaWxsZWdhbCBzb2NrZXQgdGFibGUgaWRcbiIsIHApOworCQkJCQl1c2FnZSgpOworCQkJCX0KKwkJCQlwID0gcDEgKyAxOworCQkJfSB3aGlsZSAocDEpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSAncyc6CisJCQlkb19zdW1tYXJ5ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdEJzoKKwkJCWR1bXBfdGNwZGlhZyA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdGJzoKKwkJCWlmIChmaWx0ZXJfZnApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIk1vcmUgdGhhbiBvbmUgZmlsdGVyIGZpbGVcbiIpOworCQkJCWV4aXQoLTEpOworCQkJfQorCQkJaWYgKG9wdGFyZ1swXSA9PSAnLScpCisJCQkJZmlsdGVyX2ZwID0gc3RkaW47CisJCQllbHNlCisJCQkJZmlsdGVyX2ZwID0gZm9wZW4ob3B0YXJnLCAiciIpOworCQkJaWYgKCFmaWx0ZXJfZnApIHsKKwkJCQlwZXJyb3IoImZvcGVuIGZpbHRlciBmaWxlIik7CisJCQkJZXhpdCgtMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAndic6CisJCWNhc2UgJ1YnOgorCQkJcHJpbnRmKCJzcyB1dGlsaXR5LCBpcHJvdXRlMi1zcyVzXG4iLCBTTkFQU0hPVCk7CisJCQlleGl0KDApOworCQljYXNlICd6JzoKKwkJCXNob3dfc29ja19jdHgrKzsKKwkJY2FzZSAnWic6CisJCQlpZiAoaXNfc2VsaW51eF9lbmFibGVkKCkgPD0gMCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAic3M6IFNFTGludXggaXMgbm90IGVuYWJsZWQuXG4iKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQkJc2hvd19wcm9jX2N0eCsrOworCQkJdXNlcl9lbnRfaGFzaF9idWlsZCgpOworCQkJYnJlYWs7CisJCWNhc2UgJ04nOgorCQkJaWYgKG5ldG5zX3N3aXRjaChvcHRhcmcpKQorCQkJCWV4aXQoMSk7CisJCQlicmVhazsKKwkJY2FzZSAnSyc6CisJCQljdXJyZW50X2ZpbHRlci5raWxsID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdoJzoKKwkJCWhlbHAoKTsKKwkJY2FzZSAnPyc6CisJCWRlZmF1bHQ6CisJCQl1c2FnZSgpOworCQl9CisJfQorCisJYXJnYyAtPSBvcHRpbmQ7CisJYXJndiArPSBvcHRpbmQ7CisKKwlpZiAoZG9fc3VtbWFyeSkgeworCQlwcmludF9zdW1tYXJ5KCk7CisJCWlmIChkb19kZWZhdWx0ICYmIGFyZ2MgPT0gMCkKKwkJCWV4aXQoMCk7CisJfQorCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChzdHJjbXAoKmFyZ3YsICJzdGF0ZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoIXNhd19zdGF0ZXMpCisJCQkJc3RhdGVfZmlsdGVyID0gMDsKKwkJCXN0YXRlX2ZpbHRlciB8PSBzY2FuX3N0YXRlKCphcmd2KTsKKwkJCXNhd19zdGF0ZXMgPSAxOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImV4Y2x1ZGUiKSA9PSAwIHx8CisJCQkgICBzdHJjbXAoKmFyZ3YsICJleGNsIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmICghc2F3X3N0YXRlcykKKwkJCQlzdGF0ZV9maWx0ZXIgPSBTU19BTEw7CisJCQlzdGF0ZV9maWx0ZXIgJj0gfnNjYW5fc3RhdGUoKmFyZ3YpOworCQkJc2F3X3N0YXRlcyA9IDE7CisJCX0gZWxzZSB7CisJCQlicmVhazsKKwkJfQorCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisKKwlpZiAoZG9fZGVmYXVsdCkgeworCQlzdGF0ZV9maWx0ZXIgPSBzdGF0ZV9maWx0ZXIgPyBzdGF0ZV9maWx0ZXIgOiBTU19DT05OOworCQlmaWx0ZXJfZGVmYXVsdF9kYnMoJmN1cnJlbnRfZmlsdGVyKTsKKwl9CisKKwlmaWx0ZXJfc3RhdGVzX3NldCgmY3VycmVudF9maWx0ZXIsIHN0YXRlX2ZpbHRlcik7CisJZmlsdGVyX21lcmdlX2RlZmF1bHRzKCZjdXJyZW50X2ZpbHRlcik7CisKKwlpZiAocmVzb2x2ZV9zZXJ2aWNlcyAmJiByZXNvbHZlX2hvc3RzICYmCisJICAgIChjdXJyZW50X2ZpbHRlci5kYnMmKFVOSVhfREJNfCgxPDxUQ1BfREIpfCgxPDxVRFBfREIpfCgxPDxEQ0NQX0RCKSkpKQorCQlpbml0X3NlcnZpY2VfcmVzb2x2ZXIoKTsKKworCisJaWYgKGN1cnJlbnRfZmlsdGVyLmRicyA9PSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAic3M6IG5vIHNvY2tldCB0YWJsZXMgdG8gc2hvdyB3aXRoIHN1Y2ggZmlsdGVyLlxuIik7CisJCWV4aXQoMCk7CisJfQorCWlmIChjdXJyZW50X2ZpbHRlci5mYW1pbGllcyA9PSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAic3M6IG5vIGZhbWlsaWVzIHRvIHNob3cgd2l0aCBzdWNoIGZpbHRlci5cbiIpOworCQlleGl0KDApOworCX0KKwlpZiAoY3VycmVudF9maWx0ZXIuc3RhdGVzID09IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJzczogbm8gc29ja2V0IHN0YXRlcyB0byBzaG93IHdpdGggc3VjaCBmaWx0ZXIuXG4iKTsKKwkJZXhpdCgwKTsKKwl9CisKKwlpZiAoZHVtcF90Y3BkaWFnKSB7CisJCUZJTEUgKmR1bXBfZnAgPSBzdGRvdXQ7CisJCWlmICghKGN1cnJlbnRfZmlsdGVyLmRicyAmICgxPDxUQ1BfREIpKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJzczogdGNwZGlhZyBkdW1wIHJlcXVlc3RlZCBhbmQgbm8gdGNwIGluIGZpbHRlci5cbiIpOworCQkJZXhpdCgwKTsKKwkJfQorCQlpZiAoZHVtcF90Y3BkaWFnWzBdICE9ICctJykgeworCQkJZHVtcF9mcCA9IGZvcGVuKGR1bXBfdGNwZGlhZywgInciKTsKKwkJCWlmICghZHVtcF90Y3BkaWFnKSB7CisJCQkJcGVycm9yKCJmb3BlbiBkdW1wIGZpbGUiKTsKKwkJCQlleGl0KC0xKTsKKwkJCX0KKwkJfQorCQlpbmV0X3Nob3dfbmV0bGluaygmY3VycmVudF9maWx0ZXIsIGR1bXBfZnAsIElQUFJPVE9fVENQKTsKKwkJZmZsdXNoKGR1bXBfZnApOworCQlleGl0KDApOworCX0KKworCWlmIChzc2ZpbHRlcl9wYXJzZSgmY3VycmVudF9maWx0ZXIuZiwgYXJnYywgYXJndiwgZmlsdGVyX2ZwKSkKKwkJdXNhZ2UoKTsKKworCW5ldGlkX3dpZHRoID0gMDsKKwlpZiAoY3VycmVudF9maWx0ZXIuZGJzJihjdXJyZW50X2ZpbHRlci5kYnMtMSkpCisJCW5ldGlkX3dpZHRoID0gNTsKKworCXN0YXRlX3dpZHRoID0gMDsKKwlpZiAoY3VycmVudF9maWx0ZXIuc3RhdGVzJihjdXJyZW50X2ZpbHRlci5zdGF0ZXMtMSkpCisJCXN0YXRlX3dpZHRoID0gMTA7CisKKwlzY3JlZW5fd2lkdGggPSA4MDsKKwlpZiAoaXNhdHR5KFNURE9VVF9GSUxFTk8pKSB7CisJCXN0cnVjdCB3aW5zaXplIHc7CisKKwkJaWYgKGlvY3RsKFNURE9VVF9GSUxFTk8sIFRJT0NHV0lOU1osICZ3KSAhPSAtMSkgeworCQkJaWYgKHcud3NfY29sID4gMCkKKwkJCQlzY3JlZW5fd2lkdGggPSB3LndzX2NvbDsKKwkJfQorCX0KKworCWFkZHJwX3dpZHRoID0gc2NyZWVuX3dpZHRoOworCWFkZHJwX3dpZHRoIC09IG5ldGlkX3dpZHRoKzE7CisJYWRkcnBfd2lkdGggLT0gc3RhdGVfd2lkdGgrMTsKKwlhZGRycF93aWR0aCAtPSAxNDsKKworCWlmIChhZGRycF93aWR0aCYxKSB7CisJCWlmIChuZXRpZF93aWR0aCkKKwkJCW5ldGlkX3dpZHRoKys7CisJCWVsc2UgaWYgKHN0YXRlX3dpZHRoKQorCQkJc3RhdGVfd2lkdGgrKzsKKwl9CisKKwlhZGRycF93aWR0aCAvPSAyOworCWFkZHJwX3dpZHRoLS07CisKKwlzZXJ2X3dpZHRoID0gcmVzb2x2ZV9zZXJ2aWNlcyA/IDcgOiA1OworCisJaWYgKGFkZHJwX3dpZHRoIDwgMTUrc2Vydl93aWR0aCsxKQorCQlhZGRycF93aWR0aCA9IDE1K3NlcnZfd2lkdGgrMTsKKworCWFkZHJfd2lkdGggPSBhZGRycF93aWR0aCAtIHNlcnZfd2lkdGggLSAxOworCisJaWYgKG5ldGlkX3dpZHRoKQorCQlwcmludGYoIiUtKnMgIiwgbmV0aWRfd2lkdGgsICJOZXRpZCIpOworCWlmIChzdGF0ZV93aWR0aCkKKwkJcHJpbnRmKCIlLSpzICIsIHN0YXRlX3dpZHRoLCAiU3RhdGUiKTsKKwlwcmludGYoIiUtNnMgJS02cyAiLCAiUmVjdi1RIiwgIlNlbmQtUSIpOworCisJLyogTWFrZSBlbm91Z2ggc3BhY2UgZm9yIHRoZSBsb2NhbC9yZW1vdGUgcG9ydCBmaWVsZCAqLworCWFkZHJfd2lkdGggLT0gMTM7CisJc2Vydl93aWR0aCArPSAxMzsKKworCXByaW50ZigiJSpzOiUtKnMgJSpzOiUtKnNcbiIsCisJICAgICAgIGFkZHJfd2lkdGgsICJMb2NhbCBBZGRyZXNzIiwgc2Vydl93aWR0aCwgIlBvcnQiLAorCSAgICAgICBhZGRyX3dpZHRoLCAiUGVlciBBZGRyZXNzIiwgc2Vydl93aWR0aCwgIlBvcnQiKTsKKworCWZmbHVzaChzdGRvdXQpOworCisJaWYgKGZvbGxvd19ldmVudHMpCisJCWV4aXQoaGFuZGxlX2ZvbGxvd19yZXF1ZXN0KCZjdXJyZW50X2ZpbHRlcikpOworCisJaWYgKGN1cnJlbnRfZmlsdGVyLmRicyAmICgxPDxORVRMSU5LX0RCKSkKKwkJbmV0bGlua19zaG93KCZjdXJyZW50X2ZpbHRlcik7CisJaWYgKGN1cnJlbnRfZmlsdGVyLmRicyAmIFBBQ0tFVF9EQk0pCisJCXBhY2tldF9zaG93KCZjdXJyZW50X2ZpbHRlcik7CisJaWYgKGN1cnJlbnRfZmlsdGVyLmRicyAmIFVOSVhfREJNKQorCQl1bml4X3Nob3coJmN1cnJlbnRfZmlsdGVyKTsKKwlpZiAoY3VycmVudF9maWx0ZXIuZGJzICYgKDE8PFJBV19EQikpCisJCXJhd19zaG93KCZjdXJyZW50X2ZpbHRlcik7CisJaWYgKGN1cnJlbnRfZmlsdGVyLmRicyAmICgxPDxVRFBfREIpKQorCQl1ZHBfc2hvdygmY3VycmVudF9maWx0ZXIpOworCWlmIChjdXJyZW50X2ZpbHRlci5kYnMgJiAoMTw8VENQX0RCKSkKKwkJdGNwX3Nob3coJmN1cnJlbnRfZmlsdGVyLCBJUFBST1RPX1RDUCk7CisJaWYgKGN1cnJlbnRfZmlsdGVyLmRicyAmICgxPDxEQ0NQX0RCKSkKKwkJdGNwX3Nob3coJmN1cnJlbnRfZmlsdGVyLCBJUFBST1RPX0RDQ1ApOworCisJaWYgKHNob3dfdXNlcnMgfHwgc2hvd19wcm9jX2N0eCB8fCBzaG93X3NvY2tfY3R4KQorCQl1c2VyX2VudF9kZXN0cm95KCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL21pc2Mvc3NmaWx0ZXIuaCBiL2lwcm91dGUyL21pc2Mvc3NmaWx0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzkyMmE4Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbWlzYy9zc2ZpbHRlci5oCkBAIC0wLDAgKzEsMjIgQEAKKyNkZWZpbmUgU1NGX0RDT05EIDAKKyNkZWZpbmUgU1NGX1NDT05EIDEKKyNkZWZpbmUgU1NGX09SCSAgMgorI2RlZmluZSBTU0ZfQU5ECSAgMworI2RlZmluZSBTU0ZfTk9UCSAgNAorI2RlZmluZSBTU0ZfRF9HRSAgNQorI2RlZmluZSBTU0ZfRF9MRSAgNgorI2RlZmluZSBTU0ZfU19HRSAgNworI2RlZmluZSBTU0ZfU19MRSAgOAorI2RlZmluZSBTU0ZfU19BVVRPICA5CisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisKK3N0cnVjdCBzc2ZpbHRlcgoreworCWludCB0eXBlOworCXN0cnVjdCBzc2ZpbHRlciAqcG9zdDsKKwlzdHJ1Y3Qgc3NmaWx0ZXIgKnByZWQ7Cit9OworCitpbnQgc3NmaWx0ZXJfcGFyc2Uoc3RydWN0IHNzZmlsdGVyICoqZiwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBGSUxFICpmcCk7Cit2b2lkICpwYXJzZV9ob3N0Y29uZChjaGFyICphZGRyLCBib29sIGlzX3BvcnQpOwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbWlzYy9zc2ZpbHRlci55IGIvaXByb3V0ZTIvbWlzYy9zc2ZpbHRlci55Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MDZhZDgKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9taXNjL3NzZmlsdGVyLnkKQEAgLTAsMCArMSwyODkgQEAKKyV7CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorLyogTk9URTogQW5kcm9pZCB5YWNjIGJ1aWxkIHJ1bGVzIHRyYW5zZm9ybSBzc2ZpbHRlci55IGludG8gc3NmaWx0ZXIuaCwgYW5kCisgKiAjaW5jbHVkZSAic3NmaWx0ZXIuaCIgZ2V0cyB0aGlzIGZpbGUgaW5zdGVhZCBvZiB0aGUgc3NmaWx0ZXIuaCBpbiB0aGUKKyAqIHNvdXJjZSB0cmVlLiBUaGlzIGRvZXMgbm90IHdvcmsuICNpbmNsdWRlIDxzc2ZpbHRlci5oPiBpbnN0ZWFkLiAqLworI2luY2x1ZGUgPHNzZmlsdGVyLmg+CisKK3R5cGVkZWYgc3RydWN0IHNzZmlsdGVyICogc3NmaWx0ZXJfdDsKKworI2RlZmluZSBZWVNUWVBFIHNzZmlsdGVyX3QKKworc3RhdGljIHN0cnVjdCBzc2ZpbHRlciAqIGFsbG9jX25vZGUoaW50IHR5cGUsIHZvaWQgKnByZWQpCit7CisJc3RydWN0IHNzZmlsdGVyICpuID0gbWFsbG9jKHNpemVvZigqbikpOworCWlmIChuID09IE5VTEwpCisJCWFib3J0KCk7CisJbi0+dHlwZSA9IHR5cGU7CisJbi0+cHJlZCA9IHByZWQ7CisJbi0+cG9zdCA9IE5VTEw7CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBjaGFyCQkqKnl5X2FyZ3Y7CitzdGF0aWMgaW50CQl5eV9hcmdjOworc3RhdGljIEZJTEUJCSp5eV9mcDsKK3N0YXRpYyBzc2ZpbHRlcl90CSp5eV9yZXQ7CitzdGF0aWMgaW50IHRva190eXBlID0gLTE7CisKK3N0YXRpYyBpbnQgeXlsZXgodm9pZCk7CisKK3N0YXRpYyB2b2lkIHl5ZXJyb3IoY2hhciAqcykKK3sKKwlmcHJpbnRmKHN0ZGVyciwgInNzOiBiaXNvbiBiZWxsb3dzICh3aGlsZSBwYXJzaW5nIGZpbHRlcik6IFwiJXMhXCIiLCBzKTsKK30KKworJX0KKworJXRva2VuIEhPU1RDT05EIERDT05EIFNDT05EIERQT1JUIFNQT1JUIExFUSBHRVEgTkVRIEFVVE9CT1VORAorJWxlZnQgJ3wnCislbGVmdCAnJicKKyVub25hc3NvYyAnIScKKworJSUKK2FwcGxldDogbnVsbCBleHByCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqeXlfcmV0ID0gJDI7CisgICAgICAgICAgICAgICAgJCQgPSAkMjsKKyAgICAgICAgfQorICAgICAgICB8IG51bGwKKyAgICAgICAgOworbnVsbDogICAvKiBOT1RISU5HICovIHsgJCQgPSBOVUxMOyB9CisgICAgICAgIDsKK2V4cHI6CURDT05EIEhPU1RDT05ECisgICAgICAgIHsKKwkJJCQgPSBhbGxvY19ub2RlKFNTRl9EQ09ORCwgJDIpOworICAgICAgICB9CisgICAgICAgIHwgU0NPTkQgSE9TVENPTkQKKyAgICAgICAgeworCQkkJCA9IGFsbG9jX25vZGUoU1NGX1NDT05ELCAkMik7CisgICAgICAgIH0KKyAgICAgICAgfCBEUE9SVCBHRVEgSE9TVENPTkQKKyAgICAgICAgeworICAgICAgICAgICAgICAgICQkID0gYWxsb2Nfbm9kZShTU0ZfRF9HRSwgJDMpOworICAgICAgICB9CisgICAgICAgIHwgRFBPUlQgTEVRIEhPU1RDT05ECisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkJCA9IGFsbG9jX25vZGUoU1NGX0RfTEUsICQzKTsKKyAgICAgICAgfQorICAgICAgICB8IERQT1JUICc+JyBIT1NUQ09ORAorICAgICAgICB7CisgICAgICAgICAgICAgICAgJCQgPSBhbGxvY19ub2RlKFNTRl9OT1QsIGFsbG9jX25vZGUoU1NGX0RfTEUsICQzKSk7CisgICAgICAgIH0KKyAgICAgICAgfCBEUE9SVCAnPCcgSE9TVENPTkQKKyAgICAgICAgeworICAgICAgICAgICAgICAgICQkID0gYWxsb2Nfbm9kZShTU0ZfTk9ULCBhbGxvY19ub2RlKFNTRl9EX0dFLCAkMykpOworICAgICAgICB9CisgICAgICAgIHwgRFBPUlQgJz0nIEhPU1RDT05ECisgICAgICAgIHsKKwkJJCQgPSBhbGxvY19ub2RlKFNTRl9EQ09ORCwgJDMpOworICAgICAgICB9CisgICAgICAgIHwgRFBPUlQgTkVRIEhPU1RDT05ECisgICAgICAgIHsKKwkJJCQgPSBhbGxvY19ub2RlKFNTRl9OT1QsIGFsbG9jX25vZGUoU1NGX0RDT05ELCAkMykpOworICAgICAgICB9CisKKyAgICAgICAgfCBTUE9SVCBHRVEgSE9TVENPTkQKKyAgICAgICAgeworICAgICAgICAgICAgICAgICQkID0gYWxsb2Nfbm9kZShTU0ZfU19HRSwgJDMpOworICAgICAgICB9CisgICAgICAgIHwgU1BPUlQgTEVRIEhPU1RDT05ECisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkJCA9IGFsbG9jX25vZGUoU1NGX1NfTEUsICQzKTsKKyAgICAgICAgfQorICAgICAgICB8IFNQT1JUICc+JyBIT1NUQ09ORAorICAgICAgICB7CisgICAgICAgICAgICAgICAgJCQgPSBhbGxvY19ub2RlKFNTRl9OT1QsIGFsbG9jX25vZGUoU1NGX1NfTEUsICQzKSk7CisgICAgICAgIH0KKyAgICAgICAgfCBTUE9SVCAnPCcgSE9TVENPTkQKKyAgICAgICAgeworICAgICAgICAgICAgICAgICQkID0gYWxsb2Nfbm9kZShTU0ZfTk9ULCBhbGxvY19ub2RlKFNTRl9TX0dFLCAkMykpOworICAgICAgICB9CisgICAgICAgIHwgU1BPUlQgJz0nIEhPU1RDT05ECisgICAgICAgIHsKKwkJJCQgPSBhbGxvY19ub2RlKFNTRl9TQ09ORCwgJDMpOworICAgICAgICB9CisgICAgICAgIHwgU1BPUlQgTkVRIEhPU1RDT05ECisgICAgICAgIHsKKwkJJCQgPSBhbGxvY19ub2RlKFNTRl9OT1QsIGFsbG9jX25vZGUoU1NGX1NDT05ELCAkMykpOworICAgICAgICB9CisKKyAgICAgICAgfCBBVVRPQk9VTkQKKyAgICAgICAgeworICAgICAgICAgICAgICAgICQkID0gYWxsb2Nfbm9kZShTU0ZfU19BVVRPLCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgICB8IGV4cHIgJ3wnIGV4cHIKKyAgICAgICAgeworICAgICAgICAgICAgICAgICQkID0gYWxsb2Nfbm9kZShTU0ZfT1IsICQxKTsKKwkgICAgICAgICQkLT5wb3N0ID0gJDM7CisgICAgICAgIH0KKyAgICAgICAgfCBleHByIGV4cHIKKyAgICAgICAgeworICAgICAgICAgICAgICAgICQkID0gYWxsb2Nfbm9kZShTU0ZfQU5ELCAkMSk7CisJICAgICAgICAkJC0+cG9zdCA9ICQyOworICAgICAgICB9CisgICAgICAgIHwgZXhwciAnJicgZXhwcgorCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkJCA9IGFsbG9jX25vZGUoU1NGX0FORCwgJDEpOworCSAgICAgICAgJCQtPnBvc3QgPSAkMzsKKyAgICAgICAgfQorICAgICAgICB8ICchJyBleHByCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkJCA9IGFsbG9jX25vZGUoU1NGX05PVCwgJDIpOworICAgICAgICB9CisgICAgICAgIHwgJygnIGV4cHIgJyknCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkJCA9ICQyOworICAgICAgICB9Cis7CislJQorCitzdGF0aWMgY2hhciAqZ2V0X3Rva2VuX2Zyb21fbGluZShjaGFyICoqcHRyKQoreworCWNoYXIgKnRvaywgKmNwID0gKnB0cjsKKworCXdoaWxlICgqY3AgPT0gJyAnIHx8ICpjcCA9PSAnXHQnKSBjcCsrOworCisJaWYgKCpjcCA9PSAwKSB7CisJCSpwdHIgPSBjcDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJdG9rID0gY3A7CisKKwl3aGlsZSAoKmNwICE9IDAgJiYgKmNwICE9ICcgJyAmJiAqY3AgIT0gJ1x0JykgeworCQkvKiBCYWNrc2xhc2ggZXNjYXBlcyBldmVyeXRoaW5nLiAqLworCQlpZiAoKmNwID09ICdcXCcpIHsKKwkJCWNoYXIgKnRwOworCQkJZm9yICh0cCA9IGNwOyB0cCAhPSB0b2s7IHRwLS0pCisJCQkJKnRwID0gKih0cC0xKTsKKwkJCWNwKys7CisJCQl0b2srKzsKKwkJCWlmICgqY3AgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCQljcCsrOworCX0KKwlpZiAoKmNwKQorCQkqY3ArKyA9IDA7CisJKnB0ciA9IGNwOworCXJldHVybiB0b2s7Cit9CisKK2ludCB5eWxleCh2b2lkKQoreworCXN0YXRpYyBjaGFyIGFyZ2J1ZlsxMDI0XTsKKwlzdGF0aWMgY2hhciAqdG9rcHRyID0gYXJnYnVmOworCXN0YXRpYyBpbnQgYXJnYzsKKwljaGFyICpjdXJ0b2s7CisKKwlkbyB7CisJCXdoaWxlICgqdG9rcHRyID09IDApIHsKKwkJCXRva3B0ciA9IE5VTEw7CisJCQlpZiAoYXJnYyA8IHl5X2FyZ2MpIHsKKwkJCQl0b2twdHIgPSB5eV9hcmd2W2FyZ2NdOworCQkJCWFyZ2MrKzsKKwkJCX0gZWxzZSBpZiAoeXlfZnApIHsKKwkJCQl3aGlsZSAodG9rcHRyID09IE5VTEwpIHsKKwkJCQkJaWYgKGZnZXRzKGFyZ2J1Ziwgc2l6ZW9mKGFyZ2J1ZiktMSwgeXlfZnApID09IE5VTEwpCisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJYXJnYnVmW3NpemVvZihhcmdidWYpLTFdID0gMDsKKwkJCQkJaWYgKHN0cmxlbihhcmdidWYpID09IHNpemVvZihhcmdidWYpIC0gMSkgeworCQkJCQkJZnByaW50ZihzdGRlcnIsICJUb28gbG9uZyBsaW5lIGluIGZpbHRlciIpOworCQkJCQkJZXhpdCgtMSk7CisJCQkJCX0KKwkJCQkJaWYgKGFyZ2J1ZltzdHJsZW4oYXJnYnVmKS0xXSA9PSAnXG4nKQorCQkJCQkJYXJnYnVmW3N0cmxlbihhcmdidWYpLTFdID0gMDsKKwkJCQkJaWYgKGFyZ2J1ZlswXSA9PSAnIycgfHwgYXJnYnVmWzBdID09ICcwJykKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl0b2twdHIgPSBhcmdidWY7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0gd2hpbGUgKChjdXJ0b2sgPSBnZXRfdG9rZW5fZnJvbV9saW5lKCZ0b2twdHIpKSA9PSBOVUxMKTsKKworCWlmIChzdHJjbXAoY3VydG9rLCAiISIpID09IDAgfHwKKwkgICAgc3RyY21wKGN1cnRvaywgIm5vdCIpID09IDApCisJCXJldHVybiAnISc7CisJaWYgKHN0cmNtcChjdXJ0b2ssICImIikgPT0gMCB8fAorCSAgICBzdHJjbXAoY3VydG9rLCAiJiYiKSA9PSAwIHx8CisJICAgIHN0cmNtcChjdXJ0b2ssICJhbmQiKSA9PSAwKQorCQlyZXR1cm4gJyYnOworCWlmIChzdHJjbXAoY3VydG9rLCAifCIpID09IDAgfHwKKwkgICAgc3RyY21wKGN1cnRvaywgInx8IikgPT0gMCB8fAorCSAgICBzdHJjbXAoY3VydG9rLCAib3IiKSA9PSAwKQorCQlyZXR1cm4gJ3wnOworCWlmIChzdHJjbXAoY3VydG9rLCAiKCIpID09IDApCisJCXJldHVybiAnKCc7CisJaWYgKHN0cmNtcChjdXJ0b2ssICIpIikgPT0gMCkKKwkJcmV0dXJuICcpJzsKKwlpZiAoc3RyY21wKGN1cnRvaywgImRzdCIpID09IDApIHsKKwkJdG9rX3R5cGUgPSBEQ09ORDsKKwkJcmV0dXJuIERDT05EOworCX0KKwlpZiAoc3RyY21wKGN1cnRvaywgInNyYyIpID09IDApIHsKKyAgICAgICAgICAgICAgICB0b2tfdHlwZSA9IFNDT05EOworCQlyZXR1cm4gU0NPTkQ7CisgICAgICAgIH0KKwlpZiAoc3RyY21wKGN1cnRvaywgImRwb3J0IikgPT0gMCkgeworCQl0b2tfdHlwZSA9IERQT1JUOworCQlyZXR1cm4gRFBPUlQ7CisJfQorCWlmIChzdHJjbXAoY3VydG9rLCAic3BvcnQiKSA9PSAwKSB7CisJCXRva190eXBlID0gU1BPUlQ7CisJCXJldHVybiBTUE9SVDsKKwl9CisJaWYgKHN0cmNtcChjdXJ0b2ssICI+PSIpID09IDAgfHwKKwkgICAgc3RyY21wKGN1cnRvaywgImdlIikgPT0gMCB8fAorCSAgICBzdHJjbXAoY3VydG9rLCAiZ2VxIikgPT0gMCkKKwkJcmV0dXJuIEdFUTsKKwlpZiAoc3RyY21wKGN1cnRvaywgIjw9IikgPT0gMCB8fAorCSAgICBzdHJjbXAoY3VydG9rLCAibGUiKSA9PSAwIHx8CisJICAgIHN0cmNtcChjdXJ0b2ssICJsZXEiKSA9PSAwKQorCQlyZXR1cm4gTEVROworCWlmIChzdHJjbXAoY3VydG9rLCAiIT0iKSA9PSAwIHx8CisJICAgIHN0cmNtcChjdXJ0b2ssICJuZSIpID09IDAgfHwKKwkgICAgc3RyY21wKGN1cnRvaywgIm5lcSIpID09IDApCisJCXJldHVybiBORVE7CisJaWYgKHN0cmNtcChjdXJ0b2ssICI9IikgPT0gMCB8fAorCSAgICBzdHJjbXAoY3VydG9rLCAiPT0iKSA9PSAwIHx8CisJICAgIHN0cmNtcChjdXJ0b2ssICJlcSIpID09IDApCisJCXJldHVybiAnPSc7CisJaWYgKHN0cmNtcChjdXJ0b2ssICI+IikgPT0gMCB8fAorCSAgICBzdHJjbXAoY3VydG9rLCAiZ3QiKSA9PSAwKQorCQlyZXR1cm4gJz4nOworCWlmIChzdHJjbXAoY3VydG9rLCAiPCIpID09IDAgfHwKKwkgICAgc3RyY21wKGN1cnRvaywgImx0IikgPT0gMCkKKwkJcmV0dXJuICc8JzsKKwlpZiAoc3RyY21wKGN1cnRvaywgImF1dG9ib3VuZCIpID09IDApIHsKKwkJdG9rX3R5cGUgPSBBVVRPQk9VTkQ7CisJCXJldHVybiBBVVRPQk9VTkQ7CisJfQorCXl5bHZhbCA9ICh2b2lkKilwYXJzZV9ob3N0Y29uZChjdXJ0b2ssIHRva190eXBlID09IFNQT1JUIHx8IHRva190eXBlID09IERQT1JUKTsKKwlpZiAoeXlsdmFsID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJDYW5ub3QgcGFyc2UgZHN0L3NyYyBhZGRyZXNzLlxuIik7CisJCWV4aXQoMSk7CisJfQorCXJldHVybiBIT1NUQ09ORDsKK30KKworaW50IHNzZmlsdGVyX3BhcnNlKHN0cnVjdCBzc2ZpbHRlciAqKmYsIGludCBhcmdjLCBjaGFyICoqYXJndiwgRklMRSAqZnApCit7CisJeXlfYXJnYyA9IGFyZ2M7CisJeXlfYXJndiA9IGFyZ3Y7CisJeXlfZnAgICA9IGZwOworCXl5X3JldCAgPSBmOworCisJaWYgKHl5cGFyc2UoKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiBTb3JyeS5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbmV0ZW0vTWFrZWZpbGUgYi9pcHJvdXRlMi9uZXRlbS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTJlMTI1Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbmV0ZW0vTWFrZWZpbGUKQEAgLTAsMCArMSwyOSBAQAorRElTVEdFTiA9IG1ha2V0YWJsZSBub3JtYWwgcGFyZXRvIHBhcmV0b25vcm1hbAorRElTVERBVEEgPSBub3JtYWwuZGlzdCBwYXJldG8uZGlzdCBwYXJldG9ub3JtYWwuZGlzdCBleHBlcmltZW50YWwuZGlzdAorCitIT1NUQ0MgPz0gJChDQykKK0NDT1BUUyAgPSAkKENCVUlMRF9DRkxBR1MpCitMRExJQlMgKz0gLWxtIAorCithbGw6ICQoRElTVEdFTikgJChESVNUREFUQSkKKworJChESVNUR0VOKToKKwkkKEhPU1RDQykgJChDQ09QVFMpIC1JLi4vaW5jbHVkZSAtbyAkQCAkQC5jIC1sbQorCislLmRpc3Q6ICUKKwkuLyQqID4gJEAKKworZXhwZXJpbWVudGFsLmRpc3Q6IG1ha2V0YWJsZSBleHBlcmltZW50YWwuZGF0CisJLi9tYWtldGFibGUgZXhwZXJpbWVudGFsLmRhdCA+IGV4cGVyaW1lbnRhbC5kaXN0CisKK3N0YXRzOiBzdGF0cy5jCisJJChIT1NUQ0MpICQoQ0NPUFRTKSAtSS4uL2luY2x1ZGUgLW8gJEAgJEAuYyAtbG0KKworaW5zdGFsbDogYWxsCisJbWtkaXIgLXAgJChERVNURElSKSQoTElCRElSKS90YworCWZvciBpIGluICQoRElTVERBVEEpOyBcCisJZG8gaW5zdGFsbCAtbSA2NDQgJCRpICQoREVTVERJUikkKExJQkRJUikvdGM7IFwKKwlkb25lCisKK2NsZWFuOgorCXJtIC1mICQoRElTVERBVEEpICQoRElTVEdFTikKZGlmZiAtLWdpdCBhL2lwcm91dGUyL25ldGVtL1JFQURNRS5kaXN0cmlidXRpb24gYi9pcHJvdXRlMi9uZXRlbS9SRUFETUUuZGlzdHJpYnV0aW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZjdlY2IKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9uZXRlbS9SRUFETUUuZGlzdHJpYnV0aW9uCkBAIC0wLDAgKzEsOTcgQEAKK05vdGVzIGFib3V0IGRpc3RyaWJ1dGlvbiB0YWJsZXMgZnJvbSBOaXN0bmV0IAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSS4gQWJvdXQgdGhlIGRpc3RyaWJ1dGlvbiB0YWJsZXMKKworVGhlIHRhYmxlIHVzZWQgZm9yICJzeW50aGVzaXppbmciIHRoZSBkaXN0cmlidXRpb24gaXMgZXNzZW50aWFsbHkgYSBzY2FsZWQsCit0cmFuc2xhdGVkLCBpbnZlcnNlIHRvIHRoZSBjdW11bGF0aXZlIGRpc3RyaWJ1dGlvbiBmdW5jdGlvbi4KKworSGVyZSdzIGhvdyB0byB0aGluayBhYm91dCBpdDogTGV0IEYoKSBiZSB0aGUgY3VtdWxhdGl2ZSBkaXN0cmlidXRpb24KK2Z1bmN0aW9uIGZvciBhIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbiBYLiAgV2UnbGwgYXNzdW1lIHdlJ3ZlIHNjYWxlZAordGhpbmdzIHNvIHRoYXQgWCBoYXMgbWVhbiAwIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gMSwgdGhvdWdoIHRoYXQncyBub3QKK3NvIGltcG9ydGFudCBoZXJlLiAgVGhlbjoKKworCUYoeCkgPSBQKFggPD0geCkgPSBcaW50X3staW5mfV54IGYKKword2hlcmUgZiBpcyB0aGUgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbi4KKworRiBpcyBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcsIHNvIGhhcyBhbiBpbnZlcnNlIGZ1bmN0aW9uIEcsIHdpdGggcmFuZ2UKKzAgdG8gMS4gIEhlcmUsIEcodCkgPSB0aGUgeCBzdWNoIHRoYXQgUChYIDw9IHgpID0gdC4gIChJbiBnZW5lcmFsLCBHIG1heQoraGF2ZSBzaW5ndWxhcml0aWVzIGlmIFggaGFzIHBvaW50IG1hc3NlcywgaS5lLiwgcG9pbnRzIHggc3VjaCB0aGF0CitQKFggPSB4KSA+IDAuKQorCitOb3cgd2UgY3JlYXRlIGEgdGFidWxhciByZXByZXNlbnRhdGlvbiBvZiBHIGFzIGZvbGxvd3M6ICBDaG9vc2Ugc29tZSB0YWJsZQorc2l6ZSBOLCBhbmQgZm9yIHRoZSBpdGggZW50cnksIHB1dCBpbiBHKGkvTikuICBMZXQncyBjYWxsIHRoaXMgdGFibGUgVC4KKworVGhlIGNsYWltIG5vdyBpcywgSSBjYW4gY3JlYXRlIGEgKGRpc2NyZXRlKSByYW5kb20gdmFyaWFibGUgWSB3aG9zZQorZGlzdHJpYnV0aW9uIGhhcyB0aGUgc2FtZSBhcHByb3hpbWF0ZSAic2hhcGUiIGFzIFgsIHNpbXBseSBieSBsZXR0aW5nCitZID0gVChVKSwgd2hlcmUgVSBpcyBhIGRpc2NyZXRlIHVuaWZvcm0gcmFuZG9tIHZhcmlhYmxlIHdpdGggcmFuZ2UgMSB0byBOLgorVG8gc2VlIHRoaXMsIGl0J3MgZW5vdWdoIHRvIHNob3cgdGhhdCBZJ3MgY3VtdWxhdGl2ZSBkaXN0cmlidXRpb24gZnVuY3Rpb24sCisobGV0J3MgY2FsbCBpdCBIKSwgaXMgYSBkaXNjcmV0ZSBhcHByb3hpbWF0aW9uIHRvIEYuICBCdXQKKworCUgoeCkgPSBQKFkgPD0geCkKKwkgICAgID0gKCMgb2YgZW50cmllcyBpbiBUIDw9IHgpIC8gTiAgIC0tIGFzIFkgY2hvc2VuIHVuaWZvcm1seSBmcm9tIFQKKwkgICAgID0gaS9OLCB3aGVyZSBpIGlzIHRoZSBsYXJnZXN0IGludGVnZXIgc3VjaCB0aGF0IEcoaS9OKSA8PSB4CisJICAgICA9IGkvTiwgd2hlcmUgaSBpcyB0aGUgbGFyZ2VzdCBpbnRlZ2VyIHN1Y2ggdGhhdCBpL04gPD0gRih4KQorCSAgICAgCQktLSBzaW5jZSBHIGFuZCBGIGFyZSBpbnZlcnNlIGZ1bmN0aW9ucyAoYW5kIEYgaXMKKwkgICAgIAkJICAgaW5jcmVhc2luZykKKwkgICAgID0gZmxvb3IoTipGKHgpKS9OCisKK2FzIGRlc2lyZWQuCisKK0lJLiBIb3cgdG8gY3JlYXRlIGRpc3RyaWJ1dGlvbiB0YWJsZXMgKGluIHRoZW9yeSkKKworSG93IGNhbiB3ZSBjcmVhdGUgdGhpcyB0YWJsZSBpbiBwcmFjdGljZT8gSW4gc29tZSBjYXNlcywgRiBtYXkgaGF2ZSBhCitzaW1wbGUgZXhwcmVzc2lvbiB3aGljaCBhbGxvd3MgZXZhbHVhdGluZyBpdHMgaW52ZXJzZSBkaXJlY3RseS4gIFRoZQorcGFyZXRvIGRpc3RyaWJ1dGlvbiBpcyBvbmUgZXhhbXBsZSBvZiB0aGlzLiAgSW4gb3RoZXIgY2FzZXMsIGFuZAorZXNwZWNpYWxseSBmb3IgbWF0Y2hpbmcgYW4gZXhwZXJpbWVudGFsbHkgb2JzZXJ2ZWQgZGlzdHJpYnV0aW9uLCBpdCdzCitlYXNpZXN0IHNpbXBseSB0byBjcmVhdGUgYSB0YWJsZSBmb3IgRiBhbmQgImludmVydCIgaXQuICBIZXJlLCB3ZSBnaXZlCithIGNvbmNyZXRlIGV4YW1wbGUsIG5hbWVseSBob3cgdGhlIG5ldyAiZXhwZXJpbWVudGFsIiBkaXN0cmlidXRpb24gd2FzCitjcmVhdGVkLgorCisxLiBDb2xsZWN0IGVub3VnaCBkYXRhIHBvaW50cyB0byBjaGFyYWN0ZXJpemUgdGhlIGRpc3RyaWJ1dGlvbi4gIEhlcmUsIEkKK2NvbGxlY3RlZCAyNSwwMDAgInBpbmciIHJvdW5kdHJpcCB0aW1lcyB0byBhICJkaXN0YW50IiBwb2ludCAodGltZS5uaXN0LmdvdikuCitUaGF0J3MgZmFyIG1vcmUgZGF0YSB0aGFuIGlzIHJlYWxseSBuZWNlc3NhcnksIGJ1dCBpdCB3YXMgZmFpcmx5IHBhaW5sZXNzIHRvCitjb2xsZWN0IGl0LCBzby4uLgorCisyLiBOb3JtYWxpemUgdGhlIGRhdGEgc28gdGhhdCBpdCBoYXMgbWVhbiAwIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gMS4KKworMy4gRGV0ZXJtaW5lIHRoZSBjdW11bGF0aXZlIGRpc3RyaWJ1dGlvbi4gIFRoZSBjb2RlIEkgd3JvdGUgY3JlYXRlcyBhIHRhYmxlCitjb3ZlcmluZyB0aGUgcmFuZ2UgLTEwIHRvICsxMCwgd2l0aCBncmFudWxhcml0eSAuMDAwMDUuICBPYnZpb3VzbHksIHRoaXMKK2lzIGFic3VyZGx5IG92ZXItcHJlY2lzZSwgYnV0IHNpbmNlIGl0J3MgYSBvbmUtdGltZSBvbmx5IGNvbXB1dGF0aW9uLCBJCitmaWd1cmVkIGl0IGhhcmRseSBtYXR0ZXJlZC4KKworNC4gSW52ZXJ0IHRoZSB0YWJsZTogZm9yIGVhY2ggdGFibGUgZW50cnkgRih4KSA9IHksIG1ha2UgdGhlIHkqVEFCTEVTSVpFCisoaGVyZSwgNDA5NikgZW50cnkgYmUgeCpUQUJMRUZBQ1RPUiAoaGVyZSwgODE5MikuICBUaGlzIGNyZWF0ZXMgYSB0YWJsZQorZm9yIHRoZSAoIm5vcm1hbGl6ZWQiKSBpbnZlcnNlIG9mIHNpemUgVEFCTEVTSVpFLCBjb3ZlcmluZyBpdHMgZG9tYWluIDAKK3RvIDEgd2l0aCBncmFudWxhcml0eSAxL1RBQkxFU0laRS4gIE5vdGUgdGhhdCBldmVuIHdpdGggdGhlIGdyYW51bGFyaXR5Cit1c2VkIGluIGNyZWF0aW5nIHRoZSB0YWJsZSBmb3IgRiwgaXQncyBwb3NzaWJsZSBub3QgYWxsIHRoZSBlbnRyaWVzIGluCit0aGUgdGFibGUgZm9yIEcgd2lsbCBiZSBmaWxsZWQgaW4uICBTbywgbWFrZSBhIHBhc3MgdGhyb3VnaCB0aGUKK2ludmVyc2UncyB0YWJsZSwgZmlsbGluZyBpbiBhbnkgbWlzc2luZyBlbnRyaWVzIGJ5IGxpbmVhciBpbnRlcnBvbGF0aW9uLgorCitJSUkuIEhvdyB0byBjcmVhdGUgZGlzdHJpYnV0aW9uIHRhYmxlcyAoaW4gcHJhY3RpY2UpCisKK0lmIHlvdSB3YW50IHRvIGRvIGFsbCB0aGlzIHlvdXJzZWxmLCBJJ3ZlIHByb3ZpZGVkIHNldmVyYWwgdG9vbHMgdG8gaGVscDoKKworMS4gbWFrZXRhYmxlIGRvZXMgdGhlIHN0ZXBzIDItNCBhYm92ZSwgYW5kIHRoZW4gZ2VuZXJhdGVzIHRoZSBhcHByb3ByaWF0ZQoraGVhZGVyIGZpbGUuICBTbyBpZiB5b3UgaGF2ZSB5b3VyIG93biB0aW1lIGRpc3RyaWJ1dGlvbiwgeW91IGNhbiBnZW5lcmF0ZQordGhlIGhlYWRlciBzaW1wbHkgYnk6CisKKwltYWtldGFibGUgPCB0aW1lLnZhbHVlcyA+IGhlYWRlci5oCisKKzIuIEFzIGV4cGxhaW5lZCBpbiB0aGUgb3RoZXIgUkVBRE1FIGZpbGUsIHRoZSBzb21ld2hhdCBzbGVhenkgd2F5IEkgaGF2ZQorb2YgZ2VuZXJhdGluZyBjb3JyZWxhdGVkIHZhbHVlcyBuZWVkcyBjb3JyZWN0aW9uLiAgWW91IGNhbiBnZW5lcmF0ZSB5b3VyCitvd24gY29ycmVjdGlvbiB0YWJsZXMgYnkgY29tcGlsaW5nIG1ha2VzaWd0YWJsZSBhbmQgbWFrZW11dGFibGUgd2l0aAoreW91ciBoZWFkZXIgZmlsZS4gIENoZWNrIHRoZSBNYWtlZmlsZSB0byBzZWUgaG93IHRoaXMgaXMgZG9uZS4KKworMy4gV2FybmluZzogbWFrZXRhYmxlLCBtYWtlc2lndGFibGUgYW5kIGVzcGVjaWFsbHkgbWFrZW11dGFibGUgZG8KK2Vub3Jtb3VzIGFtb3VudHMgb2YgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYy4gIERvbid0IHRyeSBydW5uaW5nCit0aGVzZSBvbiBhbiBvbGQgNDg2LiAgKE5JU1QgTmV0IGl0c2VsZiB3aWxsIHJ1biBmaW5lIG9uIHN1Y2ggYQorc3lzdGVtLCBzaW5jZSBpbiBvcGVyYXRpb24sIGl0IGp1c3QgbmVlZHMgdG8gZG8gYSBmZXcgc2ltcGxlIGludGVncmFsCitjYWxjdWxhdGlvbnMuICBCdXQgZ2V0dGluZyB0aGVyZSB0YWtlcyBzb21lIHdvcmsuKQorCis0LiBUaGUgdGFibGVzIHByb2R1Y2VkIGFyZSBhbGwgbm9ybWFsaXplZCBmb3IgbWVhbiAwIGFuZCBzdGFuZGFyZAorZGV2aWF0aW9uIDEuICBIb3cgZG8geW91IGtub3cgd2hhdCB2YWx1ZXMgdG8gdXNlIGZvciByZWFsPyAgSGVyZSwgSSd2ZQorcHJvdmlkZWQgYSBzaW1wbGUgInN0YXRzIiB1dGlsaXR5LiAgR2l2ZSBpdCBhIHNlcmllcyBvZiBmbG9hdGluZyBwb2ludAordmFsdWVzLCBhbmQgaXQgd2lsbCByZXR1cm4gdGhlaXIgbWVhbiAobXUpLCBzdGFuZGFyZCBkZXZpYXRpb24gKHNpZ21hKSwKK2FuZCBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCAocmhvKS4gIFlvdSBjYW4gdGhlbiBwbHVnIHRoZXNlIHZhbHVlcworZGlyZWN0bHkgaW50byBOSVNUIE5ldC4KZGlmZiAtLWdpdCBhL2lwcm91dGUyL25ldGVtL2V4cGVyaW1lbnRhbC5kYXQgYi9pcHJvdXRlMi9uZXRlbS9leHBlcmltZW50YWwuZGF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NjNhM2UKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9uZXRlbS9leHBlcmltZW50YWwuZGF0CkBAIC0wLDAgKzEsMTM0NDggQEAKKzIxMS42CisyMDUuNgorMjAzLjAKKzIxOC42CisyMTMuOQorMTk5LjEKKzIwOC43CisyMDcuNworMjAzLjQKKzIwMS43CisyMDAuMworMjEzLjgKKzIxMy40CisyMDkuOAorMjA0LjMKKzIwMS44CisxOTYuMworMjE2LjIKKzIwOC45CisyMDIuNAorMjA1LjIKKzIxMS4xCisyMTAuOQorMjA4LjUKKzE5OS45CisyMTEuNgorMjExLjkKKzIwNC42CisyMTUuNAorMjAyLjUKKzIwNi41CisyMDEuMQorMTk4LjQKKzIyMC4yCisyMDMuNworMjE5LjUKKzE5OS4xCisyMDcuNgorMjA1LjMKKzIwMi4zCisyMTkuNworMjMwLjAKKzIxMS4wCisyMDIuNworMjA5LjkKKzIxNS40CisyMDIuOQorMjA5LjYKKzIwMC41CisxOTcuMworMjEyLjMKKzIwNy42CisyMTAuNQorMjAyLjcKKzIwNS43CisyMTEuMgorMjA4LjAKKzIxMS4wCisyMDkuNAorMjA0LjgKKzIwNC44CisyMDguNworMjEwLjEKKzIwNS4zCisyMDIuNQorMjEwLjQKKzIwOS40CisyMDQuNQorMjA0LjcKKzIxNS4wCisyMDIuNgorMjA5LjkKKzIyMC4yCisyMDMuOAorMjA2LjMKKzE5OS40CisyMjEuOAorMjAwLjAKKzE5OS42CisyMDkuMworMjA2LjIKKzIxNS44CisxOTYuOQorMjExLjYKKzE5OC40CisyMDEuMgorMjA5LjQKKzIwNC4zCisyMTkuMAorMjEyLjcKKzIxNC42CisxOTYuMworMjAyLjAKKzIwMS45CisxOTcuNQorMjI5LjUKKzIwNy41CisyMTMuOAorMjA5LjIKKzIxMi45CisxOTMuOQorMjAwLjgKKzIwOC42CisxOTYuOAorMjAxLjMKKzIwNC45CisyMDQuNworMjA5LjUKKzIxMS4zCisyMTUuMworMjAzLjcKKzE5MC4xCisyMzUuNgorMjAzLjgKKzIxMC4wCisyMDkuNworMjE0LjMKKzIxMy4wCisyMDYuMworMTk3LjcKKzIwOC4yCisyMjYuMworMjE2LjUKKzE5OC4wCisyMDEuMworMjExLjMKKzE5NS44CisyMTAuOQorMjA4LjEKKzIwMS4yCisyMDEuNworMjEzLjEKKzIwNy45CisyMDYuNgorMjA3LjEKKzIwMi4yCisxOTkuNgorMjA1LjUKKzIwNy4zCisyMTkuNworMjA0LjEKKzIwNC40CisyMDkuMAorMjEyLjcKKzE5Ni40CisyMTQuMAorMjA4LjgKKzIwOS43CisyMTcuMgorMTk2LjIKKzE5NS4wCisyMjcuNworMjA3LjIKKzIzMy4zCisyMDcuOQorMjA0LjAKKzE5NC40CisyMTkuMgorMjA4LjcKKzE5OC42CisyMDUuMAorMjA0LjAKKzIyMy43CisyMDcuNAorMjA5LjIKKzIwOC43CisyMDUuNAorMjEyLjgKKzIwNy44CisyMDMuMAorMjA0LjEKKzIyMS4wCisxOTguNAorMjE3LjcKKzIxOC40CiszNzQuMgorMjIwLjEKKzIxMC44CisyMTIuMQorMjE0LjMKKzIxMy4zCisyMTAuMworMjAyLjQKKzIwOS43CisyMTguMQorMjA1LjAKKzIwNC41CisyMjAuMworMjA5LjgKKzIxOC4zCisyMTYuNgorMjA2LjAKKzIwOC45CisyMjEuMAorMjEzLjAKKzIwMi4xCisyMDQuMgorMjIwLjYKKzIxMi40CisyMjYuMQorMjA4LjgKKzIwNi4xCisyMjAuNworMjE5LjMKKzIxMC45CisyMTEuMgorMjEzLjAKKzIwMS40CisyMTAuNQorMjA2LjIKKzIwMS45CisyMjQuNQorMjE5LjMKKzIwMS4xCisxOTUuNgorMjIzLjYKKzE5Ni43CisyMTMuNworMjAyLjMKKzIxNS42CisyMTEuNAorMjA5LjYKKzIwNy42CisyMTIuNAorMjAzLjQKKzIwNS40CisyMTYuMQorMjE2LjcKKzIwNS4zCisyMTMuOQorMjA4LjkKKzIwOC40CisyMDUuMQorMTk5LjMKKzIwMC42CisxOTkuMQorMjAzLjIKKzIwNy42CisyMDMuOAorMjAxLjkKKzIwOC41CisxOTYuNAorMjEzLjYKKzIxNy42CisyMDEuNQorMjEwLjEKKzIxMy41CisyMDMuOAorMjE0LjEKKzIxMS45CisyMDEuNQorMTg2LjkKKzE5OS43CisyMDkuMQorMjAwLjIKKzIwNS44CisyMDYuNworMjAwLjAKKzE5OC4xCisyMDkuMworMjA3LjgKKzIwOC43CisyMDguMAorMjA4LjYKKzIzMS4zCisyMTQuNQorMjEwLjEKKzIwMC44CisyMDguOQorMjE2LjkKKzIwNS43CisyMTQuOQorMjM2LjgKKzIwMC45CisyMTkuMQorMjA0LjYKKzIxMC4wCisyMTQuMAorMjIyLjYKKzIwOS42CisyMDcuMAorMTk2LjMKKzIwNy43CisyMDcuOQorMjA4LjAKKzIyMC4yCisxOTguMgorMjA0LjkKKzIwNC4xCisyMDEuMAorMjA0LjgKKzIxMy4zCisyMDMuOQorMjIyLjUKKzIwNS4yCisyMDMuNQorMjA5LjcKKzIxMi4xCisyMTAuMQorMjIxLjEKKzIxMC4yCisyMDguMAorMjAxLjQKKzIwOS4wCisyMTEuOQorMjAxLjYKKzIxNC40CisxOTkuNgorMTk4LjgKKzIxMC4yCisyMDcuMworMjA2LjUKKzIwNC44CisxOTYuMworMTk5LjgKKzIwNi40CisxOTUuMworMjAyLjgKKzIwMi43CisyMDMuOAorMjExLjIKKzIwOC40CisxOTguNgorMjAyLjAKKzIxNC45CisyMDQuMgorMjAxLjEKKzE5NS45CisxOTYuMQorMjExLjIKKzE5Ny4wCisyMDcuNworMTk2LjYKKzIwNS43CisyMTEuNAorMjAxLjQKKzIwNS4wCisxOTUuNQorMTk4LjkKKzIxNC40CisyMDcuMworMjA0LjIKKzIwNy4yCisxOTguNQorMjIwLjcKKzIxNC4xCisyMTMuMgorMjA3LjcKKzIwMy42CisyNjUuOAorMjIxLjAKKzIxMy4xCisxOTUuNAorMTk3LjMKKzIxMy4wCisyMDcuNworMjA2LjAKKzE5OC40CisyMDIuMworMjEzLjkKKzIxOC42CisyMDcuNgorMjA2LjEKKzIxMi44CisyMTYuOAorMjEzLjcKKzIwOS44CisxOTguMQorMjAyLjQKKzIwNS4zCisyMDcuMAorMjA5LjIKKzIwOS45CisyMDQuNAorMTk5LjYKKzIwNS41CisyMDMuOQorMjE2LjAKKzIxMy4xCisyMDIuNAorMTk5LjAKKzIxOS41CisxOTMuOQorMTk3LjMKKzIxMi4yCisyMTYuNworMjE3LjUKKzIwMS4wCisyMDYuMgorMjAyLjkKKzIxMS4zCisyMDMuMQorMjE4LjAKKzIwOC42CisyMTcuOAorMjA5LjAKKzIxMS44CisyMjAuMQorMjEyLjcKKzIwNy4yCisyMjEuMgorMjE1LjIKKzE5Ni45CisyMTYuNgorMjAzLjEKKzIwNy4xCisyMTYuNworMjA2LjcKKzIxNS4wCisyMTkuMworMjA0LjMKKzIxOS42CisyMDcuMQorMjExLjgKKzIxMC4yCisyMTcuMgorMjA3LjkKKzIxOS45CisyMDUuNAorMjAxLjEKKzIxNC4xCisyMDUuOAorMjEyLjUKKzIyMi44CisyMTEuOQorMjE3LjQKKzIwMy44CisyMjIuOQorMjA2LjYKKzIwNy42CisxOTcuNQorMjA2LjIKKzIxOC41CisyMjAuMworMjA3LjcKKzIwMy41CisyMjYuNAorMjE2LjgKKzIwNi4wCisxOTMuMgorMTk4LjIKKzIwMS4zCisyMDIuNAorMjA4LjUKKzIxMi42CisyMDUuMAorMjAyLjIKKzIxMC4wCisyMDIuNAorMjAzLjkKKzE5My4zCisyMTIuNAorMjAzLjQKKzIxMi4xCisyMDYuMQorMjA2LjkKKzIwNy4wCisyMTYuMQorMjAxLjEKKzIwNC43CisyMDIuNAorMjA3LjUKKzIwMy45CisyMDAuOQorMjEwLjAKKzIwNy4xCisyMTcuMgorMTk3LjQKKzE5OS4yCisyMTAuOAorMjA5LjIKKzIxOC40CisyMDAuMgorMjExLjcKKzIxMy42CisyMDMuMworMTk3LjkKKzIwMy4wCisyMDQuMgorMjA3LjkKKzIwOS40CisyMjUuNAorMjM3LjMKKzIwOS41CisyMDguMgorMjA3LjUKKzIwNy4wCisyMDMuMAorMjE5LjMKKzIyOC4zCisyMTMuNQorMjA1LjEKKzE5OC45CisyMTIuNworMjAxLjUKKzIxMC4wCisyMDYuNQorMjAzLjMKKzIwNi4xCisyMTAuMQorMjE5LjcKKzIwNi44CisyMTUuNAorMjIwLjQKKzIxNy4zCisyMTEuNAorMjA2LjAKKzIwOC4zCisyMDcuMworMjA1LjUKKzIxMC44CisyMDkuMworMTk3LjIKKzIwNy4yCisxOTEuNworMjA0LjIKKzIwNy4yCisyMTYuMQorMjA5LjEKKzIwMy44CisyMDEuOAorMjA4LjcKKzIxMi40CisyMTQuNQorMjEzLjgKKzIwMS4zCisyMTkuNworMjE0LjgKKzIxMS45CisyMjMuOAorMjA4LjYKKzIwMy41CisyMDcuNAorMjA3LjAKKzE5OC4wCisyMDguMgorMjE4LjYKKzIwNS4xCisyMTQuNgorMjE1LjIKKzIxNS4zCisyMDQuMworMjEwLjEKKzIyMS45CisyMTAuNworMTk4LjIKKzIwNS4yCisyMDEuMQorMjE5LjAKKzIwNy4yCisyMDUuOQorMjAzLjgKKzIwMC41CisyMTcuNQorMjA4LjcKKzIwOC40CisxOTIuNgorMjExLjAKKzIwOS4xCisyMDYuNQorMTk3LjQKKzIwMi4xCisyMTAuMAorMTk4LjMKKzIyMi4yCisyMTEuOQorMjEyLjMKKzIyMi4yCisxOTUuMQorMjAwLjcKKzIxMi4xCisyMDguMworMjExLjgKKzIxMS43CisyMDYuNQorMjExLjgKKzIwNy42CisyMTQuMgorMjA3LjcKKzIwNC43CisyMDguMgorMjA4LjQKKzIwNy45CisyMTIuMQorMjIzLjIKKzIwNi4zCisyMDUuNgorMjAxLjgKKzIxMS45CisyMDcuNgorMjAzLjAKKzIyMS4yCisyMDYuMworMjIyLjQKKzI1My41CisyMDQuNAorMjE4LjkKKzIxMS45CisyMTAuOQorMjE0LjAKKzIyNi43CisyMTQuNAorMTk5LjcKKzIxMy44CisyMDcuMAorMjAxLjgKKzIwNi42CisyMDMuMQorMjAyLjEKKzIwMy42CisyMTMuOQorMTk2LjkKKzIwMC40CisyMDQuNgorMzMzLjQKKzIwNC41CisyMjAuOQorMjA3LjMKKzIxMi4xCisyMDMuNworMjAwLjkKKzE5OC4yCisyMDQuMAorMjAxLjQKKzE5OC4yCisyMDkuNgorMjExLjUKKzIwMS4yCisyMDAuNAorMjA3LjQKKzIwMC43CisyMTMuOAorMjA3LjcKKzE4OC4wCisyMTAuMAorMjEwLjUKKzIwNy4zCisxOTguNgorMjA2LjEKKzE4Ni45CisyMDEuNAorMjA0LjAKKzIwMC44CisyMDcuOAorMjExLjcKKzE5OC43CisyMDYuMQorMjEzLjAKKzIxNC44CisyMTIuOAorMjA4LjgKKzIxMC40CisyMDYuNQorMjEwLjEKKzIwMS43CisyMDIuNworMjAxLjMKKzE5NC4xCisyMDAuOAorMTk2LjgKKzIwNC4yCisyMTcuNQorMjA5LjAKKzE5OC43CisyMDMuMgorMjEzLjgKKzE5OC4wCisyMDcuMQorMjA0LjAKKzIxNS4zCisxOTkuNQorMjE0LjEKKzIwMC4xCisyMDYuOQorMjE5LjkKKzIwNC44CisyMDguNgorMjA3LjgKKzIwNy41CisyMDMuOAorMjEwLjkKKzIxMC42CisyMDUuMworMjAyLjEKKzIxMi45CisyMTQuOAorMjEwLjkKKzIxNy4yCisyMTguMworMjIxLjUKKzIwMS44CisyMTIuNworMjE1LjAKKzIwNi43CisyMjIuOAorMjEwLjkKKzIxMS41CisyMDIuMAorMjA4LjEKKzI2OC45CisyMDUuOAorMjA0LjAKKzE5OC40CisyMDYuMworMjA5LjMKKzIwNi40CisyMDcuNAorMjI2LjkKKzIwOS45CisxOTkuNgorMjA2LjUKKzIxMC45CisyMjQuMQorMjExLjkKKzIxNC40CisyMTIuMgorMjExLjUKKzIwOS40CisyMDUuMworMjA0LjgKKzIwNy43CisyMDguOQorMjEzLjcKKzIwMS4wCisyMTcuNAorMTk4LjEKKzIxOS4wCisyMDYuNQorMjI5LjEKKzIyMC4xCisxOTYuOAorMjAzLjEKKzIwOC44CisyMDEuNworMTk1LjcKKzIwNy4wCisyMDIuNAorMjA2LjYKKzIwNC45CisxOTYuNgorMjA0LjMKKzE5OC42CisyMDMuOQorMjE1LjgKKzE5NC45CisyMDIuNworMjI1LjUKKzIwNS45CisyMDEuNAorMjEzLjEKKzIxNC4yCisyMTguOAorMjA5LjQKKzIwNC40CisyMDYuNworMjA5LjgKKzE5OC40CisyMTEuOAorMjEyLjEKKzIwOS4xCisyMDIuMworMjEzLjcKKzIxNS41CisyMTguMworMjA5LjEKKzIxNi42CisyMTQuOAorMjA2LjQKKzIwNS42CisyMTQuNAorMjA5LjIKKzIxMS43CisyMTEuMworMjExLjAKKzIwNS42CisyMDQuMgorMTkxLjcKKzIxMy44CisyMDQuOQorMjA1LjMKKzIxMi4wCisxOTkuOQorMTk4LjMKKzIxMS44CisyMDMuMAorMjEyLjIKKzIwMy4wCisyMDEuOAorMjE0LjQKKzIxNC4xCisxOTkuNgorMjA1LjMKKzIwOC4yCisxOTYuNworMTk2LjcKKzIwOS4xCisyMDUuMQorMjEyLjUKKzIxMy4xCisxOTcuMworMjA4LjgKKzIxOC4wCisyMjAuMAorMTk4LjQKKzIwNi4zCisyMDYuOQorMjUzLjIKKzE5NC4zCisyMDIuNgorMjEwLjYKKzIxOS4xCisxOTcuOAorMTk3LjEKKzE5NC4wCisyMTEuNgorMjA5LjYKKzE5OC4zCisyMTMuMAorMjA3LjcKKzIwNy4wCisyMTMuMworMjA2LjkKKzE5Ny42CisyMDQuOAorMjAyLjAKKzIwMC4wCisyMTUuMgorMjA0LjUKKzIwNi4zCisyMDYuNworMjAzLjIKKzE5NC45CisyMDYuMworMjA5LjkKKzIxMC42CisyMTQuMgorMjA4LjYKKzIwNy40CisyMTMuOQorMjEwLjQKKzIxMC4wCisyMDAuNgorMjAzLjgKKzIwMi43CisyMDQuMgorMjAyLjcKKzIxMC4yCisxOTIuNQorMjE1LjQKKzIxMS43CisyMDguMworMjA0LjgKKzIwMy4zCisxOTcuNworMjE2LjcKKzIwMC45CisyMDMuNgorMjA4LjYKKzIwNi41CisyMDkuOQorMjAwLjEKKzE5OC40CisyMDMuMworMjEwLjQKKzIxMS42CisyMDIuMAorMjAzLjEKKzIwNC4wCisyMDQuMAorMjE1LjAKKzIxMS40CisyMDIuMAorMTk3LjIKKzE5Ny42CisyMDkuOQorMjA1LjQKKzIxMy4xCisxOTkuMQorMjEyLjQKKzIxNi4xCisyMTguMworMjE0LjYKKzIyNC4xCisyMDYuOQorMTk5LjQKKzIxMy40CisyNjEuMgorMTk5LjQKKzIwOC44CisyMDkuOQorMjA1LjcKKzIwMy4xCisyMDMuMgorMjA0LjYKKzIwMS42CisyMTAuNgorMjEzLjIKKzIxNC44CisyMDMuOAorMjA0LjkKKzIyMC43CisyMDEuNQorMjEyLjUKKzIxNi44CisyMDkuNworMjAzLjEKKzIxMy4zCisyMDQuNworMjE4LjIKKzIxNS41CisyMTUuNgorMjExLjYKKzIxNC4yCisyMDUuMQorMjE2LjYKKzIxNi4zCisyMDMuNQorMjAwLjgKKzIxMy43CisyMjEuOQorMjE1LjAKKzIxMC4yCisyMTcuMQorMjE0LjcKKzIwOC44CisyMTcuNAorMjMxLjEKKzIxMy43CisyMTUuMAorMjEzLjUKKzIxNi43CisyMDcuNworMjAxLjAKKzIxMC40CisyMTAuOQorMjA2LjcKKzIwMy43CisxOTkuMgorMjA5LjMKKzIwNi4zCisyMDIuNAorMjEwLjEKKzIxMi4zCisyMDIuMgorMjA3LjIKKzE5Ny44CisyMDUuOQorMjAyLjAKKzIxNC4yCisyMDMuNQorMjA0LjQKKzIwMC4wCisyMDQuMAorMTkzLjgKKzE5Mi4zCisyMjkuMAorMjA0LjUKKzE5NC44CisyMTMuNgorMjE1LjkKKzIxNC44CisyMjEuNgorMjA4LjUKKzIwMS41CisyMDQuNAorMjA2LjQKKzE5NC41CisxOTkuNAorMjAxLjUKKzIwOS43CisyMTIuNQorMjAyLjEKKzIwOC4yCisyMDUuNAorMjA0LjUKKzE5OS40CisxOTQuNQorMTk5LjYKKzIwMS41CisyMDYuMgorMjE5LjkKKzE5OC41CisyMTYuMgorMTk1LjcKKzIwNS4wCisyMDguMAorMjA0LjkKKzE5NS45CisyMDcuNAorMjE2LjkKKzE5NS45CisyMDQuNAorMjA4LjMKKzIwNi4xCisxODguNQorMjAyLjMKKzIwMS43CisyMDAuNQorMjA2LjIKKzE5MS41CisyMTguNgorMjA2LjUKKzIwOC45CisyMDkuOQorMjAxLjUKKzIxMi43CisyMDMuMgorMjA5LjcKKzIxMi4xCisyMDguNAorMjA3LjIKKzIwNi41CisyMDQuNQorMjIyLjcKKzIwNy42CisyMDcuNAorMjEwLjMKKzIxMi4yCisyMTkuMQorMjE1LjIKKzIxMS4xCisyMDUuOQorMjA1LjUKKzIwNS45CisyMDMuMQorMjA1LjQKKzE4NC41CisyMDUuMAorMTk0LjgKKzIxMy41CisyMDkuOAorMTk1LjQKKzIwMi45CisyMDUuMworMTk2LjMKKzIwMi4wCisxOTguMgorMjAxLjUKKzE5NS4zCisyMzAuOQorMjA3LjgKKzIxMi42CisyMDIuNworMjA0LjgKKzIwNS4wCisyMDIuOAorMjA2LjIKKzIwMC4yCisyMDIuNworMjAzLjUKKzIwNS41CisxOTYuOQorMjA5LjQKKzIxMi4xCisyMDAuOAorMjA1LjAKKzIwOC4wCisyMDcuMQorMTk4LjAKKzIwNC44CisyMDUuOAorMjAwLjkKKzIwMi4xCisyMDIuNAorMjA2LjkKKzIwOS4xCisxOTkuNworMTk3LjEKKzIwNi45CisyMDAuMgorMTkzLjcKKzE5NS4wCisyNTAuOAorMjA3LjUKKzIwNC41CisyMDguOAorMjA5LjgKKzE5NC44CisyMDAuMgorMjA1LjEKKzE5Ny4zCisyMDguMworMjAwLjQKKzIwNC43CisyMTEuMQorMjAzLjQKKzIxOC4yCisxOTQuNgorMjAxLjUKKzIwMi4yCisyMDIuOQorMTk4LjgKKzIxOC4yCisyMDEuNworMTg5LjgKKzIxMC4xCisyMDguMAorMjA0LjMKKzIwNS44CisyMDQuMgorMjA3LjgKKzIwMC4yCisxOTcuOQorMTk4LjkKKzIwOC4xCisyMDIuNAorMTk2LjIKKzE5NS41CisyMDQuNgorMjExLjAKKzIwNS4wCisxOTMuNgorMTk3LjIKKzE5OC42CisxOTMuOAorMTk4LjkKKzIzMi40CisyMDEuOAorMjEyLjIKKzIwOC42CisyMDQuNQorMTk5LjMKKzIxMS4yCisyMDMuMQorMjA5LjcKKzIxNC4zCisyMDMuOQorMjAwLjMKKzIwMy4zCisyMDYuMQorMjA2LjkKKzIwOS4xCisyMDkuMQorMTk5LjMKKzE5OS40CisxOTguOAorMTk4LjkKKzE5OS45CisxOTMuNworMjA0LjYKKzIwMy40CisxOTkuNworMjEyLjYKKzIwMC43CisyMDguMQorMTk4LjgKKzIwMC41CisyMDkuMgorMjA4LjQKKzIwNS43CisxOTcuMQorMjAyLjYKKzE5OS41CisyMDguNAorMjAwLjEKKzIwNC45CisyMDIuOQorMjAxLjUKKzIwNy42CisyMDAuNgorMjA0LjIKKzIxMC4wCisyMDcuMQorMjA1LjEKKzE5OC41CisyMDQuOQorMTk2LjUKKzIwOC4wCisyMDIuNAorMjAyLjcKKzE5Ni4yCisyMDYuOQorMjAxLjUKKzIwMy4zCisxOTguNworMjExLjkKKzIwOC40CisyMDYuNworMjA5LjQKKzIwNC4wCisyMDIuMworMjA1LjAKKzIwNS4zCisyMDYuMAorMjEzLjEKKzIwNS43CisxOTkuMworMjA2LjIKKzIwNC42CisyMDkuMworMjA1LjcKKzIwMi43CisyMTMuMworMjAyLjMKKzE5Ny44CisxOTYuNQorMTkzLjQKKzIxMS42CisyMDkuOQorMTk1LjUKKzE5Ni4yCisyMTAuMgorMjA3LjEKKzIwNy4wCisyMjEuOAorMjE3LjIKKzIxNS40CisyMDcuMAorMjAwLjEKKzIwNy41CisyMDYuMAorMjAwLjcKKzE5MC45CisyMDkuOAorMjEzLjUKKzIwNi4zCisxOTYuMAorMjEzLjEKKzIwMi43CisyMTEuNgorMTk2LjUKKzIwOS45CisyMTIuMworMTk5LjkKKzIwNi44CisyMjUuMQorMjAzLjkKKzIwNC4zCisxOTcuNworMjAzLjUKKzIwMy4yCisxOTMuNQorMjAwLjkKKzIwMS40CisxODkuMQorMjAzLjkKKzE5NC41CisyMDUuNAorMjA0LjgKKzIwNC45CisyMDEuMworMjA4LjQKKzE5Ni45CisyMDYuOAorMjA3LjcKKzIwMS42CisyMTAuMworMjExLjYKKzIwOS44CisyMDAuMgorMjA1LjIKKzE5Ny42CisxOTUuOQorMjEyLjgKKzIwNi40CisyMDEuMAorMjA4LjIKKzIwNy41CisyMDIuNQorMTkzLjMKKzIwNi41CisyMjEuMgorMTk4LjgKKzIxNi42CisyMTcuMAorMjA5LjEKKzIwNi42CisxOTcuNworMjExLjAKKzE5OS45CisxOTguMAorMjEwLjQKKzIwMC41CisyMTEuNworMjE5LjYKKzIwNi44CisyMDcuMgorMjEwLjYKKzIwNS40CisyMDMuOAorMjA3LjQKKzIwNi4yCisyMDUuMQorMjA4LjcKKzE5Ni4zCisyMDQuNworMjEwLjgKKzIxNC40CisxOTYuMworMjA2LjUKKzIxMC44CisxOTMuMgorMjAzLjMKKzIwMy45CisyMDcuNworMTk0LjkKKzIwMy43CisxOTUuNQorMjE4LjcKKzIwMS4xCisxOTkuNQorMjA3LjYKKzIwOS4zCisyMDcuNQorMjA1LjcKKzIwMy45CisyMDUuNAorMjAxLjMKKzIwNS44CisyMDUuNAorMjA4LjgKKzIxNC4zCisyMDMuNAorMjA3LjUKKzE4OC45CisyMDUuNQorMjAwLjcKKzIxMi41CisxOTcuOQorMjE5LjAKKzIxMy42CisxOTcuMworMjAyLjcKKzIxNi4zCisyMDUuMAorMjEwLjIKKzIwMy4yCisyMDMuOQorMjA2LjgKKzIxMy42CisyMDAuMQorMjA0LjQKKzIxMS40CisyMTMuNAorMjAwLjIKKzIwOC40CisyMDkuMQorMTk4LjgKKzIwNy40CisxOTUuMAorMjA1LjYKKzIwMC41CisyMDQuMworMjAxLjkKKzIwNi40CisxOTkuMAorMTk2LjEKKzIwNy42CisxOTUuNAorMTk3LjIKKzIwMC43CisxOTAuOAorMjExLjkKKzE5MS41CisyMDEuNAorMTkzLjUKKzIwNS4xCisyMDYuOAorMTk5LjUKKzIwNy40CisyMDkuOAorMTk5LjEKKzE5NC42CisyMDEuNgorMjExLjYKKzIwNi44CisyMDMuOQorMTk2LjgKKzIwNi4zCisyMTAuMQorMjAwLjYKKzIyNy40CisyMDEuOQorMjEwLjgKKzIwNS44CisyMTcuMgorMjA1LjgKKzE5Ni4xCisyMDAuNworMjEzLjgKKzIwNS40CisyMTEuNgorMjEyLjMKKzIxMy42CisyMDEuNworMTk5LjkKKzIwMy4yCisyMTIuNgorMjExLjAKKzIwOC4xCisxOTguMQorMjAxLjcKKzIxMS42CisyMDcuNAorMjEyLjQKKzIwNy4zCisyMTQuOQorMjE0LjUKKzIxNC41CisyMDIuNworMjAwLjEKKzIwNi40CisyMTMuNAorMTg5LjcKKzIwMy40CisyMDIuMgorMTk4LjIKKzIwNi41CisyMTMuNworMjA3LjYKKzIwMi44CisyMDkuMgorMjA1LjUKKzE5Ni40CisyMDcuNgorMjA3LjQKKzIwNy4zCisxODguOAorMjE1LjYKKzE5NS40CisyMDcuNworMjA4LjIKKzIwMC45CisyMDguNAorMjAzLjMKKzIxMC44CisxOTkuNgorMjA4LjMKKzIwNi43CisyMDEuNgorMjAyLjkKKzE5Ny41CisyMDYuNAorMjA5LjAKKzIwOC40CisyMTEuNgorMjA0LjQKKzIxMC4wCisxOTAuOQorMTk5LjMKKzIwNy42CisyMDIuNQorMTk3LjAKKzIwMC44CisyMDMuMQorMjA0LjAKKzE5OS4wCisyMDguMAorMjA0LjYKKzE5Ni42CisyMDAuOAorMjA1LjIKKzE5OC44CisyMDMuMAorMjA4LjMKKzIwMC4xCisyMDUuNQorMjAzLjcKKzIwMi4yCisyMDMuOAorMjExLjUKKzIwMS44CisyMTMuMgorMjA3LjQKKzIwNy44CisyMDIuMgorMjA4LjIKKzIwNC4yCisyMDAuNAorMTg2LjEKKzE4OC41CisyMjAuNAorMjEyLjgKKzE5My4zCisxOTYuOQorMjAzLjAKKzIwNy4zCisyMDIuNAorMjAxLjcKKzIwNC44CisxOTIuMgorMjE4LjcKKzIyNi4zCisyMDkuNQorMjAxLjQKKzIwNy4zCisyMDIuNgorMjEwLjcKKzIwOC40CisyMDguNAorMjA3LjQKKzIxMC40CisxOTEuMgorMjAzLjYKKzE5Ny4xCisyMDcuNQorMTk3LjgKKzIwNi4yCisyMTQuNQorMjA4LjIKKzIwNy4zCisyMDQuNworMTk5LjYKKzIwNi4zCisxODkuMAorMjE0LjQKKzIwOS40CisyMDguMQorMTk5LjkKKzE5MC41CisyMjMuMAorMTk4LjgKKzIwMS4xCisxOTIuNAorMjA0LjAKKzIwOS4wCisyMDYuNworMjA0LjMKKzE5OC43CisyMTAuOQorMjEyLjAKKzIwNC44CisyMDQuMgorMTk5LjUKKzIwMy41CisyMDMuMAorMTkwLjYKKzIwNy45CisyMDcuOQorMTkzLjIKKzIxMC45CisyMDAuMQorMjA3LjYKKzE5My42CisyMDQuOQorMTk3LjcKKzIwMC45CisyMTMuMAorMjE1LjAKKzIwNC40CisxOTYuNgorMjA5LjYKKzIwOS45CisxOTkuOAorMTk4LjgKKzIwMi4xCisyMDMuNAorMjA1LjQKKzIwNC40CisxOTYuMgorMTkwLjcKKzIxMC45CisxOTcuNworMTk0LjcKKzIwNC4wCisyMDEuNQorMTk1LjMKKzIwOS4wCisyMDMuNgorMTk2LjEKKzIwNS4yCisyMDYuNworMjA2LjYKKzE5MS40CisxOTMuNAorMjA2LjYKKzIwNS45CisyMDcuOQorMjAxLjcKKzIxMy4zCisxOTkuNAorMjAyLjgKKzE5Ni4xCisyMDguMworMjA2LjQKKzIwNS4yCisxOTEuOQorMjA3LjMKKzE5MS41CisyMTAuOAorMjAwLjkKKzIxMC40CisyMDguMworMjExLjAKKzIwMi43CisxOTguOAorMTk2LjgKKzIwMi43CisxOTYuOQorMjE0LjYKKzIxMC4yCisyMjYuMQorMjIwLjgKKzIxMy41CisxOTQuOQorMjEwLjQKKzIwMy43CisyMDMuNworMTgwLjgKKzIxMy43CisyMDguMAorMjA5LjgKKzIwOS43CisyMTMuOAorMTg1LjUKKzIwOC41CisyMDMuNQorMjEyLjgKKzE5My4xCisxOTkuMgorMjExLjAKKzIxNy40CisyMTEuMAorMjAyLjcKKzIwNS4wCisyMDguNgorMTk3LjUKKzE5Ny4xCisyMDEuMAorMTk1LjkKKzIwOC40CisyMDUuNworMjA1LjgKKzE5NC4wCisyMDQuNAorMTk0LjUKKzE5NC4zCisyMDAuMQorMjA5LjUKKzIxOC4wCisyMDIuOAorMTk3LjUKKzIwNi43CisxOTkuOAorMjA1LjIKKzIwMS40CisyMDUuMgorMTg2LjAKKzIwOC40CisyMTguNAorMjA2LjcKKzIwMS45CisyMDkuNworMjA4LjAKKzIwMy45CisxOTMuMQorMjAyLjAKKzE5OC4wCisxOTkuNQorMjExLjAKKzE5MS44CisxOTguNworMTk3LjMKKzE5NS42CisyMDIuOQorMjAzLjQKKzIwNi4xCisyMDUuNgorMjA3LjUKKzIyMC44CisyMDQuNworMjA3LjcKKzI1Mi41CisyMDMuOQorMjAzLjIKKzIwMS4zCisyMDAuMQorMjAxLjEKKzE5Ni44CisxOTcuNgorMjA2LjQKKzIwOS42CisxOTcuOQorMTk5LjQKKzIxMi42CisyMDUuNAorMjAwLjkKKzE5Ny41CisyMDIuMgorMTk5LjUKKzIwNi43CisyMTUuMQorMjE2LjQKKzIyMS45CisxOTkuMgorMjQ2LjQKKzE5Ni4wCisyMDUuMQorMjA1LjQKKzIwNy44CisxOTIuNgorMjA0LjYKKzIwOS4yCisyMTMuNAorMTk4LjkKKzIwNS4zCisyMDUuOAorMjAxLjEKKzE5NS4yCisxOTkuNAorMjAwLjgKKzIxMC41CisyMDIuMworMjE3LjkKKzIwOC40CisyMjAuOAorMjE4LjQKKzE5NS43CisxOTkuNAorMTk4LjgKKzE5Mi4wCisyMTAuOQorMjE4LjUKKzE5NC41CisyMDMuNgorMTk1LjAKKzIwOC44CisxOTcuNAorMjA0LjEKKzIwMC43CisyMDEuMAorMjA2LjYKKzIwMi4yCisyMDguNworMjEzLjEKKzE5OC4zCisyMTIuMgorMjAxLjkKKzIwNi4zCisyMDMuNAorMTk4LjAKKzE5OC4wCisyMDUuMworMTk5LjYKKzE5Ni42CisyMDIuOAorMjAxLjcKKzIwOC43CisxOTUuNgorMTk5LjQKKzIwNS40CisyMDUuMgorMjAyLjIKKzE5My4zCisxOTEuOQorMTk1LjEKKzIwMS4xCisyMTAuNQorMjA4LjcKKzE5Ni45CisxOTMuNAorMjAwLjgKKzE5OS42CisyMDQuMQorMjAwLjQKKzE5Ny42CisyMDQuMQorMjA2LjkKKzIwNS4yCisyMDYuOQorMTk0LjcKKzIwMC40CisxOTguOAorMjAxLjcKKzIwMS44CisyMDcuMAorMTkzLjIKKzE5OS45CisyMDEuMworMTkyLjUKKzE5Ny45CisyMDYuOQorMTkwLjAKKzIwMy44CisyMDguOAorMjAwLjkKKzIwMy4zCisxOTQuNQorMTkyLjYKKzIwNC45CisyMDUuNQorMTk2LjYKKzE5NC44CisxOTcuOQorMTk4LjEKKzIxMS4yCisxOTguOAorMjAyLjIKKzIwNS45CisxOTkuNQorMjA0LjcKKzIwMS42CisyMDEuMgorMjAzLjQKKzIwNC4yCisxOTAuNworMjA2LjcKKzIwNS40CisyMDguNAorMjAzLjEKKzIwNC4yCisxOTguNAorMTk0LjMKKzE5MS42CisxOTguOQorMjAzLjUKKzE5OC43CisxOTIuMgorMTk4LjQKKzE5NC41CisxODEuMQorMjAwLjkKKzIwMC4wCisyMDkuMgorMjEwLjQKKzIwMC4wCisyMDEuMQorMTkzLjkKKzIwNy4wCisxOTMuNAorMjAyLjYKKzE5Mi44CisxOTYuMAorMjAzLjgKKzE4NC4yCisxNzkuMworMjAyLjMKKzE5MS40CisxOTkuNworMTk1LjQKKzE4OS45CisxOTcuMAorMTg3LjUKKzE5Mi4xCisxOTguMworMjAyLjIKKzIwNS4wCisyMTIuMworMTk4LjAKKzIwNS41CisyMTAuMQorMTk3LjYKKzE5OC43CisyMDYuNgorMjAzLjQKKzE5NC4zCisxODEuMgorMTk5LjAKKzIwMi40CisxODkuMQorMTgxLjYKKzIwMC40CisxODguMQorMTgwLjEKKzIwMy4xCisyMDEuMQorMTk1LjUKKzIwMS42CisyMDEuMworMTk3LjYKKzE5Ni4wCisyMDUuNQorMTg0LjkKKzE4Ni41CisxOTAuOAorMTg4LjYKKzIwNy4yCisxOTkuNQorMTk4LjYKKzE5OS44CisyMTIuMgorMjA4LjEKKzE5Ni45CisxOTkuNgorMjA1LjMKKzE5Ni45CisxODguOQorMjA1LjQKKzIxMi41CisxOTcuNQorMjAxLjgKKzE4OC44CisxODcuMQorMTk5LjkKKzE5NS40CisxODguNworMTk4LjcKKzE4NS4wCisxOTEuNgorMTkzLjMKKzE5MS44CisyMDkuNAorMTk3LjQKKzE5NS4yCisxODkuNAorMTg5LjcKKzE5OS45CisxOTkuMworMTg4LjcKKzE4OC4zCisxOTAuOQorMTgxLjYKKzIwOS44CisxOTQuNgorMTk4LjIKKzE5OS45CisxOTguMQorMTg2LjgKKzE5NS4zCisxOTAuOQorMTk4LjgKKzE4OS4zCisyMDcuNQorMTc5LjIKKzE4OC44CisxODUuNgorMjA2LjIKKzE4NC44CisxOTAuNworMjAzLjUKKzE5OS4yCisyMDIuMAorMTk3LjYKKzE5Ny4yCisxOTYuNAorMjEwLjQKKzIwMC4xCisxOTQuOAorMTg2LjcKKzE5OC4yCisxOTcuOAorMTg2LjUKKzIwMC4yCisxOTIuNworMTkyLjcKKzE5MC40CisyMjAuOQorMjA3LjUKKzE4OC42CisxOTguNQorMjAzLjAKKzIwMi4yCisxODkuNgorMTc3LjMKKzE5NC44CisxOTUuMgorMjQzLjkKKzE5Ni41CisxODAuNgorMjE0LjYKKzE5Ni40CisyMjAuNgorMTk0LjcKKzIwMC41CisxOTMuNworMTk5LjcKKzIwMy4wCisyMDEuNAorMTg3LjcKKzE5OS44CisxOTEuOAorMjAzLjkKKzIwMy44CisxOTEuMworMjA2LjYKKzIwMS43CisyMDIuMQorMjAyLjYKKzIwMC4wCisyMDMuNgorMTk1LjkKKzIwNC44CisyMTIuOAorMTk5LjIKKzIwMy4zCisyMDYuNgorMTkyLjIKKzIwNS4wCisxOTguOQorMjA1LjMKKzE5NS4wCisxOTguMQorMTkwLjQKKzIwMy43CisxODguMgorMjA0LjIKKzIxMS4xCisxOTIuNQorMTk0LjUKKzE5OC4zCisyMDUuNworMTk4LjUKKzIxMC4yCisyMDYuOAorMTk1LjQKKzIwMC44CisyMDIuNworMjIwLjAKKzIwNC4xCisyMDkuNQorMjAwLjIKKzE4Ny4xCisyMDUuNAorMjAyLjYKKzIwMy4zCisyMTQuMQorMTkzLjgKKzIwNy40CisyMDguMgorMjA0LjkKKzIxNS45CisyMDIuNgorMTk4LjAKKzE5My44CisxOTguMgorMjA2LjIKKzIwMy45CisxOTAuNgorMjEwLjgKKzE5NS42CisyMDcuNgorMjA2LjYKKzE5NS40CisxODkuOQorMTk5LjcKKzIwMy4xCisyMDcuMQorMTkyLjIKKzE5Ny4zCisxOTcuNgorMTkzLjMKKzIwNy45CisyMDEuMworMjA2LjgKKzIwMS45CisxOTUuNworMjA0LjEKKzIwMS4xCisxOTIuNQorMjA2LjcKKzIxMy4xCisxOTUuMgorMjA1LjEKKzE5Ni4yCisyMDMuNQorMTk1LjUKKzIwMC4zCisxOTQuNworMTk0LjUKKzIwMC42CisyMTEuMgorMjAyLjEKKzE5NC42CisxOTkuOQorMjEyLjYKKzIwNi44CisxOTYuMgorMjA1LjgKKzIwMi44CisyMDEuNgorMjA1LjIKKzIwNS44CisxOTMuMQorMjAyLjAKKzE5Ni4yCisyMDguMQorMjA5LjUKKzE5OS44CisyMDguOAorMTkyLjMKKzIwNy45CisyMDEuMworMjA1LjcKKzIwNS45CisyMDguNgorMjEwLjMKKzIwMi4yCisyMTIuMQorMjEwLjMKKzE5OS42CisyMDAuOAorMjA5LjEKKzIwMi41CisyMTUuMAorMjAxLjUKKzIwOS4yCisyMDcuMAorMjE1LjMKKzIwNS42CisyMTMuNworMjAzLjcKKzE5OS44CisyMDEuNAorMTk0LjcKKzE5NC4zCisxODguNworMjAwLjkKKzIwMy44CisyMDMuMgorMjEyLjUKKzIwNy4wCisyMTEuMworMjA0LjMKKzIwNC41CisxOTQuMAorMjEwLjcKKzIwNy4xCisyMDcuNQorMjAwLjcKKzIwMC44CisyMDAuNworMjAwLjEKKzIwMy43CisxOTEuMQorMjAxLjgKKzE5NC44CisxOTUuMgorMTk3LjQKKzE5MC41CisxOTIuNworMjA2LjYKKzIwMC44CisyMDQuMworMjA2LjUKKzIwOS44CisyMDIuNQorMjA3LjYKKzE5OC40CisyMDMuMworMjAyLjEKKzIwMC42CisxOTguNAorMTkxLjAKKzIwMy41CisxOTguNgorMTg0LjMKKzE4My43CisxODkuMQorMjA1LjQKKzE4Ny44CisxOTQuNQorMTk5LjIKKzE5Ni40CisyMTAuOQorMTc2LjgKKzE5MS42CisxODIuNworMTgxLjMKKzIwNS43CisyMDMuMgorMTg2LjMKKzE4Ny42CisxODkuMQorMTgwLjgKKzE4MC4yCisxODcuNgorMTk0LjkKKzE5Mi44CisxODUuMgorMTk4LjMKKzIwOS4zCisxNzcuNQorMTkzLjkKKzE5My4xCisyMDMuNAorMTkyLjEKKzIwMC45CisxODIuNgorMjA0LjkKKzE5Ny42CisyMTIuOAorMjA2LjkKKzE5My4zCisyMDEuMAorMTk1LjMKKzE5Ny4xCisxODkuNgorMTk4LjUKKzE5MC40CisxODguOAorMTk3LjcKKzE4OS45CisyMDAuNworMTk2LjgKKzE4Ni4zCisxODEuNQorMTg0LjkKKzIwMC4yCisxOTguNworMjA1LjgKKzIwMC4yCisxOTguMworMjA3LjkKKzIwNi4xCisyMDEuNQorMTk3LjgKKzE5OS41CisxOTguMQorMjExLjMKKzIwMS42CisyMDIuNAorMTk2LjAKKzE5Ny43CisyMDkuMgorMTk5LjMKKzIwNS41CisxOTEuNgorMjA2LjQKKzE5Ni41CisyMDkuNQorMjAzLjQKKzIwMS40CisyMDAuMQorMjA1LjIKKzE5MC45CisyMDUuMQorMTk3LjUKKzE5Ni4xCisxOTQuNAorMTk0LjcKKzE4OC45CisxODAuOAorMjA2LjUKKzE5OS44CisxOTMuMQorMTk1LjIKKzE5Mi43CisxOTkuMgorMTk5LjUKKzE4OC4xCisxODAuMgorMTkxLjAKKzIwNi45CisyMDguMgorMjAyLjUKKzIwMC4wCisyMDcuMAorMjAxLjYKKzE5NS42CisxOTUuNgorMTk1LjAKKzE5Ni4zCisxOTAuMgorMTk0LjAKKzE4Mi45CisxOTIuMQorMjA2LjUKKzE4MS40CisxOTIuMworMTk5LjYKKzIwMS42CisxOTIuNAorMjAwLjUKKzIwNy4xCisxOTguNQorMTk4LjgKKzE5MC44CisyMDAuMworMTk5LjMKKzIwMC41CisxODcuNworMjA4LjMKKzIwNS42CisxODkuMworMTk4LjQKKzIwNC45CisxOTcuNAorMTk4LjcKKzE5MC42CisyMTQuNQorMjEyLjUKKzIwNy42CisxOTYuOQorMTgzLjQKKzE4NS4xCisyMDUuOAorMjI2LjUKKzIwMi41CisyMDEuOAorMjAyLjkKKzIxMC40CisxODkuNworMTk1LjYKKzE5OC43CisxOTMuMAorMTk4LjgKKzE5My4xCisyMDIuNQorMTk1LjIKKzE5NS4wCisxOTguMworMjAzLjYKKzIwOC4zCisxOTUuOQorMjAwLjgKKzE4OS40CisyMDcuOQorMTgyLjgKKzE5NC45CisxOTkuNworMTgwLjcKKzE4Ny4yCisxODkuNQorMTk2LjEKKzE5MC4xCisxOTIuNQorMTg1LjcKKzIxMi4yCisyMDQuMgorMTkxLjkKKzE4NC41CisxODIuNQorMTk4LjUKKzE5MS4wCisxOTIuMAorMTk1LjYKKzIwMS4xCisxOTMuNworMjAzLjgKKzIwMC41CisxOTkuMQorMTkwLjMKKzIwOS41CisxOTUuMAorMTg0LjAKKzE5My42CisyMDMuMworMTkxLjQKKzE5NC45CisxOTUuNQorMTkzLjUKKzE4Mi43CisxODkuNworMTk2LjEKKzE3OC45CisxOTkuNQorMTk1LjMKKzE4NS45CisxOTkuMQorMjEwLjAKKzE5NS43CisxOTMuOAorMTk2LjQKKzE5NS4zCisyMDEuNAorMjA5LjUKKzIwNS42CisxOTcuNQorMTg4LjkKKzE5My44CisxODUuMworMTkzLjMKKzE5OC4xCisyMDEuNAorMTg0LjcKKzE4Mi41CisxODMuNworMTg1LjUKKzE5OS44CisyMDAuMworMTk0LjEKKzE3Ni45CisxOTIuMgorMjAwLjAKKzE4Ni40CisxOTEuNgorMjAwLjEKKzIwMi4zCisyMDUuMQorMTg2LjQKKzE4Mi4zCisxOTQuNworMTc3LjUKKzIwMS40CisxODkuNgorMTk1LjUKKzE4NS40CisxOTQuOAorMjA0LjEKKzE4OC4wCisxODIuMQorMTgxLjcKKzE4NC41CisyMzQuMgorMjA5LjQKKzE5My4zCisyMDQuMAorMTg0LjcKKzE5NC4zCisxOTMuNAorMTkxLjEKKzE4OC4zCisxOTMuOQorMTk4LjIKKzIwMi44CisxOTguMQorMTkxLjIKKzIwMC45CisyMDUuNAorMjAzLjYKKzE5My44CisyMTUuOAorMTg1LjgKKzE5NS40CisyMDQuNworMTkwLjMKKzE5MC43CisxNzcuNworMTgyLjEKKzE5My4yCisxNzguMworMTk5LjMKKzIwMy41CisxODcuMworMTk4LjgKKzE4Ny44CisxODcuNworMTg2LjcKKzIwMC4wCisxOTAuMAorMjAzLjEKKzE4MS43CisyMDcuMgorMTgzLjgKKzE4MC4zCisxOTMuNQorMTkwLjIKKzE5My43CisxOTguNgorMTk1LjYKKzE5Mi4xCisyMDAuNQorMTg4LjYKKzE5MC45CisxODguMAorMTkyLjgKKzE5MS40CisxNzkuOQorMTk3LjYKKzIwMC42CisyMDYuMQorMjAxLjMKKzE5OS42CisxOTguOAorMjAxLjAKKzE4MC4yCisyMDIuOQorMTk3LjMKKzE4Ni4xCisyMDAuNQorMTgyLjQKKzE5Mi43CisxOTQuNQorMTgyLjgKKzE5My45CisxOTUuMQorMTg3LjcKKzIwMS4wCisxOTYuMQorMTk0LjAKKzE5OC44CisxOTIuOAorMTg2LjEKKzIwMC42CisxODYuMworMTg3LjYKKzE3OC4wCisxNzUuOAorMTk4LjkKKzE5OS4zCisxOTMuNAorMTkzLjMKKzE5OC43CisxOTQuNQorMTgwLjkKKzE5Ny4zCisxODkuNworMTkzLjAKKzIwOC4yCisyMDAuMQorMTkzLjkKKzIxMS4yCisyMDYuNgorMjEwLjIKKzE4NS41CisxODAuOAorMjA2LjgKKzE4NS41CisxOTUuOAorMTk5LjMKKzE4Ny45CisxOTQuOQorMTc1LjgKKzE5OC4xCisxOTkuMAorMjAwLjYKKzMwMC44CisxOTQuMAorMTk5LjcKKzE4MS4yCisxODkuOQorMTk1LjMKKzIwOS42CisxOTguMQorMTg0LjkKKzE5Mi41CisxODguOAorMTkzLjgKKzIwMS40CisyMDguMgorMTkyLjUKKzE5OS45CisxODUuMAorMjA3LjUKKzE5Ni41CisxOTguOAorMTkzLjMKKzIwMC4xCisxODYuNworMTk0LjQKKzE5NC4zCisxOTcuMgorMTk4LjQKKzE5Mi44CisxOTQuMworMTg4LjYKKzE5NC43CisxOTAuNworMTkyLjEKKzE5NC41CisxODUuNworMTk0LjYKKzE3Ny41CisyMDMuNgorMTgwLjgKKzE4NS4wCisxNzguOQorMjA1LjcKKzE4Ny40CisxODUuOQorMTkyLjkKKzE4Mi43CisxOTcuMworMTk4LjAKKzE5NC41CisxOTQuNworMTk0LjcKKzE5OC4yCisxODQuNworMTk5LjAKKzIwMC45CisxOTUuNAorMTk4LjcKKzE4OC4xCisxODcuNQorMTkwLjYKKzE3OS4yCisxOTAuMgorMTk1LjkKKzE4OC44CisyMDUuNworMTkxLjkKKzIwNC4wCisxOTMuMworMTk5LjUKKzIwMC43CisxNzkuMworMTkwLjQKKzIwNi40CisxOTkuOAorMTg5LjUKKzE5NC4xCisyMDMuMworMTk2LjkKKzIwMC4xCisxNzkuNgorMjE3LjIKKzE5OS4wCisxODQuMAorMTc3LjQKKzIwMC41CisyMDUuMworMTkzLjIKKzE5OC44CisxODcuMgorMTkxLjIKKzE4Ni42CisxODguMworMTk5LjQKKzE5Mi44CisyMDkuOAorMTgxLjUKKzE5Mi44CisxNzYuMAorMTg5LjkKKzIwMy41CisxOTIuNQorMTkzLjEKKzE5MC4zCisxOTMuMQorMjAzLjAKKzE5NC42CisxODguNAorMTk5LjgKKzE5OS42CisxOTUuMAorMjAwLjMKKzE5NS41CisxOTguNQorMjAzLjEKKzE5My40CisyMDMuNgorMTk1LjYKKzE4Ni4yCisyMDYuNAorMTk3LjMKKzI2NS40CisyMDMuNworMjA1LjcKKzE5Ny4wCisxOTQuOQorMTkzLjYKKzIwMS4xCisyMDAuNgorMTk3LjEKKzE5Ni4wCisxOTYuMworMTk1LjQKKzE5NC4yCisxOTguNAorMjAyLjYKKzE5Ny4xCisyMDkuNAorMjA0LjcKKzE5NS45CisxOTIuOAorMjAzLjQKKzE5My4zCisxODguNQorMTkwLjcKKzE5MC4zCisxOTcuNgorMTk3LjcKKzE5OS4xCisxOTMuMAorMTk4LjMKKzIwNS4wCisxOTEuNAorMTk3LjIKKzIwMS4zCisxOTcuNgorMTk3LjcKKzIwMi45CisyMDMuNAorMTk4LjUKKzE5OC44CisyMDUuNAorMTk0LjYKKzE4OS41CisxOTMuMworMTkwLjQKKzE5My4wCisyMDIuNQorMTk4LjIKKzE5NC43CisxOTguNQorMTg0LjMKKzE4Ny44CisxOTMuMworMTkwLjgKKzE5NC45CisxOTAuMworMjAxLjgKKzE5Mi45CisxOTguNQorMTk1LjkKKzE5NS44CisyMTAuMQorMTk0LjIKKzIwMi42CisxOTQuNQorMTk3LjYKKzIwMC4xCisxOTEuOAorMTkyLjgKKzE5OS40CisxOTkuNworMTk5LjMKKzE5NC4yCisxOTYuOQorMTk1LjcKKzE4OS45CisxOTcuMQorMjA1LjkKKzE5MS4xCisxOTYuNQorMjAwLjkKKzIwMC42CisxOTkuMQorMjAzLjAKKzIwNC4yCisxOTguNworMTkyLjIKKzE5NC45CisxODguNgorMTk0LjMKKzE5OC41CisxOTAuNgorMTg5LjQKKzIwNS44CisyMDcuMAorMjAwLjkKKzE5OC4wCisxOTYuOQorMTk2LjYKKzE4Ny4zCisxOTkuOQorMTk2LjEKKzE5Ni41CisyMDAuMAorMTg2LjAKKzE4Mi43CisxOTMuMworMTk1LjIKKzE5MC4wCisxOTUuOQorMTkwLjAKKzIwMS43CisxODcuMQorMTk5LjEKKzIwMy41CisxOTEuOAorMTk5LjUKKzE5NS4xCisyMDcuMworMjA1LjYKKzE5MS45CisyMDAuMQorMTk2LjUKKzIwNS40CisxOTAuOAorMTk1LjkKKzE5NC42CisxOTAuMgorMTk3LjQKKzIwNC40CisyMTAuNQorMjg5LjYKKzE5Ny4yCisxOTEuNAorMTk5LjIKKzE5Ni42CisyMDEuNAorMTkxLjcKKzE5NC40CisxOTEuOQorMTkzLjEKKzE4Mi45CisxOTEuNQorMjAyLjAKKzE4Ni44CisxOTUuNQorMTkzLjQKKzE4OS44CisxODEuMworMTk5LjkKKzIwMC4zCisxOTMuNQorMTk2LjUKKzE5MC41CisyMDAuNgorMjA5LjgKKzE5Ny43CisxOTkuNQorMjAwLjkKKzIwNS4wCisxOTkuNAorMjA2LjMKKzIwNS43CisyMDIuNworMTg5LjAKKzIwMy42CisxOTguOQorMTg4LjQKKzE5My43CisyMDQuMQorMTk4LjQKKzIwOC44CisyMDEuNAorMTk4LjAKKzE4OC43CisyMDguOQorMTk2LjkKKzIzNS41CisxOTguMQorMjAyLjgKKzE5NS44CisxOTMuMgorMjAzLjAKKzIwNC4yCisyMDEuMgorMjAxLjQKKzIwMi44CisyMTMuOAorMTk3LjIKKzE5Ny4wCisxOTEuMgorMTk2LjIKKzIxMC44CisyMDMuNQorMTkzLjQKKzIxMS43CisxOTQuMAorMjA0LjYKKzE5Ny4wCisyMDAuMAorMTk3LjkKKzIwNC4yCisxOTYuNgorMTg0LjQKKzE4OC42CisxOTQuNAorMTg4LjEKKzIwMi40CisyMDMuMAorMjA0LjQKKzE5NC4xCisxOTUuOAorMTk1LjMKKzIwMS45CisxOTQuNworMjA1LjgKKzIwMS45CisyMDguNgorMTk1LjUKKzIwOS41CisxOTQuOAorMjAyLjcKKzIwMi4yCisyMDQuNAorMTk3LjEKKzIwNS45CisxOTYuMgorMTk3LjEKKzE5Ny40CisxOTguNgorMTk4LjgKKzIwMS4xCisyMDMuOQorMjAwLjMKKzE5OS41CisyMjQuNQorMTk5LjIKKzE5Ni4yCisxOTcuNworMTk0LjcKKzE5NC4xCisyMDIuNQorMTkxLjIKKzIwMy4xCisxOTkuMQorMTk3LjUKKzIwMS4wCisxOTguNworMjA3LjkKKzE5MS43CisxOTIuMQorMTkxLjcKKzIwOC43CisxNzguMworMjAyLjAKKzIwMC40CisyMDIuMQorMjA2LjgKKzE5NC4yCisxOTcuMAorMjAzLjMKKzE5NS4xCisyMTAuMAorMTkzLjkKKzE5MS4xCisyMDAuMQorMTkyLjkKKzIwMi4zCisxODkuNQorMTkzLjkKKzIwMC44CisyMDUuNQorMTk4LjcKKzIwNS40CisxODQuNworMTk4LjYKKzE4OS43CisxODcuOAorMjAyLjUKKzE5Ni4yCisyMDMuNQorMjEzLjQKKzE5OS43CisyMDcuNQorMjA3LjMKKzIwNC43CisxOTAuNQorMTk0LjkKKzE4NC43CisxOTguMAorMjAwLjkKKzE4OS44CisyMDguOQorMTg5LjUKKzIxOC42CisyMDIuOAorMTg5LjAKKzIwMi4yCisyMDQuMworMTkxLjUKKzE5My42CisyMDEuNgorMjA0LjYKKzE5Ny4wCisyMDAuOQorMTg2LjAKKzIwNS45CisxOTQuMQorMjAzLjMKKzE5Ny4zCisyMDAuMworMTk1LjkKKzIwNy4zCisyMDYuNworMjA2LjcKKzE5My4wCisyMDMuMQorMjM4LjEKKzE5Mi4yCisxOTMuMworMTk3LjQKKzIxMi4zCisyMDIuNQorMTk3LjUKKzIwNC4xCisxOTYuNgorMTgzLjgKKzIwNC41CisxODguMQorMjE3LjYKKzE5NC41CisxOTkuMQorMjEwLjkKKzIwMC45CisxODcuNworMTk5LjIKKzE5NS4wCisxOTEuMAorMTk4LjMKKzE5NC4xCisxOTEuOQorMjEzLjgKKzE5OS4wCisyMDEuOAorMTk3LjUKKzIwMS41CisxOTUuNgorMjA3LjUKKzIwMC42CisxOTQuMgorMjEwLjUKKzE5Mi43CisxODguMQorMjAzLjAKKzIzNy4xCisyMDQuNworMjA1LjEKKzIwNS4yCisyMDAuMworMTg4LjUKKzIwMi4yCisyMTMuMQorMTk1LjAKKzIwMS40CisyMDQuMgorMTk1LjkKKzE4Ni41CisxOTIuMgorMjA2LjUKKzE3Ny41CisxODkuOQorMTkyLjAKKzIxNC45CisyMDQuMAorMTk0LjIKKzIwMC45CisxOTcuMQorMjAwLjAKKzE5Ni40CisxOTcuMgorMTg5LjAKKzE5NC4zCisyMDYuNQorMTkyLjUKKzE5MC41CisyMDQuMQorMTk2LjcKKzE5NC40CisxODEuOQorMTkzLjAKKzE5MC42CisxOTMuNgorMTc4LjAKKzE3OC4yCisyMDAuOQorMTg5LjUKKzE5NC4yCisxODIuMQorMTgzLjYKKzE4My43CisxNzYuOQorMTgxLjcKKzE5NC45CisxOTAuNworMTg3LjQKKzE3OC42CisxODIuMAorMTg2LjUKKzE4My43CisxODIuMQorMTg2LjIKKzE5OS42CisxOTIuNAorMTg5LjIKKzE5NC43CisxNzYuMworMTg0LjYKKzIwMy4yCisyMDEuOQorMTk1LjIKKzE5Mi43CisxODYuNworMTk1LjIKKzE4Ny4wCisyMDEuMQorMjAyLjEKKzE4Ny43CisxOTUuOQorMTgxLjcKKzE4OS43CisxNzkuOQorMTc3LjMKKzE4MC4zCisxOTguMworMTg0LjYKKzE4My4zCisxOTYuOQorMTc4LjYKKzE4NC4zCisxODUuMworMTgzLjIKKzE5My45CisxOTQuNworMTk1LjUKKzE5OS42CisxOTIuMAorMTg5LjQKKzE5NS4wCisxOTMuNgorMjAwLjUKKzE3Ny42CisxODEuMAorMjAwLjAKKzE5MC4zCisxODkuNworMjA1LjUKKzE3OC41CisyMDEuNworMTkyLjcKKzE5Ni44CisxODkuMgorMTc3LjYKKzE5OC4wCisxOTEuOAorMTc4LjYKKzIwNi44CisxOTAuMAorMTkyLjMKKzE4MC4xCisxOTQuNgorMTc5LjcKKzIwNy4xCisxOTUuNgorMjAwLjUKKzE4Ni43CisxOTAuMQorMTc4LjYKKzIwNS43CiszNDYuMgorMTg4LjgKKzIwNC40CisyMDAuNworMTc2LjUKKzE5My44CisxOTUuOQorMTkzLjAKKzE4Ni41CisxODkuNQorMTkwLjYKKzE3OC4wCisxODguNgorMTg2LjcKKzE4MC45CisxOTMuOAorMTk0LjAKKzE4MC42CisxOTYuNworMTc4LjcKKzE4MC4xCisxODcuNworMTc5LjYKKzIwMS4zCisyMTkuMgorMTg0LjAKKzIwNi4zCisxODYuNworMTkyLjAKKzE3OS40CisxOTAuMQorMTg3LjAKKzE5MS42CisxOTQuNworMTk1LjUKKzE5NC4yCisxOTUuOAorMjAwLjYKKzE4MC4zCisxOTUuNgorMjA5LjkKKzE5Ny4yCisyMDEuMQorMTk2LjkKKzE4Ni4zCisyMDIuNworMTgyLjcKKzIwMC40CisyMDEuMgorMTk2LjIKKzE4MS4xCisxODIuNgorMTg3LjIKKzIyNS4zCisxODYuOAorMTk3LjYKKzE5Mi4wCisxODUuMAorMTk5LjgKKzE5MS43CisxODcuNAorMTkyLjUKKzE4OS4xCisyMTAuOQorMTg3LjAKKzE5MS4yCisxOTAuOQorMjA3LjEKKzE5OC43CisyMDguOAorMTkwLjYKKzE5My43CisxODYuNQorMTgyLjkKKzE3OC43CisxOTQuMQorMTg0LjMKKzE5NC4wCisxODUuNAorMjE1LjcKKzE5NC42CisyMDcuOQorMjA0LjcKKzE4My43CisxODkuMworMTk2LjAKKzIwMi42CisyMDYuMgorMTkwLjEKKzIxNi42CisxNzkuOAorMjA2LjkKKzE4OC40CisxOTAuOAorMTgxLjcKKzE5Ny43CisxOTUuNworMTc4LjMKKzE3OS4wCisxNzkuMworMjAzLjIKKzE3OC40CisxODAuMQorMTc1LjcKKzE5NC4xCisxOTMuMAorMjAzLjIKKzE5Mi42CisxOTQuMAorMTkwLjcKKzE5My4wCisxOTQuMgorMTgzLjcKKzE5Ny4yCisxODguNAorMTc2LjEKKzE4NC4zCisxOTIuMgorMTk1LjcKKzE4Ni4wCisxOTMuNworMTk2LjIKKzE4My43CisxODAuNworMTgxLjAKKzE4OS40CisxOTkuMworMjAxLjUKKzE5OS44CisxOTcuMgorMjAxLjcKKzE5OS45CisxOTIuMgorMTg4LjIKKzE4Ny41CisxNzYuNgorMjA1LjMKKzE5OS4wCisxOTAuMAorMjAyLjQKKzIwMS44CisyMTYuOAorMjA4LjIKKzE5Ny40CisxOTQuMworMjA1LjkKKzE3OS4wCisxOTMuNQorMTgyLjkKKzE4OC4wCisxOTguMworMTk3LjcKKzE3Ny42CisxODMuOAorMTgyLjMKKzE5OC44CisxOTIuNQorMTgzLjIKKzIwOC40CisxOTIuNAorMTkzLjgKKzE5OC42CisxOTYuMgorMTgzLjkKKzE4Ni4yCisxOTcuOAorMTgwLjYKKzIwNC43CisxOTUuMworMTgyLjgKKzE5Mi41CisyMTYuMworMjAzLjgKKzE5Ny40CisxNzkuNQorMTg4LjUKKzE5Ni44CisxOTQuNAorMTg5LjIKKzE5OS44CisyMDAuNworMjA1LjEKKzE4My40CisxODEuNQorMTkzLjYKKzIwNy45CisxNzcuNAorMTkxLjUKKzE5Ny4zCisxODkuOAorMTkxLjkKKzE4OS41CisyMDEuMgorMjExLjAKKzIwMS40CisyMDUuNQorMjAxLjEKKzE5OS4zCisxOTMuNQorMjAzLjUKKzE5MS42CisxOTQuMAorMTk2LjcKKzE4OC41CisxODkuOAorMTk1LjkKKzE4MS4xCisxOTMuMgorMTk3LjIKKzIwMS4wCisxODYuMgorMjAwLjkKKzE4My41CisxODMuMAorMjA3LjkKKzE4OS43CisxOTMuOAorMTgyLjkKKzIzMi4xCisxODYuMgorMjAwLjMKKzE5NC42CisxODQuMgorMTkyLjIKKzE4Mi45CisxOTMuNgorMjA3LjQKKzIwMy4zCisxODUuNgorMTk3LjYKKzIwNS45CisxOTMuMAorMTgyLjMKKzE5MC4xCisxOTMuMworMjAwLjIKKzE4My45CisxOTUuNworMTg2LjkKKzIwMC4xCisxODkuNgorMTk0LjIKKzE5NS41CisxNzguMworMTgzLjkKKzE4My4wCisxNzkuMgorMjA5LjgKKzE5OS42CisxODUuNAorMjEwLjkKKzE4OC42CisxODguOQorMTg1LjQKKzE3Ny4wCisxODMuMAorMTg2LjEKKzE5MS43CisxOTAuNworMTkyLjEKKzE5NS4yCisxODUuMAorMTg2LjYKKzE5NC4yCisxODkuNQorMTg3LjcKKzE4Ny45CisxOTEuOAorMTgxLjEKKzE4MC4yCisxODAuMAorMTg1LjYKKzE4MS44CisxODcuOQorMTkyLjkKKzE5OC43CisxODIuMAorMTgyLjcKKzE3NS44CisyMDIuMAorMTkwLjYKKzE5NS4zCisxOTEuMAorMjAxLjQKKzE5NC4zCisxNzkuNQorMTg1LjAKKzI0MC4zCisxODcuMQorMTk3LjgKKzIwNC44CisyMTAuNworMjAzLjIKKzIwMi4wCisxOTcuOAorMjAzLjUKKzIwNS4xCisxOTAuMAorMTkwLjMKKzIwNC4xCisxOTcuOQorMTk4LjYKKzE5OS4zCisxODIuMQorMjAwLjgKKzE5Ni4wCisxOTcuMQorMjAzLjUKKzE5OC42CisyMDAuNworMjAxLjEKKzE4OS4xCisxNzUuOAorMTk5LjkKKzIwMy43CisxOTIuMgorMTgyLjUKKzE4NS4wCisxOTUuOQorMjA0LjEKKzE5Ny4wCisxOTUuNQorMjAyLjAKKzIwMS41CisxODcuMQorMTg2LjcKKzE5OC4yCisyMTEuOAorMTk3LjYKKzE3OC41CisxOTguNQorMTk2LjQKKzE4OC4xCisxODUuMAorMTk5LjUKKzIwMC45CisyMDEuNworMTkzLjUKKzE4OC4zCisxODAuOQorMTkwLjYKKzIwMi44CisxODMuOQorMTkwLjEKKzIwNS4zCisxOTguNgorMTgzLjIKKzE5OC4wCisyMDAuOQorMTk4LjgKKzE5NC44CisxOTguMworMTk1LjgKKzIwNC42CisyMDIuNgorMjA3LjAKKzE4NS45CisyMDEuOQorMTk1LjkKKzIwNy42CisxOTcuNAorMjA2LjcKKzE4OC4yCisxODQuNworMTgzLjkKKzE5OC4zCisxODYuNAorMTkxLjAKKzIwOC44CisyMDkuNAorMTg3LjcKKzIwOC4wCisxOTguNAorMTkxLjkKKzE4Ny4xCisxODguNQorMTg5LjIKKzE5MC43CisxNzkuOQorMjA0LjEKKzE5NS41CisxODMuNworMTgzLjEKKzE4My43CisxOTQuNgorMTg3LjkKKzE4My41CisxODQuNworMjAzLjIKKzE5Ny44CisxNzkuNAorMTg1LjgKKzIwNS4zCisxNzkuOAorMTk0LjgKKzE4Ni43CisxOTEuNQorMTk3LjQKKzE5Ny4wCisyMDkuMgorMTk0LjEKKzE4Ny44CisxOTIuOQorMjAyLjIKKzE5NC40CisyMDYuNgorMTkxLjYKKzE5MC44CisxODcuNQorMTkzLjUKKzIwNS4yCisxODUuMQorMTg1LjYKKzE4OS45CisxOTYuMAorMjAzLjYKKzE5NS40CisyMDkuOQorMTk2LjUKKzIwMC44CisxOTAuMQorMTkxLjUKKzIzMi44CisyMDkuMgorMTkzLjEKKzE4My40CisxOTkuNQorMTg3LjIKKzE5OS40CisyMDMuNgorMTk4LjMKKzIwNC4xCisxOTYuNAorMjAyLjAKKzE4MC42CisxOTEuNgorMjAyLjkKKzE4NC45CisxODAuOAorMTkyLjMKKzIwNS4yCisyMDUuNQorMTc5LjAKKzE4My4zCisyMDMuMQorMTg0LjEKKzE4OC42CisxODAuOQorMTk1LjgKKzE5NS4wCisxODEuMQorMTk4LjMKKzE5MC43CisxOTEuOAorMTkyLjEKKzE5MS41CisyNTcuNAorMTk3LjMKKzIwNi41CisyMTMuNAorMTg0LjIKKzE5My41CisyMDguNgorMjA5LjgKKzE5Mi4wCisyMDEuNQorMTk4LjYKKzIwNS4yCisxOTguOQorMjEyLjYKKzE5NS45CisyMTMuNworMjE1LjkKKzIwOS4yCisyMTUuMgorMjA3LjQKKzIwOC45CisxOTIuMgorMTkyLjMKKzE5My44CisxODUuMQorMjA2LjAKKzE3OS4xCisxOTkuOQorMTk4LjMKKzIwMS42CisxODYuOAorMjAyLjMKKzE5MC40CisxODMuNgorMTkxLjgKKzE5MC42CisxOTQuNworMTg0LjEKKzE4NC40CisxOTMuOAorMTk0LjAKKzE5NS42CisyMDQuNQorMTk0LjkKKzE5Ni4xCisyMDEuMQorMTk2LjEKKzIxMC45CisxOTguNworMTkyLjEKKzIwOC4zCisxOTIuOAorMTkzLjYKKzIwNS4xCisxOTEuNQorMTkwLjcKKzE3OS4yCisxOTEuNgorMTkyLjEKKzE4Mi4zCisxNzYuMQorMTg1LjUKKzE4Ny4xCisxODMuNAorMTkxLjkKKzE3Ni4xCisxNzguMAorMTg1LjIKKzE5MS4zCisxODEuMworMTc4LjEKKzE4MS43CisyMDAuMworMTg3LjUKKzIwMS42CisxOTIuMworMTc3LjcKKzE4MC42CisxOTIuOQorMTg1LjQKKzE4My4xCisxNzguNAorMTk2LjkKKzE5MS45CisxODYuMQorMTk1LjcKKzE3Ny43CisxODQuMQorMTk1LjQKKzE4NC4yCisxODguOAorMTc5LjYKKzE4Mi4wCisxODIuOQorMTg1LjEKKzE4My44CisxODkuMworMjE2LjkKKzE5Ni42CisxODUuNworMjM1LjUKKzE4NC45CisxODEuOAorMTgwLjAKKzE4Ni42CisxODguNAorMTkwLjcKKzE4NS40CisyMTAuOQorMTg0LjEKKzIwMy4wCisyMDMuNQorMTk4LjkKKzIwNC4yCisxOTkuNworMTgyLjEKKzE3OC4xCisyMDUuMQorMTc5LjQKKzE4NC41CisxODAuNworMjAwLjUKKzE5Ny4zCisxNzguMgorMTc4LjgKKzE4MC45CisyMTkuMgorMTgwLjIKKzE5Mi41CisxOTguNgorMjM4LjAKKzIwMS4xCisxODIuNAorMjAzLjMKKzE4Mi4wCisxODguOQorMjAxLjIKKzE4NC42CisxODIuNworMTg3LjcKKzE4OC41CisyMDIuNQorMTk5LjgKKzE4OS40CisxOTEuMQorMTgxLjIKKzE5MS43CisxOTQuNgorMTgxLjMKKzE4NS4zCisxOTIuOAorMTgyLjQKKzE5MS42CisxODguMworMjAyLjYKKzIxMi4xCisxNzkuNgorMTg1LjkKKzE4My40CisxODcuOAorMTg0LjQKKzE4Ni44CisxOTcuMAorMTkxLjMKKzE4Ni43CisyMDEuOQorMTg3LjIKKzE5NS43CisxNzguNQorMTg3LjMKKzE5MC44CisxOTguNAorMTk4LjgKKzE4OS4xCisxODkuNgorMTk3LjYKKzIwMS4wCisxODUuMAorMTgyLjIKKzE4NC4yCisxOTMuMgorMTkxLjYKKzE4Ny40CisxOTYuMworMTkwLjcKKzE4NC41CisyMDYuMQorMjAwLjcKKzE5My4wCisxOTYuMgorMTk1LjEKKzE3Ny4xCisxODAuNworMTg3LjMKKzE4OC4zCisxODEuNQorMTgwLjcKKzIxNi45CisxODUuNworMTk2LjEKKzE5My4yCisxODUuNQorMTg2LjkKKzE5MC40CisxODkuNworMTk2LjEKKzE5My45CisxOTMuNgorMTg1LjcKKzE5MC4zCisxOTkuOAorMTkwLjQKKzE4Ny40CisxOTUuNQorMTkwLjAKKzE4OC43CisxOTAuMgorMTk1LjYKKzE5NS4yCisxODQuNworMTg2LjkKKzE4Ny40CisxNzkuMworMTg0LjcKKzIwNi43CisxOTQuMworMTk4LjkKKzE3OS4wCisxODUuNworMTg1LjIKKzIwNi43CisxODQuMworMjAyLjgKKzE4My41CisxNzguOQorMjM4LjMKKzE4MS4xCisxODkuNQorMTc2LjcKKzE3OC43CisxODMuNAorMTgwLjMKKzE5Mi40CisxOTMuNgorMTg2LjYKKzE5MC4wCisxODQuMAorMTg4LjUKKzE4OC42CisxOTYuMworMTgyLjIKKzE5MS45CisxOTEuMQorMTk3LjcKKzE4OC40CisxOTQuMgorMjAxLjcKKzIwNC4zCisxOTkuNgorMTkwLjcKKzE4My4wCisxODkuOQorMTkyLjkKKzE4Ny42CisxODIuOAorMjAzLjMKKzE4OS4zCisxOTQuMAorMTg5LjQKKzE4OC4wCisxOTQuNAorMjExLjcKKzE4Ni4zCisxODUuMworMTg3LjIKKzE4Mi45CisxOTQuOQorMTg3LjQKKzE5MC40CisxOTcuNQorMTg0LjUKKzE4NC44CisxODAuMAorMTk3LjkKKzIwNS45CisxODkuMgorMTk2LjUKKzE4OC4xCisxODUuNAorMTk1LjUKKzE4NS4wCisyMDMuMQorMTg4LjYKKzIwMi4zCisxODAuNgorMTkxLjMKKzIwNC40CisyMDguMgorMTg5LjIKKzIyNi45CisyMDAuMAorMTc4LjgKKzE4MS41CisxOTcuNworMjA0LjEKKzE4NC44CisxNzguNQorMTg2LjUKKzE5MC45CisxOTAuNAorMTgxLjQKKzE4OS44CisxNzkuMgorMTg5LjgKKzE3OS42CisyMDMuOAorMjA1LjQKKzE4NC4yCisxOTIuOAorMjA0LjcKKzE4Ni42CisxOTUuNQorMjAzLjcKKzE5Ny4yCisxNzguMAorMTgwLjMKKzE4Ny4wCisxNzkuMQorMTg3LjUKKzE4Ny45CisxODMuNAorMTgxLjgKKzE4NC4xCisxODEuMworMTg0LjAKKzE4MC42CisyMzAuOAorMTkzLjAKKzE5MC41CisyMDAuNAorMTg3LjkKKzE3NS45CisyMDQuMgorMjA2LjUKKzE4My4yCisxOTQuMgorMTg3LjIKKzIwMC4yCisxODkuNgorMTg4LjYKKzE4OC42CisxNzUuNAorMTg0LjIKKzE3NC4wCisxNzcuMgorMTgwLjYKKzE4MS41CisxODIuMworMTg3LjEKKzE4MC4wCisxODQuNworMTc5LjMKKzE5NS43CisxODAuNQorMTc5LjUKKzE4NC44CisyMDQuMAorMjAyLjEKKzE3OC43CisxODkuNAorMTk2LjQKKzE5MC44CisxODQuMworMTg5LjIKKzE4Mi44CisxODQuNgorMTc4LjQKKzE4My45CisxODUuMAorMTg0LjYKKzE3OS4yCisxNzkuMAorMTgyLjQKKzE5Ny4wCisxODguNAorMTg4LjUKKzE5Ni4wCisxNzkuNgorMTg4LjEKKzE4MC4zCisxOTYuMQorMTg5LjAKKzE3OC40CisxNzYuNQorMTg2LjQKKzE3OS4zCisxODcuNworMTg3LjkKKzE4NC44CisxNzYuOQorMTg4LjcKKzE4Mi44CisxOTIuMworMTkwLjAKKzE5Ny4yCisxOTEuNgorMTk3LjgKKzE4Mi4zCisxODQuMgorMTg3LjMKKzE4OC4yCisyMDcuMworMTg5LjIKKzE5MC43CisyMDIuMworMTkxLjcKKzE5NS40CisxOTYuMgorMTkwLjEKKzIwNC4yCisxOTQuOAorMTg3LjgKKzIwOS4xCisxOTIuMQorMTkzLjEKKzE5OS4zCisxOTIuMQorMjA0LjkKKzE5MC44CisxODYuNQorMTg5LjMKKzE4MS45CisxOTMuMworMTgyLjQKKzE5NS4yCisxODkuMQorMTk2LjgKKzIwMC44CisxODcuNgorMjAxLjEKKzE5Ny4wCisxOTYuNgorMTc3LjcKKzE4OC45CisxODYuMgorMTg2LjAKKzE5OS45CisyMDMuOAorMTkwLjIKKzE5MC4yCisxODYuMworMTc5LjEKKzE5OC44CisxODYuMworMTkyLjQKKzIwMS41CisxOTAuMgorMTkxLjAKKzE3OC4wCisxOTQuMQorMTk3LjkKKzE4OS45CisxODAuMgorMTc2LjIKKzE5My41CisyMDEuOQorMjAxLjMKKzIwMC43CisxOTAuMworMTk4LjQKKzE4Ni4wCisxOTAuMgorMTgyLjcKKzE4Ni4wCisxOTAuMAorMTk2LjgKKzE5My4wCisyMDEuNQorMTg0LjcKKzE4Ny43CisxOTAuOAorMTg3LjIKKzE4My41CisxNzguMQorMTc4LjkKKzE5NS44CisxNzguMgorMTg4LjAKKzE3Ny4yCisxODIuNQorMTg0LjIKKzE4MC43CisxODkuNgorMjAzLjQKKzE4MS43CisxODUuMQorMTc3LjUKKzE4MC45CisxOTQuMAorMTkwLjEKKzE5MC4xCisxODIuOQorMTg0LjQKKzIwMS44CisxOTEuMQorMTg0LjkKKzE5Ny43CisxOTMuMworMTkwLjMKKzE5Ny4yCisxODguMgorMTkxLjUKKzE5MC4wCisxODguMAorMTg3LjUKKzE4Mi41CisxODYuNgorMTgzLjYKKzE5My45CisxODcuNQorMTg2LjkKKzE5Ny4zCisxODcuMgorMTc3LjIKKzE4Ni44CisxOTEuOQorMTg2LjkKKzE5OC43CisxNzkuNworMTkxLjcKKzE5My42CisxODQuMgorMTc4LjQKKzE4Ny40CisyMDMuMworMTk2LjgKKzE5NS40CisxODIuOQorMTg3LjcKKzE4OS40CisxOTIuNQorMTkwLjAKKzE5MC4wCisxODUuNAorMTk0LjYKKzE4My43CisxODAuMgorMTk5LjYKKzE5MC41CisyMDUuOQorMTc2LjQKKzE4Mi44CisxNzkuMAorMTk5LjkKKzE4Ni43CisxODguOAorMTg5LjUKKzE4OS44CisxOTMuNQorMjAzLjAKKzE4My44CisyMDQuMgorMTc2LjQKKzIwNi41CisxODQuNworMTc0LjkKKzE4My4yCisxNzQuNAorMTk2LjIKKzE3OS4xCisxODMuNworMTgwLjIKKzE3NC41CisxODUuNQorMjAzLjUKKzE3NC43CisxODYuMQorMTc1LjEKKzE5OC4yCisyMDAuMworMTg0LjIKKzE4MC40CisxODcuOQorMTk0LjMKKzE5NC45CisxODEuMworMTgwLjIKKzE4Ni4wCisxODcuNgorMTgwLjIKKzE4OC4xCisxOTYuNQorMTc1LjkKKzE4NC4wCisxOTQuNAorMTg2LjMKKzIwNy42CisxODguMQorMTg1LjIKKzIwNy41CisxNzcuNworMjA0LjIKKzIwMy4zCisxODAuOAorMTc2LjAKKzE4MS41CisyMDIuMworMTkxLjYKKzE4Ni44CisxODMuMAorMTg5LjcKKzE5MS4yCisxNzkuMgorMTk2LjIKKzE4NS45CisxODQuMworMTgzLjMKKzE4Ni44CisxNzkuMworMTg4LjYKKzE4NC44CisxNzYuNworMTg5LjYKKzE3Ny41CisxODYuMworMTk3LjIKKzE3OC4xCisxODkuOAorMTc1LjgKKzE3OC45CisxOTEuOQorMTc2LjkKKzE4Ni44CisxODYuNgorMTk0LjEKKzE3OS4zCisxNzguNworMTgzLjkKKzIyMC4zCisxODEuNgorMTgzLjcKKzE5Ni43CisxODAuMgorMTc2LjkKKzE4OS41CisxODcuNQorMTg1LjgKKzE4NC4zCisxNzkuOQorMTg2LjAKKzE3OC41CisxNzkuNQorMjI3LjYKKzE4Ny4xCisxOTkuMgorMTgzLjQKKzE3Ny4yCisxODEuMworMTkwLjcKKzE5Ny44CisxODAuMQorMjAzLjQKKzE5OC4xCisxOTYuOAorMTg0LjMKKzE4OC41CisxODkuNgorMTg3LjkKKzIwMC43CisxODcuMQorMTkzLjMKKzE4My4wCisxOTkuMQorMTg3LjMKKzE4MS44CisxODQuMAorMTc4LjAKKzE5OC43CisxNzcuNAorMTk1LjYKKzE4NC4xCisxODMuNAorMTg2LjAKKzE4My4xCisxODEuOAorMTkwLjYKKzE4OC44CisxODQuOAorMTk2LjUKKzE4Ni4yCisxODQuNworMTgyLjYKKzE4Ny40CisxOTQuMQorMTg1LjMKKzE4MS42CisxOTguNAorMTkwLjEKKzIwMC4yCisyMTQuOQorMTk1LjEKKzE5Mi45CisxOTAuOAorMTc5LjQKKzE5NC45CisyMDYuMAorMTkzLjIKKzE4Ni42CisyMTQuMQorMjE2LjEKKzE4OS4wCisxODQuMgorMjAxLjEKKzE4Mi4xCisyMDAuMgorMTg4LjUKKzE5My4wCisxODQuOAorMTg4LjgKKzE4Ni42CisxODguMworMTkzLjkKKzIwMi40CisxOTYuOAorMjE0LjUKKzIwMi4xCisxODYuNworMTk3LjMKKzE4NC4yCisxODYuNQorMjAyLjYKKzE4Ny4zCisyMDQuMworMTc2LjEKKzE4My45CisxODkuMgorMTg5LjcKKzE4MC44CisxOTkuNAorMTg1LjcKKzE5My4zCisxOTIuNworMTkyLjgKKzIwNC45CisxODguNworMTk2LjUKKzE4Ny45CisxNzcuNAorMTg5LjYKKzE3Ny4yCisxOTcuMworMTgzLjkKKzE4OS43CisxODQuNgorMTkxLjAKKzE5NS40CisxNzUuNworMTc5LjEKKzE4NC40CisxOTMuMgorMTgwLjQKKzE5MS4yCisxODcuMgorMTgxLjEKKzIwMy41CisxODkuMgorMTg2LjQKKzE3Ni4zCisxOTEuNQorMTkzLjYKKzE4Ny4wCisxODYuOAorMTg3LjMKKzE4NC44CisxOTcuNgorMjA3LjMKKzE5MS44CisxODcuMQorMTk2LjMKKzIwNi45CisxOTkuOQorMTg2LjMKKzE4OS45CisxNzkuOAorMjAwLjAKKzE5My44CisxOTAuOQorMTgwLjkKKzE3Ni4zCisxODkuMQorMTgwLjQKKzE5MC45CisxODIuNAorMTgyLjgKKzE4MS4xCisxOTMuOQorMTg0LjAKKzE4NS45CisxOTkuMQorMTk5LjUKKzIwNC4yCisxODEuOQorMTk5LjAKKzE4NC4xCisyMDcuNAorMTk0LjgKKzIxNi41CisxODguNAorMjA2LjcKKzE5OS4yCisxNzkuMworMTg2LjcKKzIwMC43CisxODYuMworMTk1LjUKKzIwNC45CisxOTQuMAorMTg3LjUKKzE5Ni4zCisxODEuNAorMTg2LjAKKzE5Ny44CisxOTguMQorMTk2LjEKKzE4NC4zCisxODMuMworMjExLjMKKzE5Mi44CisxODcuOQorMTgzLjQKKzE5Mi45CisxODcuNAorMTk0LjIKKzE3Ny4xCisyMDAuMAorMTk5LjMKKzE3Ny4yCisxODAuMQorMTc4LjYKKzE4Mi4zCisxODkuMQorMTkxLjMKKzE5Ny43CisxODcuNgorMTg3LjMKKzIwMy45CisyMDQuNAorMTgwLjQKKzE4Ni41CisxODguNAorMTc2LjEKKzIwNi41CisxODcuNworMTk0LjEKKzE5My41CisyMDMuNworMTg2LjgKKzIwMC4xCisxODcuMAorMjAzLjMKKzE5Ni4zCisyMDguMQorMTkyLjcKKzIwMi4xCisyMDQuNworMTgzLjkKKzE4Ni43CisxOTguMgorMTg5LjQKKzE4Ni40CisxODguMworMTk1LjIKKzIwMy4zCisyMDIuMworMjAxLjEKKzE4MC4xCisxOTEuMworMTgwLjQKKzE4Ny43CisxOTMuNAorMTk2LjUKKzIwOC44CisxODUuMworMTg2LjgKKzIwMy42CisxNzkuMAorMTg1LjAKKzE4MS4xCisxOTMuOAorMTk2LjkKKzIwMS4wCisxODcuMworMTg5LjYKKzE5MC44CisxODguOQorMTk3LjYKKzIwMy4wCisxOTMuMgorMTg1LjYKKzE5NS42CisxOTkuMQorMTkxLjgKKzE3OC43CisxODMuNgorMTg0LjEKKzE5Mi4wCisxODIuNAorMTgzLjgKKzIwOS41CisyMDUuNworMTg3LjAKKzE4Ny42CisyMDAuNgorMTg3LjEKKzE4Ny4yCisxODQuOQorMTgwLjMKKzE4OS40CisxODIuNworMTk2LjgKKzE4NC43CisxODUuOAorMTg0LjAKKzE5NC4xCisxODAuNQorMTk5LjEKKzE4MS43CisyMDUuMworMTgyLjYKKzE4Ni44CisxODAuMgorMTgxLjkKKzE4Ny40CisxODcuOQorMTkxLjgKKzIwNC44CisxNzguNQorMTgxLjYKKzE4MS42CisxNzkuNQorMTgxLjkKKzE5MC4xCisxOTQuMQorMTgwLjAKKzE3OS4xCisxODEuMgorMTc1LjAKKzE4Ni4zCisxODQuOAorMTgyLjYKKzE4Ni44CisxODUuMworMTgxLjIKKzE5MC4wCisxOTUuMworMTg2LjkKKzE5MC42CisxODcuMworMTkzLjQKKzE3Ni45CisxOTAuNQorMTk0LjYKKzE4MS4wCisxNzUuOAorMTg3LjkKKzE4My4yCisxODcuNworMTkxLjQKKzE4My4xCisxNzguNgorMTkzLjQKKzE4NS41CisxOTAuMQorMTk0LjYKKzE5MS4wCisxNzcuNworMTg3LjMKKzIwMS4zCisxODguNgorMTgyLjUKKzE5Ni4zCisxNzYuMgorMTg0LjkKKzE4OS42CisxODYuOQorMjI3LjkKKzE4OC4xCisxODUuMAorMTgyLjkKKzE5Ni40CisxODMuMQorMTc5LjgKKzE4Ni41CisxODUuMgorMTk5LjcKKzE4Ny43CisxOTEuNgorMTkxLjkKKzE5NC44CisxODMuOQorMTg1LjMKKzE4OC4yCisxOTIuNworMTgwLjgKKzE4My41CisxOTkuOAorMTk2LjgKKzE4NC4yCisxNzkuNQorMjA0LjIKKzE4My41CisxNzUuNAorMjA3LjMKKzE5Mi41CisxOTEuOQorMjA4LjYKKzE5NC43CisxOTUuMgorMTkwLjMKKzE4MC44CisxODIuNgorMjAzLjIKKzE5MS40CisxODkuNworMTgzLjkKKzE4NS43CisxOTIuMworMTkwLjcKKzIwNi44CisxODIuOQorMTk1LjIKKzE5My4xCisyMDEuMgorMTc3LjAKKzE4OC4xCisxODIuMworMTg1LjAKKzE5OC41CisxODYuNAorMTgzLjkKKzE4OS40CisxODEuOAorMTk5LjkKKzE5OC43CisxODMuNworMTkxLjgKKzE4Ny41CisyMDkuNAorMjAxLjgKKzE3OC4wCisyMDEuOAorMTk4LjAKKzE4Ny4yCisxODUuNQorMTc4LjEKKzE5NS43CisyMDAuMQorMTc0LjgKKzE3Ni40CisxODcuNgorMTc3LjMKKzE3OC4xCisxOTcuNQorMTgzLjcKKzIwNy43CisxODAuNgorMTc2LjYKKzE5MC44CisxOTEuMAorMTgwLjEKKzE4MC40CisxNzguOAorMTg1LjUKKzE5NC44CisxODguMQorMTg1LjgKKzE3OS41CisxODEuMAorMTk2LjEKKzE5Mi42CisxNzkuMgorMTgwLjcKKzIwNi4zCisxNzUuOQorMTk2LjgKKzE3OS40CisxOTUuMQorMTg3LjUKKzE4My45CisxODMuOAorMTg0LjYKKzIwOC42CisxOTUuNQorMjAyLjkKKzE5MS45CisxODcuMAorMTg5LjIKKzE3OC41CisxNzYuMQorMTg2LjYKKzE5NS4xCisxODEuNgorMjAxLjAKKzE5Mi4xCisxOTIuOQorMjAyLjIKKzE5MS4wCisyMDUuOAorMjA0LjMKKzE5MS44CisxODUuMQorMTkwLjEKKzE5My42CisxOTIuNAorMTg1LjIKKzE4MC42CisxOTIuNgorMTg1LjcKKzE4Ny41CisxODkuMgorMTg0LjAKKzE4OS4xCisyMDAuNgorMTg1LjIKKzE4Mi44CisxODIuMAorMTg1LjQKKzE3OC4zCisxODguNAorMTkzLjIKKzE5NC45CisxOTcuMQorMTk0LjQKKzE4NC44CisxNzkuMgorMTk1LjYKKzE4Mi42CisyMDQuMworMjAzLjEKKzE4MC4wCisxODcuNworMTg3LjcKKzE5Ny44CisxNzguNworMTg2LjUKKzE5NC42CisxOTQuOAorMTc2LjQKKzIwMi41CisxOTUuNAorMTgwLjUKKzIyMC4wCisxOTEuMAorMjE3LjEKKzE3OC40CisxOTYuMQorMTgyLjUKKzE5MC44CisxOTEuNworMjAyLjAKKzE5Ni44CisxOTkuNAorMTgzLjgKKzE4My4yCisxODYuNQorMTc4LjEKKzE5OC42CisxODYuMQorMTk1LjQKKzE5Ni42CisxOTkuMworMTk2LjUKKzE3Ny45CisxODYuMworMTgwLjUKKzE5OC45CisxOTAuMgorMTg4LjUKKzE4NC4xCisxODguNgorMjAxLjQKKzE4NS40CisxNzYuNAorMTgyLjAKKzE3Ni45CisxODQuNAorMTc5LjAKKzE3OC40CisxODMuOAorMTkwLjkKKzE4NS41CisxODQuNAorMTc5LjYKKzE5Ny41CisxODQuMworMTc5LjEKKzE5My40CisxOTQuMgorMTc5LjEKKzE4OS4wCisxOTEuMgorMTgwLjgKKzE4NC41CisxODcuOQorMTkxLjcKKzE3Ny4yCisxODUuNAorMTgzLjYKKzE5MC43CisxODcuNQorMTg4LjgKKzE5OS43CisxOTAuMAorMTc2LjAKKzIwNC40CisxOTEuMQorMTg4LjMKKzE4Mi4xCisxODEuNgorMTkxLjQKKzE5MS44CisxOTMuMQorMTg2LjAKKzE4OC4xCisxNzguNAorMTkzLjcKKzE3NS4xCisxNzkuMAorMTg2LjcKKzE4NS4zCisxNzkuNworMTgyLjcKKzE5OC4wCisxODAuMgorMTg5LjUKKzE4My4xCisxNzcuMQorMTgyLjMKKzE3NC43CisxNzUuNgorMTg2LjQKKzE4OS4yCisxNzguOQorMTgwLjQKKzE4MS4zCisxODIuMworMTgwLjMKKzE4MC44CisxODAuMQorMTk3LjIKKzIwNC43CisxODEuNgorMTgyLjMKKzE4NC4wCisxNzYuNQorMjE0LjkKKzE5NC43CisxNzguMworMTc1LjEKKzE3NC4zCisxNzYuNQorMTkwLjkKKzE4My4xCisxNzYuOAorMTc3LjEKKzE4My44CisxNzguNQorMTg5LjIKKzE4MC44CisxNzcuNgorMTc1LjMKKzE4NS4zCisxODMuNAorMTc1LjIKKzE4My42CisxNzcuMAorMTgxLjkKKzE4MC4zCisxODUuMQorMTc5LjEKKzE4OC4xCisxODQuNAorMTgxLjYKKzE4OC4wCisxODEuNgorMTkwLjYKKzE3Ny45CisxODIuNworMTc3LjQKKzE4My4yCisxODkuMworMTg3LjYKKzE3OS44CisxOTIuMworMTg4LjEKKzE5NC42CisxODYuNworMTgxLjYKKzE5MS44CisxOTUuNgorMTg3LjQKKzE4NS41CisxOTAuMAorMTg0LjAKKzE3OC41CisxNzguMAorMjAwLjgKKzE5OS4yCisxODYuNQorMTc0LjkKKzE4MS4zCisxODEuMAorMTg3LjYKKzE4Ni44CisxODMuMworMTgzLjgKKzE5NS42CisxOTAuNgorMTkzLjgKKzE3Ni40CisxNzkuMQorMTgyLjkKKzE5My40CisxODQuNAorMTg2LjIKKzE4MC4zCisxOTQuNworMTgyLjYKKzE4Ni43CisxOTYuNAorMTk2LjcKKzE5Ni4yCisxOTIuMworMTg5LjEKKzE3OC40CisxODIuMworMTk1LjIKKzE4NC4xCisxODkuMAorMTg0LjcKKzE4OS4zCisxODQuMQorMTc3LjMKKzE4OS41CisxODYuMQorMTg2LjQKKzE4MC41CisxOTYuMQorMTg3LjUKKzE4OC40CisxOTUuOAorMTkyLjAKKzE5Mi45CisxODIuNAorMTk5LjYKKzE4OS42CisxODAuMgorMTc2LjEKKzIyMC40CisyMDYuNgorMTk1LjUKKzE3Ni41CisyMDIuMgorMTg3LjUKKzE4NS4wCisyMDUuNgorMTk1LjcKKzE5Mi44CisxOTIuOAorMTc0LjkKKzE4Ny4zCisxODEuOQorMTgwLjQKKzE4My45CisxODcuNgorMTkyLjUKKzIwMi4xCisxODUuMgorMjAwLjIKKzE4NC4xCisxODkuOQorMTk0LjcKKzE4NS4xCisxOTEuOQorMTc2LjAKKzE5Ny43CisxNzcuNQorMTc4LjYKKzE3OS4zCisyMDYuMAorMTkzLjMKKzE5Ni4yCisxNzkuMworMTgxLjMKKzIwNS41CisxNzguMQorMTg2LjkKKzE4My41CisxNzguNQorMTkzLjEKKzE3OS40CisxODYuMQorMTc0LjMKKzE5NC40CisxODcuMQorMTk1LjgKKzE3Ni4wCisxODcuNgorMTc2LjEKKzE4My43CisxODIuMAorMTgzLjcKKzE3Ni4zCisyMDEuMAorMTg1LjgKKzE4MC42CisxODYuMQorMTgwLjEKKzIwNC40CisxODYuMQorMTgyLjkKKzE4MS43CisxODQuNgorMTc3LjMKKzE4Ni4yCisxODguNworMTgwLjUKKzE4Mi4xCisxODUuMworMTc3LjcKKzE4NS40CisxODguMgorMTk0LjEKKzE4NS42CisxNzcuOAorMTkyLjcKKzE5OC4xCisxOTYuMAorMTg3LjUKKzE4Ni40CisyMDYuOAorMjA3LjQKKzE3Ny4zCisxODEuMworMTg1LjAKKzE3NS43CisxNzQuMgorMTkxLjUKKzE5NC4wCisxOTAuOAorMTk5LjIKKzE3Ni40CisyMDIuNworMTkzLjEKKzE4Mi42CisxODYuMAorMTk2LjAKKzE4Ni4xCisxODkuNAorMjAzLjQKKzE4NC44CisxOTQuMworMTg3LjIKKzE4My41CisxOTkuNAorMTk2LjcKKzE4MC4yCisxOTUuMgorMTgwLjkKKzE4Mi43CisxOTMuNQorMjAwLjAKKzE5My4zCisxODQuNAorMTk5LjEKKzIwNi4yCisxOTkuMAorMTk1LjgKKzE4OS40CisxOTQuMQorMTk2LjQKKzIwMS41CisxODAuNworMTg5LjcKKzE5My4zCisyMDAuMworMjA1LjUKKzE4OS45CisxOTIuNgorMTg3LjEKKzIwNS43CisxOTQuOQorMTg4LjAKKzE4OS4yCisxOTcuOQorMTg4LjUKKzE4NS4wCisxODIuNworMjA1LjgKKzE4Ni43CisxODkuMgorMTg1LjEKKzE4Mi40CisyMDUuMQorMTgxLjQKKzE4NS42CisxODguNQorMTk1LjkKKzE5OS44CisxODUuNAorMTk0LjcKKzIwMS4yCisxODUuMAorMjAyLjEKKzIwMC4wCisxODEuOQorMTg2LjgKKzE5NS45CisxODIuMgorMTg2LjYKKzE4Ny4xCisxODQuOQorMTgxLjEKKzE5MC4xCisxOTEuMAorMTg2LjcKKzE4NC42CisxODEuOAorMTkwLjQKKzE4NS43CisxODMuNAorMTg3LjAKKzE4Mi42CisxODMuNQorMTczLjkKKzE4MS44CisxOTQuMQorMTgyLjIKKzE4Mi42CisxODEuOAorMTg3LjAKKzE5Mi4yCisxNzguOQorMjA2LjkKKzE5Ny4xCisxODAuNworMTgzLjQKKzE3Ni43CisxODcuOQorMTk0LjUKKzE4Mi4wCisxODIuMAorMTkwLjkKKzE3Ny45CisxODAuMworMTkwLjgKKzE4Ny43CisxNzkuMQorMTg3LjkKKzE4My43CisxODcuOQorMTgzLjUKKzE3NS45CisxODYuNQorMTc4LjIKKzE4MC43CisxOTQuMworMTg0LjgKKzE4MS40CisxODIuOAorMTc5LjgKKzE4Ny4wCisxNzkuMQorMTc4LjgKKzE4Ny4yCisxODUuOQorMTgyLjAKKzE4Ny43CisxODEuMworMTg2LjAKKzE4MS4wCisxODMuMgorMTg2LjUKKzE4OS4zCisxODcuOAorMTgyLjgKKzE3OS40CisxOTkuMAorMTgwLjkKKzE5My44CisyMDIuNgorMTg1LjgKKzE3Ny41CisxODIuNworMjAyLjQKKzIxMy44CisxOTAuNgorMTg5LjgKKzE5MC41CisxODUuMAorMTgzLjcKKzE5MS4wCisxODUuNworMTgyLjIKKzE5NC44CisxODMuMQorMTkxLjgKKzE4Ni42CisxODUuMgorMTgxLjcKKzE4Mi4xCisxODUuNworMTk1LjAKKzE4MS41CisxODUuMQorMTgxLjUKKzE4Ny4zCisxODYuNQorMTg4LjcKKzE4NS4yCisxODAuNworMTc4LjMKKzE5MS44CisxODUuNAorMTg4LjYKKzE4NC41CisxODcuNQorMTkxLjUKKzE5MS41CisxOTUuOAorMTk3LjkKKzE5NC4yCisxODQuOQorMTgyLjcKKzE4Mi4xCisxODUuNgorMTg4LjQKKzE3OC44CisxOTAuNAorMTc5LjMKKzE4Ni4yCisyMDYuMAorMTkxLjIKKzE5NS4xCisxOTguNAorMTg5LjkKKzE4MC44CisxODEuMQorMTk4LjUKKzIwMy40CisxOTAuOAorMTc3LjEKKzE4NC4wCisxODEuMAorMTkyLjIKKzE3NS45CisyMDAuNAorMTkyLjIKKzE4MS4xCisyMDIuMAorMTk4LjYKKzIwMy42CisxOTEuNworMTkzLjQKKzE5Mi42CisxODYuNQorMTgyLjQKKzE5NS44CisxODQuOQorMTkxLjAKKzE3Ni43CisxODIuNworMTk0LjgKKzE4MS45CisxOTEuMQorMjA1LjUKKzE3Ni4zCisyMDAuMQorMTg0LjEKKzIwOC44CisxODQuMworMTk2LjIKKzE5MC4yCisxOTcuMQorMTg2LjgKKzE4MS43CisxODguNQorMTg4LjYKKzE4Ny4yCisxOTUuMworMTk4LjYKKzIwNS43CisxODUuNAorMTg3LjUKKzE3Ni4yCisxODYuMQorMTk5LjQKKzI5NC42CisyMzIuNworMjAwLjUKKzE4MS44CisxODkuMQorMTg2LjkKKzE5MC43CisxNzkuNworMTgxLjMKKzE4MS41CisyMDAuNQorMTgxLjIKKzE4MS43CisxODUuNAorMTk1LjUKKzIwMS45CisxOTkuNworMTk0LjIKKzE3OS42CisxODEuNAorMjA1LjUKKzE4My4xCis0OTkuNAorMTg4LjUKKzE4NC41CisxOTQuNQorMTk1LjUKKzE5My42CisxODkuMAorMTk2LjQKKzE4OC4zCisxODYuNworMTkwLjYKKzE3Ni45CisxODguMQorMTg5LjQKKzE5OC4yCisxNzguOAorMTk2LjUKKzIwMy4xCisxOTIuMworMTkzLjgKKzE4OC40CisxODAuMgorMTkyLjMKKzE4Ny4xCisxOTUuMgorMTgxLjYKKzE4NS41CisxOTAuOQorMTg1LjIKKzIwMC41CisxOTAuMAorMTgwLjIKKzE5NC40CisxOTYuNQorMTg3LjcKKzE4NC4zCisxODkuNQorMTg4LjIKKzE4OS41CisxOTQuNQorMTkyLjQKKzIwMi4xCisxNzcuOQorMTkzLjgKKzE5MS43CisxODIuMgorMTkwLjEKKzE5Ny40CisxOTYuNgorMTkzLjcKKzE5NS45CisyMDAuOQorMTc4LjgKKzE4MS40CisxOTMuNgorMTkzLjUKKzE3Ny43CisxOTIuOQorMTkwLjkKKzIwMS4yCisxODQuOQorMTc1LjgKKzE5Ny45CisyMDIuNAorMTkyLjMKKzIwMi41CisxOTguMworMTk2LjgKKzE4NS4yCisxODQuOAorMTk4LjEKKzE5MS4zCisxNzQuMAorMTgwLjUKKzE5My40CisxODMuMAorMTg1LjEKKzE3Ny4wCisxOTAuNAorMTgxLjMKKzE3OS4wCisxODAuNgorMTc5LjEKKzE4OC44CisyMDcuMgorMTgzLjcKKzE4Ni42CisxOTguMworMTc2LjYKKzE4Ni41CisxODcuNAorMTc5LjUKKzE4OS4yCisxOTcuNworMTgxLjUKKzE5NC42CisxOTUuNQorMTgxLjYKKzE5Ny4zCisxOTAuNworMjAyLjAKKzE4My45CisxOTMuMAorMTgzLjkKKzE5Ni45CisyMDMuNQorMTg5LjQKKzE4Ny4xCisxODUuMgorMTg0LjgKKzE5OS44CisxNzUuNworMTgwLjYKKzE4Ny42CisxODUuNAorMTc4LjUKKzE4NS41CisxNzguNworMTg3LjUKKzE4NS43CisxOTEuOQorMTgwLjIKKzE4Ni43CisxODMuMAorMTk2LjcKKzE5Ny42CisxOTcuMQorMTg3LjQKKzE5NC44CisxOTQuNworMTkxLjAKKzE4NS4xCisxODcuMAorMTg1LjgKKzE5Ny42CisyMDQuMgorMTg3LjkKKzE4OS45CisyMTcuNQorMjAyLjgKKzE5Mi40CisxNzYuNAorMTc4LjgKKzE5OS44CisxOTIuNQorMTk5LjkKKzE5MC44CisyMDIuOAorMTg3LjAKKzE4MC4yCisxOTYuNgorMTc2LjUKKzE4Ny42CisxODEuMworMTkxLjAKKzE4MC42CisxODQuNworMTk1LjgKKzE5MS41CisxODIuNworMTgxLjMKKzE4OS4zCisxODIuNQorMTg0LjIKKzE4Ny45CisyMDIuNAorMTk1LjcKKzE4OS41CisxOTUuNAorMjAxLjIKKzE4Ni4xCisyMDguOAorMTk5LjYKKzE4OS40CisxODAuNQorMTk0LjIKKzE4NC41CisxODcuNQorMTk2LjYKKzE4OC4wCisyMTAuMQorMTkzLjMKKzE4Ny42CisxOTEuNgorMTg4LjUKKzE3OS4yCisxOTIuNQorMTg5LjcKKzE4MS42CisxODAuOQorMTg3LjkKKzE4MC42CisxODEuMQorMTc4LjcKKzE3NS43CisxNzYuMgorMTg3LjEKKzE4NS4wCisxODYuOQorMTg2LjUKKzE5MC4wCisxODUuNgorMjAxLjIKKzE4OS4zCisxODkuMworMTg5LjcKKzE4OC4yCisxODcuMgorMTc1LjAKKzE4NS41CisxODUuMAorMjA1LjIKKzE4Ny4zCisxNzcuMgorMTc5LjIKKzE5MC4yCisxODMuMAorMTkyLjkKKzE4My4yCisxODUuNAorMTc5LjIKKzE4Ni4yCisxODMuMQorMTgzLjgKKzE4Ni42CisxODUuNworMTkyLjQKKzE3OS42CisxOTYuMgorMTgwLjIKKzE4NS45CisxOTcuNAorMTkyLjIKKzE3Ny41CisxODAuNworMTkwLjIKKzE3Ni45CisxOTMuNgorMTg2LjIKKzE4NC45CisxODIuMAorMTg2LjEKKzE4Ny40CisxODQuMworMTk2LjIKKzIwMy4xCisxODAuNgorMTkyLjUKKzE5Ni4yCisxOTUuOQorMTgxLjYKKzE4OS45CisxODMuMworMTkyLjcKKzE4Ny4zCisxOTEuMAorMjAwLjIKKzE4MC4xCisxODcuMAorMTc1LjcKKzE3OS45CisxOTMuMQorMTkwLjIKKzIwMi4xCisxNzQuMQorMTc5LjUKKzE4NS4xCisxODIuNworMTk2LjcKKzE3OS44CisxODYuNworMTkyLjUKKzE4OS4yCisxOTMuNworMTg0LjEKKzE4NS42CisxODQuNgorMTkzLjYKKzE4MS4wCisxODkuMgorMTc5LjkKKzE4MS40CisxODMuNworMTg0LjUKKzE5My4xCisxOTEuNQorMTgyLjkKKzE5MC4yCisxODUuMgorMTg1LjkKKzIxNi42CisxODQuMQorMTk1LjcKKzE4MS4yCisxODIuOAorMTk5LjMKKzE4Ny40CisxODQuOQorMTc3LjYKKzIwNi4yCisxODQuMQorMjAxLjUKKzIwMC43CisxOTIuMgorMTg3LjAKKzE4Mi4xCisxOTYuNgorMTgxLjYKKzE4OS4yCisxOTEuNgorMTg4LjgKKzE4Ni45CisxOTMuNgorMTg0LjIKKzE5MS4zCisxOTQuOQorMTk0LjYKKzE4OC43CisxNzkuMgorMjA1LjEKKzE4MS4wCisxNzcuMworMTgzLjcKKzE4NC44CisxODMuNworMjA0LjMKKzE5MC43CisxODEuNgorMTkxLjYKKzE4OS41CisxOTUuNQorMTc2LjAKKzE5My4wCisxOTIuMQorMTk1LjkKKzIwNS44CisxOTIuMgorMTkwLjYKKzE5OC4zCisxODUuOAorMTg2LjcKKzE5OC42CisxODQuMgorMjAzLjEKKzE5OS42CisxODcuMAorMjA0LjMKKzIwNy4yCisxOTAuOAorMTk2LjcKKzE4OC44CisxOTMuMgorMTg4LjcKKzE5OS44CisyMDQuMworMTg4LjYKKzE5Mi4wCisyMDkuOAorMTgwLjMKKzIwMy43CisxOTYuNAorMTg1LjcKKzE4Mi4xCisxOTMuMworMjAwLjkKKzE5Ni42CisxODEuOQorMTgyLjIKKzE3OS4yCisxOTcuMworMTg5LjMKKzIwMC45CisxODQuNQorMTg1LjgKKzE4NS42CisxODcuNQorMTg3LjUKKzE4OS41CisxODYuOQorMTg3LjIKKzE5NS43CisxODIuMAorMTc5LjAKKzE5MS40CisxODguNQorMTc3LjcKKzE4NS43CisxODIuMAorMTg5LjAKKzE5OC43CisxODguNAorMTg2LjYKKzE4MC40CisxODUuMQorMTg0LjIKKzIwNy42CisxODQuMgorMTkwLjAKKzE4MS41CisxOTAuOQorMTkxLjIKKzE4Ny44CisxNzcuOAorMTgyLjcKKzE5MS44CisyMDYuMgorMjAxLjQKKzE4Mi4yCisxODkuMgorMTk1LjQKKzE4Ny45CisxOTUuNworMTkwLjQKKzE4My4zCisxODMuMgorMTc4LjIKKzE4OS4wCisxNzkuMgorMTc1LjUKKzE4Ny4zCisxODEuMQorMTgwLjEKKzE4OC4xCisxODQuNAorMTgzLjkKKzIwMC4yCisxODUuNAorMTgwLjQKKzE4NC4wCisxODMuOAorMTgxLjIKKzIwMy42CisyMDEuMQorMTk3LjEKKzE5Mi4zCisxODIuNworMTgyLjQKKzE4My4wCisxNzcuMworMTgxLjMKKzE4NS4zCisxODQuNgorMTg4LjcKKzE3OS4xCisxNzkuMQorMTg0LjYKKzE3Ni4wCisxNzcuOAorMTg2LjkKKzE4OS44CisxODAuMworMTc3LjIKKzE4NC4yCisxNzkuMgorMTc3LjQKKzE4Mi4wCisxODYuNgorMTg4LjcKKzE5NC4yCisxODQuMAorMTc4LjkKKzE3NS4zCisxOTEuNgorMTgyLjkKKzE4OC4zCisxNzguNworMjAxLjYKKzE4Ni40CisxODAuOAorMTg0LjcKKzE4Ni43CisxOTYuOQorMTc3LjcKKzE3OC44CisxNzUuMworMTgyLjcKKzE4NC4wCisxODIuNAorMTk2LjYKKzE3NC43CisxNzguMAorMTgxLjUKKzE5OC4xCisxODUuMQorMTc3LjUKKzE4MS4yCisxODguMQorMTk2LjAKKzE4My42CisxOTYuMgorMTg1LjkKKzE5My4yCisxODYuNworMTc5LjcKKzE5NS4zCisxOTAuMQorMjA2LjgKKzE4Ni4yCisxNzguNQorMTkyLjAKKzE4Ny42CisxNzYuOQorMTkxLjgKKzE5MC44CisxOTMuNgorMjAwLjAKKzE5Mi4zCisxNzguMAorMTg0LjYKKzE3OS40CisxNzguMgorMTgzLjIKKzE3OS45CisxODQuOQorMTgzLjcKKzE4OS4xCisxNzYuNAorMTg1LjUKKzE4NC44CisxOTIuNQorMTg1LjMKKzE5My45CisxNzkuNgorMTgxLjcKKzE3OS4xCisyMTAuOAorMTg1LjYKKzE4NC4yCisxODEuMworMTk4LjgKKzE4MC4yCisxODIuNQorMTkxLjkKKzE5Ni40CisxODYuNgorMTg1LjMKKzE4Mi41CisxNzUuOAorMTgyLjAKKzE4Ni45CisxODYuNgorMTc2LjAKKzE3NS40CisxODYuNQorMTc1LjQKKzE4Mi40CisxOTkuNQorMTkyLjcKKzE4Mi4wCisxOTkuOQorMTgxLjEKKzE5Ni43CisxODYuMgorMTgyLjAKKzE3NS45CisxODQuNAorMTgzLjgKKzE3OC40CisxOTEuMworMTc3LjgKKzE5Ni4xCisyMDAuOAorMjAwLjYKKzE5MS4xCisxOTAuNAorMTgwLjMKKzIwMC42CisyMDEuNAorMTgxLjMKKzE3Ni45CisxODMuMgorMTg1LjAKKzE3OC40CisxODcuOAorMTcyLjcKKzE4Mi44CisxODYuMworMTkzLjkKKzE3OS4yCisxOTQuOQorMTc2LjgKKzE4OC4xCisxOTAuNworMTkyLjMKKzE3OC40CisxOTEuOQorMTk2LjYKKzE4My41CisxOTcuOAorMTkyLjAKKzE3Ni4wCisxOTIuMQorMTkxLjUKKzE5My4zCisyMDkuNQorMTg1LjIKKzE4Ny42CisxODYuMworMTkwLjkKKzE4My45CisxOTAuMgorMTg2LjMKKzE4NC43CisxNzcuMworMTg1LjAKKzE3OC4zCisxOTMuMAorMTgxLjcKKzE5MC45CisxODUuMworMTc0LjkKKzE5Mi4zCisxOTQuNQorMTk0LjEKKzE3Ny4wCisxODUuMgorMTkzLjIKKzIwMi40CisyMDIuMAorMTk3LjIKKzE5OS4zCisxNzYuOQorMTg1LjcKKzE4OC4xCisxODYuOAorMTg0LjQKKzIwNC41CisxOTYuNAorMTgxLjMKKzE5MC45CisxNzcuMgorMTkyLjQKKzE3OS45CisxNzcuMAorMTk0LjEKKzIwMy41CisxODkuMQorMTk0LjcKKzE4MS41CisxODMuNgorMTk5LjgKKzE4Ny4zCisxODUuMQorMTk1LjcKKzE3Ny44CisxNzguMworMTg5LjgKKzIwMC4xCisxNzYuOQorMTc3LjkKKzE4OC45CisxOTAuOQorMTk4LjcKKzE5Ny43CisxODYuOQorMTkwLjgKKzIwMS40CisxODguNQorMTgwLjQKKzE5Ni4yCisxODUuOAorMTk0LjkKKzE5My4zCisxODEuMworMTk1LjQKKzE5Ny41CisyMDEuMworMTc5LjUKKzE3Ny43CisyMDEuOQorMTk5LjkKKzE4My41CisxNzcuNgorMTkwLjQKKzE4My43CisxNzguNAorMjAzLjYKKzE5NS45CisxOTkuNQorMTkzLjIKKzE3NS4wCisxODQuNQorMTkwLjYKKzE5NC4zCisxNzguMgorMTc3LjUKKzE4OC40CisxNzkuNworMTgzLjgKKzE3NC4yCisxODYuNQorMTc5LjgKKzE5Ni45CisxOTQuOQorMTc4LjQKKzE4NS43CisxOTAuMQorMTgxLjMKKzE4MC4wCisxNzkuOQorMTgxLjcKKzE4Ny40CisxODUuOQorMTc4LjkKKzE4NC42CisxODkuNQorMTg2LjYKKzE4NS44CisxODguNAorMTg4LjMKKzE3NC43CisxODQuOQorMTkyLjUKKzE4NS4zCisxNzQuOQorMTgwLjYKKzE3OS41CisxODMuNAorMTc3LjcKKzE3Ny41CisxODcuNAorMTgzLjcKKzE4OC4wCisxNzcuNgorMTgwLjcKKzE4MC45CisxODEuOQorMTg4LjkKKzIwMS4xCisxODYuNgorMTc2LjMKKzE3Ny4zCisxNzcuNgorMTc1LjYKKzIwMS41CisxNzUuNQorMTg4LjIKKzE4MS44CisxNzYuOQorMTg1LjMKKzE3OS42CisxOTIuNworMjAzLjgKKzE4My40CisxNzkuNAorMTc3LjkKKzE4Mi44CisxODIuMworMTc0LjkKKzE4MC41CisxODAuMgorMTg3LjEKKzE5MC40CisxODUuNQorMTg0LjYKKzE4NS40CisxOTAuMworMTgzLjkKKzE4MC4wCisyMDEuOAorMTk4LjEKKzE4NC4yCisxOTIuOAorMTg0LjIKKzE5NS43CisxOTEuNAorMTg4LjgKKzE5Mi45CisxODQuOAorMTc0LjMKKzE5MS44CisxODUuNAorMTgzLjgKKzE5Mi43CisxOTIuNgorMTk0LjgKKzE3Ny45CisxNzguNworMTgxLjUKKzE3Ny4zCisxOTIuNQorMTc2LjAKKzE3OC45CisxOTkuNworMTgxLjAKKzE3OC44CisxNzcuMQorMTgzLjAKKzE3Ni43CisxODIuMworMTgwLjkKKzE4My4xCisxODMuOQorMTc0LjIKKzE3OC43CisxNzMuOAorMTc0LjQKKzE3OS4xCisxNzguNAorMTc1LjQKKzE4MS40CisxODAuOQorMTc4LjIKKzE4Mi41CisxODQuMgorMTgzLjcKKzE4Mi42CisxNzYuMgorMTc3LjIKKzE4MC41CisxODMuOQorMTkzLjQKKzE3NC45CisxNzguOAorMTc2LjAKKzE3OC4xCisxNzYuMQorMTc3LjMKKzE3OC43CisxODIuMgorMTkxLjAKKzE4Ni44CisxODguNAorMTgwLjMKKzE3Ny44CisxOTguOAorMTc2LjcKKzE5OC4zCisxNzguNQorMTc3LjkKKzE3OS45CisxODYuNworMTc4LjAKKzE3NS40CisxODYuNgorMTkwLjgKKzE5MC43CisxODMuNQorMTk2LjMKKzE4Mi4xCisxODQuNAorMTg4LjgKKzE4Ni4zCisxODQuOAorMTkxLjMKKzE4Ni4yCisxOTEuMAorMTg4LjMKKzE3OC44CisxNzYuMworMTgxLjIKKzE4My4xCisxODAuNAorMTc4LjYKKzE3Ni4yCisxNzYuMQorMTc3LjUKKzE4MC42CisxNzguMQorMTc2LjQKKzE5NS40CisxNzguOAorMTc5LjYKKzE3OC4xCisxNzkuNworMTc4LjMKKzE4MS45CisxNzcuNAorMTgxLjQKKzE4Ni43CisxNzQuNgorMTc5LjQKKzE3Ny41CisxOTcuNgorMTk2LjUKKzE5My4xCisxNzkuMgorMTgyLjIKKzE3OC4xCisxODYuMworMTgyLjEKKzE3NS40CisxNzcuNQorMTg4LjEKKzE4Mi45CisxNzkuOAorMTc5LjIKKzE4MC4wCisxNzYuOQorMTc3LjQKKzE5Mi41CisxNzcuNQorMTc3LjQKKzE4MS44CisxNzUuNgorMTc4LjkKKzE4MC42CisxNzYuOAorMTgyLjgKKzE4Ni43CisxODIuNQorMTg4LjMKKzE4My43CisxODUuMQorMTk1LjQKKzE3OS4yCisxODAuNworMTkwLjAKKzE4Ny41CisxODAuMworMTgzLjAKKzE4NC4yCisxODQuMworMTg5LjQKKzE4MC4xCisxNzkuNgorMTgyLjMKKzE3Ny42CisxODYuMworMTg4LjAKKzE4Mi4xCisxODcuMQorMTg2LjIKKzE4NC4yCisyMDIuMworMTg3LjAKKzE4OC4wCisxODAuNQorMTk0LjYKKzE4OC44CisxOTAuNworMTgxLjkKKzE4Mi4xCisxODUuMworMTgzLjEKKzE5Ny4zCisxOTUuMAorMjA4LjMKKzE5NS43CisxNzkuMQorMTk2LjMKKzE4NS41CisxODUuNAorMTg2LjkKKzE5My45CisxODcuMQorMTg0LjIKKzE4MC4wCisxODQuOAorMTg5LjYKKzE5Mi4zCisxODUuNgorMTg1LjgKKzE4NS45CisxODcuOQorMTg2LjIKKzE3Ny4zCisxOTIuMgorMjAxLjkKKzE4NS45CisxODEuNworMTkyLjgKKzE4NS40CisxODcuMworMTg3LjUKKzE3OC45CisxODcuNgorMTgxLjMKKzE4Ni45CisxNzkuNgorMTc5LjMKKzE4OS40CisxNzcuNQorMTg0LjUKKzE3Ni40CisxOTMuMworMTc4LjcKKzE5MS42CisxODIuNworMTk0LjYKKzE4Ny40CisxOTAuNAorMTk5LjEKKzE5MS42CisxOTMuMQorMTg3LjAKKzE4MS43CisxODAuMworMTk2LjYKKzE4MC41CisxODAuMAorMTg0LjkKKzE3Ni45CisxNzYuMworMTc5LjMKKzE4OS4xCisxODAuNAorMTc2LjAKKzE3NC45CisxODEuMgorMTc3LjYKKzE3Ny40CisxNzcuNgorMTc5LjAKKzE3OC43CisxNzguNworMTg0LjgKKzE3Ny45CisxNzkuNAorMTgzLjgKKzE4MS45CisxNzcuMQorMTc1LjgKKzE4Mi45CisxODMuMgorMTc2LjgKKzE4MS43CisxODMuNworMTkyLjEKKzE3OC4yCisxODEuNAorMTgwLjAKKzE3Ni44CisxNzkuOAorMTk0LjMKKzE4MS42CisxODAuNworMTc3LjUKKzE4Ny40CisxNzkuMAorMTgwLjAKKzE4Ni4wCisxODIuMAorMTc1LjQKKzE3OC45CisxODEuOQorMTkyLjAKKzE3OS41CisxNzguNQorMTc1LjMKKzE4NC4xCisxNzguMworMTc3LjEKKzE4Ni4yCisxOTYuOQorMTgyLjAKKzE3OC4wCisxODEuNAorMTgxLjQKKzE3OS42CisxODAuMgorMTgwLjQKKzE4My4xCisxNzYuNgorMTgyLjkKKzE3Ni4zCisxOTEuNQorMTc5LjkKKzE3OC4xCisxNzguNAorMTg5LjMKKzE5Ni44CisxODguMgorMTgwLjUKKzE4NS4yCisxODguMAorMTc2LjMKKzE4MS4wCisxODcuNAorMTc4LjkKKzE3OS4xCisxODUuMworMTgzLjQKKzE4NS44CisxNzguNQorMTc2LjEKKzE4OC45CisyMDAuOQorMTkzLjkKKzE5My40CisxODQuMAorMTg3LjIKKzE3OC4xCisxOTMuNQorMTgyLjAKKzE4MC4xCisxODIuOAorMTc2LjgKKzE3Ny4wCisxODQuMAorMTg1LjIKKzE5Ny4zCisxODAuOAorMTkwLjQKKzE3Ny4zCisxODMuNAorMTkxLjMKKzE3NS40CisxNzYuOAorMTkyLjMKKzE3Ny4zCisxOTEuMQorMTg1LjEKKzE3OS43CisxOTAuOAorMTc1LjkKKzE4MS4yCisxOTQuMAorMTc2LjUKKzE4MC4zCisxNzUuMQorMTg1LjEKKzE4MS4zCisyMDAuMAorMTg3LjAKKzE4Mi42CisxODIuMAorMTc2LjgKKzE5MC4xCisxODIuMQorMTgxLjcKKzE5Mi4zCisxNzcuMAorMTg1LjEKKzE4MS4zCisxNzkuMgorMTgyLjEKKzE3Ni42CisxODUuMAorMTc3LjQKKzE4My41CisxOTYuNQorMTg0LjIKKzE3OS4yCisxODAuNQorMTgwLjgKKzE4MS45CisxNzYuOQorMTc4LjYKKzE3NS45CisxOTIuMAorMTk4LjcKKzE4OS42CisxOTAuNQorMTg2LjMKKzE5Mi42CisxOTYuMAorMTc2LjIKKzE3NS45CisxNzYuNQorMTk1LjQKKzE3NC44CisxNzcuNAorMTg2LjcKKzE3NC45CisxNzYuMQorMTgzLjAKKzE3OC4xCisxNzcuNAorMTkyLjkKKzE3OS43CisxOTguNQorMTc4LjEKKzE3OC42CisxOTUuNAorMTgxLjYKKzE3OS45CisxNzkuNQorMTg2LjQKKzE4MC42CisxODAuMworMTg3LjMKKzE5My45CisxOTIuNQorMTc4LjEKKzE4NC44CisxOTQuOQorMTk0LjYKKzE4MS40CisxNzcuNgorMTgwLjQKKzE3NS41CisxODAuNQorMTc3LjIKKzE4Ni42CisxNzYuOAorMTc2LjMKKzE4Ni4wCisxNzkuOAorMTc4LjIKKzE3Ny45CisxNzguOQorMTkwLjEKKzE4MC44CisxODAuMQorMTgxLjMKKzE5My41CisxODUuMAorMTk4LjcKKzE5OS45CisxODMuNAorMTc3LjMKKzE3Ni4yCisxODIuNworMTc4LjIKKzE3NS4yCisxNzcuNworMTg2LjkKKzE4Mi4xCisxOTUuMQorMTgxLjMKKzE4Mi40CisxNzUuNworMTg1LjUKKzE4MC44CisxODEuNAorMTgxLjYKKzE5MC4xCisxODMuNworMTg2LjQKKzE5NC4zCisxNzYuNAorMTc2LjcKKzE4OS45CisxNzUuNgorMjA2LjYKKzE3OC45CisxODAuMAorMTc4LjgKKzE4MC4xCisxODQuMQorMTc2LjMKKzE3Ny45CisxOTQuMworMTg4LjUKKzE4Mi42CisxNzguNgorMTc3LjUKKzE5MC45CisxNzguOQorMTgwLjMKKzE5My45CisxODcuNAorMTg2LjQKKzE5MC4xCisxODQuNworMTk5LjIKKzE4Ny45CisxNzcuNworMTgwLjUKKzE4OS40CisxNzYuNQorMTkyLjgKKzE4MS40CisxNzguMAorMTkzLjYKKzE3NS44CisxODQuNAorMTg0LjEKKzE5MS45CisxNzYuMgorMTg0LjUKKzE4MC40CisxODUuMQorMTgwLjAKKzE5Mi42CisxODcuNgorMTkwLjIKKzE4My4wCisxNzYuNQorMTk0LjQKKzE3OC40CisxODQuNQorMTc2LjYKKzE3OS4wCisxODIuNgorMTg3LjIKKzE4MC40CisxODMuMworMTgwLjgKKzE3OS4xCisxOTMuOQorMTgxLjkKKzE4OC44CisxODAuMAorMTc1LjIKKzE5NC41CisxOTQuOAorMTg3LjcKKzE4Mi41CisxOTkuMworMTc1LjAKKzE3NS45CisxNzcuOQorMTc5LjYKKzE3OS40CisxNzYuMAorMTc2LjQKKzE3NS44CisxNzcuMgorMTc2LjgKKzE3OS4wCisxODAuNAorMTc3LjEKKzE3NC45CisxNzcuOQorMTgwLjYKKzE4Ny4zCisxNzYuNgorMTc3LjMKKzE4NC40CisxNzkuMgorMTc3LjIKKzE3NS43CisxODMuMworMTc3LjQKKzE4MC43CisxNzUuNgorMTczLjYKKzE3OS42CisxNzcuMgorMTgwLjgKKzE3Ni40CisxODcuNworMTc4LjQKKzE3Ni4wCisxOTIuNQorMTgxLjQKKzE4My41CisxNzguNQorMTg2LjYKKzE3OS40CisxODAuMQorMTgxLjYKKzE3OC4zCisxNzguMgorMTg0LjEKKzE4MC42CisxNzguMworMTg0LjEKKzE4MS42CisxNzcuNAorMTgzLjQKKzE4MC42CisxNzguOAorMTc5LjAKKzE3NS4xCisxNzcuMAorMTgwLjgKKzE3OS45CisxNzcuNworMTc2LjMKKzE3Ny4zCisxODQuMgorMTc2LjkKKzE5MC44CisxODMuMAorMTgxLjAKKzE4NC4wCisxNzguNgorMTc1LjIKKzE3Ny4yCisxNzcuOQorMTgzLjIKKzE4MC45CisxNzYuMworMTc3LjAKKzE4Mi44CisxNzguNQorMTc2LjkKKzE3OC4xCisxNzUuNQorMTg0LjcKKzE3Ni42CisxNzcuMgorMTgyLjQKKzE4OS41CisxOTcuMworMTc5LjkKKzE5MC40CisxODIuNAorMTg4LjcKKzE4NS41CisxODEuMQorMTgyLjYKKzE4Ny4wCisxODQuNAorMTc5LjEKKzE4MC4xCisxODAuOQorMTg3LjIKKzE3NS45CisxOTQuMQorMTc3LjkKKzE3Ny40CisyMDAuNworMjAxLjQKKzE4My41CisxODAuOAorMTk1LjUKKzE4MS4wCisxODAuMgorMTgxLjUKKzE3NS45CisxNzUuMworMTgwLjEKKzE4Mi4xCisxODAuMQorMTc2LjUKKzE3OC45CisyMDAuNQorMTc4LjYKKzE3Ni42CisxNzUuOAorMTc1LjgKKzE3Ni4wCisxOTkuMworMTc3LjUKKzE4MC45CisxODUuMQorMjAwLjMKKzE5NC4wCisxNzcuNworMTgxLjIKKzE4Mi4xCisxODUuMQorMTgzLjQKKzE4MC43CisxODguOAorMTg3LjMKKzE3OS4xCisxNzcuNQorMTg1LjUKKzE4NS41CisxNzcuMgorMTc1LjMKKzE3OC42CisxODQuNQorMTgwLjAKKzE3OS45CisxNzcuMQorMTc4LjAKKzE4Ny44CisxODMuNgorMTg5LjYKKzE4MS41CisxNzkuNworMTc5LjAKKzE4OC44CisxODUuMQorMTc3LjAKKzE3Ny4xCisxNzYuMworMTc2LjQKKzE5OS42CisxNzguMQorMTg4LjIKKzE3Ni45CisxOTEuNQorMTk0LjAKKzE4Mi42CisxODQuMAorMTg2LjQKKzE4NC4xCisxODAuMAorMTgxLjEKKzE4Ny4zCisxNzYuMQorMTc0LjUKKzE4OS4zCisxODguOQorMTc4LjcKKzE3Ny4yCisxOTEuMAorMTk0LjMKKzE4Ny43CisxNzcuMAorMTc2LjQKKzE4My4zCisxNzYuMgorMTgxLjMKKzE4MS4wCisxNzYuOAorMTg3LjgKKzE3OC4yCisyMDIuMworMTkxLjYKKzE4MC4zCisxNzQuOAorMTg3LjgKKzE3Ni45CisxNzYuOQorMTgxLjEKKzE3Ny41CisxODYuMQorMTc5LjMKKzE4Ny4yCisxNzYuNgorMTc4LjYKKzE3OC43CisxNzkuMAorMTg4LjcKKzE4OC41CisxODMuOAorMTkyLjIKKzE3OC44CisxODAuNAorMTgyLjEKKzE3Ny4wCisxNzUuMQorMTgwLjEKKzE3Ni43CisxNzYuMAorMTg4LjEKKzE5MS4zCisxODYuNgorMjAyLjAKKzE4Mi41CisxNzUuOQorMTgyLjEKKzE5NS42CisxNzQuOAorMTk0LjUKKzE4MS4yCisxOTEuOAorMTgwLjQKKzE3OC43CisxODYuMQorMTgwLjkKKzE4Ni40CisxNzcuMAorMTgzLjYKKzE3OS43CisyMDguMQorMTc5LjQKKzE3OS4xCisxNzguNQorMTc5LjIKKzE4MC43CisxODMuMworMTgwLjQKKzE4Ny42CisxNzYuOQorMTg1LjQKKzE4Ny41CisxODQuMworMTgzLjUKKzE4MS4wCisxOTAuOAorMTc4LjYKKzE4MC4wCisxODAuNAorMTkxLjAKKzE4Mi44CisxODYuOQorMTc5LjYKKzE4OS4xCisxODYuOQorMjAyLjMKKzE4MS4xCisxOTIuMQorMTk0LjMKKzE3Ni43CisxODUuOAorMTc3LjMKKzE3OS41CisxNzcuMgorMTc3LjgKKzE5MC41CisxOTAuMQorMTg0LjEKKzE5MS44CisxNzguNworMTg1LjkKKzE3OC4zCisxNzcuNAorMTc2LjQKKzE3Ny44CisxNzkuMAorMTc3LjYKKzE3OS43CisxNzguMQorMTkwLjUKKzE3Ny44CisxODAuNAorMTgxLjYKKzE4MS4zCisxNzcuMworMTgyLjEKKzE4OS43CisxNzguMgorMTc5LjcKKzE4MS4zCisxNzguOAorMTk0LjAKKzIwMC42CisxNzkuNgorMTc3LjkKKzE4MS4wCisxODQuNworMTgwLjgKKzE4MS4xCisxODcuOAorMTgzLjQKKzE4Ni4yCisxODEuOAorMTc1LjgKKzE3Ni44CisxNzYuMworMTc3LjAKKzE4Ni43CisxNzguNQorMTgzLjAKKzE3Ny4xCisxODIuMworMTgyLjIKKzE4MC42CisxODAuNgorMTg1LjIKKzE3OC45CisxOTIuMworMTc3LjYKKzIxMi4xCisxODAuNQorMTg2LjQKKzE4Ny40CisxOTYuNAorMTgxLjkKKzE5NC41CisxODguNQorMTc5LjQKKzE3OS4zCisxODEuNAorMTg1LjcKKzE3Ni45CisxODIuNgorMTg1LjAKKzE4MS43CisxNzguOQorMTg0LjQKKzE4MC40CisxODkuMgorMTg3LjUKKzIwNC42CisxODkuNworMTgyLjYKKzE4Mi4xCisxODAuMAorMTgyLjMKKzE4MC4xCisxODkuMworMTc4LjEKKzE4My44CisxODAuOQorMTg0LjgKKzE4Mi4yCisxNzcuNworMTc2LjEKKzE5Ny41CisxOTUuOAorMTgzLjMKKzE4My40CisxOTkuMAorMjA1LjQKKzE4My42CisxODIuNQorMTgyLjIKKzE5OS4xCisxODcuMQorMTc5LjUKKzE4Mi45CisxODAuMgorMTc3LjUKKzE4My40CisxODkuNAorMTk2LjIKKzE4MS4yCisxODMuMworMTc4LjYKKzE4MS41CisxODUuNQorMTc5LjgKKzE4NC4zCisxOTguOAorMTg0LjkKKzE3OC4wCisxNzcuNworMTgxLjAKKzE4Ni4wCisxOTYuMworMTc4LjEKKzE5Mi40CisxNzguNworMTgxLjQKKzE5Mi41CisxODEuNAorMTkyLjUKKzE4Mi4yCisxNzguOQorMTgzLjkKKzE4NS4zCisxOTIuMgorMTg2LjAKKzE5My40CisxNzguNAorMTk0LjUKKzE3OS45CisxODcuNgorMTg1LjkKKzE3OS4yCisxODUuMAorMTg4LjEKKzE4OS40CisxODcuOQorMTkwLjAKKzE5MS45CisxODcuNQorMTg2LjAKKzE4OS42CisxODIuNAorMTg1LjYKKzE4Ny4wCisxOTIuNAorMTgzLjMKKzE4OS4yCisxOTQuNgorMTk1LjkKKzE5MC43CisxODYuNAorMTg1LjkKKzE4NS4zCisxNzcuMQorMTg0LjYKKzE4Ni40CisxODMuMQorMTg2LjIKKzE4MC4wCisxODEuOAorMTg0LjcKKzE3Ni42CisxNzguMAorMTc4LjUKKzE4Mi4yCisyMDAuMworMTg0LjIKKzE4Ni45CisxNzguMgorMTkwLjMKKzE5NC45CisxOTMuMQorMTkzLjUKKzE4OC41CisxNzcuOQorMTg1LjQKKzE3Ny42CisxNzkuNworMTkzLjAKKzIwMC4zCisxODIuMAorMTkyLjMKKzE4My4zCisxODMuNgorMTgzLjIKKzE5MC44CisxODIuNgorMTc3LjcKKzE3Ny4xCisxODMuNworMTc3LjUKKzE3NS40CisxODAuMworMTgxLjMKKzE3OC44CisxODIuMworMTc2LjUKKzE3Ny40CisxNzYuMAorMTc4LjgKKzE4NC4zCisxODMuMAorMTgwLjIKKzE4NC45CisxODguMQorMTg3LjYKKzE4Mi44CisxODMuMAorMTgwLjAKKzE3Ny41CisxOTYuMQorMTg1LjEKKzE3NS41CisxNzUuOQorMTc4LjYKKzIwMS41CisxNzcuMQorMTkxLjcKKzE4NC44CisxNzYuMgorMTg0LjQKKzE3NS45CisxODIuNgorMTgyLjAKKzE4MC44CisxNzguNworMTkxLjMKKzE3OS41CisxNzguNworMTc0LjgKKzE4NS4xCisxNzQuOQorMTg5LjgKKzE5MS4zCisxOTEuOQorMTkwLjcKKzE3NS44CisxNzcuMworMTgzLjYKKzE3OC4wCisxODUuMQorMTc3LjIKKzE3OC42CisxODguNworMTc5LjAKKzE4Ni4wCisyMDIuNgorMTc3LjIKKzE3OS44CisxOTYuMAorMTk1LjgKKzE4Ni44CisxODMuNgorMjAyLjIKKzE4Mi4wCisxNzUuOAorMTg2LjYKKzE3OC4yCisxODEuMworMTgwLjgKKzE4My42CisxODEuOQorMTkyLjQKKzE5MC44CisxNzkuMgorMTg0LjYKKzE4Ni4yCisxODMuMAorMTk2LjUKKzE3OS42CisxODMuNAorMTg3LjIKKzE3OS41CisxODUuMworMTgyLjIKKzE3Ny44CisxNzYuNgorMTc3LjIKKzE3OS4zCisxNzcuMQorMTgxLjkKKzE3OC45CisxODAuMgorMTc5LjgKKzE3NS4wCisxNzYuOAorMTgwLjUKKzE3NS43CisxNzYuMworMTgwLjYKKzE4MS42CisxNzYuNgorMTc1LjQKKzE3Ny40CisxNzYuMgorMTgwLjgKKzE4OC4wCisxNzguMgorMjA1LjYKKzE3Ny44CisxNzYuNQorMTc5LjQKKzE3Ni40CisxODMuMworMTc3LjkKKzE3NC4yCisxNzYuMQorMTgyLjgKKzE4MC44CisxODYuOQorMTc5LjQKKzE5NS44CisxNzguOAorMTgxLjYKKzE5OS43CisxNzUuOAorMTg2LjcKKzE3OS4xCisxODIuNAorMTc5LjEKKzE3Ni4zCisxODAuNQorMTc0LjcKKzE4MC44CisxNzguMgorMTg1LjIKKzE4My4zCisxOTIuNworMTg0LjkKKzIwNS44CisxNzcuMAorMTgyLjUKKzE4Ny4zCisxODUuOQorMTg0LjMKKzE3Ny4wCisxOTMuMgorMTc5LjAKKzE3Ny41CisxODEuMworMTc2LjIKKzE3OC44CisxOTcuMworMTgwLjgKKzE4MC44CisxODkuNworMTg4LjMKKzE3OS41CisxNzkuMworMTg1LjMKKzE4NC44CisxOTIuMworMTgwLjQKKzE4Ni43CisxODAuMAorMTc4LjkKKzE3Ny45CisxNzkuNAorMTc3LjMKKzE4MS45CisxNzUuNAorMTc0LjEKKzE4MC4yCisxNzYuOQorMTc4LjYKKzE3Ny41CisxNzYuNAorMTc3LjcKKzE4MC42CisxODIuMgorMTc4LjAKKzE3OS4zCisxNzYuOQorMTg4LjYKKzE4MC40CisxNzkuOAorMTgwLjcKKzE3Ny4yCisxNzYuNworMTc1LjMKKzE3Ni40CisxNzguNAorMTc3LjgKKzE4MC4xCisxOTMuNQorMTgxLjAKKzE4My42CisxNzcuOQorMTgxLjkKKzE4Ni45CisxOTcuMworMTc1LjcKKzE3Ny42CisxODQuNworMTc5LjYKKzE4Mi4yCisxODEuOQorMTgxLjIKKzE3Ni43CisxODUuNQorMTk2LjgKKzE4NS45CisxODIuNAorMTc4LjEKKzE4MC4yCisxNzguMworMTgxLjcKKzE4Ni40CisxNzUuNgorMTgyLjYKKzE3OS42CisxODEuMAorMTg4LjAKKzE3OC4xCisxNzYuOQorMTgxLjAKKzE3OS42CisxODUuMAorMTc3LjcKKzE3OS40CisxNzguMAorMTg1LjcKKzE3OS4wCisxOTQuMgorMTc1LjQKKzE3OC41CisxNzUuMAorMTc2LjcKKzE3OS4zCisxODguOAorMTgxLjAKKzE3Ny4zCisxODguMAorMTc4LjUKKzE4MC4wCisxNzUuOQorMTgwLjcKKzE4MS4yCisxNzcuMAorMTc5LjIKKzE3OS4zCisxOTMuMQorMTc2LjAKKzE3OS40CisxODUuNAorMTc3LjQKKzE3Ny4yCisxNzcuOQorMTc2LjQKKzE4Ni43CisxNzguMAorMTc4LjcKKzE4MC41CisxODYuNworMTc2LjQKKzE4NS44CisxODIuNQorMTc3LjMKKzE4MC4zCisxNzkuNQorMTc0LjYKKzE4NC4yCisxODQuMAorMTc2LjMKKzE3Ni4wCisyMTEuNAorMTg0LjUKKzE4Mi4xCisxODAuNQorMTg4LjEKKzE3Ny45CisxNzkuNworMTc3LjUKKzE4NC41CisxODAuNgorMTkxLjEKKzE4Ny40CisxNzYuMworMTgwLjQKKzE4My4yCisxODQuOAorMTc4LjYKKzE4OS44CisxODAuOQorMTc2LjYKKzE3Ni45CisxNzYuNAorMTgyLjAKKzE3OC4yCisxNzcuMworMTg5LjkKKzE5MS4xCisxNzguMAorMTc5LjUKKzE3Ni43CisxOTQuMgorMjExLjcKKzE3NS45CisxNzcuOQorMTc2LjAKKzE3OS43CisxODAuNgorMTc2LjQKKzE4MC4zCisxNzcuMgorMTgzLjYKKzE4MC42CisxODcuNAorMTg5LjQKKzE4OS42CisxNzcuMQorMTc5LjQKKzE4NC4zCisxODYuNAorMTgxLjkKKzE4MC4xCisxODQuOAorMTgyLjAKKzE4OC4yCisxODEuNAorMTg0LjgKKzE3Ny41CisxODAuMworMTk1LjQKKzE4NS43CisxNzYuOAorMTc2LjAKKzE4Ny4zCisyMDIuMgorMTk0LjUKKzE4MS4xCisxODIuOQorMTk3LjYKKzE4Ni45CisxODEuMworMTgwLjkKKzE4My45CisxOTEuMAorMTgyLjUKKzE4Ni45CisxNzkuNworMTc5LjIKKzE4NS42CisxODQuMworMTgwLjQKKzE5MC45CisxODMuNgorMTgzLjEKKzE3NS4wCisxODAuOQorMTg2LjMKKzE3NC44CisxNzYuNAorMTc2LjEKKzE3NS43CisxNzguMQorMTc4LjAKKzE4MC41CisxODIuNgorMTgwLjAKKzE3OS4yCisxODYuOAorMTg4LjMKKzE3OS44CisxNzkuNgorMTgwLjUKKzE3Ni45CisyMDQuMgorMTk1LjIKKzE4MC4yCisxNzcuOQorMTg3LjkKKzE5MS4zCisxODMuOQorMTg1LjMKKzE4Ni44CisxODIuNQorMTg5LjUKKzE3Ni44CisxODAuNQorMTg5LjMKKzE4NS45CisxNzguMAorMTc2LjAKKzE3OS4yCisxODEuMworMTc1LjYKKzE3OS45CisxNzkuNAorMTgzLjgKKzE3OC44CisxNzcuOQorMTgwLjEKKzE4Mi4zCisxODAuOQorMTc1LjcKKzE3OC4xCisxNzMuNworMTc3LjkKKzE4MC4wCisxNzYuMgorMTc3LjcKKzE3OS40CisxOTIuMworMTc1LjcKKzE4NS43CisxODguNgorMTk1LjUKKzE4Mi41CisxODQuMQorMTc3LjkKKzE3Ny44CisxODMuMAorMTc0LjkKKzE3NC45CisxNzkuNworMTg2LjQKKzE4NS45CisxNzUuMgorMTc5LjIKKzE3Ni44CisxODEuNQorMTc4LjMKKzE4MC42CisxNzYuOAorMTc1LjgKKzE3NS45CisxODAuMworMTc5LjcKKzE3NS44CisxNzQuMQorMTgwLjYKKzE3Ni43CisxNzkuNworMTc1LjcKKzE3OS4yCisxNzguMworMjAzLjQKKzE3Ny45CisxODYuOQorMTc1LjcKKzE3Ny4wCisxNzguOAorMTgwLjIKKzE4MC4xCisxODUuNQorMTc1LjAKKzE3OC42CisxODMuMworMTc3LjIKKzE3OC4zCisxODAuMQorMTc1LjkKKzE3NS42CisxNzkuMworMTc5LjgKKzE3OC4wCisxODYuNQorMTc2LjQKKzE4Ny4yCisxODEuNgorMTc1LjQKKzE3Ny41CisxNzkuMQorMTc5LjIKKzE3NS45CisxNzQuMworMTc1LjUKKzE3Ny40CisxNzguNQorMTgyLjAKKzE4MS40CisxODQuNAorMTgzLjQKKzE3NC40CisxNzcuNQorMTc1LjAKKzE3NS40CisxNzQuMQorMTgyLjgKKzE4NC45CisxNzguMworMTgyLjkKKzE4Mi4zCisxODYuNgorMTgwLjkKKzE5MS42CisxODUuNgorMTg0LjgKKzE5MC4yCisxNzUuOAorMTg1LjIKKzE3NS41CisxNzYuOQorMTc2LjcKKzE3Ni45CisxNzYuNQorMTc5LjIKKzE3OS45CisxNzkuMgorMTc3LjgKKzE4OC45CisxODAuMworMTg2LjgKKzE4Mi4wCisxODAuOAorMTc2LjYKKzE4MC41CisxNzUuMworMTg1LjAKKzE4MS4xCisxODEuMQorMTc2LjUKKzE3Ni41CisxNzguMAorMTc1LjkKKzE4MC4yCisxNzguMworMTg4LjAKKzE4NS45CisxNzguNgorMTc5LjUKKzE4Ny42CisxODAuMgorMTgxLjMKKzE4Mi41CisxODIuOAorMTc1LjAKKzE4NC45CisxODEuNworMTc4LjUKKzE3Ny41CisxNzcuMQorMTc2LjgKKzE3OS4wCisxNzkuMgorMTc1LjUKKzE3Ny4xCisxNzguOQorMTc0LjgKKzE3OS4wCisxNzcuMworMTc5LjIKKzE3OC4yCisxNzcuNQorMTkxLjgKKzE3Ny42CisxODIuMQorMTc4LjcKKzE3Ny4yCisxODIuNQorMTgxLjUKKzE4NS42CisxNzkuNQorMTgzLjkKKzE3Ny42CisxNzkuNgorMTkzLjkKKzE3NS45CisyMTYuMAorMTgwLjQKKzE3Ny4zCisxNzguOAorMTc2LjcKKzE3Ny4zCisxNzguMworMTg4LjgKKzE3NS44CisxNzUuNworMTc2LjAKKzE3OC4zCisxODUuMQorMTc5LjAKKzE5MS4zCisxODAuMAorMTc4LjgKKzE4OS44CisxODIuNworMTc2LjcKKzE3OC4wCisxODQuMgorMTg1LjAKKzE5MC4zCisxNzguMAorMTc4LjcKKzE3Ny40CisxODYuMAorMTc2LjQKKzE3OS42CisxNzguMAorMTgyLjIKKzE3NS45CisxNzUuNworMTc4LjMKKzE3NC43CisxOTMuNgorMTc3LjIKKzE4Ni42CisxODMuNworMTgxLjAKKzE5Mi4xCisxNzYuNAorMTg4LjYKKzIwNS45CisxOTkuMAorMTk0LjYKKzE5My40CisxOTAuNAorMTc4LjEKKzE4OC4wCisxODMuOAorMTgwLjUKKzE4MC41CisxOTAuNQorMTk0LjUKKzE4MC44CisxODUuMworMTkzLjQKKzE4My4xCisxNzguMQorMTk3LjQKKzE5MC4yCisxODEuMAorMTg0LjkKKzE4OS4wCisxODQuNgorMTgzLjcKKzE4Ny43CisxODcuOQorMTgyLjUKKzE5Mi42CisxODQuMworMTc4LjcKKzE3OS44CisxOTYuOAorMTg0LjQKKzE5NS41CisxODMuOQorMTg2LjYKKzE4MS4wCisxODguNworMTg1LjAKKzE5Ny4xCisyMDQuMgorMTc2LjgKKzE3OS42CisxODUuMworMTgyLjEKKzE3OC42CisxODAuNgorMTgzLjAKKzE5OS4xCisxODAuNQorMTgwLjcKKzE4OS4yCisxOTQuNQorMTg3LjEKKzE5Mi4zCisxNzkuMworMTk2LjgKKzE5Ny4zCisxODAuMworMTc3LjAKKzE3OC44CisxODMuMgorMTgzLjEKKzE3Ni42CisyMDEuNgorMTgzLjgKKzE4Mi43CisxNzcuMAorMTg1LjIKKzE4MC4xCisxOTkuNAorMjAzLjIKKzE4Ny40CisxODUuNworMTg0LjEKKzE4My4wCisxOTguNworMTg2LjMKKzE4Ny45CisxOTkuNAorMTg1LjkKKzE5MC4zCisyMDIuOAorMjA0LjYKKzE3OC4xCisxODcuNgorMTk2LjUKKzE4MC4zCisxODEuNworMTgyLjkKKzE5OS4yCisxOTguOAorMTkwLjUKKzIxOS42CisxODAuMAorMjAzLjUKKzE4Mi4wCisxODQuMQorMTc2LjgKKzIwMC45CisyMDEuOQorMTgwLjkKKzE3Ny45CisxODMuNAorMTc5LjUKKzE5Ny44CisxODguMAorMjA0LjEKKzE4NS42CisxNzkuMworMTkwLjYKKzE4NC4zCisxOTUuMgorMTg4LjAKKzIwMC45CisxODcuNworMTgzLjAKKzE4MC45CisxODAuMAorMTg0LjcKKzE3Ni44CisxODEuOQorMTgwLjYKKzE4MC4wCisxNzcuNworMTgyLjIKKzE3NS4yCisxODIuOQorMTg2LjMKKzIwMy40CisxODMuMworMTc1LjgKKzE4Ni4yCisxNzkuOAorMTc4LjQKKzE3OC4yCis0MjAuMQorMTc3LjkKKzE5My44CisxODMuOAorMTgwLjAKKzE4OC44CisxODcuMgorMTkyLjAKKzE4MC44CisxODIuMworMTkxLjgKKzE4My4yCisxNzYuNgorMTc5LjUKKzIxNS4yCisxOTMuOAorMTg4LjMKKzE4MC4zCisxODYuNAorMTgxLjgKKzIwNS44CisxNzUuMQorMTg2LjUKKzIwNS45CisxODUuNQorMTg3LjEKKzE5MS43CisxODkuNAorMTg4LjMKKzE4MC4xCisxNzkuOAorMTc4LjkKKzE3OS4zCisxODEuOQorMTg0LjkKKzE4OC40CisxNzYuMgorMTc3LjAKKzE4MS44CisxNzkuNQorMTc3LjMKKzE3Ni4wCisyMDguMworMTg1LjYKKzE4MC42CisxODAuMworMTk1LjAKKzE3Ny43CisxNzUuNworMjE0LjMKKzE4OC4yCisxNzcuNworMTg3LjEKKzE5Ny4xCisxODQuOAorMTc4LjIKKzE4Mi4xCisxNzguNAorMTc2LjMKKzE5MC42CisxODcuMworMTc3LjgKKzE3Ny4yCisxOTEuNworMjAwLjIKKzE4OC40CisxNzcuMworMTc3LjAKKzE3OC41CisxODAuMworMTc3LjAKKzE4Mi4yCisxODQuNAorMTc1LjgKKzE4NS42CisxNzkuNgorMTgwLjgKKzE3OS45CisxOTkuNAorMTc1LjEKKzE5Ni4zCisxODUuNQorMTgyLjUKKzE3OS40CisxOTEuMgorMTkyLjQKKzE4MC4zCisxODYuOAorMTk0LjcKKzE4MC41CisxNzguMAorMTgwLjgKKzE4NC45CisxODAuNworMTc5LjAKKzE4NC41CisxODAuNQorMTc2LjIKKzE4Mi45CisxNzguOAorMTgzLjUKKzE5NC42CisxODIuMAorMTk4LjUKKzE3Ni41CisxODUuMAorMTg3LjYKKzE5Ni45CisxOTQuMgorMTg1LjAKKzE5MC44CisxNzkuNgorMTc1LjgKKzE5OC41CisxODAuMAorMTc3LjkKKzIwMy4zCisxODMuMworMTgxLjQKKzE4My44CisxNzYuNQorMTc1LjEKKzE5My45CisxNzguOQorMTgzLjAKKzE4MC4yCisxNzguMAorMTc4LjkKKzE4OC4xCisxODEuMworMTc5LjMKKzE4MS42CisxODMuMQorMTc1LjAKKzE3OC44CisxNzUuNworMTc5LjQKKzE4MC42CisxODUuOQorMTc2LjcKKzE5MC44CisxODkuNgorMTgwLjEKKzE3Ni43CisxODEuNworMTgwLjcKKzE5MS45CisxNzUuNQorMTgwLjEKKzE4NS4xCisxODIuMAorMTgxLjAKKzE4NC4zCisxOTYuNgorMTg4LjgKKzE5MS4wCisxODQuMgorMTg0LjEKKzE4MC4xCisxODkuMAorMTc4LjIKKzE4Mi42CisxOTAuNAorMTgyLjUKKzE4Ni4zCisxODIuOQorMTkxLjUKKzE4My42CisxOTMuMgorMTgzLjMKKzIwMS40CisyMTUuNQorMTgyLjQKKzE5Ni42CisxODMuNgorMTkwLjcKKzE4MC44CisxOTAuOQorMTc4LjIKKzE4OS44CisxOTQuOAorMTgwLjkKKzE4NC4yCisxODQuMQorMTg1LjMKKzE3Ni43CisxODEuNQorMTgxLjAKKzE5MS4xCisxOTUuOQorMTkyLjAKKzE3OC4wCisxNzkuOQorMTg0LjcKKzE4MS4zCisxODguNQorMTg3LjYKKzE4NC43CisxOTMuOQorMTk4LjUKKzE4OC41CisxODYuNQorMTg0LjQKKzE4OC4xCisxODMuMAorMTkwLjgKKzE4NC45CisxODMuOAorMTg0LjUKKzE4NS41CisxODAuMgorMTgxLjMKKzE4MS44CisxNzcuNQorMTc4LjYKKzIwNS44CisxODguNQorMTg4LjEKKzE4My45CisxODIuOQorMTkyLjAKKzE4MS45CisxODEuNQorMTkwLjIKKzE4NS4yCisxODguMQorMTc0LjMKKzE5MC4xCisxODUuNgorMTgzLjMKKzE4Mi4xCisxOTIuMgorMTc5LjYKKzE3OS43CisxODcuNQorMTg3LjMKKzE4Ny4xCisxODAuMAorMTg0LjIKKzE4MC42CiszMTEuNworMTg1LjkKKzE4NS45CisxODUuMQorMTc2LjgKKzE3Ni40CisxNzcuNworMTc3LjEKKzE4OC4yCisxNzQuOAorMTg0LjAKKzE3OC42CisxODAuMgorMTgzLjQKKzE4Mi45CisxODkuOAorMTg3LjMKKzE3Ni44CisxOTIuNQorMTg2LjEKKzIxMi4xCisxNzkuNAorMTgxLjMKKzE4OC40CisxNzcuNworMjAwLjQKKzE4Mi43CisxNzcuNQorMTgzLjUKKzE4Ny41CisxODIuNgorMTk0LjAKKzE3OS42CisxODEuNgorMjAxLjYKKzE4My4wCisxODUuNQorMTc3LjgKKzIwMC4xCisxODIuNworMTgyLjEKKzE5Mi41CisxODUuNgorMTg4LjgKKzE4MC44CisxNzkuNQorMTgxLjEKKzE4NS4xCisxNzguMQorMTc4LjkKKzE4My4xCisxODAuOAorMTc4LjcKKzE4NC44CisxODAuMQorMTc5LjcKKzE4Ny4yCisxODcuMQorMTgyLjUKKzE4Ny4wCisxODUuNgorMTkxLjkKKzE4Ny43CisxODYuMworMTg4LjAKKzE4MC4xCisxNzkuMworMTgxLjMKKzE5My43CisxNzYuOAorMTg0LjQKKzE3Ni43CisxODMuMQorMTg5LjQKKzE3OC44CisyMTEuNAorMTgyLjIKKzE5MC44CisxOTQuMQorMTc5LjQKKzE3Ni4zCisxNzguNgorMTc1LjUKKzE4Mi45CisxODYuMAorMTg0LjEKKzE4Ny44CisxODEuMworMTg4LjQKKzE3OC4zCisxNzguNworMjAwLjQKKzE3Ni4wCisxODcuNworMTk3LjIKKzE4OC4yCisxODguNgorMTkyLjMKKzE4MC4zCisxODYuMworMTg3LjYKKzIwMS41CisxODMuOAorMTgyLjkKKzE4NS44CisxODUuOQorMTgxLjkKKzE4MC4yCisxNzcuMworMTgzLjMKKzE4Ni40CisxODEuMworMTk1LjQKKzE5NC4wCisxODIuNworMTc4LjMKKzE5MC41CisxNzguNgorMTk0LjUKKzE3NS40CisxNzYuOAorMTc3LjQKKzE5MS4xCisxODAuNgorMTc1LjUKKzE3NS4yCisxODYuOQorMTc2LjEKKzE4My42CisxODcuMQorMTc4LjQKKzE5Ni4wCisyMDEuMAorMTgzLjAKKzE3OS43CisxNzkuOQorMTg0LjEKKzE3OS45CisxOTMuMQorMTgwLjgKKzE4Ny4yCisxODIuMAorMTc2LjEKKzE4My40CisxODguNAorMTc3LjYKKzE3Ny4zCisxODMuOAorMTc5LjUKKzE4NC40CisxNzkuOAorMTgxLjUKKzE3OC42CisxODYuNQorMTgzLjEKKzE3NS43CisxNzcuMworMTc3LjUKKzE5NC4zCisxOTAuOQorMTc1LjQKKzE5OC4yCisxODIuNgorMTgwLjkKKzE4Mi43CisxNzcuMAorMTkwLjQKKzE4Ni44CisxOTkuNAorMTgzLjYKKzE4MC40CisxOTYuMworMjA1LjAKKzE3OC4wCisxODIuMAorMTg1LjAKKzE4MC4wCisyMDAuNgorMTg1LjQKKzE4Ni42CisxODguNAorMTk5LjEKKzE4My4zCisyMTEuOAorMTgyLjIKKzE4Ni4wCisxODYuNQorMTg1LjQKKzE4My44CisxODIuMworMTc5LjkKKzE4Mi4wCisxODYuOQorMTg0LjYKKzE4Ny45CisxODIuNAorMTg3LjMKKzE5OS42CisxODcuOQorMTk2LjYKKzE4OS45CisxOTAuOQorMTgwLjkKKzE3Ny41CisxODAuMgorMTg4LjQKKzE4MS40CisxNzguMAorMTkwLjgKKzE5OC43CisxOTEuNQorMTg5LjgKKzE5MS40CisxODguNgorMTg2LjIKKzE5OC44CisyMDcuNAorMTkyLjIKKzE4NS4wCisxOTQuNworMTk4LjcKKzE5MS40CisxOTcuNAorMTg0LjkKKzIwMi41CisxNzguNgorMTgwLjMKKzE4Ni45CisxODQuNQorMTc4LjMKKzE3OS40CisyMDEuMworMTkzLjUKKzE4NC4yCisxOTMuOQorMTc3LjEKKzE4NS44CisxODguNQorMTgzLjYKKzIwMS4wCisxODMuNgorMTkwLjkKKzE5MC4zCisxODUuNAorMTgwLjIKKzE4NS45CisxODIuNgorMTg0LjcKKzE4Mi4xCisxODguNworMTgwLjUKKzE3OC4wCisxOTguNgorMTg4LjgKKzE4My44CisxNzguMQorMTc2LjQKKzE3OS40CisxNzkuNQorMTg2LjUKKzE4MC40CisxNzkuOAorMTgwLjIKKzE5NS4wCisxNzcuMgorMTgwLjAKKzE5NS41CisxODEuNworMTgzLjYKKzE4Ny4xCisxODAuNworMTgwLjcKKzE4MS4yCisxODQuNQorMTgxLjAKKzE5OS4xCisxOTcuNAorMTgzLjYKKzE4OS4wCisxODMuMgorMTk2LjQKKzE4My43CisxOTEuNAorMTg1LjMKKzIwMi44CisxNzcuOQorMTgyLjEKKzE3OS41CisxNzYuMworMTkzLjEKKzE4NC42CisxNzguOAorMTkxLjgKKzIyNC44CisxODAuNQorMTgyLjAKKzE3OC44CisxNzguMgorMTc4LjgKKzE4NS40CisxODYuNQorMTc4LjYKKzE4OC40CisxNzkuNworMTkwLjkKKzE4MS42CisxNzkuOAorMTkwLjEKKzE4OC4wCisxNzkuNworMjA0LjgKKzE4NC44CisxNzkuNworMTgyLjUKKzE4NC4xCisxNzYuMQorMTgxLjEKKzE3Ny4yCisxODUuOAorMTc3LjcKKzE3OS4xCisxODYuNworMTgzLjgKKzE3Ny41CisxODAuMgorMjAwLjkKKzE4MS4wCisxODIuNworMTc3LjcKKzE5MS43CisxNzYuOAorMTkwLjkKKzE3OC42CisxODIuMworMTc4LjgKKzE4Ni4xCisxNzYuOAorMTgwLjAKKzE4Mi41CisxNzUuMAorMTgzLjIKKzE3Ny40CisxODkuNQorMTc3LjcKKzE3OS4xCisxODAuOAorMTc3LjkKKzE4MC4wCisxODEuNgorMTc4LjYKKzE3OC4xCisxODQuNworMTc2LjgKKzE3Ni4wCisxNzUuNworMTc1LjkKKzE4MC4zCisxNzYuMworMTgwLjQKKzE3OC44CisxODIuNQorMTc3LjkKKzE4Ny43CisxODIuMgorMTg3LjIKKzE3OC41CisxNzkuOQorMTgxLjEKKzE4MC45CisxODIuNQorMTc5LjgKKzE3OC42CisxNzYuMAorMTc5LjAKKzE4OS41CisxODMuNQorMTgyLjUKKzE4My42CisxODYuMAorMTgxLjcKKzE5MS4xCisxODcuNAorMTk0LjAKKzE5Ny4yCisxOTcuMworMTc3LjkKKzE3OS40CisxNzguMAorMTc2LjkKKzE3OC42CisxODkuMAorMTgzLjMKKzE4OC41CisxODQuMAorMTg0LjAKKzE4NS41CisxODAuNworMTc2LjMKKzE4MC4yCisxNzkuOQorMTg2LjcKKzE3Ny41CisxODEuMAorMTg5LjMKKzE5MC4zCisxNzguMworMTg4LjEKKzE4OS41CisxODMuNgorMTkwLjcKKzE3OC45CisxNzkuMQorMTc5LjUKKzE5Ni4xCisxODAuOAorMTc4LjkKKzE3Ny45CisxODQuNgorMTc4LjAKKzE4MS45CisxODUuMworMTg3LjUKKzE4My45CisxODcuMAorMTgwLjEKKzE5OC45CisxODIuNgorMTgxLjEKKzE5MS4xCisxOTAuNworMTgzLjYKKzE4MS4yCisxODQuNQorMTc3LjMKKzE3OS41CisxNzguNworMTgxLjUKKzE4MC4xCisxODUuMAorMTc4LjYKKzE4Mi44CisxODIuNworMTkyLjYKKzE4MS41CisxNzYuNQorMTc4LjQKKzE4Ny4wCisxODAuMgorMTg3LjUKKzE4Mi41CisxNzguMAorMTg0LjYKKzE4MC4zCisxODcuMgorMTc3LjYKKzE4Ny41CisxOTAuNgorMTg4LjIKKzE4Ny44CisxODIuNgorMTg2LjgKKzE3OS4wCisyMTEuMAorMTc2LjIKKzE4MC41CisxODMuNAorMjE1LjMKKzE4MS42CisyMDguMgorMjE1LjYKKzIwNy44CisxODkuMQorMTc2LjUKKzE5MC45CisxODcuMAorMTc4LjgKKzE5MC4yCisxODMuMAorMTkzLjYKKzE3NS4zCisxODQuNAorMTg0LjIKKzE4MS43CisxNzUuNAorMTc3LjQKKzE3Ni4xCisxODcuMQorMTk0LjEKKzE4MS4zCisxOTMuMQorMTgyLjEKKzE4NC43CisxODMuMQorMTg2LjAKKzE4MC42CisxODEuNworMTgxLjcKKzE4NC45CisxOTEuNAorMjAxLjEKKzE4MS43CisxOTIuOQorMTc3LjYKKzE4Ny42CisxNzcuNgorMTgzLjYKKzE5NS40CisxODcuMgorMTg0LjIKKzE4NS40CisxNzguMAorMjAxLjAKKzE4MC4wCisyMDUuOQorMjAxLjkKKzE5OS4yCisxODUuMgorMTgyLjcKKzE4MS4wCisxODcuNAorMTgxLjUKKzE4Ni42CisxODAuNAorMTc2LjcKKzE3Ny45CisxNzguMgorMTc5LjMKKzE4Ni41CisxNzUuNworMTg1LjUKKzE5NS4xCisxODEuOQorMTgzLjMKKzE4Mi4wCisxNzYuNworMTgxLjAKKzE3Ni4xCisxNzkuNAorMTg2LjIKKzE5NC4xCisxOTEuMQorMTg0LjAKKzE4NS4xCisxODguNgorMTgzLjIKKzE3Ni4xCisxNzkuMworMTgzLjYKKzE3Ny41CisxOTIuNworMTgwLjYKKzE5MS4zCisxODIuNgorMTg5LjMKKzE4My42CisxODIuNAorMTc4LjgKKzE3NS41CisxNzkuMworMTkzLjIKKzE4MS4zCisxODMuOQorMTg1LjEKKzE4My4zCisxODQuOQorMTg4LjYKKzE4NS43CisxOTQuOQorMTk5LjUKKzE3NS43CisyMDIuNgorMTk0LjIKKzE4NS4zCisxNzguMAorMTgyLjUKKzIwMi4zCisxODcuNQorMTkyLjkKKzE4MS44CisxODMuMgorMTgzLjUKKzE4Ny44CisxNzkuNgorMTc4LjcKKzE5Ny4xCisxODIuMgorMjAyLjIKKzE5NC44CisxODQuOQorMTkyLjYKKzE3NS41CisxNzguMAorMTg0LjcKKzE3Ny44CisxNzguNworMTc5LjcKKzE4MS40CisxODYuNgorMTc5LjMKKzE3OC45CisxODIuMworMTgwLjgKKzE4MC41CisxODIuNAorMTg0LjAKKzE4My4yCisxODEuMgorMTgzLjYKKzE4Ni4yCisxNzkuNworMTc4LjYKKzIwMC4yCisxODkuMgorMTc3LjUKKzE4OC4wCisxOTEuMQorMTgzLjIKKzE4My40CisxOTEuMAorMTg2LjkKKzE5OC45CisxODAuMAorMTc1LjMKKzI2MS4wCisxNzguNworMTgxLjEKKzE4MS4yCisxNzguNworMTc5LjEKKzIwMS42CisxNzguNAorMTgxLjYKKzE3Ni4yCisxODEuNworMTkyLjIKKzE4NC41CisxNzkuMQorMTkxLjgKKzE4MS4zCisxODQuNAorMTg1LjAKKzE4Ni42CisxNzguNgorMTgwLjIKKzE4NS4yCisxOTAuMAorMTc3LjMKKzE3OC41CisxOTMuNworMTc4LjcKKzE4NC44CisxNzkuOQorMTkyLjAKKzE4Ni4yCisxOTQuNworMTgxLjUKKzE4My45CisxODguMAorMTgzLjQKKzE4MS4zCisxODcuMgorMTg0LjYKKzE4OC43CisxODUuMworMTgwLjEKKzE4My40CisxODIuNAorMTc2LjkKKzE3Ny42CisxOTEuMQorMTgwLjgKKzE3Ni4wCisxNzUuNAorMTgwLjAKKzE3OS42CisxODguMworMTkxLjMKKzE4My4yCisxODEuNworMTc3LjkKKzE4MC4wCisxODIuMAorMTgxLjMKKzE4MC4xCisxODcuNworMTc3LjUKKzE4Ni43CisxODMuNAorMTg5LjEKKzE5OS45CisyMDMuOQorMTg0LjEKKzE3OS4yCisxODcuNAorMTg1LjcKKzE4MS44CisxNzkuNworMTc5LjEKKzE3NS42CisyMDAuOAorMTgxLjIKKzE3NS45CisxNzkuMworMTc2LjkKKzE4My44CisxOTUuNworMTg1LjYKKzE4MS45CisxODQuMAorMTkwLjEKKzE4OC42CisxNzkuMAorMTgxLjcKKzE3OS4yCisyMTIuOQorMTgxLjMKKzE5Mi44CisxODAuOAorMTgwLjQKKzE5MC44CisxNzguMQorMTgxLjIKKzE4My40CisxODkuNAorMTkxLjYKKzE5Ni43CisxNzkuMgorMjAzLjUKKzE5Ny40CisxODAuNQorMTg0LjIKKzE5NC45CisxODIuNgorMTgzLjMKKzE3Ny45CisyMDAuNAorMTkxLjkKKzE3NS40CisyMTQuMworMTg0LjEKKzE4MC44CisxODIuOQorMTgxLjMKKzE4Mi40CisxODEuNAorMTkxLjAKKzE3OC45CisxODguMworMTk1LjYKKzE4Mi4xCisxOTMuNQorMTgwLjMKKzE5Ni4zCisxNzcuOQorMTk4LjgKKzE5MC45CisxNzkuMQorMTg1LjQKKzE4OC43CisxODEuMAorMTc3LjgKKzE3OC4wCisyMDMuNAorMTc5LjQKKzE4MC44CisxODMuNgorMTc5LjAKKzE4NC44CisxNzguMAorMTg4LjMKKzIwMy4xCisxOTQuOQorMTk2LjgKKzE4Ny45CisxODUuNworMTc4LjAKKzE4MC44CisxNzYuOAorMTgxLjAKKzE4MC45CisxODcuMAorMTc5LjUKKzE4Ni45CisxNzUuOQorMTc0LjcKKzE3Ny4xCisxODcuOQorMTkzLjIKKzE3Ny4zCisxNzcuOQorMTgxLjIKKzE4MC4xCisxNzYuMQorMTc5LjQKKzE3Ni43CisxODMuMgorMTkxLjgKKzE4NC43CisxODAuOAorMTgzLjIKKzE3Ni45CisxODIuOAorMTg3LjUKKzE4Ny4zCisxODUuNworMTg0LjYKKzE3OC44CisxODMuMAorMTc2LjcKKzE3Ny42CisxOTguMAorMTk0LjcKKzE4OC44CisxODAuOQorMTg3LjkKKzE3NS45CisxOTMuMQorMTgzLjQKKzE4Ni4yCisxODQuNAorMTgyLjMKKzE3NS42CisyMjQuMworMTg2LjAKKzE4NC4wCisxNzkuMAorMTc2LjYKKzE4My45CisxOTAuOQorMTg4LjUKKzE4My45CisxODQuNworMTk4LjYKKzE4NC4xCisxODIuMAorMTgxLjMKKzE4My4zCisxODEuNgorMTgyLjgKKzE4Ni42CisxODEuNAorMTc5LjAKKzE5Mi4wCisxODYuMworMjAyLjgKKzE5MC4wCisxODIuMQorMTg2LjQKKzE4Ni4wCisxODcuMAorMTkyLjgKKzE4NS40CisxODUuNAorMTgxLjIKKzE4Mi4zCisxODMuMgorMTkwLjQKKzE4NC45CisxODYuNAorMTgwLjkKKzE4MS40CisxNzkuOAorMTkxLjMKKzE4Mi40CisxOTMuMAorMjAyLjEKKzE4Ny45CisyMjIuMAorMTk2LjkKKzIwMS45CisxOTcuOAorMTk4LjcKKzE4NC4xCisxOTIuNworMjAzLjIKKzE5Ny4xCisxOTMuNworMTk2LjUKKzE4Ni4zCisxOTguNAorMTgxLjIKKzE5Mi4zCisxOTAuNAorMTgzLjMKKzE4MS45CisyMDEuOAorMTk4LjUKKzE5NC43CisxODIuMworMTg0LjkKKzE4Ni4wCisxODUuOQorMTkwLjgKKzE3OS40CisxODIuMgorMTgxLjcKKzE4MC42CisxNzkuMgorMTgwLjkKKzE4OS43CisxOTUuNworMjAwLjcKKzE5MS42CisxOTEuMQorMTg3LjYKKzE4MS42CisxODUuOQorMTg4LjMKKzE4My41CisxODcuNworMTkwLjMKKzE4Ni4xCisxODEuMQorMTc4LjcKKzE3OC4wCisxNzkuMAorMTkxLjUKKzE4Ni44CisxODQuOQorMTgxLjAKKzE4My40CisxODEuMworMTgwLjEKKzE4OC4yCisyMDQuMworMTgwLjEKKzE4NS44CisxODQuOQorMTg3LjQKKzE3Ni4wCisxODQuMgorMTc3LjYKKzE3OS4wCisxNzguOQorMTg4LjMKKzE3OS44CisxODAuOQorMTc3LjUKKzE4OC45CisxOTEuMQorMTg0LjcKKzE4OS41CisxNzguNAorMTg5LjMKKzE4NC43CisxODYuMgorMTc4LjkKKzE3Ni42CisxODAuOAorMTc3LjMKKzE4My4zCisxODAuMAorMTg4LjgKKzE4Ni44CisxNzkuNQorMTc5LjYKKzE4MS42CisxNzcuNAorMTc2LjUKKzE3OC4wCisxODIuNgorMTg0LjcKKzE4OS4zCisxODMuNgorMTgwLjYKKzE4Ni42CisxODAuNworMTg1LjYKKzE3OC4yCisxNzYuMworMTgxLjIKKzE3Ny42CisxNzUuNworMTc3LjMKKzE4NC4wCisxNzguMgorMTgyLjkKKzIwMS42CisxNzUuMAorMTc5LjMKKzE4MS42CisxNzYuMgorMTgwLjQKKzE3Ni4wCisxODMuNworMTc3LjUKKzE4My41CisxOTMuNQorMTkyLjcKKzE3OS4wCisxODIuMgorMTc5LjYKKzE3OS4zCisxNzYuOAorMTc3LjkKKzE3Ny4yCisxNzYuNQorMTc3LjQKKzE3Ny45CisxODYuNQorMTc4LjkKKzE4MS4wCisxNzguMAorMTc2LjYKKzE3Ni41CisxNzkuMgorMTg3LjIKKzE3OC4yCisxODQuNgorMTc4LjkKKzE3Ny44CisxODIuMQorMTg3LjIKKzE4OC44CisxODQuNQorMTgxLjAKKzE4OC40CisxOTMuMQorMTc4LjcKKzE4Ni4yCisxODEuMQorMTgzLjIKKzE4MS40CisxNzcuNgorMTc2LjcKKzE3Ny4xCisxNzkuMAorMTgxLjAKKzE3Ny45CisxODMuNQorMTgxLjYKKzE3OC45CisxNzkuNAorMTc1LjgKKzE3NS42CisxNzkuMAorMTgwLjEKKzE3NS45CisxNzkuOQorMTc4LjEKKzE4Ni4wCisyMDguMAorMTc4LjYKKzE4Mi43CisxODYuMworMTc0LjUKKzE3OC42CisxODQuMworMTg1LjQKKzE3OC4zCisxNzguNQorMTkwLjUKKzE4MC44CisxODguMgorMTc3LjMKKzE5MC4xCisxNzUuNQorMTg4LjUKKzE4NS40CisxNzkuNgorMTgxLjQKKzE3Ny40CisyMTcuNQorMTk2LjkKKzE4MC44CisxNzkuOQorMTkyLjUKKzE3OC4wCisxNzguNAorMTc1LjgKKzE3NS4zCisxODQuOAorMTk3LjIKKzE4Ni4wCisxNzYuOQorMTc2LjUKKzE3OC40CisxODAuOAorMTg1LjUKKzIwMy41CisxODMuMworMTgwLjAKKzE3Ny42CisxODEuMgorMTgwLjIKKzE3OS43CisxOTQuNAorMTgwLjgKKzE4MS4zCisxNzYuOQorMTg3LjIKKzE3OC41CisxNzguNworMTg1LjQKKzE4My4wCisxODEuMworMjYxLjcKKzE3OC4xCisxNzUuOQorMTc1LjkKKzE4OS44CisxODUuOQorMTg0LjEKKzE4MS43CisxODIuNworMTc3LjYKKzE3Ni42CisxODMuNgorMTc4LjQKKzE3OC41CisxODUuOAorMTg0LjUKKzE3OC41CisxNzguMAorMTgxLjcKKzE3Ny40CisxNzkuMworMTc3LjUKKzE3NS43CisxNzYuNgorMTc2LjQKKzE4MC44CisxODQuOQorMTc3LjYKKzE3OC4wCisxNzguNworMTc4LjAKKzE3Ny44CisxNzYuNworMTgzLjYKKzE5Ni40CisxODIuNAorMTgyLjIKKzE3OC4wCisxNzUuOQorMTc5LjIKKzE3NS42CisxNzguMworMTc2LjIKKzE3OC44CisxODMuMQorMTc1LjIKKzE4Mi40CisxODAuNgorMTc3LjYKKzE3Ni42CisxODAuMgorMTgwLjQKKzE4MS4xCisxNzYuMgorMTg4LjcKKzE4Ny4yCisxODEuNgorMTgxLjUKKzE3Ny4yCisxNzYuOQorMTc3LjQKKzE3Ni4zCisxODUuMgorMTc4LjMKKzE4NC42CisxNzguMworMTg5LjcKKzE3OS41CisyMDEuMQorMTc2LjIKKzE4NS41CisxODIuMgorMTgzLjQKKzE3NC41CisxNzYuOAorMTgwLjEKKzE3OS44CisxODIuMgorMTc4LjgKKzE4Ni41CisxODguMgorMTgwLjQKKzE4Mi4xCisxODIuOAorMTk0LjcKKzE4Mi4zCisxNzcuNgorMTc2LjIKKzE4MC43CisxOTMuNgorMTc4LjkKKzE3Ny44CisxNzguNworMTc5LjgKKzE3Ni4zCisxODAuOAorMTg0LjIKKzE4MS41CisxNzkuMgorMTc4LjIKKzE3OS45CisxNzYuNworMTgwLjAKKzE4My4wCisxODAuNgorMTc3LjMKKzE4Ni43CisxODAuOAorMTgxLjUKKzE5MC4zCisxODYuOAorMTg0LjIKKzE4MC40CisxODEuNgorMTgyLjIKKzE4My4wCisxNzMuMworMTg3LjUKKzE4NS43CisxODAuMQorMTc3LjgKKzE4OS4yCisxOTQuOQorMTc2LjgKKzE5NC45CisxODcuMAorMjA5LjIKKzE4NS40CisxNzcuNworMTc4LjAKKzE3NS40CisxNzguMAorMTgzLjEKKzE3Ny45CisxODIuNAorMTc3LjIKKzE3Ny43CisxNzguOQorMTgzLjUKKzE3OC4xCisxNzkuMgorMTkxLjUKKzE4Mi42CisxNzkuOAorMTgyLjUKKzE3Ni45CisxODAuMgorMTc2LjAKKzE3OC42CisxODQuNworMjc5LjIKKzE3OS4wCisxNzYuNQorMTgwLjAKKzE4Mi45CisxNzguMworMTg4LjEKKzE3OS42CisxNzcuOAorMTc1LjYKKzE4MC4wCisxNzguNgorMTgxLjAKKzE4NC4wCisxNzguMgorMTkxLjYKKzE3Ni44CisxODcuNworMTc5LjEKKzE4My4zCisyMDMuNQorMTc4LjcKKzE3OC42CisxNzUuNAorMTg3LjUKKzE3OS43CisxODEuNgorMTc3LjkKKzE4MC41CisxODYuNworMTgyLjMKKzE4Ny45CisxODIuMgorMTg3LjgKKzE4MS4xCisyNjYuNgorMTg2LjMKKzE4NS45CisxNzguMAorMTgwLjYKKzE3Ni45CisxNzYuNQorMTc3LjAKKzE4NC4xCisxODIuNworMTc5LjAKKzE4Mi42CisxODAuOAorMTc5LjkKKzE3OS4wCisxODMuMQorMTc4LjYKKzE3Ni40CisxNzcuMworMTc2LjQKKzE4MC4yCisxNzcuMgorMTc3LjAKKzE3Ny41CisxNzguMworMTc1LjIKKzE3Ny44CisxNzYuNworMTgxLjQKKzE3Ny43CisxNzcuMQorMTc2LjUKKzE4MC44CisxNzcuMgorMTc4LjEKKzE3Ny45CisxODcuMQorMTgzLjgKKzE4Ny4wCisxODQuNAorMTgwLjIKKzE3OS4yCisxNzkuMgorMTc4LjYKKzE4OC4wCisxODQuNworMTc4LjAKKzE3Ni4zCisxNzUuMworMTgxLjYKKzE5MS44CisxNzYuOQorMTgyLjAKKzE4My4zCisxNzcuNQorMTg1LjAKKzE4MS41CisxODIuNgorMTc5LjAKKzE4OC40CisyMDMuNgorMTg0LjMKKzE4My44CisxODguMAorMTg5LjcKKzE4NC43CisxODUuOQorMTk1LjAKKzE4NS4zCisxNzguOAorMTkwLjYKKzE4MS42CisxODAuMQorMTg3LjEKKzE4Mi4zCisxNzYuOAorMTc5LjEKKzE4NS44CisxODAuMQorMTgwLjMKKzE4Mi43CisxODUuMworMTc1LjYKKzE4Mi44CisxODguNQorMTc1LjYKKzE4Mi43CisxODIuMAorMTc5LjUKKzE4MC45CisxNzkuNAorMTgzLjIKKzE4Mi43CisxODIuNQorMTgyLjAKKzE5MC4xCisxOTkuNworMTc3LjgKKzE3Ny42CisxODAuOQorMTgxLjYKKzE4My4zCisxODYuMQorMTg4LjAKKzE4NC45CisxODUuNAorMTgyLjYKKzE4Mi41CisxNzguNworMTg1LjYKKzE3NS40CisxNzYuNworMTgyLjUKKzE4MC42CisxNzguMworMTc5LjcKKzE4NC40CisxODAuOQorMTg0LjUKKzE4Ny4yCisxODEuNgorMTkyLjcKKzE4NS45CisxNzkuNgorMTg0LjMKKzE4Mi4zCisxNzUuMAorMTgwLjMKKzE3Ny4yCisxNzcuOQorMTc4LjQKKzE3OS43CisxNzQuNgorMTkwLjQKKzE5My4xCisxODYuOAorMTgwLjYKKzE3Ni4wCisxNzcuNAorMTg4LjQKKzE3OS4yCisxODAuOQorMTc4LjcKKzE4MC45CisxNzguMgorMTc2LjYKKzE4NS4wCisxODIuMQorMTgxLjcKKzE3NS4yCisxNzUuMQorMTgzLjIKKzE5Mi4wCisxODguMworMTgyLjEKKzE3Ni43CisxNzcuNgorMTc3LjMKKzE5Mi42CisxODkuMworMTc4LjIKKzE3Ny41CisxODMuMQorMTgzLjQKKzE4MS4yCisxNzkuNQorMTc1LjQKKzE3Ni44CisxNzguMgorMTc1LjgKKzE3OS40CisxODQuNworMTg0LjYKKzE5MS45CisxNzcuNAorMTc2LjcKKzE3OS4zCisxODEuNgorMTgzLjMKKzE3Ni42CisyMTguNgorMTc1LjcKKzE3NC40CisxODYuNAorMTg1LjEKKzE3Ni4wCisxOTUuMgorMTgwLjMKKzE3OC4xCisxNzkuMgorMTc4LjAKKzE4MS41CisxODIuOQorMTc5LjAKKzE5MS4zCisxODUuMQorMTg2LjUKKzE3Ny4yCisxODAuMworMTkxLjAKKzE3NS43CisxNzkuOAorMTgyLjAKKzE4MS42CisxODUuMAorMTgzLjIKKzE3NC44CisxODQuNQorMTgyLjEKKzE3OC43CisxODYuNworMTg2LjkKKzE3Ni41CisxODQuNQorMTg4LjkKKzE4MC40CisxOTAuMQorMTgxLjQKKzE4OC4wCisxOTMuNQorMTg3LjcKKzE4MC4wCisxODMuNQorMTc2LjcKKzE3Ny41CisxNzkuMgorMjA2LjIKKzE3OC40CisxODMuMgorMTgxLjcKKzIwMC45CisxOTMuMQorMTc2LjEKKzE4MS44CisxODMuNgorMTkzLjUKKzIwMS43CisxODguMAorMTc4LjkKKzE4MC41CisxODAuOAorMTc2LjUKKzE3OC4wCisxODAuNgorMTgxLjQKKzE4NC43CisxOTIuNAorMTc3LjQKKzE4Mi40CisyMDIuOAorMTg5LjcKKzE3Ny4zCisxODEuNQorMTc4LjcKKzE4MC4wCisxODAuNgorMTc4LjAKKzE3OC4zCisxODMuOQorMTc3LjQKKzE4MC4wCisxODkuNworMTc1LjQKKzE4NS4yCisxNzkuMworMTg0LjEKKzE3Ny41CisxODIuMQorMTc0LjgKKzE3OS44CisxODcuNQorMjE2LjkKKzE4Mi45CisxODMuNQorMjAzLjMKKzE4MS41CisxODQuMAorMTgxLjMKKzE4My40CisxODAuMworMTc2LjEKKzE4MC4zCisxODAuMQorMTgwLjIKKzE4MS4yCisxODIuMworMTc2LjIKKzE4OS41CisyMTkuNworMTgwLjEKKzE3Ni42CisxNzcuMworMTc4LjgKKzE4MS4yCisxNzUuMQorMTgzLjMKKzE4Mi4xCisxNzguNworMTgwLjkKKzE4My4zCisxODguMQorMjI1LjIKKzE4NS44CisxODQuMworMTg3LjUKKzE4Ny4zCisxOTAuNworMTgxLjAKKzE4MC4yCisxODQuNgorMTc3LjkKKzE4MC4xCisxODcuNgorMTgxLjEKKzE3Ny41CisxODQuNQorMTc2LjUKKzE4Mi43CisxNzQuNQorMTgzLjIKKzE3Ni41CisxODMuMAorMTc3LjAKKzE3OS4yCisxODIuOQorMTg0LjkKKzE3Ni40CisxNzkuOQorMTgzLjIKKzE3OC4xCisxNzcuMAorMjA1LjUKKzE4Mi41CisxNzUuMgorMTg1LjAKKzE4Mi43CisxNzguMgorMTg5LjAKKzE5MC41CisxNzguOAorMTgzLjUKKzE4NS4xCisxODEuMworMTgxLjMKKzE5NC41CisxODcuOAorMTg0LjkKKzE3Ny4yCisxNzkuNgorMTk1LjEKKzE4MS4yCisxODguOAorMTgwLjQKKzE4MC44CisxODAuMAorMTc3LjYKKzE5OC4zCisxODAuNgorMTc5LjUKKzE3OC40CisxNzkuMworMTc3LjUKKzE3Ni44CisxODEuNgorMTgzLjgKKzE4MS44CisxNzUuNgorMTgxLjAKKzE3OC40CisxNzkuNAorMTc5LjgKKzE4MS4zCisxODEuMQorMTkzLjMKKzE4MC4xCisxODIuOAorMTc5LjMKKzE4MS4xCisxODguMworMTc3LjYKKzE3OC41CisxNzguOAorMTc3LjEKKzE3OS4yCisxODEuNgorMTg1LjYKKzE5MS44CisxNzYuMworMTg3LjgKKzE4NC41CisxOTcuMworMTgzLjEKKzE3OS43CisxNzguMQorMTgxLjMKKzE3Ny42CisxNzguMgorMTc5LjUKKzE3Ny41CisxODUuNAorMTg0LjQKKzE4Ni40CisxNzcuNAorMTc4LjAKKzE3OS43CisxNzcuOQorMTg0LjYKKzE4OS4xCisxODQuNQorMTk3LjIKKzE5Mi42CisxODguMAorMTg2LjUKKzE3Ny4zCisxODMuNworMTgzLjcKKzE5Mi44CisxODEuMgorMTk5LjQKKzE3OS43CisxODcuNworMTkyLjgKKzIwOC41CisxODQuMQorMTc1LjYKKzE4NS4zCisxODguNgorMTgzLjcKKzE4MC43CisxODIuMQorMTc2LjAKKzE4My4xCisxNzkuNgorMTc1LjcKKzE4Ny4wCisxNzkuOQorMTg0LjgKKzE3OS40CisxODcuNgorMTgxLjYKKzIwMS4xCisxOTMuNQorMTg2LjIKKzE5MC4zCisxOTcuOQorMjA4LjIKKzE5Mi45CisxOTMuMQorMTg0LjkKKzIxMC41CisxNzguNgorMTk4LjIKKzE3Ny45CisxOTIuMgorMTgxLjYKKzE4NS4xCisxODkuMQorMTg4LjMKKzIwNC43CisxODYuMgorMTc5LjYKKzE4OS4yCisxNzYuOQorMTgwLjUKKzE4My4zCisxOTMuMQorMTc4LjQKKzIwMy44CisxODUuMgorMTgwLjYKKzE4My4zCisxODYuNworMTg4LjgKKzE4NC40CisxODEuNworMTg2LjQKKzE4NS44CisxODAuMQorMTgyLjcKKzE3OS44CisxOTguOQorMTgwLjQKKzE3OC4zCisxOTUuNgorMTg0LjAKKzE3OS41CisxODEuOAorMTg3LjQKKzE4MS43CisxODEuOAorMTc1LjEKKzIwMC4wCisxODEuNgorMjAzLjAKKzE3Ni4wCisxODQuOQorMTk5LjMKKzE3OC4yCisxODQuMworMTc2LjYKKzE5Mi45CisxODguMQorMTg1LjcKKzE4MS4wCisxNzkuNQorMTgzLjQKKzE4Ni43CisxNzguNgorMTgzLjIKKzE3OS42CisxODIuNgorMTc3LjMKKzE3OS4wCisxOTcuMAorMTgyLjAKKzE3NC44CisxNzkuNAorMTgwLjcKKzIxMC4zCisyMTEuMworMjM1LjMKKzI1NS43CisyNzUuNworMjg2LjgKKzMwNi43CiszNDcuMgorMzgxLjIKKzE4NC41CisxODYuNworMTkwLjEKKzE5My4zCisxNzcuOQorMTg4LjAKKzE4NC4wCisxODAuNgorMTc4LjUKKzIzNS44CisxNzkuNgorMTc4LjEKKzE5Ni4wCisxODAuNQorMTc5LjAKKzE4NS44CisyMzAuOAorMjExLjEKKzE3OC4zCisxNzkuNAorMTg2LjUKKzE4MC42CisxODEuNAorMTgzLjIKKzE4OC43CisxODQuOAorMTc1LjAKKzE3OS4yCisxODUuNAorMTgwLjgKKzE4Mi43CisxODMuMQorMTc3LjMKKzE3Ny40CisxODEuMworMTkwLjkKKzE4Mi43CisxOTguMgorMTgwLjkKKzIwMC41CisxODguNAorMjA3LjUKKzE5MC4yCisxNzguOQorMTg0LjEKKzE5My42CiszMjEuMworMTgzLjgKKzE4MS40CisxNzQuNgorMTg1LjEKKzE5OC45CisyMDIuMgorMTgzLjMKKzE4Ny4zCisxODMuMAorMTg0LjUKKzE3OC4zCisxODMuOAorMTc2LjcKKzE3OC4zCisxODYuMAorMTgxLjAKKzE3Ni4wCisxODEuMworMjAyLjgKKzE3OS43CisxODAuMworMTkxLjYKKzE3Ni44CisxODIuNgorMTgzLjcKKzE4MS4zCisxODYuMgorMjA1LjcKKzE4Ni40CisxODEuOQorMTg5LjkKKzE4OC45CisxOTMuNgorMjAzLjIKKzIxMi4zCisxNzguOQorMTgxLjUKKzE4OS42CisxNzguOQorMTc3LjYKKzE4OS4wCisxNzcuMworMTc3LjIKKzE3OC4wCisxNzguNQorMTc3LjkKKzE5Ny44CisxODIuMAorMTg1LjcKKzE5My42CisxODUuOAorMTgzLjEKKzE4My4xCisxOTIuNworMTgzLjAKKzE4Ny4wCisxOTMuNAorMTg2LjkKKzE4Mi4zCisxODMuOQorMjAxLjYKKzE5OS41CisxODIuNworMTg0LjYKKzE4MS44CisxNzkuMQorMTg5LjgKKzE4My4xCisxODcuOAorMTg1LjcKKzE5Mi45CisxNzkuMworMTc5LjcKKzE4MC4yCisxNzcuNgorMTgwLjgKKzE3OC4wCisxOTAuMgorMTc3LjUKKzE5OS4yCisxOTIuNworMTgxLjIKKzE4NS4yCisxODMuNQorMTk4LjEKKzE3OC45CisxODMuNworMTkxLjYKKzE4Ny40CisxODAuNQorMjExLjkKKzIwNi4yCisxODMuMgorMTgyLjEKKzE3Ni43CisxODcuNAorMTc2LjYKKzE4My4yCisxOTUuNQorMTc4LjcKKzE4MC43CisxODEuMgorMTg5LjEKKzE4Ny44CisxODMuMQorMTgxLjkKKzE4Ni4zCisxOTcuMQorMTg0LjcKKzE3Ny4yCisxODAuNQorMTc5LjUKKzE4MS42CisxNzcuOQorMTg3LjcKKzE5Ni4yCisxODkuNQorMTgwLjUKKzE4My4zCisxODAuNgorMTg2LjcKKzE4Ni4yCisxNzcuNworMTkyLjEKKzE4Mi40CisxNzcuNQorMTc5LjcKKzE5My42CisyMDAuMQorMTc5LjkKKzE4OC40CisxODIuMworMTkwLjQKKzE3OS40CisxODIuNAorMTgxLjcKKzE5NS43CisxNzcuMgorMTgxLjMKKzE4Mi45CisxODguMworMTgzLjYKKzE4MC4zCisxOTIuNworMTgzLjEKKzIxMC41CisxODUuMQorMTgzLjQKKzE5MS42CisxODcuOQorMTgzLjEKKzE3NS41CisxNzcuNAorMTgzLjcKKzE4Mi45CisxODguNQorMTgwLjcKKzE4Ni4yCisxODIuNAorMTg2LjMKKzE4Mi40CisxODguMQorMTgwLjIKKzE5NS40CisxODEuOAorMTkyLjkKKzE3Ni4zCisxNzcuNworMTc4LjgKKzE3OS40CisxODIuNgorMTgwLjMKKzE4Ny40CisxODUuMworMTgzLjUKKzE4MC41CisxODAuOAorMTgyLjAKKzE3OC45CisxNzYuMgorMTk3LjAKKzE4MS41CisxNzcuMQorMTg5LjEKKzE4OC4wCisxNzYuNQorMTgxLjcKKzE4NC45CisxOTIuMgorMTgxLjUKKzE4OS4wCisyMDQuNgorMTc3LjUKKzE3Ni42CisyMDIuMgorMTc2LjkKKzE4MS45CisxNzcuOQorMTgwLjYKKzE5Ny4yCisxNzUuOQorMTc1LjYKKzE4My40CisxODIuNworMTkxLjIKKzE3OC44CisxODcuMgorMTc4LjkKKzE5Mi40CisxNzguNgorMTc4LjQKKzE4NC41CisyMTYuNAorMTkwLjcKKzE4Mi43CisxODEuNgorMTk5LjUKKzE4Mi4wCisxNzkuMQorMTg5LjEKKzE4MC4zCisxODIuMAorMTg1LjYKKzE5Ni4xCisxODIuNQorMTgwLjQKKzE5MC45CisxNzguOQorMTg2LjMKKzIwOS40CisxODEuNworMTg2LjYKKzE5Mi4wCisyMDAuMAorMjA1LjcKKzE5MS4wCisxODYuMAorMTg1LjUKKzE3Ni4yCisxOTEuNAorMTg0LjQKKzE4Ni4xCisxODYuNgorMTgwLjAKKzE4MC44CisxNzguMAorMTgwLjAKKzE5OC44CisxODMuOQorMTgzLjUKKzE3Ni40CisxNzYuNworMTgxLjQKKzE4Ni40CisxODYuOAorMTg2LjAKKzE3OS41CisxODcuMgorMTc5LjUKKzE4NS4yCisxNzkuNAorMTgzLjYKKzE4OC42CisxNzkuOAorMTc5LjAKKzE4NC40CisxNzguNAorMTc3LjQKKzE5NS4yCisyMDcuMAorMTg0LjMKKzE3OS42CisxODMuMQorMTg0LjAKKzE4Ny4yCisxODEuNAorMTc4LjQKKzE4Mi43CisxODkuNAorMTgzLjEKKzE3OS43CisxODEuOAorMTgxLjUKKzE4MS45CisxODIuNgorMTc4LjIKKzE4OS4yCisxODkuMQorMTkwLjMKKzE4NC4xCisxOTUuMworMTc2LjEKKzE3Ny4zCisxODYuOAorMTgzLjcKKzE4OC41CisxNzkuNworMTc3LjQKKzE4MS40CisxODAuNworMjA2LjkKKzE3OS4yCisxNzcuOAorMTgwLjUKKzE4MC42CisxOTEuOQorMTgxLjcKKzE5MC4zCisxODMuNQorMTg2LjIKKzE3NS44CisxNzkuMQorMTgxLjYKKzE4MS42CisxODMuMAorMTc5LjEKKzE3OS4zCisxODMuNworMTgxLjIKKzE4NS4yCisxNzYuOAorMTc3LjgKKzE3NS4zCisxODQuNgorMTc5LjIKKzE3Ni45CisxODguMAorMTg0LjYKKzE4NC42CisxODAuOQorMTg5LjkKKzM5Ni4zCisxNzYuMQorMTgzLjEKKzE3OS4yCisxODQuNgorMTgxLjUKKzE4MS4zCisxNzYuMgorMTc3LjQKKzE3NC4zCisxNzkuNAorMTc4LjgKKzE4NC42CisxODIuMQorMTgzLjQKKzE3OC40CisxODQuMQorMTgyLjcKKzE4MS40CisxNzcuNworMTg1LjAKKzE3Ny4yCisxNzkuNAorMTgzLjUKKzE4My4xCisxODcuNgorMTgxLjEKKzE3OS43CisxODkuNgorMTgzLjYKKzE3Ny4xCisxODEuNQorMTkzLjEKKzE5Ni44CisxODAuMgorMTc3LjMKKzE3OC44CisxNzYuNgorMTc3LjgKKzE5MC4wCisxNzYuMworMTgwLjEKKzE3Ny41CisxODcuMgorMTg2LjcKKzE3Ni41CisxNzkuNgorMTc3LjIKKzE3Ny41CisxOTYuNAorMTgxLjkKKzE3OS45CisxNzguMgorMTgxLjUKKzE3Ny41CisxNzkuOQorMTgzLjEKKzE4MS41CisxODEuOAorMTc3LjQKKzE3Ny42CisxNzQuNQorMTc4LjQKKzE4My44CisxODEuNgorMTg2LjQKKzE3OC4xCisxNzcuMworMTc5LjEKKzE4My42CisxOTEuMgorMTgxLjcKKzE4Ny42CisxODYuMQorMTgzLjUKKzE4NS4wCisxODYuNQorMTg3LjUKKzE5MC41CisyMjQuNworMTc3LjMKKzE4OS4yCisxOTEuNworMTg4LjAKKzE4Mi44CisxODcuOAorMTgyLjIKKzI0MS45CisxOTcuNgorMTg4LjMKKzE4MS43CisxOTUuNQorMTg0LjQKKzE5MC45CisxODcuNAorMTk1LjAKKzE5MC4wCisxODAuNQorMTc5LjEKKzE4MC4zCisxOTUuMAorMTc2LjcKKzE5MS44CisyMDAuMgorMTgwLjMKKzE4MC42CisxODYuMQorMTc4LjIKKzE4Mi41CisxODMuMgorMTc4LjkKKzE3Ny42CisxODUuNgorMjAzLjUKKzE3OS43CisxNzkuNgorMTkwLjgKKzE4Ny40CisxODQuNworMTg1LjEKKzE5NS4xCisxOTEuOQorMTgxLjEKKzE4My4xCisxNzcuMQorMTc3LjkKKzE3OC41CisxNzguOAorMTg2LjAKKzE4OS45CisxODQuNworMTkwLjQKKzE5Mi45CisxNzguNgorMTc2LjEKKzE4OS4yCisxODYuMQorMTc4LjYKKzE4Ni45CisxODEuNQorMTgxLjUKKzE4MS4yCisxNzguMQorMTgxLjgKKzE4Ny42CisxODMuMworMTg4LjUKKzE3OS42CisxODMuNQorMTg3LjkKKzE3OS42CisxOTIuNAorMTgyLjYKKzE5Mi4xCisyNTUuNAorMjY2LjIKKzE5MS41CisxOTQuOAorMTc5LjcKKzE5MC44CisxODIuOAorMTgyLjMKKzE4Ni43CisxODYuNAorMTc4LjEKKzE4Mi41CisxNzUuMAorMTg3LjcKKzE5OS40CisxODIuMQorMTgwLjUKKzE4Mi45CisxNzUuOQorMjE5LjYKKzIwNy4wCisxOTYuNQorMTkwLjcKKzE5OS4xCisxODUuNAorMTc0LjUKKzE4MC41CisxODIuNworMTgxLjgKKzE4OS4yCisxODEuMAorMTk4LjIKKzE5MS45CisxODUuMworMTgyLjkKKzE4OC41CisxNzguNworMTc5LjIKKzE4OC43CisxODguNQorMTc4LjIKKzE5Ny42CisxNzguMworMTkyLjcKKzE4MS45CisxOTEuMgorMTgxLjcKKzE3Ni4xCisxOTYuNQorMTg3LjcKKzE5MC41CisxODcuOAorMTgyLjkKKzE4OS45CisxOTIuMworMTc3LjQKKzE4NC43CisxNzguMworMTg1LjgKKzE4Mi4wCisxODAuMQorMTgzLjEKKzE4Mi4wCisxNzYuMQorMTg1LjIKKzE5Ni4wCisxODUuNQorMTc5LjEKKzE5OC4xCisxOTcuNQorMTgyLjAKKzE3Ny4wCisxNzguMworMjAyLjkKKzE3Ny4wCisxODAuNgorMTgxLjYKKzE5MS42CisxNzkuNgorMTgwLjkKKzE4My43CisxODguNAorMTgyLjYKKzE4NS43CisxOTEuNQorMTc4LjYKKzE4OC40CisxODQuMAorMTgzLjgKKzE4OS4zCisxODUuMgorMTkyLjkKKzE5NS40CisxOTcuMQorMTkwLjQKKzE4Ni41CisxOTYuMAorMTg5LjgKKzE5MS45CisxODcuMworMTg1LjcKKzE5OC4wCisxNzUuOAorMTgzLjcKKzE3Ni4wCisxNzkuOQorMTgzLjEKKzE4Ni43CisxNzcuOQorMTc5LjIKKzE4MS43CisxODQuOQorMTgxLjYKKzE3OC41CisxNzYuNQorMTc2LjcKKzE3OC40CisxODQuNworMTgxLjMKKzE4Mi4zCisxODIuOAorMTgyLjYKKzE5MC4yCisxNzcuMAorMTg3LjkKKzE4OC4xCisxODYuNAorMTg3LjgKKzE4MS4zCisxODcuNworMTkxLjgKKzE4Mi41CisxODIuMAorMTgwLjEKKzE4NS44CisxNzcuOAorMTkyLjUKKzE4NS4yCisxNzkuNworMTc5LjMKKzE5MS4wCisxODEuMworMTkyLjkKKzE4MC4zCisxOTQuNQorMTg3LjYKKzE4NC4zCisxOTQuNworMTgyLjcKKzE3Ny43CisxODEuMgorMTc3LjIKKzE4NC4wCisxODEuOAorMTg4LjUKKzE4Ny44CisxODQuNworMTgxLjcKKzE4NC42CisxNzcuNAorMTkzLjAKKzE3OC43CisxNzYuNQorMTc2LjkKKzE4MC45CisxODAuOAorMTg3LjgKKzE3OS44CisxNzUuMgorMTc3LjUKKzE4MC41CisxODYuNgorMTc3LjAKKzE3Ny44CisxNzcuOAorMTgyLjUKKzE4MC4wCisxODIuNAorMTg4LjYKKzE5Mi41CisxNzcuNQorMTc5LjgKKzE3OC44CisxNzguOQorMTgyLjAKKzE4MC42CisxODQuNQorMTc5LjkKKzE3NS40CisxODMuMQorMTc3LjgKKzE3Ny4yCisxOTEuNworMTg0LjYKKzE4My4xCisxNzUuNgorMjAwLjYKKzIyMS41CisxNzcuMgorMTc3LjYKKzE4NC4wCisxODMuNAorMTk5LjIKKzE4NC42CisxODYuMQorMTgwLjMKKzE4OC4xCisxODQuMQorMTg1LjkKKzE3OC4wCisxODMuNworMTg2LjcKKzE4Ni4xCisxNzcuOAorMTgzLjUKKzE3OC4wCisxNzcuMAorMTg1LjYKKzE4Ny4wCisxNzguOQorMTc4LjkKKzIwMC41CisxODAuMgorMTgxLjYKKzE4Ny44CisxNzkuOAorMTgyLjAKKzE4NC4zCisxNzYuMworMTgyLjgKKzE4NC4zCisxODEuOQorMTg1LjMKKzE4OS4yCisxNzcuMworMTgzLjYKKzE4Ni43CisxODQuMAorMjQzLjkKKzE3NS45CisxODQuMworMTc2LjAKKzE3OS42CisxNzguNQorMTgyLjMKKzE4OS43CisxNzkuNgorMTkwLjMKKzE4OC44CisxNzUuMgorMTc5LjgKKzE4MS4wCisxNzUuNgorMTc1LjMKKzE4Ny41CisxNzUuMworMTg2LjgKKzE3Ni42CisxNzcuMworMTc1LjcKKzE3OC41CisxNzguOAorMTc4LjUKKzE3OC45CisxODMuNworMTgyLjIKKzE4Mi4zCisxNzguOQorMTgyLjAKKzE3OC42CisxODQuMgorMTc4LjgKKzE3Ni43CisxNzYuOQorMTc2LjIKKzE4MS4xCisxNzcuOQorMTc3LjIKKzE3OC42CisxOTQuOAorMTg1LjQKKzE4OC4zCisxNzguOQorMTg3LjEKKzE4NC4zCisxODQuMgorMTkwLjMKKzE5My44CisxODUuMAorMTgxLjAKKzE4MS40CisxODEuMAorMTkxLjgKKzE3Ny40CisxNzguNgorMTc5LjYKKzE4MC4yCisxNzkuMAorMTg3LjQKKzE3Ny4xCisxODIuNworMTgxLjkKKzE3Ny45CisxODQuOAorMTk1LjEKKzE4MS4yCisxODIuMQorMTg3LjQKKzE4Ni44CisxODQuNworMTgxLjkKKzE4OC43CisxOTEuOAorMTg0LjcKKzE4NS41CisxODMuNQorMTgwLjgKKzIwNi4xCisxNzkuMQorMTk0LjMKKzE3OC4wCisxNzcuNAorMTgxLjAKKzE4MS43CisxOTAuNgorMTg5LjMKKzE3Ni4zCisxODMuNQorMTc4LjkKKzE3OS40CisxODcuMworMTgyLjUKKzE4MS43CisxODMuMworMTg4LjkKKzE4MS4zCisxOTUuNgorMTgwLjQKKzE5NC4wCisxODIuNgorMTc2LjYKKzE5MC44CisxNzYuMworMTg2LjEKKzE4NS4xCisxODEuNQorMTc5LjIKKzE3OC4zCisxNzkuNgorMTgxLjUKKzE4MS4wCisxODMuMgorMTgyLjYKKzIwMi42CisxODMuNworMTg4LjIKKzIwMC42CisxNzcuOQorMTg0LjIKKzE5Mi4wCisxODAuOQorMTc3LjMKKzE3Ny4yCisxODguMQorMTg0LjIKKzE5OS40CisxODUuMworMTg5LjcKKzE5OS44CisxNzYuNgorMTg5LjIKKzE4Ni4zCisxODIuOAorMTgwLjAKKzE5MC44CisxODguNQorMTk0LjYKKzE4NC44CisyMDIuNworMTg5LjgKKzE4My4yCisyMDYuMgorMTc1LjMKKzIwMi4xCisxOTMuNQorMjEwLjEKKzIwMC41CisxOTQuOAorMTkwLjAKKzE4OS4zCisxODIuNQorMTgzLjMKKzE4Ny4xCisxODYuMQorMjA4LjEKKzE5MS40CisyMDcuNQorMTg4LjYKKzE3Ni43CisxOTAuOAorMTg5LjEKKzE3Ny4yCisxODkuMworMTc3LjMKKzE5Ni4yCisxOTUuMworMTg4LjAKKzE5NC4xCisxODEuMworMTc3LjgKKzE4Ni4yCisxODQuNAorMTgyLjAKKzE4Mi41CisxODcuMQorMTc5LjgKKzE3Ny40CisxODQuMAorMTgwLjUKKzE4Mi45CisxNzYuNAorMTc1LjkKKzE3Ni44CisxODIuOAorMjA4LjAKKzE5Ni4zCisxODMuNAorMTc4LjUKKzE4OS43CisxODMuMworMTgyLjUKKzE4Mi43CisxODIuNQorMTk1LjcKKzE4My44CisxODIuNgorMTkwLjAKKzE5MS4wCisxOTEuNworMTc3LjIKKzE4NC4xCisyMDIuOQorMTg5LjgKKzE4NS4wCisxODMuMworMTk0LjIKKzE4Mi44CisxNzguOQorMTg0LjkKKzE4OS4xCisxOTIuOAorMTgxLjEKKzE5MC41CisyMDUuMgorMTc5LjEKKzE5MS4zCisxODYuOAorMTg4LjkKKzE3OC44CisxODguMAorMTg0LjEKKzE4My4xCisxODIuMQorMTgxLjkKKzE5MS42CisxODMuNAorMTg5LjkKKzE4MC4yCisxODYuNgorMTgwLjMKKzE4Mi43CisxODQuOAorMTc4LjQKKzE4MC4zCisxOTMuNworMTgxLjUKKzE4Ni42CisxNzkuMQorMTg0LjMKKzE5Mi4xCisxODkuNQorMTgyLjIKKzI5Ni40CisxOTQuOAorMTc5LjAKKzE4My40CisxOTQuMworMTk5LjUKKzE4Mi43CisxODEuMAorMTgxLjgKKzE4Ni45CisxODYuNAorMTg4LjMKKzE3OS4yCisxOTAuMQorMTg0LjkKKzE4Ny44CisxODYuMworMTgzLjQKKzE4My4xCisxOTEuMworMTg4LjUKKzE4OC41CisxODcuOQorMTg4LjcKKzE3NS4zCisxNzguNAorMTk3LjUKKzE4NS4zCisyMDEuMworMTkwLjkKKzIxMC4xCisxNzkuMAorMTc2LjMKKzE3OS40CisxOTUuMAorMTc5LjAKKzE3Ni40CisxODguNQorMTgwLjUKKzE3OS41CisxNzkuNAorMTc3LjUKKzE4NS4yCisxNzkuOQorMTc4LjMKKzE4My44CisxOTMuOQorMTgzLjEKKzE4Ny43CisxOTIuNworMTgxLjMKKzE4NC4xCisxODIuNQorMTc4LjIKKzE4NC4wCisxOTUuNAorMTc5LjcKKzE5MS43CisxODMuNworMTg1LjYKKzE4OC40CisxOTUuMAorMTg0LjgKKzE4MS44CisxODYuMgorMTc3LjQKKzE4OS44CisxOTIuMQorMTkyLjkKKzE4Ny41CisxOTEuNQorMTg5LjEKKzE5NS43CisxODguMAorMTkyLjcKKzE5MC4xCisxOTAuMQorMTk2LjMKKzE5Mi40CisxOTMuMQorMTc4LjkKKzE4MS45CisxNzkuMgorMTg4LjQKKzE3OS4yCisxODcuNQorMTc5LjcKKzE4NS4zCisxNzcuMgorMTgwLjUKKzE4Mi4yCisyMDMuOAorMTg2LjEKKzE4MS43CisxODAuOAorMTg3LjkKKzE3Ny40CisxODkuNQorMTg5LjMKKzE3Ni41CisxNzkuMgorMTkwLjUKKzE4MC4wCisxNzcuMQorMTgzLjcKKzE4OC44CisxODAuNgorMjIwLjYKKzE5MC45CisxOTcuOQorMTgyLjgKKzE4My4wCisxNzcuOQorMTgyLjIKKzE4Mi40CisyMDEuNQorMTgxLjEKKzE3Ny44CisxODkuNgorMTkzLjQKKzE4MC4zCisxODAuMgorMTc1LjMKKzE3Ny44CisxNzguMworMTc4LjgKKzE5MC43CisxODEuOAorMTg1LjEKKzE5MC4yCisxNzkuMQorMTc5LjkKKzE3OS44CisxODAuNgorMTgxLjYKKzE4MC44CisxODQuNgorMTg0LjkKKzE4MS43CisxNzYuMworMTgyLjIKKzE4Ni45CisyMjcuMQorMTg0LjkKKzE4NC41CisxNzcuNQorMTgwLjIKKzE4Ny41CisxODYuMQorMTgzLjgKKzE3Ny40CisxODQuMQorMTg4LjEKKzE4MC40CisxOTcuNAorMjA5LjYKKzE5OC4zCisxNzkuNQorMTgzLjkKKzE4My41CisxODEuOAorMTc4LjkKKzE5NS41CisxODQuNworMTkxLjMKKzE5My41CisxOTYuOAorMTk3LjAKKzE4NC4yCisxODEuOQorMTg3LjUKKzE4OC43CisxNzcuNworMTg2LjcKKzE5MS42CisxOTIuOAorMTk0LjgKKzE5My42CisxOTQuNworMTg3LjYKKzE5Ny4yCisxODcuNQorMTc2LjAKKzE5NC40CisxOTkuOQorMTg4LjIKKzE4NC41CisxODMuMgorMTg2LjAKKzE4My42CisyMTAuNQorMTgzLjcKKzE5MC40CisxODguNgorMTc5LjgKKzE4My45CisyMTAuMgorMTk0LjAKKzE5MC44CisxODguMworMTg2LjIKKzE3OC4wCisxNzguMworMTk0LjQKKzE4NC41CisxODIuMworMTc5LjEKKzE4My40CisxODIuOQorMTg1LjEKKzE4MC42CisxODIuMQorMTg5LjQKKzE4MS42CisxODAuNQorMTkwLjQKKzE4Mi4xCisyMDQuMAorMTkyLjcKKzE4MC40CisxOTAuNworMTc5LjUKKzE3OS4yCisxODEuNQorMTg2LjEKKzE5NS4xCisxODkuNworMTg5LjkKKzE4NS45CisyMDYuMgorMTg3LjUKKzE3OC41CisyMDYuMgorMjA4LjUKKzE4Ny40CisxODIuMAorMTkyLjkKKzE5My4wCisxOTYuNQorMTkwLjEKKzE3OS43CisyMDUuOQorMTg3LjcKKzIxMS41CisxNzcuNQorMTg1LjEKKzIwNS4zCisxNzguOQorMTc5LjYKKzE3OC44CisxODUuOQorMTgwLjEKKzE3OS4wCisxNzguMgorMTgxLjkKKzE4Mi45CisxOTEuNQorMTk0LjgKKzE4NC45CisxNzcuOQorMTg2LjAKKzE3OC43CisxNzUuMgorMTc4LjEKKzE4My45CisxNzYuMgorMTk2LjMKKzE5NS4wCisyMTQuNAorMTc3LjIKKzE3NS4yCisxODEuNAorMTkxLjQKKzE4OS4wCisxNzkuNgorMTgxLjgKKzE3Ny44CisxNzUuOQorMTc2LjEKKzE4My44CisxODIuMQorMTc4LjQKKzE4Mi4xCisxODAuNgorMTc3LjQKKzE3OC45CisxNzguNworMTgyLjAKKzE3Ni41CisxODIuMQorMTg5LjIKKzE4OC4zCisxODQuNgorMTc3LjYKKzE4NC42CisxODMuNgorMTgyLjYKKzE4MS41CisxOTguNAorMTc5LjYKKzE3OS4zCisxODUuMQorMTg5LjgKKzE4My41CisxODAuOQorMTc1LjcKKzE4Mi42CisxNzkuMQorMTgxLjMKKzE4MS40CisxODkuOAorMTgzLjcKKzE4NS44CisxODUuOQorMTc4LjEKKzE4Mi4zCisxOTYuMworMjIwLjAKKzE5OS40CisxOTEuMworMTg2LjcKKzE4MS43CisxODAuNworMTgwLjkKKzE3Ni4yCisxODUuMworMTgwLjMKKzE4Mi41CisxNzcuNQorMTgyLjQKKzE4NC44CisxOTEuMworMTg1LjUKKzE4NC40CisxOTMuOAorMTg2LjUKKzE3OC45CisxODAuNgorMTgyLjcKKzE4MC4xCisxODQuOAorMTc5LjcKKzE4Ny44CisxODMuNworMTkwLjkKKzE5Mi41CisyMDUuNQorMTkzLjEKKzE4MC43CisxODYuNAorMTc5LjMKKzE5NC4yCisxODcuOAorMTkwLjYKKzE3OC44CisxNzYuNworMTgxLjIKKzE4Ny42CisxOTEuMworMTgyLjQKKzIwNC45CisxOTEuMAorMTkzLjgKKzE5NC4wCisxOTguNAorMTgxLjcKKzE4Ni41CisxODYuNAorMTgyLjUKKzE4Mi4yCisxNzkuMAorMTgwLjYKKzE4MC4wCisxODEuMQorMTc4LjYKKzE3OC42CisxODMuMworMTg5LjEKKzE3OS45CisxOTAuMgorMTg3LjMKKzE4NS4zCisxODUuMAorMTg1LjkKKzE4OS4zCisxODIuNgorMTgzLjUKKzE5MC44CisxODMuNAorMTg1LjIKKzE5Ny4xCisxODcuNQorMTgyLjIKKzE4MC40CisxODEuMworMTc4LjgKKzE4Mi41CisxODMuMgorMTc0LjgKKzE4MC40CisyMDAuOQorMTgxLjUKKzE4NS41CisxNzYuNgorMTc5LjAKKzE4Ny40CisxNzMuOAorMTkyLjYKKzE3OS4zCisxODguNworMTk4LjkKKzE3Ny44CisxODUuNQorMTc3LjEKKzIxMy4xCisxODUuNworMTg5LjcKKzE4Ni42CisxODkuMgorMTg4LjEKKzE4NC4wCisxODQuNQorMTc4LjcKKzE4My45CisxODYuMworMTk5LjAKKzE4OC4yCisxOTEuOQorMTgxLjYKKzE3Ny40CisxODMuOAorMTc5LjIKKzE4Mi43CisxODIuMQorMTc4LjIKKzE4Ny4zCisxODkuMAorMTg4LjEKKzE5MC44CisxODQuMQorMTg4LjAKKzE3OC45CisxOTUuOAorMTc5LjMKKzIwNC42CisxODMuMworMTc4LjgKKzE3OC44CisxNzYuOQorMTc5LjkKKzE4Ni4wCisxODEuNgorMTk5LjUKKzE3OS42CisxODkuMAorMjA0LjIKKzE4OS43CisxODEuMgorMTg0LjUKKzE5My40CisxODMuNworMTgwLjIKKzE4Ni4yCisxOTEuMAorMTk1LjEKKzE3OS45CisxODIuNgorMTg4LjcKKzE4NC41CisxNzguOQorMTk0LjEKKzE5MS41CisxNzkuOQorMTk4LjgKKzE4My40CisyMTIuNworMTc5LjAKKzE4MS44CisxNzYuNQorMTgxLjkKKzE3OS43CisxODYuMgorMTg3LjAKKzE4MS42CisxODQuOQorMTk5LjcKKzE4NS40CisxODYuMQorMTc5LjMKKzIwMC42CisxODcuNworMTk1LjIKKzE4NS41CisxODIuMgorMTg5LjQKKzE4NC42CisxNzcuOQorMTgyLjUKKzE4Mi45CisxOTEuNAorMTkyLjUKKzE4Ni4yCisxNzguNAorMTk3LjgKKzE3NS43CisxODMuMgorMTg3LjUKKzE5Mi45CisxNzUuOAorMTk1LjEKKzE4NS43CisxODguNgorMTkxLjYKKzE3Ny4wCisxODEuOAorMTg4LjIKKzIwMi40CisxODMuOAorMTg0LjUKKzE5OC42CisxODYuNAorMTgwLjcKKzE4OC42CisxODEuNAorMTc4LjkKKzE4Ni41CisxODUuNQorMTg3LjcKKzE4Ny43CisxNzkuMQorMTg0LjIKKzE4NS4xCisxNzguMAorMTgyLjAKKzE5Ny4wCisxOTQuOQorMTkzLjYKKzE3Ny4wCisxODYuNgorMTc5LjgKKzE4Ni4xCisxNzcuNworMTgyLjEKKzE4MS4zCisxNzguMAorMTg0LjgKKzIwOC4zCisxOTMuMQorMTg3LjIKKzIwNy43CisxODguMgorMTg2LjEKKzE3OC4xCisxOTMuMworMTgyLjEKKzE5OS44CisxODIuNworMTk2LjQKKzE5Ny45CisxNzguOAorMTkxLjQKKzE4MC45CisxODAuNQorMTg0LjYKKzE3Ny4yCisxODIuNAorMTgzLjcKKzE3OC4yCisxODcuMQorMTc4LjUKKzE4MS4zCisxOTAuNQorMTc5LjAKKzE4MS4wCisxNzguMAorMTg1LjUKKzE3OS4xCisxODQuOQorMTg0LjcKKzE3Ny43CisxNzYuNworMTgzLjUKKzE5Ni4zCisxODQuMgorMTkwLjAKKzE4OS40CisxODYuMAorMTgxLjcKKzE4Ni4wCisxODguNworMTg3LjUKKzE4NC42CisxNzYuMworMTc3LjQKKzE4NS45CisxODMuNAorMTc5LjQKKzE3NS44CisxODYuMQorMTc4LjgKKzE3OS4wCisxODEuNgorMTc1LjIKKzE3Ny40CisxNzYuOAorMTc3LjkKKzE5Ny42CisxODQuOQorMTc2LjAKKzE3Ny42CisxNzguNAorMTg0LjYKKzE3OC4xCisxODMuMgorMTgwLjIKKzE5MS4zCisxODAuMAorMTc2LjIKKzE4MC4zCisxODEuOAorMTg3LjQKKzE4MS43CisxNzcuMQorMTgyLjkKKzE5MC42CisxODMuOQorMTc3LjkKKzE4Ny40CisxNzQuOQorMTg2LjQKKzE5Mi4wCisxOTAuMgorMTk4LjQKKzE4My42CisyMDYuMworMTg0LjIKKzE4MS4wCisxOTUuNgorMjc3LjIKKzE4OS45CisxODcuMAorMTk2LjYKKzE4MC42CisxODMuMAorMjA4LjgKKzE5My4xCisxODguOQorMTg2LjQKKzE3OS45CisxODEuNworMTg1LjIKKzE4OS41CisxODguMAorMTgxLjIKKzE4Mi41CisxODMuNQorMTkwLjMKKzE3OS4zCisxODIuMworMTc5LjUKKzE4NC4yCisxOTMuMworMTc4LjUKKzE3OC41CisxODIuMworMTg0LjcKKzE4MS45CisxODUuMAorMTgxLjYKKzE4MC4wCisyMDIuNgorMTc4LjkKKzE3Ni40CisxODUuMAorMTkwLjMKKzE3OS40CisxODIuOQorMTk0LjEKKzE4NS4yCisxOTguNgorMTc3LjYKKzE4MS4xCisxNzkuOAorMTgzLjEKKzE4Ny43CisxODcuNQorMTg1LjkKKzE5MS4yCisxODMuMQorMTg0LjYKKzE5My4wCisxOTcuNgorMTgzLjMKKzE4NC40CisxODEuNgorMTg0LjkKKzE3OC4wCisxNzcuNAorMTgxLjAKKzE3OC45CisxODAuNAorMTgxLjQKKzE4OC4wCisxNzguMgorMTgxLjIKKzE3OS4wCisxODguMQorMTc2LjAKKzE3Ni40CisxNzkuNgorMTc5LjEKKzE4Mi4yCisxODUuNgorMTc2LjIKKzE4MC4wCisxOTUuNAorMTc3LjQKKzE4NS4yCisxNzcuNQorMTgxLjMKKzE4Ny44CisxNzYuNworMjAwLjgKKzE3OS44CisxODMuOAorMTc5LjkKKzE5MC40CisxODAuMworMTc4LjUKKzE4Mi43CisxODAuMworMTc5LjEKKzE3OC44CisxODQuMworMTc2LjcKKzE4MS44CisxNzkuOQorMTc1LjcKKzE4MS42CisxODQuNQorMTgzLjMKKzIxNC4zCisxNzUuNworMTg4LjgKKzE4MC4xCisxNzkuOQorMTgyLjgKKzE3NS4wCisxNzcuNAorMjE3LjUKKzE4My43CisxNzguMworMTg0LjAKKzE4Mi4yCisxNzUuNAorMTg0LjAKKzE4MS4yCisxODQuNQorMTc0LjYKKzE3Ni4wCisxODAuMQorMTczLjYKKzE5MC40CisxNzcuNQorMTgxLjMKKzE3Ni4xCisxODEuNQorMTk5LjIKKzE3Ni4yCisxODYuMAorMTc4LjYKKzE4Ni45CisxODcuMQorMTcyLjgKKzE3NS41CisxODIuMQorMTc1LjkKKzIwMC40CisxOTMuMQorMTc4LjAKKzE3Ny4xCisxODAuNgorMTgyLjIKKzE3OS4wCisxNzUuOAorMTgyLjAKKzE4OC4wCisxODAuMQorMjA3LjEKKzE4Ny4wCisxODAuNgorMTgzLjgKKzE5Mi45CisxNzUuNworMTkzLjYKKzE3OC4zCisxODIuMgorMTc5LjkKKzE3Ny4yCisxODEuMworMTc3LjAKKzIwMS4xCisxNzYuMgorMTc1LjUKKzE4My4xCisxODEuMworMTc2LjAKKzE4Ny43CisxODUuNworMTc5LjIKKzE4My40CisxODQuOAorMTc2LjMKKzE3OS4zCisxNzUuMgorMTg1LjQKKzE4MS4yCisxNzcuMgorMTc5LjkKKzE3NS4xCisxNzUuNworMTkzLjgKKzE3OS43CisxODQuNgorMTgxLjIKKzE4Ny44CisxODQuOQorMTgyLjMKKzE4NC45CisxODEuNworMTg2LjAKKzE4Ny4wCisxNzguNQorMTc0LjkKKzE4MC43CisxODguOQorMTgxLjQKKzE4MS4zCisxNzYuMgorMTgyLjAKKzE4My40CisxODEuMworMTgxLjMKKzE3NS4wCisxNzkuNworMTg2LjYKKzE4My43CisxODUuMQorMTgwLjgKKzE3OS42CisxODAuNgorMTkzLjYKKzE4Ny42CisxODEuMAorMTc2LjMKKzE5MS4wCisxNzcuNQorMTg2LjkKKzE3My44CisxODQuMQorMTc4LjEKKzE4My4yCisxODAuMgorMTk0LjIKKzE3NS44CisxODMuNgorMTc1LjQKKzE3Ni42CisxODMuNworMTc3LjkKKzE3Ni40CisxODAuOAorMTc5LjkKKzE3Ny45CisxODMuMAorMTc2LjkKKzE4MS4zCisxODIuMgorMTgyLjMKKzE4My44CisxODEuMQorMTgwLjYKKzE4OS45CisxODUuNgorMTg0LjUKKzE4NS4zCisxNzUuMworMTkyLjQKKzE5NS41CisxODguMgorMTgwLjMKKzE5Ni4zCisxODQuMQorMTc4LjcKKzE3OS43CisxODcuMAorMTc3LjEKKzE4MC43CisxNzcuNQorMTc3LjEKKzE4MC44CisxODIuMAorMTc3LjAKKzE3Ny4wCisxOTMuMQorMTk0LjYKKzE5MC4wCisxODMuNQorMTgwLjUKKzE3OC40CisxNzcuNAorMTc4LjcKKzE4NC42CisxODkuNgorMTg4LjEKKzE4Ni4xCisxODQuMgorMTc4LjkKKzE3Ni43CisxOTUuOAorMTc4LjEKKzE4Ny42CisxNzUuNAorMTgwLjMKKzE4NS4zCisxODkuMAorMTc3LjIKKzE4OC45CisxNzkuMAorMTg0LjAKKzE3OS4xCisxODcuMworMTk5LjcKKzE3OC4yCisxNzkuMQorMTc1LjgKKzE3OS44CisxNzguOAorMTk2LjMKKzE4NS4wCisxOTYuMworMTgxLjEKKzE4NS41CisxNzUuOAorMTg5LjIKKzE3OS40CisxOTIuMAorMTgyLjYKKzE3Ny45CisxODEuMQorMTc5LjYKKzE4NC4yCisxOTQuNgorMTg1LjkKKzE4MS40CisxNzYuNQorMTc4LjMKKzE3Ni4zCisxNzkuMQorMTc1LjMKKzE4MC41CisxODYuNworMTc3LjUKKzE5Mi4zCisxODcuNworMTc4LjQKKzE4OS40CisxODAuNAorMTgwLjUKKzE4OS45CisxODMuOAorMTkwLjMKKzE5NS41CisxODUuNgorMTc3LjIKKzE3Ny43CisxNzguNworMTg5LjkKKzE4My44CisxOTMuMQorMTg1LjIKKzE4MC41CisxODAuNQorMTkxLjYKKzE3NS4wCisxNzYuNgorMTc4LjYKKzE4OC44CisxODAuNworMTg1LjUKKzE4MS4yCisxOTkuNQorMTkzLjIKKzE5My44CisxODUuOAorMTgyLjAKKzE3OC41CisxODguNworMTkwLjEKKzE3OC43CisxODEuNQorMTgwLjkKKzE4Ni42CisxODkuOAorMTk0LjQKKzE4MC4xCisxOTMuMAorMTc4LjIKKzE4My4yCisxODIuNgorMTc3LjgKKzIxMi4yCisxNzcuNQorMTc4LjUKKzE4MS45CisxODUuOAorMTc3LjIKKzE4Mi45CisxNzYuNworMTc1LjEKKzE4MC40CisxODYuMAorMTc5LjEKKzE3OS41CisxNzcuMgorMTgyLjEKKzE3Ny44CisxODAuMQorMTgwLjEKKzE3Ny45CisxODMuNgorMTg5LjIKKzE5My4yCisxNzkuNgorMTc2LjkKKzE4MS4zCisxNzguNAorMTc3LjQKKzE4OS4yCisxODIuMQorMTk1LjIKKzE5My4wCisxODQuNQorMTgwLjQKKzE4NC4xCisxNzYuMgorMTgwLjEKKzE3OS4wCisxNzQuOAorMTgxLjEKKzE5MC4wCisxNzkuOQorMTkyLjIKKzIwNC45CisxNzkuMgorMTgwLjUKKzE3NC43CisxODEuNgorMTgxLjUKKzE4NS4xCisxNzYuNworMTg0LjkKKzE5MS45CisxODIuMgorMTgyLjcKKzIxMC41CisxODYuMQorMTgxLjEKKzE3OS4zCisxODYuNAorMTc2LjAKKzE3Ny40CisxODAuOQorMTg3LjAKKzE5Mi4yCisxODIuOQorMTgyLjIKKzE4NC4wCisxODAuMworMTc3LjQKKzE3OC43CisxNzYuOAorMTc2LjQKKzE3Ni4xCisxODIuMAorMTc4LjgKKzE3NS4yCisxODcuNgorMTg0LjkKKzE4NC4zCisxODguNworMTc4LjMKKzE5MC45CisxODYuMworMTc1LjIKKzE4NS44CisxNzUuNgorMTg0LjgKKzE4MS4xCisxNzYuOAorMTc5LjAKKzE3OS4yCisxOTYuNQorMTc1LjAKKzE4Mi42CisxOTQuNAorMTczLjcKKzE4MC4wCisxNzguMworMTgxLjEKKzE3OS41CisxNzcuNgorMTg1LjEKKzE4My4yCisxODguNgorMTg2LjgKKzE4Mi41CisxNzYuNAorMTc1LjEKKzE3Ni45CisxODIuNAorMTgwLjEKKzE4MS43CisxODIuOAorMTg0LjEKKzE3NS43CisxNzguNworMTc3LjEKKzE3OC4zCisxNzcuMworMTc2LjcKKzE3OS44CisxNzYuOAorMTc3LjIKKzIwMC41CisxNzUuNworMTgxLjEKKzE3NC41CisxNzkuMworMTgzLjEKKzE3OC40CisxODkuMgorMTg2LjAKKzE3Ny40CisxNzguMworMTg3LjEKKzE4MS4wCisxODMuMworMTkxLjQKKzE4Mi45CisxODIuNgorMTk5LjIKKzE4MS40CisxODAuNQorMTgwLjQKKzE3Ni43CisxODQuNAorMTg5LjAKKzE4OC4xCisxOTcuMAorMTgxLjIKKzE3Ni4xCisxODEuMAorMTgwLjUKKzE3Ni41CisyMTQuOQorMTc4LjMKKzE3OC43CisxODEuNAorMTgwLjkKKzE3OC4wCisxODUuOAorMTgyLjUKKzE4MS44CisxNzcuNAorMTg2LjcKKzE4My4yCisxODMuMgorMTgzLjEKKzE3My45CisxODEuMQorMTc5LjEKKzE4MC4zCisxNzcuNworMTgxLjUKKzE3Ni41CisxNzcuMQorMTg5LjYKKzE5MS41CisxODMuMgorMTgwLjAKKzE4MC45CisxODMuMworMTg4LjMKKzE3OC40CisxODUuNAorMTc2LjEKKzE4My4yCisxODEuMQorMTgwLjMKKzE3Ni40CisxNzcuNQorMTg2LjgKKzE3Ni4zCiszMzguOQorMTg0LjkKKzE3Ny4wCisxODcuMQorMTc1LjgKKzE4MC4wCisxODIuNQorMTg0LjkKKzE3NS4yCisxNzkuNgorMTc2LjkKKzE3OC43CisxNzcuNQorMTc4LjMKKzE3OC45CisxODAuNworMTgyLjYKKzE3OS4zCisxNzcuMAorMTgwLjUKKzE3OS4yCisxNzcuMgorMTg4LjAKKzE5NC44CisxODMuNgorMTc3LjMKKzE3OS4xCisxODUuMworMTc3LjUKKzE4Ny42CisxODAuOQorMTg4LjAKKzE3NC44CisxODMuNgorMTgzLjAKKzE4Mi45CisxNzguMQorMTgyLjAKKzE4NS45CisxNzYuNQorMTgyLjEKKzE4OC41CisxNzkuOQorMTc2LjAKKzE4NC4zCisxODUuOQorMTc5LjIKKzE4NC4zCisxODEuMworMTg2LjMKKzE4Ni43CisxNzcuNQorMTg4LjkKKzE3OC44CisyMTEuMworMTg4LjAKKzE3OC41CisxOTIuNgorMTc2LjQKKzE4Ny4xCisxODkuNQorMTk1LjcKKzE4OC41CisxODUuMQorMTgyLjUKKzE3Ni42CisxODIuNQorMTg3LjMKKzE4MC41CisxOTEuOQorMTc4LjMKKzE3Ny4xCisxODguMworMTgxLjAKKzE3OC4wCisxODcuMQorMTc1LjEKKzE4Mi4zCisxNzcuNAorMTc3LjYKKzE4MS4yCisxNzkuMgorMTgzLjgKKzE4My4yCisxNzMuMworMTc3LjYKKzE3OC42CisxNzkuNAorMTgwLjUKKzE4My45CisxNzYuMworMTc4LjQKKzE3OC45CisxNzUuOQorMTc5LjIKKzE3NS40CisxODMuNQorMTg4LjkKKzE3Ni41CisxODUuOAorMTc5LjcKKzE5Ni44CisxODUuOQorMTc4LjQKKzE3Ni40CisxNzcuNgorMTc2LjAKKzE3Ny45CisxODEuNworMTc2LjIKKzE4MC42CisxNzkuOQorMTg2LjAKKzE3Ny4yCisxNzguOQorMTc5LjEKKzE4Ni42CisxNzYuMAorMTk0LjYKKzE3OS4yCisxODEuNQorMTc2LjIKKzE3Ny4yCisxNzkuMworMTgxLjMKKzE3OS4yCisxODEuNworMTc3LjUKKzE4Ni42CisxNzkuNQorMTc3LjQKKzE3OS40CisxNzcuOQorMTgxLjkKKzE4MS4zCisxNzcuNAorMTc2LjAKKzE3Ny44CisxODUuMgorMTgwLjgKKzE4MS4zCisxODIuMQorMTc4LjIKKzE3OS41CisxODUuNgorMTc5LjUKKzE4Mi41CisxODYuMQorMTg4LjcKKzE3OC43CisxODYuOAorMTc5LjIKKzE5Ny43CisxODAuOAorMTgxLjQKKzE3OC4xCisyMDcuMQorMTgyLjcKKzE4NS41CisxODYuMQorMTgwLjEKKzE3Ni4xCisxNzcuNgorMTc0LjkKKzE3Ni4xCisxODAuNgorMTg0LjUKKzE3OS4yCisxODYuMQorMTgwLjUKKzE3OS41CisxNzkuMworMTgyLjIKKzE4MS44CisxODQuNgorMTgwLjAKKzE3Ny4xCisxNzYuNworMTc3LjYKKzE4MC44CisxNzYuNQorMTc3LjMKKzE3Ni44CisxNzYuNAorMTg4LjcKKzE4Ny42CisxNzguNQorMTc4LjAKKzE3OS4zCisxODEuNAorMTgzLjIKKzE5My44CisxNzguMworMTgxLjIKKzE4MC40CisxODMuNQorMTc5LjgKKzE3Ny40CisxODMuMgorMTgzLjMKKzE3Ni42CisxNzYuMgorMjE2LjkKKzE3Ny44CisxNzcuMAorMTc4LjAKKzE3NS4zCisxODkuNAorMTgyLjYKKzE4Mi45CisxODMuNgorMTgwLjQKKzE3Ny4yCisxNzYuMAorMTc3LjkKKzE3NS4xCisxODIuMQorMTc4LjMKKzE3OC41CisxODYuMgorMTc3LjcKKzE3OC4wCisxODMuMworMTgwLjQKKzE5Ny42CisxODEuNworMTc5LjkKKzE4NC4wCisxOTQuOAorMTg0LjgKKzE4OS40CisxOTEuOAorMTc2LjYKKzE4Ni4yCisxODAuMworMTc3LjcKKzE5Ny4wCisxODcuMAorMTg4LjEKKzE5MC4xCisxNzYuOAorMTc5LjMKKzE4NS40CisxNzQuNworMTg5LjYKKzE4NC4yCisxNzguMAorMTgwLjQKKzE4My40CisxNzkuNQorMTc3LjcKKzE3OC43CisxODYuOQorMTgzLjcKKzE3Ny4yCisxNzMuNgorMTg0LjcKKzE4MC40CisxODMuMQorMTc1LjYKKzE3OS42CisxODQuOAorMTg1LjYKKzE3Ni4yCisxNzcuNworMTgwLjAKKzE3NC43CisxODMuMQorMTgxLjYKKzE3OC4wCisxNzguOAorMTg1LjQKKzE4MS4yCisxNzguMAorMTg4LjcKKzE3Ny4xCisxODkuMworMTc3LjYKKzE4MC42CisxODEuNgorMTc1LjkKKzE4MC43CisxNzkuMQorMTgyLjQKKzE4Ni43CisxNzUuOAorMTg1LjEKKzE3Ni43CisxODAuMworMTk1LjcKKzE5MS4zCisxOTEuMQorMTgxLjMKKzE4MC41CisxNzkuMworMTg0LjMKKzE3Ny4xCisxODIuNAorMTc5LjQKKzE4OC44CisxNzQuNQorMTc3LjIKKzE3OC40CisxNzkuOAorMTgzLjMKKzE3NS40CisxODQuMQorMTc2LjgKKzE4Mi40CisxNzcuOAorMTc4LjcKKzE3OC42CisxODkuNgorMTgyLjAKKzE5MS4yCisxNzkuOAorMTc5LjMKKzE3OC42CisxODMuMAorMTg4LjgKKzIwNS4zCisxODAuMQorMTkwLjYKKzE4NC40CisxNzkuOQorMTc4LjYKKzE3NC43CisxODAuNgorMTkzLjMKKzE3NS4zCisxNzUuNQorMTkzLjkKKzE4MC40CisxNzcuMgorMTc1LjYKKzE3Ny4wCisxODIuMworMTgzLjUKKzE4MS45CisxNzkuNgorMTgyLjgKKzE4MC45CisxODAuNgorMTgzLjcKKzE4NS4wCisxNzYuNworMTkwLjUKKzE3Ni4yCisxNzkuMAorMTc4LjgKKzE4MC4wCisxODEuNQorMTc0LjMKKzE3Ny4zCisxNzkuMgorMTc4LjMKKzE4NC43CisxNzQuMgorMTc3LjMKKzE3OC4wCisxNzguOQorMTgyLjkKKzE4OS44CisxODMuMworMTgzLjAKKzE4Mi41CisxNzYuMworMTc2LjgKKzE3Ny41CisxNzYuMgorMTgzLjEKKzE3NS40CisxNzUuMAorMTgyLjUKKzE3NC45CisxODUuOAorMTgxLjQKKzE3OC40CisxODMuOAorMTc4LjAKKzI2NS4wCisxNzguNQorMTg1LjAKKzE3Ny40CisxNzkuMgorMTc1LjgKKzE4My4wCisxODQuNQorMTk1LjMKKzE3OC41CisxNzguMgorMTc5LjcKKzE3NS4wCisxODcuNQorMTgyLjcKKzE4MC4zCisxODEuMAorMTc3LjUKKzE4MS41CisxNzkuOQorMTc5LjAKKzE4MC4wCisxODIuNgorMTc4LjUKKzE3OS42CisxODEuNAorMTg4LjAKKzE4OC4yCisxNzkuMQorMTgwLjgKKzE3OC41CisxODEuMworMTc5LjkKKzE4Mi4wCisxODEuOAorMTgxLjMKKzE4Ni42CisxOTcuOAorMjA1LjgKKzE4OC4yCisxOTQuOQorMTgyLjIKKzE4NC42CisxODguOQorMTg5LjQKKzE4My40CisxNzkuMgorMTgyLjYKKzE4NC42CisxODMuNgorMTg0LjMKKzE4Mi41CisxODEuMQorMTgxLjYKKzE3OC45CisxNzkuNworMTc2LjMKKzE3OS40CisxODAuMgorMTc4LjQKKzE3OS42CisxOTAuMQorMTc4LjUKKzE3NC40CisxNzcuMworMTc2LjEKKzE3NS4zCisxNzUuMAorMTc4LjkKKzE3NS4xCisxODEuMworMTc1LjAKKzE3Ni4wCisxOTIuMgorMTg5LjIKKzE4Mi40CisxNzkuMgorMTczLjQKKzE3Ny45CisxNzguNAorMTc1LjUKKzE3NS45CisxOTkuMAorMTk2LjYKKzE4MS43CisxODEuMgorMTc3LjYKKzE3NC43CisxNzQuMworMTgxLjMKKzE3OC45CisyMDMuMgorMTc2LjMKKzE3NS44CisxOTIuMworMTgwLjgKKzE4NC44CisxNzkuOQorMTgyLjQKKzE4MC4wCisxNzQuMworMTg3LjIKKzE4MS40CisxNzYuMAorMTc0LjQKKzE4Mi40CisxODYuOAorMTkxLjEKKzE3Ny4xCisxNzguMgorMTc2LjgKKzE4Mi42CisxODQuNgorMTgxLjUKKzE4NS40CisxNzguOQorMTc2LjYKKzE3OS42CisxNzUuMQorMTc5LjkKKzE3Ni45CisxNzYuNworMTg2LjIKKzE5Mi45CisxODMuNQorMTgyLjQKKzE3NS41CisxNzYuOQorMTgwLjYKKzE4NS43CisxNzQuMgorMTc0LjIKKzE3OC45CisxNzguOAorMTc5LjIKKzE5NC45CisxNzcuNQorMTc0LjAKKzE3OS4wCisxODAuNworMTc0LjAKKzE4MC4wCisxNzguMworMTc5LjgKKzE4MC4wCisxNzUuNgorMTc0LjkKKzE4MC45CisxNzcuMworMjEyLjYKKzE5Ni4wCisxODMuMQorMTg2LjUKKzE3OC40CisxODUuOQorMTg1LjUKKzE3Ni44CisxNzguNworMTc0LjAKKzE3Ni42CisxNzkuMAorMTgyLjMKKzE3Ni42CisxODUuMAorMTc1LjcKKzE3OC41CisxNzYuNAorMTc2LjMKKzE4Ni4zCisyMjIuNQorMTg1LjcKKzE3Ny4xCisxODMuNgorMTc2LjkKKzE4NC4wCisxNzUuNworMTc0LjQKKzE4NC4yCisyNjkuOAorMTgyLjUKKzE3NC42CisxNzguNQorMTc2LjEKKzE3OC45CisxNzcuOQorMTgxLjkKKzE3Ni44CisxNzQuMgorMTgxLjYKKzE5MS4yCisxNzkuMQorMTc1LjMKKzE4Mi4yCisxODAuMQorMTc1LjIKKzE4Mi4zCisxNzUuNgorMTc3LjEKKzE3NS4xCisxNzQuNworMTg4LjIKKzE3Ni45CisxODMuNgorMTc1LjkKKzE3NS41CisxNzQuNworMTgyLjQKKzE4MS4yCisxNzkuNQorMTkwLjMKKzE4NC44CisyMzcuMQorMTc4LjMKKzE3OC43CisxODQuMQorMTc0LjUKKzE3OC4zCisxNzguNgorMTgxLjgKKzE4Mi4yCisxOTAuMgorMTc5LjkKKzE4MS4wCisxODAuMworMTc3LjIKKzE3OS4yCisxNzkuMgorMTc4LjIKKzE4My4wCisxNzcuNworMTgwLjEKKzE4Mi42CisxOTYuNgorMTc4LjkKKzE3Ny4wCisxNzYuMQorMTc4LjMKKzE4Mi45CisxNzYuNQorMjA5LjQKKzE4MS4xCisxOTkuNQorMTg2LjMKKzE3Ny42CisxODIuNworMTg1LjQKKzE4MC4yCisxODYuMgorMTg3LjQKKzE3Ni40CisxODIuOAorMjIxLjAKKzE3OS4wCisxNzguOQorMTc4LjQKKzE4Ni44CisxNzQuMQorMTc0LjkKKzE3Ni44CisxOTAuMAorMTc4LjkKKzE4Mi40CisxNzguNworMTc3LjYKKzE3OS40CisxNzMuNgorMTc4LjEKKzE3OS44CisxNzcuOAorMTc3LjUKKzE4Ny41CisyMDkuNQorMTc4LjAKKzE3Ny4yCisxNzkuMworMTc5LjgKKzE3OS44CisxNzQuNAorMTc3LjEKKzE4MC4yCisxODIuNQorMTgxLjEKKzE4NC43CisxNzkuNgorMTkzLjAKKzE4Mi43CisxODEuNgorMTc3LjcKKzE3OC4yCisxODEuNgorMTg2LjYKKzE3Ny4yCisxNzguMQorMTg5LjMKKzE3NC4zCisxODAuMgorMTg2LjIKKzE4OS44CisxODUuOQorMTc2LjgKKzE3OC44CisxNzUuMQorMTc1LjUKKzE3OS4xCisxODAuOQorMTg2LjEKKzE4Ny4wCisxODYuMgorMTg3LjYKKzE4Ny41CisxOTcuOAorMTgwLjQKKzE5Ni43CisxNzYuNQorMTc3LjYKKzE3Ni4yCisxODAuOAorMTc1LjkKKzE4Mi44CisxNzguOAorMTg0LjYKKzE3OS41CisxNzUuNgorMTg3LjUKKzE3NS43CisyMDEuNgorMTg4LjIKKzE4My40CisxODQuMgorMTc4LjcKKzE3Ny4wCisxNzQuOQorMTgxLjkKKzE3Ny42CisxNzcuNworMTc5LjYKKzE3Ni4wCisxNzguMworMTgxLjUKKzE3Ny41CisxODQuNworMTgzLjkKKzE4MC45CisxNzguOQorMTc3LjgKKzE3Ni42CisxODguNAorMTkxLjAKKzE4OS42CisxNzguMQorMTc3LjkKKzE4Ni4xCisxNzguNworMTg0LjMKKzE3Ni41CisxNzkuNgorMTc0LjEKKzE4NC40CisxNzYuOAorMTgyLjMKKzE3OS41CisxODguOAorMTgwLjIKKzE3Ni4xCisxOTguNAorMTc4LjQKKzE4OC42CisxOTEuMAorMTgwLjQKKzE3OS41CisxNzYuMAorMTg4LjEKKzE4OS42CisxOTIuNgorMTc3LjAKKzE4OS4xCisxNzcuNQorMTc4LjgKKzE4Ni44CisxNzguNgorMTgwLjUKKzE4NC4wCisxNzguNworMTc5LjAKKzE3Ni4yCisxNzYuNworMTg1LjIKKzE5Mi4zCisxNzguMAorMTc1LjcKKzE4MS4wCisxODMuMAorMTc1LjcKKzE3NC42CisxNzYuNworMTc3LjgKKzE3OS4wCisxNzcuNAorMTc2LjcKKzE4Mi41CisxOTQuMAorMTgxLjQKKzE3OC43CisxNzYuMgorMTc2LjcKKzIwNC4yCisxNzguMworMTkwLjYKKzE4OC41CisxNzcuNQorMTgwLjYKKzE3OC4xCisxNzUuMgorMjc2LjgKKzM1My42CisyOTcuOAorMjM1LjEKKzIxMS43CisyMTMuNAorMjEzLjUKKzE5MS41CisxNzguOAorMTg2LjIKKzE3NS40CisxNzguMgorMTg0LjUKKzE3OS45CisxODIuMAorMTc5LjMKKzE3OC42CisxOTIuNQorMTc3LjcKKzE3OS4yCisxOTQuOQorMTgzLjEKKzE3OC42CisxNzkuOQorMTkyLjUKKzE4NC4xCisxODYuNgorMTgxLjIKKzE3NS40CisxOTcuMgorMTc5LjYKKzE4NC42CisxOTcuNgorMTgwLjYKKzE4OS42CisxNzUuMworMTg1LjYKKzE3NC41CisxNzguOQorMTc0LjIKKzE3OS42CisxNzMuOQorMTgyLjUKKzE4NS42CisxNzcuNAorMTkxLjQKKzE4My44CisxNzcuMAorMTgxLjIKKzE3Ni4zCisxNzcuMworMTczLjcKKzE3Ny41CisxNzguOQorMTc4LjIKKzE3Ny4zCisxNzcuNworMTg3LjgKKzE4MS42CisxNzguNAorMTc2LjQKKzE4MC44CisxNzguNQorMTg5LjUKKzE4Ni4wCisxODguNAorMTgyLjIKKzE4NC4wCisxNzYuNQorMTc5LjUKKzE4NS4zCisxNzMuOAorMTkwLjAKKzE4MC4yCisxODkuMQorMTg0LjkKKzE3NS44CisxODIuMgorMTc3LjkKKzE3Ni40CisxODQuMQorMTc5LjUKKzE4MS44CisxNzUuNworMTc5LjcKKzE3OC43CisxODUuOQorMTgwLjUKKzE4MC45CisxNzUuNQorMTc2LjEKKzE3NC40CisxNzUuMQorMTk1LjIKKzE3NC45CisxOTAuNQorMTgzLjgKKzE4OC43CisxODIuNQorMTc5LjUKKzE3Ny4wCisxNzQuOQorMTg1LjYKKzE4MC44CisxOTIuOAorMTg1LjIKKzE4NC4wCisxNzcuNworMTkxLjcKKzE4NS4zCisxODUuNAorMTg2LjYKKzE4Mi45CisxODEuMQorMTkxLjIKKzE4My4wCisxNzYuNgorMTg3LjcKKzE4MS45CisxNzkuNQorMTc4LjcKKzE3Ni45CisxNzguNQorMTgyLjEKKzE3NS40CisxNzUuOQorMTgzLjgKKzE4MC42CisxOTEuMQorMTc3LjAKKzE4NC42CisxODguNworMTc2LjAKKzE4MS40CisxODguMgorMTgxLjEKKzE4MC4wCisxNzguOQorMTgyLjEKKzE3OS42CisxNzkuNQorMTc0LjUKKzE3Ny42CisxNzkuOQorMTc1LjMKKzE4NS4yCisxNzUuNAorMTg1LjEKKzE4NC45CisxODIuMAorMTc4LjQKKzE3Ny4wCisxODIuMworMTkzLjgKKzE4MS42CisxOTcuNAorMTgwLjQKKzE4MC45CisxODIuMAorMTgxLjAKKzE4NS44CisxNzguNQorMTgwLjUKKzE4Mi4zCisxNzUuNworMTc2LjUKKzE4Mi44CisxNzYuOAorMTc4LjMKKzE3OS41CisxODEuOAorMTc1LjEKKzE4MC4yCisxNzkuNgorMTc2LjcKKzE3NC42CisxODAuNQorMTc5LjcKKzE3OC45CisxNzcuMQorMTg0LjIKKzE3OC40CisxNzUuMAorMTgzLjcKKzE3OC4zCisxNzkuMQorMTc1LjMKKzE4Ny41CisxODkuMgorMTc2LjcKKzIwNS42CisxNzkuNgorMTc5LjYKKzE3OS4xCisxODIuMQorMTc4LjYKKzE4Mi4yCisxODEuNgorMTgxLjkKKzE4OC44CisxODQuNworMTg1LjMKKzE4Mi41CisxNzQuMgorMTc2LjUKKzE5MC4xCisxODAuNgorMTgyLjcKKzE4Mi4yCisxNzkuNQorMTc5LjAKKzE4NC40CisxNzUuNAorMTc4LjIKKzE3NC42CisxNzkuMAorMTg4LjQKKzE3NS45CisxNzMuOAorMTgwLjIKKzE4Ny4zCisxODYuMworMTc2LjMKKzE3NC45CisxNzguNgorMTc4LjIKKzE3Ny4wCisxODAuMAorMTc3LjIKKzE3My41CisxOTUuNAorMTgwLjUKKzE4MS42CisxNzcuMgorMTc2LjcKKzE3NS4zCisxNzQuOAorMTc5LjcKKzE3NS4wCisxNzYuNAorMTgxLjgKKzE4My4wCisxODAuMAorMTc3LjAKKzE4NS44CisxODMuMgorMTgxLjAKKzE3Ni44CisxNzcuOQorMTg2LjEKKzE4Mi41CisxNzQuNAorMTc3LjEKKzE3Ni43CisxNzYuMworMTgwLjMKKzE3OC45CisxNzguMworMTc1LjgKKzE3OS45CisxOTAuNgorMTgyLjgKKzE4My40CisxNzcuOQorMTc3LjcKKzE4MC4wCisyMDIuMAorMTg0LjUKKzE3OS41CisxODEuNQorMTc0LjgKKzE5NC4yCisxODUuOAorMTc3LjAKKzE4My45CisxNzcuNgorMjAyLjQKKzE3OS45CisxNzUuNAorMTc0LjgKKzE3Ni43CisxNzcuOQorMTc2LjYKKzE3Ni41CisxODEuMgorMTgxLjMKKzE3Ny40CisxNzkuMworMTc3LjgKKzE3Ni4yCisxOTcuMgorMTgwLjkKKzE3OC4yCisxODQuNgorMTg0LjcKKzE5MS4wCisxODIuOQorMTc5LjkKKzE4MC4zCisxNzcuNAorMTgyLjEKKzE4MS45CisxODIuMgorMTc0LjkKKzE5My40CisxNzUuMQorMjAzLjIKKzE3Ni4wCisxODAuMworMTgwLjAKKzE4Ni4zCisxNzQuOAorMTc3LjkKKzE5Ni4xCisxNzcuNgorMTgzLjUKKzE3Ni4yCisxODcuNgorMTc4LjUKKzE4MC42CisxNzguMgorMTgwLjcKKzE3Ny42CisxNzYuNgorMTczLjUKKzE3OC43CisxNzUuMAorMTc5LjAKKzE3NS41CisxNzQuMgorMTc4LjIKKzE3Ni42CisxNzYuMworMTc5LjQKKzE3OC42CisxNzUuMgorMTc1LjkKKzE3NS4wCisxNzkuNQorMTc2LjkKKzE4NC4wCisxODQuNgorMTc5LjkKKzE3NS4zCisxNzYuMgorMTc5LjEKKzE4Mi44CisxODAuNQorMTczLjQKKzE3Ni4wCisxOTguOQorMTc3LjAKKzE4OS43CisxODMuNgorMTc5LjUKKzE3Ni41CisxNzUuNQorMTc1LjUKKzE3Ni40CisxODIuOQorMTc4LjcKKzE3Ny41CisxODAuNgorMTc1LjAKKzE3OC45CisxNzcuNworMTc4LjAKKzE3OC42CisxNzYuMAorMTc3LjYKKzE4MC44CisxNzkuNgorMTg0LjMKKzE5MC4yCisxNzcuNworMTc4LjEKKzE3NS4wCisxNzguNgorMTc5LjYKKzE4NS4xCisxOTMuNworMTc5LjgKKzE3OS4zCisxNzguNgorMTgwLjQKKzE3NC45CisxNzcuOAorMTg3LjQKKzE4My43CisxODEuNgorMTc3LjcKKzE4NS40CisxODAuNgorMTc4LjUKKzE4Mi44CisxNzkuOQorMTc3LjgKKzE3OC4wCisxODQuMworMTkxLjAKKzE4MS4xCisxOTcuOQorMTgxLjEKKzE5Ny44CisxNzUuNgorMTc2LjkKKzE3Ny45CisxODcuNAorMTgwLjgKKzE4MC42CisxNzQuOQorMTgwLjgKKzE3NS43CisxNzYuNAorMTc5LjkKKzE3OC4zCisxNzguMworMTc4LjQKKzE5Ni40CisxNzcuMworMTg0LjMKKzE3Ny4zCisxNzYuNQorMTgxLjAKKzE3NS4wCisxNzkuMgorMTc4LjEKKzE4My4zCisxNzcuMAorMTc1LjIKKzE3Ny4yCisxNzMuNQorMTc2LjUKKzE3Ny4wCisxNzguNgorMTgxLjMKKzE4OS4yCisxODYuNAorMTc3LjQKKzE4MS43CisxNzYuMgorMTk0LjEKKzE3Ny45CisxODYuNgorMTgyLjYKKzE3Ni42CisxNzUuNAorMjUwLjMKKzE3OC43CisxODMuMAorMTgyLjcKKzE4My4xCisxODMuNgorMTc4LjgKKzE3OC4zCisxNzkuMQorMTc3LjcKKzE3Ny45CisxODYuMgorMTk1LjQKKzE3OS4yCisxODMuMworMTgzLjgKKzE4Ni4zCisxODIuNworMTc4LjkKKzE5Ni4wCisxNzcuMQorMTg0LjUKKzE4OC4zCisxODguNAorMTgxLjUKKzE5MC4xCisxNzkuMAorMTc3LjIKKzE4OS4xCisxODQuMQorMTg0LjIKKzE3OC43CisxODcuNAorMTgyLjUKKzE4OS44CisxODEuMQorMTg2LjAKKzE3OC44CisxNzguMAorMTc2LjkKKzE4MC42CisxNzQuMworMTgwLjQKKzE3Ni43CisxNzUuNQorMTkzLjcKKzE4OS43CisxOTYuNgorMTc4LjkKKzE4Ni4zCisxODIuNQorMTg1LjcKKzE3NS43CisxNzYuMAorMTk0LjEKKzE4MS4wCisxNzguNgorMTc4LjQKKzE4Ni44CisxNzUuNgorMTg1LjQKKzE4MC43CisxODQuNworMTg4LjEKKzE4MC40CisxODMuMAorMTc4LjQKKzE4NS4xCisxODEuOAorMTc1LjgKKzE3OC45CisxNzcuOQorMTc3LjkKKzE3Ni41CisyOTAuMworMTgxLjgKKzE4MC44CisxODMuOQorMTkwLjgKKzE3OS4wCisxODMuNworMTgxLjkKKzE3Ny41CisxNzguNAorMTc5LjQKKzE3OS45CisxNzQuMgorMTgyLjcKKzE4Mi45CisxNzguOAorMTc5LjIKKzE4My4yCisxODEuOAorMTc1LjYKKzE3OS4wCisxNzUuNworMTc4LjEKKzE3OS4yCisxODMuOAorMTg3LjgKKzE4Ny4zCisxNzUuNworMTc1LjAKKzE4NS41CisxNzUuMworMTgxLjkKKzE3Ni43CisxODQuNgorMTg1LjgKKzE4MS4xCisxODYuNgorMTc4LjgKKzE4My40CisxNzUuMQorMTc4LjQKKzE3OS42CisxNzYuNworMTc3LjEKKzE3Ni41CisxODEuNworMTk5LjEKKzE5NC44CisxNzYuNQorMTgyLjIKKzE4OS45CisxNzcuNgorMTc5LjMKKzE4NC45CisxNzguMQorMTc2LjQKKzE4NC42CisxNzQuNgorMTg4LjYKKzE4My43CisxNzguMQorMTc3LjcKKzE4Ni4xCisxNzYuMworMTgwLjkKKzE4MC4zCisxODEuMAorMTgwLjAKKzE4MC4wCisxODAuNAorMTc0LjgKKzE3OS41CisxNzYuNQorMTc5LjkKKzE3NS42CisxODQuMAorMTc2LjQKKzE5MS42CisxNzguNAorMTg0LjgKKzE4Ni43CisxOTcuMApkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvbmV0ZW0vbWFrZXRhYmxlLmMgYi9pcHJvdXRlMi9uZXRlbS9tYWtldGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTQ1MmI2Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbmV0ZW0vbWFrZXRhYmxlLmMKQEAgLTAsMCArMSwyMzIgQEAKKy8qCisgKiBFeHBlcmltZW50YWwgZGF0YSAgZGlzdHJpYnV0aW9uIHRhYmxlIGdlbmVyYXRvcgorICogVGFrZW4gZnJvbSB0aGUgdW5jb3B5cmlnaHRlZCBOSVNUbmV0IGNvZGUgKHB1YmxpYyBkb21haW4pLgorICoKKyAqIFJlYWQgaW4gYSBzZXJpZXMgb2YgInJhbmRvbSIgZGF0YSB2YWx1ZXMsIGVpdGhlcgorICogZXhwZXJpbWVudGFsbHkgb3IgZ2VuZXJhdGVkIGZyb20gc29tZSBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb24uCisgKiBGcm9tIHRoaXMsIGNyZWF0ZSB0aGUgaW52ZXJzZSBkaXN0cmlidXRpb24gdGFibGUgdXNlZCB0byBhcHByb3hpbWF0ZQorICogdGhlIGRpc3RyaWJ1dGlvbi4KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKworZG91YmxlICoKK3JlYWRkb3VibGVzKEZJTEUgKmZwLCBpbnQgKm51bWJlcikKK3sKKwlzdHJ1Y3Qgc3RhdCBpbmZvOworCWRvdWJsZSAqeDsKKwlpbnQgbGltaXQ7CisJaW50IG49MCwgaTsKKworCWZzdGF0KGZpbGVubyhmcCksICZpbmZvKTsKKwlpZiAoaW5mby5zdF9zaXplID4gMCkgeworCQlsaW1pdCA9IDIqaW5mby5zdF9zaXplL3NpemVvZihkb3VibGUpOwkvKiBAQCBhcHByb3hpbWF0ZSAqLworCX0gZWxzZSB7CisJCWxpbWl0ID0gMTAwMDA7CisJfQorCisJeCA9IGNhbGxvYyhsaW1pdCwgc2l6ZW9mKGRvdWJsZSkpOworCWlmICgheCkgeworCQlwZXJyb3IoImRvdWJsZSBhbGxvYyIpOworCQlleGl0KDMpOworCX0KKworCWZvciAoaT0wOyBpPGxpbWl0OyArK2kpeworCQlmc2NhbmYoZnAsICIlbGYiLCAmeFtpXSk7CisJCWlmIChmZW9mKGZwKSkKKwkJCWJyZWFrOworCQkrK247CisJfQorCSpudW1iZXIgPSBuOworCXJldHVybiB4OworfQorCit2b2lkCithcnJheXN0YXRzKGRvdWJsZSAqeCwgaW50IGxpbWl0LCBkb3VibGUgKm11LCBkb3VibGUgKnNpZ21hLCBkb3VibGUgKnJobykKK3sKKwlpbnQgbj0wLCBpOworCWRvdWJsZSBzdW1zcXVhcmU9MC4wLCBzdW09MC4wLCB0b3A9MC4wOworCWRvdWJsZSBzaWdtYTI9MC4wOworCisJZm9yIChpPTA7IGk8bGltaXQ7ICsraSl7CisJCXN1bXNxdWFyZSArPSB4W2ldKnhbaV07CisJCXN1bSArPSB4W2ldOworCQkrK247CisJfQorCSptdSA9IHN1bS8oZG91YmxlKW47CisJKnNpZ21hID0gc3FydCgoc3Vtc3F1YXJlIC0gKGRvdWJsZSluKigqbXUpKigqbXUpKS8oZG91YmxlKShuLTEpKTsKKworCWZvciAoaT0xOyBpIDwgbjsgKytpKXsKKwkJdG9wICs9ICgoZG91YmxlKXhbaV0tICptdSkqKChkb3VibGUpeFtpLTFdLSAqbXUpOworCQlzaWdtYTIgKz0gKChkb3VibGUpeFtpLTFdIC0gKm11KSooKGRvdWJsZSl4W2ktMV0gLSAqbXUpOworCisJfQorCSpyaG8gPSB0b3Avc2lnbWEyOworfQorCisvKiBDcmVhdGUgYSAobm9ybWFsaXplZCkgZGlzdHJpYnV0aW9uIHRhYmxlIGZyb20gYSBzZXQgb2Ygb2JzZXJ2ZWQKKyAqIHZhbHVlcy4gIFRoZSB0YWJsZSBpcyBmaXhlZCB0byBydW4gZnJvbSAoYXMgaXQgaGFwcGVucykgLTQgdG8gKzQsCisgKiB3aXRoIGdyYW51bGFyaXR5IC4wMDAwMi4KKyAqLworCisjZGVmaW5lIFRBQkxFU0laRQkxNjM4NC80CisjZGVmaW5lIFRBQkxFRkFDVE9SCTgxOTIKKyNpZm5kZWYgTUlOU0hPUlQKKyNkZWZpbmUgTUlOU0hPUlQJLTMyNzY4CisjZGVmaW5lIE1BWFNIT1JUCTMyNzY3CisjZW5kaWYKKworLyogU2luY2UgZW50cmllcyBpbiB0aGUgaW52ZXJzZSBhcmUgc2NhbGVkIGJ5IFRBQkxFRkFDVE9SLCBhbmQgY2FuJ3QgYmUgYmlnZ2VyCisgKiB0aGFuIE1BWFNIT1JULCB3ZSBkb24ndCBib3RoZXIgbG9va2luZyBhdCBhIGxhcmdlciBkb21haW4gdGhhbiB0aGlzOgorICovCisjZGVmaW5lIERJU1RUQUJMRURPTUFJTiAoKE1BWFNIT1JUL1RBQkxFRkFDVE9SKSsxKQorI2RlZmluZSBESVNUVEFCTEVHUkFOVUxBUklUWSA1MDAwMAorI2RlZmluZSBESVNUVEFCTEVTSVpFIChESVNUVEFCTEVET01BSU4qRElTVFRBQkxFR1JBTlVMQVJJVFkqMikKKworc3RhdGljIGludCAqCittYWtlZGlzdChkb3VibGUgKngsIGludCBsaW1pdCwgZG91YmxlIG11LCBkb3VibGUgc2lnbWEpCit7CisJaW50ICp0YWJsZTsKKwlpbnQgaSwgaW5kZXgsIGZpcnN0PURJU1RUQUJMRVNJWkUsIGxhc3Q9MDsKKwlkb3VibGUgaW5wdXQ7CisKKwl0YWJsZSA9IGNhbGxvYyhESVNUVEFCTEVTSVpFLCBzaXplb2YoaW50KSk7CisJaWYgKCF0YWJsZSkgeworCQlwZXJyb3IoInRhYmxlIGFsbG9jIik7CisJCWV4aXQoMyk7CisJfQorCisJZm9yIChpPTA7IGkgPCBsaW1pdDsgKytpKSB7CisJCS8qIE5vcm1hbGl6ZSB2YWx1ZSAqLworCQlpbnB1dCA9ICh4W2ldLW11KS9zaWdtYTsKKworCQlpbmRleCA9IChpbnQpcmludCgoaW5wdXQrRElTVFRBQkxFRE9NQUlOKSpESVNUVEFCTEVHUkFOVUxBUklUWSk7CisJCWlmIChpbmRleCA8IDApIGluZGV4ID0gMDsKKwkJaWYgKGluZGV4ID49IERJU1RUQUJMRVNJWkUpIGluZGV4ID0gRElTVFRBQkxFU0laRS0xOworCQkrK3RhYmxlW2luZGV4XTsKKwkJaWYgKGluZGV4ID4gbGFzdCkKKwkJCWxhc3QgPSBpbmRleCArMTsKKwkJaWYgKGluZGV4IDwgZmlyc3QpCisJCQlmaXJzdCA9IGluZGV4OworCX0KKwlyZXR1cm4gdGFibGU7Cit9CisKKy8qIHJlcGxhY2UgYW4gYXJyYXkgYnkgaXRzIGN1bXVsYXRpdmUgZGlzdHJpYnV0aW9uICovCitzdGF0aWMgdm9pZAorY3VtdWxhdGl2ZWRpc3QoaW50ICp0YWJsZSwgaW50IGxpbWl0LCBpbnQgKnRvdGFsKQoreworCWludCBhY2N1bT0wOworCisJd2hpbGUgKC0tbGltaXQgPj0gMCkgeworCQlhY2N1bSArPSAqdGFibGU7CisJCSp0YWJsZSsrID0gYWNjdW07CisJfQorCSp0b3RhbCA9IGFjY3VtOworfQorCitzdGF0aWMgc2hvcnQgKgoraW52ZXJ0dGFibGUoaW50ICp0YWJsZSwgaW50IGludmVyc2VzaXplLCBpbnQgdGFibGVzaXplLCBpbnQgY3VtdWxhdGl2ZSkKK3sKKwlpbnQgaSwgaW52ZXJzZWluZGV4LCBpbnZlcnNldmFsdWU7CisJc2hvcnQgKmludmVyc2U7CisJZG91YmxlIGZpbmRleCwgZnZhbHVlOworCisJaW52ZXJzZSA9IChzaG9ydCAqKW1hbGxvYyhpbnZlcnNlc2l6ZSpzaXplb2Yoc2hvcnQpKTsKKwlmb3IgKGk9MDsgaSA8IGludmVyc2VzaXplOyArK2kpIHsKKwkJaW52ZXJzZVtpXSA9IE1JTlNIT1JUOworCX0KKwlmb3IgKGk9MDsgaSA8IHRhYmxlc2l6ZTsgKytpKSB7CisJCWZpbmRleCA9ICgoZG91YmxlKWkvKGRvdWJsZSlESVNUVEFCTEVHUkFOVUxBUklUWSkgLSBESVNUVEFCTEVET01BSU47CisJCWZ2YWx1ZSA9IChkb3VibGUpdGFibGVbaV0vKGRvdWJsZSljdW11bGF0aXZlOworCQlpbnZlcnNlaW5kZXggPSAoaW50KXJpbnQoZnZhbHVlKmludmVyc2VzaXplKTsKKwkJaW52ZXJzZXZhbHVlID0gKGludClyaW50KGZpbmRleCpUQUJMRUZBQ1RPUik7CisJCWlmIChpbnZlcnNldmFsdWUgPD0gTUlOU0hPUlQpIGludmVyc2V2YWx1ZSA9IE1JTlNIT1JUKzE7CisJCWlmIChpbnZlcnNldmFsdWUgPiBNQVhTSE9SVCkgaW52ZXJzZXZhbHVlID0gTUFYU0hPUlQ7CisJCWludmVyc2VbaW52ZXJzZWluZGV4XSA9IGludmVyc2V2YWx1ZTsKKwl9CisJcmV0dXJuIGludmVyc2U7CisKK30KKworLyogUnVuIHNpbXBsZSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBvdmVyIHRoZSB0YWJsZSB0byBmaWxsIGluIG1pc3NpbmcgZW50cmllcyAqLworc3RhdGljIHZvaWQKK2ludGVycG9sYXRldGFibGUoc2hvcnQgKnRhYmxlLCBpbnQgbGltaXQpCit7CisJaW50IGksIGosIGxhc3QsIGxhc3RpID0gLTE7CisKKwlsYXN0ID0gTUlOU0hPUlQ7CisJZm9yIChpPTA7IGkgPCBsaW1pdDsgKytpKSB7CisJCWlmICh0YWJsZVtpXSA9PSBNSU5TSE9SVCkgeworCQkJZm9yIChqPWk7IGogPCBsaW1pdDsgKytqKQorCQkJCWlmICh0YWJsZVtqXSAhPSBNSU5TSE9SVCkKKwkJCQkJYnJlYWs7CisJCQlpZiAoaiA8IGxpbWl0KSB7CisJCQkJdGFibGVbaV0gPSBsYXN0ICsgKGktbGFzdGkpKih0YWJsZVtqXS1sYXN0KS8oai1sYXN0aSk7CisJCQl9IGVsc2UgeworCQkJCXRhYmxlW2ldID0gbGFzdCArIChpLWxhc3RpKSooTUFYU0hPUlQtbGFzdCkvKGxpbWl0LWxhc3RpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWxhc3QgPSB0YWJsZVtpXTsKKwkJCWxhc3RpID0gaTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK3ByaW50dGFibGUoY29uc3Qgc2hvcnQgKnRhYmxlLCBpbnQgbGltaXQpCit7CisJaW50IGk7CisKKwlwcmludGYoIiMgVGhpcyBpcyB0aGUgZGlzdHJpYnV0aW9uIHRhYmxlIGZvciB0aGUgZXhwZXJpbWVudGFsIGRpc3RyaWJ1dGlvbi5cbiIpOworCisJZm9yIChpPTAgOyBpIDwgbGltaXQ7ICsraSkgeworCQlwcmludGYoIiVkJWMiLCB0YWJsZVtpXSwKKwkJICAgICAgIChpICUgOCkgPT0gNyA/ICdcbicgOiAnICcpOworCX0KK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlGSUxFICpmcDsKKwlkb3VibGUgKng7CisJZG91YmxlIG11LCBzaWdtYSwgcmhvOworCWludCBsaW1pdDsKKwlpbnQgKnRhYmxlOworCXNob3J0ICppbnZlcnNlOworCWludCB0b3RhbDsKKworCWlmIChhcmdjID4gMSkgeworCQlpZiAoIShmcCA9IGZvcGVuKGFyZ3ZbMV0sICJyIikpKSB7CisJCQlwZXJyb3IoYXJndlsxXSk7CisJCQlleGl0KDEpOworCQl9CisJfSBlbHNlIHsKKwkJZnAgPSBzdGRpbjsKKwl9CQkJCQorCXggPSByZWFkZG91YmxlcyhmcCwgJmxpbWl0KTsKKwlpZiAobGltaXQgPD0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vdGhpbmcgbXVjaCByZWFkIVxuIik7CisJCWV4aXQoMik7CisJfQorCWFycmF5c3RhdHMoeCwgbGltaXQsICZtdSwgJnNpZ21hLCAmcmhvKTsKKyNpZmRlZiBERUJVRworCWZwcmludGYoc3RkZXJyLCAiJWQgdmFsdWVzLCBtdSAlMTAuNGYsIHNpZ21hICUxMC40ZiwgcmhvICUxMC40ZlxuIiwKKwkJbGltaXQsIG11LCBzaWdtYSwgcmhvKTsKKyNlbmRpZgorCQorCXRhYmxlID0gbWFrZWRpc3QoeCwgbGltaXQsIG11LCBzaWdtYSk7CisJZnJlZSgodm9pZCAqKSB4KTsKKwljdW11bGF0aXZlZGlzdCh0YWJsZSwgRElTVFRBQkxFU0laRSwgJnRvdGFsKTsKKwlpbnZlcnNlID0gaW52ZXJ0dGFibGUodGFibGUsIFRBQkxFU0laRSwgRElTVFRBQkxFU0laRSwgdG90YWwpOworCWludGVycG9sYXRldGFibGUoaW52ZXJzZSwgVEFCTEVTSVpFKTsKKwlwcmludHRhYmxlKGludmVyc2UsIFRBQkxFU0laRSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9uZXRlbS9ub3JtYWwuYyBiL2lwcm91dGUyL25ldGVtL25vcm1hbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZGViYjEKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9uZXRlbS9ub3JtYWwuYwpAQCAtMCwwICsxLDUxIEBACisvKgorICogTm9ybWFsIGRpc3RyaWJ1dGlvbiB0YWJsZSBnZW5lcmF0b3IKKyAqIFRha2VuIGZyb20gdGhlIHVuY29weXJpZ2h0ZWQgTklTVG5ldCBjb2RlLgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BrdF9zY2hlZC5oPgorCisjZGVmaW5lIFRBQkxFU0laRSAxNjM4NAorI2RlZmluZSBUQUJMRUZBQ1RPUiBORVRFTV9ESVNUX1NDQUxFCisKK3N0YXRpYyBkb3VibGUKK25vcm1hbChkb3VibGUgeCwgZG91YmxlIG11LCBkb3VibGUgc2lnbWEpCit7CisJcmV0dXJuIC41ICsgLjUqZXJmKCh4LW11KS8oc3FydCgyLjApKnNpZ21hKSk7Cit9CisKKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaSwgbjsKKwlkb3VibGUgeDsKKwlkb3VibGUgdGFibGVbVEFCTEVTSVpFKzFdOworCisJZm9yICh4ID0gLTEwLjA7IHggPCAxMC4wNTsgeCArPSAuMDAwMDUpIHsKKwkJaSA9IHJpbnQoVEFCTEVTSVpFICogbm9ybWFsKHgsIDAuMCwgMS4wKSk7CisJCXRhYmxlW2ldID0geDsKKwl9CisKKwkKKwlwcmludGYoIiMgVGhpcyBpcyB0aGUgZGlzdHJpYnV0aW9uIHRhYmxlIGZvciB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbi5cbiIpOworCWZvciAoaSA9IG4gPSAwOyBpIDwgVEFCTEVTSVpFOyBpICs9IDQpIHsKKwkJaW50IHZhbHVlID0gKGludCkgcmludCh0YWJsZVtpXSpUQUJMRUZBQ1RPUik7CisJCWlmICh2YWx1ZSA8IFNIUlRfTUlOKSB2YWx1ZSA9IFNIUlRfTUlOOworCQlpZiAodmFsdWUgPiBTSFJUX01BWCkgdmFsdWUgPSBTSFJUX01BWDsKKworCQlwcmludGYoIiAlZCIsIHZhbHVlKTsKKwkJaWYgKCsrbiA9PSA4KSB7CisJCQlwdXRjaGFyKCdcbicpOworCQkJbiA9IDA7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL25ldGVtL3BhcmV0by5jIGIvaXByb3V0ZTIvbmV0ZW0vcGFyZXRvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFhNjQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL25ldGVtL3BhcmV0by5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBQYXJldG8gZGlzdHJpYnV0aW9uIHRhYmxlIGdlbmVyYXRvcgorICogVGFrZW4gZnJvbSB0aGUgdW5jb3B5cmlnaHRlZCBOSVNUbmV0IGNvZGUuCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGt0X3NjaGVkLmg+CisKK3N0YXRpYyBjb25zdCBkb3VibGUgYT0zLjA7CisjZGVmaW5lIFRBQkxFU0laRQkxNjM4NAorI2RlZmluZSBUQUJMRUZBQ1RPUglORVRFTV9ESVNUX1NDQUxFCisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGksIG47CisJZG91YmxlIGR2YWx1ZTsKKworCXByaW50ZigiIyBUaGlzIGlzIHRoZSBkaXN0cmlidXRpb24gdGFibGUgZm9yIHRoZSBwYXJldG8gZGlzdHJpYnV0aW9uLlxuIik7CisKKwlmb3IgKGkgPSA2NTUzNiwgbiA9IDA7IGkgPiAwOyBpIC09IDE2KSB7CisJCWR2YWx1ZSA9IChkb3VibGUpaS8oZG91YmxlKTY1NTM2OworCQlkdmFsdWUgPSAxLjAvcG93KGR2YWx1ZSwgMS4wL2EpOworCQlkdmFsdWUgLT0gMS41OworCQlkdmFsdWUgKj0gKDQuMC8zLjApKihkb3VibGUpVEFCTEVGQUNUT1I7CisJCWlmIChkdmFsdWUgPiAzMjc2NykKKwkJCWR2YWx1ZSA9IDMyNzY3OworCisJCXByaW50ZigiICVkIiwgKGludClyaW50KGR2YWx1ZSkpOworCQlpZiAoKytuID09IDgpIHsKKwkJCXB1dGNoYXIoJ1xuJyk7CisJCQluID0gMDsKKwkJfQorCX0KKwkKKwlyZXR1cm4gMDsKK30JCmRpZmYgLS1naXQgYS9pcHJvdXRlMi9uZXRlbS9wYXJldG9ub3JtYWwuYyBiL2lwcm91dGUyL25ldGVtL3BhcmV0b25vcm1hbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNzVmMjgKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi9uZXRlbS9wYXJldG9ub3JtYWwuYwpAQCAtMCwwICsxLDgyIEBACisvKgorICogUGFyZXRvb3JtYWwgZGlzdHJpYnV0aW9uIHRhYmxlIGdlbmVyYXRvcgorICoKKyAqIFRoaXMgZGlzdHJpYnV0aW9uIGlzIHNpbXBseSAuMjUqbm9ybWFsICsgLjc1KnBhcmV0bzsgYSBjb21iaW5hdGlvbgorICogd2hpY2ggc2VlbXMgdG8gbWF0Y2ggZXhwZXJpbWVudGFsbHkgb2JzZXJ2ZWQgZGlzdHJpYnV0aW9ucyByZWFzb25hYmx5CisgKiAgd2VsbCwgYnV0IGlzIGNvbXB1dGF0aW9uYWxseSBlYXN5IHRvIGhhbmRsZS4KKyAqIFRoZSBlbnRyaWVzIHJlcHJlc2VudCBhIHNjYWxlZCBpbnZlcnNlIG9mIHRoZSBjdW11bGF0aXZlIGRpc3RyaWJ1dGlvbgorICogZnVuY3Rpb24uCisgKgorICogVGFrZW4gZnJvbSB0aGUgdW5jb3B5cmlnaHRlZCBOSVNUbmV0IGNvZGUuCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGt0X3NjaGVkLmg+CisKKyNkZWZpbmUgVEFCTEVTSVpFCTE2Mzg0CisjZGVmaW5lIFRBQkxFRkFDVE9SCU5FVEVNX0RJU1RfU0NBTEUKKworc3RhdGljIGRvdWJsZQorbm9ybWFsKGRvdWJsZSB4LCBkb3VibGUgbXUsIGRvdWJsZSBzaWdtYSkKK3sKKwlyZXR1cm4gLjUgKyAuNSplcmYoKHgtbXUpLyhzcXJ0KDIuMCkqc2lnbWEpKTsKK30KKworc3RhdGljIGNvbnN0IGRvdWJsZSBhPTMuMDsKKworc3RhdGljIGludAorcGFyZXRvdmFsdWUoaW50IGkpCit7CisJZG91YmxlIGR2YWx1ZTsKKworCWkgPSA2NTUzNi00Kmk7CisJZHZhbHVlID0gKGRvdWJsZSlpLyhkb3VibGUpNjU1MzY7CisJZHZhbHVlID0gMS4wL3BvdyhkdmFsdWUsIDEuMC9hKTsKKwlkdmFsdWUgLT0gMS41OworCWR2YWx1ZSAqPSAoNC4wLzMuMCkqKGRvdWJsZSlUQUJMRUZBQ1RPUjsKKwlpZiAoZHZhbHVlID4gMzI3NjcpCisJCWR2YWx1ZSA9IDMyNzY3OworCXJldHVybiAoaW50KXJpbnQoZHZhbHVlKTsKK30JCisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGksbjsKKwlkb3VibGUgeDsKKwlkb3VibGUgdGFibGVbVEFCTEVTSVpFKzFdOworCisJZm9yICh4ID0gLTEwLjA7IHggPCAxMC4wNTsgeCArPSAuMDAwMDUpIHsKKwkJaSA9IHJpbnQoVEFCTEVTSVpFKm5vcm1hbCh4LCAwLjAsIDEuMCkpOworCQl0YWJsZVtpXSA9IHg7CisJfQorCXByaW50ZigKKyIjIFRoaXMgaXMgdGhlIGRpc3RyaWJ1dGlvbiB0YWJsZSBmb3IgdGhlIHBhcmV0b25vcm1hbCBkaXN0cmlidXRpb24uXG4iCisJKTsKKworCWZvciAoaSA9IG4gPSAwOyBpIDwgVEFCTEVTSVpFOyBpICs9IDQpIHsKKwkJaW50IG5vcm12YWx1ZSwgcGFydmFsdWUsIHZhbHVlOworCisJCW5vcm12YWx1ZSA9IChpbnQpIHJpbnQodGFibGVbaV0qVEFCTEVGQUNUT1IpOworCQlwYXJ2YWx1ZSA9IHBhcmV0b3ZhbHVlKGkpOworCisJCXZhbHVlID0gKG5vcm12YWx1ZSszKnBhcnZhbHVlKS80OworCQlpZiAodmFsdWUgPCBTSFJUX01JTikgdmFsdWUgPSBTSFJUX01JTjsKKwkJaWYgKHZhbHVlID4gU0hSVF9NQVgpIHZhbHVlID0gU0hSVF9NQVg7CisKKwkJcHJpbnRmKCIgJWQiLCB2YWx1ZSk7CisJCWlmICgrK24gPT0gOCkgeworCQkJcHV0Y2hhcignXG4nKTsKKwkJCW4gPSAwOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi9uZXRlbS9zdGF0cy5jIGIvaXByb3V0ZTIvbmV0ZW0vc3RhdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDcwZjE2Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvbmV0ZW0vc3RhdHMuYwpAQCAtMCwwICsxLDc3IEBACisvKgorICogRXhwZXJpbWVudGFsIGRhdGEgIGRpc3RyaWJ1dGlvbiB0YWJsZSBnZW5lcmF0b3IKKyAqIFRha2VuIGZyb20gdGhlIHVuY29weXJpZ2h0ZWQgTklTVG5ldCBjb2RlIChwdWJsaWMgZG9tYWluKS4KKyAqCisgKiBScmVhZCBpbiBhIHNlcmllcyBvZiAicmFuZG9tIiBkYXRhIHZhbHVlcywgZWl0aGVyCisgKiBleHBlcmltZW50YWxseSBvciBnZW5lcmF0ZWQgZnJvbSBzb21lIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbi4KKyAqIEZyb20gdGhpcywgcmVwb3J0IHN0YXRpc3RpY3MuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKK3ZvaWQKK3N0YXRzKEZJTEUgKmZwKQoreworCXN0cnVjdCBzdGF0IGluZm87CisJZG91YmxlICp4OworCWludCBsaW1pdDsKKwlpbnQgbj0wLCBpOworCWRvdWJsZSBtdT0wLjAsIHNpZ21hPTAuMCwgc3Vtc3F1YXJlPTAuMCwgc3VtPTAuMCwgdG9wPTAuMCwgcmhvPTAuMDsKKwlkb3VibGUgc2lnbWEyPTAuMDsKKworCWZzdGF0KGZpbGVubyhmcCksICZpbmZvKTsKKwlpZiAoaW5mby5zdF9zaXplID4gMCkgeworCQlsaW1pdCA9IDIqaW5mby5zdF9zaXplL3NpemVvZihkb3VibGUpOwkvKiBAQCBhcHByb3hpbWF0ZSAqLworCX0gZWxzZSB7CisJCWxpbWl0ID0gMTAwMDA7CisJfQorCXggPSAoZG91YmxlICopbWFsbG9jKGxpbWl0KnNpemVvZihkb3VibGUpKTsKKworCWZvciAoaT0wOyBpPGxpbWl0OyArK2kpeworCQlmc2NhbmYoZnAsICIlbGYiLCAmeFtpXSk7CisJCWlmIChmZW9mKGZwKSkKKwkJCWJyZWFrOworCQlzdW1zcXVhcmUgKz0geFtpXSp4W2ldOworCQlzdW0gKz0geFtpXTsKKwkJKytuOworCX0KKwltdSA9IHN1bS8oZG91YmxlKW47CisJc2lnbWEgPSBzcXJ0KChzdW1zcXVhcmUgLSAoZG91YmxlKW4qbXUqbXUpLyhkb3VibGUpKG4tMSkpOworCisJZm9yIChpPTE7IGkgPCBuOyArK2kpeworCQl0b3AgKz0gKChkb3VibGUpeFtpXS1tdSkqKChkb3VibGUpeFtpLTFdLW11KTsKKwkJc2lnbWEyICs9ICgoZG91YmxlKXhbaS0xXSAtIG11KSooKGRvdWJsZSl4W2ktMV0gLSBtdSk7CisKKwl9CisJcmhvID0gdG9wL3NpZ21hMjsKKworCXByaW50ZigibXUgPSAgICAlMTIuNmZcbiIsIG11KTsKKwlwcmludGYoInNpZ21hID0gJTEyLjZmXG4iLCBzaWdtYSk7CisJcHJpbnRmKCJyaG8gPSAgICUxMi42ZlxuIiwgcmhvKTsKKwkvKnByaW50Zigic2lnbWEyID0gJTEwLjRmXG4iLCBzcXJ0KHNpZ21hMi8oZG91YmxlKShuLTEpKSk7Ki8KKwkvKnByaW50ZigiY29ycmVsYXRpb24gcmhvID0gJTEwLjZmXG4iLCB0b3AvKChkb3VibGUpKG4tMSkqc2lnbWEqc2lnbWEpKTsqLworfQorCisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJRklMRSAqZnA7CisKKwlpZiAoYXJnYyA+IDEpIHsKKwkJZnAgPSBmb3Blbihhcmd2WzFdLCAiciIpOworCQlpZiAoIWZwKSB7CisJCQlwZXJyb3IoYXJndlsxXSk7CisJCQlleGl0KDEpOworCQl9CisJfSBlbHNlIHsKKwkJZnAgPSBzdGRpbjsKKwl9CisJc3RhdHMoZnApOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvQW5kcm9pZC5tayBiL2lwcm91dGUyL3RjL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY3YjA4YQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyNSBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX1NSQ19GSUxFUyA6PSAgdGMuYyB0Y19leGVjLmMgdGNfcWRpc2MuYyBxX2NicS5jIHRjX3V0aWwuYyB0Y19jbGFzcy5jIHRjX2NvcmUuYyBtX2FjdGlvbi5jIFwKKyAgICAgICAgICAgICAgICAgICAgbV9lc3RpbWF0b3IuYyB0Y19maWx0ZXIuYyB0Y19tb25pdG9yLmMgdGNfc3RhYi5jIHRjX2NicS5jIFwKKyAgICAgICAgICAgICAgICAgICAgdGNfZXN0aW1hdG9yLmMgZl91MzIuYyBtX3BvbGljZS5jIHFfaW5ncmVzcy5jIG1fbWlycmVkLmMgcV9odGIuYworCitMT0NBTF9NT0RVTEUgOj0gdGMKKworTE9DQUxfU1lTVEVNX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYmMgbGlibSBsaWJkbAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmlwcm91dGV1dGlsIGxpYm5ldGxpbmsKKworTE9DQUxfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpLy4uL2luY2x1ZGUKKworTE9DQUxfQ0ZMQUdTIDo9IC1PMiAtZyAtVyAtV2FsbCAtV25vLXBvaW50ZXItYXJpdGggLVduby1zaWduLWNvbXBhcmUgLVdlcnJvciBcCisgICAgLVduby11bnVzZWQtcGFyYW1ldGVyIFwKKyAgICAtV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzCisKKyMgVGhpcyBpcyBhIHdvcmsgYXJvdW5kIGZvciBiLzE4NDAzOTIwCitMT0NBTF9MREZMQUdTIDo9IC1XbCwtLW5vLWdjLXNlY3Rpb25zCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy9NT0RVTEVfTElDRU5TRV9HUEwgYi9pcHJvdXRlMi90Yy9NT0RVTEVfTElDRU5TRV9HUEwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL01PRFVMRV9MSUNFTlNFX0dQTApkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvTWFrZWZpbGUgYi9pcHJvdXRlMi90Yy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWJlYTg3Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGMvTWFrZWZpbGUKQEAgLTAsMCArMSwxODcgQEAKK1RDT0JKPSB0Yy5vIHRjX3FkaXNjLm8gdGNfY2xhc3MubyB0Y19maWx0ZXIubyB0Y191dGlsLm8gdGNfbW9uaXRvci5vIFwKKyAgICAgICB0Y19leGVjLm8gdGNfYnBmLm8gbV9wb2xpY2UubyBtX2VzdGltYXRvci5vIG1fYWN0aW9uLm8gbV9lbWF0Y2gubyBcCisgICAgICAgZW1wX2VtYXRjaC55YWNjLm8gZW1wX2VtYXRjaC5sZXgubworCitpbmNsdWRlIC4uL0NvbmZpZworCitpZmVxICgkKElQX0NPTkZJR19TRVROUykseSkKKwlDRkxBR1MgKz0gLURIQVZFX1NFVE5TCitlbmRpZgorCitTSEFSRURfTElCUyA/PSB5CisKK1RDTU9EVUxFUyA6PQorVENNT0RVTEVTICs9IHFfZmlmby5vCitUQ01PRFVMRVMgKz0gcV9zZnEubworVENNT0RVTEVTICs9IHFfcmVkLm8KK1RDTU9EVUxFUyArPSBxX3ByaW8ubworVENNT0RVTEVTICs9IHFfdGJmLm8KK1RDTU9EVUxFUyArPSBxX2NicS5vCitUQ01PRFVMRVMgKz0gcV9yci5vCitUQ01PRFVMRVMgKz0gcV9tdWx0aXEubworVENNT0RVTEVTICs9IHFfbmV0ZW0ubworVENNT0RVTEVTICs9IHFfY2hva2UubworVENNT0RVTEVTICs9IHFfc2ZiLm8KK1RDTU9EVUxFUyArPSBmX3JzdnAubworVENNT0RVTEVTICs9IGZfdTMyLm8KK1RDTU9EVUxFUyArPSBmX3JvdXRlLm8KK1RDTU9EVUxFUyArPSBmX2Z3Lm8KK1RDTU9EVUxFUyArPSBmX2Jhc2ljLm8KK1RDTU9EVUxFUyArPSBmX2JwZi5vCitUQ01PRFVMRVMgKz0gZl9mbG93Lm8KK1RDTU9EVUxFUyArPSBmX2Nncm91cC5vCitUQ01PRFVMRVMgKz0gZl9mbG93ZXIubworVENNT0RVTEVTICs9IHFfZHNtYXJrLm8KK1RDTU9EVUxFUyArPSBxX2dyZWQubworVENNT0RVTEVTICs9IGZfdGNpbmRleC5vCitUQ01PRFVMRVMgKz0gcV9pbmdyZXNzLm8KK1RDTU9EVUxFUyArPSBxX2hmc2MubworVENNT0RVTEVTICs9IHFfaHRiLm8KK1RDTU9EVUxFUyArPSBxX2Ryci5vCitUQ01PRFVMRVMgKz0gcV9xZnEubworVENNT0RVTEVTICs9IG1fZ2FjdC5vCitUQ01PRFVMRVMgKz0gbV9taXJyZWQubworVENNT0RVTEVTICs9IG1fbmF0Lm8KK1RDTU9EVUxFUyArPSBtX3BlZGl0Lm8KK1RDTU9EVUxFUyArPSBtX3NrYmVkaXQubworVENNT0RVTEVTICs9IG1fY3N1bS5vCitUQ01PRFVMRVMgKz0gbV9zaW1wbGUubworVENNT0RVTEVTICs9IG1fdmxhbi5vCitUQ01PRFVMRVMgKz0gbV9jb25ubWFyay5vCitUQ01PRFVMRVMgKz0gbV9icGYubworVENNT0RVTEVTICs9IHBfaXAubworVENNT0RVTEVTICs9IHBfaWNtcC5vCitUQ01PRFVMRVMgKz0gcF90Y3AubworVENNT0RVTEVTICs9IHBfdWRwLm8KK1RDTU9EVUxFUyArPSBlbV9uYnl0ZS5vCitUQ01PRFVMRVMgKz0gZW1fY21wLm8KK1RDTU9EVUxFUyArPSBlbV91MzIubworVENNT0RVTEVTICs9IGVtX2NhbmlkLm8KK1RDTU9EVUxFUyArPSBlbV9tZXRhLm8KK1RDTU9EVUxFUyArPSBxX21xcHJpby5vCitUQ01PRFVMRVMgKz0gcV9jb2RlbC5vCitUQ01PRFVMRVMgKz0gcV9mcV9jb2RlbC5vCitUQ01PRFVMRVMgKz0gcV9mcS5vCitUQ01PRFVMRVMgKz0gcV9waWUubworVENNT0RVTEVTICs9IHFfaGhmLm8KK1RDTU9EVUxFUyArPSBxX2Nsc2FjdC5vCitUQ01PRFVMRVMgKz0gZV9icGYubworCitpZmVxICgkKFRDX0NPTkZJR19JUFNFVCksIHkpCisgIGlmZXEgKCQoVENfQ09ORklHX1hUKSwgeSkKKyAgICBUQ01PRFVMRVMgKz0gZW1faXBzZXQubworICBlbmRpZgorZW5kaWYKKworVENTTyA6PQoraWZlcSAoJChUQ19DT05GSUdfQVRNKSx5KQorICBUQ1NPICs9IHFfYXRtLnNvCitlbmRpZgorCitpZmVxICgkKFRDX0NPTkZJR19YVCkseSkKKyAgVENTTyArPSBtX3h0LnNvCitlbHNlCisgIGlmZXEgKCQoVENfQ09ORklHX1hUX09MRCkseSkKKyAgICBUQ1NPICs9IG1feHRfb2xkLnNvCisgIGVsc2UKKyAgICBpZmVxICgkKFRDX0NPTkZJR19YVF9PTERfSCkseSkKKwlDRkxBR1MgKz0gLURUQ19DT05GSUdfWFRfSAorCVRDU08gKz0gbV94dF9vbGQuc28KKyAgICBlbHNlCisgICAgICBUQ01PRFVMRVMgKz0gbV9pcHQubworICAgIGVuZGlmCisgIGVuZGlmCitlbmRpZgorCitpZmVxICgkKFRDX0NPTkZJR19FTEYpLHkpCisgIENGTEFHUyArPSAtREhBVkVfRUxGCisgIExETElCUyArPSAtbGVsZgorZW5kaWYKKworVENPQkogKz0gJChUQ01PRFVMRVMpCitMRExJQlMgKz0gLUwuIC1sdGMgLWxtCisKK2lmZXEgKCQoU0hBUkVEX0xJQlMpLHkpCitMRExJQlMgKz0gLWxkbAorTERGTEFHUyArPSAtV2wsLWV4cG9ydC1keW5hbWljCitlbmRpZgorCitUQ0xJQiA6PSB0Y19jb3JlLm8KK1RDTElCICs9IHRjX3JlZC5vCitUQ0xJQiArPSB0Y19jYnEubworVENMSUIgKz0gdGNfZXN0aW1hdG9yLm8KK1RDTElCICs9IHRjX3N0YWIubworCitDRkxBR1MgKz0gLURDT05GSUdfR0FDVCAtRENPTkZJR19HQUNUX1BST0IKK2lmbmVxICgkKElQVF9MSUJfRElSKSwpCisJQ0ZMQUdTICs9IC1ESVBUX0xJQl9ESVI9XCIkKElQVF9MSUJfRElSKVwiCitlbmRpZgorCitZQUNDIDo9IGJpc29uCitMRVggOj0gZmxleAorQ0ZMQUdTICs9IC1EWVlfTk9fSU5QVVQKKworTU9EREVTVERJUiA6PSAkKERFU1RESVIpJChMSUJESVIpL3RjCisKKyUuc286ICUuYworCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1zaGFyZWQgLWZwaWMgJDwgLW8gJEAKKworCithbGw6IGxpYnRjLmEgdGMgJChUQ1NPKQorCit0YzogJChUQ09CSikgJChUQ0xJQikKKworbGlidGMuYTogJChUQ0xJQikKKwkkKEFSKSByY3MgJEAgJChUQ0xJQikKKworaW5zdGFsbDogYWxsCisJbWtkaXIgLXAgJChNT0RERVNURElSKQorCWluc3RhbGwgLW0gMDc1NSB0YyAkKERFU1RESVIpJChTQklORElSKQorCWZvciBpIGluICQoVENTTyk7IFwKKwlkbyBpbnN0YWxsIC1tIDc1NSAkJGkgJChNT0RERVNURElSKTsgXAorCWRvbmUKKwlpZiBbICEgLWYgJChNT0RERVNURElSKS9tX2lwdC5zbyBdOyB0aGVuIFwKKwlpZiBbIC1mICQoTU9EREVTVERJUikvbV94dC5zbyBdOyBcCisJCXRoZW4gbG4gLXMgbV94dC5zbyAkKE1PRERFU1RESVIpL21faXB0LnNvIDsgXAorCWVsaWYgWyAtZiAkKE1PRERFU1RESVIpL21feHRfb2xkLnNvIF07IFwKKwkJdGhlbiBsbiAtcyBtX3h0X29sZC5zbyAkKE1PRERFU1RESVIpL21faXB0LnNvIDsgXAorCWZpOyBcCisJZmkKKworY2xlYW46CisJcm0gLWYgJChUQ09CSikgJChUQ0xJQikgbGlidGMuYSB0YyAqLnNvIGVtcF9lbWF0Y2gueWFjYy5oOyBcCisJcm0gLWYgZW1wX2VtYXRjaC55YWNjLioKKworcV9hdG0uc286IHFfYXRtLmMKKwkkKENDKSAkKENGTEFHUykgJChMREZMQUdTKSAtc2hhcmVkIC1mcGljIC1vIHFfYXRtLnNvIHFfYXRtLmMgLWxhdG0KKworbV94dC5zbzogbV94dC5jCisJJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgLXNoYXJlZCAtZnBpYyAtbyBtX3h0LnNvIG1feHQuYyAkJCgkKFBLR19DT05GSUcpIHh0YWJsZXMgLS1jZmxhZ3MgLS1saWJzKQorCittX3h0X29sZC5zbzogbV94dF9vbGQuYworCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1zaGFyZWQgLWZwaWMgLW8gbV94dF9vbGQuc28gbV94dF9vbGQuYyAkJCgkKFBLR19DT05GSUcpIHh0YWJsZXMgLS1jZmxhZ3MgLS1saWJzKQorCitlbV9pcHNldC5vOiBDRkxBR1MgKz0gJCQoJChQS0dfQ09ORklHKSB4dGFibGVzIC0tY2ZsYWdzKQorCislLnlhY2MuYzogJS55CisJJChZQUNDKSAkKFlBQ0NGTEFHUykgLW8gJEAgJDwKKworJS5sZXguYzogJS5sCisJJChMRVgpICQoTEVYRkxBR1MpIC1vJEAgJDwKKworIyBvdXIgbGV4ZXIgaW5jbHVkZXMgdGhlIGhlYWRlciBmcm9tIHlhY2MsIHNvIG1ha2Ugc3VyZQorIyB3ZSBkb24ndCBhdHRlbXB0IHRvIGNvbXBpbGUgaXQgYmVmb3JlIHRoZSBoZWFkZXIgaGFzCisjIGJlZW4gZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhlIHlhY2Mgc3RlcC4KK2VtcF9lbWF0Y2gubGV4Lm86IGVtcF9lbWF0Y2gueWFjYy5jCisKK2lmbmVxICgkKFNIQVJFRF9MSUJTKSx5KQorCit0Yzogc3RhdGljLXN5bXMubworc3RhdGljLXN5bXMubzogc3RhdGljLXN5bXMuaAorc3RhdGljLXN5bXMuaDogJCh3aWxkY2FyZCAqLmMpCisJZmlsZXM9IiReIiA7IFwKKwlmb3IgcyBpbiBgZ3JlcCAtQiAzICdcPGRsc3ltJyAkJGZpbGVzIHwgc2VkIC1uICcvc25wcmludGYve3M6LioiXChbXiJdKlwpIi4qOlwxOjtzOiVzOjo7cH0nYCA7IGRvIFwKKwkJc2VkIC1uICcvJyQkcydbXiBdKiA9L3tzOi4qIFwoW14gXSonJCRzJ1teIF0qXCkgLio6ZXh0ZXJuIGNoYXIgXDFbXSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7IGlmICghc3RyY21wKHN5bSwgIlwxIikpIHJldHVybiBcMTs6O3B9JyAkJGZpbGVzIDsgXAorCWRvbmUgPiAkQAorCitlbmRpZgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvTk9USUNFIGIvaXByb3V0ZTIvdGMvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MTIxMDkKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy9OT1RJQ0UKQEAgLTAsMCArMSwzNDAgQEAKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisJCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQorCisgQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgICAgICAgICAgICAgICAgICAgICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQorc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKwwKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCithIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAorcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCittZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgordGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKK2VpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCitsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCit0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KK2lzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgorV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCitzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKK2NvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKK2NvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKK25vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKK2FuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoreW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CisgICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKKyAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CisgICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAorICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KKyAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKKyAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKKyAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCisgICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKKyAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAorICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KKyAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKwwKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorDAorICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorDAorICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKK3Rob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKK2VpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCit0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLgorCisgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKK3RvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCittYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscworb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAorT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKK1RPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKK1BST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAorUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORworT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCitZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgorUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKwkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIHllYXIgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5CitiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKK2NvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RjL1JFQURNRS5sYXN0IGIvaXByb3V0ZTIvdGMvUkVBRE1FLmxhc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNmNmY3YgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL1JFQURNRS5sYXN0CkBAIC0wLDAgKzEsNDUgQEAKK0tlcm5lbCBjb2RlIGFuZCBpbnRlcmZhY2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIENvbXBpbGUgdGltZSBzd2l0Y2hlcworCitUaGVyZSBpcyBvbmx5IG9uZSwgYnV0IHZlcnkgaW1wb3J0YW50LCBjb21waWxlIHRpbWUgc3dpdGNoLgorSXQgaXMgbm90IHNldHRhYmxlIGJ5ICJtYWtlIGNvbmZpZyIsIGJ1dCBzaG91bGQgYmUgc2VsZWN0ZWQKK21hbnVhbGx5IGFuZCBhZnRlciBhIGJpdCBvZiB0aGlua2luZyBpbiA8aW5jbHVkZS9uZXQvcGt0X3NjaGVkLmg+CisKK1BTQ0hFRF9DTE9DS19TT1VSQ0UgY2FuIHRha2UgdGhyZWUgdmFsdWVzOgorCisJUFNDSEVEX0dFVFRJTUVPRkRBWQorCVBTQ0hFRF9KSUZGSUVTCisJUFNDSEVEX0NQVQorCisKKyBQU0NIRURfR0VUVElNRU9GREFZCisKK0RlZmF1bHQgc2V0dGluZyBpcyB0aGUgbW9zdCBjb25zZXJ2YXRpdmUgUFNDSEVEX0dFVFRJTUVPRkRBWS4KK0l0IGlzIHZlcnkgc2xvdyBib3RoIGJlY2F1c2Ugb2Ygd2VpcmQgc2xvd25lc3Mgb2YgZG9fZ2V0dGltZW9mZGF5KCkKK2FuZCBiZWNhdXNlIGl0IGZvcmNlcyBjb2RlIHRvIHVzZSB1bm5hdHVyYWwgInRpbWV2YWwiIGZvcm1hdCwKK3doZXJlIG1pY3Jvc2Vjb25kcyBhbmQgc2Vjb25kcyBmaWVsZHMgYXJlIHNlcGFyYXRlLgorQmVzaWRlcyB0aGF0LCBpdCB3aWxsIG1pc2JlaGF2ZSwgd2hlbiBkZWxheXMgZXhjZWVkIDIgc2Vjb25kcworKGYuZS4gdmVyeSBzbG93IGxpbmtzIG9yIGNsYXNzZXMgYm91bmRlZCB0byBzbWFsbCBzbGljZSBvZiBiYW5kd2lkdGgpCitUbyByZXN1bWU6IGFzIG9ubHkgeW91IHdpbGwgZ2V0IGl0IHdvcmtpbmcsIHNlbGVjdCBjb3JyZWN0IGNsb2NrCitzb3VyY2UgYW5kIGZvcmdldCBhYm91dCBQU0NIRURfR0VUVElNRU9GREFZIGZvcmV2ZXIuCisKKworIFBTQ0hFRF9KSUZGSUVTCisKK0Nsb2NrIGlzIGRlcml2ZWQgZnJvbSBqaWZmaWVzLiBPbiBhcmNoaXRlY3R1cmVzIHdpdGggSFo9MTAwCitncmFudWxhcml0eSBvZiB0aGlzIGNsb2NrIGlzIG5vdCBlbm91Z2ggdG8gbWFrZSByZWFzb25hYmxlCitiaW5kaW5ncyB0byByZWFsIHRpbWUuIEhvd2V2ZXIsIHRha2luZyBpbnRvIGFjY291bnQgTGludXgKK2FyY2hpdGVjdHVyZSBwcm9ibGVtcywgd2hpY2ggZm9yY2UgdXMgdG8gdXNlIGFydGlmaWNpYWwKK2ludGVncmF0ZWQgY2xvY2sgaW4gYW55IGNhc2UsIHRoaXMgc3dpdGNoIGlzIG5vdCBzbyBiYWQKK2ZvciBzY2hkdWxpbmcgZXZlbiBvbiBoaWdoIHNwZWVkIG5ldHdvcmtzLCB0aG91Z2ggcG9saWNpbmcKK2lzIG5vdCByZWxpYWJsZS4KKworCisgUFNDSEVEX0NQVQorCitJdCBpcyBhdmFpbGFibGUgb25seSBmb3IgYWxwaGEgYW5kIHBlbnRpdW1zIHdpdGggY29ycmVjdAorQ1BVIHRpbWVzdGFtcC4gSXQgaXMgdGhlIGZhc3Rlc3Qgd2F5LCB1c2UgaXQgd2hlbiBpdCBpcyBhdmFpbGFibGUsCitidXQgcmVtZW1iZXI6IG5vdCBhbGwgcGVudGl1bXMgaGF2ZSB0aGlzIGZhY2lsaXR5LCBhbmQKK2EgbG90IG9mIHRoZW0gaGF2ZSBjbG9jaywgYnJva2VuIGJ5IEFQTSBldGMuIGV0Yy4KZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RjL2VfYnBmLmMgYi9pcHJvdXRlMi90Yy9lX2JwZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNjUwYTQKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy9lX2JwZi5jCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogZV9icGYuYwlCUEYgZXhlYyBwcm94eQorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglEYW5pZWwgQm9ya21hbm4gPGRhbmllbEBpb2dlYXJib3gubmV0PgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKworI2luY2x1ZGUgInRjX3V0aWwuaCIKKyNpbmNsdWRlICJ0Y19icGYuaCIKKworI2luY2x1ZGUgImJwZl9lbGYuaCIKKyNpbmNsdWRlICJicGZfc2NtLmgiCisKKyNkZWZpbmUgQlBGX0RFRkFVTFRfQ01ECSIvYmluL3NoIgorCitzdGF0aWMgY2hhciAqYXJndl9kZWZhdWx0W10gPSB7IEJQRl9ERUZBVUxUX0NNRCwgTlVMTCB9OworCitzdGF0aWMgdm9pZCBleHBsYWluKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogLi4uIGJwZiBbIGltcG9ydCBVRFNfRklMRSBdIFsgcnVuIENNRCBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAuLi4gYnBmIFsgZGVidWcgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgLi4uIGJwZiBbIGdyYWZ0IE1BUF9GSUxFIF0gWyBrZXkgS0VZIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgIGAuLi4gWyBvYmplY3QtZmlsZSBPQkpfRklMRSBdIFsgdHlwZSBUWVBFIF0gWyBzZWN0aW9uIE5BTUUgXSBbIHZlcmJvc2UgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgYC4uLiBbIG9iamVjdC1waW5uZWQgUFJPR19GSUxFIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIldoZXJlIFVEU19GSUxFIHByb3ZpZGVzIHRoZSBuYW1lIG9mIGEgdW5peCBkb21haW4gc29ja2V0IGZpbGVcbiIpOworCWZwcmludGYoc3RkZXJyLCAidG8gaW1wb3J0IGVCUEYgbWFwcyBhbmQgdGhlIG9wdGlvbmFsIENNRCBkZW5vdGVzIHRoZSBjb21tYW5kXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgInRvIGJlIGV4ZWN1dGVkIChkZWZhdWx0OiBcJyVzXCcpLlxuIiwgQlBGX0RFRkFVTFRfQ01EKTsKKwlmcHJpbnRmKHN0ZGVyciwgIldoZXJlIE1BUF9GSUxFIHBvaW50cyB0byBhIHBpbm5lZCBtYXAsIE9CSl9GSUxFIHRvIGFuIG9iamVjdCBmaWxlXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgImFuZCBQUk9HX0ZJTEUgdG8gYSBwaW5uZWQgcHJvZ3JhbS4gVFlQRSBjYW4gYmUge2NscywgYWN0fSwgd2hlcmVcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXCdjbHNcJyBpcyBkZWZhdWx0LiBLRVkgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBpbmZlcnJlZCBmcm9tIHRoZVxuIik7CisJZnByaW50ZihzdGRlcnIsICJzZWN0aW9uIG5hbWUsIG90aGVyd2lzZSBpdCBuZWVkcyB0byBiZSBwcm92aWRlZC5cbiIpOworfQorCitzdGF0aWMgaW50IGJwZl9udW1fZW52X2VudHJpZXModm9pZCkKK3sKKwljaGFyICoqZW52cDsKKwlpbnQgbnVtOworCisJZm9yIChudW0gPSAwLCBlbnZwID0gZW52aXJvbjsgKmVudnAgIT0gTlVMTDsgZW52cCsrKQorCQludW0rKzsKKwlyZXR1cm4gbnVtOworfQorCitzdGF0aWMgaW50IHBhcnNlX2JwZihzdHJ1Y3QgZXhlY191dGlsICpldSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKiphcmd2X3J1biA9IGFyZ3ZfZGVmYXVsdCwgKiplbnZwX3J1biwgKnRtcDsKKwlpbnQgcmV0LCBpLCBlbnZfb2xkLCBlbnZfbnVtLCBlbnZfbWFwOworCWNvbnN0IGNoYXIgKmJwZl91ZHNfbmFtZSA9IE5VTEw7CisJaW50IGZkc1tCUEZfU0NNX01BWF9GRFNdOworCXN0cnVjdCBicGZfbWFwX2F1eCBhdXg7CisKKwlpZiAoYXJnYyA9PSAwKQorCQlyZXR1cm4gMDsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAobWF0Y2hlcygqYXJndiwgInJ1biIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlhcmd2X3J1biA9IGFyZ3Y7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiaW1wb3J0IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWJwZl91ZHNfbmFtZSA9ICphcmd2OworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJkZWJ1ZyIpID09IDAgfHwKKwkJCSAgIG1hdGNoZXMoKmFyZ3YsICJkYmciKSA9PSAwKSB7CisJCQlpZiAoYnBmX3RyYWNlX3BpcGUoKSkKKwkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJIk5vIHRyYWNlIHBpcGUsIHRyYWNlZnMgbm90IG1vdW50ZWQ/XG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiZ3JhZnQiKSA9PSAwKSB7CisJCQljb25zdCBjaGFyICpicGZfbWFwX3BhdGg7CisJCQlib29sIGhhc19rZXkgPSBmYWxzZTsKKwkJCXVpbnQzMl90IGtleTsKKworCQkJTkVYVF9BUkcoKTsKKwkJCWJwZl9tYXBfcGF0aCA9ICphcmd2OworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChtYXRjaGVzKCphcmd2LCAia2V5IikgPT0gMCkgeworCQkJCU5FWFRfQVJHKCk7CisJCQkJaWYgKGdldF91bnNpZ25lZCgma2V5LCAqYXJndiwgMCkpIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwia2V5XCJcbiIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCWhhc19rZXkgPSB0cnVlOworCQkJCU5FWFRfQVJHKCk7CisJCQl9CisJCQlyZXR1cm4gYnBmX2dyYWZ0X21hcChicGZfbWFwX3BhdGgsIGhhc19rZXkgPworCQkJCQkgICAgICZrZXkgOiBOVUxMLCBhcmdjLCBhcmd2KTsKKwkJfSBlbHNlIHsKKwkJCWV4cGxhaW4oKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCU5FWFRfQVJHX0ZXRCgpOworCX0KKworCWlmICghYnBmX3Vkc19uYW1lKSB7CisJCWZwcmludGYoc3RkZXJyLCAiYnBmOiBObyBpbXBvcnQgcGFyYW1ldGVyIHByb3ZpZGVkIVxuIik7CisJCWV4cGxhaW4oKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChhcmd2X3J1biAhPSBhcmd2X2RlZmF1bHQgJiYgYXJnYyA9PSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiYnBmOiBObyBydW4gY29tbWFuZCBwcm92aWRlZCFcbiIpOworCQlleHBsYWluKCk7CisJCXJldHVybiAtMTsKKwl9CisKKwltZW1zZXQoZmRzLCAwLCBzaXplb2YoZmRzKSk7CisJbWVtc2V0KCZhdXgsIDAsIHNpemVvZihhdXgpKTsKKworCXJldCA9IGJwZl9yZWN2X21hcF9mZHMoYnBmX3Vkc19uYW1lLCBmZHMsICZhdXgsIEFSUkFZX1NJWkUoZmRzKSk7CisJaWYgKHJldCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJicGY6IENvdWxkIG5vdCByZWNlaXZlIGZkcyFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGF1eC5udW1fZW50ID09IDApIHsKKwkJZW52cF9ydW4gPSBlbnZpcm9uOworCQlnb3RvIG91dDsKKwl9CisKKwllbnZfb2xkID0gYnBmX251bV9lbnZfZW50cmllcygpOworCWVudl9udW0gPSBlbnZfb2xkICsgYXV4Lm51bV9lbnQgKyAyOworCWVudl9tYXAgPSBlbnZfb2xkICsgMTsKKworCWVudnBfcnVuID0gbWFsbG9jKHNpemVvZigqZW52cF9ydW4pICogZW52X251bSk7CisJaWYgKCFlbnZwX3J1bikgeworCQlmcHJpbnRmKHN0ZGVyciwgImJwZjogTm8gbWVtb3J5IGxlZnQgdG8gYWxsb2NhdGUgZW52IVxuIik7CisJCWdvdG8gZXJyOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBlbnZfb2xkOyBpKyspCisJCWVudnBfcnVuW2ldID0gZW52aXJvbltpXTsKKworCXJldCA9IGFzcHJpbnRmKCZ0bXAsICJCUEZfTlVNX01BUFM9JXUiLCBhdXgubnVtX2VudCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX2ZyZWU7CisKKwllbnZwX3J1bltlbnZfb2xkXSA9IHRtcDsKKworCWZvciAoaSA9IGVudl9tYXA7IGkgPCBlbnZfbnVtIC0gMTsgaSsrKSB7CisJCXJldCA9IGFzcHJpbnRmKCZ0bXAsICJCUEZfTUFQJXU9JXUiLAorCQkJICAgICAgIGF1eC5lbnRbaSAtIGVudl9tYXBdLmlkLAorCQkJICAgICAgIGZkc1tpIC0gZW52X21hcF0pOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyX2ZyZWVfZW52OworCisJCWVudnBfcnVuW2ldID0gdG1wOworCX0KKworCWVudnBfcnVuW2Vudl9udW0gLSAxXSA9IE5VTEw7CitvdXQ6CisJcmV0dXJuIGV4ZWN2cGUoYXJndl9ydW5bMF0sIGFyZ3ZfcnVuLCBlbnZwX3J1bik7CisKK2Vycl9mcmVlX2VudjoKKwlmb3IgKC0taTsgaSA+PSBlbnZfb2xkOyBpLS0pCisJCWZyZWUoZW52cF9ydW5baV0pOworZXJyX2ZyZWU6CisJZnJlZShlbnZwX3J1bik7CitlcnI6CisJZm9yIChpID0gMDsgaSA8IGF1eC5udW1fZW50OyBpKyspCisJCWNsb3NlKGZkc1tpXSk7CisJcmV0dXJuIC0xOworfQorCitzdHJ1Y3QgZXhlY191dGlsIGJwZl9leGVjX3V0aWwgPSB7CisJLmlkCQk9ICJicGYiLAorCS5wYXJzZV9lb3B0CT0gcGFyc2VfYnBmLAorfTsKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RjL2VtX2NhbmlkLmMgYi9pcHJvdXRlMi90Yy9lbV9jYW5pZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZjZlZDUKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy9lbV9jYW5pZC5jCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogZW1fY2FuaWQuYyAgRW1hdGNoIHJ1bGUgdG8gbWF0Y2ggQ0FOIGZyYW1lcyBhY2NvcmRpbmcgdG8gdGhlaXIgQ0FOIGlkZW50aWZpZXJzCisgKgorICogICAgICAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgICAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgICAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogSWRlYTogICAgICAgT2xpdmVyIEhhcnRrb3BwIDxvbGl2ZXIuaGFydGtvcHBAdm9sa3N3YWdlbi5kZT4KKyAqIENvcHlyaWdodDogIChjKSAyMDExIEN6ZWNoIFRlY2huaWNhbCBVbml2ZXJzaXR5IGluIFByYWd1ZQorICogICAgICAgICAgICAgKGMpIDIwMTEgVm9sa3N3YWdlbiBHcm91cCBSZXNlYXJjaAorICogQXV0aG9yczogICAgTWljaGFsIFNvamthIDxzb2prYW0xQGZlbC5jdnV0LmN6PgorICogICAgICAgICAgICAgUGF2ZWwgUGlzYSA8cGlzYUBjbXAuZmVsay5jdnV0LmN6PgorICogICAgICAgICAgICAgUm9zdGlzbGF2IExpc292eSA8bGlzb3Z5QGdtYWlsLmN6PgorICogRnVuZGVkIGJ5OiAgVm9sa3N3YWdlbiBHcm91cCBSZXNlYXJjaAorICoKKyAqIERvY3VtZW50YXRpb246IGh0dHA6Ly9ydGltZS5mZWxrLmN2dXQuY3ovY2FuL3NvY2tldGNhbi1xZGlzYy1maW5hbC5wZGYKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9jYW4uaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgIm1fZW1hdGNoLmgiCisKKyNkZWZpbmUgRU1fQ0FOSURfUlVMRVNfTUFYIDQwMCAvKiBNYWluIHJlYXNvbiBmb3IgdGhpcyBudW1iZXIgaXMgTmVsaW5rCisJbWVzc2FnZSBzaXplIGxpbWl0IGVxdWFsIHRvIFNpbmdsZSBtZW1vcnkgcGFnZSBzaXplLiBXaGVuIGR1bXAoKQorCWlzIGludm9rZWQsIHRoZXJlIGFyZSBldmVuIHNvbWUgZW1hdGNoIHJlbGF0ZWQgaGVhZGVycyBzZW50IGZyb20KKwlrZXJuZWwgdG8gdXNlcnNwYWNlIHRvZ2V0aGVyIHdpdGggZW1fY2FuaWQgY29uZmlndXJhdGlvbiAtLQorCTQwMCpzaXplb2Yoc3RydWN0IGNhbl9maWx0ZXIpIHNob3VsZCBmaXQgd2l0aG91dCBhbnkgcHJvYmxlbXMgKi8KKworZXh0ZXJuIHN0cnVjdCBlbWF0Y2hfdXRpbCBjYW5pZF9lbWF0Y2hfdXRpbDsKK3N0cnVjdCBydWxlcyB7CisJc3RydWN0IGNhbl9maWx0ZXIgKnJ1bGVzX3JhdzsKKwlpbnQgcnVsZXNfY2FwYWNpdHk7CS8qIFNpemUgb2YgYXJyYXkgYWxsb2NhdGVkIGZvciBydWxlc19yYXcgKi8KKwlpbnQgcnVsZXNfY250OwkJLyogQWN0dWFsIG51bWJlciBvZiBydWxlcyBzdG9yZWQgaW4gcnVsZXNfcmF3ICovCit9OworCitzdGF0aWMgdm9pZCBjYW5pZF9wcmludF91c2FnZShGSUxFICpmZCkKK3sKKwlmcHJpbnRmKGZkLAorCQkiVXNhZ2U6IGNhbmlkKElETElTVClcbiIgXAorCQkid2hlcmU6IElETElTVCA6PSBJRFNQRUMgWyBJRExJU1QgXVxuIiBcCisJCSIgICAgICAgSURTUEVDIDo9IHsg4oCZc2Zm4oCZIENBTklEIHwg4oCZZWZm4oCZIENBTklEIH1cbiIgXAorCQkiICAgICAgIENBTklEIDo9IElEWzpNQVNLXVxuIiBcCisJCSIgICAgICAgSUQsIE1BU0sgOj0gaGV4YWRlY2ltYWwgbnVtYmVyIChpLmUuIDB4MTIzKVxuIiBcCisJCSJFeGFtcGxlOiBjYW5pZChzZmYgMHgxMjMgc2ZmIDB4MTI0IHNmZiAweDEyNToweGYpXG4iKTsKK30KKworc3RhdGljIGludCBjYW5pZF9wYXJzZV9ydWxlKHN0cnVjdCBydWxlcyAqcnVsZXMsIHN0cnVjdCBic3RyICphLCBpbnQgaXNlZmYpCit7CisJdW5zaWduZWQgaW50IGNhbl9pZCA9IDA7CisJdW5zaWduZWQgaW50IGNhbl9tYXNrID0gMDsKKworCWlmIChzc2NhbmYoYS0+ZGF0YSwgIiUiU0NOeDMyICI6IiAiJSJTQ054MzIsICZjYW5faWQsICZjYW5fbWFzaykgIT0gMikgeworCQlpZiAoc3NjYW5mKGEtPmRhdGEsICIlIlNDTngzMiwgJmNhbl9pZCkgIT0gMSkgeworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJY2FuX21hc2sgPSAoaXNlZmYpID8gQ0FOX0VGRl9NQVNLIDogQ0FOX1NGRl9NQVNLOworCQl9CisJfQorCisJLyogU3RyZXRjaCBydWxlcyBhcnJheSB1cCB0byBFTV9DQU5JRF9SVUxFU19NQVggaWYgbmVjZXNzYXJ5ICovCisJaWYgKHJ1bGVzLT5ydWxlc19jbnQgPT0gcnVsZXMtPnJ1bGVzX2NhcGFjaXR5KSB7CisJCWlmIChydWxlcy0+cnVsZXNfY2FwYWNpdHkgPD0gRU1fQ0FOSURfUlVMRVNfTUFYLzIpIHsKKwkJCXJ1bGVzLT5ydWxlc19jYXBhY2l0eSAqPSAyOworCQkJcnVsZXMtPnJ1bGVzX3JhdyA9IHJlYWxsb2MocnVsZXMtPnJ1bGVzX3JhdywKKwkJCQlzaXplb2Yoc3RydWN0IGNhbl9maWx0ZXIpICogcnVsZXMtPnJ1bGVzX2NhcGFjaXR5KTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtMjsKKwkJfQorCX0KKworCXJ1bGVzLT5ydWxlc19yYXdbcnVsZXMtPnJ1bGVzX2NudF0uY2FuX2lkID0KKwkJY2FuX2lkIHwgKChpc2VmZikgPyBDQU5fRUZGX0ZMQUcgOiAwKTsKKwlydWxlcy0+cnVsZXNfcmF3W3J1bGVzLT5ydWxlc19jbnRdLmNhbl9tYXNrID0KKwkJY2FuX21hc2sgfCBDQU5fRUZGX0ZMQUc7CisKKwlydWxlcy0+cnVsZXNfY250Kys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYW5pZF9wYXJzZV9lb3B0KHN0cnVjdCBubG1zZ2hkciAqbiwgc3RydWN0IHRjZl9lbWF0Y2hfaGRyICpoZHIsCisJCQkgIHN0cnVjdCBic3RyICphcmdzKQoreworCWludCBpc2VmZiA9IDA7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHJ1bGVzIHJ1bGVzID0geworCQkucnVsZXNfY2FwYWNpdHkgPSAyNSwgLyogRGVub21pbmF0b3Igb2YgRU1fQ0FOSURfUlVMRVNfTUFYCisJCQlXaWxsIGJlIG11bHRpcGxpZWQgYnkgMiB0byBjYWxjdWxhdGUgdGhlIHNpemUgZm9yIHJlYWxsb2MoKSAqLworCQkucnVsZXNfY250ID0gMAorCX07CisKKyNkZWZpbmUgUEFSU0VfRVJSKENBUkcsIEZNVCwgQVJHUy4uLikgXAorCWVtX3BhcnNlX2Vycm9yKEVJTlZBTCwgYXJncywgQ0FSRywgJmNhbmlkX2VtYXRjaF91dGlsLCBGTVQsICMjQVJHUykKKworCWlmIChhcmdzID09IE5VTEwpCisJCXJldHVybiBQQVJTRV9FUlIoYXJncywgImNhbmlkOiBtaXNzaW5nIGFyZ3VtZW50cyIpOworCisJcnVsZXMucnVsZXNfcmF3ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgY2FuX2ZpbHRlcikgKiBydWxlcy5ydWxlc19jYXBhY2l0eSk7CisJbWVtc2V0KHJ1bGVzLnJ1bGVzX3JhdywgMCwgc2l6ZW9mKHN0cnVjdCBjYW5fZmlsdGVyKSAqIHJ1bGVzLnJ1bGVzX2NhcGFjaXR5KTsKKworCWRvIHsKKwkJaWYgKCFic3RyY21wKGFyZ3MsICJzZmYiKSkgeworCQkJaXNlZmYgPSAwOworCQl9IGVsc2UgaWYgKCFic3RyY21wKGFyZ3MsICJlZmYiKSkgeworCQkJaXNlZmYgPSAxOworCQl9IGVsc2UgeworCQkJcmV0ID0gUEFSU0VfRVJSKGFyZ3MsICJjYW5pZDogaW52YWxpZCBrZXkiKTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCisJCWFyZ3MgPSBic3RyX25leHQoYXJncyk7CisJCWlmIChhcmdzID09IE5VTEwpIHsKKwkJCXJldCA9IFBBUlNFX0VSUihhcmdzLCAiY2FuaWQ6IG1pc3NpbmcgYXJndW1lbnQiKTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCisJCXJldCA9IGNhbmlkX3BhcnNlX3J1bGUoJnJ1bGVzLCBhcmdzLCBpc2VmZik7CisJCWlmIChyZXQgPT0gLTEpIHsKKwkJCXJldCA9IFBBUlNFX0VSUihhcmdzLCAiY2FuaWQ6IEltcHJvcGVybHkgZm9ybWVkIENBTiBJRCAmIG1hc2tcbiIpOworCQkJZ290byBleGl0OworCQl9IGVsc2UgaWYgKHJldCA9PSAtMikgeworCQkJcmV0ID0gUEFSU0VfRVJSKGFyZ3MsICJjYW5pZDogVG9vIG1hbnkgYXJndW1lbnRzIG9uIGlucHV0XG4iKTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCX0gd2hpbGUgKChhcmdzID0gYnN0cl9uZXh0KGFyZ3MpKSAhPSBOVUxMKTsKKworCWFkZHJhd19sKG4sIE1BWF9NU0csIGhkciwgc2l6ZW9mKCpoZHIpKTsKKwlhZGRyYXdfbChuLCBNQVhfTVNHLCBydWxlcy5ydWxlc19yYXcsCisJCXNpemVvZihzdHJ1Y3QgY2FuX2ZpbHRlcikgKiBydWxlcy5ydWxlc19jbnQpOworCisjdW5kZWYgUEFSU0VfRVJSCitleGl0OgorCWZyZWUocnVsZXMucnVsZXNfcmF3KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNhbmlkX3ByaW50X2VvcHQoRklMRSAqZmQsIHN0cnVjdCB0Y2ZfZW1hdGNoX2hkciAqaGRyLCB2b2lkICpkYXRhLAorCQkJICBpbnQgZGF0YV9sZW4pCit7CisJc3RydWN0IGNhbl9maWx0ZXIgKmNvbmYgPSBkYXRhOyAvKiBBcnJheSB3aXRoIHJ1bGVzICovCisJaW50IHJ1bGVzX2NvdW50OworCWludCBpOworCisJcnVsZXNfY291bnQgPSBkYXRhX2xlbiAvIHNpemVvZihzdHJ1Y3QgY2FuX2ZpbHRlcik7CisKKwlmb3IgKGkgPSAwOyBpIDwgcnVsZXNfY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgY2FuX2ZpbHRlciAqcGNmbHRyID0gJmNvbmZbaV07CisKKwkJaWYgKHBjZmx0ci0+Y2FuX2lkICYgQ0FOX0VGRl9GTEFHKSB7CisJCQlpZiAocGNmbHRyLT5jYW5fbWFzayA9PSAoQ0FOX0VGRl9GTEFHIHwgQ0FOX0VGRl9NQVNLKSkKKwkJCQlmcHJpbnRmKGZkLCAiZWZmIDB4JSJQUklYMzIsCisJCQkJCQlwY2ZsdHItPmNhbl9pZCAmIENBTl9FRkZfTUFTSyk7CisJCQllbHNlCisJCQkJZnByaW50ZihmZCwgImVmZiAweCUiUFJJWDMyIjoweCUiUFJJWDMyLAorCQkJCQkJcGNmbHRyLT5jYW5faWQgJiBDQU5fRUZGX01BU0ssCisJCQkJCQlwY2ZsdHItPmNhbl9tYXNrICYgQ0FOX0VGRl9NQVNLKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChwY2ZsdHItPmNhbl9tYXNrID09IChDQU5fRUZGX0ZMQUcgfCBDQU5fU0ZGX01BU0spKQorCQkJCWZwcmludGYoZmQsICJzZmYgMHglIlBSSVgzMiwKKwkJCQkJCXBjZmx0ci0+Y2FuX2lkICYgQ0FOX1NGRl9NQVNLKTsKKwkJCWVsc2UKKwkJCQlmcHJpbnRmKGZkLCAic2ZmIDB4JSJQUklYMzIiOjB4JSJQUklYMzIsCisJCQkJCQlwY2ZsdHItPmNhbl9pZCAmIENBTl9TRkZfTUFTSywKKwkJCQkJCXBjZmx0ci0+Y2FuX21hc2sgJiBDQU5fU0ZGX01BU0spOworCQl9CisKKwkJaWYgKChpICsgMSkgPCBydWxlc19jb3VudCkKKwkJCWZwcmludGYoZmQsICIgIik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBlbWF0Y2hfdXRpbCBjYW5pZF9lbWF0Y2hfdXRpbCA9IHsKKwkua2luZCA9ICJjYW5pZCIsCisJLmtpbmRfbnVtID0gVENGX0VNX0NBTklELAorCS5wYXJzZV9lb3B0ID0gY2FuaWRfcGFyc2VfZW9wdCwKKwkucHJpbnRfZW9wdCA9IGNhbmlkX3ByaW50X2VvcHQsCisJLnByaW50X3VzYWdlID0gY2FuaWRfcHJpbnRfdXNhZ2UKK307CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy9lbV9jbXAuYyBiL2lwcm91dGUyL3RjL2VtX2NtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNmQwMGUKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy9lbV9jbXAuYwpAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIGVtX2NtcC5jCQlTaW1wbGUgY29tcGFyaXNvbiBFbWF0Y2gKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJtX2VtYXRjaC5oIgorI2luY2x1ZGUgPGxpbnV4L3RjX2VtYXRjaC90Y19lbV9jbXAuaD4KKworZXh0ZXJuIHN0cnVjdCBlbWF0Y2hfdXRpbCBjbXBfZW1hdGNoX3V0aWw7CisKK3N0YXRpYyB2b2lkIGNtcF9wcmludF91c2FnZShGSUxFICpmZCkKK3sKKwlmcHJpbnRmKGZkLAorCSAgICAiVXNhZ2U6IGNtcChBTElHTiBhdCBPRkZTRVQgWyBBVFRSUyBdIHsgZXEgfCBsdCB8IGd0IH0gVkFMVUUpXG4iIFwKKwkgICAgIndoZXJlOiBBTElHTiAgOj0geyB1OCB8IHUxNiB8IHUzMiB9XG4iIFwKKwkgICAgIiAgICAgICBBVFRSUyAgOj0gWyBsYXllciBMQVlFUiBdIFsgbWFzayBNQVNLIF0gWyB0cmFucyBdXG4iIFwKKwkgICAgIiAgICAgICBMQVlFUiAgOj0geyBsaW5rIHwgbmV0d29yayB8IHRyYW5zcG9ydCB8IDAuLiVkIH1cbiIgXAorCSAgICAiXG4iIFwKKwkgICAgIkV4YW1wbGU6IGNtcCh1MTYgYXQgMyBsYXllciAyIG1hc2sgMHhmZjAwIGd0IDIwKVxuIiwKKwkgICAgVENGX0xBWUVSX01BWCk7Cit9CisKK3N0YXRpYyBpbnQgY21wX3BhcnNlX2VvcHQoc3RydWN0IG5sbXNnaGRyICpuLCBzdHJ1Y3QgdGNmX2VtYXRjaF9oZHIgKmhkciwKKwkJCSAgc3RydWN0IGJzdHIgKmFyZ3MpCit7CisJc3RydWN0IGJzdHIgKmE7CisJaW50IGFsaWduLCBvcG5kID0gMDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IDAsIGxheWVyID0gVENGX0xBWUVSX05FVFdPUkssIG1hc2sgPSAwLCB2YWx1ZSA9IDA7CisJaW50IG9mZnNldF9wcmVzZW50ID0gMCwgdmFsdWVfcHJlc2VudCA9IDA7CisJc3RydWN0IHRjZl9lbV9jbXAgY21wOworCisJbWVtc2V0KCZjbXAsIDAsIHNpemVvZihjbXApKTsKKworI2RlZmluZSBQQVJTRV9FUlIoQ0FSRywgRk1ULCBBUkdTLi4uKSBcCisJZW1fcGFyc2VfZXJyb3IoRUlOVkFMLCBhcmdzLCBDQVJHLCAmY21wX2VtYXRjaF91dGlsLCBGTVQgLCMjQVJHUykKKworCWlmIChhcmdzID09IE5VTEwpCisJCXJldHVybiBQQVJTRV9FUlIoYXJncywgImNtcDogbWlzc2luZyBhcmd1bWVudHMiKTsKKworCWlmICghYnN0cmNtcChhcmdzLCAidTgiKSkKKwkJYWxpZ24gPSBUQ0ZfRU1fQUxJR05fVTg7CisJZWxzZSBpZiAoIWJzdHJjbXAoYXJncywgInUxNiIpKQorCQlhbGlnbiA9IFRDRl9FTV9BTElHTl9VMTY7CisJZWxzZSBpZiAoIWJzdHJjbXAoYXJncywgInUzMiIpKQorCQlhbGlnbiA9IFRDRl9FTV9BTElHTl9VMzI7CisJZWxzZQorCQlyZXR1cm4gUEFSU0VfRVJSKGFyZ3MsICJjbXA6IGludmFsaWQgYWxpZ25tZW50Iik7CisKKwlmb3IgKGEgPSBic3RyX25leHQoYXJncyk7IGE7IGEgPSBic3RyX25leHQoYSkpIHsKKwkJaWYgKCFic3RyY21wKGEsICJhdCIpKSB7CisJCQlpZiAoYS0+bmV4dCA9PSBOVUxMKQorCQkJCXJldHVybiBQQVJTRV9FUlIoYSwgImNtcDogbWlzc2luZyBhcmd1bWVudCIpOworCQkJYSA9IGJzdHJfbmV4dChhKTsKKworCQkJb2Zmc2V0ID0gYnN0cnRvdWwoYSk7CisJCQlpZiAob2Zmc2V0ID09IFVMT05HX01BWCkKKwkJCQlyZXR1cm4gUEFSU0VfRVJSKGEsICJjbXA6IGludmFsaWQgb2Zmc2V0LCAiIFwKKwkJCQkgICAgIm11c3QgYmUgbnVtZXJpYyIpOworCisJCQlvZmZzZXRfcHJlc2VudCA9IDE7CisJCX0gZWxzZSBpZiAoIWJzdHJjbXAoYSwgImxheWVyIikpIHsKKwkJCWlmIChhLT5uZXh0ID09IE5VTEwpCisJCQkJcmV0dXJuIFBBUlNFX0VSUihhLCAiY21wOiBtaXNzaW5nIGFyZ3VtZW50Iik7CisJCQlhID0gYnN0cl9uZXh0KGEpOworCisJCQlsYXllciA9IHBhcnNlX2xheWVyKGEpOworCQkJaWYgKGxheWVyID09IElOVF9NQVgpIHsKKwkJCQlsYXllciA9IGJzdHJ0b3VsKGEpOworCQkJCWlmIChsYXllciA9PSBVTE9OR19NQVgpCisJCQkJCXJldHVybiBQQVJTRV9FUlIoYSwgImNtcDogaW52YWxpZCAiIFwKKwkJCQkJICAgICJsYXllciIpOworCQkJfQorCisJCQlpZiAobGF5ZXIgPiBUQ0ZfTEFZRVJfTUFYKQorCQkJCXJldHVybiBQQVJTRV9FUlIoYSwgImNtcDogaWxsZWdhbCBsYXllciwgIiBcCisJCQkJICAgICJtdXN0IGJlIGluIDAuLiVkIiwgVENGX0xBWUVSX01BWCk7CisJCX0gZWxzZSBpZiAoIWJzdHJjbXAoYSwgIm1hc2siKSkgeworCQkJaWYgKGEtPm5leHQgPT0gTlVMTCkKKwkJCQlyZXR1cm4gUEFSU0VfRVJSKGEsICJjbXA6IG1pc3NpbmcgYXJndW1lbnQiKTsKKwkJCWEgPSBic3RyX25leHQoYSk7CisKKwkJCW1hc2sgPSBic3RydG91bChhKTsKKwkJCWlmIChtYXNrID09IFVMT05HX01BWCkKKwkJCQlyZXR1cm4gUEFSU0VfRVJSKGEsICJjbXA6IGludmFsaWQgbWFzayIpOworCQl9IGVsc2UgaWYgKCFic3RyY21wKGEsICJ0cmFucyIpKSB7CisJCQljbXAuZmxhZ3MgfD0gVENGX0VNX0NNUF9UUkFOUzsKKwkJfSBlbHNlIGlmICghYnN0cmNtcChhLCAiZXEiKSB8fCAhYnN0cmNtcChhLCAiZ3QiKSB8fAorCQkgICAgIWJzdHJjbXAoYSwgImx0IikpIHsKKworCQkJaWYgKCFic3RyY21wKGEsICJlcSIpKQorCQkJCW9wbmQgPSBUQ0ZfRU1fT1BORF9FUTsKKwkJCWVsc2UgaWYgKCFic3RyY21wKGEsICJndCIpKQorCQkJCW9wbmQgPSBUQ0ZfRU1fT1BORF9HVDsKKwkJCWVsc2UgaWYgKCFic3RyY21wKGEsICJsdCIpKQorCQkJCW9wbmQgPSBUQ0ZfRU1fT1BORF9MVDsKKworCQkJaWYgKGEtPm5leHQgPT0gTlVMTCkKKwkJCQlyZXR1cm4gUEFSU0VfRVJSKGEsICJjbXA6IG1pc3NpbmcgYXJndW1lbnQiKTsKKwkJCWEgPSBic3RyX25leHQoYSk7CisKKwkJCXZhbHVlID0gYnN0cnRvdWwoYSk7CisJCQlpZiAodmFsdWUgPT0gVUxPTkdfTUFYKQorCQkJCXJldHVybiBQQVJTRV9FUlIoYSwgImNtcDogaW52YWxpZCB2YWx1ZSIpOworCisJCQl2YWx1ZV9wcmVzZW50ID0gMTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gUEFSU0VfRVJSKGEsICJuYnl0ZTogdW5rbm93biBwYXJhbWV0ZXIiKTsKKwl9CisKKwlpZiAob2Zmc2V0X3ByZXNlbnQgPT0gMCB8fCB2YWx1ZV9wcmVzZW50ID09IDApCisJCXJldHVybiBQQVJTRV9FUlIoYSwgImNtcDogb2Zmc2V0IGFuZCB2YWx1ZSByZXF1aXJlZCIpOworCisJY21wLnZhbCA9IChfX3UzMikgdmFsdWU7CisJY21wLm1hc2sgPSAoX191MzIpIG1hc2s7CisJY21wLm9mZiA9IChfX3UxNikgb2Zmc2V0OworCWNtcC5hbGlnbiA9IChfX3U4KSBhbGlnbjsKKwljbXAubGF5ZXIgPSAoX191OCkgbGF5ZXI7CisJY21wLm9wbmQgPSAoX191OCkgb3BuZDsKKworCWFkZHJhd19sKG4sIE1BWF9NU0csIGhkciwgc2l6ZW9mKCpoZHIpKTsKKwlhZGRyYXdfbChuLCBNQVhfTVNHLCAmY21wLCBzaXplb2YoY21wKSk7CisKKyN1bmRlZiBQQVJTRV9FUlIKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjbXBfcHJpbnRfZW9wdChGSUxFICpmZCwgc3RydWN0IHRjZl9lbWF0Y2hfaGRyICpoZHIsIHZvaWQgKmRhdGEsCisJCQkgIGludCBkYXRhX2xlbikKK3sKKwlzdHJ1Y3QgdGNmX2VtX2NtcCAqY21wID0gZGF0YTsKKworCWlmIChkYXRhX2xlbiA8IHNpemVvZigqY21wKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNNUCBoZWFkZXIgc2l6ZSBtaXNtYXRjaFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoY21wLT5hbGlnbiA9PSBUQ0ZfRU1fQUxJR05fVTgpCisJCWZwcmludGYoZmQsICJ1OCAiKTsKKwllbHNlIGlmIChjbXAtPmFsaWduID09IFRDRl9FTV9BTElHTl9VMTYpCisJCWZwcmludGYoZmQsICJ1MTYgIik7CisJZWxzZSBpZiAoY21wLT5hbGlnbiA9PSBUQ0ZfRU1fQUxJR05fVTMyKQorCQlmcHJpbnRmKGZkLCAidTMyICIpOworCisJZnByaW50ZihmZCwgImF0ICVkIGxheWVyICVkICIsIGNtcC0+b2ZmLCBjbXAtPmxheWVyKTsKKworCWlmIChjbXAtPm1hc2spCisJCWZwcmludGYoZmQsICJtYXNrIDB4JXggIiwgY21wLT5tYXNrKTsKKworCWlmIChjbXAtPmZsYWdzICYgVENGX0VNX0NNUF9UUkFOUykKKwkJZnByaW50ZihmZCwgInRyYW5zICIpOworCisJaWYgKGNtcC0+b3BuZCA9PSBUQ0ZfRU1fT1BORF9FUSkKKwkJZnByaW50ZihmZCwgImVxICIpOworCWVsc2UgaWYgKGNtcC0+b3BuZCA9PSBUQ0ZfRU1fT1BORF9MVCkKKwkJZnByaW50ZihmZCwgImx0ICIpOworCWVsc2UgaWYgKGNtcC0+b3BuZCA9PSBUQ0ZfRU1fT1BORF9HVCkKKwkJZnByaW50ZihmZCwgImd0ICIpOworCisJZnByaW50ZihmZCwgIiVkIiwgY21wLT52YWwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBlbWF0Y2hfdXRpbCBjbXBfZW1hdGNoX3V0aWwgPSB7CisJLmtpbmQgPSAiY21wIiwKKwkua2luZF9udW0gPSBUQ0ZfRU1fQ01QLAorCS5wYXJzZV9lb3B0ID0gY21wX3BhcnNlX2VvcHQsCisJLnByaW50X2VvcHQgPSBjbXBfcHJpbnRfZW9wdCwKKwkucHJpbnRfdXNhZ2UgPSBjbXBfcHJpbnRfdXNhZ2UKK307CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy9lbV9pcHNldC5jIGIvaXByb3V0ZTIvdGMvZW1faXBzZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmQwZDE1Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGMvZW1faXBzZXQuYwpAQCAtMCwwICsxLDI2NSBAQAorLyoKKyAqIGVtX2lwc2V0LmMJCUlQc2V0IEVtYXRjaAorICoKKyAqIChDKSAyMDEyIEZsb3JpYW4gV2VzdHBoYWwgPGZ3QHN0cmxlbi5kZT4KKyAqCisgKiBQYXJ0cyB0YWtlbiBmcm9tIGlwdGFibGVzIGxpYnh0X3NldC5oOgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIgSm9ha2ltIEF4ZWxzc29uIDxnb3plbUBsaW51eC5udT4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIFBhdHJpY2sgU2NoYWFmIDxib2ZAYm9mLmRlPgorICogICAgICAgICAgICAgICAgICAgICAgICAgTWFydGluIEpvc2Vmc3NvbiA8Z2FuZGFsZkB3bHVnLndlc3Riby5zZT4KKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIEpvenNlZiBLYWRsZWNzaWsgPGthZGxlY0BibGFja2hvbGUua2ZraS5odT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKKyNpbmNsdWRlIDx4dGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldC5oPgorCisjaWZuZGVmIElQU0VUX0lOVkFMSURfSUQKK3R5cGVkZWYgX191MTYgaXBfc2V0X2lkX3Q7CisKK2VudW0gaXBfc2V0X2RpbSB7CisJSVBTRVRfRElNX1pFUk8gPSAwLAorCUlQU0VUX0RJTV9PTkUsCisJSVBTRVRfRElNX1RXTywKKwlJUFNFVF9ESU1fVEhSRUUsCisJSVBTRVRfRElNX01BWCA9IDYsCit9OworI2VuZGlmIC8qIElQU0VUX0lOVkFMSURfSUQgKi8KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9zZXQuaD4KKyNpbmNsdWRlICJtX2VtYXRjaC5oIgorCisjaWZuZGVmIElQU0VUX0lOVkFMSURfSUQKKyNkZWZpbmUgSVBTRVRfSU5WQUxJRF9JRAk2NTUzNQorI2RlZmluZSBTT19JUF9TRVQJCTgzCisKK3VuaW9uIGlwX3NldF9uYW1lX2luZGV4IHsKKwljaGFyIG5hbWVbSVBTRVRfTUFYTkFNRUxFTl07CisJX191MTYgaW5kZXg7Cit9OworCisjZGVmaW5lIElQX1NFVF9PUF9HRVRfQllOQU1FCTB4MDAwMDAwMDYJLyogR2V0IHNldCBpbmRleCBieSBuYW1lICovCitzdHJ1Y3QgaXBfc2V0X3JlcV9nZXRfc2V0IHsKKwl1bnNpZ25lZCBvcDsKKwl1bnNpZ25lZCB2ZXJzaW9uOworCXVuaW9uIGlwX3NldF9uYW1lX2luZGV4IHNldDsKK307CisKKyNkZWZpbmUgSVBfU0VUX09QX0dFVF9CWUlOREVYCTB4MDAwMDAwMDcJLyogR2V0IHNldCBuYW1lIGJ5IGluZGV4ICovCisvKiBVc2VzIGlwX3NldF9yZXFfZ2V0X3NldCAqLworCisjZGVmaW5lIElQX1NFVF9PUF9WRVJTSU9OCTB4MDAwMDAxMDAJLyogQXNrIGtlcm5lbCB2ZXJzaW9uICovCitzdHJ1Y3QgaXBfc2V0X3JlcV92ZXJzaW9uIHsKKwl1bnNpZ25lZCBvcDsKKwl1bnNpZ25lZCB2ZXJzaW9uOworfTsKKyNlbmRpZiAvKiBJUFNFVF9JTlZBTElEX0lEICovCisKK2V4dGVybiBzdHJ1Y3QgZW1hdGNoX3V0aWwgaXBzZXRfZW1hdGNoX3V0aWw7CisKK3N0YXRpYyBpbnQgZ2V0X3ZlcnNpb24odW5zaWduZWQgKnZlcnNpb24pCit7CisJaW50IHJlcywgc29ja2ZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfUkFXLCBJUFBST1RPX1JBVyk7CisJc3RydWN0IGlwX3NldF9yZXFfdmVyc2lvbiByZXFfdmVyc2lvbjsKKwlzb2NrbGVuX3Qgc2l6ZSA9IHNpemVvZihyZXFfdmVyc2lvbik7CisKKwlpZiAoc29ja2ZkIDwgMCkgeworCQlmcHV0cygiQ2FuJ3Qgb3BlbiBzb2NrZXQgdG8gaXBzZXQuXG4iLCBzdGRlcnIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmVxX3ZlcnNpb24ub3AgPSBJUF9TRVRfT1BfVkVSU0lPTjsKKwlyZXMgPSBnZXRzb2Nrb3B0KHNvY2tmZCwgU09MX0lQLCBTT19JUF9TRVQsICZyZXFfdmVyc2lvbiwgJnNpemUpOworCWlmIChyZXMgIT0gMCkgeworCQlwZXJyb3IoInh0X3NldCBnZXRzb2Nrb3B0Iik7CisJCXJldHVybiAtMTsKKwl9CisKKwkqdmVyc2lvbiA9IHJlcV92ZXJzaW9uLnZlcnNpb247CisJcmV0dXJuIHNvY2tmZDsKK30KKworc3RhdGljIGludCBkb19nZXRzb2Nrb3B0KHN0cnVjdCBpcF9zZXRfcmVxX2dldF9zZXQgKnJlcSkKK3sKKwlpbnQgc29ja2ZkLCByZXM7CisJc29ja2xlbl90IHNpemUgPSBzaXplb2Yoc3RydWN0IGlwX3NldF9yZXFfZ2V0X3NldCk7CisJc29ja2ZkID0gZ2V0X3ZlcnNpb24oJnJlcS0+dmVyc2lvbik7CisJaWYgKHNvY2tmZCA8IDApCisJCXJldHVybiAtMTsKKwlyZXMgPSBnZXRzb2Nrb3B0KHNvY2tmZCwgU09MX0lQLCBTT19JUF9TRVQsIHJlcSwgJnNpemUpOworCWlmIChyZXMgIT0gMCkKKwkJcGVycm9yKCJQcm9ibGVtIHdoZW4gY29tbXVuaWNhdGluZyB3aXRoIGlwc2V0Iik7CisJY2xvc2Uoc29ja2ZkKTsKKwlpZiAocmVzICE9IDApCisJCXJldHVybiAtMTsKKworCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3QgaXBfc2V0X3JlcV9nZXRfc2V0KSkgeworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJJbmNvcnJlY3QgcmV0dXJuIHNpemUgZnJvbSBrZXJuZWwgZHVyaW5nIGlwc2V0IGxvb2t1cCwgIgorCQkJIih3YW50ICV6dSwgZ290ICV6dSlcbiIsCisJCQlzaXplb2Yoc3RydWN0IGlwX3NldF9yZXFfZ2V0X3NldCksIChzaXplX3Qpc2l6ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50CitnZXRfc2V0X2J5aWQoY2hhciAqc2V0bmFtZSwgdW5zaWduZWQgaW50IGlkeCkKK3sKKwlzdHJ1Y3QgaXBfc2V0X3JlcV9nZXRfc2V0IHJlcTsKKwlpbnQgcmVzOworCisJcmVxLm9wID0gSVBfU0VUX09QX0dFVF9CWUlOREVYOworCXJlcS5zZXQuaW5kZXggPSBpZHg7CisJcmVzID0gZG9fZ2V0c29ja29wdCgmcmVxKTsKKwlpZiAocmVzICE9IDApCisJCXJldHVybiAtMTsKKwlpZiAocmVxLnNldC5uYW1lWzBdID09ICdcMCcpIHsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiU2V0IHdpdGggaW5kZXggJWkgaW4ga2VybmVsIGRvZXNuJ3QgZXhpc3QuXG4iLCBpZHgpOworCQlyZXR1cm4gLTE7CisJfQorCisJc3RybmNweShzZXRuYW1lLCByZXEuc2V0Lm5hbWUsIElQU0VUX01BWE5BTUVMRU4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitnZXRfc2V0X2J5bmFtZShjb25zdCBjaGFyICpzZXRuYW1lLCBzdHJ1Y3QgeHRfc2V0X2luZm8gKmluZm8pCit7CisJc3RydWN0IGlwX3NldF9yZXFfZ2V0X3NldCByZXE7CisJaW50IHJlczsKKworCXJlcS5vcCA9IElQX1NFVF9PUF9HRVRfQllOQU1FOworCXN0cm5jcHkocmVxLnNldC5uYW1lLCBzZXRuYW1lLCBJUFNFVF9NQVhOQU1FTEVOKTsKKwlyZXEuc2V0Lm5hbWVbSVBTRVRfTUFYTkFNRUxFTiAtIDFdID0gJ1wwJzsKKwlyZXMgPSBkb19nZXRzb2Nrb3B0KCZyZXEpOworCWlmIChyZXMgIT0gMCkKKwkJcmV0dXJuIC0xOworCWlmIChyZXEuc2V0LmluZGV4ID09IElQU0VUX0lOVkFMSURfSUQpCisJCXJldHVybiAtMTsKKwlpbmZvLT5pbmRleCA9IHJlcS5zZXQuaW5kZXg7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3BhcnNlX2RpcnMoY29uc3QgY2hhciAqb3B0X2FyZywgc3RydWN0IHh0X3NldF9pbmZvICppbmZvKQoreworICAgICAgICBjaGFyICpzYXZlZCA9IHN0cmR1cChvcHRfYXJnKTsKKyAgICAgICAgY2hhciAqcHRyLCAqdG1wID0gc2F2ZWQ7CisKKwlpZiAoIXRtcCkgeworCQlwZXJyb3IoInN0cmR1cCIpOworCQlyZXR1cm4gLTE7CisJfQorCisgICAgICAgIHdoaWxlIChpbmZvLT5kaW0gPCBJUFNFVF9ESU1fTUFYICYmIHRtcCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW5mby0+ZGltKys7CisgICAgICAgICAgICAgICAgcHRyID0gc3Ryc2VwKCZ0bXAsICIsIik7CisgICAgICAgICAgICAgICAgaWYgKHN0cm5jbXAocHRyLCAic3JjIiwgMykgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZsYWdzIHw9ICgxIDw8IGluZm8tPmRpbSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RybmNtcChwdHIsICJkc3QiLCAzKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcHV0cygiWW91IG11c3Qgc3BlY2lmeSAodGhlIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mKSAnc3JjJyBvciAnZHN0J1xuIiwgc3RkZXJyKTsKKwkJCWZyZWUoc2F2ZWQpOworCQkJcmV0dXJuIC0xOworCQl9CisgICAgICAgIH0KKworICAgICAgICBpZiAodG1wKQorICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2FuJ3QgYmUgbW9yZSBzcmMvZHN0IG9wdGlvbnMgdGhhbiAldSIsIElQU0VUX0RJTV9NQVgpOworICAgICAgICBmcmVlKHNhdmVkKTsKKwlyZXR1cm4gdG1wID8gLTEgOiAwOworfQorCitzdGF0aWMgdm9pZCBpcHNldF9wcmludF91c2FnZShGSUxFICpmZCkKK3sKKwlmcHJpbnRmKGZkLAorCSAgICAiVXNhZ2U6IGlwc2V0KFNFVE5BTUUgRkxBR1MpXG4iIFwKKwkgICAgIndoZXJlOiBTRVROQU1FOj0gc3RyaW5nXG4iIFwKKwkgICAgIiAgICAgICBGTEFHUyAgOj0geyBGTEFHWyxGTEFHU10gfVxuIiBcCisJICAgICIgICAgICAgRkxBRyAgIDo9IHsgc3JjIHwgZHN0IH1cbiIgXAorCSAgICAiXG4iIFwKKwkgICAgIkV4YW1wbGU6ICdpcHNldChidWxrIHNyYyxkc3QpJ1xuIik7Cit9CisKK3N0YXRpYyBpbnQgaXBzZXRfcGFyc2VfZW9wdChzdHJ1Y3Qgbmxtc2doZHIgKm4sIHN0cnVjdCB0Y2ZfZW1hdGNoX2hkciAqaGRyLAorCQkJICAgIHN0cnVjdCBic3RyICphcmdzKQoreworCXN0cnVjdCB4dF9zZXRfaW5mbyBzZXRfaW5mbzsKKwlpbnQgcmV0OworCisJbWVtc2V0KCZzZXRfaW5mbywgMCwgc2l6ZW9mKHNldF9pbmZvKSk7CisKKyNkZWZpbmUgUEFSU0VfRVJSKENBUkcsIEZNVCwgQVJHUy4uLikgXAorCWVtX3BhcnNlX2Vycm9yKEVJTlZBTCwgYXJncywgQ0FSRywgJmlwc2V0X2VtYXRjaF91dGlsLCBGTVQgLCMjQVJHUykKKworCWlmIChhcmdzID09IE5VTEwpCisJCXJldHVybiBQQVJTRV9FUlIoYXJncywgImlwc2V0OiBtaXNzaW5nIHNldCBuYW1lIik7CisKKwlpZiAoYXJncy0+bGVuID49IElQU0VUX01BWE5BTUVMRU4pCisJCXJldHVybiBQQVJTRV9FUlIoYXJncywgImlwc2V0OiBzZXQgbmFtZSB0b28gbG9uZyAobWF4ICV1KSIsIElQU0VUX01BWE5BTUVMRU4gLSAxKTsKKwlyZXQgPSBnZXRfc2V0X2J5bmFtZShhcmdzLT5kYXRhLCAmc2V0X2luZm8pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gUEFSU0VfRVJSKGFyZ3MsICJpcHNldDogdW5rbm93biBzZXQgbmFtZSAnJXMnIiwgYXJncy0+ZGF0YSk7CisKKwlpZiAoYXJncy0+bmV4dCA9PSBOVUxMKQorCQlyZXR1cm4gUEFSU0VfRVJSKGFyZ3MsICJpcHNldDogbWlzc2luZyBzZXQgZmxhZ3MiKTsKKworCWFyZ3MgPSBic3RyX25leHQoYXJncyk7CisJaWYgKHBhcnNlX2RpcnMoYXJncy0+ZGF0YSwgJnNldF9pbmZvKSkKKwkJcmV0dXJuIFBBUlNFX0VSUihhcmdzLCAiaXBzZXQ6IGVycm9yIHBhcnNpbmcgc2V0IGZsYWdzIik7CisKKwlpZiAoYXJncy0+bmV4dCkgeworCQlhcmdzID0gYnN0cl9uZXh0KGFyZ3MpOworCQlyZXR1cm4gUEFSU0VfRVJSKGFyZ3MsICJpcHNldDogdW5rbm93biBwYXJhbWV0ZXIiKTsKKwl9CisKKwlhZGRyYXdfbChuLCBNQVhfTVNHLCBoZHIsIHNpemVvZigqaGRyKSk7CisJYWRkcmF3X2wobiwgTUFYX01TRywgJnNldF9pbmZvLCBzaXplb2Yoc2V0X2luZm8pKTsKKworI3VuZGVmIFBBUlNFX0VSUgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwc2V0X3ByaW50X2VvcHQoRklMRSAqZmQsIHN0cnVjdCB0Y2ZfZW1hdGNoX2hkciAqaGRyLCB2b2lkICpkYXRhLAorCQkJICAgIGludCBkYXRhX2xlbikKK3sKKwlpbnQgaTsKKyAgICAgICAgY2hhciBzZXRuYW1lW0lQU0VUX01BWE5BTUVMRU5dOworCWNvbnN0IHN0cnVjdCB4dF9zZXRfaW5mbyAqc2V0X2luZm8gPSBkYXRhOworCisJaWYgKGRhdGFfbGVuICE9IHNpemVvZigqc2V0X2luZm8pKSB7CisJCWZwcmludGYoc3RkZXJyLCAieHRfc2V0X2luZm8gc3RydWN0IHNpemUgbWlzbWF0Y2hcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisgICAgICAgIGlmIChnZXRfc2V0X2J5aWQoc2V0bmFtZSwgc2V0X2luZm8tPmluZGV4KSkKKwkJcmV0dXJuIC0xOworCWZwdXRzKHNldG5hbWUsIGZkKTsKKwlmb3IgKGkgPSAxOyBpIDw9IHNldF9pbmZvLT5kaW07IGkrKykgeworCQlmcHJpbnRmKGZkLCAiJXMlcyIsIGkgPT0gMSA/ICIgIiA6ICIsIiwgc2V0X2luZm8tPmZsYWdzICYgKDEgPDwgaSkgPyAic3JjIiA6ICJkc3QiKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGVtYXRjaF91dGlsIGlwc2V0X2VtYXRjaF91dGlsID0geworCS5raW5kID0gImlwc2V0IiwKKwkua2luZF9udW0gPSBUQ0ZfRU1fSVBTRVQsCisJLnBhcnNlX2VvcHQgPSBpcHNldF9wYXJzZV9lb3B0LAorCS5wcmludF9lb3B0ID0gaXBzZXRfcHJpbnRfZW9wdCwKKwkucHJpbnRfdXNhZ2UgPSBpcHNldF9wcmludF91c2FnZQorfTsKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RjL2VtX21ldGEuYyBiL2lwcm91dGUyL3RjL2VtX21ldGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjRmMzMzCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGMvZW1fbWV0YS5jCkBAIC0wLDAgKzEsNTQ2IEBACisvKgorICogZW1fbWV0YS5jCQlNZXRhZGF0YSBFbWF0Y2gKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJtX2VtYXRjaC5oIgorI2luY2x1ZGUgPGxpbnV4L3RjX2VtYXRjaC90Y19lbV9tZXRhLmg+CisKK2V4dGVybiBzdHJ1Y3QgZW1hdGNoX3V0aWwgbWV0YV9lbWF0Y2hfdXRpbDsKKworc3RhdGljIHZvaWQgbWV0YV9wcmludF91c2FnZShGSUxFICpmZCkKK3sKKwlmcHJpbnRmKGZkLAorCSAgICAiVXNhZ2U6IG1ldGEoT0JKRUNUIHsgZXEgfCBsdCB8IGd0IH0gT0JKRUNUKVxuIiBcCisJICAgICJ3aGVyZTogT0JKRUNUICA6PSB7IE1FVEFfSUQgfCBWQUxVRSB9XG4iIFwKKwkgICAgIiAgICAgICBNRVRBX0lEIDo9IGlkIFsgc2hpZnQgU0hJRlQgXSBbIG1hc2sgTUFTSyBdXG4iIFwKKwkgICAgIlxuIiBcCisJICAgICJFeGFtcGxlOiBtZXRhKG5mX21hcmsgZ3QgMjQpXG4iIFwKKwkgICAgIiAgICAgICAgIG1ldGEoaW5kZXYgc2hpZnQgMSBlcSBcInBwcFwiKVxuIiBcCisJICAgICIgICAgICAgICBtZXRhKHRjaW5kZXggbWFzayAweGYwIGVxIDB4ZjApXG4iIFwKKwkgICAgIlxuIiBcCisJICAgICJGb3IgYSBsaXN0IG9mIG1ldGEgaWRlbnRpZmllcnMsIHVzZSBtZXRhKGxpc3QpLlxuIik7Cit9CisKK3N0cnVjdCBtZXRhX2VudHJ5IHsKKwlpbnQJCWlkOworCWNoYXIgKgkJa2luZDsKKwljaGFyICoJCW1hc2s7CisJY2hhciAqCQlkZXNjOworfSBtZXRhX3RhYmxlW10gPSB7CisjZGVmaW5lIFRDRl9NRVRBX0lEX1NFQ1RJT04gMAorI2RlZmluZSBfX0EoaWQsIG5hbWUsIG1hc2ssIGRlc2MpIHsgVENGX01FVEFfSURfIyNpZCwgbmFtZSwgbWFzaywgZGVzYyB9CisJX19BKFNFQ1RJT04sCQkiR2VuZXJpYyIsICIiLCAiIiksCisJX19BKFJBTkRPTSwJCSJyYW5kb20iLAkiaSIsCisJCQkJIlJhbmRvbSB2YWx1ZSAoMzIgYml0KSIpLAorCV9fQShMT0FEQVZHXzAsCQkibG9hZGF2Z18xIiwJImkiLAorCQkJCSJMb2FkIGF2ZXJhZ2UgaW4gbGFzdCBtaW51dGUiKSwKKwlfX0EoTE9BREFWR18xLAkJImxvYWRhdmdfNSIsCSJpIiwKKwkJCQkiTG9hZCBhdmVyYWdlIGluIGxhc3QgNSBtaW51dGVzIiksCisJX19BKExPQURBVkdfMiwJCSJsb2FkYXZnXzE1IiwJImkiLAorCQkJCSJMb2FkIGF2ZXJhZ2UgaW4gbGFzdCAxNSBtaW51dGVzIiksCisKKwlfX0EoU0VDVElPTiwJCSJJbnRlcmZhY2VzIiwgIiIsICIiKSwKKwlfX0EoREVWLAkJImRldiIsCQkiaXYiLAorCQkJCSJEZXZpY2UgdGhlIHBhY2tldCBpcyBvbiIpLAorCV9fQShTRUNUSU9OLAkJIlBhY2tldCBhdHRyaWJ1dGVzIiwgIiIsICIiKSwKKwlfX0EoUFJJT1JJVFksCQkicHJpb3JpdHkiLAkiaSIsCisJCQkJIlByaW9yaXR5IG9mIHBhY2tldCIpLAorCV9fQShQUk9UT0NPTCwJCSJwcm90b2NvbCIsCSJpIiwKKwkJCQkiTGluayBsYXllciBwcm90b2NvbCIpLAorCV9fQShQS1RUWVBFLAkJInBrdF90eXBlIiwJImkiLAorCQkJCSJQYWNrZXQgdHlwZSAodW5pfG11bHRpfGJyb2FkfC4uLiljYXN0IiksCisJX19BKFBLVExFTiwJCSJwa3RfbGVuIiwJImkiLAorCQkJCSJMZW5ndGggb2YgcGFja2V0IiksCisJX19BKERBVEFMRU4sCQkiZGF0YV9sZW4iLAkiaSIsCisJCQkJIkxlbmd0aCBvZiBkYXRhIGluIHBhY2tldCIpLAorCV9fQShNQUNMRU4sCQkibWFjX2xlbiIsCSJpIiwKKwkJCQkiTGVuZ3RoIG9mIGxpbmsgbGF5ZXIgaGVhZGVyIiksCisKKwlfX0EoU0VDVElPTiwJCSJOZXRmaWx0ZXIiLCAiIiwgIiIpLAorCV9fQShORk1BUkssCQkibmZfbWFyayIsCSJpIiwKKwkJCQkiTmV0ZmlsdGVyIG1hcmsiKSwKKwlfX0EoTkZNQVJLLAkJImZ3bWFyayIsCSJpIiwKKwkJCQkiQWxpYXMgZm9yIG5mX21hcmsiKSwKKworCV9fQShTRUNUSU9OLAkJIlRyYWZmaWMgQ29udHJvbCIsICIiLCAiIiksCisJX19BKFRDSU5ERVgsCQkidGNfaW5kZXgiLAkiaSIsCSJUQyBJbmRleCIpLAorCV9fQShTRUNUSU9OLAkJIlJvdXRpbmciLCAiIiwgIiIpLAorCV9fQShSVENMQVNTSUQsCQkicnRfY2xhc3NpZCIsCSJpIiwKKwkJCQkiUm91dGluZyBDbGFzc0lEIChjbHNfcm91dGUpIiksCisJX19BKFJUSUlGLAkJInJ0X2lpZiIsCSJpIiwKKwkJCQkiSW5jb21pbmcgaW50ZXJmYWNlIGluZGV4IiksCisJX19BKFZMQU5fVEFHLAkJInZsYW4iLAkJImkiLAkiVmxhbiB0YWciKSwKKworCV9fQShTRUNUSU9OLAkJIlNvY2tldHMiLCAiIiwgIiIpLAorCV9fQShTS19GQU1JTFksCQkic2tfZmFtaWx5IiwJImkiLAkiQWRkcmVzcyBmYW1pbHkiKSwKKwlfX0EoU0tfU1RBVEUsCQkic2tfc3RhdGUiLAkiaSIsCSJTdGF0ZSIpLAorCV9fQShTS19SRVVTRSwJCSJza19yZXVzZSIsCSJpIiwJIlJldXNlIEZsYWciKSwKKwlfX0EoU0tfQk9VTkRfSUYsCSJza19iaW5kX2lmIiwJIml2IiwJIkJvdW5kIGludGVyZmFjZSIpLAorCV9fQShTS19SRUZDTlQsCQkic2tfcmVmY250IiwJImkiLAkiUmVmZXJlbmNlIGNvdW50ZXIiKSwKKwlfX0EoU0tfU0hVVERPV04sCSJza19zaHV0ZG93biIsCSJpIiwJIlNodXRkb3duIG1hc2siKSwKKwlfX0EoU0tfUFJPVE8sCQkic2tfcHJvdG8iLAkiaSIsCSJQcm90b2NvbCIpLAorCV9fQShTS19UWVBFLAkJInNrX3R5cGUiLAkiaSIsCSJUeXBlIiksCisJX19BKFNLX1JDVkJVRiwJCSJza19yY3ZidWYiLAkiaSIsCSJSZWNlaXZlIGJ1ZmZlciBzaXplIiksCisJX19BKFNLX1JNRU1fQUxMT0MsCSJza19ybWVtIiwJImkiLAkiUk1FTSIpLAorCV9fQShTS19XTUVNX0FMTE9DLAkic2tfd21lbSIsCSJpIiwJIldNRU0iKSwKKwlfX0EoU0tfT01FTV9BTExPQywJInNrX29tZW0iLAkiaSIsCSJPTUVNIiksCisJX19BKFNLX1dNRU1fUVVFVUVELAkic2tfd21lbV9xdWV1ZSIsImkiLAkiV01FTSBxdWV1ZSIpLAorCV9fQShTS19TTkRfUUxFTiwJInNrX3NuZF9xdWV1ZSIsCSJpIiwJIlNlbmQgcXVldWUgbGVuZ3RoIiksCisJX19BKFNLX1JDVl9RTEVOLAkic2tfcmN2X3F1ZXVlIiwJImkiLAkiUmVjZWl2ZSBxdWV1ZSBsZW5ndGgiKSwKKwlfX0EoU0tfRVJSX1FMRU4sCSJza19lcnJfcXVldWUiLAkiaSIsCSJFcnJvciBxdWV1ZSBsZW5ndGgiKSwKKwlfX0EoU0tfRk9SV0FSRF9BTExPQ1MsCSJza19md2RfYWxsb2MiLAkiaSIsCSJGb3J3YXJkIGFsbG9jYXRpb25zIiksCisJX19BKFNLX1NOREJVRiwJCSJza19zbmRidWYiLAkiaSIsCSJTZW5kIGJ1ZmZlciBzaXplIiksCisjdW5kZWYgX19BCit9OworCitzdGF0aWMgaW5saW5lIGludCBtYXBfdHlwZShjaGFyIGspCit7CisJc3dpdGNoIChrKSB7CisJCWNhc2UgJ2knOiByZXR1cm4gVENGX01FVEFfVFlQRV9JTlQ7CisJCWNhc2UgJ3YnOiByZXR1cm4gVENGX01FVEFfVFlQRV9WQVI7CisJfQorCisJZnByaW50ZihzdGRlcnIsICJCVUc6IFVua25vd24gbWFwIGNoYXJhY3RlciAnJWMnXG4iLCBrKTsKKwlyZXR1cm4gSU5UX01BWDsKK30KKworc3RhdGljIHN0cnVjdCBtZXRhX2VudHJ5ICogbG9va3VwX21ldGFfZW50cnkoc3RydWN0IGJzdHIgKmtpbmQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZihtZXRhX3RhYmxlKS9zaXplb2YobWV0YV90YWJsZVswXSkpOyBpKyspCisJCWlmICghYnN0cmNtcChraW5kLCBtZXRhX3RhYmxlW2ldLmtpbmQpICYmCisJCSAgICBtZXRhX3RhYmxlW2ldLmlkICE9IDApCisJCQlyZXR1cm4gJm1ldGFfdGFibGVbaV07CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBtZXRhX2VudHJ5ICogbG9va3VwX21ldGFfZW50cnlfYnlpZChpbnQgaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZihtZXRhX3RhYmxlKS9zaXplb2YobWV0YV90YWJsZVswXSkpOyBpKyspCisJCWlmIChtZXRhX3RhYmxlW2ldLmlkID09IGlkKQorCQkJcmV0dXJuICZtZXRhX3RhYmxlW2ldOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX3ZhbHVlKHN0cnVjdCBubG1zZ2hkciAqbiwgaW50IHRsdiwgdW5zaWduZWQgbG9uZyB2YWwsCisJCQkgICAgICBzdHJ1Y3QgdGNmX21ldGFfdmFsICpoZHIpCit7CisJX191MzIgdDsKKworCXN3aXRjaCAoVENGX01FVEFfVFlQRShoZHItPmtpbmQpKSB7CisJCWNhc2UgVENGX01FVEFfVFlQRV9JTlQ6CisJCQl0ID0gdmFsOworCQkJYWRkYXR0cl9sKG4sIE1BWF9NU0csIHRsdiwgJnQsIHNpemVvZih0KSk7CisJCQlicmVhazsKKworCQljYXNlIFRDRl9NRVRBX1RZUEVfVkFSOgorCQkJaWYgKFRDRl9NRVRBX0lEKGhkci0+a2luZCkgPT0gVENGX01FVEFfSURfVkFMVUUpIHsKKwkJCQlzdHJ1Y3QgYnN0ciAqYSA9IChzdHJ1Y3QgYnN0ciAqKSB2YWw7CisJCQkJYWRkYXR0cl9sKG4sIE1BWF9NU0csIHRsdiwgYS0+ZGF0YSwgYS0+bGVuKTsKKwkJCX0KKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfY29tcGF0aWJsZShzdHJ1Y3QgdGNmX21ldGFfdmFsICp3aGF0LAorCQkJCXN0cnVjdCB0Y2ZfbWV0YV92YWwgKm5lZWRlZCkKK3sKKwljaGFyICpwOworCXN0cnVjdCBtZXRhX2VudHJ5ICplbnRyeTsKKworCWVudHJ5ID0gbG9va3VwX21ldGFfZW50cnlfYnlpZChUQ0ZfTUVUQV9JRCh3aGF0LT5raW5kKSk7CisKKwlpZiAoZW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKHAgPSBlbnRyeS0+bWFzazsgcDsgcCsrKQorCQlpZiAobWFwX3R5cGUoKnApID09IFRDRl9NRVRBX1RZUEUobmVlZGVkLT5raW5kKSkKKwkJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxpc3RfbWV0YV9pZHMoRklMRSAqZmQpCit7CisJaW50IGk7CisKKwlmcHJpbnRmKGZkLAorCSAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgXAorCSAgICAiICBJRCAgICAgICAgICAgICAgIFR5cGUgICAgICAgRGVzY3JpcHRpb25cbiIgXAorCSAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKworCWZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mKG1ldGFfdGFibGUpL3NpemVvZihtZXRhX3RhYmxlWzBdKSk7IGkrKykgeworCQlpZiAobWV0YV90YWJsZVtpXS5pZCA9PSBUQ0ZfTUVUQV9JRF9TRUNUSU9OKSB7CisJCQlmcHJpbnRmKGZkLCAiXG4lczpcbiIsIG1ldGFfdGFibGVbaV0ua2luZCk7CisJCX0gZWxzZSB7CisJCQljaGFyICpwID0gbWV0YV90YWJsZVtpXS5tYXNrOworCQkJY2hhciBidWZbNjRdID0gezB9OworCisJCQlmcHJpbnRmKGZkLCAiICAlLTE2cyAiLCBtZXRhX3RhYmxlW2ldLmtpbmQpOworCisJCQl3aGlsZSAoKnApIHsKKwkJCQlpbnQgdHlwZSA9IG1hcF90eXBlKCpwKTsKKworCQkJCXN3aXRjaCAodHlwZSkgeworCQkJCQljYXNlIFRDRl9NRVRBX1RZUEVfSU5UOgorCQkJCQkJc3RyY2F0KGJ1ZiwgIklOVCIpOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBUQ0ZfTUVUQV9UWVBFX1ZBUjoKKwkJCQkJCXN0cmNhdChidWYsICJWQVIiKTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWlmICgqKCsrcCkpCisJCQkJCXN0cmNhdChidWYsICIsIik7CisJCQl9CisKKwkJCWZwcmludGYoZmQsICIlLTEwcyAlc1xuIiwgYnVmLCBtZXRhX3RhYmxlW2ldLmRlc2MpOworCQl9CisJfQorCisJZnByaW50ZihmZCwKKwkgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKK30KKworI3VuZGVmIFRDRl9NRVRBX0lEX1NFQ1RJT04KKworI2RlZmluZSBQQVJTRV9GQUlMVVJFICgodm9pZCAqKSAoLTEpKQorCisjZGVmaW5lIFBBUlNFX0VSUihDQVJHLCBGTVQsIEFSR1MuLi4pIFwKKwllbV9wYXJzZV9lcnJvcihFSU5WQUwsIGFyZ3MsIENBUkcsICZtZXRhX2VtYXRjaF91dGlsLCBGTVQgLCMjQVJHUykKKworc3RhdGljIGlubGluZSBpbnQgY2FuX2Fkb3B0KHN0cnVjdCB0Y2ZfbWV0YV92YWwgKnZhbCkKK3sKKwlyZXR1cm4gISFUQ0ZfTUVUQV9JRCh2YWwtPmtpbmQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBvdmVyd3JpdGVfdHlwZShzdHJ1Y3QgdGNmX21ldGFfdmFsICpzcmMsCisJCQkJIHN0cnVjdCB0Y2ZfbWV0YV92YWwgKmRzdCkKK3sKKwlyZXR1cm4gKFRDRl9NRVRBX1RZUEUoZHN0LT5raW5kKSA8PCAxMikgfCBUQ0ZfTUVUQV9JRChzcmMtPmtpbmQpOworfQorCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJzdHIgKgorcGFyc2Vfb2JqZWN0KHN0cnVjdCBic3RyICphcmdzLCBzdHJ1Y3QgYnN0ciAqYXJnLCBzdHJ1Y3QgdGNmX21ldGFfdmFsICpvYmosCisJICAgICB1bnNpZ25lZCBsb25nICpkc3QsIHN0cnVjdCB0Y2ZfbWV0YV92YWwgKmxlZnQpCit7CisJc3RydWN0IG1ldGFfZW50cnkgKmVudHJ5OworCXVuc2lnbmVkIGxvbmcgbnVtOworCXN0cnVjdCBic3RyICphOworCisJaWYgKGFyZy0+cXVvdGVkKSB7CisJCW9iai0+a2luZCA9IFRDRl9NRVRBX1RZUEVfVkFSIDw8IDEyOworCQlvYmotPmtpbmQgfD0gVENGX01FVEFfSURfVkFMVUU7CisJCSpkc3QgPSAodW5zaWduZWQgbG9uZykgYXJnOworCQlyZXR1cm4gYnN0cl9uZXh0KGFyZyk7CisJfQorCisJbnVtID0gYnN0cnRvdWwoYXJnKTsKKwlpZiAobnVtICE9IFVMT05HX01BWCkgeworCQlvYmotPmtpbmQgPSBUQ0ZfTUVUQV9UWVBFX0lOVCA8PCAxMjsKKwkJb2JqLT5raW5kIHw9IFRDRl9NRVRBX0lEX1ZBTFVFOworCQkqZHN0ID0gKHVuc2lnbmVkIGxvbmcpIG51bTsKKwkJcmV0dXJuIGJzdHJfbmV4dChhcmcpOworCX0KKworCWVudHJ5ID0gbG9va3VwX21ldGFfZW50cnkoYXJnKTsKKworCWlmIChlbnRyeSA9PSBOVUxMKSB7CisJCVBBUlNFX0VSUihhcmcsICJtZXRhOiB1bmtub3duIG1ldGEgaWRcbiIpOworCQlyZXR1cm4gUEFSU0VfRkFJTFVSRTsKKwl9CisKKwlvYmotPmtpbmQgPSBlbnRyeS0+aWQgfCAobWFwX3R5cGUoZW50cnktPm1hc2tbMF0pIDw8IDEyKTsKKworCWlmIChsZWZ0KSB7CisJCXN0cnVjdCB0Y2ZfbWV0YV92YWwgKnJpZ2h0ID0gb2JqOworCisJCWlmIChUQ0ZfTUVUQV9UWVBFKHJpZ2h0LT5raW5kKSA9PSBUQ0ZfTUVUQV9UWVBFKGxlZnQtPmtpbmQpKQorCQkJZ290byBjb21wYXRpYmxlOworCisJCWlmIChjYW5fYWRvcHQobGVmdCkgJiYgIWNhbl9hZG9wdChyaWdodCkpIHsKKwkJCWlmIChpc19jb21wYXRpYmxlKGxlZnQsIHJpZ2h0KSkKKwkJCQlsZWZ0LT5raW5kID0gb3ZlcndyaXRlX3R5cGUobGVmdCwgcmlnaHQpOworCQkJZWxzZQorCQkJCWdvdG8gbm90X2NvbXBhdGlibGU7CisJCX0gZWxzZSBpZiAoY2FuX2Fkb3B0KHJpZ2h0KSAmJiAhY2FuX2Fkb3B0KGxlZnQpKSB7CisJCQlpZiAoaXNfY29tcGF0aWJsZShyaWdodCwgbGVmdCkpCisJCQkJcmlnaHQtPmtpbmQgPSBvdmVyd3JpdGVfdHlwZShyaWdodCwgbGVmdCk7CisJCQllbHNlCisJCQkJZ290byBub3RfY29tcGF0aWJsZTsKKwkJfSBlbHNlIGlmIChjYW5fYWRvcHQobGVmdCkgJiYgY2FuX2Fkb3B0KHJpZ2h0KSkgeworCQkJaWYgKGlzX2NvbXBhdGlibGUobGVmdCwgcmlnaHQpKQorCQkJCWxlZnQtPmtpbmQgPSBvdmVyd3JpdGVfdHlwZShsZWZ0LCByaWdodCk7CisJCQllbHNlIGlmIChpc19jb21wYXRpYmxlKHJpZ2h0LCBsZWZ0KSkKKwkJCQlyaWdodC0+a2luZCA9IG92ZXJ3cml0ZV90eXBlKHJpZ2h0LCBsZWZ0KTsKKwkJCWVsc2UKKwkJCQlnb3RvIG5vdF9jb21wYXRpYmxlOworCQl9IGVsc2UKKwkJCWdvdG8gbm90X2NvbXBhdGlibGU7CisJfQorCitjb21wYXRpYmxlOgorCisJYSA9IGJzdHJfbmV4dChhcmcpOworCisJd2hpbGUoYSkgeworCQlpZiAoIWJzdHJjbXAoYSwgInNoaWZ0IikpIHsKKwkJCXVuc2lnbmVkIGxvbmcgc2hpZnQ7CisKKwkJCWlmIChhLT5uZXh0ID09IE5VTEwpIHsKKwkJCQlQQVJTRV9FUlIoYSwgIm1ldGE6IG1pc3NpbmcgYXJndW1lbnQiKTsKKwkJCQlyZXR1cm4gUEFSU0VfRkFJTFVSRTsKKwkJCX0KKwkJCWEgPSBic3RyX25leHQoYSk7CisKKwkJCXNoaWZ0ID0gYnN0cnRvdWwoYSk7CisJCQlpZiAoc2hpZnQgPT0gVUxPTkdfTUFYKSB7CisJCQkJUEFSU0VfRVJSKGEsICJtZXRhOiBpbnZhbGlkIHNoaWZ0LCBtdXN0ICIgXAorCQkJCSAgICAiYmUgbnVtZXJpYyIpOworCQkJCXJldHVybiBQQVJTRV9GQUlMVVJFOworCQkJfQorCisJCQlvYmotPnNoaWZ0ID0gKF9fdTgpIHNoaWZ0OworCQkJYSA9IGJzdHJfbmV4dChhKTsKKwkJfSBlbHNlIGlmICghYnN0cmNtcChhLCAibWFzayIpKSB7CisJCQl1bnNpZ25lZCBsb25nIG1hc2s7CisKKwkJCWlmIChhLT5uZXh0ID09IE5VTEwpIHsKKwkJCQlQQVJTRV9FUlIoYSwgIm1ldGE6IG1pc3NpbmcgYXJndW1lbnQiKTsKKwkJCQlyZXR1cm4gUEFSU0VfRkFJTFVSRTsKKwkJCX0KKwkJCWEgPSBic3RyX25leHQoYSk7CisKKwkJCW1hc2sgPSBic3RydG91bChhKTsKKwkJCWlmIChtYXNrID09IFVMT05HX01BWCkgeworCQkJCVBBUlNFX0VSUihhLCAibWV0YTogaW52YWxpZCBtYXNrLCBtdXN0IGJlICIgXAorCQkJCSAgICAibnVtZXJpYyIpOworCQkJCXJldHVybiBQQVJTRV9GQUlMVVJFOworCQkJfQorCQkJKmRzdCA9ICh1bnNpZ25lZCBsb25nKSBtYXNrOworCQkJYSA9IGJzdHJfbmV4dChhKTsKKwkJfSBlbHNlCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gYTsKKworbm90X2NvbXBhdGlibGU6CisJUEFSU0VfRVJSKGFyZywgImx2YWx1ZSBhbmQgcnZhbHVlIGFyZSBub3QgY29tcGF0aWJsZS4iKTsKKwlyZXR1cm4gUEFSU0VfRkFJTFVSRTsKK30KKworc3RhdGljIGludCBtZXRhX3BhcnNlX2VvcHQoc3RydWN0IG5sbXNnaGRyICpuLCBzdHJ1Y3QgdGNmX2VtYXRjaF9oZHIgKmhkciwKKwkJCSAgIHN0cnVjdCBic3RyICphcmdzKQoreworCWludCBvcG5kOworCXN0cnVjdCBic3RyICphOworCXN0cnVjdCB0Y2ZfbWV0YV9oZHIgbWV0YV9oZHI7CisJdW5zaWduZWQgbG9uZyBsdmFsdWUgPSAwLCBydmFsdWUgPSAwOworCisJbWVtc2V0KCZtZXRhX2hkciwgMCwgc2l6ZW9mKG1ldGFfaGRyKSk7CisKKwlpZiAoYXJncyA9PSBOVUxMKQorCQlyZXR1cm4gUEFSU0VfRVJSKGFyZ3MsICJtZXRhOiBtaXNzaW5nIGFyZ3VtZW50cyIpOworCisJaWYgKCFic3RyY21wKGFyZ3MsICJsaXN0IikpIHsKKwkJbGlzdF9tZXRhX2lkcyhzdGRlcnIpOworCQlyZXR1cm4gLTE7CisJfQorCisJYSA9IHBhcnNlX29iamVjdChhcmdzLCBhcmdzLCAmbWV0YV9oZHIubGVmdCwgJmx2YWx1ZSwgTlVMTCk7CisJaWYgKGEgPT0gUEFSU0VfRkFJTFVSRSkKKwkJcmV0dXJuIC0xOworCWVsc2UgaWYgKGEgPT0gTlVMTCkKKwkJcmV0dXJuIFBBUlNFX0VSUihhcmdzLCAibWV0YTogbWlzc2luZyBvcGVyYW5kIik7CisKKwlpZiAoIWJzdHJjbXAoYSwgImVxIikpCisJCW9wbmQgPSBUQ0ZfRU1fT1BORF9FUTsKKwllbHNlIGlmICghYnN0cmNtcChhLCAiZ3QiKSkKKwkJb3BuZCA9IFRDRl9FTV9PUE5EX0dUOworCWVsc2UgaWYgKCFic3RyY21wKGEsICJsdCIpKQorCQlvcG5kID0gVENGX0VNX09QTkRfTFQ7CisJZWxzZQorCQlyZXR1cm4gUEFSU0VfRVJSKGEsICJtZXRhOiBpbnZhbGlkIG9wZXJhbmQiKTsKKworCW1ldGFfaGRyLmxlZnQub3AgPSAoX191OCkgb3BuZDsKKworCWlmIChhLT5uZXh0ID09IE5VTEwpCisJCXJldHVybiBQQVJTRV9FUlIoYXJncywgIm1ldGE6IG1pc3NpbmcgcnZhbHVlIik7CisJYSA9IGJzdHJfbmV4dChhKTsKKworCWEgPSBwYXJzZV9vYmplY3QoYXJncywgYSwgJm1ldGFfaGRyLnJpZ2h0LCAmcnZhbHVlLCAmbWV0YV9oZHIubGVmdCk7CisJaWYgKGEgPT0gUEFSU0VfRkFJTFVSRSkKKwkJcmV0dXJuIC0xOworCWVsc2UgaWYgKGEgIT0gTlVMTCkKKwkJcmV0dXJuIFBBUlNFX0VSUihhLCAibWV0YTogdW5leHBlY3RlZCB0cmFpbGVyIik7CisKKworCWFkZHJhd19sKG4sIE1BWF9NU0csIGhkciwgc2l6ZW9mKCpoZHIpKTsKKworCWFkZGF0dHJfbChuLCBNQVhfTVNHLCBUQ0FfRU1fTUVUQV9IRFIsICZtZXRhX2hkciwgc2l6ZW9mKG1ldGFfaGRyKSk7CisKKwlkdW1wX3ZhbHVlKG4sIFRDQV9FTV9NRVRBX0xWQUxVRSwgbHZhbHVlLCAmbWV0YV9oZHIubGVmdCk7CisJZHVtcF92YWx1ZShuLCBUQ0FfRU1fTUVUQV9SVkFMVUUsIHJ2YWx1ZSwgJm1ldGFfaGRyLnJpZ2h0KTsKKworCXJldHVybiAwOworfQorI3VuZGVmIFBBUlNFX0VSUgorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJpbnRfYmluYXJ5KEZJTEUgKmZkLCB1bnNpZ25lZCBjaGFyICpzdHIsIGludCBsZW4pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCWlmICghaXNwcmludChzdHJbaV0pKQorCQkJZ290byBiaW5hcnk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCWZwcmludGYoZmQsICIlYyIsIHN0cltpXSk7CisJcmV0dXJuOworCitiaW5hcnk6CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQlmcHJpbnRmKGZkLCAiJTAyeCAiLCBzdHJbaV0pOworCisJZnByaW50ZihmZCwgIlwiIik7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQlmcHJpbnRmKGZkLCAiJWMiLCBpc3ByaW50KHN0cltpXSkgPyBzdHJbaV0gOiAnLicpOworCWZwcmludGYoZmQsICJcIiIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcmludF92YWx1ZShGSUxFICpmZCwgaW50IHR5cGUsIHN0cnVjdCBydGF0dHIgKnJ0YSkKK3sKKwlpZiAocnRhID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIHZhbHVlIFRMVlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzd2l0Y2godHlwZSkgeworCQljYXNlIFRDRl9NRVRBX1RZUEVfSU5UOgorCQkJaWYgKFJUQV9QQVlMT0FEKHJ0YSkgPCBzaXplb2YoX191MzIpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJtZXRhIGludCB0eXBlIHZhbHVlIFRMViAiIFwKKwkJCQkgICAgInNpemUgbWlzbWF0Y2guXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlmcHJpbnRmKGZkLCAiJWQiLCBydGFfZ2V0YXR0cl91MzIocnRhKSk7CisJCQlicmVhazsKKworCQljYXNlIFRDRl9NRVRBX1RZUEVfVkFSOgorCQkJcHJpbnRfYmluYXJ5KGZkLCBSVEFfREFUQShydGEpLCBSVEFfUEFZTE9BRChydGEpKTsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByaW50X29iamVjdChGSUxFICpmZCwgc3RydWN0IHRjZl9tZXRhX3ZhbCAqb2JqLCBzdHJ1Y3QgcnRhdHRyICpydGEpCit7CisJaW50IGlkID0gVENGX01FVEFfSUQob2JqLT5raW5kKTsKKwlpbnQgdHlwZSA9IFRDRl9NRVRBX1RZUEUob2JqLT5raW5kKTsKKwlzdHJ1Y3QgbWV0YV9lbnRyeSAqZW50cnk7CisKKwlpZiAoaWQgPT0gVENGX01FVEFfSURfVkFMVUUpCisJCXJldHVybiBwcmludF92YWx1ZShmZCwgdHlwZSwgcnRhKTsKKworCWVudHJ5ID0gbG9va3VwX21ldGFfZW50cnlfYnlpZChpZCk7CisKKwlpZiAoZW50cnkgPT0gTlVMTCkKKwkJZnByaW50ZihmZCwgIlt1bmtub3duIG1ldGEgaWQgJWRdIiwgaWQpOworCWVsc2UKKwkJZnByaW50ZihmZCwgIiVzIiwgZW50cnktPmtpbmQpOworCisJaWYgKG9iai0+c2hpZnQpCisJCWZwcmludGYoZmQsICIgc2hpZnQgJWQiLCBvYmotPnNoaWZ0KTsKKworCXN3aXRjaCAodHlwZSkgeworCQljYXNlIFRDRl9NRVRBX1RZUEVfSU5UOgorCQkJaWYgKHJ0YSkgeworCQkJCWlmIChSVEFfUEFZTE9BRChydGEpIDwgc2l6ZW9mKF9fdTMyKSkKKwkJCQkJZ290byBzaXplX21pc21hdGNoOworCisJCQkJZnByaW50ZihmZCwgIiBtYXNrIDB4JTA4eCIsCisJCQkJICAgIHJ0YV9nZXRhdHRyX3UzMihydGEpKTsKKwkJCX0KKwkJCWJyZWFrOworCX0KKworCXJldHVybiAwOworCitzaXplX21pc21hdGNoOgorCWZwcmludGYoc3RkZXJyLCAibWV0YSBpbnQgdHlwZSBtYXNrIFRMViBzaXplIG1pc21hdGNoXG4iKTsKKwlyZXR1cm4gLTE7Cit9CisKKworc3RhdGljIGludCBtZXRhX3ByaW50X2VvcHQoRklMRSAqZmQsIHN0cnVjdCB0Y2ZfZW1hdGNoX2hkciAqaGRyLCB2b2lkICpkYXRhLAorCQkJICAgaW50IGRhdGFfbGVuKQoreworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9FTV9NRVRBX01BWCsxXTsKKwlzdHJ1Y3QgdGNmX21ldGFfaGRyICptZXRhX2hkcjsKKworCWlmIChwYXJzZV9ydGF0dHIodGIsIFRDQV9FTV9NRVRBX01BWCwgZGF0YSwgZGF0YV9sZW4pIDwgMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKHRiW1RDQV9FTV9NRVRBX0hEUl0gPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgbWV0YSBoZWFkZXJcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9FTV9NRVRBX0hEUl0pIDwgc2l6ZW9mKCptZXRhX2hkcikpIHsKKwkJZnByaW50ZihzdGRlcnIsICJNZXRhIGhlYWRlciBzaXplIG1pc21hdGNoXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW1ldGFfaGRyID0gUlRBX0RBVEEodGJbVENBX0VNX01FVEFfSERSXSk7CisKKwlpZiAocHJpbnRfb2JqZWN0KGZkLCAmbWV0YV9oZHItPmxlZnQsIHRiW1RDQV9FTV9NRVRBX0xWQUxVRV0pIDwgMCkKKwkJcmV0dXJuIC0xOworCisJc3dpdGNoIChtZXRhX2hkci0+bGVmdC5vcCkgeworCQljYXNlIFRDRl9FTV9PUE5EX0VROgorCQkJZnByaW50ZihmZCwgIiBlcSAiKTsKKwkJCWJyZWFrOworCQljYXNlIFRDRl9FTV9PUE5EX0xUOgorCQkJZnByaW50ZihmZCwgIiBsdCAiKTsKKwkJCWJyZWFrOworCQljYXNlIFRDRl9FTV9PUE5EX0dUOgorCQkJZnByaW50ZihmZCwgIiBndCAiKTsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBwcmludF9vYmplY3QoZmQsICZtZXRhX2hkci0+cmlnaHQsIHRiW1RDQV9FTV9NRVRBX1JWQUxVRV0pOworfQorCitzdHJ1Y3QgZW1hdGNoX3V0aWwgbWV0YV9lbWF0Y2hfdXRpbCA9IHsKKwkua2luZCA9ICJtZXRhIiwKKwkua2luZF9udW0gPSBUQ0ZfRU1fTUVUQSwKKwkucGFyc2VfZW9wdCA9IG1ldGFfcGFyc2VfZW9wdCwKKwkucHJpbnRfZW9wdCA9IG1ldGFfcHJpbnRfZW9wdCwKKwkucHJpbnRfdXNhZ2UgPSBtZXRhX3ByaW50X3VzYWdlCit9OwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvZW1fbmJ5dGUuYyBiL2lwcm91dGUyL3RjL2VtX25ieXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdmM2U5ZAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL2VtX25ieXRlLmMKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBlbV9uYnl0ZS5jCQlOLUJ5dGUgRW1hdGNoCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIGRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CVRob21hcyBHcmFmIDx0Z3JhZkBzdXVnLmNoPgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAibV9lbWF0Y2guaCIKKyNpbmNsdWRlIDxsaW51eC90Y19lbWF0Y2gvdGNfZW1fbmJ5dGUuaD4KKworZXh0ZXJuIHN0cnVjdCBlbWF0Y2hfdXRpbCBuYnl0ZV9lbWF0Y2hfdXRpbDsKKworc3RhdGljIHZvaWQgbmJ5dGVfcHJpbnRfdXNhZ2UoRklMRSAqZmQpCit7CisJZnByaW50ZihmZCwKKwkgICAgIlVzYWdlOiBuYnl0ZShORUVETEUgYXQgT0ZGU0VUIFtsYXllciBMQVlFUl0pXG4iIFwKKwkgICAgIndoZXJlOiBORUVETEUgOj0geyBzdHJpbmcgfCBcImMtZXNjYXBlLXNlcXVlbmNlXCIgfVxuIiBcCisJICAgICIgICAgICAgT0ZGU0VUIDo9IGludFxuIiBcCisJICAgICIgICAgICAgTEFZRVIgIDo9IHsgbGluayB8IG5ldHdvcmsgfCB0cmFuc3BvcnQgfCAwLi4lZCB9XG4iIFwKKwkgICAgIlxuIiBcCisJICAgICJFeGFtcGxlOiBuYnl0ZShcImFiYWJhXCIgYXQgMTIgbGF5ZXIgMSlcbiIsCisJICAgIFRDRl9MQVlFUl9NQVgpOworfQorCitzdGF0aWMgaW50IG5ieXRlX3BhcnNlX2VvcHQoc3RydWN0IG5sbXNnaGRyICpuLCBzdHJ1Y3QgdGNmX2VtYXRjaF9oZHIgKmhkciwKKwkJCSAgICBzdHJ1Y3QgYnN0ciAqYXJncykKK3sKKwlzdHJ1Y3QgYnN0ciAqYTsKKwlzdHJ1Y3QgYnN0ciAqbmVlZGxlID0gYXJnczsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IDAsIGxheWVyID0gVENGX0xBWUVSX05FVFdPUks7CisJaW50IG9mZnNldF9wcmVzZW50ID0gMDsKKwlzdHJ1Y3QgdGNmX2VtX25ieXRlIG5iOworCisJbWVtc2V0KCZuYiwgMCwgc2l6ZW9mKG5iKSk7CisKKyNkZWZpbmUgUEFSU0VfRVJSKENBUkcsIEZNVCwgQVJHUy4uLikgXAorCWVtX3BhcnNlX2Vycm9yKEVJTlZBTCwgYXJncywgQ0FSRywgJm5ieXRlX2VtYXRjaF91dGlsLCBGTVQgLCMjQVJHUykKKworCWlmIChhcmdzID09IE5VTEwpCisJCXJldHVybiBQQVJTRV9FUlIoYXJncywgIm5ieXRlOiBtaXNzaW5nIGFyZ3VtZW50cyIpOworCisJaWYgKG5lZWRsZS0+bGVuIDw9IDApCisJCXJldHVybiBQQVJTRV9FUlIoYXJncywgIm5ieXRlOiBuZWVkbGUgbGVuZ3RoIGlzIDAiKTsKKworCWZvciAoYSA9IGJzdHJfbmV4dChhcmdzKTsgYTsgYSA9IGJzdHJfbmV4dChhKSkgeworCQlpZiAoIWJzdHJjbXAoYSwgImF0IikpIHsKKwkJCWlmIChhLT5uZXh0ID09IE5VTEwpCisJCQkJcmV0dXJuIFBBUlNFX0VSUihhLCAibmJ5dGU6IG1pc3NpbmcgYXJndW1lbnQiKTsKKwkJCWEgPSBic3RyX25leHQoYSk7CisKKwkJCW9mZnNldCA9IGJzdHJ0b3VsKGEpOworCQkJaWYgKG9mZnNldCA9PSBVTE9OR19NQVgpCisJCQkJcmV0dXJuIFBBUlNFX0VSUihhLCAibmJ5dGU6IGludmFsaWQgb2Zmc2V0LCAiIFwKKwkJCQkgICAgIm11c3QgYmUgbnVtZXJpYyIpOworCisJCQlvZmZzZXRfcHJlc2VudCA9IDE7CisJCX0gZWxzZSBpZiAoIWJzdHJjbXAoYSwgImxheWVyIikpIHsKKwkJCWlmIChhLT5uZXh0ID09IE5VTEwpCisJCQkJcmV0dXJuIFBBUlNFX0VSUihhLCAibmJ5dGU6IG1pc3NpbmcgYXJndW1lbnQiKTsKKwkJCWEgPSBic3RyX25leHQoYSk7CisKKwkJCWxheWVyID0gcGFyc2VfbGF5ZXIoYSk7CisJCQlpZiAobGF5ZXIgPT0gSU5UX01BWCkgeworCQkJCWxheWVyID0gYnN0cnRvdWwoYSk7CisJCQkJaWYgKGxheWVyID09IFVMT05HX01BWCkKKwkJCQkJcmV0dXJuIFBBUlNFX0VSUihhLCAibmJ5dGU6IGludmFsaWQgIiBcCisJCQkJCSAgICAibGF5ZXIiKTsKKwkJCX0KKworCQkJaWYgKGxheWVyID4gVENGX0xBWUVSX01BWCkKKwkJCQlyZXR1cm4gUEFSU0VfRVJSKGEsICJuYnl0ZTogaWxsZWdhbCBsYXllciwgIiBcCisJCQkJICAgICJtdXN0IGJlIGluIDAuLiVkIiwgVENGX0xBWUVSX01BWCk7CisJCX0gZWxzZQorCQkJcmV0dXJuIFBBUlNFX0VSUihhLCAibmJ5dGU6IHVua25vd24gcGFyYW1ldGVyIik7CisJfQorCisJaWYgKG9mZnNldF9wcmVzZW50ID09IDApCisJCXJldHVybiBQQVJTRV9FUlIoYSwgIm5ieXRlOiBvZmZzZXQgcmVxdWlyZWQiKTsKKworCW5iLmxlbiA9IG5lZWRsZS0+bGVuOworCW5iLmxheWVyID0gKF9fdTgpIGxheWVyOworCW5iLm9mZiA9IChfX3UxNikgb2Zmc2V0OworCisJYWRkcmF3X2wobiwgTUFYX01TRywgaGRyLCBzaXplb2YoKmhkcikpOworCWFkZHJhd19sKG4sIE1BWF9NU0csICZuYiwgc2l6ZW9mKG5iKSk7CisJYWRkcmF3X2wobiwgTUFYX01TRywgbmVlZGxlLT5kYXRhLCBuZWVkbGUtPmxlbik7CisKKyN1bmRlZiBQQVJTRV9FUlIKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuYnl0ZV9wcmludF9lb3B0KEZJTEUgKmZkLCBzdHJ1Y3QgdGNmX2VtYXRjaF9oZHIgKmhkciwgdm9pZCAqZGF0YSwKKwkJCSAgICBpbnQgZGF0YV9sZW4pCit7CisJaW50IGk7CisJc3RydWN0IHRjZl9lbV9uYnl0ZSAqbmIgPSBkYXRhOworCV9fdTggKm5lZWRsZTsKKworCWlmIChkYXRhX2xlbiA8IHNpemVvZigqbmIpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTkJ5dGUgaGVhZGVyIHNpemUgbWlzbWF0Y2hcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGRhdGFfbGVuIDwgc2l6ZW9mKCpuYikgKyBuYi0+bGVuKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTkJ5dGUgcGF5bG9hZCBzaXplIG1pc21hdGNoXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW5lZWRsZSA9IGRhdGEgKyBzaXplb2YoKm5iKTsKKworCWZvciAoaSA9IDA7IGkgPCBuYi0+bGVuOyBpKyspCisJCWZwcmludGYoZmQsICIlMDJ4ICIsIG5lZWRsZVtpXSk7CisKKwlmcHJpbnRmKGZkLCAiXCIiKTsKKwlmb3IgKGkgPSAwOyBpIDwgbmItPmxlbjsgaSsrKQorCQlmcHJpbnRmKGZkLCAiJWMiLCBpc3ByaW50KG5lZWRsZVtpXSkgPyBuZWVkbGVbaV0gOiAnLicpOworCWZwcmludGYoZmQsICJcIiBhdCAlZCBsYXllciAlZCIsIG5iLT5vZmYsIG5iLT5sYXllcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGVtYXRjaF91dGlsIG5ieXRlX2VtYXRjaF91dGlsID0geworCS5raW5kID0gIm5ieXRlIiwKKwkua2luZF9udW0gPSBUQ0ZfRU1fTkJZVEUsCisJLnBhcnNlX2VvcHQgPSBuYnl0ZV9wYXJzZV9lb3B0LAorCS5wcmludF9lb3B0ID0gbmJ5dGVfcHJpbnRfZW9wdCwKKwkucHJpbnRfdXNhZ2UgPSBuYnl0ZV9wcmludF91c2FnZQorfTsKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RjL2VtX3UzMi5jIGIvaXByb3V0ZTIvdGMvZW1fdTMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFlZDcwZgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL2VtX3UzMi5jCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogZW1fdTMyLmMJCVUzMiBFbWF0Y2gKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJtX2VtYXRjaC5oIgorCitleHRlcm4gc3RydWN0IGVtYXRjaF91dGlsIHUzMl9lbWF0Y2hfdXRpbDsKKworc3RhdGljIHZvaWQgdTMyX3ByaW50X3VzYWdlKEZJTEUgKmZkKQoreworCWZwcmludGYoZmQsCisJICAgICJVc2FnZTogdTMyKEFMSUdOIFZBTFVFIE1BU0sgYXQgWyBuZXh0aGRyKyBdIE9GRlNFVClcbiIgXAorCSAgICAid2hlcmU6IEFMSUdOICA6PSB7IHU4IHwgdTE2IHwgdTMyIH1cbiIgXAorCSAgICAiXG4iIFwKKwkgICAgIkV4YW1wbGU6IHUzMih1MTYgMHgxMTIyIDB4ZmZmZiBhdCBuZXh0aGRyKzQpXG4iKTsKK30KKworc3RhdGljIGludCB1MzJfcGFyc2VfZW9wdChzdHJ1Y3Qgbmxtc2doZHIgKm4sIHN0cnVjdCB0Y2ZfZW1hdGNoX2hkciAqaGRyLAorCQkJICBzdHJ1Y3QgYnN0ciAqYXJncykKK3sKKwlzdHJ1Y3QgYnN0ciAqYTsKKwlpbnQgYWxpZ24sIG5oX2xlbjsKKwl1bnNpZ25lZCBsb25nIGtleSwgbWFzaywgb2ZmbWFzayA9IDAsIG9mZnNldDsKKwlzdHJ1Y3QgdGNfdTMyX2tleSB1X2tleTsKKworCW1lbXNldCgmdV9rZXksIDAsIHNpemVvZih1X2tleSkpOworCisjZGVmaW5lIFBBUlNFX0VSUihDQVJHLCBGTVQsIEFSR1MuLi4pIFwKKwllbV9wYXJzZV9lcnJvcihFSU5WQUwsIGFyZ3MsIENBUkcsICZ1MzJfZW1hdGNoX3V0aWwsIEZNVCAsIyNBUkdTKQorCisJaWYgKGFyZ3MgPT0gTlVMTCkKKwkJcmV0dXJuIFBBUlNFX0VSUihhcmdzLCAidTMyOiBtaXNzaW5nIGFyZ3VtZW50cyIpOworCisJaWYgKCFic3RyY21wKGFyZ3MsICJ1OCIpKQorCQlhbGlnbiA9IDE7CisJZWxzZSBpZiAoIWJzdHJjbXAoYXJncywgInUxNiIpKQorCQlhbGlnbiA9IDI7CisJZWxzZSBpZiAoIWJzdHJjbXAoYXJncywgInUzMiIpKQorCQlhbGlnbiA9IDQ7CisJZWxzZQorCQlyZXR1cm4gUEFSU0VfRVJSKGFyZ3MsICJ1MzI6IGludmFsaWQgYWxpZ25tZW50Iik7CisKKwlhID0gYnN0cl9uZXh0KGFyZ3MpOworCWlmIChhID09IE5VTEwpCisJCXJldHVybiBQQVJTRV9FUlIoYSwgInUzMjogbWlzc2luZyBrZXkiKTsKKworCWtleSA9IGJzdHJ0b3VsKGEpOworCWlmIChrZXkgPT0gVUxPTkdfTUFYKQorCQlyZXR1cm4gUEFSU0VfRVJSKGEsICJ1MzI6IGludmFsaWQga2V5LCBtdXN0IGJlIG51bWVyaWMiKTsKKworCWEgPSBic3RyX25leHQoYSk7CisJaWYgKGEgPT0gTlVMTCkKKwkJcmV0dXJuIFBBUlNFX0VSUihhLCAidTMyOiBtaXNzaW5nIG1hc2siKTsKKworCW1hc2sgPSBic3RydG91bChhKTsKKwlpZiAobWFzayA9PSBVTE9OR19NQVgpCisJCXJldHVybiBQQVJTRV9FUlIoYSwgInUzMjogaW52YWxpZCBtYXNrLCBtdXN0IGJlIG51bWVyaWMiKTsKKworCWEgPSBic3RyX25leHQoYSk7CisJaWYgKGEgPT0gTlVMTCB8fCBic3RyY21wKGEsICJhdCIpICE9IDApCisJCXJldHVybiBQQVJTRV9FUlIoYSwgInUzMjogbWlzc2luZyBcImF0XCIiKTsKKworCWEgPSBic3RyX25leHQoYSk7CisJaWYgKGEgPT0gTlVMTCkKKwkJcmV0dXJuIFBBUlNFX0VSUihhLCAidTMyOiBtaXNzaW5nIG9mZnNldCIpOworCisJbmhfbGVuID0gc3RybGVuKCJuZXh0aGRyKyIpOworCWlmIChhLT5sZW4gPiBuaF9sZW4gJiYgIW1lbWNtcChhLT5kYXRhLCAibmV4dGhkcisiLCBuaF9sZW4pKSB7CisJCWNoYXIgYnVmW2EtPmxlbiAtIG5oX2xlbiArIDFdOworCQlvZmZtYXNrID0gLTE7CisJCW1lbWNweShidWYsIGEtPmRhdGEgKyBuaF9sZW4sIGEtPmxlbiAtIG5oX2xlbik7CisJCW9mZnNldCA9IHN0cnRvdWwoYnVmLCBOVUxMLCAwKTsKKwl9IGVsc2UgaWYgKCFic3RyY21wKGEsICJuZXh0aGRyKyIpKSB7CisJCWEgPSBic3RyX25leHQoYSk7CisJCWlmIChhID09IE5VTEwpCisJCQlyZXR1cm4gUEFSU0VfRVJSKGEsICJ1MzI6IG1pc3Npbmcgb2Zmc2V0Iik7CisJCW9mZnNldCA9IGJzdHJ0b3VsKGEpOworCX0gZWxzZQorCQlvZmZzZXQgPSBic3RydG91bChhKTsKKworCWlmIChvZmZzZXQgPT0gVUxPTkdfTUFYKQorCQlyZXR1cm4gUEFSU0VfRVJSKGEsICJ1MzI6IGludmFsaWQgb2Zmc2V0Iik7CisKKwlpZiAoYS0+bmV4dCkKKwkJcmV0dXJuIFBBUlNFX0VSUihhLT5uZXh0LCAidTMyOiB1bmV4cGVjdGVkIHRyYWlsZXIiKTsKKworCXN3aXRjaCAoYWxpZ24pIHsKKwkJY2FzZSAxOgorCQkJaWYgKGtleSA+IDB4RkYpCisJCQkJcmV0dXJuIFBBUlNFX0VSUihhLCAiSWxsZWdhbCBrZXkgKD4weEZGKSIpOworCQkJaWYgKG1hc2sgPiAweEZGKQorCQkJCXJldHVybiBQQVJTRV9FUlIoYSwgIklsbGVnYWwgbWFzayAoPjB4RkYpIik7CisKKwkJCWtleSA8PD0gMjQgLSAoKG9mZnNldCAmIDMpICogOCk7CisJCQltYXNrIDw8PSAyNCAtICgob2Zmc2V0ICYgMykgKiA4KTsKKwkJCW9mZnNldCAmPSB+MzsKKwkJCWJyZWFrOworCisJCWNhc2UgMjoKKwkJCWlmIChrZXkgPiAweEZGRkYpCisJCQkJcmV0dXJuIFBBUlNFX0VSUihhLCAiSWxsZWdhbCBrZXkgKD4weEZGRkYpIik7CisJCQlpZiAobWFzayA+IDB4RkZGRikKKwkJCQlyZXR1cm4gUEFSU0VfRVJSKGEsICJJbGxlZ2FsIG1hc2sgKD4weEZGRkYpIik7CisKKwkJCWlmICgob2Zmc2V0ICYgMykgPT0gMCkgeworCQkJCWtleSA8PD0gMTY7CisJCQkJbWFzayA8PD0gMTY7CisJCQl9CisJCQlvZmZzZXQgJj0gfjM7CisJCQlicmVhazsKKwl9CisKKwlrZXkgPSBodG9ubChrZXkpOworCW1hc2sgPSBodG9ubChtYXNrKTsKKworCWlmIChvZmZzZXQgJSA0KQorCQlyZXR1cm4gUEFSU0VfRVJSKGEsICJ1MzI6IGludmFsaWQgb2Zmc2V0IGFsaWdubWVudCwgIiBcCisJCSAgICAibXVzdCBiZSBhbGlnbmVkIHRvIDQuIik7CisKKwlrZXkgJj0gbWFzazsKKworCXVfa2V5Lm1hc2sgPSBtYXNrOworCXVfa2V5LnZhbCA9IGtleTsKKwl1X2tleS5vZmYgPSBvZmZzZXQ7CisJdV9rZXkub2ZmbWFzayA9IG9mZm1hc2s7CisKKwlhZGRyYXdfbChuLCBNQVhfTVNHLCBoZHIsIHNpemVvZigqaGRyKSk7CisJYWRkcmF3X2wobiwgTUFYX01TRywgJnVfa2V5LCBzaXplb2YodV9rZXkpKTsKKworI3VuZGVmIFBBUlNFX0VSUgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHUzMl9wcmludF9lb3B0KEZJTEUgKmZkLCBzdHJ1Y3QgdGNmX2VtYXRjaF9oZHIgKmhkciwgdm9pZCAqZGF0YSwKKwkJCSAgaW50IGRhdGFfbGVuKQoreworCXN0cnVjdCB0Y191MzJfa2V5ICp1X2tleSA9IGRhdGE7CisKKwlpZiAoZGF0YV9sZW4gPCBzaXplb2YoKnVfa2V5KSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlUzMiBoZWFkZXIgc2l6ZSBtaXNtYXRjaFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlmcHJpbnRmKGZkLCAiJTA4eC8lMDh4IGF0ICVzJWQiLAorCSAgICAodW5zaWduZWQgaW50KSBudG9obCh1X2tleS0+dmFsKSwKKwkgICAgKHVuc2lnbmVkIGludCkgbnRvaGwodV9rZXktPm1hc2spLAorCSAgICB1X2tleS0+b2ZmbWFzayA/ICJuZXh0aGRyKyIgOiAiIiwKKwkgICAgdV9rZXktPm9mZik7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGVtYXRjaF91dGlsIHUzMl9lbWF0Y2hfdXRpbCA9IHsKKwkua2luZCA9ICJ1MzIiLAorCS5raW5kX251bSA9IFRDRl9FTV9VMzIsCisJLnBhcnNlX2VvcHQgPSB1MzJfcGFyc2VfZW9wdCwKKwkucHJpbnRfZW9wdCA9IHUzMl9wcmludF9lb3B0LAorCS5wcmludF91c2FnZSA9IHUzMl9wcmludF91c2FnZQorfTsKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RjL2VtcF9lbWF0Y2gubCBiL2lwcm91dGUyL3RjL2VtcF9lbWF0Y2gubApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWI0NWJlCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGMvZW1wX2VtYXRjaC5sCkBAIC0wLDAgKzEsMTQ1IEBACisleworICNpbmNsdWRlICJlbXBfZW1hdGNoLnlhY2MuaCIKKyAjaW5jbHVkZSAibV9lbWF0Y2guaCIKKworIGV4dGVybiBpbnQgZW1hdGNoX2FyZ2M7CisgZXh0ZXJuIGNoYXIgKiplbWF0Y2hfYXJndjsKKworICNkZWZpbmUgeXlsdmFsIGVtYXRjaF9sdmFsCisKKyAjZGVmaW5lIE5FWFRfRU1fQVJHKCkgZG8geyBlbWF0Y2hfYXJnYy0tOyBlbWF0Y2hfYXJndisrOyB9IHdoaWxlKDApOworCisgI2RlZmluZSBZWV9JTlBVVChidWYsIHJlc3VsdCwgbWF4X3NpemUpCQkJCVwKKyB7CQkJCQkJCQkJXAorIG5leHQ6CQkJCQkJCQkJXAorIAlpZiAoZW1hdGNoX2FyZ2MgPD0gMCkJCQkJCQlcCisJCXJlc3VsdCA9IFlZX05VTEw7CQkJCQlcCisJZWxzZSBpZiAoKiplbWF0Y2hfYXJndiA9PSAnXDAnKSB7CQkJCVwKKwkJTkVYVF9FTV9BUkcoKTsJCQkJCQlcCisJCWdvdG8gbmV4dDsJCQkJCQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQlpZiAobWF4X3NpemUgPD0gc3RybGVuKCplbWF0Y2hfYXJndikgKyAxKSB7CQlcCisJCQlmcHJpbnRmKHN0ZGVyciwgIm1hdGNoIGFyZ3VtZW50IHRvbyBsb25nLlxuIik7CVwKKwkJCXJlc3VsdCA9IFlZX05VTEw7CQkJCVwKKwkJfSBlbHNlIHsJCQkJCQlcCisJCQlzdHJjcHkoYnVmLCAqZW1hdGNoX2FyZ3YpOwkJCVwKKwkJCXJlc3VsdCA9IHN0cmxlbigqZW1hdGNoX2FyZ3YpICsgMTsJCVwKKwkJCWJ1ZltyZXN1bHQtMV0gPSAnICc7CQkJCVwKKwkJCWJ1ZltyZXN1bHRdID0gJ1wwJzsJCQkJXAorCQkJTkVYVF9FTV9BUkcoKTsJCQkJCVwKKwkJfQkJCQkJCQlcCisJfQkJCQkJCQkJXAorIH0KKworIHN0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSB5eXVucHV0IChpbnQgYyxjaGFyICpidWZfcHRyICApOworIHN0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSB5eV9wdXNoX3N0YXRlIChpbnQgIG5ld19zdGF0ZSApOworIHN0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSB5eV9wb3Bfc3RhdGUgICh2b2lkKTsKKyBzdGF0aWMgaW50ICBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkgeXlfdG9wX3N0YXRlICh2b2lkICk7CisKKyBzdGF0aWMgY2hhciAqc3RyYnVmOworIHN0YXRpYyB1bnNpZ25lZCBpbnQgc3RyYnVmX3NpemU7Cisgc3RhdGljIHVuc2lnbmVkIGludCBzdHJidWZfaW5kZXg7CisKKyBzdGF0aWMgdm9pZCBzdHJidWZfZW5sYXJnZSh2b2lkKQorIHsKKyAJc3RyYnVmX3NpemUgKz0gNTEyOworIAlzdHJidWYgPSByZWFsbG9jKHN0cmJ1Ziwgc3RyYnVmX3NpemUpOworIH0KKworIHN0YXRpYyB2b2lkIHN0cmJ1Zl9hcHBlbmRfY2hhcihjaGFyIGMpCisgeworIAl3aGlsZSAoc3RyYnVmX2luZGV4ID49IHN0cmJ1Zl9zaXplKQorIAkJc3RyYnVmX2VubGFyZ2UoKTsKKyAJc3RyYnVmW3N0cmJ1Zl9pbmRleCsrXSA9IGM7CisgfQorCisgc3RhdGljIHZvaWQgc3RyYnVmX2FwcGVuZF9jaGFycChjaGFyICpzKQorIHsKKyAJd2hpbGUgKHN0cmJ1Zl9pbmRleCA+PSBzdHJidWZfc2l6ZSkKKyAJCXN0cmJ1Zl9lbmxhcmdlKCk7CisgCW1lbWNweShzdHJidWYgKyBzdHJidWZfaW5kZXgsIHMsIHN0cmxlbihzKSk7CisgCXN0cmJ1Zl9pbmRleCArPSBzdHJsZW4ocyk7CisgfQorCislfQorCisleCBsZXhzdHIKKworJW9wdGlvbiA4Yml0IHN0YWNrIHdhcm4gbm95eXdyYXAgcHJlZml4PSJlbWF0Y2hfIgorJSUKK1sgXHRcclxuXSsKKworXCIJCQkJCXsKKwkJCQkJCWlmIChzdHJidWYgPT0gTlVMTCkgeworCQkJCQkJCXN0cmJ1Zl9zaXplID0gNTEyOworCQkJCQkJCXN0cmJ1ZiA9IGNhbGxvYygxLCBzdHJidWZfc2l6ZSk7CisJCQkJCQkJaWYgKHN0cmJ1ZiA9PSBOVUxMKQorCQkJCQkJCQlyZXR1cm4gRVJST1I7CisJCQkJCQl9CisJCQkJCQlzdHJidWZfaW5kZXggPSAwOworCisJCQkJCQlCRUdJTihsZXhzdHIpOworCQkJCQl9CisKKzxsZXhzdHI+XCIJCQkJCXsKKwkJCQkJCUJFR0lOKElOSVRJQUwpOworCQkJCQkJeXlsdmFsLmIgPSBic3RyX25ldyhzdHJidWYsIHN0cmJ1Zl9pbmRleCk7CisJCQkJCQl5eWx2YWwuYi0+cXVvdGVkID0gMTsKKwkJCQkJCXJldHVybiBBVFRSSUJVVEU7CisJCQkJCX0KKworPGxleHN0cj5cXFswLTddezEsM30JCQl7IC8qIG9jdGFsIGVzY2FwZSBzZXF1ZW5jZSAqLworCQkJCQkJaW50IHJlczsKKworCQkJCQkJc3NjYW5mKHl5dGV4dCArIDEsICIlbyIsICZyZXMpOworCQkJCQkJaWYgKHJlcyA+IDB4RkYpIHsKKwkJCQkJCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yOiBvY3RhbCBlc2NhcGUgc2VxdWVuY2UiIFwKKwkJCQkJCQkiIG91dCBvZiByYW5nZVxuIik7CisJCQkJCQkJcmV0dXJuIEVSUk9SOworCQkJCQkJfQorCQkJCQkJc3RyYnVmX2FwcGVuZF9jaGFyKCh1bnNpZ25lZCBjaGFyKSByZXMpOworCQkJCQl9CisKKzxsZXhzdHI+XFxbMC05XSsJCQkJeyAvKiBjYXRjaCB3cm9uZyBvY3RhbCBlc2NhcGUgc2VxLiAqLworCQkJCQkJZnByaW50ZihzdGRlcnIsICJlcnJvcjogaW52YWxpZCBvY3RhbGUgZXNjYXBlIHNlcXVlbmNlXG4iKTsKKwkJCQkJCXJldHVybiBFUlJPUjsKKwkJCQkJfQorCis8bGV4c3RyPlxceFswLTlhLWZBLUZdezEsMn0JCXsKKwkJCQkJCWludCByZXM7CisKKwkJCQkJCXNzY2FuZih5eXRleHQgKyAyLCAiJXgiLCAmcmVzKTsKKworCQkJCQkJaWYgKHJlcyA+IDB4RkYpIHsKKwkJCQkJCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yOiBoZXhhZGVjaW1hbCBlc2NhcGUgIiBcCisJCQkJCQkJInNlcXVlbmNlIG91dCBvZiByYW5nZVxuIik7CisJCQkJCQkJcmV0dXJuIEVSUk9SOworCQkJCQkJfQorCQkJCQkJc3RyYnVmX2FwcGVuZF9jaGFyKCh1bnNpZ25lZCBjaGFyKSByZXMpOworCQkJCQl9CisKKzxsZXhzdHI+XFxuCQkJCXN0cmJ1Zl9hcHBlbmRfY2hhcignXG4nKTsKKzxsZXhzdHI+XFxyCQkJCXN0cmJ1Zl9hcHBlbmRfY2hhcignXHInKTsKKzxsZXhzdHI+XFx0CQkJCXN0cmJ1Zl9hcHBlbmRfY2hhcignXHQnKTsKKzxsZXhzdHI+XFx2CQkJCXN0cmJ1Zl9hcHBlbmRfY2hhcignXHYnKTsKKzxsZXhzdHI+XFxiCQkJCXN0cmJ1Zl9hcHBlbmRfY2hhcignXGInKTsKKzxsZXhzdHI+XFxmCQkJCXN0cmJ1Zl9hcHBlbmRfY2hhcignXGYnKTsKKzxsZXhzdHI+XFxhCQkJCXN0cmJ1Zl9hcHBlbmRfY2hhcignXGEnKTsKKworPGxleHN0cj5cXCgufFxuKQkJCXN0cmJ1Zl9hcHBlbmRfY2hhcih5eXRleHRbMV0pOworPGxleHN0cj5bXlxcXG5cIl0rCQkJc3RyYnVmX2FwcGVuZF9jaGFycCh5eXRleHQpOworCitbYUFdW25OXVtkRF0JCQkJcmV0dXJuIEFORDsKK1tvT11bclJdCQkJCXJldHVybiBPUjsKK1tuTl1bb09dW3RUXQkJCQlyZXR1cm4gTk9UOworIigiCQkJCQl8CisiKSIJCQkJCXsKKwkJCQkJCXJldHVybiB5eWx2YWwuaSA9ICp5eXRleHQ7CisJCQkJCX0KK1teIFx0XHJcbigpXSsJCQkJeworCQkJCQkJeXlsdmFsLmIgPSBic3RyX2FsbG9jKHl5dGV4dCk7CisJCQkJCQlpZiAoeXlsdmFsLmIgPT0gTlVMTCkKKwkJCQkJCQlyZXR1cm4gRVJST1I7CisJCQkJCQlyZXR1cm4gQVRUUklCVVRFOworCQkJCQl9CislJQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvZW1wX2VtYXRjaC55IGIvaXByb3V0ZTIvdGMvZW1wX2VtYXRjaC55Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNmNmMzUKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy9lbXBfZW1hdGNoLnkKQEAgLTAsMCArMSwxMDAgQEAKKyV7CisgI2luY2x1ZGUgPHN0ZGlvLmg+CisgI2luY2x1ZGUgPHN0ZGxpYi5oPgorICNpbmNsdWRlIDxtYWxsb2MuaD4KKyAjaW5jbHVkZSA8c3RyaW5nLmg+CisgI2luY2x1ZGUgIm1fZW1hdGNoLmgiCislfQorCislbG9jYXRpb25zCisldG9rZW4tdGFibGUKKyVlcnJvci12ZXJib3NlCislbmFtZS1wcmVmaXggImVtYXRjaF8iCisKKyV1bmlvbiB7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGJzdHIgKmI7CisJc3RydWN0IGVtYXRjaCAqZTsKK30KKworJXsKKyBleHRlcm4gaW50IGVtYXRjaF9sZXgodm9pZCk7CisgZXh0ZXJuIHZvaWQgeXllcnJvcihjb25zdCBjaGFyICpzKTsKKyBleHRlcm4gc3RydWN0IGVtYXRjaCAqZW1hdGNoX3Jvb3Q7CisgZXh0ZXJuIGNoYXIgKmVtYXRjaF9lcnI7CislfQorCisldG9rZW4gPGk+IEVSUk9SCisldG9rZW4gPGI+IEFUVFJJQlVURQorJXRva2VuIDxpPiBBTkQgT1IgTk9UCisldHlwZSA8aT4gaW52ZXJ0IHJlbGF0aW9uCisldHlwZSA8ZT4gbWF0Y2ggZXhwcgorJXR5cGUgPGI+IGFyZ3MKKyVyaWdodCBBTkQgT1IKKyVzdGFydCBpbnB1dAorJSUKK2lucHV0OgorCS8qIGVtcHR5ICovCisJfCBleHByCisJCXsgZW1hdGNoX3Jvb3QgPSAkMTsgfQorCXwgZXhwciBlcnJvcgorCQl7CisJCQllbWF0Y2hfcm9vdCA9ICQxOworCQkJWVlBQ0NFUFQ7CisJCX0KKwk7CisKK2V4cHI6CisJbWF0Y2gKKwkJeyAkJCA9ICQxOyB9CisJfCBtYXRjaCByZWxhdGlvbiBleHByCisJCXsKKwkJCSQxLT5yZWxhdGlvbiA9ICQyOworCQkJJDEtPm5leHQgPSAkMzsKKwkJCSQkID0gJDE7CisJCX0KKwk7CisKK21hdGNoOgorCWludmVydCBBVFRSSUJVVEUgJygnIGFyZ3MgJyknCisJCXsKKwkJCSQyLT5uZXh0ID0gJDQ7CisJCQkkJCA9IG5ld19lbWF0Y2goJDIsICQxKTsKKwkJCWlmICgkJCA9PSBOVUxMKQorCQkJCVlZQUJPUlQ7CisJCX0KKwl8IGludmVydCAnKCcgZXhwciAnKScKKwkJeworCQkJJCQgPSBuZXdfZW1hdGNoKE5VTEwsICQxKTsKKwkJCWlmICgkJCA9PSBOVUxMKQorCQkJCVlZQUJPUlQ7CisJCQkkJC0+Y2hpbGQgPSAkMzsKKwkJfQorCTsKKworYXJnczoKKwlBVFRSSUJVVEUKKwkJeyAkJCA9ICQxOyB9CisJfCBBVFRSSUJVVEUgYXJncworCQl7ICQxLT5uZXh0ID0gJDI7IH0KKwk7CisKK3JlbGF0aW9uOgorCUFORAorCQl7ICQkID0gVENGX0VNX1JFTF9BTkQ7IH0KKwl8IE9SCisJCXsgJCQgPSBUQ0ZfRU1fUkVMX09SOyB9CisJOworCitpbnZlcnQ6CisJLyogZW1wdHkgKi8KKwkJeyAkJCA9IDA7IH0KKwl8IE5PVAorCQl7ICQkID0gMTsgfQorCTsKKyUlCisKKyB2b2lkIHl5ZXJyb3IoY29uc3QgY2hhciAqcykKKyB7CisJIGVtYXRjaF9lcnIgPSBzdHJkdXAocyk7CisgfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvZl9iYXNpYy5jIGIvaXByb3V0ZTIvdGMvZl9iYXNpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZGYxZDIKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy9mX2Jhc2ljLmMKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBmX2Jhc2ljLmMJCUJhc2ljIENsYXNzaWZpZXIKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0Y191dGlsLmgiCisjaW5jbHVkZSAibV9lbWF0Y2guaCIKKworc3RhdGljIHZvaWQgZXhwbGFpbih2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IC4uLiBiYXNpYyBbIG1hdGNoIEVNQVRDSF9UUkVFIF0gXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICAgWyBhY3Rpb24gQUNUSU9OX1NQRUMgXSBbIGNsYXNzaWQgQ0xBU1NJRCBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJZnByaW50ZihzdGRlcnIsICJXaGVyZTogU0VMRUNUT1IgOj0gU0FNUExFIFNBTVBMRSAuLi5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgIEZJTFRFUklEIDo9IFg6WTpaXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBBQ1RJT05fU1BFQyA6PSAuLi4gbG9vayBhdCBpbmRpdmlkdWFsIGFjdGlvbnNcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXG5OT1RFOiBDTEFTU0lEIGlzIHBhcnNlZCBhcyBoZXhhZGVjaW1hbCBpbnB1dC5cbiIpOworfQorCitzdGF0aWMgaW50IGJhc2ljX3BhcnNlX29wdChzdHJ1Y3QgZmlsdGVyX3V0aWwgKnF1LCBjaGFyICpoYW5kbGUsCisJCQkgICBpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlzdHJ1Y3QgdGNtc2cgKnQgPSBOTE1TR19EQVRBKG4pOworCXN0cnVjdCBydGF0dHIgKnRhaWw7CisJbG9uZyBoID0gMDsKKworCWlmIChoYW5kbGUpIHsKKwkJaCA9IHN0cnRvbChoYW5kbGUsIE5VTEwsIDApOworCQlpZiAoaCA9PSBMT05HX01JTiB8fCBoID09IExPTkdfTUFYKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgaGFuZGxlIFwiJXNcIiwgbXVzdCBiZSBudW1lcmljLlxuIiwKKwkJCSAgICBoYW5kbGUpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXQtPnRjbV9oYW5kbGUgPSBoOworCisJaWYgKGFyZ2MgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwl0YWlsID0gKHN0cnVjdCBydGF0dHIqKSgoKHZvaWQqKW4pK05MTVNHX0FMSUdOKG4tPm5sbXNnX2xlbikpOworCWFkZGF0dHJfbChuLCBNQVhfTVNHLCBUQ0FfT1BUSU9OUywgTlVMTCwgMCk7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJtYXRjaCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocGFyc2VfZW1hdGNoKCZhcmdjLCAmYXJndiwgVENBX0JBU0lDX0VNQVRDSEVTLCBuKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImVtYXRjaFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiY2xhc3NpZCIpID09IDAgfHwKKwkJCSAgIHN0cmNtcCgqYXJndiwgImZsb3dpZCIpID09IDApIHsKKwkJCXVuc2lnbmVkIGhhbmRsZTsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3RjX2NsYXNzaWQoJmhhbmRsZSwgKmFyZ3YpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwiY2xhc3NpZFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlhZGRhdHRyX2wobiwgTUFYX01TRywgVENBX0JBU0lDX0NMQVNTSUQsICZoYW5kbGUsIDQpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJhY3Rpb24iKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHBhcnNlX2FjdGlvbigmYXJnYywgJmFyZ3YsIFRDQV9CQVNJQ19BQ1QsIG4pKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwiYWN0aW9uXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInBvbGljZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocGFyc2VfcG9saWNlKCZhcmdjLCAmYXJndiwgVENBX0JBU0lDX1BPTElDRSwgbikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJwb2xpY2VcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaGVscCIpID09IDApIHsKKwkJCWV4cGxhaW4oKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiV2hhdCBpcyBcIiVzXCI/XG4iLCAqYXJndik7CisJCQlleHBsYWluKCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJdGFpbC0+cnRhX2xlbiA9ICgoKHZvaWQqKW4pK24tPm5sbXNnX2xlbikgLSAodm9pZCopdGFpbDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiYXNpY19wcmludF9vcHQoc3RydWN0IGZpbHRlcl91dGlsICpxdSwgRklMRSAqZiwKKwkJCSAgIHN0cnVjdCBydGF0dHIgKm9wdCwgX191MzIgaGFuZGxlKQoreworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9CQVNJQ19NQVgrMV07CisKKwlpZiAob3B0ID09IE5VTEwpCisJCXJldHVybiAwOworCisJcGFyc2VfcnRhdHRyX25lc3RlZCh0YiwgVENBX0JBU0lDX01BWCwgb3B0KTsKKworCWlmIChoYW5kbGUpCisJCWZwcmludGYoZiwgImhhbmRsZSAweCV4ICIsIGhhbmRsZSk7CisKKwlpZiAodGJbVENBX0JBU0lDX0NMQVNTSURdKSB7CisJCVNQUklOVF9CVUYoYjEpOworCQlmcHJpbnRmKGYsICJmbG93aWQgJXMgIiwKKwkJCXNwcmludF90Y19jbGFzc2lkKHJ0YV9nZXRhdHRyX3UzMih0YltUQ0FfQkFTSUNfQ0xBU1NJRF0pLCBiMSkpOworCX0KKworCWlmICh0YltUQ0FfQkFTSUNfRU1BVENIRVNdKQorCQlwcmludF9lbWF0Y2goZiwgdGJbVENBX0JBU0lDX0VNQVRDSEVTXSk7CisKKwlpZiAodGJbVENBX0JBU0lDX1BPTElDRV0pIHsKKwkJZnByaW50ZihmLCAiXG4iKTsKKwkJdGNfcHJpbnRfcG9saWNlKGYsIHRiW1RDQV9CQVNJQ19QT0xJQ0VdKTsKKwl9CisKKwlpZiAodGJbVENBX0JBU0lDX0FDVF0pIHsKKwkJdGNfcHJpbnRfYWN0aW9uKGYsIHRiW1RDQV9CQVNJQ19BQ1RdKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGZpbHRlcl91dGlsIGJhc2ljX2ZpbHRlcl91dGlsID0geworCS5pZCA9ICJiYXNpYyIsCisJLnBhcnNlX2ZvcHQgPSBiYXNpY19wYXJzZV9vcHQsCisJLnByaW50X2ZvcHQgPSBiYXNpY19wcmludF9vcHQsCit9OwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvZl9icGYuYyBiL2lwcm91dGUyL3RjL2ZfYnBmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZjMmU1OAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL2ZfYnBmLmMKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBmX2JwZi5jCUJQRi1iYXNlZCBDbGFzc2lmaWVyCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIGRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CURhbmllbCBCb3JrbWFubiA8ZGJvcmttYW5AcmVkaGF0LmNvbT4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGxpbnV4L2JwZi5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0Y191dGlsLmgiCisjaW5jbHVkZSAidGNfYnBmLmgiCisKK3N0YXRpYyBjb25zdCBlbnVtIGJwZl9wcm9nX3R5cGUgYnBmX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUzsKKworc3RhdGljIGNvbnN0IGludCBubGFfdGJsW0JQRl9OTEFfTUFYXSA9IHsKKwlbQlBGX05MQV9PUFNfTEVOXQk9IFRDQV9CUEZfT1BTX0xFTiwKKwlbQlBGX05MQV9PUFNdCQk9IFRDQV9CUEZfT1BTLAorCVtCUEZfTkxBX0ZEXQkJPSBUQ0FfQlBGX0ZELAorCVtCUEZfTkxBX05BTUVdCQk9IFRDQV9CUEZfTkFNRSwKK307CisKK3N0YXRpYyB2b2lkIGV4cGxhaW4odm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAuLi4gYnBmIC4uLlxuIik7CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworCWZwcmludGYoc3RkZXJyLCAiQlBGIHVzZSBjYXNlOlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgYnl0ZWNvZGUgQlBGX0JZVEVDT0RFXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiBieXRlY29kZS1maWxlIEZJTEVcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgImVCUEYgdXNlIGNhc2U6XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiBvYmplY3QtZmlsZSBGSUxFIFsgc2VjdGlvbiBDTFNfTkFNRSBdIFsgZXhwb3J0IFVEU19GSUxFIF0iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiBbIHZlcmJvc2UgXSBbIGRpcmVjdC1hY3Rpb24gXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgb2JqZWN0LXBpbm5lZCBGSUxFIFsgZGlyZWN0LWFjdGlvbiBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJZnByaW50ZihzdGRlcnIsICJDb21tb24gcmVtYWluaW5nIG9wdGlvbnM6XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiBbIGFjdGlvbiBBQ1RJT05fU1BFQyBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiBbIGNsYXNzaWQgQ0xBU1NJRCBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJZnByaW50ZihzdGRlcnIsICJXaGVyZSBCUEZfQllURUNPREUgOj0gXCdzLGMgdCBmIGssYyB0IGYgayxjIHQgZiBrLC4uLlwnXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgImMsdCxmLGsgYW5kIHMgYXJlIGRlY2ltYWxzOyBzIGRlbm90ZXMgbnVtYmVyIG9mIDQtdHVwbGVzXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJZnByaW50ZihzdGRlcnIsICJXaGVyZSBGSUxFIHBvaW50cyB0byBhIGZpbGUgY29udGFpbmluZyB0aGUgQlBGX0JZVEVDT0RFIHN0cmluZyxcbiIpOworCWZwcmludGYoc3RkZXJyLCAiYW4gRUxGIGZpbGUgY29udGFpbmluZyBlQlBGIG1hcCBkZWZpbml0aW9ucyBhbmQgYnl0ZWNvZGUsIG9yIGFcbiIpOworCWZwcmludGYoc3RkZXJyLCAicGlubmVkIGVCUEYgcHJvZ3JhbS5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIldoZXJlIENMU19OQU1FIHJlZmVycyB0byB0aGUgc2VjdGlvbiBuYW1lIGNvbnRhaW5pbmcgdGhlXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgImNsYXNzaWZpZXIgKGRlZmF1bHQgXCclc1wnKS5cbiIsIGJwZl9kZWZhdWx0X3NlY3Rpb24oYnBmX3R5cGUpKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJZnByaW50ZihzdGRlcnIsICJXaGVyZSBVRFNfRklMRSBwb2ludHMgdG8gYSB1bml4IGRvbWFpbiBzb2NrZXQgZmlsZSBpbiBvcmRlclxuIik7CisJZnByaW50ZihzdGRlcnIsICJ0byBoYW5kIG9mZiBjb250cm9sIG9mIGFsbCBjcmVhdGVkIGVCUEYgbWFwcyB0byBhbiBhZ2VudC5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIkFDVElPTl9TUEVDIDo9IC4uLiBsb29rIGF0IGluZGl2aWR1YWwgYWN0aW9uc1xuIik7CisJZnByaW50ZihzdGRlcnIsICJOT1RFOiBDTEFTU0lEIGlzIHBhcnNlZCBhcyBoZXhhZGVjaW1hbCBpbnB1dC5cbiIpOworfQorCitzdGF0aWMgaW50IGJwZl9wYXJzZV9vcHQoc3RydWN0IGZpbHRlcl91dGlsICpxdSwgY2hhciAqaGFuZGxlLAorCQkJIGludCBhcmdjLCBjaGFyICoqYXJndiwgc3RydWN0IG5sbXNnaGRyICpuKQoreworCWNvbnN0IGNoYXIgKmJwZl9vYmogPSBOVUxMLCAqYnBmX3Vkc19uYW1lID0gTlVMTDsKKwlzdHJ1Y3QgdGNtc2cgKnQgPSBOTE1TR19EQVRBKG4pOworCXVuc2lnbmVkIGludCBicGZfZmxhZ3MgPSAwOworCWJvb2wgc2Vlbl9ydW4gPSBmYWxzZTsKKwlzdHJ1Y3QgcnRhdHRyICp0YWlsOworCWludCByZXQgPSAwOworCisJaWYgKGFyZ2MgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoaGFuZGxlKSB7CisJCWlmIChnZXRfdTMyKCZ0LT50Y21faGFuZGxlLCBoYW5kbGUsIDApKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJoYW5kbGVcIlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwl0YWlsID0gKHN0cnVjdCBydGF0dHIgKikoKCh2b2lkICopbikgKyBOTE1TR19BTElHTihuLT5ubG1zZ19sZW4pKTsKKwlhZGRhdHRyX2wobiwgTUFYX01TRywgVENBX09QVElPTlMsIE5VTEwsIDApOworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChtYXRjaGVzKCphcmd2LCAicnVuIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKK29wdF9icGY6CisJCQlzZWVuX3J1biA9IHRydWU7CisJCQlpZiAoYnBmX3BhcnNlX2NvbW1vbigmYXJnYywgJmFyZ3YsIG5sYV90YmwsIGJwZl90eXBlLAorCQkJCQkgICAgICZicGZfb2JqLCAmYnBmX3Vkc19uYW1lLCBuKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHJldHJpZXZlIChlKUJQRiBkYXRhIVxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJjbGFzc2lkIikgPT0gMCB8fAorCQkJICAgbWF0Y2hlcygqYXJndiwgImZsb3dpZCIpID09IDApIHsKKwkJCXVuc2lnbmVkIGludCBoYW5kbGU7CisKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3RjX2NsYXNzaWQoJmhhbmRsZSwgKmFyZ3YpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwiY2xhc3NpZFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlhZGRhdHRyMzIobiwgTUFYX01TRywgVENBX0JQRl9DTEFTU0lELCBoYW5kbGUpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJkaXJlY3QtYWN0aW9uIikgPT0gMCB8fAorCQkJICAgbWF0Y2hlcygqYXJndiwgImRhIikgPT0gMCkgeworCQkJYnBmX2ZsYWdzIHw9IFRDQV9CUEZfRkxBR19BQ1RfRElSRUNUOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJhY3Rpb24iKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHBhcnNlX2FjdGlvbigmYXJnYywgJmFyZ3YsIFRDQV9CUEZfQUNULCBuKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImFjdGlvblwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAicG9saWNlIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChwYXJzZV9wb2xpY2UoJmFyZ2MsICZhcmd2LCBUQ0FfQlBGX1BPTElDRSwgbikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJwb2xpY2VcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKSB7CisJCQlleHBsYWluKCk7CisJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSB7CisJCQlpZiAoIXNlZW5fcnVuKQorCQkJCWdvdG8gb3B0X2JwZjsKKworCQkJZnByaW50ZihzdGRlcnIsICJXaGF0IGlzIFwiJXNcIj9cbiIsICphcmd2KTsKKwkJCWV4cGxhaW4oKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCU5FWFRfQVJHX0ZXRCgpOworCX0KKworCWlmIChicGZfb2JqICYmIGJwZl9mbGFncykKKwkJYWRkYXR0cjMyKG4sIE1BWF9NU0csIFRDQV9CUEZfRkxBR1MsIGJwZl9mbGFncyk7CisKKwl0YWlsLT5ydGFfbGVuID0gKCgodm9pZCAqKW4pICsgbi0+bmxtc2dfbGVuKSAtICh2b2lkICopdGFpbDsKKworCWlmIChicGZfdWRzX25hbWUpCisJCXJldCA9IGJwZl9zZW5kX21hcF9mZHMoYnBmX3Vkc19uYW1lLCBicGZfb2JqKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYnBmX3ByaW50X29wdChzdHJ1Y3QgZmlsdGVyX3V0aWwgKnF1LCBGSUxFICpmLAorCQkJIHN0cnVjdCBydGF0dHIgKm9wdCwgX191MzIgaGFuZGxlKQoreworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9CUEZfTUFYICsgMV07CisKKwlpZiAob3B0ID09IE5VTEwpCisJCXJldHVybiAwOworCisJcGFyc2VfcnRhdHRyX25lc3RlZCh0YiwgVENBX0JQRl9NQVgsIG9wdCk7CisKKwlpZiAoaGFuZGxlKQorCQlmcHJpbnRmKGYsICJoYW5kbGUgMHgleCAiLCBoYW5kbGUpOworCisJaWYgKHRiW1RDQV9CUEZfQ0xBU1NJRF0pIHsKKwkJU1BSSU5UX0JVRihiMSk7CisJCWZwcmludGYoZiwgImZsb3dpZCAlcyAiLAorCQkJc3ByaW50X3RjX2NsYXNzaWQocnRhX2dldGF0dHJfdTMyKHRiW1RDQV9CUEZfQ0xBU1NJRF0pLCBiMSkpOworCX0KKworCWlmICh0YltUQ0FfQlBGX05BTUVdKQorCQlmcHJpbnRmKGYsICIlcyAiLCBydGFfZ2V0YXR0cl9zdHIodGJbVENBX0JQRl9OQU1FXSkpOworCWVsc2UgaWYgKHRiW1RDQV9CUEZfRkRdKQorCQlmcHJpbnRmKGYsICJwZmQgJXUgIiwgcnRhX2dldGF0dHJfdTMyKHRiW1RDQV9CUEZfRkRdKSk7CisKKwlpZiAodGJbVENBX0JQRl9GTEFHU10pIHsKKwkJdW5zaWduZWQgaW50IGZsYWdzID0gcnRhX2dldGF0dHJfdTMyKHRiW1RDQV9CUEZfRkxBR1NdKTsKKworCQlpZiAoZmxhZ3MgJiBUQ0FfQlBGX0ZMQUdfQUNUX0RJUkVDVCkKKwkJCWZwcmludGYoZiwgImRpcmVjdC1hY3Rpb24gIik7CisJfQorCisJaWYgKHRiW1RDQV9CUEZfT1BTXSAmJiB0YltUQ0FfQlBGX09QU19MRU5dKSB7CisJCWJwZl9wcmludF9vcHMoZiwgdGJbVENBX0JQRl9PUFNdLAorCQkJICAgICAgcnRhX2dldGF0dHJfdTE2KHRiW1RDQV9CUEZfT1BTX0xFTl0pKTsKKwkJZnByaW50ZihmLCAiXG4iKTsKKwl9CisKKwlpZiAodGJbVENBX0JQRl9QT0xJQ0VdKSB7CisJCWZwcmludGYoZiwgIlxuIik7CisJCXRjX3ByaW50X3BvbGljZShmLCB0YltUQ0FfQlBGX1BPTElDRV0pOworCX0KKworCWlmICh0YltUQ0FfQlBGX0FDVF0pIHsKKwkJdGNfcHJpbnRfYWN0aW9uKGYsIHRiW1RDQV9CUEZfQUNUXSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBmaWx0ZXJfdXRpbCBicGZfZmlsdGVyX3V0aWwgPSB7CisJLmlkCQk9ICJicGYiLAorCS5wYXJzZV9mb3B0CT0gYnBmX3BhcnNlX29wdCwKKwkucHJpbnRfZm9wdAk9IGJwZl9wcmludF9vcHQsCit9OwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvZl9jZ3JvdXAuYyBiL2lwcm91dGUyL3RjL2ZfY2dyb3VwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNmNzQwNgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL2ZfY2dyb3VwLmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBmX2Nncm91cC5jCQlDb250cm9sIEdyb3VwIENsYXNzaWZpZXIKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJVGhvbWFzIEdyYWYgPHRncmFmQGluZnJhZGVhZC5vcmc+CisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAidGNfdXRpbC5oIgorI2luY2x1ZGUgIm1fZW1hdGNoLmgiCisKK3N0YXRpYyB2b2lkIGV4cGxhaW4odm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAuLi4gY2dyb3VwIFsgbWF0Y2ggRU1BVENIX1RSRUUgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgICBbIGFjdGlvbiBBQ1RJT05fU1BFQyBdXG4iKTsKK30KKworc3RhdGljIGludCBjZ3JvdXBfcGFyc2Vfb3B0KHN0cnVjdCBmaWx0ZXJfdXRpbCAqcXUsIGNoYXIgKmhhbmRsZSwKKwkJCSAgIGludCBhcmdjLCBjaGFyICoqYXJndiwgc3RydWN0IG5sbXNnaGRyICpuKQoreworCXN0cnVjdCB0Y21zZyAqdCA9IE5MTVNHX0RBVEEobik7CisJc3RydWN0IHJ0YXR0ciAqdGFpbDsKKwlsb25nIGggPSAwOworCisJaWYgKGhhbmRsZSkgeworCQloID0gc3RydG9sKGhhbmRsZSwgTlVMTCwgMCk7CisJCWlmIChoID09IExPTkdfTUlOIHx8IGggPT0gTE9OR19NQVgpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBoYW5kbGUgXCIlc1wiLCBtdXN0IGJlIG51bWVyaWMuXG4iLAorCQkJICAgIGhhbmRsZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwl0LT50Y21faGFuZGxlID0gaDsKKworCXRhaWwgPSAoc3RydWN0IHJ0YXR0ciopKCgodm9pZCopbikrTkxNU0dfQUxJR04obi0+bmxtc2dfbGVuKSk7CisJYWRkYXR0cl9sKG4sIE1BWF9NU0csIFRDQV9PUFRJT05TLCBOVUxMLCAwKTsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAobWF0Y2hlcygqYXJndiwgIm1hdGNoIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChwYXJzZV9lbWF0Y2goJmFyZ2MsICZhcmd2LCBUQ0FfQ0dST1VQX0VNQVRDSEVTLCBuKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImVtYXRjaFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiYWN0aW9uIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChwYXJzZV9hY3Rpb24oJmFyZ2MsICZhcmd2LCBUQ0FfQ0dST1VQX0FDVCwgbikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJhY3Rpb25cIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJY29udGludWU7CisKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAicG9saWNlIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChwYXJzZV9wb2xpY2UoJmFyZ2MsICZhcmd2LCBUQ0FfQ0dST1VQX1BPTElDRSwgbikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJwb2xpY2VcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaGVscCIpID09IDApIHsKKwkJCWV4cGxhaW4oKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiV2hhdCBpcyBcIiVzXCI/XG4iLCAqYXJndik7CisJCQlleHBsYWluKCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwl0YWlsLT5ydGFfbGVuID0gKCgodm9pZCopbikrbi0+bmxtc2dfbGVuKSAtICh2b2lkKil0YWlsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNncm91cF9wcmludF9vcHQoc3RydWN0IGZpbHRlcl91dGlsICpxdSwgRklMRSAqZiwKKwkJCSAgIHN0cnVjdCBydGF0dHIgKm9wdCwgX191MzIgaGFuZGxlKQoreworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9DR1JPVVBfTUFYKzFdOworCisJaWYgKG9wdCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXBhcnNlX3J0YXR0cl9uZXN0ZWQodGIsIFRDQV9DR1JPVVBfTUFYLCBvcHQpOworCisJaWYgKGhhbmRsZSkKKwkJZnByaW50ZihmLCAiaGFuZGxlIDB4JXggIiwgaGFuZGxlKTsKKworCWlmICh0YltUQ0FfQ0dST1VQX0VNQVRDSEVTXSkKKwkJcHJpbnRfZW1hdGNoKGYsIHRiW1RDQV9DR1JPVVBfRU1BVENIRVNdKTsKKworCWlmICh0YltUQ0FfQ0dST1VQX1BPTElDRV0pIHsKKwkJZnByaW50ZihmLCAiXG4iKTsKKwkJdGNfcHJpbnRfcG9saWNlKGYsIHRiW1RDQV9DR1JPVVBfUE9MSUNFXSk7CisJfQorCisJaWYgKHRiW1RDQV9DR1JPVVBfQUNUXSkKKwkJdGNfcHJpbnRfYWN0aW9uKGYsIHRiW1RDQV9DR1JPVVBfQUNUXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGZpbHRlcl91dGlsIGNncm91cF9maWx0ZXJfdXRpbCA9IHsKKwkuaWQgPSAiY2dyb3VwIiwKKwkucGFyc2VfZm9wdCA9IGNncm91cF9wYXJzZV9vcHQsCisJLnByaW50X2ZvcHQgPSBjZ3JvdXBfcHJpbnRfb3B0LAorfTsKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RjL2ZfZmxvdy5jIGIvaXByb3V0ZTIvdGMvZl9mbG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5OGY1NQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL2ZfZmxvdy5jCkBAIC0wLDAgKzEsMzYxIEBACisvKgorICogZl9mbG93LmMJCUZsb3cgZmlsdGVyCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+CisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInRjX3V0aWwuaCIKKyNpbmNsdWRlICJtX2VtYXRjaC5oIgorCitzdGF0aWMgdm9pZCBleHBsYWluKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsCisiVXNhZ2U6IC4uLiBmbG93IC4uLlxuIgorIlxuIgorIiBbbWFwcGluZyBtb2RlXTogbWFwIGtleSBLRVkgWyBPUFMgXSAuLi5cbiIKKyIgW2hhc2hpbmcgbW9kZV06IGhhc2gga2V5cyBLRVktTElTVCAuLi4gWyBwZXJ0dXJiIFNFQ1MgXVxuIgorIlxuIgorIiAgICAgICAgICAgICAgICAgWyBkaXZpc29yIE5VTSBdIFsgYmFzZWNsYXNzIElEIF0gWyBtYXRjaCBFTUFUQ0hfVFJFRSBdXG4iCisiICAgICAgICAgICAgICAgICBbIGFjdGlvbiBBQ1RJT05fU1BFQyBdXG4iCisiXG4iCisiS0VZLUxJU1QgOj0gWyBLRVktTElTVCAsIF0gS0VZXG4iCisiS0VZICAgICAgOj0gWyBzcmMgfCBkc3QgfCBwcm90byB8IHByb3RvLXNyYyB8IHByb3RvLWRzdCB8IGlpZiB8IHByaW9yaXR5IHwgXG4iCisiICAgICAgICAgICAgICBtYXJrIHwgbmZjdCB8IG5mY3Qtc3JjIHwgbmZjdC1kc3QgfCBuZmN0LXByb3RvLXNyYyB8IFxuIgorIiAgICAgICAgICAgICAgbmZjdC1wcm90by1kc3QgfCBydC1jbGFzc2lkIHwgc2stdWlkIHwgc2stZ2lkIHxcbiIKKyIgICAgICAgICAgICAgIHZsYW4tdGFnIHwgcnhoYXNoIF1cbiIKKyJPUFMgICAgICA6PSBbIG9yIE5VTSB8IGFuZCBOVU0gfCB4b3IgTlVNIHwgcnNoaWZ0IE5VTSB8IGFkZGVuZCBOVU0gXVxuIgorIklEICAgICAgIDo9IFg6WVxuIgorCSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpmbG93X2tleXNbRkxPV19LRVlfTUFYKzFdID0geworCVtGTE9XX0tFWV9TUkNdCQkJPSAic3JjIiwKKwlbRkxPV19LRVlfRFNUXQkJCT0gImRzdCIsCisJW0ZMT1dfS0VZX1BST1RPXQkJPSAicHJvdG8iLAorCVtGTE9XX0tFWV9QUk9UT19TUkNdCQk9ICJwcm90by1zcmMiLAorCVtGTE9XX0tFWV9QUk9UT19EU1RdCQk9ICJwcm90by1kc3QiLAorCVtGTE9XX0tFWV9JSUZdCQkJPSAiaWlmIiwKKwlbRkxPV19LRVlfUFJJT1JJVFldCQk9ICJwcmlvcml0eSIsCisJW0ZMT1dfS0VZX01BUktdCQkJPSAibWFyayIsCisJW0ZMT1dfS0VZX05GQ1RdCQkJPSAibmZjdCIsCisJW0ZMT1dfS0VZX05GQ1RfU1JDXQkJPSAibmZjdC1zcmMiLAorCVtGTE9XX0tFWV9ORkNUX0RTVF0JCT0gIm5mY3QtZHN0IiwKKwlbRkxPV19LRVlfTkZDVF9QUk9UT19TUkNdCT0gIm5mY3QtcHJvdG8tc3JjIiwKKwlbRkxPV19LRVlfTkZDVF9QUk9UT19EU1RdCT0gIm5mY3QtcHJvdG8tZHN0IiwKKwlbRkxPV19LRVlfUlRDTEFTU0lEXQkJPSAicnQtY2xhc3NpZCIsCisJW0ZMT1dfS0VZX1NLVUlEXQkJPSAic2stdWlkIiwKKwlbRkxPV19LRVlfU0tHSURdCQk9ICJzay1naWQiLAorCVtGTE9XX0tFWV9WTEFOX1RBR10JCT0gInZsYW4tdGFnIiwKKwlbRkxPV19LRVlfUlhIQVNIXQkJPSAicnhoYXNoIiwKK307CisKK3N0YXRpYyBpbnQgZmxvd19wYXJzZV9rZXlzKF9fdTMyICprZXlzLCBfX3UzMiAqbmtleXMsIGNoYXIgKmFyZ3YpCit7CisJY2hhciAqcywgKnNlcDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCSprZXlzID0gMDsKKwkqbmtleXMgPSAwOworCXMgPSBhcmd2OworCXdoaWxlIChzICE9IE5VTEwpIHsKKwkJc2VwID0gc3RyY2hyKHMsICcsJyk7CisJCWlmIChzZXApCisJCQkqc2VwID0gJ1wwJzsKKworCQlmb3IgKGkgPSAwOyBpIDw9IEZMT1dfS0VZX01BWDsgaSsrKSB7CisJCQlpZiAobWF0Y2hlcyhzLCBmbG93X2tleXNbaV0pID09IDApIHsKKwkJCQkqa2V5cyB8PSAxIDw8IGk7CisJCQkJKCpua2V5cykrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoaSA+IEZMT1dfS0VZX01BWCkgeworCQkJZnByaW50ZihzdGRlcnIsICJVbmtub3duIGZsb3cga2V5IFwiJXNcIlxuIiwgcyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJcyA9IHNlcCA/IHNlcCArIDEgOiBOVUxMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdHJhbnNmZXJfYml0b3AoX191MzIgKm1hc2ssIF9fdTMyICp4b3IsIF9fdTMyIG0sIF9fdTMyIHgpCit7CisJKnhvciA9IHggXiAoKnhvciAmIG0pOworCSptYXNrICY9IG07Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2FkZGVuZChfX3UzMiAqYWRkZW5kLCBjaGFyICphcmd2LCBfX3UzMiBrZXlzKQoreworCWluZXRfcHJlZml4IGFkZHI7CisJaW50IHNpZ24gPSAwOworCV9fdTMyIHRtcDsKKworCWlmICgqYXJndiA9PSAnLScpIHsKKwkJc2lnbiA9IDE7CisJCWFyZ3YrKzsKKwl9CisKKwlpZiAoZ2V0X3UzMigmdG1wLCBhcmd2LCAwKSA9PSAwKQorCQlnb3RvIG91dDsKKworCWlmIChrZXlzICYgKEZMT1dfS0VZX1NSQyB8IEZMT1dfS0VZX0RTVCB8CisJCSAgICBGTE9XX0tFWV9ORkNUX1NSQyB8IEZMT1dfS0VZX05GQ1RfRFNUKSAmJgorCSAgICBnZXRfYWRkcigmYWRkciwgYXJndiwgQUZfVU5TUEVDKSA9PSAwKSB7CisJCXN3aXRjaCAoYWRkci5mYW1pbHkpIHsKKwkJY2FzZSBBRl9JTkVUOgorCQkJdG1wID0gbnRvaGwoYWRkci5kYXRhWzBdKTsKKwkJCWdvdG8gb3V0OworCQljYXNlIEFGX0lORVQ2OgorCQkJdG1wID0gbnRvaGwoYWRkci5kYXRhWzNdKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJcmV0dXJuIC0xOworb3V0OgorCWlmIChzaWduKQorCQl0bXAgPSAtdG1wOworCSphZGRlbmQgPSB0bXA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmxvd19wYXJzZV9vcHQoc3RydWN0IGZpbHRlcl91dGlsICpmdSwgY2hhciAqaGFuZGxlLAorCQkJICBpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlzdHJ1Y3QgdGNfcG9saWNlIHRwOworCXN0cnVjdCB0Y21zZyAqdCA9IE5MTVNHX0RBVEEobik7CisJc3RydWN0IHJ0YXR0ciAqdGFpbDsKKwlfX3UzMiBtYXNrID0gfjBVLCB4b3IgPSAwOworCV9fdTMyIGtleXMgPSAwLCBua2V5cyA9IDA7CisJX191MzIgbW9kZSA9IEZMT1dfTU9ERV9NQVA7CisJX191MzIgdG1wOworCisJbWVtc2V0KCZ0cCwgMCwgc2l6ZW9mKHRwKSk7CisKKwlpZiAoaGFuZGxlKSB7CisJCWlmIChnZXRfdTMyKCZ0LT50Y21faGFuZGxlLCBoYW5kbGUsIDApKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJoYW5kbGVcIlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwl0YWlsID0gTkxNU0dfVEFJTChuKTsKKwlhZGRhdHRyX2wobiwgNDA5NiwgVENBX09QVElPTlMsIE5VTEwsIDApOworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChtYXRjaGVzKCphcmd2LCAibWFwIikgPT0gMCkgeworCQkJbW9kZSA9IEZMT1dfTU9ERV9NQVA7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImhhc2giKSA9PSAwKSB7CisJCQltb2RlID0gRkxPV19NT0RFX0hBU0g7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImtleXMiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGZsb3dfcGFyc2Vfa2V5cygma2V5cywgJm5rZXlzLCAqYXJndikpCisJCQkJcmV0dXJuIC0xOworCQkJYWRkYXR0cjMyKG4sIDQwOTYsIFRDQV9GTE9XX0tFWVMsIGtleXMpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJhbmQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJnRtcCwgKmFyZ3YsIDApKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwibWFza1wiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQl0cmFuc2Zlcl9iaXRvcCgmbWFzaywgJnhvciwgdG1wLCAwKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAib3IiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJnRtcCwgKmFyZ3YsIDApKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwib3JcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJdHJhbnNmZXJfYml0b3AoJm1hc2ssICZ4b3IsIH50bXAsIHRtcCk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInhvciIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmdG1wLCAqYXJndiwgMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJ4b3JcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJdHJhbnNmZXJfYml0b3AoJm1hc2ssICZ4b3IsIH4wLCB0bXApOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJyc2hpZnQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJnRtcCwgKmFyZ3YsIDApKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwicnNoaWZ0XCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWFkZGF0dHIzMihuLCA0MDk2LCBUQ0FfRkxPV19SU0hJRlQsIHRtcCk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImFkZGVuZCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X2FkZGVuZCgmdG1wLCAqYXJndiwga2V5cykpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJhZGRlbmRcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYWRkYXR0cjMyKG4sIDQwOTYsIFRDQV9GTE9XX0FEREVORCwgdG1wKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiZGl2aXNvciIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmdG1wLCAqYXJndiwgMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJkaXZpc29yXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWFkZGF0dHIzMihuLCA0MDk2LCBUQ0FfRkxPV19ESVZJU09SLCB0bXApOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJiYXNlY2xhc3MiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF90Y19jbGFzc2lkKCZ0bXAsICphcmd2KSB8fCBUQ19IX01JTih0bXApID09IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJiYXNlY2xhc3NcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYWRkYXR0cjMyKG4sIDQwOTYsIFRDQV9GTE9XX0JBU0VDTEFTUywgdG1wKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAicGVydHVyYiIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmdG1wLCAqYXJndiwgMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJwZXJ0dXJiXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWFkZGF0dHIzMihuLCA0MDk2LCBUQ0FfRkxPV19QRVJUVVJCLCB0bXApOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJwb2xpY2UiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHBhcnNlX3BvbGljZSgmYXJnYywgJmFyZ3YsIFRDQV9GTE9XX1BPTElDRSwgbikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJwb2xpY2VcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImFjdGlvbiIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocGFyc2VfYWN0aW9uKCZhcmdjLCAmYXJndiwgVENBX0ZMT1dfQUNULCBuKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImFjdGlvblwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAibWF0Y2giKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHBhcnNlX2VtYXRjaCgmYXJnYywgJmFyZ3YsIFRDQV9GTE9XX0VNQVRDSEVTLCBuKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImVtYXRjaFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiaGVscCIpID09IDApIHsKKwkJCWV4cGxhaW4oKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiV2hhdCBpcyBcIiVzXCI/XG4iLCAqYXJndik7CisJCQlleHBsYWluKCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYXJndisrLCBhcmdjLS07CisJfQorCisJaWYgKG5rZXlzID4gMSAmJiBtb2RlICE9IEZMT1dfTU9ERV9IQVNIKSB7CisJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBtb2RlIFwibWFwXCIgZm9yIG11bHRpcGxlIGtleXNcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWFkZGF0dHIzMihuLCA0MDk2LCBUQ0FfRkxPV19NT0RFLCBtb2RlKTsKKworCWlmIChtYXNrICE9IH4wIHx8IHhvciAhPSAwKSB7CisJCWFkZGF0dHIzMihuLCA0MDk2LCBUQ0FfRkxPV19NQVNLLCBtYXNrKTsKKwkJYWRkYXR0cjMyKG4sIDQwOTYsIFRDQV9GTE9XX1hPUiwgeG9yKTsKKwl9CisKKwl0YWlsLT5ydGFfbGVuID0gKHZvaWQgKilOTE1TR19UQUlMKG4pIC0gKHZvaWQgKil0YWlsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZsb3dfcHJpbnRfb3B0KHN0cnVjdCBmaWx0ZXJfdXRpbCAqZnUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKm9wdCwKKwkJCSAgX191MzIgaGFuZGxlKQoreworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9GTE9XX01BWCsxXTsKKwlTUFJJTlRfQlVGKGIxKTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlfX3UzMiBtYXNrID0gfjAsIHZhbCA9IDA7CisKKwlpZiAob3B0ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJcGFyc2VfcnRhdHRyX25lc3RlZCh0YiwgVENBX0ZMT1dfTUFYLCBvcHQpOworCisJZnByaW50ZihmLCAiaGFuZGxlIDB4JXggIiwgaGFuZGxlKTsKKworCWlmICh0YltUQ0FfRkxPV19NT0RFXSkgeworCQlfX3UzMiBtb2RlID0gcnRhX2dldGF0dHJfdTMyKHRiW1RDQV9GTE9XX01PREVdKTsKKworCQlzd2l0Y2ggKG1vZGUpIHsKKwkJY2FzZSBGTE9XX01PREVfTUFQOgorCQkJZnByaW50ZihmLCAibWFwICIpOworCQkJYnJlYWs7CisJCWNhc2UgRkxPV19NT0RFX0hBU0g6CisJCQlmcHJpbnRmKGYsICJoYXNoICIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAodGJbVENBX0ZMT1dfS0VZU10pIHsKKwkJX191MzIga2V5bWFzayA9IHJ0YV9nZXRhdHRyX3UzMih0YltUQ0FfRkxPV19LRVlTXSk7CisJCWNoYXIgKnNlcCA9ICIiOworCisJCWZwcmludGYoZiwgImtleXMgIik7CisJCWZvciAoaSA9IDA7IGkgPD0gRkxPV19LRVlfTUFYOyBpKyspIHsKKwkJCWlmIChrZXltYXNrICYgKDEgPDwgaSkpIHsKKwkJCQlmcHJpbnRmKGYsICIlcyVzIiwgc2VwLCBmbG93X2tleXNbaV0pOworCQkJCXNlcCA9ICIsIjsKKwkJCX0KKwkJfQorCQlmcHJpbnRmKGYsICIgIik7CisJfQorCisJaWYgKHRiW1RDQV9GTE9XX01BU0tdKQorCQltYXNrID0gcnRhX2dldGF0dHJfdTMyKHRiW1RDQV9GTE9XX01BU0tdKTsKKwlpZiAodGJbVENBX0ZMT1dfWE9SXSkKKwkJdmFsID0gcnRhX2dldGF0dHJfdTMyKHRiW1RDQV9GTE9XX1hPUl0pOworCisJaWYgKG1hc2sgIT0gfjAgfHwgdmFsICE9IDApIHsKKwkJX191MzIgb3IgPSAobWFzayAmIHZhbCkgXiB2YWw7CisJCV9fdTMyIHhvciA9IG1hc2sgJiB2YWw7CisKKwkJaWYgKG1hc2sgIT0gfjApCisJCQlmcHJpbnRmKGYsICJhbmQgMHglLjh4ICIsIG1hc2spOworCQlpZiAoeG9yICE9IDApCisJCQlmcHJpbnRmKGYsICJ4b3IgMHglLjh4ICIsIHhvcik7CisJCWlmIChvciAhPSAwKQorCQkJZnByaW50ZihmLCAib3IgMHglLjh4ICIsIG9yKTsKKwl9CisKKwlpZiAodGJbVENBX0ZMT1dfUlNISUZUXSkKKwkJZnByaW50ZihmLCAicnNoaWZ0ICV1ICIsCisJCQlydGFfZ2V0YXR0cl91MzIodGJbVENBX0ZMT1dfUlNISUZUXSkpOworCWlmICh0YltUQ0FfRkxPV19BRERFTkRdKQorCQlmcHJpbnRmKGYsICJhZGRlbmQgMHgleCAiLAorCQkJcnRhX2dldGF0dHJfdTMyKHRiW1RDQV9GTE9XX0FEREVORF0pKTsKKworCWlmICh0YltUQ0FfRkxPV19ESVZJU09SXSkKKwkJZnByaW50ZihmLCAiZGl2aXNvciAldSAiLAorCQkJcnRhX2dldGF0dHJfdTMyKHRiW1RDQV9GTE9XX0RJVklTT1JdKSk7CisJaWYgKHRiW1RDQV9GTE9XX0JBU0VDTEFTU10pCisJCWZwcmludGYoZiwgImJhc2VjbGFzcyAlcyAiLAorCQkJc3ByaW50X3RjX2NsYXNzaWQocnRhX2dldGF0dHJfdTMyKHRiW1RDQV9GTE9XX0JBU0VDTEFTU10pLCBiMSkpOworCisJaWYgKHRiW1RDQV9GTE9XX1BFUlRVUkJdKQorCQlmcHJpbnRmKGYsICJwZXJ0dXJiICV1c2VjICIsCisJCQlydGFfZ2V0YXR0cl91MzIodGJbVENBX0ZMT1dfUEVSVFVSQl0pKTsKKworCWlmICh0YltUQ0FfRkxPV19FTUFUQ0hFU10pCisJCXByaW50X2VtYXRjaChmLCB0YltUQ0FfRkxPV19FTUFUQ0hFU10pOworCWlmICh0YltUQ0FfRkxPV19QT0xJQ0VdKQorCQl0Y19wcmludF9wb2xpY2UoZiwgdGJbVENBX0ZMT1dfUE9MSUNFXSk7CisJaWYgKHRiW1RDQV9GTE9XX0FDVF0pIHsKKwkJZnByaW50ZihmLCAiXG4iKTsKKwkJdGNfcHJpbnRfYWN0aW9uKGYsIHRiW1RDQV9GTE9XX0FDVF0pOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGZpbHRlcl91dGlsIGZsb3dfZmlsdGVyX3V0aWwgPSB7CisJLmlkCQk9ICJmbG93IiwKKwkucGFyc2VfZm9wdAk9IGZsb3dfcGFyc2Vfb3B0LAorCS5wcmludF9mb3B0CT0gZmxvd19wcmludF9vcHQsCit9OwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvZl9mbG93ZXIuYyBiL2lwcm91dGUyL3RjL2ZfZmxvd2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI5Y2MyOQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL2ZfZmxvd2VyLmMKQEAgLTAsMCArMSw1MTkgQEAKKy8qCisgKiBmX2Zsb3dlci5jCQlGbG93ZXIgQ2xhc3NpZmllcgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOiAgICAgSmlyaSBQaXJrbyA8amlyaUByZXNudWxsaS51cz4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInRjX3V0aWwuaCIKKyNpbmNsdWRlICJydF9uYW1lcy5oIgorCitzdGF0aWMgdm9pZCBleHBsYWluKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogLi4uIGZsb3dlciBbIE1BVENILUxJU1QgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgICBbIGFjdGlvbiBBQ1RJT04tU1BFQyBdIFsgY2xhc3NpZCBDTEFTU0lEIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIldoZXJlOiBNQVRDSC1MSVNUIDo9IFsgTUFUQ0gtTElTVCBdIE1BVENIXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBNQVRDSCAgICAgIDo9IHsgaW5kZXYgREVWLU5BTUUgfCBcbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgICAgICAgICBkc3RfbWFjIE1BQy1BRERSIHwgXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICAgICAgICAgc3JjX21hYyBNQUMtQUREUiB8IFxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgICAgICAgIFtpcHY0IHwgaXB2NiBdIHwgXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICAgICAgICAgaXBfcHJvdG8gW3RjcCB8IHVkcCB8IElQLVBST1RPIF0gfCBcbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgICAgICAgICBkc3RfaXAgWyBJUFY0LUFERFIgfCBJUFY2LUFERFIgXSB8IFxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgICAgICAgIHNyY19pcCBbIElQVjQtQUREUiB8IElQVjYtQUREUiBdIHwgXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICAgICAgICAgZHN0X3BvcnQgUE9SVC1OVU1CRVIgfCBcbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgICAgICAgICBzcmNfcG9ydCBQT1JULU5VTUJFUiB9XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwJIiAgICAgICBGSUxURVJJRCA6PSBYOlk6WlxuIik7CisJZnByaW50ZihzdGRlcnIsCSIgICAgICAgQUNUSU9OLVNQRUMgOj0gLi4uIGxvb2sgYXQgaW5kaXZpZHVhbCBhY3Rpb25zXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwJIlxuIik7CisJZnByaW50ZihzdGRlcnIsCSJOT1RFOiBDTEFTU0lELCBFVEgtVFlQRSwgSVAtUFJPVE8gYXJlIHBhcnNlZCBhcyBoZXhhZGVjaW1hbCBpbnB1dC5cbiIpOworCWZwcmludGYoc3RkZXJyLAkiTk9URTogVGhlcmUgY2FuIGJlIG9ubHkgdXNlZCBvbmUgbWFzayBwZXIgb25lIHByaW8uIElmIHVzZXIgbmVlZHNcbiIpOworCWZwcmludGYoc3RkZXJyLAkiICAgICAgdG8gc3BlY2lmeSBkaWZmZXJlbnQgbWFzaywgaGUgaGFzIHRvIHVzZSBkaWZmZXJlbnQgcHJpby5cbiIpOworfQorCitzdGF0aWMgaW50IGZsb3dlcl9wYXJzZV9ldGhfYWRkcihjaGFyICpzdHIsIGludCBhZGRyX3R5cGUsIGludCBtYXNrX3R5cGUsCisJCQkJIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlpbnQgcmV0OworCWNoYXIgYWRkcltFVEhfQUxFTl07CisKKwlyZXQgPSBsbF9hZGRyX2EybihhZGRyLCBzaXplb2YoYWRkciksIHN0cik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAtMTsKKwlhZGRhdHRyX2wobiwgTUFYX01TRywgYWRkcl90eXBlLCBhZGRyLCBzaXplb2YoYWRkcikpOworCW1lbXNldChhZGRyLCAweGZmLCBFVEhfQUxFTik7CisJYWRkYXR0cl9sKG4sIE1BWF9NU0csIG1hc2tfdHlwZSwgYWRkciwgc2l6ZW9mKGFkZHIpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmbG93ZXJfcGFyc2VfaXBfcHJvdG8oY2hhciAqc3RyLCBfX2JlMTYgZXRoX3R5cGUsIGludCB0eXBlLAorCQkJCSBfX3U4ICpwX2lwX3Byb3RvLCBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJaW50IHJldDsKKwlfX3U4IGlwX3Byb3RvOworCisJaWYgKGV0aF90eXBlICE9IGh0b25zKEVUSF9QX0lQKSAmJiBldGhfdHlwZSAhPSBodG9ucyhFVEhfUF9JUFY2KSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJldGhfdHlwZVwiIGZvciBpcCBwcm90b1xuIik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKG1hdGNoZXMoc3RyLCAidGNwIikgPT0gMCkgeworCQlpcF9wcm90byA9IElQUFJPVE9fVENQOworCX0gZWxzZSBpZiAobWF0Y2hlcyhzdHIsICJ1ZHAiKSA9PSAwKSB7CisJCWlwX3Byb3RvID0gSVBQUk9UT19VRFA7CisJfSBlbHNlIHsKKwkJcmV0ID0gZ2V0X3U4KCZpcF9wcm90bywgc3RyLCAxNik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gLTE7CisJfQorCWFkZGF0dHI4KG4sIE1BWF9NU0csIHR5cGUsIGlwX3Byb3RvKTsKKwkqcF9pcF9wcm90byA9IGlwX3Byb3RvOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZsb3dlcl9wYXJzZV9pcF9hZGRyKGNoYXIgKnN0ciwgX19iZTE2IGV0aF90eXBlLAorCQkJCWludCBhZGRyNF90eXBlLCBpbnQgbWFzazRfdHlwZSwKKwkJCQlpbnQgYWRkcjZfdHlwZSwgaW50IG1hc2s2X3R5cGUsCisJCQkJc3RydWN0IG5sbXNnaGRyICpuKQoreworCWludCByZXQ7CisJaW5ldF9wcmVmaXggYWRkcjsKKwlpbnQgZmFtaWx5OworCWludCBiaXRzOworCWludCBpOworCisJaWYgKGV0aF90eXBlID09IGh0b25zKEVUSF9QX0lQKSkgeworCQlmYW1pbHkgPSBBRl9JTkVUOworCX0gZWxzZSBpZiAoZXRoX3R5cGUgPT0gaHRvbnMoRVRIX1BfSVBWNikpIHsKKwkJZmFtaWx5ID0gQUZfSU5FVDY7CisJfSBlbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwiZXRoX3R5cGVcIiBmb3IgaXAgYWRkcmVzc1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXQgPSBnZXRfcHJlZml4KCZhZGRyLCBzdHIsIGZhbWlseSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGFkZHIuZmFtaWx5ICE9IGZhbWlseSkKKwkJcmV0dXJuIC0xOworCisJYWRkYXR0cl9sKG4sIE1BWF9NU0csIGFkZHIuZmFtaWx5ID09IEFGX0lORVQgPyBhZGRyNF90eXBlIDogYWRkcjZfdHlwZSwKKwkJICBhZGRyLmRhdGEsIGFkZHIuYnl0ZWxlbik7CisKKwltZW1zZXQoYWRkci5kYXRhLCAweGZmLCBhZGRyLmJ5dGVsZW4pOworCWJpdHMgPSBhZGRyLmJpdGxlbjsKKwlmb3IgKGkgPSAwOyBpIDwgYWRkci5ieXRlbGVuIC8gNDsgaSsrKSB7CisJCWlmICghYml0cykgeworCQkJYWRkci5kYXRhW2ldID0gMDsKKwkJfSBlbHNlIGlmIChiaXRzIC8gMzIgPj0gMSkgeworCQkJYml0cyAtPSAzMjsKKwkJfSBlbHNlIHsKKwkJCWFkZHIuZGF0YVtpXSA8PD0gMzIgLSBiaXRzOworCQkJYWRkci5kYXRhW2ldID0gaHRvbmwoYWRkci5kYXRhW2ldKTsKKwkJCWJpdHMgPSAwOworCQl9CisJfQorCisJYWRkYXR0cl9sKG4sIE1BWF9NU0csIGFkZHIuZmFtaWx5ID09IEFGX0lORVQgPyBtYXNrNF90eXBlIDogbWFzazZfdHlwZSwKKwkJICBhZGRyLmRhdGEsIGFkZHIuYnl0ZWxlbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmbG93ZXJfcGFyc2VfcG9ydChjaGFyICpzdHIsIF9fdTggaXBfcG9ydCwKKwkJCSAgICAgaW50IHRjcF90eXBlLCBpbnQgdWRwX3R5cGUsIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlpbnQgcmV0OworCWludCB0eXBlOworCV9fYmUxNiBwb3J0OworCisJaWYgKGlwX3BvcnQgPT0gSVBQUk9UT19UQ1ApIHsKKwkJdHlwZSA9IHRjcF90eXBlOworCX0gZWxzZSBpZiAoaXBfcG9ydCA9PSBJUFBST1RPX1VEUCkgeworCQl0eXBlID0gdWRwX3R5cGU7CisJfSBlbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwiaXBfcHJvdG9cIiBmb3IgcG9ydFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXQgPSBnZXRfdTE2KCZwb3J0LCBzdHIsIDEwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLTE7CisKKwlhZGRhdHRyMTYobiwgTUFYX01TRywgdHlwZSwgaHRvbnMocG9ydCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmxvd2VyX3BhcnNlX29wdChzdHJ1Y3QgZmlsdGVyX3V0aWwgKnF1LCBjaGFyICpoYW5kbGUsCisJCQkgICAgaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgdGNtc2cgKnQgPSBOTE1TR19EQVRBKG4pOworCXN0cnVjdCBydGF0dHIgKnRhaWw7CisJX19iZTE2IGV0aF90eXBlID0gVENfSF9NSU4odC0+dGNtX2luZm8pOworCV9fdTggaXBfcHJvdG8gPSAweGZmOworCisJaWYgKGhhbmRsZSkgeworCQlyZXQgPSBnZXRfdTMyKCZ0LT50Y21faGFuZGxlLCBoYW5kbGUsIDApOworCQlpZiAocmV0KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJoYW5kbGVcIlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwl0YWlsID0gKHN0cnVjdCBydGF0dHIgKikgKCgodm9pZCAqKSBuKSArIE5MTVNHX0FMSUdOKG4tPm5sbXNnX2xlbikpOworCWFkZGF0dHJfbChuLCBNQVhfTVNHLCBUQ0FfT1BUSU9OUywgTlVMTCwgMCk7CisKKwlpZiAoYXJnYyA9PSAwKSB7CisJCS8qYXQgbWluaW1hbCB3ZSB3aWxsIG1hdGNoIGFsbCBldGhlcnR5cGUgcGFja2V0cyAqLworCQlnb3RvIHBhcnNlX2RvbmU7CisJfQorCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChtYXRjaGVzKCphcmd2LCAiY2xhc3NpZCIpID09IDAgfHwKKwkJICAgIG1hdGNoZXMoKmFyZ3YsICJmbG93aWQiKSA9PSAwKSB7CisJCQl1bnNpZ25lZCBoYW5kbGU7CisKKwkJCU5FWFRfQVJHKCk7CisJCQlyZXQgPSBnZXRfdGNfY2xhc3NpZCgmaGFuZGxlLCAqYXJndik7CisJCQlpZiAocmV0KSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwiY2xhc3NpZFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlhZGRhdHRyX2wobiwgTUFYX01TRywgVENBX0ZMT1dFUl9DTEFTU0lELCAmaGFuZGxlLCA0KTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiaW5kZXYiKSA9PSAwKSB7CisJCQljaGFyIGlmbmFtZVtJRk5BTVNJWl07CisKKwkJCU5FWFRfQVJHKCk7CisJCQltZW1zZXQoaWZuYW1lLCAwLCBzaXplb2YoaWZuYW1lKSk7CisJCQlzdHJuY3B5KGlmbmFtZSwgKmFyZ3YsIHNpemVvZihpZm5hbWUpIC0gMSk7CisJCQlhZGRhdHRyc3RyeihuLCBNQVhfTVNHLCBUQ0FfRkxPV0VSX0lOREVWLCBpZm5hbWUpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJkc3RfbWFjIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCXJldCA9IGZsb3dlcl9wYXJzZV9ldGhfYWRkcigqYXJndiwKKwkJCQkJCSAgICBUQ0FfRkxPV0VSX0tFWV9FVEhfRFNULAorCQkJCQkJICAgIFRDQV9GTE9XRVJfS0VZX0VUSF9EU1RfTUFTSywKKwkJCQkJCSAgICBuKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwiZHN0X21hY1wiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInNyY19tYWMiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJcmV0ID0gZmxvd2VyX3BhcnNlX2V0aF9hZGRyKCphcmd2LAorCQkJCQkJICAgIFRDQV9GTE9XRVJfS0VZX0VUSF9TUkMsCisJCQkJCQkgICAgVENBX0ZMT1dFUl9LRVlfRVRIX1NSQ19NQVNLLAorCQkJCQkJICAgIG4pOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJzcmNfbWFjXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiaXBfcHJvdG8iKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJcmV0ID0gZmxvd2VyX3BhcnNlX2lwX3Byb3RvKCphcmd2LCBldGhfdHlwZSwKKwkJCQkJCSAgICBUQ0FfRkxPV0VSX0tFWV9JUF9QUk9UTywKKwkJCQkJCSAgICAmaXBfcHJvdG8sIG4pOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJpcF9wcm90b1wiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImRzdF9pcCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlyZXQgPSBmbG93ZXJfcGFyc2VfaXBfYWRkcigqYXJndiwgZXRoX3R5cGUsCisJCQkJCQkgICBUQ0FfRkxPV0VSX0tFWV9JUFY0X0RTVCwKKwkJCQkJCSAgIFRDQV9GTE9XRVJfS0VZX0lQVjRfRFNUX01BU0ssCisJCQkJCQkgICBUQ0FfRkxPV0VSX0tFWV9JUFY2X0RTVCwKKwkJCQkJCSAgIFRDQV9GTE9XRVJfS0VZX0lQVjZfRFNUX01BU0ssCisJCQkJCQkgICBuKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwiZHN0X2lwXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAic3JjX2lwIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCXJldCA9IGZsb3dlcl9wYXJzZV9pcF9hZGRyKCphcmd2LCBldGhfdHlwZSwKKwkJCQkJCSAgIFRDQV9GTE9XRVJfS0VZX0lQVjRfU1JDLAorCQkJCQkJICAgVENBX0ZMT1dFUl9LRVlfSVBWNF9TUkNfTUFTSywKKwkJCQkJCSAgIFRDQV9GTE9XRVJfS0VZX0lQVjZfU1JDLAorCQkJCQkJICAgVENBX0ZMT1dFUl9LRVlfSVBWNl9TUkNfTUFTSywKKwkJCQkJCSAgIG4pOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJzcmNfaXBcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJkc3RfcG9ydCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlyZXQgPSBmbG93ZXJfcGFyc2VfcG9ydCgqYXJndiwgaXBfcHJvdG8sCisJCQkJCQlUQ0FfRkxPV0VSX0tFWV9UQ1BfRFNULAorCQkJCQkJVENBX0ZMT1dFUl9LRVlfVURQX0RTVCwgbik7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImRzdF9wb3J0XCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAic3JjX3BvcnQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJcmV0ID0gZmxvd2VyX3BhcnNlX3BvcnQoKmFyZ3YsIGlwX3Byb3RvLAorCQkJCQkJVENBX0ZMT1dFUl9LRVlfVENQX1NSQywKKwkJCQkJCVRDQV9GTE9XRVJfS0VZX1VEUF9TUkMsIG4pOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJzcmNfcG9ydFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImFjdGlvbiIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlyZXQgPSBwYXJzZV9hY3Rpb24oJmFyZ2MsICZhcmd2LCBUQ0FfRkxPV0VSX0FDVCwgbik7CisJCQlpZiAocmV0KSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwiYWN0aW9uXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImhlbHAiKSA9PSAwKSB7CisJCQlleHBsYWluKCk7CisJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIldoYXQgaXMgXCIlc1wiP1xuIiwgKmFyZ3YpOworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWFyZ2MtLTsgYXJndisrOworCX0KKworcGFyc2VfZG9uZToKKwlyZXQgPSBhZGRhdHRyMTYobiwgTUFYX01TRywgVENBX0ZMT1dFUl9LRVlfRVRIX1RZUEUsIGV0aF90eXBlKTsKKwlpZiAocmV0KSB7CisJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImV0aF90eXBlXCIoMHgleClcbiIsCisJCQludG9ocyhldGhfdHlwZSkpOworCQlyZXR1cm4gLTE7CisJfQorCisJdGFpbC0+cnRhX2xlbiA9ICgoKHZvaWQqKW4pK24tPm5sbXNnX2xlbikgLSAodm9pZCopdGFpbDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fbWFza19iaXRzKGNoYXIgKmFkZHIsIHNpemVfdCBsZW4pCit7CisJaW50IGJpdHMgPSAwOworCWJvb2wgaG9sZSA9IGZhbHNlOworCWludCBpOworCWludCBqOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrLCBhZGRyKyspIHsKKwkJZm9yIChqID0gNzsgaiA+PSAwOyBqLS0pIHsKKwkJCWlmICgoKCphZGRyKSA+PiBqKSAmIDB4MSkgeworCQkJCWlmIChob2xlKQorCQkJCQlyZXR1cm4gLTE7CisJCQkJYml0cysrOworCQkJfSBlbHNlIGlmIChiaXRzKSB7CisJCQkJaG9sZSA9IHRydWU7CisJCQl9IGVsc2V7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJfQorCXJldHVybiBiaXRzOworfQorCitzdGF0aWMgdm9pZCBmbG93ZXJfcHJpbnRfZXRoX2FkZHIoRklMRSAqZiwgY2hhciAqbmFtZSwKKwkJCQkgIHN0cnVjdCBydGF0dHIgKmFkZHJfYXR0ciwKKwkJCQkgIHN0cnVjdCBydGF0dHIgKm1hc2tfYXR0cikKK3sKKwlTUFJJTlRfQlVGKGIxKTsKKwlpbnQgYml0czsKKworCWlmICghYWRkcl9hdHRyIHx8IFJUQV9QQVlMT0FEKGFkZHJfYXR0cikgIT0gRVRIX0FMRU4pCisJCXJldHVybjsKKwlmcHJpbnRmKGYsICJcbiAgJXMgJXMiLCBuYW1lLCBsbF9hZGRyX24yYShSVEFfREFUQShhZGRyX2F0dHIpLCBFVEhfQUxFTiwKKwkJCQkJCSAgMCwgYjEsIHNpemVvZihiMSkpKTsKKwlpZiAoIW1hc2tfYXR0ciB8fCBSVEFfUEFZTE9BRChtYXNrX2F0dHIpICE9IEVUSF9BTEVOKQorCQlyZXR1cm47CisJYml0cyA9IF9fbWFza19iaXRzKFJUQV9EQVRBKG1hc2tfYXR0ciksIEVUSF9BTEVOKTsKKwlpZiAoYml0cyA8IDApCisJCWZwcmludGYoZiwgIi8lcyIsIGxsX2FkZHJfbjJhKFJUQV9EQVRBKG1hc2tfYXR0ciksIEVUSF9BTEVOLAorCQkJCQkgICAgICAwLCBiMSwgc2l6ZW9mKGIxKSkpOworCWVsc2UgaWYgKGJpdHMgPCBFVEhfQUxFTiAqIDgpCisJCWZwcmludGYoZiwgIi8lZCIsIGJpdHMpOworfQorCitzdGF0aWMgdm9pZCBmbG93ZXJfcHJpbnRfZXRoX3R5cGUoRklMRSAqZiwgX19iZTE2ICpwX2V0aF90eXBlLAorCQkJCSAgc3RydWN0IHJ0YXR0ciAqZXRoX3R5cGVfYXR0cikKK3sKKwlfX2JlMTYgZXRoX3R5cGU7CisKKwlpZiAoIWV0aF90eXBlX2F0dHIpCisJCXJldHVybjsKKworCWV0aF90eXBlID0gcnRhX2dldGF0dHJfdTE2KGV0aF90eXBlX2F0dHIpOworCWZwcmludGYoZiwgIlxuICBldGhfdHlwZSAiKTsKKwlpZiAoZXRoX3R5cGUgPT0gaHRvbnMoRVRIX1BfSVApKQorCQlmcHJpbnRmKGYsICJpcHY0Iik7CisJZWxzZSBpZiAoZXRoX3R5cGUgPT0gaHRvbnMoRVRIX1BfSVBWNikpCisJCWZwcmludGYoZiwgImlwdjYiKTsKKwllbHNlCisJCWZwcmludGYoZiwgIiUwNHgiLCBudG9ocyhldGhfdHlwZSkpOworCSpwX2V0aF90eXBlID0gZXRoX3R5cGU7Cit9CisKK3N0YXRpYyB2b2lkIGZsb3dlcl9wcmludF9pcF9wcm90byhGSUxFICpmLCBfX3U4ICpwX2lwX3Byb3RvLAorCQkJCSAgc3RydWN0IHJ0YXR0ciAqaXBfcHJvdG9fYXR0cikKK3sKKwlfX3U4IGlwX3Byb3RvOworCisJaWYgKCFpcF9wcm90b19hdHRyKQorCQlyZXR1cm47CisKKwlpcF9wcm90byA9IHJ0YV9nZXRhdHRyX3U4KGlwX3Byb3RvX2F0dHIpOworCWZwcmludGYoZiwgIlxuICBpcF9wcm90byAiKTsKKwlpZiAoaXBfcHJvdG8gPT0gSVBQUk9UT19UQ1ApCisJCWZwcmludGYoZiwgInRjcCIpOworCWVsc2UgaWYgKGlwX3Byb3RvID09IElQUFJPVE9fVURQKQorCQlmcHJpbnRmKGYsICJ1ZHAiKTsKKwllbHNlCisJCWZwcmludGYoZiwgIiUwMngiLCBpcF9wcm90byk7CisJKnBfaXBfcHJvdG8gPSBpcF9wcm90bzsKK30KKworc3RhdGljIHZvaWQgZmxvd2VyX3ByaW50X2lwX2FkZHIoRklMRSAqZiwgY2hhciAqbmFtZSwgX19iZTE2IGV0aF90eXBlLAorCQkJCSBzdHJ1Y3QgcnRhdHRyICphZGRyNF9hdHRyLAorCQkJCSBzdHJ1Y3QgcnRhdHRyICptYXNrNF9hdHRyLAorCQkJCSBzdHJ1Y3QgcnRhdHRyICphZGRyNl9hdHRyLAorCQkJCSBzdHJ1Y3QgcnRhdHRyICptYXNrNl9hdHRyKQoreworCVNQUklOVF9CVUYoYjEpOworCXN0cnVjdCBydGF0dHIgKmFkZHJfYXR0cjsKKwlzdHJ1Y3QgcnRhdHRyICptYXNrX2F0dHI7CisJaW50IGZhbWlseTsKKwlzaXplX3QgbGVuOworCWludCBiaXRzOworCisJaWYgKGV0aF90eXBlID09IGh0b25zKEVUSF9QX0lQKSkgeworCQlmYW1pbHkgPSBBRl9JTkVUOworCQlhZGRyX2F0dHIgPSBhZGRyNF9hdHRyOworCQltYXNrX2F0dHIgPSBtYXNrNF9hdHRyOworCQlsZW4gPSA0OworCX0gZWxzZSBpZiAoZXRoX3R5cGUgPT0gaHRvbnMoRVRIX1BfSVBWNikpIHsKKwkJZmFtaWx5ID0gQUZfSU5FVDY7CisJCWFkZHJfYXR0ciA9IGFkZHI2X2F0dHI7CisJCW1hc2tfYXR0ciA9IG1hc2s2X2F0dHI7CisJCWxlbiA9IDE2OworCX0gZWxzZSB7CisJCXJldHVybjsKKwl9CisJaWYgKCFhZGRyX2F0dHIgfHwgUlRBX1BBWUxPQUQoYWRkcl9hdHRyKSAhPSBsZW4pCisJCXJldHVybjsKKwlmcHJpbnRmKGYsICJcbiAgJXMgJXMiLCBuYW1lLCBydF9hZGRyX24yYShmYW1pbHksCisJCQkJCQkgIFJUQV9QQVlMT0FEKGFkZHJfYXR0ciksCisJCQkJCQkgIFJUQV9EQVRBKGFkZHJfYXR0ciksCisJCQkJCQkgIGIxLCBzaXplb2YoYjEpKSk7CisJaWYgKCFtYXNrX2F0dHIgfHwgUlRBX1BBWUxPQUQobWFza19hdHRyKSAhPSBsZW4pCisJCXJldHVybjsKKwliaXRzID0gX19tYXNrX2JpdHMoUlRBX0RBVEEobWFza19hdHRyKSwgbGVuKTsKKwlpZiAoYml0cyA8IDApCisJCWZwcmludGYoZiwgIi8lcyIsIHJ0X2FkZHJfbjJhKGZhbWlseSwKKwkJCQkJICAgICAgUlRBX1BBWUxPQUQobWFza19hdHRyKSwKKwkJCQkJICAgICAgUlRBX0RBVEEobWFza19hdHRyKSwKKwkJCQkJICAgICAgYjEsIHNpemVvZihiMSkpKTsKKwllbHNlIGlmIChiaXRzIDwgbGVuICogOCkKKwkJZnByaW50ZihmLCAiLyVkIiwgYml0cyk7Cit9CisKK3N0YXRpYyB2b2lkIGZsb3dlcl9wcmludF9wb3J0KEZJTEUgKmYsIGNoYXIgKm5hbWUsIF9fdTggaXBfcHJvdG8sCisJCQkgICAgICBzdHJ1Y3QgcnRhdHRyICp0Y3BfYXR0ciwKKwkJCSAgICAgIHN0cnVjdCBydGF0dHIgKnVkcF9hdHRyKQoreworCXN0cnVjdCBydGF0dHIgKmF0dHI7CisKKwlpZiAoaXBfcHJvdG8gPT0gSVBQUk9UT19UQ1ApCisJCWF0dHIgPSB0Y3BfYXR0cjsKKwllbHNlIGlmIChpcF9wcm90byA9PSBJUFBST1RPX1VEUCkKKwkJYXR0ciA9IHVkcF9hdHRyOworCWVsc2UKKwkJcmV0dXJuOworCWlmICghYXR0cikKKwkJcmV0dXJuOworCWZwcmludGYoZiwgIlxuICAlcyAlZCIsIG5hbWUsIG50b2hzKHJ0YV9nZXRhdHRyX3UxNihhdHRyKSkpOworfQorCitzdGF0aWMgaW50IGZsb3dlcl9wcmludF9vcHQoc3RydWN0IGZpbHRlcl91dGlsICpxdSwgRklMRSAqZiwKKwkJCSAgICBzdHJ1Y3QgcnRhdHRyICpvcHQsIF9fdTMyIGhhbmRsZSkKK3sKKwlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfRkxPV0VSX01BWCArIDFdOworCV9fYmUxNiBldGhfdHlwZSA9IDA7CisJX191OCBpcF9wcm90byA9IDB4ZmY7CisKKwlpZiAoIW9wdCkKKwkJcmV0dXJuIDA7CisKKwlwYXJzZV9ydGF0dHJfbmVzdGVkKHRiLCBUQ0FfRkxPV0VSX01BWCwgb3B0KTsKKworCWlmIChoYW5kbGUpCisJCWZwcmludGYoZiwgImhhbmRsZSAweCV4ICIsIGhhbmRsZSk7CisKKwlpZiAodGJbVENBX0ZMT1dFUl9DTEFTU0lEXSkgeworCQlTUFJJTlRfQlVGKGIxKTsKKwkJZnByaW50ZihmLCAiY2xhc3NpZCAlcyAiLAorCQkJc3ByaW50X3RjX2NsYXNzaWQocnRhX2dldGF0dHJfdTMyKHRiW1RDQV9GTE9XRVJfQ0xBU1NJRF0pLAorCQkJCQkgIGIxKSk7CisJfQorCisJaWYgKHRiW1RDQV9GTE9XRVJfSU5ERVZdKSB7CisJCXN0cnVjdCBydGF0dHIgKmF0dHIgPSB0YltUQ0FfRkxPV0VSX0lOREVWXTsKKworCQlmcHJpbnRmKGYsICJcbiAgaW5kZXYgJXMiLCBydGFfZ2V0YXR0cl9zdHIoYXR0cikpOworCX0KKworCWZsb3dlcl9wcmludF9ldGhfYWRkcihmLCAiZHN0X21hYyIsIHRiW1RDQV9GTE9XRVJfS0VZX0VUSF9EU1RdLAorCQkJICAgICAgdGJbVENBX0ZMT1dFUl9LRVlfRVRIX0RTVF9NQVNLXSk7CisJZmxvd2VyX3ByaW50X2V0aF9hZGRyKGYsICJzcmNfbWFjIiwgdGJbVENBX0ZMT1dFUl9LRVlfRVRIX1NSQ10sCisJCQkgICAgICB0YltUQ0FfRkxPV0VSX0tFWV9FVEhfU1JDX01BU0tdKTsKKworCWZsb3dlcl9wcmludF9ldGhfdHlwZShmLCAmZXRoX3R5cGUsIHRiW1RDQV9GTE9XRVJfS0VZX0VUSF9UWVBFXSk7CisJZmxvd2VyX3ByaW50X2lwX3Byb3RvKGYsICZpcF9wcm90bywgdGJbVENBX0ZMT1dFUl9LRVlfSVBfUFJPVE9dKTsKKworCWZsb3dlcl9wcmludF9pcF9hZGRyKGYsICJkc3RfaXAiLCBldGhfdHlwZSwKKwkJCSAgICAgdGJbVENBX0ZMT1dFUl9LRVlfSVBWNF9EU1RdLAorCQkJICAgICB0YltUQ0FfRkxPV0VSX0tFWV9JUFY0X0RTVF9NQVNLXSwKKwkJCSAgICAgdGJbVENBX0ZMT1dFUl9LRVlfSVBWNl9EU1RdLAorCQkJICAgICB0YltUQ0FfRkxPV0VSX0tFWV9JUFY2X0RTVF9NQVNLXSk7CisKKwlmbG93ZXJfcHJpbnRfaXBfYWRkcihmLCAic3JjX2lwIiwgZXRoX3R5cGUsCisJCQkgICAgIHRiW1RDQV9GTE9XRVJfS0VZX0lQVjRfU1JDXSwKKwkJCSAgICAgdGJbVENBX0ZMT1dFUl9LRVlfSVBWNF9TUkNfTUFTS10sCisJCQkgICAgIHRiW1RDQV9GTE9XRVJfS0VZX0lQVjZfU1JDXSwKKwkJCSAgICAgdGJbVENBX0ZMT1dFUl9LRVlfSVBWNl9TUkNfTUFTS10pOworCisJZmxvd2VyX3ByaW50X3BvcnQoZiwgImRzdF9wb3J0IiwgaXBfcHJvdG8sCisJCQkgIHRiW1RDQV9GTE9XRVJfS0VZX1RDUF9EU1RdLAorCQkJICB0YltUQ0FfRkxPV0VSX0tFWV9VRFBfRFNUXSk7CisKKwlmbG93ZXJfcHJpbnRfcG9ydChmLCAic3JjX3BvcnQiLCBpcF9wcm90bywKKwkJCSAgdGJbVENBX0ZMT1dFUl9LRVlfVENQX1NSQ10sCisJCQkgIHRiW1RDQV9GTE9XRVJfS0VZX1VEUF9TUkNdKTsKKworCWlmICh0YltUQ0FfRkxPV0VSX0FDVF0pIHsKKwkJdGNfcHJpbnRfYWN0aW9uKGYsIHRiW1RDQV9GTE9XRVJfQUNUXSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBmaWx0ZXJfdXRpbCBmbG93ZXJfZmlsdGVyX3V0aWwgPSB7CisJLmlkID0gImZsb3dlciIsCisJLnBhcnNlX2ZvcHQgPSBmbG93ZXJfcGFyc2Vfb3B0LAorCS5wcmludF9mb3B0ID0gZmxvd2VyX3ByaW50X29wdCwKK307CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy9mX2Z3LmMgYi9pcHJvdXRlMi90Yy9mX2Z3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY1ZjQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL2ZfZncuYwpAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIGZfZncuYwkJRlcgZmlsdGVyLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+IC8qIElGTkFNU0laICovCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0Y191dGlsLmgiCisKK3N0YXRpYyB2b2lkIGV4cGxhaW4odm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAuLi4gZncgWyBjbGFzc2lkIENMQVNTSUQgXSBbIGFjdGlvbiBBQ1RJT05fU1BFQyBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBBQ1RJT05fU1BFQyA6PSAuLi4gbG9vayBhdCBpbmRpdmlkdWFsIGFjdGlvbnNcbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgIENMQVNTSUQgOj0gWDpZXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuTk9URTogQ0xBU1NJRCBpcyBwYXJzZWQgYXMgaGV4YWRlY2ltYWwgaW5wdXQuXG4iKTsKK30KKworc3RhdGljIGludCBmd19wYXJzZV9vcHQoc3RydWN0IGZpbHRlcl91dGlsICpxdSwgY2hhciAqaGFuZGxlLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlzdHJ1Y3QgdGNfcG9saWNlIHRwOworCXN0cnVjdCB0Y21zZyAqdCA9IE5MTVNHX0RBVEEobik7CisJc3RydWN0IHJ0YXR0ciAqdGFpbDsKKwlfX3UzMiBtYXNrID0gMDsKKwlpbnQgbWFza19zZXQgPSAwOworCisJbWVtc2V0KCZ0cCwgMCwgc2l6ZW9mKHRwKSk7CisKKwlpZiAoaGFuZGxlKSB7CisJCWNoYXIgKnNsYXNoOworCQlpZiAoKHNsYXNoID0gc3RyY2hyKGhhbmRsZSwgJy8nKSkgIT0gTlVMTCkKKwkJCSpzbGFzaCA9ICdcMCc7CisJCWlmIChnZXRfdTMyKCZ0LT50Y21faGFuZGxlLCBoYW5kbGUsIDApKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJoYW5kbGVcIlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKHNsYXNoKSB7CisJCQlpZiAoZ2V0X3UzMigmbWFzaywgc2xhc2grMSwgMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJoYW5kbGVcIiBtYXNrXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQltYXNrX3NldCA9IDE7CisJCX0KKwl9CisKKwlpZiAoYXJnYyA9PSAwKQorCQlyZXR1cm4gMDsKKworCXRhaWwgPSBOTE1TR19UQUlMKG4pOworCWFkZGF0dHJfbChuLCA0MDk2LCBUQ0FfT1BUSU9OUywgTlVMTCwgMCk7CisKKwlpZiAobWFza19zZXQpCisJCWFkZGF0dHIzMihuLCBNQVhfTVNHLCBUQ0FfRldfTUFTSywgbWFzayk7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJjbGFzc2lkIikgPT0gMCB8fAorCQkgICAgbWF0Y2hlcygqYXJndiwgImZsb3dpZCIpID09IDApIHsKKwkJCXVuc2lnbmVkIGhhbmRsZTsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3RjX2NsYXNzaWQoJmhhbmRsZSwgKmFyZ3YpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwiY2xhc3NpZFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlhZGRhdHRyX2wobiwgNDA5NiwgVENBX0ZXX0NMQVNTSUQsICZoYW5kbGUsIDQpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJwb2xpY2UiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHBhcnNlX3BvbGljZSgmYXJnYywgJmFyZ3YsIFRDQV9GV19QT0xJQ0UsIG4pKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwicG9saWNlXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJhY3Rpb24iKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHBhcnNlX2FjdGlvbigmYXJnYywgJmFyZ3YsIFRDQV9GV19BQ1QsIG4pKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIGZ3IFwiYWN0aW9uXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImluZGV2IikgPT0gMCkgeworCQkJY2hhciBkW0lGTkFNU0laKzFdOworCQkJbWVtc2V0KGQsIDAsIHNpemVvZiAoZCkpOworCQkJYXJnYy0tOworCQkJYXJndisrOworCQkJaWYgKGFyZ2MgPCAxKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIGluZGV2XG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlzdHJuY3B5KGQsICphcmd2LCBzaXplb2YgKGQpIC0gMSk7CisJCQlhZGRhdHRyX2wobiwgTUFYX01TRywgVENBX0ZXX0lOREVWLCBkLCBzdHJsZW4oZCkgKyAxKTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJXaGF0IGlzIFwiJXNcIj9cbiIsICphcmd2KTsKKwkJCWV4cGxhaW4oKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisJdGFpbC0+cnRhX2xlbiA9ICh2b2lkICopIE5MTVNHX1RBSUwobikgLSAodm9pZCAqKSB0YWlsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZ3X3ByaW50X29wdChzdHJ1Y3QgZmlsdGVyX3V0aWwgKnF1LCBGSUxFICpmLCBzdHJ1Y3QgcnRhdHRyICpvcHQsIF9fdTMyIGhhbmRsZSkKK3sKKwlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfRldfTUFYKzFdOworCisJaWYgKG9wdCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXBhcnNlX3J0YXR0cl9uZXN0ZWQodGIsIFRDQV9GV19NQVgsIG9wdCk7CisKKwlpZiAoaGFuZGxlIHx8IHRiW1RDQV9GV19NQVNLXSkgeworCQlfX3UzMiBtYXJrID0gMCwgbWFzayA9IDA7CisJCWlmKGhhbmRsZSkKKwkJCW1hcmsgPSBoYW5kbGU7CisJCWlmKHRiW1RDQV9GV19NQVNLXSAmJgorCQkgICAgKG1hc2sgPSBydGFfZ2V0YXR0cl91MzIodGJbVENBX0ZXX01BU0tdKSkgIT0gMHhGRkZGRkZGRikKKwkJCWZwcmludGYoZiwgImhhbmRsZSAweCV4LzB4JXggIiwgbWFyaywgbWFzayk7CisJCWVsc2UKKwkJCWZwcmludGYoZiwgImhhbmRsZSAweCV4ICIsIGhhbmRsZSk7CisJfQorCisJaWYgKHRiW1RDQV9GV19DTEFTU0lEXSkgeworCQlTUFJJTlRfQlVGKGIxKTsKKwkJZnByaW50ZihmLCAiY2xhc3NpZCAlcyAiLCBzcHJpbnRfdGNfY2xhc3NpZChydGFfZ2V0YXR0cl91MzIodGJbVENBX0ZXX0NMQVNTSURdKSwgYjEpKTsKKwl9CisKKwlpZiAodGJbVENBX0ZXX1BPTElDRV0pCisJCXRjX3ByaW50X3BvbGljZShmLCB0YltUQ0FfRldfUE9MSUNFXSk7CisJaWYgKHRiW1RDQV9GV19JTkRFVl0pIHsKKwkJc3RydWN0IHJ0YXR0ciAqaWRldiA9IHRiW1RDQV9GV19JTkRFVl07CisJCWZwcmludGYoZiwgImlucHV0IGRldiAlcyAiLHJ0YV9nZXRhdHRyX3N0cihpZGV2KSk7CisJfQorCisJaWYgKHRiW1RDQV9GV19BQ1RdKSB7CisJCWZwcmludGYoZiwgIlxuIik7CisJCXRjX3ByaW50X2FjdGlvbihmLCB0YltUQ0FfRldfQUNUXSk7CisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3QgZmlsdGVyX3V0aWwgZndfZmlsdGVyX3V0aWwgPSB7CisJLmlkID0gImZ3IiwKKwkucGFyc2VfZm9wdCA9IGZ3X3BhcnNlX29wdCwKKwkucHJpbnRfZm9wdCA9IGZ3X3ByaW50X29wdCwKK307CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy9mX3JvdXRlLmMgYi9pcHJvdXRlMi90Yy9mX3JvdXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU5MDMyYwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL2Zfcm91dGUuYwpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIGZfcm91dGUuYwkJUk9VVEUgZmlsdGVyLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJydF9uYW1lcy5oIgorI2luY2x1ZGUgInRjX2NvbW1vbi5oIgorI2luY2x1ZGUgInRjX3V0aWwuaCIKKworc3RhdGljIHZvaWQgZXhwbGFpbih2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IC4uLiByb3V0ZSBbIGZyb20gUkVBTE0gfCBmcm9taWYgVEFHIF0gWyB0byBSRUFMTSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBbIGNsYXNzaWQgQ0xBU1NJRCBdIFsgYWN0aW9uIEFDVElPTl9TUEVDIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgIEFDVElPTl9TUEVDIDo9IC4uLiBsb29rIGF0IGluZGl2aWR1YWwgYWN0aW9uc1xuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgQ0xBU1NJRCA6PSBYOllcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXG5OT1RFOiBDTEFTU0lEIGlzIHBhcnNlZCBhcyBoZXhhZGVjaW1hbCBpbnB1dC5cbiIpOworfQorCitzdGF0aWMgaW50IHJvdXRlX3BhcnNlX29wdChzdHJ1Y3QgZmlsdGVyX3V0aWwgKnF1LCBjaGFyICpoYW5kbGUsIGludCBhcmdjLCBjaGFyICoqYXJndiwgc3RydWN0IG5sbXNnaGRyICpuKQoreworCXN0cnVjdCB0Y19wb2xpY2UgdHA7CisJc3RydWN0IHRjbXNnICp0ID0gTkxNU0dfREFUQShuKTsKKwlzdHJ1Y3QgcnRhdHRyICp0YWlsOworCV9fdTMyIGZoID0gMHhGRkZGODAwMDsKKwlfX3UzMiBvcmRlciA9IDA7CisKKwltZW1zZXQoJnRwLCAwLCBzaXplb2YodHApKTsKKworCWlmIChoYW5kbGUpIHsKKwkJaWYgKGdldF91MzIoJnQtPnRjbV9oYW5kbGUsIGhhbmRsZSwgMCkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImhhbmRsZVwiXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWlmIChhcmdjID09IDApCisJCXJldHVybiAwOworCisJdGFpbCA9IE5MTVNHX1RBSUwobik7CisJYWRkYXR0cl9sKG4sIDQwOTYsIFRDQV9PUFRJT05TLCBOVUxMLCAwKTsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAobWF0Y2hlcygqYXJndiwgInRvIikgPT0gMCkgeworCQkJX191MzIgaWQ7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHJ0bmxfcnRyZWFsbV9hMm4oJmlkLCAqYXJndikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJ0b1wiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlhZGRhdHRyX2wobiwgNDA5NiwgVENBX1JPVVRFNF9UTywgJmlkLCA0KTsKKwkJCWZoICY9IH4weDgwRkY7CisJCQlmaCB8PSBpZCYweEZGOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJmcm9tIikgPT0gMCkgeworCQkJX191MzIgaWQ7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHJ0bmxfcnRyZWFsbV9hMm4oJmlkLCAqYXJndikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJmcm9tXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWFkZGF0dHJfbChuLCA0MDk2LCBUQ0FfUk9VVEU0X0ZST00sICZpZCwgNCk7CisJCQlmaCAmPSAweEZGRkY7CisJCQlmaCB8PSBpZDw8MTY7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImZyb21pZiIpID09IDApIHsKKwkJCV9fdTMyIGlkOworCQkJTkVYVF9BUkcoKTsKKwkJCWxsX2luaXRfbWFwKCZydGgpOworCQkJaWYgKChpZD1sbF9uYW1lX3RvX2luZGV4KCphcmd2KSkgPD0gMCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImZyb21pZlwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlhZGRhdHRyX2wobiwgNDA5NiwgVENBX1JPVVRFNF9JSUYsICZpZCwgNCk7CisJCQlmaCAmPSAweEZGRkY7CisJCQlmaCB8PSAoMHg4MDAwfGlkKTw8MTY7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImNsYXNzaWQiKSA9PSAwIHx8CisJCQkgICBzdHJjbXAoKmFyZ3YsICJmbG93aWQiKSA9PSAwKSB7CisJCQl1bnNpZ25lZCBoYW5kbGU7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF90Y19jbGFzc2lkKCZoYW5kbGUsICphcmd2KSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImNsYXNzaWRcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYWRkYXR0cl9sKG4sIDQwOTYsIFRDQV9ST1VURTRfQ0xBU1NJRCwgJmhhbmRsZSwgNCk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInBvbGljZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocGFyc2VfcG9saWNlKCZhcmdjLCAmYXJndiwgVENBX1JPVVRFNF9QT0xJQ0UsIG4pKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwicG9saWNlXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJhY3Rpb24iKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHBhcnNlX2FjdGlvbigmYXJnYywgJmFyZ3YsIFRDQV9ST1VURTRfQUNULCBuKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImFjdGlvblwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAib3JkZXIiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJm9yZGVyLCAqYXJndiwgMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJvcmRlclwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaGVscCIpID09IDApIHsKKwkJCWV4cGxhaW4oKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiV2hhdCBpcyBcIiVzXCI/XG4iLCAqYXJndik7CisJCQlleHBsYWluKCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCXRhaWwtPnJ0YV9sZW4gPSAodm9pZCAqKSBOTE1TR19UQUlMKG4pIC0gKHZvaWQgKikgdGFpbDsKKwlpZiAob3JkZXIpIHsKKwkJZmggJj0gfjB4N0YwMDsKKwkJZmggfD0gKG9yZGVyPDw4KSYweDdGMDA7CisJfQorCWlmICghdC0+dGNtX2hhbmRsZSkKKwkJdC0+dGNtX2hhbmRsZSA9IGZoOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJvdXRlX3ByaW50X29wdChzdHJ1Y3QgZmlsdGVyX3V0aWwgKnF1LCBGSUxFICpmLCBzdHJ1Y3QgcnRhdHRyICpvcHQsIF9fdTMyIGhhbmRsZSkKK3sKKwlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfUk9VVEU0X01BWCsxXTsKKwlTUFJJTlRfQlVGKGIxKTsKKworCWlmIChvcHQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlwYXJzZV9ydGF0dHJfbmVzdGVkKHRiLCBUQ0FfUk9VVEU0X01BWCwgb3B0KTsKKworCWlmIChoYW5kbGUpCisJCWZwcmludGYoZiwgImZoIDB4JTA4eCAiLCBoYW5kbGUpOworCWlmIChoYW5kbGUmMHg3RjAwKQorCQlmcHJpbnRmKGYsICJvcmRlciAlZCAiLCAoaGFuZGxlPj44KSYweDdGKTsKKworCWlmICh0YltUQ0FfUk9VVEU0X0NMQVNTSURdKSB7CisJCVNQUklOVF9CVUYoYjEpOworCQlmcHJpbnRmKGYsICJmbG93aWQgJXMgIiwgc3ByaW50X3RjX2NsYXNzaWQocnRhX2dldGF0dHJfdTMyKHRiW1RDQV9ST1VURTRfQ0xBU1NJRF0pLCBiMSkpOworCX0KKwlpZiAodGJbVENBX1JPVVRFNF9UT10pCisJCWZwcmludGYoZiwgInRvICVzICIsIHJ0bmxfcnRyZWFsbV9uMmEocnRhX2dldGF0dHJfdTMyKHRiW1RDQV9ST1VURTRfVE9dKSwgYjEsIHNpemVvZihiMSkpKTsKKwlpZiAodGJbVENBX1JPVVRFNF9GUk9NXSkKKwkJZnByaW50ZihmLCAiZnJvbSAlcyAiLCBydG5sX3J0cmVhbG1fbjJhKHJ0YV9nZXRhdHRyX3UzMih0YltUQ0FfUk9VVEU0X0ZST01dKSwgYjEsIHNpemVvZihiMSkpKTsKKwlpZiAodGJbVENBX1JPVVRFNF9JSUZdKQorCQlmcHJpbnRmKGYsICJmcm9taWYgJXMiLCBsbF9pbmRleF90b19uYW1lKCooaW50KilSVEFfREFUQSh0YltUQ0FfUk9VVEU0X0lJRl0pKSk7CisJaWYgKHRiW1RDQV9ST1VURTRfUE9MSUNFXSkKKwkJdGNfcHJpbnRfcG9saWNlKGYsIHRiW1RDQV9ST1VURTRfUE9MSUNFXSk7CisJaWYgKHRiW1RDQV9ST1VURTRfQUNUXSkKKwkJdGNfcHJpbnRfYWN0aW9uKGYsIHRiW1RDQV9ST1VURTRfQUNUXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBmaWx0ZXJfdXRpbCByb3V0ZV9maWx0ZXJfdXRpbCA9IHsKKwkuaWQgPSAicm91dGUiLAorCS5wYXJzZV9mb3B0ID0gcm91dGVfcGFyc2Vfb3B0LAorCS5wcmludF9mb3B0ID0gcm91dGVfcHJpbnRfb3B0LAorfTsKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RjL2ZfcnN2cC5jIGIvaXByb3V0ZTIvdGMvZl9yc3ZwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZlOWIxNQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL2ZfcnN2cC5jCkBAIC0wLDAgKzEsNDE0IEBACisvKgorICogcV9yc3ZwLmMJCVJTVlAgZmlsdGVyLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInRjX3V0aWwuaCIKKworc3RhdGljIHZvaWQgZXhwbGFpbih2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IC4uLiByc3ZwIGlwcHJvdG8gUFJPVE9DT0wgc2Vzc2lvbiBEU1RbL1BPUlQgfCBHUEkgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgWyBzZW5kZXIgU1JDWy9QT1JUIHwgR1BJIF0gXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgWyBjbGFzc2lkIENMQVNTSUQgXSBbIGFjdGlvbiBBQ1RJT05fU1BFQyBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBbIHR1bm5lbGlkIElEIF0gWyB0dW5uZWwgSUQgc2tpcCBOVU1CRVIgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICJXaGVyZTogR1BJIDo9IHsgZmxvd2xhYmVsIE5VTUJFUiB8IHNwaS9haCBTUEkgfCBzcGkvZXNwIFNQSSB8XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICB1ezh8MTZ8MzJ9IE5VTUJFUiBtYXNrIE1BU0sgYXQgT0ZGU0VUfVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgQUNUSU9OX1NQRUMgOj0gLi4uIGxvb2sgYXQgaW5kaXZpZHVhbCBhY3Rpb25zXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBGSUxURVJJRCA6PSBYOllcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXG5OT1RFOiBDTEFTU0lEIGlzIHBhcnNlZCBhcyBoZXhhZGVjaW1hbCBpbnB1dC5cbiIpOworfQorCitzdGF0aWMgaW50IGdldF9hZGRyX2FuZF9waShpbnQgKmFyZ2NfcCwgY2hhciAqKiphcmd2X3AsIGluZXRfcHJlZml4ICogYWRkciwKKwkJICAgIHN0cnVjdCB0Y19yc3ZwX3BpbmZvICpwaW5mbywgaW50IGRpciwgaW50IGZhbWlseSkKK3sKKwlpbnQgYXJnYyA9ICphcmdjX3A7CisJY2hhciAqKmFyZ3YgPSAqYXJndl9wOworCWNoYXIgKnAgPSBzdHJjaHIoKmFyZ3YsICcvJyk7CisJc3RydWN0IHRjX3JzdnBfZ3BpICpwaSA9IGRpciA/ICZwaW5mby0+ZHBpIDogJnBpbmZvLT5zcGk7CisKKwlpZiAocCkgeworCQlfX3UxNiB0bXA7CisKKwkJaWYgKGdldF91MTYoJnRtcCwgcCsxLCAwKSkKKwkJCXJldHVybiAtMTsKKworCQlpZiAoZGlyID09IDApIHsKKwkJCS8qIFNvdXJjZSBwb3J0OiB1MTYgYXQgb2Zmc2V0IDAgKi8KKwkJCXBpLT5rZXkgPSBodG9ubCgoKF9fdTMyKXRtcCk8PDE2KTsKKwkJCXBpLT5tYXNrID0gaHRvbmwoMHhGRkZGMDAwMCk7CisJCX0gZWxzZSB7CisJCQkvKiBEZXN0aW5hdGlvbiBwb3J0OiB1MTYgYXQgb2Zmc2V0IDIgKi8KKwkJCXBpLT5rZXkgPSBodG9ubCgoKF9fdTMyKXRtcCkpOworCQkJcGktPm1hc2sgPSBodG9ubCgweDAwMDBGRkZGKTsKKwkJfQorCQlwaS0+b2Zmc2V0ID0gMDsKKwkJKnAgPSAwOworCX0KKwlpZiAoZ2V0X2FkZHJfMShhZGRyLCAqYXJndiwgZmFtaWx5KSkKKwkJcmV0dXJuIC0xOworCWlmIChwKQorCQkqcCA9ICcvJzsKKworCWFyZ2MtLTsgYXJndisrOworCisJaWYgKHBpLT5tYXNrIHx8IGFyZ2MgPD0gMCkKKwkJZ290byBkb25lOworCisJaWYgKHN0cmNtcCgqYXJndiwgInNwaS9haCIpID09IDAgfHwKKwkgICAgc3RyY21wKCphcmd2LCAiZ3BpL2FoIikgPT0gMCkgeworCQlfX3UzMiBncGk7CisJCU5FWFRfQVJHKCk7CisJCWlmIChnZXRfdTMyKCZncGksICphcmd2LCAwKSkKKwkJCXJldHVybiAtMTsKKwkJcGktPm1hc2sgPSBodG9ubCgweEZGRkZGRkZGKTsKKwkJcGktPmtleSA9IGh0b25sKGdwaSk7CisJCXBpLT5vZmZzZXQgPSA0OworCQlpZiAocGluZm8tPnByb3RvY29sID09IDApCisJCQlwaW5mby0+cHJvdG9jb2wgPSBJUFBST1RPX0FIOworCQlhcmdjLS07IGFyZ3YrKzsKKwl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInNwaS9lc3AiKSA9PSAwIHx8CisJCSAgIHN0cmNtcCgqYXJndiwgImdwaS9lc3AiKSA9PSAwKSB7CisJCV9fdTMyIGdwaTsKKwkJTkVYVF9BUkcoKTsKKwkJaWYgKGdldF91MzIoJmdwaSwgKmFyZ3YsIDApKQorCQkJcmV0dXJuIC0xOworCQlwaS0+bWFzayA9IGh0b25sKDB4RkZGRkZGRkYpOworCQlwaS0+a2V5ID0gaHRvbmwoZ3BpKTsKKwkJcGktPm9mZnNldCA9IDA7CisJCWlmIChwaW5mby0+cHJvdG9jb2wgPT0gMCkKKwkJCXBpbmZvLT5wcm90b2NvbCA9IElQUFJPVE9fRVNQOworCQlhcmdjLS07IGFyZ3YrKzsKKwl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImZsb3dsYWJlbCIpID09IDApIHsKKwkJX191MzIgZmxhYmVsOworCQlORVhUX0FSRygpOworCQlpZiAoZ2V0X3UzMigmZmxhYmVsLCAqYXJndiwgMCkpCisJCQlyZXR1cm4gLTE7CisJCWlmIChmYW1pbHkgIT0gQUZfSU5FVDYpCisJCQlyZXR1cm4gLTE7CisJCXBpLT5tYXNrID0gaHRvbmwoMHgwMDBGRkZGRik7CisJCXBpLT5rZXkgPSBodG9ubChmbGFiZWwpICYgcGktPm1hc2s7CisJCXBpLT5vZmZzZXQgPSAtNDA7CisJCWFyZ2MtLTsgYXJndisrOworCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAidTMyIikgPT0gMCB8fAorCQkgICBzdHJjbXAoKmFyZ3YsICJ1MTYiKSA9PSAwIHx8CisJCSAgIHN0cmNtcCgqYXJndiwgInU4IikgPT0gMCkgeworCQlpbnQgc3ogPSAxOworCQlfX3UzMiB0bXA7CisJCV9fdTMyIG1hc2sgPSAweGZmOworCQlpZiAoc3RyY21wKCphcmd2LCAidTMyIikgPT0gMCkgeworCQkJc3ogPSA0OworCQkJbWFzayA9IDB4ZmZmZjsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJ1MTYiKSA9PSAwKSB7CisJCQltYXNrID0gMHhmZmZmZmZmZjsKKwkJCXN6ID0gMjsKKwkJfQorCQlORVhUX0FSRygpOworCQlpZiAoZ2V0X3UzMigmdG1wLCAqYXJndiwgMCkpCisJCQlyZXR1cm4gLTE7CisJCWFyZ2MtLTsgYXJndisrOworCQlpZiAoc3RyY21wKCphcmd2LCAibWFzayIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmbWFzaywgKmFyZ3YsIDE2KSkKKwkJCQlyZXR1cm4gLTE7CisJCQlhcmdjLS07IGFyZ3YrKzsKKwkJfQorCQlpZiAoc3RyY21wKCphcmd2LCAiYXQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9pbnRlZ2VyKCZwaS0+b2Zmc2V0LCAqYXJndiwgMCkpCisJCQkJcmV0dXJuIC0xOworCQkJYXJnYy0tOyBhcmd2Kys7CisJCX0KKwkJaWYgKHN6ID09IDEpIHsKKwkJCWlmICgocGktPm9mZnNldCAmIDMpID09IDApIHsKKwkJCQltYXNrIDw8PSAyNDsKKwkJCQl0bXAgPDw9IDI0OworCQkJfSBlbHNlIGlmICgocGktPm9mZnNldCAmIDMpID09IDEpIHsKKwkJCQltYXNrIDw8PSAxNjsKKwkJCQl0bXAgPDw9IDE2OworCQkJfSBlbHNlIGlmICgocGktPm9mZnNldCAmIDMpID09IDMpIHsKKwkJCQltYXNrIDw8PSA4OworCQkJCXRtcCA8PD0gODsKKwkJCX0KKwkJfSBlbHNlIGlmIChzeiA9PSAyKSB7CisJCQlpZiAoKHBpLT5vZmZzZXQgJiAzKSA9PSAwKSB7CisJCQkJbWFzayA8PD0gMTY7CisJCQkJdG1wIDw8PSAxNjsKKwkJCX0KKwkJfQorCQlwaS0+b2Zmc2V0ICY9IH4zOworCQlwaS0+bWFzayA9IGh0b25sKG1hc2spOworCQlwaS0+a2V5ID0gaHRvbmwodG1wKSAmIHBpLT5tYXNrOworCX0KKworZG9uZToKKwkqYXJnY19wID0gYXJnYzsKKwkqYXJndl9wID0gYXJndjsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHJzdnBfcGFyc2Vfb3B0KHN0cnVjdCBmaWx0ZXJfdXRpbCAqcXUsIGNoYXIgKmhhbmRsZSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJaW50IGZhbWlseSA9IHN0cmNtcChxdS0+aWQsICJyc3ZwIikgPT0gMCA/IEFGX0lORVQgOiBBRl9JTkVUNjsKKwlzdHJ1Y3QgdGNfcnN2cF9waW5mbyBwaW5mbzsKKwlzdHJ1Y3QgdGNfcG9saWNlIHRwOworCXN0cnVjdCB0Y21zZyAqdCA9IE5MTVNHX0RBVEEobik7CisJaW50IHBpbmZvX29rID0gMDsKKwlzdHJ1Y3QgcnRhdHRyICp0YWlsOworCisJbWVtc2V0KCZwaW5mbywgMCwgc2l6ZW9mKHBpbmZvKSk7CisJbWVtc2V0KCZ0cCwgMCwgc2l6ZW9mKHRwKSk7CisKKwlpZiAoaGFuZGxlKSB7CisJCWlmIChnZXRfdTMyKCZ0LT50Y21faGFuZGxlLCBoYW5kbGUsIDApKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJoYW5kbGVcIlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlpZiAoYXJnYyA9PSAwKQorCQlyZXR1cm4gMDsKKworCXRhaWwgPSBOTE1TR19UQUlMKG4pOworCWFkZGF0dHJfbChuLCA0MDk2LCBUQ0FfT1BUSU9OUywgTlVMTCwgMCk7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJzZXNzaW9uIikgPT0gMCkgeworCQkJaW5ldF9wcmVmaXggYWRkcjsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X2FkZHJfYW5kX3BpKCZhcmdjLCAmYXJndiwgJmFkZHIsICZwaW5mbywgMSwgZmFtaWx5KSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcInNlc3Npb25cIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYWRkYXR0cl9sKG4sIDQwOTYsIFRDQV9SU1ZQX0RTVCwgJmFkZHIuZGF0YSwgYWRkci5ieXRlbGVuKTsKKwkJCWlmIChwaW5mby5kcGkubWFzayB8fCBwaW5mby5wcm90b2NvbCkKKwkJCQlwaW5mb19vaysrOworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInNlbmRlciIpID09IDAgfHwKKwkJCSAgIG1hdGNoZXMoKmFyZ3YsICJmbG93c3BlYyIpID09IDApIHsKKwkJCWluZXRfcHJlZml4IGFkZHI7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9hZGRyX2FuZF9waSgmYXJnYywgJmFyZ3YsICZhZGRyLCAmcGluZm8sIDAsIGZhbWlseSkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJzZW5kZXJcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYWRkYXR0cl9sKG4sIDQwOTYsIFRDQV9SU1ZQX1NSQywgJmFkZHIuZGF0YSwgYWRkci5ieXRlbGVuKTsKKwkJCWlmIChwaW5mby5zcGkubWFzayB8fCBwaW5mby5wcm90b2NvbCkKKwkJCQlwaW5mb19vaysrOworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygiaXBwcm90byIsICphcmd2KSA9PSAwKSB7CisJCQlpbnQgbnVtOworCQkJTkVYVF9BUkcoKTsKKwkJCW51bSA9IGluZXRfcHJvdG9fYTJuKCphcmd2KTsKKwkJCWlmIChudW0gPCAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwiaXBwcm90b1wiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwaW5mby5wcm90b2NvbCA9IG51bTsKKwkJCXBpbmZvX29rKys7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImNsYXNzaWQiKSA9PSAwIHx8CisJCQkgICBzdHJjbXAoKmFyZ3YsICJmbG93aWQiKSA9PSAwKSB7CisJCQl1bnNpZ25lZCBoYW5kbGU7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF90Y19jbGFzc2lkKCZoYW5kbGUsICphcmd2KSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImNsYXNzaWRcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYWRkYXR0cl9sKG4sIDQwOTYsIFRDQV9SU1ZQX0NMQVNTSUQsICZoYW5kbGUsIDQpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInR1bm5lbGlkIikgPT0gMCkgeworCQkJdW5zaWduZWQgdGlkOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdW5zaWduZWQoJnRpZCwgKmFyZ3YsIDApKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwidHVubmVsaWRcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcGluZm8udHVubmVsaWQgPSB0aWQ7CisJCQlwaW5mb19vaysrOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInR1bm5lbCIpID09IDApIHsKKwkJCXVuc2lnbmVkIHRpZDsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3Vuc2lnbmVkKCZ0aWQsICphcmd2LCAwKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcInR1bm5lbFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlhZGRhdHRyX2wobiwgNDA5NiwgVENBX1JTVlBfQ0xBU1NJRCwgJnRpZCwgNCk7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHN0cmNtcCgqYXJndiwgInNraXAiKSA9PSAwKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCX0KKwkJCWlmIChnZXRfdW5zaWduZWQoJnRpZCwgKmFyZ3YsIDApKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwic2tpcFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwaW5mby50dW5uZWxoZHIgPSB0aWQ7CisJCQlwaW5mb19vaysrOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJhY3Rpb24iKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHBhcnNlX2FjdGlvbigmYXJnYywgJmFyZ3YsIFRDQV9SU1ZQX0FDVCwgbikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJhY3Rpb25cIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInBvbGljZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocGFyc2VfcG9saWNlKCZhcmdjLCAmYXJndiwgVENBX1JTVlBfUE9MSUNFLCBuKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcInBvbGljZVwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJXaGF0IGlzIFwiJXNcIj9cbiIsICphcmd2KTsKKwkJCWV4cGxhaW4oKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisKKwlpZiAocGluZm9fb2spCisJCWFkZGF0dHJfbChuLCA0MDk2LCBUQ0FfUlNWUF9QSU5GTywgJnBpbmZvLCBzaXplb2YocGluZm8pKTsKKwl0YWlsLT5ydGFfbGVuID0gKHZvaWQgKikgTkxNU0dfVEFJTChuKSAtICh2b2lkICopIHRhaWw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyICogc3ByaW50X3NwaShzdHJ1Y3QgdGNfcnN2cF9ncGkgKnBpLCBpbnQgZGlyLCBjaGFyICpidWYpCit7CisJaWYgKHBpLT5vZmZzZXQgPT0gMCkgeworCQlpZiAoZGlyICYmIHBpLT5tYXNrID09IGh0b25sKDB4RkZGRikpIHsKKwkJCXNucHJpbnRmKGJ1ZiwgU1BSSU5UX0JTSVpFLTEsICIvJWQiLCBodG9ubChwaS0+a2V5KSk7CisJCQlyZXR1cm4gYnVmOworCQl9CisJCWlmICghZGlyICYmIHBpLT5tYXNrID09IGh0b25sKDB4RkZGRjAwMDApKSB7CisJCQlzbnByaW50ZihidWYsIFNQUklOVF9CU0laRS0xLCAiLyVkIiwgaHRvbmwocGktPmtleSk+PjE2KTsKKwkJCXJldHVybiBidWY7CisJCX0KKwkJaWYgKHBpLT5tYXNrID09IGh0b25sKDB4RkZGRkZGRkYpKSB7CisJCQlzbnByaW50ZihidWYsIFNQUklOVF9CU0laRS0xLCAiIHNwaS9lc3AgMHglMDh4IiwgaHRvbmwocGktPmtleSkpOworCQkJcmV0dXJuIGJ1ZjsKKwkJfQorCX0gZWxzZSBpZiAocGktPm9mZnNldCA9PSA0ICYmIHBpLT5tYXNrID09IGh0b25sKDB4RkZGRkZGRkYpKSB7CisJCXNucHJpbnRmKGJ1ZiwgU1BSSU5UX0JTSVpFLTEsICIgc3BpL2FoIDB4JTA4eCIsIGh0b25sKHBpLT5rZXkpKTsKKwkJcmV0dXJuIGJ1ZjsKKwl9IGVsc2UgaWYgKHBpLT5vZmZzZXQgPT0gLTQwICYmIHBpLT5tYXNrID09IGh0b25sKDB4MDAwRkZGRkYpKSB7CisJCXNucHJpbnRmKGJ1ZiwgU1BSSU5UX0JTSVpFLTEsICIgZmxvd2xhYmVsIDB4JTA1eCIsIGh0b25sKHBpLT5rZXkpKTsKKwkJcmV0dXJuIGJ1ZjsKKwl9CisJc25wcmludGYoYnVmLCBTUFJJTlRfQlNJWkUtMSwgIiB1MzIgMHglMDh4IG1hc2sgJTA4eCBhdCAlZCIsCisJCSBodG9ubChwaS0+a2V5KSwgaHRvbmwocGktPm1hc2spLCBwaS0+b2Zmc2V0KTsKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgaW50IHJzdnBfcHJpbnRfb3B0KHN0cnVjdCBmaWx0ZXJfdXRpbCAqcXUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKm9wdCwgX191MzIgaGFuZGxlKQoreworCWludCBmYW1pbHkgPSBzdHJjbXAocXUtPmlkLCAicnN2cCIpID09IDAgPyBBRl9JTkVUIDogQUZfSU5FVDY7CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX1JTVlBfTUFYKzFdOworCXN0cnVjdCB0Y19yc3ZwX3BpbmZvICpwaW5mbyA9IE5VTEw7CisKKwlpZiAob3B0ID09IE5VTEwpCisJCXJldHVybiAwOworCisJcGFyc2VfcnRhdHRyX25lc3RlZCh0YiwgVENBX1JTVlBfTUFYLCBvcHQpOworCisJaWYgKGhhbmRsZSkKKwkJZnByaW50ZihmLCAiZmggMHglMDh4ICIsIGhhbmRsZSk7CisKKwlpZiAodGJbVENBX1JTVlBfUElORk9dKSB7CisJCWlmIChSVEFfUEFZTE9BRCh0YltUQ0FfUlNWUF9QSU5GT10pICA8IHNpemVvZigqcGluZm8pKQorCQkJcmV0dXJuIC0xOworCisJCXBpbmZvID0gUlRBX0RBVEEodGJbVENBX1JTVlBfUElORk9dKTsKKwl9CisKKwlpZiAodGJbVENBX1JTVlBfQ0xBU1NJRF0pIHsKKwkJU1BSSU5UX0JVRihiMSk7CisJCWlmICghcGluZm8gfHwgcGluZm8tPnR1bm5lbGhkciA9PSAwKQorCQkJZnByaW50ZihmLCAiZmxvd2lkICVzICIsIHNwcmludF90Y19jbGFzc2lkKHJ0YV9nZXRhdHRyX3UzMih0YltUQ0FfUlNWUF9DTEFTU0lEXSksIGIxKSk7CisJCWVsc2UKKwkJCWZwcmludGYoZiwgInR1bm5lbCAlZCBza2lwICVkICIsIHJ0YV9nZXRhdHRyX3UzMih0YltUQ0FfUlNWUF9DTEFTU0lEXSksIHBpbmZvLT50dW5uZWxoZHIpOworCX0gZWxzZSBpZiAocGluZm8gJiYgcGluZm8tPnR1bm5lbGhkcikKKwkJZnByaW50ZihmLCAidHVubmVsIFtCQURdIHNraXAgJWQgIiwgcGluZm8tPnR1bm5lbGhkcik7CisKKwlpZiAodGJbVENBX1JTVlBfRFNUXSkgeworCQljaGFyIGJ1ZlsxMjhdOworCQlmcHJpbnRmKGYsICJzZXNzaW9uICIpOworCQlpZiAoaW5ldF9udG9wKGZhbWlseSwgUlRBX0RBVEEodGJbVENBX1JTVlBfRFNUXSksIGJ1Ziwgc2l6ZW9mKGJ1ZikpID09IDApCisJCQlmcHJpbnRmKGYsICIgW0lOVkFMSUQgREFERFJdICIpOworCQllbHNlCisJCQlmcHJpbnRmKGYsICIlcyIsIGJ1Zik7CisJCWlmIChwaW5mbyAmJiBwaW5mby0+ZHBpLm1hc2spIHsKKwkJCVNQUklOVF9CVUYoYjIpOworCQkJZnByaW50ZihmLCAiJXMgIiwgc3ByaW50X3NwaSgmcGluZm8tPmRwaSwgMSwgYjIpKTsKKwkJfSBlbHNlCisJCQlmcHJpbnRmKGYsICIgIik7CisJfSBlbHNlIHsKKwkJaWYgKHBpbmZvICYmIHBpbmZvLT5kcGkubWFzaykgeworCQkJU1BSSU5UX0JVRihiMik7CisJCQlmcHJpbnRmKGYsICJzZXNzaW9uIFtOT05FXSVzICIsIHNwcmludF9zcGkoJnBpbmZvLT5kcGksIDEsIGIyKSk7CisJCX0gZWxzZQorCQkJZnByaW50ZihmLCAic2Vzc2lvbiBOT05FICIpOworCX0KKworCWlmIChwaW5mbyAmJiBwaW5mby0+cHJvdG9jb2wpIHsKKwkJU1BSSU5UX0JVRihiMSk7CisJCWZwcmludGYoZiwgImlwcHJvdG8gJXMgIiwgaW5ldF9wcm90b19uMmEocGluZm8tPnByb3RvY29sLCBiMSwgc2l6ZW9mKGIxKSkpOworCX0KKwlpZiAocGluZm8gJiYgcGluZm8tPnR1bm5lbGlkKQorCQlmcHJpbnRmKGYsICJ0dW5uZWxpZCAlZCAiLCBwaW5mby0+dHVubmVsaWQpOworCWlmICh0YltUQ0FfUlNWUF9TUkNdKSB7CisJCWNoYXIgYnVmWzEyOF07CisJCWZwcmludGYoZiwgInNlbmRlciAiKTsKKwkJaWYgKGluZXRfbnRvcChmYW1pbHksIFJUQV9EQVRBKHRiW1RDQV9SU1ZQX1NSQ10pLCBidWYsIHNpemVvZihidWYpKSA9PSAwKSB7CisJCQlmcHJpbnRmKGYsICJbQkFEXSIpOworCQl9IGVsc2UgeworCQkJZnByaW50ZihmLCAiICVzIiwgYnVmKTsKKwkJfQorCQlpZiAocGluZm8gJiYgcGluZm8tPnNwaS5tYXNrKSB7CisJCQlTUFJJTlRfQlVGKGIyKTsKKwkJCWZwcmludGYoZiwgIiVzICIsIHNwcmludF9zcGkoJnBpbmZvLT5zcGksIDAsIGIyKSk7CisJCX0gZWxzZQorCQkJZnByaW50ZihmLCAiICIpOworCX0gZWxzZSBpZiAocGluZm8gJiYgcGluZm8tPnNwaS5tYXNrKSB7CisJCVNQUklOVF9CVUYoYjIpOworCQlmcHJpbnRmKGYsICJzZW5kZXIgW05PTkVdJXMgIiwgc3ByaW50X3NwaSgmcGluZm8tPnNwaSwgMCwgYjIpKTsKKwl9CisKKwlpZiAodGJbVENBX1JTVlBfQUNUXSkgeworCQl0Y19wcmludF9hY3Rpb24oZiwgdGJbVENBX1JTVlBfQUNUXSk7CisJfQorCWlmICh0YltUQ0FfUlNWUF9QT0xJQ0VdKQorCQl0Y19wcmludF9wb2xpY2UoZiwgdGJbVENBX1JTVlBfUE9MSUNFXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBmaWx0ZXJfdXRpbCByc3ZwX2ZpbHRlcl91dGlsID0geworCS5pZCA9ICJyc3ZwIiwKKwkucGFyc2VfZm9wdCA9IHJzdnBfcGFyc2Vfb3B0LAorCS5wcmludF9mb3B0ID0gcnN2cF9wcmludF9vcHQsCit9OworCitzdHJ1Y3QgZmlsdGVyX3V0aWwgcnN2cDZfZmlsdGVyX3V0aWwgPSB7CisJLmlkID0gInJzdnA2IiwKKwkucGFyc2VfZm9wdCA9IHJzdnBfcGFyc2Vfb3B0LAorCS5wcmludF9mb3B0ID0gcnN2cF9wcmludF9vcHQsCit9OwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvZl90Y2luZGV4LmMgYi9pcHJvdXRlMi90Yy9mX3RjaW5kZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTg0N2M4Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGMvZl90Y2luZGV4LmMKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBmX3RjaW5kZXguYwkJVHJhZmZpYyBjb250cm9sIGluZGV4IGZpbHRlcgorICoKKyAqIFdyaXR0ZW4gMTk5OCwxOTk5IGJ5IFdlcm5lciBBbG1lc2JlcmdlcgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0Y191dGlsLmgiCisKK3N0YXRpYyB2b2lkIGV4cGxhaW4odm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwiIFVzYWdlOiAuLi4gdGNpbmRleCBbIGhhc2ggU0laRSBdIFsgbWFzayBNQVNLIF0iCisJICAgICIgWyBzaGlmdCBTSElGVCBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwiICAgICAgICAgICAgICAgICAgICBbIHBhc3Nfb24gfCBmYWxsX3Rocm91Z2ggXVxuIik7CisJZnByaW50ZihzdGRlcnIsIiAgICAgICAgICAgICAgICAgICAgWyBjbGFzc2lkIENMQVNTSUQgXSAiCisJICAgICJbIGFjdGlvbiBBQ1RJT05fU1BFQyBdXG4iKTsKK30KKworc3RhdGljIGludCB0Y2luZGV4X3BhcnNlX29wdChzdHJ1Y3QgZmlsdGVyX3V0aWwgKnF1LCBjaGFyICpoYW5kbGUsIGludCBhcmdjLAorICAgIGNoYXIgKiphcmd2LCBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJc3RydWN0IHRjbXNnICp0ID0gTkxNU0dfREFUQShuKTsKKwlzdHJ1Y3QgcnRhdHRyICp0YWlsOworCWNoYXIgKmVuZDsKKworCWlmIChoYW5kbGUpIHsKKwkJdC0+dGNtX2hhbmRsZSA9IHN0cnRvdWwoaGFuZGxlLCZlbmQsMCk7CisJCWlmICgqZW5kKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgZmlsdGVyIElEXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlpZiAoIWFyZ2MpIHJldHVybiAwOworCXRhaWwgPSBOTE1TR19UQUlMKG4pOworCWFkZGF0dHJfbChuLDQwOTYsVENBX09QVElPTlMsTlVMTCwwKTsKKwl3aGlsZSAoYXJnYykgeworCQlpZiAoIXN0cmNtcCgqYXJndiwiaGFzaCIpKSB7CisJCQlpbnQgaGFzaDsKKworCQkJTkVYVF9BUkcoKTsKKwkJCWhhc2ggPSBzdHJ0b3VsKCphcmd2LCZlbmQsMCk7CisJCQlpZiAoKmVuZCB8fCAhaGFzaCB8fCBoYXNoID4gMHgxMDAwMCkgeworCQkJCWV4cGxhaW4oKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlhZGRhdHRyX2wobiw0MDk2LFRDQV9UQ0lOREVYX0hBU0gsJmhhc2gsc2l6ZW9mKGhhc2gpKTsKKwkJfQorCQllbHNlIGlmICghc3RyY21wKCphcmd2LCJtYXNrIikpIHsKKwkJCV9fdTE2IG1hc2s7CisKKwkJCU5FWFRfQVJHKCk7CisJCQltYXNrID0gc3RydG91bCgqYXJndiwmZW5kLDApOworCQkJaWYgKCplbmQpIHsKKwkJCQlleHBsYWluKCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYWRkYXR0cl9sKG4sNDA5NixUQ0FfVENJTkRFWF9NQVNLLCZtYXNrLHNpemVvZihtYXNrKSk7CisJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwic2hpZnQiKSkgeworCQkJaW50IHNoaWZ0OworCisJCQlORVhUX0FSRygpOworCQkJc2hpZnQgPSBzdHJ0b3VsKCphcmd2LCZlbmQsMCk7CisJCQlpZiAoKmVuZCkgeworCQkJCWV4cGxhaW4oKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlhZGRhdHRyX2wobiw0MDk2LFRDQV9UQ0lOREVYX1NISUZULCZzaGlmdCwKKwkJCSAgICBzaXplb2Yoc2hpZnQpKTsKKwkJfQorCQllbHNlIGlmICghc3RyY21wKCphcmd2LCJmYWxsX3Rocm91Z2giKSkgeworCQkJaW50IHZhbHVlID0gMTsKKworCQkJYWRkYXR0cl9sKG4sNDA5NixUQ0FfVENJTkRFWF9GQUxMX1RIUk9VR0gsJnZhbHVlLAorCQkJICAgIHNpemVvZih2YWx1ZSkpOworCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3YsInBhc3Nfb24iKSkgeworCQkJaW50IHZhbHVlID0gMDsKKworCQkJYWRkYXR0cl9sKG4sNDA5NixUQ0FfVENJTkRFWF9GQUxMX1RIUk9VR0gsJnZhbHVlLAorCQkJICAgIHNpemVvZih2YWx1ZSkpOworCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3YsImNsYXNzaWQiKSkgeworCQkJX191MzIgaGFuZGxlOworCisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF90Y19jbGFzc2lkKCZoYW5kbGUsKmFyZ3YpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwiY2xhc3NpZFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlhZGRhdHRyX2wobiwgNDA5NiwgVENBX1RDSU5ERVhfQ0xBU1NJRCwgJmhhbmRsZSwgNCk7CisJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwicG9saWNlIikpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocGFyc2VfcG9saWNlKCZhcmdjLCAmYXJndiwgVENBX1RDSU5ERVhfUE9MSUNFLCBuKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcInBvbGljZVwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQllbHNlIGlmICghc3RyY21wKCphcmd2LCJhY3Rpb24iKSkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChwYXJzZV9wb2xpY2UoJmFyZ2MsICZhcmd2LCBUQ0FfVENJTkRFWF9BQ1QsIG4pKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwiYWN0aW9uXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWVsc2UgeworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWFyZ2MtLTsKKwkJYXJndisrOworCX0KKwl0YWlsLT5ydGFfbGVuID0gKHZvaWQgKikgTkxNU0dfVEFJTChuKSAtICh2b2lkICopIHRhaWw7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCB0Y2luZGV4X3ByaW50X29wdChzdHJ1Y3QgZmlsdGVyX3V0aWwgKnF1LCBGSUxFICpmLAorICAgICBzdHJ1Y3QgcnRhdHRyICpvcHQsIF9fdTMyIGhhbmRsZSkKK3sKKwlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfVENJTkRFWF9NQVgrMV07CisKKwlpZiAob3B0ID09IE5VTEwpCisJCXJldHVybiAwOworCisJcGFyc2VfcnRhdHRyX25lc3RlZCh0YiwgVENBX1RDSU5ERVhfTUFYLCBvcHQpOworCisJaWYgKGhhbmRsZSAhPSB+MCkgZnByaW50ZihmLCJoYW5kbGUgMHglMDR4ICIsaGFuZGxlKTsKKwlpZiAodGJbVENBX1RDSU5ERVhfSEFTSF0pIHsKKwkJX191MTYgaGFzaDsKKworCQlpZiAoUlRBX1BBWUxPQUQodGJbVENBX1RDSU5ERVhfSEFTSF0pIDwgc2l6ZW9mKGhhc2gpKQorCQkJcmV0dXJuIC0xOworCQloYXNoID0gcnRhX2dldGF0dHJfdTE2KHRiW1RDQV9UQ0lOREVYX0hBU0hdKTsKKwkJZnByaW50ZihmLCJoYXNoICVkICIsaGFzaCk7CisJfQorCWlmICh0YltUQ0FfVENJTkRFWF9NQVNLXSkgeworCQlfX3UxNiBtYXNrOworCisJCWlmIChSVEFfUEFZTE9BRCh0YltUQ0FfVENJTkRFWF9NQVNLXSkgPCBzaXplb2YobWFzaykpCisJCQlyZXR1cm4gLTE7CisJCW1hc2sgPSBydGFfZ2V0YXR0cl91MTYodGJbVENBX1RDSU5ERVhfTUFTS10pOworCQlmcHJpbnRmKGYsIm1hc2sgMHglMDR4ICIsbWFzayk7CisJfQorCWlmICh0YltUQ0FfVENJTkRFWF9TSElGVF0pIHsKKwkJaW50IHNoaWZ0OworCisJCWlmIChSVEFfUEFZTE9BRCh0YltUQ0FfVENJTkRFWF9TSElGVF0pIDwgc2l6ZW9mKHNoaWZ0KSkKKwkJCXJldHVybiAtMTsKKwkJc2hpZnQgPSAqKGludCAqKSBSVEFfREFUQSh0YltUQ0FfVENJTkRFWF9TSElGVF0pOworCQlmcHJpbnRmKGYsInNoaWZ0ICVkICIsc2hpZnQpOworCX0KKwlpZiAodGJbVENBX1RDSU5ERVhfRkFMTF9USFJPVUdIXSkgeworCQlpbnQgZmFsbF90aHJvdWdoOworCisJCWlmIChSVEFfUEFZTE9BRCh0YltUQ0FfVENJTkRFWF9GQUxMX1RIUk9VR0hdKSA8CisJCSAgICBzaXplb2YoZmFsbF90aHJvdWdoKSkKKwkJCXJldHVybiAtMTsKKwkJZmFsbF90aHJvdWdoID0gKihpbnQgKikgUlRBX0RBVEEodGJbVENBX1RDSU5ERVhfRkFMTF9USFJPVUdIXSk7CisJCWZwcmludGYoZixmYWxsX3Rocm91Z2ggPyAiZmFsbF90aHJvdWdoICIgOiAicGFzc19vbiAiKTsKKwl9CisJaWYgKHRiW1RDQV9UQ0lOREVYX0NMQVNTSURdKSB7CisJCVNQUklOVF9CVUYoYjEpOworCQlmcHJpbnRmKGYsICJjbGFzc2lkICVzICIsc3ByaW50X3RjX2NsYXNzaWQoKihfX3UzMiAqKQorCQkgICAgUlRBX0RBVEEodGJbVENBX1RDSU5ERVhfQ0xBU1NJRF0pLCBiMSkpOworCX0KKwlpZiAodGJbVENBX1RDSU5ERVhfUE9MSUNFXSkgeworCQlmcHJpbnRmKGYsICJcbiIpOworCQl0Y19wcmludF9wb2xpY2UoZiwgdGJbVENBX1RDSU5ERVhfUE9MSUNFXSk7CisJfQorCWlmICh0YltUQ0FfVENJTkRFWF9BQ1RdKSB7CisJCWZwcmludGYoZiwgIlxuIik7CisJCXRjX3ByaW50X3BvbGljZShmLCB0YltUQ0FfVENJTkRFWF9BQ1RdKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBmaWx0ZXJfdXRpbCB0Y2luZGV4X2ZpbHRlcl91dGlsID0geworCS5pZCA9ICJ0Y2luZGV4IiwKKwkucGFyc2VfZm9wdCA9IHRjaW5kZXhfcGFyc2Vfb3B0LAorCS5wcmludF9mb3B0ID0gdGNpbmRleF9wcmludF9vcHQsCit9OwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvZl91MzIuYyBiL2lwcm91dGUyL3RjL2ZfdTMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI5NzY3OAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL2ZfdTMyLmMKQEAgLTAsMCArMSwxMjkyIEBACisvKgorICogcV91MzIuYwkJVTMyIGZpbHRlci4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gdTMyaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKgkJTWF0Y2ggbWFyayBhZGRlZCBieSBDYXRhbGluKHV4IGFrYSBEaW5vKSBCT0lFIDxjYXRhYiBhdCB1bWJyZWxsYS5ybz4gWzUgbm92IDIwMDRdCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInRjX3V0aWwuaCIKKworZXh0ZXJuIGludCBzaG93X3ByZXR0eTsKKworc3RhdGljIHZvaWQgZXhwbGFpbih2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IC4uLiB1MzIgWyBtYXRjaCBTRUxFQ1RPUiAuLi4gXSBbIGxpbmsgSFRJRCBdIgorCQkiIFsgY2xhc3NpZCBDTEFTU0lEIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgWyBhY3Rpb24gQUNUSU9OX1NQRUMgXSIKKwkJIiBbIG9mZnNldCBPRkZTRVRfU1BFQyBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgIFsgaHQgSFRJRCBdIFsgaGFzaGtleSBIQVNIS0VZX1NQRUMgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICBbIHNhbXBsZSBTQU1QTEUgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICJvciAgICAgICAgIHUzMiBkaXZpc29yIERJVklTT1JcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIldoZXJlOiBTRUxFQ1RPUiA6PSBTQU1QTEUgU0FNUExFIC4uLlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgU0FNUExFIDo9IHsgaXAgfCBpcDYgfCB1ZHAgfCB0Y3AgfCBpY21wIHwiCisJCSIgdXszMnwxNnw4fSB8IG1hcmsgfSBTQU1QTEVfQVJHUyBbZGl2aXNvciBESVZJU09SXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgRklMVEVSSUQgOj0gWDpZOlpcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXG5OT1RFOiBDTEFTU0lEIGlzIHBhcnNlZCBhdCBoZXhhZGVjaW1hbCBpbnB1dC5cbiIpOworfQorCitzdGF0aWMgaW50IGdldF91MzJfaGFuZGxlKF9fdTMyICpoYW5kbGUsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlfX3UzMiBodGlkPTAsIGhhc2g9MCwgbm9kZWlkPTA7CisJY2hhciAqdG1wID0gc3RyY2hyKHN0ciwgJzonKTsKKworCWlmICh0bXAgPT0gTlVMTCkgeworCQlpZiAobWVtY21wKCIweCIsIHN0ciwgMikgPT0gMCkKKwkJCXJldHVybiBnZXRfdTMyKGhhbmRsZSwgc3RyLCAxNik7CisJCXJldHVybiAtMTsKKwl9CisJaHRpZCA9IHN0cnRvdWwoc3RyLCAmdG1wLCAxNik7CisJaWYgKHRtcCA9PSBzdHIgJiYgKnN0ciAhPSAnOicgJiYgKnN0ciAhPSAwKQorCQlyZXR1cm4gLTE7CisJaWYgKGh0aWQ+PTB4MTAwMCkKKwkJcmV0dXJuIC0xOworCWlmICgqdG1wKSB7CisJCXN0ciA9IHRtcCArIDE7CisJCWhhc2ggPSBzdHJ0b3VsKHN0ciwgJnRtcCwgMTYpOworCQlpZiAodG1wID09IHN0ciAmJiAqc3RyICE9ICc6JyAmJiAqc3RyICE9IDApCisJCQlyZXR1cm4gLTE7CisJCWlmIChoYXNoPj0weDEwMCkKKwkJCXJldHVybiAtMTsKKwkJaWYgKCp0bXApIHsKKwkJCXN0ciA9IHRtcCArIDE7CisJCQlub2RlaWQgPSBzdHJ0b3VsKHN0ciwgJnRtcCwgMTYpOworCQkJaWYgKHRtcCA9PSBzdHIgJiYgKnN0ciAhPSAwKQorCQkJCXJldHVybiAtMTsKKwkJCWlmIChub2RlaWQ+PTB4MTAwMCkKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJKmhhbmRsZSA9IChodGlkPDwyMCl8KGhhc2g8PDEyKXxub2RlaWQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyICogc3ByaW50X3UzMl9oYW5kbGUoX191MzIgaGFuZGxlLCBjaGFyICpidWYpCit7CisJaW50IGJzaXplID0gU1BSSU5UX0JTSVpFLTE7CisJX191MzIgaHRpZCA9IFRDX1UzMl9IVElEKGhhbmRsZSk7CisJX191MzIgaGFzaCA9IFRDX1UzMl9IQVNIKGhhbmRsZSk7CisJX191MzIgbm9kZWlkID0gVENfVTMyX05PREUoaGFuZGxlKTsKKwljaGFyICpiID0gYnVmOworCisJaWYgKGhhbmRsZSA9PSAwKSB7CisJCXNucHJpbnRmKGIsIGJzaXplLCAibm9uZSIpOworCQlyZXR1cm4gYjsKKwl9CisJaWYgKGh0aWQpIHsKKwkJaW50IGwgPSBzbnByaW50ZihiLCBic2l6ZSwgIiV4OiIsIGh0aWQ+PjIwKTsKKwkJYnNpemUgLT0gbDsKKwkJYiArPSBsOworCX0KKwlpZiAobm9kZWlkfGhhc2gpIHsKKwkJaWYgKGhhc2gpIHsKKwkJCWludCBsID0gc25wcmludGYoYiwgYnNpemUsICIleCIsIGhhc2gpOworCQkJYnNpemUgLT0gbDsKKwkJCWIgKz0gbDsKKwkJfQorCQlpZiAobm9kZWlkKSB7CisJCQlpbnQgbCA9IHNucHJpbnRmKGIsIGJzaXplLCAiOiV4Iiwgbm9kZWlkKTsKKwkJCWJzaXplIC09IGw7CisJCQliICs9IGw7CisJCX0KKwl9CisJaWYgKHNob3dfcmF3KQorCQlzbnByaW50ZihiLCBic2l6ZSwgIlslMDh4XSAiLCBoYW5kbGUpOworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBpbnQgcGFja19rZXkoc3RydWN0IHRjX3UzMl9zZWwgKnNlbCwgX191MzIga2V5LCBfX3UzMiBtYXNrLAorCQkgICAgaW50IG9mZiwgaW50IG9mZm1hc2spCit7CisJaW50IGk7CisJaW50IGh3bSA9IHNlbC0+bmtleXM7CisKKwlrZXkgJj0gbWFzazsKKworCWZvciAoaT0wOyBpPGh3bTsgaSsrKSB7CisJCWlmIChzZWwtPmtleXNbaV0ub2ZmID09IG9mZiAmJiBzZWwtPmtleXNbaV0ub2ZmbWFzayA9PSBvZmZtYXNrKSB7CisJCQlfX3UzMiBpbnRlcnNlY3QgPSBtYXNrICYgc2VsLT5rZXlzW2ldLm1hc2s7CisKKwkJCWlmICgoa2V5IF4gc2VsLT5rZXlzW2ldLnZhbCkgJiBpbnRlcnNlY3QpCisJCQkJcmV0dXJuIC0xOworCQkJc2VsLT5rZXlzW2ldLnZhbCB8PSBrZXk7CisJCQlzZWwtPmtleXNbaV0ubWFzayB8PSBtYXNrOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAoaHdtID49IDEyOCkKKwkJcmV0dXJuIC0xOworCWlmIChvZmYgJSA0KQorCQlyZXR1cm4gLTE7CisJc2VsLT5rZXlzW2h3bV0udmFsID0ga2V5OworCXNlbC0+a2V5c1tod21dLm1hc2sgPSBtYXNrOworCXNlbC0+a2V5c1tod21dLm9mZiA9IG9mZjsKKwlzZWwtPmtleXNbaHdtXS5vZmZtYXNrID0gb2ZmbWFzazsKKwlzZWwtPm5rZXlzKys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFja19rZXkzMihzdHJ1Y3QgdGNfdTMyX3NlbCAqc2VsLCBfX3UzMiBrZXksIF9fdTMyIG1hc2ssCisJCSAgICAgIGludCBvZmYsIGludCBvZmZtYXNrKQoreworCWtleSA9IGh0b25sKGtleSk7CisJbWFzayA9IGh0b25sKG1hc2spOworCXJldHVybiBwYWNrX2tleShzZWwsIGtleSwgbWFzaywgb2ZmLCBvZmZtYXNrKTsKK30KKworc3RhdGljIGludCBwYWNrX2tleTE2KHN0cnVjdCB0Y191MzJfc2VsICpzZWwsIF9fdTMyIGtleSwgX191MzIgbWFzaywKKwkJICAgICAgaW50IG9mZiwgaW50IG9mZm1hc2spCit7CisJaWYgKGtleSA+IDB4RkZGRiB8fCBtYXNrID4gMHhGRkZGKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoKG9mZiAmIDMpID09IDApIHsKKwkJa2V5IDw8PSAxNjsKKwkJbWFzayA8PD0gMTY7CisJfQorCW9mZiAmPSB+MzsKKwlrZXkgPSBodG9ubChrZXkpOworCW1hc2sgPSBodG9ubChtYXNrKTsKKworCXJldHVybiBwYWNrX2tleShzZWwsIGtleSwgbWFzaywgb2ZmLCBvZmZtYXNrKTsKK30KKworc3RhdGljIGludCBwYWNrX2tleTgoc3RydWN0IHRjX3UzMl9zZWwgKnNlbCwgX191MzIga2V5LCBfX3UzMiBtYXNrLCBpbnQgb2ZmLCBpbnQgb2ZmbWFzaykKK3sKKwlpZiAoa2V5ID4gMHhGRiB8fCBtYXNrID4gMHhGRikKKwkJcmV0dXJuIC0xOworCisJaWYgKChvZmYgJiAzKSA9PSAwKSB7CisJCWtleSA8PD0gMjQ7CisJCW1hc2sgPDw9IDI0OworCX0gZWxzZSBpZiAoKG9mZiAmIDMpID09IDEpIHsKKwkJa2V5IDw8PSAxNjsKKwkJbWFzayA8PD0gMTY7CisJfSBlbHNlIGlmICgob2ZmICYgMykgPT0gMikgeworCQlrZXkgPDw9IDg7CisJCW1hc2sgPDw9IDg7CisJfQorCW9mZiAmPSB+MzsKKwlrZXkgPSBodG9ubChrZXkpOworCW1hc2sgPSBodG9ubChtYXNrKTsKKworCXJldHVybiBwYWNrX2tleShzZWwsIGtleSwgbWFzaywgb2ZmLCBvZmZtYXNrKTsKK30KKworCitzdGF0aWMgaW50IHBhcnNlX2F0KGludCAqYXJnY19wLCBjaGFyICoqKmFyZ3ZfcCwgaW50ICpvZmYsIGludCAqb2ZmbWFzaykKK3sKKwlpbnQgYXJnYyA9ICphcmdjX3A7CisJY2hhciAqKmFyZ3YgPSAqYXJndl9wOworCWNoYXIgKnAgPSAqYXJndjsKKworCWlmIChhcmdjIDw9IDApCisJCXJldHVybiAtMTsKKworCWlmIChzdHJsZW4ocCkgPiBzdHJsZW4oIm5leHRoZHIrIikgJiYKKwkgICAgbWVtY21wKHAsICJuZXh0aGRyKyIsIHN0cmxlbigibmV4dGhkcisiKSkgPT0gMCkgeworCQkqb2ZmbWFzayA9IC0xOworCQlwICs9IHN0cmxlbigibmV4dGhkcisiKTsKKwl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJuZXh0aGRyKyIpID09IDApIHsKKwkJTkVYVF9BUkcoKTsKKwkJKm9mZm1hc2sgPSAtMTsKKwkJcCA9ICphcmd2OworCX0KKworCWlmIChnZXRfaW50ZWdlcihvZmYsIHAsIDApKQorCQlyZXR1cm4gLTE7CisJYXJnYy0tOyBhcmd2Kys7CisKKwkqYXJnY19wID0gYXJnYzsKKwkqYXJndl9wID0gYXJndjsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHBhcnNlX3UzMihpbnQgKmFyZ2NfcCwgY2hhciAqKiphcmd2X3AsIHN0cnVjdCB0Y191MzJfc2VsICpzZWwsCisJCSAgICAgaW50IG9mZiwgaW50IG9mZm1hc2spCit7CisJaW50IHJlcyA9IC0xOworCWludCBhcmdjID0gKmFyZ2NfcDsKKwljaGFyICoqYXJndiA9ICphcmd2X3A7CisJX191MzIga2V5OworCV9fdTMyIG1hc2s7CisKKwlpZiAoYXJnYyA8IDIpCisJCXJldHVybiAtMTsKKworCWlmIChnZXRfdTMyKCZrZXksICphcmd2LCAwKSkKKwkJcmV0dXJuIC0xOworCWFyZ2MtLTsgYXJndisrOworCisJaWYgKGdldF91MzIoJm1hc2ssICphcmd2LCAxNikpCisJCXJldHVybiAtMTsKKwlhcmdjLS07IGFyZ3YrKzsKKworCWlmIChhcmdjID4gMCAmJiBzdHJjbXAoYXJndlswXSwgImF0IikgPT0gMCkgeworCQlORVhUX0FSRygpOworCQlpZiAocGFyc2VfYXQoJmFyZ2MsICZhcmd2LCAmb2ZmLCAmb2ZmbWFzaykpCisJCQlyZXR1cm4gLTE7CisJfQorCisJcmVzID0gcGFja19rZXkzMihzZWwsIGtleSwgbWFzaywgb2ZmLCBvZmZtYXNrKTsKKwkqYXJnY19wID0gYXJnYzsKKwkqYXJndl9wID0gYXJndjsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IHBhcnNlX3UxNihpbnQgKmFyZ2NfcCwgY2hhciAqKiphcmd2X3AsIHN0cnVjdCB0Y191MzJfc2VsICpzZWwsCisJCSAgICAgaW50IG9mZiwgaW50IG9mZm1hc2spCit7CisJaW50IHJlcyA9IC0xOworCWludCBhcmdjID0gKmFyZ2NfcDsKKwljaGFyICoqYXJndiA9ICphcmd2X3A7CisJX191MzIga2V5OworCV9fdTMyIG1hc2s7CisKKwlpZiAoYXJnYyA8IDIpCisJCXJldHVybiAtMTsKKworCWlmIChnZXRfdTMyKCZrZXksICphcmd2LCAwKSkKKwkJcmV0dXJuIC0xOworCWFyZ2MtLTsgYXJndisrOworCisJaWYgKGdldF91MzIoJm1hc2ssICphcmd2LCAxNikpCisJCXJldHVybiAtMTsKKwlhcmdjLS07IGFyZ3YrKzsKKworCWlmIChhcmdjID4gMCAmJiBzdHJjbXAoYXJndlswXSwgImF0IikgPT0gMCkgeworCQlORVhUX0FSRygpOworCQlpZiAocGFyc2VfYXQoJmFyZ2MsICZhcmd2LCAmb2ZmLCAmb2ZmbWFzaykpCisJCQlyZXR1cm4gLTE7CisJfQorCXJlcyA9IHBhY2tfa2V5MTYoc2VsLCBrZXksIG1hc2ssIG9mZiwgb2ZmbWFzayk7CisJKmFyZ2NfcCA9IGFyZ2M7CisJKmFyZ3ZfcCA9IGFyZ3Y7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBwYXJzZV91OChpbnQgKmFyZ2NfcCwgY2hhciAqKiphcmd2X3AsIHN0cnVjdCB0Y191MzJfc2VsICpzZWwsCisJCSAgICBpbnQgb2ZmLCBpbnQgb2ZmbWFzaykKK3sKKwlpbnQgcmVzID0gLTE7CisJaW50IGFyZ2MgPSAqYXJnY19wOworCWNoYXIgKiphcmd2ID0gKmFyZ3ZfcDsKKwlfX3UzMiBrZXk7CisJX191MzIgbWFzazsKKworCWlmIChhcmdjIDwgMikKKwkJcmV0dXJuIC0xOworCisJaWYgKGdldF91MzIoJmtleSwgKmFyZ3YsIDApKQorCQlyZXR1cm4gLTE7CisJYXJnYy0tOyBhcmd2Kys7CisKKwlpZiAoZ2V0X3UzMigmbWFzaywgKmFyZ3YsIDE2KSkKKwkJcmV0dXJuIC0xOworCWFyZ2MtLTsgYXJndisrOworCisJaWYgKGtleSA+IDB4RkYgfHwgbWFzayA+IDB4RkYpCisJCXJldHVybiAtMTsKKworCWlmIChhcmdjID4gMCAmJiBzdHJjbXAoYXJndlswXSwgImF0IikgPT0gMCkgeworCQlORVhUX0FSRygpOworCQlpZiAocGFyc2VfYXQoJmFyZ2MsICZhcmd2LCAmb2ZmLCAmb2ZmbWFzaykpCisJCQlyZXR1cm4gLTE7CisJfQorCisJcmVzID0gcGFja19rZXk4KHNlbCwga2V5LCBtYXNrLCBvZmYsIG9mZm1hc2spOworCSphcmdjX3AgPSBhcmdjOworCSphcmd2X3AgPSBhcmd2OworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfaXBfYWRkcihpbnQgKmFyZ2NfcCwgY2hhciAqKiphcmd2X3AsIHN0cnVjdCB0Y191MzJfc2VsICpzZWwsCisJCQkgaW50IG9mZikKK3sKKwlpbnQgcmVzID0gLTE7CisJaW50IGFyZ2MgPSAqYXJnY19wOworCWNoYXIgKiphcmd2ID0gKmFyZ3ZfcDsKKwlpbmV0X3ByZWZpeCBhZGRyOworCV9fdTMyIG1hc2s7CisJaW50IG9mZm1hc2sgPSAwOworCisJaWYgKGFyZ2MgPCAxKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoZ2V0X3ByZWZpeF8xKCZhZGRyLCAqYXJndiwgQUZfSU5FVCkpCisJCXJldHVybiAtMTsKKwlhcmdjLS07IGFyZ3YrKzsKKworCWlmIChhcmdjID4gMCAmJiBzdHJjbXAoYXJndlswXSwgImF0IikgPT0gMCkgeworCQlORVhUX0FSRygpOworCQlpZiAocGFyc2VfYXQoJmFyZ2MsICZhcmd2LCAmb2ZmLCAmb2ZmbWFzaykpCisJCQlyZXR1cm4gLTE7CisJfQorCisJbWFzayA9IDA7CisJaWYgKGFkZHIuYml0bGVuKQorCQltYXNrID0gaHRvbmwoMHhGRkZGRkZGRiA8PCAoMzIgLSBhZGRyLmJpdGxlbikpOworCWlmIChwYWNrX2tleShzZWwsIGFkZHIuZGF0YVswXSwgbWFzaywgb2ZmLCBvZmZtYXNrKSA8IDApCisJCXJldHVybiAtMTsKKwlyZXMgPSAwOworCisJKmFyZ2NfcCA9IGFyZ2M7CisJKmFyZ3ZfcCA9IGFyZ3Y7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBwYXJzZV9pcDZfYWRkcihpbnQgKmFyZ2NfcCwgY2hhciAqKiphcmd2X3AsCisJCQkgIHN0cnVjdCB0Y191MzJfc2VsICpzZWwsIGludCBvZmYpCit7CisJaW50IHJlcyA9IC0xOworCWludCBhcmdjID0gKmFyZ2NfcDsKKwljaGFyICoqYXJndiA9ICphcmd2X3A7CisJaW50IHBsZW4gPSAxMjg7CisJaW50IGk7CisJaW5ldF9wcmVmaXggYWRkcjsKKwlpbnQgb2ZmbWFzayA9IDA7CisKKwlpZiAoYXJnYyA8IDEpCisJCXJldHVybiAtMTsKKworCWlmIChnZXRfcHJlZml4XzEoJmFkZHIsICphcmd2LCBBRl9JTkVUNikpCisJCXJldHVybiAtMTsKKwlhcmdjLS07IGFyZ3YrKzsKKworCWlmIChhcmdjID4gMCAmJiBzdHJjbXAoYXJndlswXSwgImF0IikgPT0gMCkgeworCQlORVhUX0FSRygpOworCQlpZiAocGFyc2VfYXQoJmFyZ2MsICZhcmd2LCAmb2ZmLCAmb2ZmbWFzaykpCisJCQlyZXR1cm4gLTE7CisJfQorCisJcGxlbiA9IGFkZHIuYml0bGVuOworCWZvciAoaSA9IDA7IGkgPCBwbGVuOyBpICs9IDMyKSB7CisvLwkJaWYgKCgoaSArIDMxKSAmIH4weDFGKSA8PSBwbGVuKSB7CisJCWlmIChpICsgMzEgPD0gcGxlbikgeworCQkJcmVzID0gcGFja19rZXkoc2VsLCBhZGRyLmRhdGFbaSAvIDMyXSwKKwkJCQkgICAgICAgMHhGRkZGRkZGRiwgb2ZmICsgNCAqIChpIC8gMzIpLCBvZmZtYXNrKTsKKwkJCWlmIChyZXMgPCAwKQorCQkJCXJldHVybiAtMTsKKwkJfSBlbHNlIGlmIChpIDwgcGxlbikgeworCQkJX191MzIgbWFzayA9IGh0b25sKDB4RkZGRkZGRkYgPDwgKDMyIC0gKHBsZW4gLSBpKSkpOworCQkJcmVzID0gcGFja19rZXkoc2VsLCBhZGRyLmRhdGFbaSAvIDMyXSwKKwkJCQkgICAgICAgbWFzaywgb2ZmICsgNCAqIChpIC8gMzIpLCBvZmZtYXNrKTsKKwkJCWlmIChyZXMgPCAwKQorCQkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlyZXMgPSAwOworCisJKmFyZ2NfcCA9IGFyZ2M7CisJKmFyZ3ZfcCA9IGFyZ3Y7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBwYXJzZV9pcDZfY2xhc3MoaW50ICphcmdjX3AsIGNoYXIgKioqYXJndl9wLCBzdHJ1Y3QgdGNfdTMyX3NlbCAqc2VsKQoreworCWludCByZXMgPSAtMTsKKwlpbnQgYXJnYyA9ICphcmdjX3A7CisJY2hhciAqKmFyZ3YgPSAqYXJndl9wOworCV9fdTMyIGtleTsKKwlfX3UzMiBtYXNrOworCWludCBvZmYgPSAwOworCWludCBvZmZtYXNrID0gMDsKKworCWlmIChhcmdjIDwgMikKKwkJcmV0dXJuIC0xOworCisJaWYgKGdldF91MzIoJmtleSwgKmFyZ3YsIDApKQorCQlyZXR1cm4gLTE7CisJYXJnYy0tOyBhcmd2Kys7CisKKwlpZiAoZ2V0X3UzMigmbWFzaywgKmFyZ3YsIDE2KSkKKwkJcmV0dXJuIC0xOworCWFyZ2MtLTsgYXJndisrOworCisJaWYgKGtleSA+IDB4RkYgfHwgbWFzayA+IDB4RkYpCisJCXJldHVybiAtMTsKKworCWtleSA8PD0gMjA7CisJbWFzayA8PD0gMjA7CisJa2V5ID0gaHRvbmwoa2V5KTsKKwltYXNrID0gaHRvbmwobWFzayk7CisKKwlyZXMgPSBwYWNrX2tleShzZWwsIGtleSwgbWFzaywgb2ZmLCBvZmZtYXNrKTsKKwlpZiAocmVzIDwgMCkKKwkJcmV0dXJuIC0xOworCisJKmFyZ2NfcCA9IGFyZ2M7CisJKmFyZ3ZfcCA9IGFyZ3Y7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfZXRoZXJfYWRkcihpbnQgKmFyZ2NfcCwgY2hhciAqKiphcmd2X3AsCisJCQkgICAgc3RydWN0IHRjX3UzMl9zZWwgKnNlbCwgaW50IG9mZikKK3sKKwlpbnQgcmVzID0gLTE7CisJaW50IGFyZ2MgPSAqYXJnY19wOworCWNoYXIgKiphcmd2ID0gKmFyZ3ZfcDsKKwlfX3U4IGFkZHJbNl07CisJaW50IG9mZm1hc2sgPSAwOworCWludCBpOworCisJaWYgKGFyZ2MgPCAxKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoc3NjYW5mKCphcmd2LCAiJWhoeDolaGh4OiVoaHg6JWhoeDolaGh4OiVoaHgiLAorCQkgICBhZGRyICsgMCwgYWRkciArIDEsIGFkZHIgKyAyLAorCQkgICBhZGRyICsgMywgYWRkciArIDQsIGFkZHIgKyA1KSAhPSA2KSB7CisJCWZwcmludGYoc3RkZXJyLCAicGFyc2VfZXRoZXJfYWRkcjogaW1wcm9wZXJseSBmb3JtZWQgYWRkcmVzcyAnJXMnXG4iLAorCQkJKmFyZ3YpOworCQlyZXR1cm4gLTE7CisJfQorCisJYXJnYy0tOyBhcmd2Kys7CisJaWYgKGFyZ2MgPiAwICYmIHN0cmNtcChhcmd2WzBdLCAiYXQiKSA9PSAwKSB7CisJCU5FWFRfQVJHKCk7CisJCWlmIChwYXJzZV9hdCgmYXJnYywgJmFyZ3YsICZvZmYsICZvZmZtYXNrKSkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCXJlcyA9IHBhY2tfa2V5OChzZWwsIGFkZHJbaV0sIDB4RkYsIG9mZiArIGksIG9mZm1hc2spOworCQlpZiAocmVzIDwgMCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwkqYXJnY19wID0gYXJnYzsKKwkqYXJndl9wID0gYXJndjsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IHBhcnNlX2lwKGludCAqYXJnY19wLCBjaGFyICoqKmFyZ3ZfcCwgc3RydWN0IHRjX3UzMl9zZWwgKnNlbCkKK3sKKwlpbnQgcmVzID0gLTE7CisJaW50IGFyZ2MgPSAqYXJnY19wOworCWNoYXIgKiphcmd2ID0gKmFyZ3ZfcDsKKworCWlmIChhcmdjIDwgMikKKwkJcmV0dXJuIC0xOworCisJaWYgKHN0cmNtcCgqYXJndiwgInNyYyIpID09IDApIHsKKwkJTkVYVF9BUkcoKTsKKwkJcmVzID0gcGFyc2VfaXBfYWRkcigmYXJnYywgJmFyZ3YsIHNlbCwgMTIpOworCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZHN0IikgPT0gMCkgeworCQlORVhUX0FSRygpOworCQlyZXMgPSBwYXJzZV9pcF9hZGRyKCZhcmdjLCAmYXJndiwgc2VsLCAxNik7CisJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJ0b3MiKSA9PSAwIHx8CisJICAgIG1hdGNoZXMoKmFyZ3YsICJkc2ZpZWxkIikgPT0gMCB8fAorCSAgICBtYXRjaGVzKCphcmd2LCAicHJlY2VkZW5jZSIpID09IDApIHsKKwkJTkVYVF9BUkcoKTsKKwkJcmVzID0gcGFyc2VfdTgoJmFyZ2MsICZhcmd2LCBzZWwsIDEsIDApOworCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaWhsIikgPT0gMCkgeworCQlORVhUX0FSRygpOworCQlyZXMgPSBwYXJzZV91OCgmYXJnYywgJmFyZ3YsIHNlbCwgMCwgMCk7CisJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJwcm90b2NvbCIpID09IDApIHsKKwkJTkVYVF9BUkcoKTsKKwkJcmVzID0gcGFyc2VfdTgoJmFyZ2MsICZhcmd2LCBzZWwsIDksIDApOworCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibm9mcmFnIikgPT0gMCkgeworCQlhcmdjLS07IGFyZ3YrKzsKKwkJcmVzID0gcGFja19rZXkxNihzZWwsIDAsIDB4M0ZGRiwgNiwgMCk7CisJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJmaXJzdGZyYWciKSA9PSAwKSB7CisJCWFyZ2MtLTsgYXJndisrOworCQlyZXMgPSBwYWNrX2tleTE2KHNlbCwgMHgyMDAwLCAweDNGRkYsIDYsIDApOworCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZGYiKSA9PSAwKSB7CisJCWFyZ2MtLTsgYXJndisrOworCQlyZXMgPSBwYWNrX2tleTE2KHNlbCwgMHg0MDAwLCAweDQwMDAsIDYsIDApOworCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibWYiKSA9PSAwKSB7CisJCWFyZ2MtLTsgYXJndisrOworCQlyZXMgPSBwYWNrX2tleTE2KHNlbCwgMHgyMDAwLCAweDIwMDAsIDYsIDApOworCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZHBvcnQiKSA9PSAwKSB7CisJCU5FWFRfQVJHKCk7CisJCXJlcyA9IHBhcnNlX3UxNigmYXJnYywgJmFyZ3YsIHNlbCwgMjIsIDApOworCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAic3BvcnQiKSA9PSAwKSB7CisJCU5FWFRfQVJHKCk7CisJCXJlcyA9IHBhcnNlX3UxNigmYXJnYywgJmFyZ3YsIHNlbCwgMjAsIDApOworCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaWNtcF90eXBlIikgPT0gMCkgeworCQlORVhUX0FSRygpOworCQlyZXMgPSBwYXJzZV91OCgmYXJnYywgJmFyZ3YsIHNlbCwgMjAsIDApOworCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaWNtcF9jb2RlIikgPT0gMCkgeworCQlORVhUX0FSRygpOworCQlyZXMgPSBwYXJzZV91OCgmYXJnYywgJmFyZ3YsIHNlbCwgMjEsIDApOworCX0gZWxzZQorCQlyZXR1cm4gLTE7CisKKwkqYXJnY19wID0gYXJnYzsKKwkqYXJndl9wID0gYXJndjsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IHBhcnNlX2lwNihpbnQgKmFyZ2NfcCwgY2hhciAqKiphcmd2X3AsIHN0cnVjdCB0Y191MzJfc2VsICpzZWwpCit7CisJaW50IHJlcyA9IC0xOworCWludCBhcmdjID0gKmFyZ2NfcDsKKwljaGFyICoqYXJndiA9ICphcmd2X3A7CisKKwlpZiAoYXJnYyA8IDIpCisJCXJldHVybiAtMTsKKworCWlmIChzdHJjbXAoKmFyZ3YsICJzcmMiKSA9PSAwKSB7CisJCU5FWFRfQVJHKCk7CisJCXJlcyA9IHBhcnNlX2lwNl9hZGRyKCZhcmdjLCAmYXJndiwgc2VsLCA4KTsKKwl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImRzdCIpID09IDApIHsKKwkJTkVYVF9BUkcoKTsKKwkJcmVzID0gcGFyc2VfaXA2X2FkZHIoJmFyZ2MsICZhcmd2LCBzZWwsIDI0KTsKKwl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInByaW9yaXR5IikgPT0gMCkgeworCQlORVhUX0FSRygpOworCQlyZXMgPSBwYXJzZV9pcDZfY2xhc3MoJmFyZ2MsICZhcmd2LCBzZWwpOworCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAicHJvdG9jb2wiKSA9PSAwKSB7CisJCU5FWFRfQVJHKCk7CisJCXJlcyA9IHBhcnNlX3U4KCZhcmdjLCAmYXJndiwgc2VsLCA2LCAwKTsKKwl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImZsb3dsYWJlbCIpID09IDApIHsKKwkJTkVYVF9BUkcoKTsKKwkJcmVzID0gcGFyc2VfdTMyKCZhcmdjLCAmYXJndiwgc2VsLCAwLCAwKTsKKwl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImRwb3J0IikgPT0gMCkgeworCQlORVhUX0FSRygpOworCQlyZXMgPSBwYXJzZV91MTYoJmFyZ2MsICZhcmd2LCBzZWwsIDQyLCAwKTsKKwl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInNwb3J0IikgPT0gMCkgeworCQlORVhUX0FSRygpOworCQlyZXMgPSBwYXJzZV91MTYoJmFyZ2MsICZhcmd2LCBzZWwsIDQwLCAwKTsKKwl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImljbXBfdHlwZSIpID09IDApIHsKKwkJTkVYVF9BUkcoKTsKKwkJcmVzID0gcGFyc2VfdTgoJmFyZ2MsICZhcmd2LCBzZWwsIDQwLCAwKTsKKwl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImljbXBfY29kZSIpID09IDApIHsKKwkJTkVYVF9BUkcoKTsKKwkJcmVzID0gcGFyc2VfdTgoJmFyZ2MsICZhcmd2LCBzZWwsIDQxLCAxKTsKKwl9IGVsc2UKKwkJcmV0dXJuIC0xOworCisJKmFyZ2NfcCA9IGFyZ2M7CisJKmFyZ3ZfcCA9IGFyZ3Y7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBwYXJzZV9ldGhlcihpbnQgKmFyZ2NfcCwgY2hhciAqKiphcmd2X3AsIHN0cnVjdCB0Y191MzJfc2VsICpzZWwpCit7CisJaW50IHJlcyA9IC0xOworCWludCBhcmdjID0gKmFyZ2NfcDsKKwljaGFyICoqYXJndiA9ICphcmd2X3A7CisKKwlpZiAoYXJnYyA8IDIpCisJCXJldHVybiAtMTsKKworCWlmIChzdHJjbXAoKmFyZ3YsICJzcmMiKSA9PSAwKSB7CisJCU5FWFRfQVJHKCk7CisJCXJlcyA9IHBhcnNlX2V0aGVyX2FkZHIoJmFyZ2MsICZhcmd2LCBzZWwsIC04KTsKKwl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImRzdCIpID09IDApIHsKKwkJTkVYVF9BUkcoKTsKKwkJcmVzID0gcGFyc2VfZXRoZXJfYWRkcigmYXJnYywgJmFyZ3YsIHNlbCwgLTE0KTsKKwl9IGVsc2UgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gbWF0Y2g6IGV0aGVyICVzXG4iLCAqYXJndik7CisJCXJldHVybiAtMTsKKwl9CisKKwkqYXJnY19wID0gYXJnYzsKKwkqYXJndl9wID0gYXJndjsKKwlyZXR1cm4gcmVzOworfQorCisjZGVmaW5lIHBhcnNlX3RjcCBwYXJzZV91ZHAKK3N0YXRpYyBpbnQgcGFyc2VfdWRwKGludCAqYXJnY19wLCBjaGFyICoqKmFyZ3ZfcCwgc3RydWN0IHRjX3UzMl9zZWwgKnNlbCkKK3sKKwlpbnQgcmVzID0gLTE7CisJaW50IGFyZ2MgPSAqYXJnY19wOworCWNoYXIgKiphcmd2ID0gKmFyZ3ZfcDsKKworCWlmIChhcmdjIDwgMikKKwkJcmV0dXJuIC0xOworCisJaWYgKHN0cmNtcCgqYXJndiwgInNyYyIpID09IDApIHsKKwkJTkVYVF9BUkcoKTsKKwkJcmVzID0gcGFyc2VfdTE2KCZhcmdjLCAmYXJndiwgc2VsLCAwLCAtMSk7CisJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJkc3QiKSA9PSAwKSB7CisJCU5FWFRfQVJHKCk7CisJCXJlcyA9IHBhcnNlX3UxNigmYXJnYywgJmFyZ3YsIHNlbCwgMiwgLTEpOworCX0gZWxzZQorCQlyZXR1cm4gLTE7CisKKwkqYXJnY19wID0gYXJnYzsKKwkqYXJndl9wID0gYXJndjsKKwlyZXR1cm4gcmVzOworfQorCisKK3N0YXRpYyBpbnQgcGFyc2VfaWNtcChpbnQgKmFyZ2NfcCwgY2hhciAqKiphcmd2X3AsIHN0cnVjdCB0Y191MzJfc2VsICpzZWwpCit7CisJaW50IHJlcyA9IC0xOworCWludCBhcmdjID0gKmFyZ2NfcDsKKwljaGFyICoqYXJndiA9ICphcmd2X3A7CisKKwlpZiAoYXJnYyA8IDIpCisJCXJldHVybiAtMTsKKworCWlmIChzdHJjbXAoKmFyZ3YsICJ0eXBlIikgPT0gMCkgeworCQlORVhUX0FSRygpOworCQlyZXMgPSBwYXJzZV91OCgmYXJnYywgJmFyZ3YsIHNlbCwgMCwgLTEpOworCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiY29kZSIpID09IDApIHsKKwkJTkVYVF9BUkcoKTsKKwkJcmVzID0gcGFyc2VfdTgoJmFyZ2MsICZhcmd2LCBzZWwsIDEsIC0xKTsKKwl9IGVsc2UKKwkJcmV0dXJuIC0xOworCisJKmFyZ2NfcCA9IGFyZ2M7CisJKmFyZ3ZfcCA9IGFyZ3Y7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBwYXJzZV9tYXJrKGludCAqYXJnY19wLCBjaGFyICoqKmFyZ3ZfcCwgc3RydWN0IG5sbXNnaGRyICpuKQoreworCWludCByZXMgPSAtMTsKKwlpbnQgYXJnYyA9ICphcmdjX3A7CisJY2hhciAqKmFyZ3YgPSAqYXJndl9wOworCXN0cnVjdCB0Y191MzJfbWFyayBtYXJrOworCisJaWYgKGFyZ2MgPD0gMSkKKwkJcmV0dXJuIC0xOworCisJaWYgKGdldF91MzIoJm1hcmsudmFsLCAqYXJndiwgMCkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwibWFya1wiIHZhbHVlXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlORVhUX0FSRygpOworCisJaWYgKGdldF91MzIoJm1hcmsubWFzaywgKmFyZ3YsIDApKSB7CisJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcIm1hcmtcIiBtYXNrXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlORVhUX0FSRygpOworCisJaWYgKChtYXJrLnZhbCAmIG1hcmsubWFzaykgIT0gbWFyay52YWwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwibWFya1wiIChpbXBvc3NpYmxlIGNvbWJpbmF0aW9uKVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlhZGRhdHRyX2wobiwgTUFYX01TRywgVENBX1UzMl9NQVJLLCAmbWFyaywgc2l6ZW9mKG1hcmspKTsKKwlyZXMgPSAwOworCisJKmFyZ2NfcCA9IGFyZ2M7CisJKmFyZ3ZfcCA9IGFyZ3Y7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBwYXJzZV9zZWxlY3RvcihpbnQgKmFyZ2NfcCwgY2hhciAqKiphcmd2X3AsCisJCQkgIHN0cnVjdCB0Y191MzJfc2VsICpzZWwsIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlpbnQgYXJnYyA9ICphcmdjX3A7CisJY2hhciAqKmFyZ3YgPSAqYXJndl9wOworCWludCByZXMgPSAtMTsKKworCWlmIChhcmdjIDw9IDApCisJCXJldHVybiAtMTsKKworCWlmIChtYXRjaGVzKCphcmd2LCAidTMyIikgPT0gMCkgeworCQlORVhUX0FSRygpOworCQlyZXMgPSBwYXJzZV91MzIoJmFyZ2MsICZhcmd2LCBzZWwsIDAsIDApOworCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInUxNiIpID09IDApIHsKKwkJTkVYVF9BUkcoKTsKKwkJcmVzID0gcGFyc2VfdTE2KCZhcmdjLCAmYXJndiwgc2VsLCAwLCAwKTsKKwl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJ1OCIpID09IDApIHsKKwkJTkVYVF9BUkcoKTsKKwkJcmVzID0gcGFyc2VfdTgoJmFyZ2MsICZhcmd2LCBzZWwsIDAsIDApOworCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImlwIikgPT0gMCkgeworCQlORVhUX0FSRygpOworCQlyZXMgPSBwYXJzZV9pcCgmYXJnYywgJmFyZ3YsIHNlbCk7CisJfSBlbHNlIAlpZiAobWF0Y2hlcygqYXJndiwgImlwNiIpID09IDApIHsKKwkJTkVYVF9BUkcoKTsKKwkJcmVzID0gcGFyc2VfaXA2KCZhcmdjLCAmYXJndiwgc2VsKTsKKwl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJ1ZHAiKSA9PSAwKSB7CisJCU5FWFRfQVJHKCk7CisJCXJlcyA9IHBhcnNlX3VkcCgmYXJnYywgJmFyZ3YsIHNlbCk7CisJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAidGNwIikgPT0gMCkgeworCQlORVhUX0FSRygpOworCQlyZXMgPSBwYXJzZV90Y3AoJmFyZ2MsICZhcmd2LCBzZWwpOworCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImljbXAiKSA9PSAwKSB7CisJCU5FWFRfQVJHKCk7CisJCXJlcyA9IHBhcnNlX2ljbXAoJmFyZ2MsICZhcmd2LCBzZWwpOworCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgIm1hcmsiKSA9PSAwKSB7CisJCU5FWFRfQVJHKCk7CisJCXJlcyA9IHBhcnNlX21hcmsoJmFyZ2MsICZhcmd2LCBuKTsKKwl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJldGhlciIpID09IDApIHsKKwkJTkVYVF9BUkcoKTsKKwkJcmVzID0gcGFyc2VfZXRoZXIoJmFyZ2MsICZhcmd2LCBzZWwpOworCX0gZWxzZQorCQlyZXR1cm4gLTE7CisKKwkqYXJnY19wID0gYXJnYzsKKwkqYXJndl9wID0gYXJndjsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IHBhcnNlX29mZnNldChpbnQgKmFyZ2NfcCwgY2hhciAqKiphcmd2X3AsIHN0cnVjdCB0Y191MzJfc2VsICpzZWwpCit7CisJaW50IGFyZ2MgPSAqYXJnY19wOworCWNoYXIgKiphcmd2ID0gKmFyZ3ZfcDsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAobWF0Y2hlcygqYXJndiwgInBsdXMiKSA9PSAwKSB7CisJCQlpbnQgb2ZmOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfaW50ZWdlcigmb2ZmLCAqYXJndiwgMCkpCisJCQkJcmV0dXJuIC0xOworCQkJc2VsLT5vZmYgPSBvZmY7CisJCQlzZWwtPmZsYWdzIHw9IFRDX1UzMl9PRkZTRVQ7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImF0IikgPT0gMCkgeworCQkJaW50IG9mZjsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X2ludGVnZXIoJm9mZiwgKmFyZ3YsIDApKQorCQkJCXJldHVybiAtMTsKKwkJCXNlbC0+b2Zmb2ZmID0gb2ZmOworCQkJaWYgKG9mZiUyKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJvZmZzZXQgXCJhdFwiIG11c3QgYmUgZXZlblxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJc2VsLT5mbGFncyB8PSBUQ19VMzJfVkFST0ZGU0VUOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJtYXNrIikgPT0gMCkgeworCQkJX191MTYgbWFzazsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UxNigmbWFzaywgKmFyZ3YsIDE2KSkKKwkJCQlyZXR1cm4gLTE7CisJCQlzZWwtPm9mZm1hc2sgPSBodG9ucyhtYXNrKTsKKwkJCXNlbC0+ZmxhZ3MgfD0gVENfVTMyX1ZBUk9GRlNFVDsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAic2hpZnQiKSA9PSAwKSB7CisJCQlpbnQgc2hpZnQ7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9pbnRlZ2VyKCZzaGlmdCwgKmFyZ3YsIDApKQorCQkJCXJldHVybiAtMTsKKwkJCXNlbC0+b2Zmc2hpZnQgPSBzaGlmdDsKKwkJCXNlbC0+ZmxhZ3MgfD0gVENfVTMyX1ZBUk9GRlNFVDsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiZWF0IikgPT0gMCkgeworCQkJc2VsLT5mbGFncyB8PSBUQ19VMzJfRUFUOworCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCX0KKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJKmFyZ2NfcCA9IGFyZ2M7CisJKmFyZ3ZfcCA9IGFyZ3Y7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfaGFzaGtleShpbnQgKmFyZ2NfcCwgY2hhciAqKiphcmd2X3AsIHN0cnVjdCB0Y191MzJfc2VsICpzZWwpCit7CisJaW50IGFyZ2MgPSAqYXJnY19wOworCWNoYXIgKiphcmd2ID0gKmFyZ3ZfcDsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAobWF0Y2hlcygqYXJndiwgIm1hc2siKSA9PSAwKSB7CisJCQlfX3UzMiBtYXNrOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTMyKCZtYXNrLCAqYXJndiwgMTYpKQorCQkJCXJldHVybiAtMTsKKwkJCXNlbC0+aG1hc2sgPSBodG9ubChtYXNrKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiYXQiKSA9PSAwKSB7CisJCQlpbnQgbnVtOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfaW50ZWdlcigmbnVtLCAqYXJndiwgMCkpCisJCQkJcmV0dXJuIC0xOworCQkJaWYgKG51bSU0KQorCQkJCXJldHVybiAtMTsKKwkJCXNlbC0+aG9mZiA9IG51bTsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCSphcmdjX3AgPSBhcmdjOworCSphcmd2X3AgPSBhcmd2OworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcmludF9pcHY0KEZJTEUgKmYsIGNvbnN0IHN0cnVjdCB0Y191MzJfa2V5ICprZXkpCit7CisJY2hhciBhYnVmWzI1Nl07CisKKwlzd2l0Y2ggKGtleS0+b2ZmKSB7CisJY2FzZSAwOgorCQlzd2l0Y2ggKG50b2hsKGtleS0+bWFzaykpIHsKKwkJY2FzZSAweDBmMDAwMDAwOgorCQkJZnByaW50ZihmLCAiXG4gIG1hdGNoIElQIGlobCAldSIsIG50b2hsKGtleS0+dmFsKSA+PiAyNCk7CisJCQlyZXR1cm47CisJCWNhc2UgMHgwMGZmMDAwMDoKKwkJCWZwcmludGYoZiwgIlxuICBtYXRjaCBJUCBkc2ZpZWxkICUjeCIsIG50b2hsKGtleS0+dmFsKSA+PiAxNik7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisJY2FzZSA4OgorCQlpZiAobnRvaGwoa2V5LT5tYXNrKSA9PSAweDAwZmYwMDAwKSB7CisJCQlmcHJpbnRmKGYsICJcbiAgbWF0Y2ggSVAgcHJvdG9jb2wgJWQiLCBudG9obChrZXktPnZhbCkgPj4gMTYpOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCWNhc2UgMTI6CisJY2FzZSAxNjogeworCQkJaW50IGJpdHMgPSBtYXNrMmJpdHMoa2V5LT5tYXNrKTsKKwkJCWlmIChiaXRzID49IDApIHsKKwkJCQlmcHJpbnRmKGYsICJcbiAgJXMgJXMvJWQiLAorCQkJCQlrZXktPm9mZiA9PSAxMiA/ICJtYXRjaCBJUCBzcmMiIDogIm1hdGNoIElQIGRzdCIsCisJCQkJCWluZXRfbnRvcChBRl9JTkVULCAma2V5LT52YWwsCisJCQkJCQkgIGFidWYsIHNpemVvZihhYnVmKSksCisJCQkJCWJpdHMpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgMjA6CisJCXN3aXRjaCAobnRvaGwoa2V5LT5tYXNrKSkgeworCQljYXNlIDB4MDAwMGZmZmY6CisJCQlmcHJpbnRmKGYsICJcbiAgbWF0Y2ggZHBvcnQgJXUiLAorCQkJCW50b2hsKGtleS0+dmFsKSAmIDB4ZmZmZik7CisJCQlyZXR1cm47CisJCWNhc2UgMHhmZmZmMDAwMDoKKwkJCWZwcmludGYoZiwgIlxuICBtYXRjaCBzcG9ydCAldSIsCisJCQkJbnRvaGwoa2V5LT52YWwpID4+IDE2KTsKKwkJCXJldHVybjsKKwkJY2FzZSAweGZmZmZmZmZmOgorCQkJZnByaW50ZihmLCAiXG4gIG1hdGNoIGRwb3J0ICV1LCBtYXRjaCBzcG9ydCAldSIsCisJCQkJbnRvaGwoa2V5LT52YWwpICYgMHhmZmZmLAorCQkJCW50b2hsKGtleS0+dmFsKSA+PiAxNik7CisKKwkJCXJldHVybjsKKwkJfQorCQkvKiBYWFg6IERlZmF1bHQgcHJpbnRfcmF3ICovCisJfQorfQorCitzdGF0aWMgdm9pZCBwcmludF9pcHY2KEZJTEUgKmYsIGNvbnN0IHN0cnVjdCB0Y191MzJfa2V5ICprZXkpCit7CisJY2hhciBhYnVmWzI1Nl07CisKKwlzd2l0Y2ggKGtleS0+b2ZmKSB7CisJY2FzZSAwOgorCQlzd2l0Y2ggKG50b2hsKGtleS0+bWFzaykpIHsKKwkJY2FzZSAweDBmMDAwMDAwOgorCQkJZnByaW50ZihmLCAiXG4gIG1hdGNoIElQIGlobCAldSIsIG50b2hsKGtleS0+dmFsKSA+PiAyNCk7CisJCQlyZXR1cm47CisJCWNhc2UgMHgwMGZmMDAwMDoKKwkJCWZwcmludGYoZiwgIlxuICBtYXRjaCBJUCBkc2ZpZWxkICUjeCIsIG50b2hsKGtleS0+dmFsKSA+PiAxNik7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisJY2FzZSA4OgorCQlpZiAobnRvaGwoa2V5LT5tYXNrKSA9PSAweDAwZmYwMDAwKSB7CisJCQlmcHJpbnRmKGYsICJcbiAgbWF0Y2ggSVAgcHJvdG9jb2wgJWQiLCBudG9obChrZXktPnZhbCkgPj4gMTYpOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCWNhc2UgMTI6CisJY2FzZSAxNjogeworCQkJaW50IGJpdHMgPSBtYXNrMmJpdHMoa2V5LT5tYXNrKTsKKwkJCWlmIChiaXRzID49IDApIHsKKwkJCQlmcHJpbnRmKGYsICJcbiAgJXMgJXMvJWQiLAorCQkJCQlrZXktPm9mZiA9PSAxMiA/ICJtYXRjaCBJUCBzcmMiIDogIm1hdGNoIElQIGRzdCIsCisJCQkJCWluZXRfbnRvcChBRl9JTkVULCAma2V5LT52YWwsCisJCQkJCQkgIGFidWYsIHNpemVvZihhYnVmKSksCisJCQkJCWJpdHMpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgMjA6CisJCXN3aXRjaCAobnRvaGwoa2V5LT5tYXNrKSkgeworCQljYXNlIDB4MDAwMGZmZmY6CisJCQlmcHJpbnRmKGYsICJcbiAgbWF0Y2ggc3BvcnQgJXUiLAorCQkJCW50b2hsKGtleS0+dmFsKSAmIDB4ZmZmZik7CisJCQlyZXR1cm47CisJCWNhc2UgMHhmZmZmMDAwMDoKKwkJCWZwcmludGYoZiwgIlxuICBtYXRjaCBkcG9ydCAldSIsCisJCQkJbnRvaGwoa2V5LT52YWwpID4+IDE2KTsKKwkJCXJldHVybjsKKwkJY2FzZSAweGZmZmZmZmZmOgorCQkJZnByaW50ZihmLCAiXG4gIG1hdGNoIHNwb3J0ICV1LCBtYXRjaCBkcG9ydCAldSIsCisJCQkJbnRvaGwoa2V5LT52YWwpICYgMHhmZmZmLAorCQkJCW50b2hsKGtleS0+dmFsKSA+PiAxNik7CisKKwkJCXJldHVybjsKKwkJfQorCQkvKiBYWFg6IERlZmF1bHQgcHJpbnRfcmF3ICovCisJfQorfQorCitzdGF0aWMgdm9pZCBwcmludF9yYXcoRklMRSAqZiwgY29uc3Qgc3RydWN0IHRjX3UzMl9rZXkgKmtleSkKK3sKKwlmcHJpbnRmKGYsICJcbiAgbWF0Y2ggJTA4eC8lMDh4IGF0ICVzJWQiLAorCQkodW5zaWduZWQgaW50KW50b2hsKGtleS0+dmFsKSwKKwkJKHVuc2lnbmVkIGludCludG9obChrZXktPm1hc2spLAorCQlrZXktPm9mZm1hc2sgPyAibmV4dGhkcisiIDogIiIsCisJCWtleS0+b2ZmKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJX191MTYgcHJvdG87CisJX191MTYgcGFkOworCXZvaWQgKCpwcHJpbnRlcikoRklMRSAqZiwgY29uc3Qgc3RydWN0IHRjX3UzMl9rZXkgKmtleSk7Cit9IHUzMl9wcHJpbnRlcnNbXSA9IHsKKwl7MCwgCSAgIDAsIHByaW50X3Jhd30sCisJe0VUSF9QX0lQLCAwLCBwcmludF9pcHY0fSwKKwl7RVRIX1BfSVBWNiwgMCwgcHJpbnRfaXB2Nn0sCit9OworCitzdGF0aWMgdm9pZCBzaG93X2tleXMoRklMRSAqZiwgY29uc3Qgc3RydWN0IHRjX3UzMl9rZXkgKmtleSkKK3sKKwlpbnQgaSA9IDA7CisKKwlpZiAoIXNob3dfcHJldHR5KQorCQlnb3RvIHNob3dfazsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodTMyX3BwcmludGVycykgLyBzaXplb2YodTMyX3BwcmludGVyc1swXSk7IGkrKykgeworCQlpZiAodTMyX3BwcmludGVyc1tpXS5wcm90byA9PSBudG9ocyhmX3Byb3RvKSkgeworc2hvd19rOgorCQkJdTMyX3BwcmludGVyc1tpXS5wcHJpbnRlcihmLCBrZXkpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaSA9IDA7CisJZ290byBzaG93X2s7Cit9CisKK3N0YXRpYyBpbnQgdTMyX3BhcnNlX29wdChzdHJ1Y3QgZmlsdGVyX3V0aWwgKnF1LCBjaGFyICpoYW5kbGUsCisJCQkgaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJc3RydWN0IHsKKwkJc3RydWN0IHRjX3UzMl9zZWwgc2VsOworCQlzdHJ1Y3QgdGNfdTMyX2tleSBrZXlzWzEyOF07CisJfSBzZWw7CisJc3RydWN0IHRjbXNnICp0ID0gTkxNU0dfREFUQShuKTsKKwlzdHJ1Y3QgcnRhdHRyICp0YWlsOworCWludCBzZWxfb2sgPSAwLCB0ZXJtaW5hbF9vayA9IDA7CisJaW50IHNhbXBsZV9vayA9IDA7CisJX191MzIgaHRpZCA9IDA7CisJX191MzIgb3JkZXIgPSAwOworCisJbWVtc2V0KCZzZWwsIDAsIHNpemVvZihzZWwpKTsKKworCWlmIChoYW5kbGUgJiYgZ2V0X3UzMl9oYW5kbGUoJnQtPnRjbV9oYW5kbGUsIGhhbmRsZSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIGZpbHRlciBJRFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoYXJnYyA9PSAwKQorCQlyZXR1cm4gMDsKKworCXRhaWwgPSBOTE1TR19UQUlMKG4pOworCWFkZGF0dHJfbChuLCBNQVhfTVNHLCBUQ0FfT1BUSU9OUywgTlVMTCwgMCk7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJtYXRjaCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocGFyc2Vfc2VsZWN0b3IoJmFyZ2MsICZhcmd2LCAmc2VsLnNlbCwgbikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJtYXRjaFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlzZWxfb2srKzsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJvZmZzZXQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHBhcnNlX29mZnNldCgmYXJnYywgJmFyZ3YsICZzZWwuc2VsKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcIm9mZnNldFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiaGFzaGtleSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocGFyc2VfaGFzaGtleSgmYXJnYywgJmFyZ3YsICZzZWwuc2VsKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImhhc2hrZXlcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImNsYXNzaWQiKSA9PSAwIHx8CisJCQkgICBzdHJjbXAoKmFyZ3YsICJmbG93aWQiKSA9PSAwKSB7CisJCQl1bnNpZ25lZCBoYW5kbGU7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF90Y19jbGFzc2lkKCZoYW5kbGUsICphcmd2KSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImNsYXNzaWRcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYWRkYXR0cl9sKG4sIE1BWF9NU0csIFRDQV9VMzJfQ0xBU1NJRCwgJmhhbmRsZSwgNCk7CisJCQlzZWwuc2VsLmZsYWdzIHw9IFRDX1UzMl9URVJNSU5BTDsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiZGl2aXNvciIpID09IDApIHsKKwkJCXVuc2lnbmVkIGRpdmlzb3I7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91bnNpZ25lZCgmZGl2aXNvciwgKmFyZ3YsIDApIHx8CisJCQkgICAgZGl2aXNvciA9PSAwIHx8CisJCQkgICAgZGl2aXNvciA+IDB4MTAwIHx8ICgoZGl2aXNvciAtIDEpICYgZGl2aXNvcikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJkaXZpc29yXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWFkZGF0dHJfbChuLCBNQVhfTVNHLCBUQ0FfVTMyX0RJVklTT1IsICZkaXZpc29yLCA0KTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAib3JkZXIiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJm9yZGVyLCAqYXJndiwgMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJvcmRlclwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibGluayIpID09IDApIHsKKwkJCXVuc2lnbmVkIGhhbmRsZTsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMl9oYW5kbGUoJmhhbmRsZSwgKmFyZ3YpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwibGlua1wiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAoaGFuZGxlICYmIFRDX1UzMl9OT0RFKGhhbmRsZSkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlwibGlua1wiIG11c3QgYmUgYSBoYXNoIHRhYmxlLlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYWRkYXR0cl9sKG4sIE1BWF9NU0csIFRDQV9VMzJfTElOSywgJmhhbmRsZSwgNCk7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaHQiKSA9PSAwKSB7CisJCQl1bnNpZ25lZCBoYW5kbGU7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzJfaGFuZGxlKCZoYW5kbGUsICphcmd2KSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImh0XCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChoYW5kbGUgJiYgVENfVTMyX05PREUoaGFuZGxlKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiXCJodFwiIG11c3QgYmUgYSBoYXNoIHRhYmxlLlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKHNhbXBsZV9vaykKKwkJCQlodGlkID0gKGh0aWQgJiAweEZGMDAwKSB8IChoYW5kbGUgJiAweEZGRjAwMDAwKTsKKwkJCWVsc2UKKwkJCQlodGlkID0gKGhhbmRsZSAmIDB4RkZGRkYwMDApOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInNhbXBsZSIpID09IDApIHsKKwkJCV9fdTMyIGhhc2g7CisJCQl1bnNpZ25lZCBkaXZpc29yID0gMHgxMDA7CisKKwkJCXN0cnVjdCB7CisJCQkJc3RydWN0IHRjX3UzMl9zZWwgc2VsOworCQkJCXN0cnVjdCB0Y191MzJfa2V5IGtleXNbNF07CisJCQl9IHNlbDI7CisJCQltZW1zZXQoJnNlbDIsIDAsIHNpemVvZihzZWwyKSk7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHBhcnNlX3NlbGVjdG9yKCZhcmdjLCAmYXJndiwgJnNlbDIuc2VsLCBuKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcInNhbXBsZVwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAoc2VsMi5zZWwubmtleXMgIT0gMSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiXCJzYW1wbGVcIiBtdXN0IGNvbnRhaW4iCisJCQkJCSIgZXhhY3RseSBPTkUga2V5LlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKCphcmd2ICE9IDAgJiYgc3RyY21wKCphcmd2LCAiZGl2aXNvciIpID09IDApIHsKKwkJCQlORVhUX0FSRygpOworCQkJCWlmIChnZXRfdW5zaWduZWQoJmRpdmlzb3IsICphcmd2LCAwKSB8fCBkaXZpc29yID09IDAgfHwKKwkJCQkgICAgZGl2aXNvciA+IDB4MTAwIHx8ICgoZGl2aXNvciAtIDEpICYgZGl2aXNvcikpIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIHNhbXBsZSBcImRpdmlzb3JcIlxuIik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJTkVYVF9BUkcoKTsKKwkJCX0KKwkJCWhhc2ggPSBzZWwyLnNlbC5rZXlzWzBdLnZhbCAmIHNlbDIuc2VsLmtleXNbMF0ubWFzazsKKwkJCWhhc2ggXj0gaGFzaCA+PiAxNjsKKwkJCWhhc2ggXj0gaGFzaCA+PiA4OworCQkJaHRpZCA9ICgoaGFzaCAlIGRpdmlzb3IpIDw8IDEyKSB8IChodGlkICYgMHhGRkYwMDAwMCk7CisJCQlzYW1wbGVfb2sgPSAxOworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaW5kZXYiKSA9PSAwKSB7CisJCQljaGFyIGluZFtJRk5BTVNJWiArIDFdOworCQkJbWVtc2V0KGluZCwgMCwgc2l6ZW9mIChpbmQpKTsKKwkJCWFyZ2MtLTsKKwkJCWFyZ3YrKzsKKwkJCWlmIChhcmdjIDwgMSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBpbmRldlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJc3RybmNweShpbmQsICphcmd2LCBzaXplb2YgKGluZCkgLSAxKTsKKwkJCWFkZGF0dHJfbChuLCBNQVhfTVNHLCBUQ0FfVTMyX0lOREVWLCBpbmQsIHN0cmxlbihpbmQpICsgMSk7CisKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiYWN0aW9uIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChwYXJzZV9hY3Rpb24oJmFyZ2MsICZhcmd2LCBUQ0FfVTMyX0FDVCwgbikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJhY3Rpb25cIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJdGVybWluYWxfb2srKzsKKwkJCWNvbnRpbnVlOworCisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInBvbGljZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocGFyc2VfcG9saWNlKCZhcmdjLCAmYXJndiwgVENBX1UzMl9QT0xJQ0UsIG4pKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwicG9saWNlXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXRlcm1pbmFsX29rKys7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJXaGF0IGlzIFwiJXNcIj9cbiIsICphcmd2KTsKKwkJCWV4cGxhaW4oKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisKKwkvKiBXZSBkb250IG5lY2Vzc2FyaWx5IG5lZWQgY2xhc3MvZmxvd2lkcyAqLworCWlmICh0ZXJtaW5hbF9vaykKKwkJc2VsLnNlbC5mbGFncyB8PSBUQ19VMzJfVEVSTUlOQUw7CisKKwlpZiAob3JkZXIpIHsKKwkJaWYgKFRDX1UzMl9OT0RFKHQtPnRjbV9oYW5kbGUpICYmIG9yZGVyICE9IFRDX1UzMl9OT0RFKHQtPnRjbV9oYW5kbGUpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlwib3JkZXJcIiBjb250cmFkaWN0cyBcImhhbmRsZVwiXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQl0LT50Y21faGFuZGxlIHw9IG9yZGVyOworCX0KKworCWlmIChodGlkKQorCQlhZGRhdHRyX2wobiwgTUFYX01TRywgVENBX1UzMl9IQVNILCAmaHRpZCwgNCk7CisJaWYgKHNlbF9vaykKKwkJYWRkYXR0cl9sKG4sIE1BWF9NU0csIFRDQV9VMzJfU0VMLCAmc2VsLAorCQkJICBzaXplb2Yoc2VsLnNlbCkgKyBzZWwuc2VsLm5rZXlzICogc2l6ZW9mKHN0cnVjdCB0Y191MzJfa2V5KSk7CisJdGFpbC0+cnRhX2xlbiA9ICh2b2lkICopIE5MTVNHX1RBSUwobikgLSAodm9pZCAqKSB0YWlsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHUzMl9wcmludF9vcHQoc3RydWN0IGZpbHRlcl91dGlsICpxdSwgRklMRSAqZiwgc3RydWN0IHJ0YXR0ciAqb3B0LAorCQkJIF9fdTMyIGhhbmRsZSkKK3sKKwlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfVTMyX01BWCArIDFdOworCXN0cnVjdCB0Y191MzJfc2VsICpzZWwgPSBOVUxMOworCXN0cnVjdCB0Y191MzJfcGNudCAqcGYgPSBOVUxMOworCisJaWYgKG9wdCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXBhcnNlX3J0YXR0cl9uZXN0ZWQodGIsIFRDQV9VMzJfTUFYLCBvcHQpOworCisJaWYgKGhhbmRsZSkgeworCQlTUFJJTlRfQlVGKGIxKTsKKwkJZnByaW50ZihmLCAiZmggJXMgIiwgc3ByaW50X3UzMl9oYW5kbGUoaGFuZGxlLCBiMSkpOworCX0KKwlpZiAoVENfVTMyX05PREUoaGFuZGxlKSkgeworCQlmcHJpbnRmKGYsICJvcmRlciAlZCAiLCBUQ19VMzJfTk9ERShoYW5kbGUpKTsKKwl9CisKKwlpZiAodGJbVENBX1UzMl9TRUxdKSB7CisJCWlmIChSVEFfUEFZTE9BRCh0YltUQ0FfVTMyX1NFTF0pICA8IHNpemVvZigqc2VsKSkKKwkJCXJldHVybiAtMTsKKworCQlzZWwgPSBSVEFfREFUQSh0YltUQ0FfVTMyX1NFTF0pOworCX0KKworCWlmICh0YltUQ0FfVTMyX0RJVklTT1JdKSB7CisJCWZwcmludGYoZiwgImh0IGRpdmlzb3IgJWQgIiwgcnRhX2dldGF0dHJfdTMyKHRiW1RDQV9VMzJfRElWSVNPUl0pKTsKKwl9IGVsc2UgaWYgKHRiW1RDQV9VMzJfSEFTSF0pIHsKKwkJX191MzIgaHRpZCA9IHJ0YV9nZXRhdHRyX3UzMih0YltUQ0FfVTMyX0hBU0hdKTsKKwkJZnByaW50ZihmLCAia2V5IGh0ICV4IGJrdCAleCAiLCBUQ19VMzJfVVNFUkhUSUQoaHRpZCksCisJCQlUQ19VMzJfSEFTSChodGlkKSk7CisJfSBlbHNlIHsKKwkJZnByaW50ZihmLCAiPz8/ICIpOworCX0KKwlpZiAodGJbVENBX1UzMl9DTEFTU0lEXSkgeworCQlTUFJJTlRfQlVGKGIxKTsKKwkJZnByaW50ZihmLCAiJXNmbG93aWQgJXMgIiwKKwkJCSFzZWwgfHwgIShzZWwtPmZsYWdzICYgVENfVTMyX1RFUk1JTkFMKSA/ICIqIiA6ICIiLAorCQkJc3ByaW50X3RjX2NsYXNzaWQocnRhX2dldGF0dHJfdTMyKHRiW1RDQV9VMzJfQ0xBU1NJRF0pLCBiMSkpOworCX0gZWxzZSBpZiAoc2VsICYmIHNlbC0+ZmxhZ3MgJiBUQ19VMzJfVEVSTUlOQUwpIHsKKwkJZnByaW50ZihmLCAidGVybWluYWwgZmxvd2lkID8/PyAiKTsKKwl9CisJaWYgKHRiW1RDQV9VMzJfTElOS10pIHsKKwkJU1BSSU5UX0JVRihiMSk7CisJCWZwcmludGYoZiwgImxpbmsgJXMgIiwKKwkJCXNwcmludF91MzJfaGFuZGxlKHJ0YV9nZXRhdHRyX3UzMih0YltUQ0FfVTMyX0xJTktdKSwgYjEpKTsKKwl9CisKKwlpZiAodGJbVENBX1UzMl9QQ05UXSkgeworCQlpZiAoUlRBX1BBWUxPQUQodGJbVENBX1UzMl9QQ05UXSkgIDwgc2l6ZW9mKCpwZikpIHsKKwkJCWZwcmludGYoZiwgIkJyb2tlbiBwZXJmIGNvdW50ZXJzIFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJcGYgPSBSVEFfREFUQSh0YltUQ0FfVTMyX1BDTlRdKTsKKwl9CisKKwlpZiAoc2VsICYmIHNob3dfc3RhdHMgJiYgTlVMTCAhPSBwZikKKwkJZnByaW50ZihmLCAiIChydWxlIGhpdCAlbGx1IHN1Y2Nlc3MgJWxsdSkiLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgcGYtPnJjbnQsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKSBwZi0+cmhpdCk7CisKKwlpZiAodGJbVENBX1UzMl9NQVJLXSkgeworCQlzdHJ1Y3QgdGNfdTMyX21hcmsgKm1hcmsgPSBSVEFfREFUQSh0YltUQ0FfVTMyX01BUktdKTsKKwkJaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9VMzJfTUFSS10pIDwgc2l6ZW9mKCptYXJrKSkgeworCQkJZnByaW50ZihmLCAiXG4gIEludmFsaWQgbWFyayAoa2VybmVsJmlwcm91dGUyIG1pc21hdGNoKVxuIik7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKGYsICJcbiAgbWFyayAweCUwNHggMHglMDR4IChzdWNjZXNzICVkKSIsCisJCQkJbWFyay0+dmFsLCBtYXJrLT5tYXNrLCBtYXJrLT5zdWNjZXNzKTsKKwkJfQorCX0KKworCWlmIChzZWwpIHsKKwkJaWYgKHNlbC0+bmtleXMpIHsKKwkJCWludCBpOworCQkJZm9yIChpPTA7IGk8c2VsLT5ua2V5czsgaSsrKSB7CisJCQkJc2hvd19rZXlzKGYsIHNlbC0+a2V5cyArIGkpOworCQkJCWlmIChzaG93X3N0YXRzICYmIE5VTEwgIT0gcGYpCisJCQkJCWZwcmludGYoZiwgIiAoc3VjY2VzcyAlbGx1ICkgIiwKKwkJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIHBmLT5rY250c1tpXSk7CisJCQl9CisJCX0KKworCQlpZiAoc2VsLT5mbGFncyAmIChUQ19VMzJfVkFST0ZGU0VUIHwgVENfVTMyX09GRlNFVCkpIHsKKwkJCWZwcmludGYoZiwgIlxuICAgIG9mZnNldCAiKTsKKwkJCWlmIChzZWwtPmZsYWdzICYgVENfVTMyX1ZBUk9GRlNFVCkKKwkJCQlmcHJpbnRmKGYsICIlMDR4Pj4lZCBhdCAlZCAiLAorCQkJCQludG9ocyhzZWwtPm9mZm1hc2spLAorCQkJCQlzZWwtPm9mZnNoaWZ0LCAgc2VsLT5vZmZvZmYpOworCQkJaWYgKHNlbC0+b2ZmKQorCQkJCWZwcmludGYoZiwgInBsdXMgJWQgIiwgc2VsLT5vZmYpOworCQl9CisJCWlmIChzZWwtPmZsYWdzICYgVENfVTMyX0VBVCkKKwkJCWZwcmludGYoZiwgIiBlYXQgIik7CisKKwkJaWYgKHNlbC0+aG1hc2spIHsKKwkJCWZwcmludGYoZiwgIlxuICAgIGhhc2ggbWFzayAlMDh4IGF0ICVkICIsCisJCQkJKHVuc2lnbmVkIGludClodG9ubChzZWwtPmhtYXNrKSwgc2VsLT5ob2ZmKTsKKwkJfQorCX0KKworCWlmICh0YltUQ0FfVTMyX1BPTElDRV0pIHsKKwkJZnByaW50ZihmLCAiXG4iKTsKKwkJdGNfcHJpbnRfcG9saWNlKGYsIHRiW1RDQV9VMzJfUE9MSUNFXSk7CisJfQorCWlmICh0YltUQ0FfVTMyX0lOREVWXSkgeworCQlzdHJ1Y3QgcnRhdHRyICppZGV2ID0gdGJbVENBX1UzMl9JTkRFVl07CisJCWZwcmludGYoZiwgIlxuICBpbnB1dCBkZXYgJXNcbiIsIHJ0YV9nZXRhdHRyX3N0cihpZGV2KSk7CisJfQorCWlmICh0YltUQ0FfVTMyX0FDVF0pIHsKKwkJdGNfcHJpbnRfYWN0aW9uKGYsIHRiW1RDQV9VMzJfQUNUXSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBmaWx0ZXJfdXRpbCB1MzJfZmlsdGVyX3V0aWwgPSB7CisJLmlkID0gInUzMiIsCisJLnBhcnNlX2ZvcHQgPSB1MzJfcGFyc2Vfb3B0LAorCS5wcmludF9mb3B0ID0gdTMyX3ByaW50X29wdCwKK307CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy9tX2FjdGlvbi5jIGIvaXByb3V0ZTIvdGMvbV9hY3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDNkNTFlCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGMvbV9hY3Rpb24uYwpAQCAtMCwwICsxLDY2MyBAQAorLyoKKyAqIG1fYWN0aW9uLmMJCUFjdGlvbiBNYW5hZ2VtZW50CisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIGRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6ICBKIEhhZGkgU2FsaW0gKGhhZGlAY3liZXJ1cy5jYSkKKyAqCisgKiBUT0RPOgorICogLSBwYXJzZSB0byBiZSBwYXNzZWQgYSBmaWxlZGVzY3JpcHRvciBmb3IgbG9nZ2luZyBwdXJwb3NlcworICoKKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0Y19jb21tb24uaCIKKyNpbmNsdWRlICJ0Y191dGlsLmgiCisKK3N0YXRpYyBzdHJ1Y3QgYWN0aW9uX3V0aWwgKiBhY3Rpb25fbGlzdDsKKworI2lmZGVmIEFORFJPSUQKK2V4dGVybiBzdHJ1Y3QgYWN0aW9uX3V0aWwgbWlycmVkX2FjdGlvbl91dGlsOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfR0FDVAoraW50IGdhY3RfbGQgPSAwIDsgLy9mdWNraW4gYmFja3dhcmQgY29tcGF0aWJpbGl0eQorI2VuZGlmCitpbnQgdGFiX2ZsdXNoID0gMDsKKworc3RhdGljIHZvaWQgYWN0X3VzYWdlKHZvaWQpCit7CisJLypYWFg6IEluIHRoZSBuZWFyIGZ1dHVyZSBhZGQgYSBhY3Rpb24tPnByaW50X2hlbHAgdG8gaW1wcm92ZQorCSAqIHVzYWJpbGl0eQorCSAqIFRoaXMgd291bGQgbWVhbiBuZXcgdGMgd2lsbCBub3QgYmUgYmFja3dhcmQgY29tcGF0aWJsZQorCSAqIHdpdGggYW55IGFjdGlvbiAuc28gZnJvbSB0aGUgb2xkIGRheXMuIEJ1dCBpZiBzb21lb25lIHJlYWxseQorCSAqIGRvZXMgdGhhdCwgdGhleSB3b3VsZCBrbm93IGhvdyB0byBmaXggdGhpcyAuLgorCSAqCisJKi8KKwlmcHJpbnRmIChzdGRlcnIsICJ1c2FnZTogdGMgYWN0aW9ucyA8QUNUU1BFQ09QPipcbiIpOworCWZwcmludGYoc3RkZXJyLAorCQkiV2hlcmU6IFx0QUNUU1BFQ09QIDo9IEFDUiB8IEdEIHwgRkxcbiIKKwkJCSJcdEFDUiA6PSBhZGQgfCBjaGFuZ2UgfCByZXBsYWNlIDxBQ1RTUEVDPiogXG4iCisJCQkiXHRHRCA6PSBnZXQgfCBkZWxldGUgfCA8QUNUSVNQRUM+KlxuIgorCQkJIlx0RkwgOj0gbHMgfCBsaXN0IHwgZmx1c2ggfCA8QUNUTkFNRVNQRUM+XG4iCisJCQkiXHRBQ1ROQU1FU1BFQyA6PSAgYWN0aW9uIDxBQ1ROQU1FPlxuIgorCQkJIlx0QUNUSVNQRUMgOj0gPEFDVE5BTUVTUEVDPiA8SU5ERVhTUEVDPlxuIgorCQkJIlx0QUNUU1BFQyA6PSBhY3Rpb24gPEFDVERFVEFJTD4gW0lOREVYU1BFQ11cbiIKKwkJCSJcdElOREVYU1BFQyA6PSBpbmRleCA8MzIgYml0IGluZGV4dmFsdWU+XG4iCisJCQkiXHRBQ1RERVRBSUwgOj0gPEFDVE5BTUU+IDxBQ1RQQVJBTVM+XG4iCisJCQkiXHRcdEV4YW1wbGUgQUNUTkFNRSBpcyBnYWN0LCBtaXJyZWQsIGJwZiwgZXRjXG4iCisJCQkiXHRcdEVhY2ggYWN0aW9uIGhhcyBpdHMgb3duIHBhcmFtZXRlcnMgKEFDVFBBUkFNUylcbiIKKwkJCSJcbiIpOworCisJZXhpdCgtMSk7Cit9CisKK3N0YXRpYyBpbnQgcHJpbnRfbm9hb3B0KHN0cnVjdCBhY3Rpb25fdXRpbCAqYXUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKm9wdCkKK3sKKwlpZiAob3B0ICYmIFJUQV9QQVlMT0FEKG9wdCkpCisJCWZwcmludGYoZiwgIltVbmtub3duIGFjdGlvbiwgb3B0bGVuPSV1XSAiLAorCQkJKHVuc2lnbmVkKSBSVEFfUEFZTE9BRChvcHQpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9ub2FvcHQoc3RydWN0IGFjdGlvbl91dGlsICphdSwgaW50ICphcmdjX3AsIGNoYXIgKioqYXJndl9wLCBpbnQgY29kZSwgc3RydWN0IG5sbXNnaGRyICpuKQoreworCWludCBhcmdjID0gKmFyZ2NfcDsKKwljaGFyICoqYXJndiA9ICphcmd2X3A7CisKKwlpZiAoYXJnYykgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gYWN0aW9uIFwiJXNcIiwgaGVuY2Ugb3B0aW9uIFwiJXNcIiBpcyB1bnBhcnNhYmxlXG4iLCBhdS0+aWQsICphcmd2KTsKKwl9IGVsc2UgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gYWN0aW9uIFwiJXNcIlxuIiwgYXUtPmlkKTsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgc3RydWN0IGFjdGlvbl91dGlsICpnZXRfYWN0aW9uX2tpbmQoY2hhciAqc3RyKQoreworI2lmZGVmIEFORFJPSUQKKwlpZiAoIXN0cmNtcChzdHIsICJtaXJyZWQiKSkgeworCQlyZXR1cm4gJm1pcnJlZF9hY3Rpb25fdXRpbDsKKwl9IGVsc2UgeworCQlmcHJpbnRmKHN0ZGVyciwgIkFuZHJvaWQgZG9lcyBub3Qgc3VwcG9ydCBhY3Rpb24gJyVzJyIsIHN0cik7CisJCXJldHVybiBOVUxMOworCX0KKyNlbmRpZgorCXN0YXRpYyB2b2lkICphQk9EWTsKKwl2b2lkICpkbGg7CisJY2hhciBidWZbMjU2XTsKKwlzdHJ1Y3QgYWN0aW9uX3V0aWwgKmE7CisjaWZkZWYgQ09ORklHX0dBQ1QKKwlpbnQgbG9va2VkNGdhY3QgPSAwOworcmVzdGFydF9zOgorI2VuZGlmCisJZm9yIChhID0gYWN0aW9uX2xpc3Q7IGE7IGEgPSBhLT5uZXh0KSB7CisJCWlmIChzdHJjbXAoYS0+aWQsIHN0cikgPT0gMCkKKwkJCXJldHVybiBhOworCX0KKworCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcy9tXyVzLnNvIiwgZ2V0X3RjX2xpYigpLCBzdHIpOworCWRsaCA9IGRsb3BlbihidWYsIFJUTERfTEFaWSB8IFJUTERfR0xPQkFMKTsKKwlpZiAoZGxoID09IE5VTEwpIHsKKwkJZGxoID0gYUJPRFk7CisJCWlmIChkbGggPT0gTlVMTCkgeworCQkJZGxoID0gYUJPRFkgPSBkbG9wZW4oTlVMTCwgUlRMRF9MQVpZKTsKKwkJCWlmIChkbGggPT0gTlVMTCkKKwkJCQlnb3RvIG5vZXhpc3Q7CisJCX0KKwl9CisKKwlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXNfYWN0aW9uX3V0aWwiLCBzdHIpOworCWEgPSBkbHN5bShkbGgsIGJ1Zik7CisJaWYgKGEgPT0gTlVMTCkKKwkJZ290byBub2V4aXN0OworCityZWc6CisJYS0+bmV4dCA9IGFjdGlvbl9saXN0OworCWFjdGlvbl9saXN0ID0gYTsKKwlyZXR1cm4gYTsKKworbm9leGlzdDoKKyNpZmRlZiBDT05GSUdfR0FDVAorCWlmICghbG9va2VkNGdhY3QpIHsKKwkJbG9va2VkNGdhY3QgPSAxOworCQlzdHJjcHkoc3RyLCJnYWN0Iik7CisJCWdvdG8gcmVzdGFydF9zOworCX0KKyNlbmRpZgorCWEgPSBtYWxsb2Moc2l6ZW9mKCphKSk7CisJaWYgKGEpIHsKKwkJbWVtc2V0KGEsIDAsIHNpemVvZigqYSkpOworCQlzdHJuY3B5KGEtPmlkLCAibm9hY3QiLCAxNSk7CisJCWEtPnBhcnNlX2FvcHQgPSBwYXJzZV9ub2FvcHQ7CisJCWEtPnByaW50X2FvcHQgPSBwcmludF9ub2FvcHQ7CisJCWdvdG8gcmVnOworCX0KKwlyZXR1cm4gYTsKK30KKworc3RhdGljIGludAorbmV3X2NtZChjaGFyICoqYXJndikKK3sKKwlpZiAoKG1hdGNoZXMoKmFyZ3YsICJjaGFuZ2UiKSA9PSAwKSB8fAorCQkobWF0Y2hlcygqYXJndiwgInJlcGxhY2UiKSA9PSAwKXx8CisJCShtYXRjaGVzKCphcmd2LCAiZGVsZXRlIikgPT0gMCl8fAorCQkobWF0Y2hlcygqYXJndiwgImdldCIpID09IDApfHwKKwkJKG1hdGNoZXMoKmFyZ3YsICJhZGQiKSA9PSAwKSkKKwkJCXJldHVybiAxOworCisJcmV0dXJuIDA7CisKK30KKworaW50CitwYXJzZV9hY3Rpb24oaW50ICphcmdjX3AsIGNoYXIgKioqYXJndl9wLCBpbnQgdGNhX2lkLCBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJaW50IGFyZ2MgPSAqYXJnY19wOworCWNoYXIgKiphcmd2ID0gKmFyZ3ZfcDsKKwlzdHJ1Y3QgcnRhdHRyICp0YWlsLCAqdGFpbDI7CisJY2hhciBrWzE2XTsKKwlpbnQgb2sgPSAwOworCWludCBlYXAgPSAwOyAvKiBleHBlY3QgYWN0aW9uIHBhcmFtZXRlcnMgKi8KKworCWludCByZXQgPSAwOworCWludCBwcmlvID0gMDsKKworCWlmIChhcmdjIDw9IDApCisJCXJldHVybiAtMTsKKworCXRhaWwgPSB0YWlsMiA9IE5MTVNHX1RBSUwobik7CisKKwlhZGRhdHRyX2wobiwgTUFYX01TRywgdGNhX2lkLCBOVUxMLCAwKTsKKworCXdoaWxlIChhcmdjID4gMCkgeworCisJCW1lbXNldChrLCAwLCBzaXplb2YgKGspKTsKKworCQlpZiAoc3RyY21wKCphcmd2LCAiYWN0aW9uIikgPT0gMCApIHsKKwkJCWFyZ2MtLTsKKwkJCWFyZ3YrKzsKKwkJCWVhcCA9IDE7CisjaWZkZWYgQ09ORklHX0dBQ1QKKwkJCWlmICghZ2FjdF9sZCkgeworCQkJCWdldF9hY3Rpb25fa2luZCgiZ2FjdCIpOworCQkJfQorI2VuZGlmCisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJmbG93aWQiKSA9PSAwKSB7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJjbGFzc2lkIikgPT0gMCkgeworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaGVscCIpID09IDApIHsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIGlmIChuZXdfY21kKGFyZ3YpKSB7CisJCQlnb3RvIGRvbmUwOworCQl9IGVsc2UgeworCQkJc3RydWN0IGFjdGlvbl91dGlsICphID0gTlVMTDsKKwkJCXN0cm5jcHkoaywgKmFyZ3YsIHNpemVvZiAoaykgLSAxKTsKKwkJCWVhcCA9IDA7CisJCQlpZiAoYXJnYyA+IDAgKSB7CisJCQkJYSA9IGdldF9hY3Rpb25fa2luZChrKTsKKwkJCX0gZWxzZSB7Citkb25lMDoKKwkJCQlpZiAob2spCisJCQkJCWJyZWFrOworCQkJCWVsc2UKKwkJCQkJZ290byBkb25lOworCQkJfQorCisJCQlpZiAoTlVMTCA9PSBhKSB7CisJCQkJZ290byBiYWRfdmFsOworCQkJfQorCisJCQl0YWlsID0gTkxNU0dfVEFJTChuKTsKKwkJCWFkZGF0dHJfbChuLCBNQVhfTVNHLCArK3ByaW8sIE5VTEwsIDApOworCQkJYWRkYXR0cl9sKG4sIE1BWF9NU0csIFRDQV9BQ1RfS0lORCwgaywgc3RybGVuKGspICsgMSk7CisKKwkJCXJldCA9IGEtPnBhcnNlX2FvcHQoYSwmYXJnYywgJmFyZ3YsIFRDQV9BQ1RfT1BUSU9OUywgbik7CisKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsImJhZCBhY3Rpb24gcGFyc2luZ1xuIik7CisJCQkJZ290byBiYWRfdmFsOworCQkJfQorCQkJdGFpbC0+cnRhX2xlbiA9ICh2b2lkICopIE5MTVNHX1RBSUwobikgLSAodm9pZCAqKSB0YWlsOworCQkJb2srKzsKKwkJfQorCisJfQorCisJaWYgKGVhcCA+IDApIHsKKwkJZnByaW50ZihzdGRlcnIsImJhZCBhY3Rpb24gZW1wdHkgJWRcbiIsZWFwKTsKKwkJZ290byBiYWRfdmFsOworCX0KKworCXRhaWwyLT5ydGFfbGVuID0gKHZvaWQgKikgTkxNU0dfVEFJTChuKSAtICh2b2lkICopIHRhaWwyOworCitkb25lOgorCSphcmdjX3AgPSBhcmdjOworCSphcmd2X3AgPSBhcmd2OworCXJldHVybiAwOworYmFkX3ZhbDoKKwkvKiBubyBuZWVkIHRvIHVuZG8gdGhpbmdzLCByZXR1cm5pbmcgZnJvbSBoZXJlIHNob3VsZAorCSAqIGNhdXNlIGVub3VnaCBwYWluICovCisJZnByaW50ZihzdGRlcnIsICJwYXJzZV9hY3Rpb246IGJhZCB2YWx1ZSAoJWQ6JXMpIVxuIixhcmdjLCphcmd2KTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQKK3RjX3ByaW50X29uZV9hY3Rpb24oRklMRSAqIGYsIHN0cnVjdCBydGF0dHIgKmFyZykKK3sKKworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9BQ1RfTUFYICsgMV07CisJaW50IGVyciA9IDA7CisJc3RydWN0IGFjdGlvbl91dGlsICphID0gTlVMTDsKKworCWlmIChhcmcgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJcGFyc2VfcnRhdHRyX25lc3RlZCh0YiwgVENBX0FDVF9NQVgsIGFyZyk7CisKKwlpZiAodGJbVENBX0FDVF9LSU5EXSA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTlVMTCBBY3Rpb24hXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCisJYSA9IGdldF9hY3Rpb25fa2luZChSVEFfREFUQSh0YltUQ0FfQUNUX0tJTkRdKSk7CisJaWYgKE5VTEwgPT0gYSkKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IGEtPnByaW50X2FvcHQoYSwgZiwgdGJbVENBX0FDVF9PUFRJT05TXSk7CisKKwlpZiAoMCA+IGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChzaG93X3N0YXRzICYmIHRiW1RDQV9BQ1RfU1RBVFNdKSB7CisJCWZwcmludGYoZiwgIlx0QWN0aW9uIHN0YXRpc3RpY3M6XG4iKTsKKwkJcHJpbnRfdGNzdGF0czJfYXR0cihmLCB0YltUQ0FfQUNUX1NUQVRTXSwgIlx0IiwgTlVMTCk7CisJCWZwcmludGYoZiwgIlxuIik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3RjX3ByaW50X2FjdGlvbl9mbHVzaChGSUxFICpmLCBjb25zdCBzdHJ1Y3QgcnRhdHRyICphcmcpCit7CisKKwlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfTUFYICsgMV07CisJaW50IGVyciA9IDA7CisJc3RydWN0IGFjdGlvbl91dGlsICphID0gTlVMTDsKKwlfX3UzMiAqZGVsZXRlX2NvdW50ID0gMDsKKworCXBhcnNlX3J0YXR0cl9uZXN0ZWQodGIsIFRDQV9NQVgsIGFyZyk7CisKKwlpZiAodGJbVENBX0tJTkRdID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJOVUxMIEFjdGlvbiFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJYSA9IGdldF9hY3Rpb25fa2luZChSVEFfREFUQSh0YltUQ0FfS0lORF0pKTsKKwlpZiAoTlVMTCA9PSBhKQorCQlyZXR1cm4gZXJyOworCisJZGVsZXRlX2NvdW50ID0gUlRBX0RBVEEodGJbVENBX0ZDTlRdKTsKKwlmcHJpbnRmKGYsIiAlcyAoJWQgZW50cmllcylcbiIsIGEtPmlkLCAqZGVsZXRlX2NvdW50KTsKKwl0YWJfZmx1c2ggPSAwOworCXJldHVybiAwOworfQorCitpbnQKK3RjX3ByaW50X2FjdGlvbihGSUxFICpmLCBjb25zdCBzdHJ1Y3QgcnRhdHRyICphcmcpCit7CisKKwlpbnQgaTsKKwlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfQUNUX01BWF9QUklPICsgMV07CisKKwlpZiAoYXJnID09IE5VTEwpCisJCXJldHVybiAwOworCisJcGFyc2VfcnRhdHRyX25lc3RlZCh0YiwgVENBX0FDVF9NQVhfUFJJTywgYXJnKTsKKworCWlmICh0YWJfZmx1c2ggJiYgTlVMTCAhPSB0YlswXSAgJiYgTlVMTCA9PSB0YlsxXSkKKwkJcmV0dXJuIHRjX3ByaW50X2FjdGlvbl9mbHVzaChmLCB0YlswXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVENBX0FDVF9NQVhfUFJJTzsgaSsrKSB7CisJCWlmICh0YltpXSkgeworCQkJZnByaW50ZihmLCAiXG5cdGFjdGlvbiBvcmRlciAlZDogIiwgaSk7CisJCQlpZiAoMCA+IHRjX3ByaW50X29uZV9hY3Rpb24oZiwgdGJbaV0pKSB7CisJCQkJZnByaW50ZihmLCAiRXJyb3IgcHJpbnRpbmcgYWN0aW9uXG4iKTsKKwkJCX0KKwkJfQorCisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBwcmludF9hY3Rpb24oY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8sCisJCQkgICBzdHJ1Y3Qgbmxtc2doZHIgKm4sCisJCQkgICB2b2lkICphcmcpCit7CisJRklMRSAqZnAgPSAoRklMRSopYXJnOworCXN0cnVjdCB0Y2Ftc2cgKnQgPSBOTE1TR19EQVRBKG4pOworCWludCBsZW4gPSBuLT5ubG1zZ19sZW47CisJc3RydWN0IHJ0YXR0ciAqIHRiW1RDQUFfTUFYKzFdOworCisJbGVuIC09IE5MTVNHX0xFTkdUSChzaXplb2YoKnQpKTsKKworCWlmIChsZW4gPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiV3JvbmcgbGVuICVkXG4iLCBsZW4pOworCQlyZXR1cm4gLTE7CisJfQorCisJcGFyc2VfcnRhdHRyKHRiLCBUQ0FBX01BWCwgVEFfUlRBKHQpLCBsZW4pOworCisJaWYgKE5VTEwgPT0gdGJbVENBX0FDVF9UQUJdKSB7CisJCWlmIChuLT5ubG1zZ190eXBlICE9IFJUTV9HRVRBQ1RJT04pCisJCQlmcHJpbnRmKHN0ZGVyciwgInByaW50X2FjdGlvbjogTlVMTCBraW5kXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChuLT5ubG1zZ190eXBlID09IFJUTV9ERUxBQ1RJT04pIHsKKwkJaWYgKG4tPm5sbXNnX2ZsYWdzICYgTkxNX0ZfUk9PVCkgeworCQkJZnByaW50ZihmcCwgIkZsdXNoZWQgdGFibGUgIik7CisJCQl0YWJfZmx1c2ggPSAxOworCQl9IGVsc2UgeworCQkJZnByaW50ZihmcCwgImRlbGV0ZWQgYWN0aW9uICIpOworCQl9CisJfQorCisJaWYgKG4tPm5sbXNnX3R5cGUgPT0gUlRNX05FV0FDVElPTikKKwkJZnByaW50ZihmcCwgIkFkZGVkIGFjdGlvbiAiKTsKKwl0Y19wcmludF9hY3Rpb24oZnAsIHRiW1RDQV9BQ1RfVEFCXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0Y19hY3Rpb25fZ2QoaW50IGNtZCwgdW5zaWduZWQgZmxhZ3MsIGludCAqYXJnY19wLCBjaGFyICoqKmFyZ3ZfcCkKK3sKKwljaGFyIGtbMTZdOworCXN0cnVjdCBhY3Rpb25fdXRpbCAqYSA9IE5VTEw7CisJaW50IGFyZ2MgPSAqYXJnY19wOworCWNoYXIgKiphcmd2ID0gKmFyZ3ZfcDsKKwlpbnQgcHJpbyA9IDA7CisJaW50IHJldCA9IDA7CisJX191MzIgaTsKKwlzdHJ1Y3Qgc29ja2FkZHJfbmwgbmxhZGRyOworCXN0cnVjdCBydGF0dHIgKnRhaWw7CisJc3RydWN0IHJ0YXR0ciAqdGFpbDI7CisJc3RydWN0IG5sbXNnaGRyICphbnMgPSBOVUxMOworCisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyICAgICAgICAgbjsKKwkJc3RydWN0IHRjYW1zZyAgICAgICAgICAgdDsKKwkJY2hhciAgICAgICAgICAgICAgICAgICAgYnVmW01BWF9NU0ddOworCX0gcmVxOworCisJcmVxLnQudGNhX2ZhbWlseSA9IEFGX1VOU1BFQzsKKworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisKKwltZW1zZXQoJm5sYWRkciwgMCwgc2l6ZW9mKG5sYWRkcikpOworCW5sYWRkci5ubF9mYW1pbHkgPSBBRl9ORVRMSU5LOworCisJcmVxLm4ubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgdGNhbXNnKSk7CisJcmVxLm4ubmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUfGZsYWdzOworCXJlcS5uLm5sbXNnX3R5cGUgPSBjbWQ7CisJYXJnYyAtPTE7CisJYXJndiArPTE7CisKKworCXRhaWwgPSBOTE1TR19UQUlMKCZyZXEubik7CisJYWRkYXR0cl9sKCZyZXEubiwgTUFYX01TRywgVENBX0FDVF9UQUIsIE5VTEwsIDApOworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChzdHJjbXAoKmFyZ3YsICJhY3Rpb24iKSA9PSAwICkgeworCQkJYXJnYy0tOworCQkJYXJndisrOworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaGVscCIpID09IDApIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXN0cm5jcHkoaywgKmFyZ3YsIHNpemVvZiAoaykgLSAxKTsKKwkJYSA9IGdldF9hY3Rpb25fa2luZChrKTsKKwkJaWYgKE5VTEwgPT0gYSkgeworCQkJZnByaW50ZihzdGRlcnIsICJFcnJvcjogbm9uIGV4aXN0ZW50IGFjdGlvbjogJXNcbiIsayk7CisJCQlyZXQgPSAtMTsKKwkJCWdvdG8gYmFkX3ZhbDsKKwkJfQorCQlpZiAoc3RyY21wKGEtPmlkLCBrKSAhPSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBub24gZXhpc3RlbnQgYWN0aW9uOiAlc1xuIixrKTsKKwkJCXJldCA9IC0xOworCQkJZ290byBiYWRfdmFsOworCQl9CisKKwkJYXJnYyAtPTE7CisJCWFyZ3YgKz0xOworCQlpZiAoYXJnYyA8PSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBubyBpbmRleCBzcGVjaWZpZWQgYWN0aW9uOiAlc1xuIixrKTsKKwkJCXJldCA9IC0xOworCQkJZ290byBiYWRfdmFsOworCQl9CisKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJpbmRleCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmaSwgKmFyZ3YsIDEwKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImluZGV4XCJcbiIpOworCQkJCXJldCA9IC0xOworCQkJCWdvdG8gYmFkX3ZhbDsKKwkJCX0KKwkJCWFyZ2MgLT0xOworCQkJYXJndiArPTE7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBubyBpbmRleCBzcGVjaWZpZWQgYWN0aW9uOiAlc1xuIixrKTsKKwkJCXJldCA9IC0xOworCQkJZ290byBiYWRfdmFsOworCQl9CisKKwkJdGFpbDIgPSBOTE1TR19UQUlMKCZyZXEubik7CisJCWFkZGF0dHJfbCgmcmVxLm4sIE1BWF9NU0csICsrcHJpbywgTlVMTCwgMCk7CisJCWFkZGF0dHJfbCgmcmVxLm4sIE1BWF9NU0csIFRDQV9BQ1RfS0lORCwgaywgc3RybGVuKGspICsgMSk7CisJCWFkZGF0dHIzMigmcmVxLm4sIE1BWF9NU0csIFRDQV9BQ1RfSU5ERVgsIGkpOworCQl0YWlsMi0+cnRhX2xlbiA9ICh2b2lkICopIE5MTVNHX1RBSUwoJnJlcS5uKSAtICh2b2lkICopIHRhaWwyOworCisJfQorCisJdGFpbC0+cnRhX2xlbiA9ICh2b2lkICopIE5MTVNHX1RBSUwoJnJlcS5uKSAtICh2b2lkICopIHRhaWw7CisKKwlyZXEubi5ubG1zZ19zZXEgPSBydGguZHVtcCA9ICsrcnRoLnNlcTsKKwlpZiAoY21kID09IFJUTV9HRVRBQ1RJT04pCisJCWFucyA9ICZyZXEubjsKKworCWlmIChydG5sX3RhbGsoJnJ0aCwgJnJlcS5uLCBhbnMsIE1BWF9NU0cpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIldlIGhhdmUgYW4gZXJyb3IgdGFsa2luZyB0byB0aGUga2VybmVsXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGFucyAmJiBwcmludF9hY3Rpb24oTlVMTCwgJnJlcS5uLCAodm9pZCopc3Rkb3V0KSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJEdW1wIHRlcm1pbmF0ZWRcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkqYXJnY19wID0gYXJnYzsKKwkqYXJndl9wID0gYXJndjsKK2JhZF92YWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0Y19hY3Rpb25fbW9kaWZ5KGludCBjbWQsIHVuc2lnbmVkIGZsYWdzLCBpbnQgKmFyZ2NfcCwgY2hhciAqKiphcmd2X3ApCit7CisJaW50IGFyZ2MgPSAqYXJnY19wOworCWNoYXIgKiphcmd2ID0gKmFyZ3ZfcDsKKwlpbnQgcmV0ID0gMDsKKworCXN0cnVjdCBydGF0dHIgKnRhaWw7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyICAgICAgICAgbjsKKwkJc3RydWN0IHRjYW1zZyAgICAgICAgICAgdDsKKwkJY2hhciAgICAgICAgICAgICAgICAgICAgYnVmW01BWF9NU0ddOworCX0gcmVxOworCisJcmVxLnQudGNhX2ZhbWlseSA9IEFGX1VOU1BFQzsKKworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisKKwlyZXEubi5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCB0Y2Ftc2cpKTsKKwlyZXEubi5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1R8ZmxhZ3M7CisJcmVxLm4ubmxtc2dfdHlwZSA9IGNtZDsKKwl0YWlsID0gTkxNU0dfVEFJTCgmcmVxLm4pOworCWFyZ2MgLT0xOworCWFyZ3YgKz0xOworCWlmIChwYXJzZV9hY3Rpb24oJmFyZ2MsICZhcmd2LCBUQ0FfQUNUX1RBQiwgJnJlcS5uKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJhY3Rpb25cIlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJdGFpbC0+cnRhX2xlbiA9ICh2b2lkICopIE5MTVNHX1RBSUwoJnJlcS5uKSAtICh2b2lkICopIHRhaWw7CisKKwlpZiAocnRubF90YWxrKCZydGgsICZyZXEubiwgTlVMTCwgMCkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiV2UgaGF2ZSBhbiBlcnJvciB0YWxraW5nIHRvIHRoZSBrZXJuZWxcbiIpOworCQlyZXQgPSAtMTsKKwl9CisKKwkqYXJnY19wID0gYXJnYzsKKwkqYXJndl9wID0gYXJndjsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGNfYWN0X2xpc3Rfb3JfZmx1c2goaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBpbnQgZXZlbnQpCit7CisJaW50IHJldCA9IDAsIHByaW8gPSAwLCBtc2dfc2l6ZSA9IDA7CisJY2hhciBrWzE2XTsKKwlzdHJ1Y3QgcnRhdHRyICp0YWlsLCp0YWlsMjsKKwlzdHJ1Y3QgYWN0aW9uX3V0aWwgKmEgPSBOVUxMOworCXN0cnVjdCB7CisJCXN0cnVjdCBubG1zZ2hkciAgICAgICAgIG47CisJCXN0cnVjdCB0Y2Ftc2cgICAgICAgICAgIHQ7CisJCWNoYXIgICAgICAgICAgICAgICAgICAgIGJ1ZltNQVhfTVNHXTsKKwl9IHJlcTsKKworCXJlcS50LnRjYV9mYW1pbHkgPSBBRl9VTlNQRUM7CisKKwltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCisJcmVxLm4ubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgdGNhbXNnKSk7CisKKwl0YWlsID0gTkxNU0dfVEFJTCgmcmVxLm4pOworCWFkZGF0dHJfbCgmcmVxLm4sIE1BWF9NU0csIFRDQV9BQ1RfVEFCLCBOVUxMLCAwKTsKKwl0YWlsMiA9IE5MTVNHX1RBSUwoJnJlcS5uKTsKKworCXN0cm5jcHkoaywgKmFyZ3YsIHNpemVvZiAoaykgLSAxKTsKKyNpZmRlZiBDT05GSUdfR0FDVAorCWlmICghZ2FjdF9sZCkgeworCQlnZXRfYWN0aW9uX2tpbmQoImdhY3QiKTsKKwl9CisjZW5kaWYKKwlhID0gZ2V0X2FjdGlvbl9raW5kKGspOworCWlmIChOVUxMID09IGEpIHsKKwkJZnByaW50ZihzdGRlcnIsImJhZCBhY3Rpb24gJXNcbiIsayk7CisJCWdvdG8gYmFkX3ZhbDsKKwl9CisJaWYgKHN0cmNtcChhLT5pZCwgaykgIT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwiYmFkIGFjdGlvbiAlc1xuIixrKTsKKwkJZ290byBiYWRfdmFsOworCX0KKwlzdHJuY3B5KGssICphcmd2LCBzaXplb2YgKGspIC0gMSk7CisKKwlhZGRhdHRyX2woJnJlcS5uLCBNQVhfTVNHLCArK3ByaW8sIE5VTEwsIDApOworCWFkZGF0dHJfbCgmcmVxLm4sIE1BWF9NU0csIFRDQV9BQ1RfS0lORCwgaywgc3RybGVuKGspICsgMSk7CisJdGFpbDItPnJ0YV9sZW4gPSAodm9pZCAqKSBOTE1TR19UQUlMKCZyZXEubikgLSAodm9pZCAqKSB0YWlsMjsKKwl0YWlsLT5ydGFfbGVuID0gKHZvaWQgKikgTkxNU0dfVEFJTCgmcmVxLm4pIC0gKHZvaWQgKikgdGFpbDsKKworCW1zZ19zaXplID0gTkxNU0dfQUxJR04ocmVxLm4ubmxtc2dfbGVuKSAtIE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3Qgbmxtc2doZHIpKTsKKworCWlmIChldmVudCA9PSBSVE1fR0VUQUNUSU9OKSB7CisJCWlmIChydG5sX2R1bXBfcmVxdWVzdCgmcnRoLCBldmVudCwgKHZvaWQgKikmcmVxLnQsIG1zZ19zaXplKSA8IDApIHsKKwkJCXBlcnJvcigiQ2Fubm90IHNlbmQgZHVtcCByZXF1ZXN0Iik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlyZXQgPSBydG5sX2R1bXBfZmlsdGVyKCZydGgsIHByaW50X2FjdGlvbiwgc3Rkb3V0KTsKKwl9CisKKwlpZiAoZXZlbnQgPT0gUlRNX0RFTEFDVElPTikgeworCQlyZXEubi5ubG1zZ19sZW4gPSBOTE1TR19BTElHTihyZXEubi5ubG1zZ19sZW4pOworCQlyZXEubi5ubG1zZ190eXBlID0gUlRNX0RFTEFDVElPTjsKKwkJcmVxLm4ubmxtc2dfZmxhZ3MgfD0gTkxNX0ZfUk9PVDsKKwkJcmVxLm4ubmxtc2dfZmxhZ3MgfD0gTkxNX0ZfUkVRVUVTVDsKKwkJaWYgKHJ0bmxfdGFsaygmcnRoLCAmcmVxLm4sIE5VTEwsIDApIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJXZSBoYXZlIGFuIGVycm9yIGZsdXNoaW5nXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisKKwl9CisKK2JhZF92YWw6CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZG9fYWN0aW9uKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKworCWludCByZXQgPSAwOworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJhZGQiKSA9PSAwKSB7CisJCQlyZXQgPSAgdGNfYWN0aW9uX21vZGlmeShSVE1fTkVXQUNUSU9OLCBOTE1fRl9FWENMfE5MTV9GX0NSRUFURSwgJmFyZ2MsICZhcmd2KTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiY2hhbmdlIikgPT0gMCB8fAorCQkJICBtYXRjaGVzKCphcmd2LCAicmVwbGFjZSIpID09IDApIHsKKwkJCXJldCA9IHRjX2FjdGlvbl9tb2RpZnkoUlRNX05FV0FDVElPTiwgTkxNX0ZfQ1JFQVRFfE5MTV9GX1JFUExBQ0UsICZhcmdjLCAmYXJndik7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImRlbGV0ZSIpID09IDApIHsKKwkJCWFyZ2MgLT0xOworCQkJYXJndiArPTE7CisJCQlyZXQgPSB0Y19hY3Rpb25fZ2QoUlRNX0RFTEFDVElPTiwgMCwgICZhcmdjLCAmYXJndik7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImdldCIpID09IDApIHsKKwkJCWFyZ2MgLT0xOworCQkJYXJndiArPTE7CisJCQlyZXQgPSB0Y19hY3Rpb25fZ2QoUlRNX0dFVEFDVElPTiwgMCwgICZhcmdjLCAmYXJndik7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImxpc3QiKSA9PSAwIHx8IG1hdGNoZXMoKmFyZ3YsICJzaG93IikgPT0gMAorCQkJCQkJfHwgbWF0Y2hlcygqYXJndiwgImxzdCIpID09IDApIHsKKwkJCWlmIChhcmdjIDw9IDIpIHsKKwkJCQlhY3RfdXNhZ2UoKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlyZXR1cm4gdGNfYWN0X2xpc3Rfb3JfZmx1c2goYXJnYy0yLCBhcmd2KzIsIFJUTV9HRVRBQ1RJT04pOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJmbHVzaCIpID09IDApIHsKKwkJCWlmIChhcmdjIDw9IDIpIHsKKwkJCQlhY3RfdXNhZ2UoKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlyZXR1cm4gdGNfYWN0X2xpc3Rfb3JfZmx1c2goYXJnYy0yLCBhcmd2KzIsIFJUTV9ERUxBQ1RJT04pOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJYWN0X3VzYWdlKCk7CisJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSB7CisKKwkJCXJldCA9IC0xOworCQl9CisKKwkJaWYgKHJldCA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQ29tbWFuZCBcIiVzXCIgaXMgdW5rbm93biwgdHJ5IFwidGMgYWN0aW9ucyBoZWxwXCIuXG4iLCAqYXJndik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RjL21fYnBmLmMgYi9pcHJvdXRlMi90Yy9tX2JwZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZTJmYTUKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy9tX2JwZi5jCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogbV9icGYuYwlCUEYgYmFzZWQgYWN0aW9uIG1vZHVsZQorICoKKyAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6ICAgICBKaXJpIFBpcmtvIDxqaXJpQHJlc251bGxpLnVzPgorICogICAgICAgICAgICAgIERhbmllbCBCb3JrbWFubiA8ZGFuaWVsQGlvZ2VhcmJveC5uZXQ+CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxsaW51eC9icGYuaD4KKyNpbmNsdWRlIDxsaW51eC90Y19hY3QvdGNfYnBmLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInRjX3V0aWwuaCIKKyNpbmNsdWRlICJ0Y19icGYuaCIKKworc3RhdGljIGNvbnN0IGVudW0gYnBmX3Byb2dfdHlwZSBicGZfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU0NIRURfQUNUOworCitzdGF0aWMgY29uc3QgaW50IG5sYV90YmxbQlBGX05MQV9NQVhdID0geworCVtCUEZfTkxBX09QU19MRU5dCT0gVENBX0FDVF9CUEZfT1BTX0xFTiwKKwlbQlBGX05MQV9PUFNdCQk9IFRDQV9BQ1RfQlBGX09QUywKKwlbQlBGX05MQV9GRF0JCT0gVENBX0FDVF9CUEZfRkQsCisJW0JQRl9OTEFfTkFNRV0JCT0gVENBX0FDVF9CUEZfTkFNRSwKK307CisKK3N0YXRpYyB2b2lkIGV4cGxhaW4odm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAuLi4gYnBmIC4uLiBbIGluZGV4IElOREVYIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIkJQRiB1c2UgY2FzZTpcbiIpOworCWZwcmludGYoc3RkZXJyLCAiIGJ5dGVjb2RlIEJQRl9CWVRFQ09ERVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgYnl0ZWNvZGUtZmlsZSBGSUxFXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJZnByaW50ZihzdGRlcnIsICJlQlBGIHVzZSBjYXNlOlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgb2JqZWN0LWZpbGUgRklMRSBbIHNlY3Rpb24gQUNUX05BTUUgXSBbIGV4cG9ydCBVRFNfRklMRSBdIik7CisJZnByaW50ZihzdGRlcnIsICIgWyB2ZXJib3NlIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiIG9iamVjdC1waW5uZWQgRklMRVxuIik7CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworCWZwcmludGYoc3RkZXJyLCAiV2hlcmUgQlBGX0JZVEVDT0RFIDo9IFwncyxjIHQgZiBrLGMgdCBmIGssYyB0IGYgaywuLi5cJ1xuIik7CisJZnByaW50ZihzdGRlcnIsICJjLHQsZixrIGFuZCBzIGFyZSBkZWNpbWFsczsgcyBkZW5vdGVzIG51bWJlciBvZiA0LXR1cGxlc1xuIik7CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworCWZwcmludGYoc3RkZXJyLCAiV2hlcmUgRklMRSBwb2ludHMgdG8gYSBmaWxlIGNvbnRhaW5pbmcgdGhlIEJQRl9CWVRFQ09ERSBzdHJpbmcsXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgImFuIEVMRiBmaWxlIGNvbnRhaW5pbmcgZUJQRiBtYXAgZGVmaW5pdGlvbnMgYW5kIGJ5dGVjb2RlLCBvciBhXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgInBpbm5lZCBlQlBGIHByb2dyYW0uXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJZnByaW50ZihzdGRlcnIsICJXaGVyZSBBQ1RfTkFNRSByZWZlcnMgdG8gdGhlIHNlY3Rpb24gbmFtZSBjb250YWluaW5nIHRoZVxuIik7CisJZnByaW50ZihzdGRlcnIsICJhY3Rpb24gKGRlZmF1bHQgXCclc1wnKS5cbiIsIGJwZl9kZWZhdWx0X3NlY3Rpb24oYnBmX3R5cGUpKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJZnByaW50ZihzdGRlcnIsICJXaGVyZSBVRFNfRklMRSBwb2ludHMgdG8gYSB1bml4IGRvbWFpbiBzb2NrZXQgZmlsZSBpbiBvcmRlclxuIik7CisJZnByaW50ZihzdGRlcnIsICJ0byBoYW5kIG9mZiBjb250cm9sIG9mIGFsbCBjcmVhdGVkIGVCUEYgbWFwcyB0byBhbiBhZ2VudC5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIldoZXJlIG9wdGlvbmFsbHkgSU5ERVggcG9pbnRzIHRvIGFuIGV4aXN0aW5nIGFjdGlvbiwgb3JcbiIpOworCWZwcmludGYoc3RkZXJyLCAiZXhwbGljaXRseSBzcGVjaWZpZXMgYW4gYWN0aW9uIGluZGV4IHVwb24gY3JlYXRpb24uXG4iKTsKK30KKworc3RhdGljIGludCBicGZfcGFyc2Vfb3B0KHN0cnVjdCBhY3Rpb25fdXRpbCAqYSwgaW50ICpwdHJfYXJnYywgY2hhciAqKipwdHJfYXJndiwKKwkJCSBpbnQgdGNhX2lkLCBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJY29uc3QgY2hhciAqYnBmX29iaiA9IE5VTEwsICpicGZfdWRzX25hbWUgPSBOVUxMOworCXN0cnVjdCB0Y19hY3RfYnBmIHBhcm07CisJYm9vbCBzZWVuX3J1biA9IGZhbHNlOworCXN0cnVjdCBydGF0dHIgKnRhaWw7CisJaW50IGFyZ2MsIHJldCA9IDA7CisJY2hhciAqKmFyZ3Y7CisKKwlhcmd2ID0gKnB0cl9hcmd2OworCWFyZ2MgPSAqcHRyX2FyZ2M7CisKKwlpZiAobWF0Y2hlcygqYXJndiwgImJwZiIpICE9IDApCisJCXJldHVybiAtMTsKKworCU5FWFRfQVJHKCk7CisKKwl0YWlsID0gTkxNU0dfVEFJTChuKTsKKwlhZGRhdHRyX2wobiwgTUFYX01TRywgdGNhX2lkLCBOVUxMLCAwKTsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAobWF0Y2hlcygqYXJndiwgInJ1biIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CitvcHRfYnBmOgorCQkJc2Vlbl9ydW4gPSB0cnVlOworCQkJaWYgKGJwZl9wYXJzZV9jb21tb24oJmFyZ2MsICZhcmd2LCBubGFfdGJsLCBicGZfdHlwZSwKKwkJCQkJICAgICAmYnBmX29iaiwgJmJwZl91ZHNfbmFtZSwgbikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byByZXRyaWV2ZSAoZSlCUEYgZGF0YSFcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiaGVscCIpID09IDApIHsKKwkJCWV4cGxhaW4oKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiaW5kZXgiKSA9PSAwKSB7CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWlmICghc2Vlbl9ydW4pCisJCQkJZ290byBvcHRfYnBmOworCQkJYnJlYWs7CisJCX0KKworCQlORVhUX0FSR19GV0QoKTsKKwl9CisKKwltZW1zZXQoJnBhcm0sIDAsIHNpemVvZihwYXJtKSk7CisJcGFybS5hY3Rpb24gPSBUQ19BQ1RfUElQRTsKKworCWlmIChhcmdjKSB7CisJCWlmIChtYXRjaGVzKCphcmd2LCAicmVjbGFzc2lmeSIpID09IDApIHsKKwkJCXBhcm0uYWN0aW9uID0gVENfQUNUX1JFQ0xBU1NJRlk7CisJCQlORVhUX0FSR19GV0QoKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAicGlwZSIpID09IDApIHsKKwkJCXBhcm0uYWN0aW9uID0gVENfQUNUX1BJUEU7CisJCQlORVhUX0FSR19GV0QoKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiZHJvcCIpID09IDAgfHwKKwkJCSAgIG1hdGNoZXMoKmFyZ3YsICJzaG90IikgPT0gMCkgeworCQkJcGFybS5hY3Rpb24gPSBUQ19BQ1RfU0hPVDsKKwkJCU5FWFRfQVJHX0ZXRCgpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJjb250aW51ZSIpID09IDApIHsKKwkJCXBhcm0uYWN0aW9uID0gVENfQUNUX1VOU1BFQzsKKwkJCU5FWFRfQVJHX0ZXRCgpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJwYXNzIikgPT0gMCB8fAorCQkJICAgbWF0Y2hlcygqYXJndiwgIm9rIikgPT0gMCkgeworCQkJcGFybS5hY3Rpb24gPSBUQ19BQ1RfT0s7CisJCQlORVhUX0FSR19GV0QoKTsKKwkJfQorCX0KKworCWlmIChhcmdjKSB7CisJCWlmIChtYXRjaGVzKCphcmd2LCAiaW5kZXgiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJnBhcm0uaW5kZXgsICphcmd2LCAxMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgImJwZjogSWxsZWdhbCBcImluZGV4XCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKworCQkJTkVYVF9BUkdfRldEKCk7CisJCX0KKwl9CisKKwlhZGRhdHRyX2wobiwgTUFYX01TRywgVENBX0FDVF9CUEZfUEFSTVMsICZwYXJtLCBzaXplb2YocGFybSkpOworCXRhaWwtPnJ0YV9sZW4gPSAoY2hhciAqKU5MTVNHX1RBSUwobikgLSAoY2hhciAqKXRhaWw7CisKKwlpZiAoYnBmX3Vkc19uYW1lKQorCQlyZXQgPSBicGZfc2VuZF9tYXBfZmRzKGJwZl91ZHNfbmFtZSwgYnBmX29iaik7CisKKwkqcHRyX2FyZ2MgPSBhcmdjOworCSpwdHJfYXJndiA9IGFyZ3Y7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGJwZl9wcmludF9vcHQoc3RydWN0IGFjdGlvbl91dGlsICphdSwgRklMRSAqZiwgc3RydWN0IHJ0YXR0ciAqYXJnKQoreworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9BQ1RfQlBGX01BWCArIDFdOworCXN0cnVjdCB0Y19hY3RfYnBmICpwYXJtOworCVNQUklOVF9CVUYoYWN0aW9uX2J1Zik7CisKKwlpZiAoYXJnID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBhcnNlX3J0YXR0cl9uZXN0ZWQodGIsIFRDQV9BQ1RfQlBGX01BWCwgYXJnKTsKKworCWlmICghdGJbVENBX0FDVF9CUEZfUEFSTVNdKSB7CisJCWZwcmludGYoZiwgIltOVUxMIGJwZiBwYXJhbWV0ZXJzXSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcGFybSA9IFJUQV9EQVRBKHRiW1RDQV9BQ1RfQlBGX1BBUk1TXSk7CisJZnByaW50ZihmLCAiYnBmICIpOworCisJaWYgKHRiW1RDQV9BQ1RfQlBGX05BTUVdKQorCQlmcHJpbnRmKGYsICIlcyAiLCBydGFfZ2V0YXR0cl9zdHIodGJbVENBX0FDVF9CUEZfTkFNRV0pKTsKKwllbHNlIGlmICh0YltUQ0FfQUNUX0JQRl9GRF0pCisJCWZwcmludGYoZiwgInBmZCAldSAiLCBydGFfZ2V0YXR0cl91MzIodGJbVENBX0FDVF9CUEZfRkRdKSk7CisKKwlpZiAodGJbVENBX0FDVF9CUEZfT1BTXSAmJiB0YltUQ0FfQUNUX0JQRl9PUFNfTEVOXSkgeworCQlicGZfcHJpbnRfb3BzKGYsIHRiW1RDQV9BQ1RfQlBGX09QU10sCisJCQkgICAgICBydGFfZ2V0YXR0cl91MTYodGJbVENBX0FDVF9CUEZfT1BTX0xFTl0pKTsKKwkJZnByaW50ZihmLCAiICIpOworCX0KKworCWZwcmludGYoZiwgImRlZmF1bHQtYWN0aW9uICVzXG4iLCBhY3Rpb25fbjJhKHBhcm0tPmFjdGlvbiwgYWN0aW9uX2J1ZiwKKwkJc2l6ZW9mKGFjdGlvbl9idWYpKSk7CisJZnByaW50ZihmLCAiXHRpbmRleCAlZCByZWYgJWQgYmluZCAlZCIsIHBhcm0tPmluZGV4LCBwYXJtLT5yZWZjbnQsCisJCXBhcm0tPmJpbmRjbnQpOworCisJaWYgKHNob3dfc3RhdHMpIHsKKwkJaWYgKHRiW1RDQV9BQ1RfQlBGX1RNXSkgeworCQkJc3RydWN0IHRjZl90ICp0bSA9IFJUQV9EQVRBKHRiW1RDQV9BQ1RfQlBGX1RNXSk7CisJCQlwcmludF90bShmLCB0bSk7CisJCX0KKwl9CisKKwlmcHJpbnRmKGYsICJcbiAiKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGFjdGlvbl91dGlsIGJwZl9hY3Rpb25fdXRpbCA9IHsKKwkuaWQJCT0gImJwZiIsCisJLnBhcnNlX2FvcHQJPSBicGZfcGFyc2Vfb3B0LAorCS5wcmludF9hb3B0CT0gYnBmX3ByaW50X29wdCwKK307CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy9tX2Nvbm5tYXJrLmMgYi9pcHJvdXRlMi90Yy9tX2Nvbm5tYXJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk3NGM5YgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL21fY29ubm1hcmsuYwpAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIG1fY29ubm1hcmsuYwkJQ29ubmVjdGlvbiB0cmFja2luZyBtYXJraW5nIGltcG9ydAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBGZWxpeCBGaWV0a2F1IDxuYmRAb3BlbndydC5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcz4uCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0Y191dGlsLmgiCisjaW5jbHVkZSA8bGludXgvdGNfYWN0L3RjX2Nvbm5tYXJrLmg+CisKK3N0YXRpYyB2b2lkCitleHBsYWluKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogLi4uIGNvbm5tYXJrIFt6b25lIFpPTkVdIFtCUkFOQ0hdIFtpbmRleCA8SU5ERVg+XVxuIik7CisJZnByaW50ZihzdGRlcnIsICJ3aGVyZSA6XG4iCisJCSJcdFpPTkUgaXMgdGhlIGNvbm50cmFjayB6b25lXG4iCisJCSJcdEJSQU5DSCA6PSByZWNsYXNzaWZ5fHBpcGV8ZHJvcHxjb250aW51ZXxva1xuIik7Cit9CisKK3N0YXRpYyB2b2lkCit1c2FnZSh2b2lkKQoreworCWV4cGxhaW4oKTsKKwlleGl0KC0xKTsKK30KKworc3RhdGljIGludAorcGFyc2VfY29ubm1hcmsoc3RydWN0IGFjdGlvbl91dGlsICphLCBpbnQgKmFyZ2NfcCwgY2hhciAqKiphcmd2X3AsIGludCB0Y2FfaWQsCisJICAgICAgc3RydWN0IG5sbXNnaGRyICpuKQoreworCXN0cnVjdCB0Y19jb25ubWFyayBzZWwgPSB7fTsKKwljaGFyICoqYXJndiA9ICphcmd2X3A7CisJaW50IGFyZ2MgPSAqYXJnY19wOworCWludCBvayA9IDA7CisJc3RydWN0IHJ0YXR0ciAqdGFpbDsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAobWF0Y2hlcygqYXJndiwgImNvbm5tYXJrIikgPT0gMCkgeworCQkJb2sgPSAxOworCQkJYXJnYy0tOworCQkJYXJndisrOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJdXNhZ2UoKTsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisKKwl9CisKKwlpZiAoIW9rKSB7CisJCWV4cGxhaW4oKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChhcmdjKSB7CisJCWlmIChtYXRjaGVzKCphcmd2LCAiem9uZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UxNigmc2VsLnpvbmUsICphcmd2LCAxMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgInNpbXBsZTogSWxsZWdhbCBcImluZGV4XCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWFyZ2MtLTsKKwkJCWFyZ3YrKzsKKwkJfQorCX0KKworCXNlbC5hY3Rpb24gPSBUQ19BQ1RfUElQRTsKKwlpZiAoYXJnYykgeworCQlpZiAobWF0Y2hlcygqYXJndiwgInJlY2xhc3NpZnkiKSA9PSAwKSB7CisJCQlzZWwuYWN0aW9uID0gVENfQUNUX1JFQ0xBU1NJRlk7CisJCQlhcmdjLS07CisJCQlhcmd2Kys7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInBpcGUiKSA9PSAwKSB7CisJCQlzZWwuYWN0aW9uID0gVENfQUNUX1BJUEU7CisJCQlhcmdjLS07CisJCQlhcmd2Kys7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImRyb3AiKSA9PSAwIHx8CisJCQkgICBtYXRjaGVzKCphcmd2LCAic2hvdCIpID09IDApIHsKKwkJCXNlbC5hY3Rpb24gPSBUQ19BQ1RfU0hPVDsKKwkJCWFyZ2MtLTsKKwkJCWFyZ3YrKzsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiY29udGludWUiKSA9PSAwKSB7CisJCQlzZWwuYWN0aW9uID0gVENfQUNUX1VOU1BFQzsKKwkJCWFyZ2MtLTsKKwkJCWFyZ3YrKzsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAicGFzcyIpID09IDApIHsKKwkJCXNlbC5hY3Rpb24gPSBUQ19BQ1RfT0s7CisJCQlhcmdjLS07CisJCQlhcmd2Kys7CisJCX0KKwl9CisKKwlpZiAoYXJnYykgeworCQlpZiAobWF0Y2hlcygqYXJndiwgImluZGV4IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTMyKCZzZWwuaW5kZXgsICphcmd2LCAxMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgInNpbXBsZTogSWxsZWdhbCBcImluZGV4XCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWFyZ2MtLTsKKwkJCWFyZ3YrKzsKKwkJfQorCX0KKworCXRhaWwgPSBOTE1TR19UQUlMKG4pOworCWFkZGF0dHJfbChuLCBNQVhfTVNHLCB0Y2FfaWQsIE5VTEwsIDApOworCWFkZGF0dHJfbChuLCBNQVhfTVNHLCBUQ0FfQ09OTk1BUktfUEFSTVMsICZzZWwsIHNpemVvZihzZWwpKTsKKwl0YWlsLT5ydGFfbGVuID0gKGNoYXIgKilOTE1TR19UQUlMKG4pIC0gKGNoYXIgKil0YWlsOworCisJKmFyZ2NfcCA9IGFyZ2M7CisJKmFyZ3ZfcCA9IGFyZ3Y7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJpbnRfY29ubm1hcmsoc3RydWN0IGFjdGlvbl91dGlsICphdSwgRklMRSAqZiwgc3RydWN0IHJ0YXR0ciAqYXJnKQoreworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9DT05OTUFSS19NQVggKyAxXTsKKwlzdHJ1Y3QgdGNfY29ubm1hcmsgKmNpOworCisJaWYgKGFyZyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlwYXJzZV9ydGF0dHJfbmVzdGVkKHRiLCBUQ0FfQ09OTk1BUktfTUFYLCBhcmcpOworCWlmICh0YltUQ0FfQ09OTk1BUktfUEFSTVNdID09IE5VTEwpIHsKKwkJZnByaW50ZihmLCAiW05VTEwgY29ubm1hcmsgcGFyYW1ldGVyc10iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNpID0gUlRBX0RBVEEodGJbVENBX0NPTk5NQVJLX1BBUk1TXSk7CisKKwlmcHJpbnRmKGYsICIgY29ubm1hcmsgem9uZSAlZFxuIiwgY2ktPnpvbmUpOworCWZwcmludGYoZiwgIlx0IGluZGV4ICVkIHJlZiAlZCBiaW5kICVkIiwgY2ktPmluZGV4LAorCQljaS0+cmVmY250LCBjaS0+YmluZGNudCk7CisKKwlpZiAoc2hvd19zdGF0cykgeworCQlpZiAodGJbVENBX0NPTk5NQVJLX1RNXSkgeworCQkJc3RydWN0IHRjZl90ICp0bSA9IFJUQV9EQVRBKHRiW1RDQV9DT05OTUFSS19UTV0pOworCQkJcHJpbnRfdG0oZiwgdG0pOworCQl9CisJfQorCWZwcmludGYoZiwgIlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGFjdGlvbl91dGlsIGNvbm5tYXJrX2FjdGlvbl91dGlsID0geworCS5pZCA9ICJjb25ubWFyayIsCisJLnBhcnNlX2FvcHQgPSBwYXJzZV9jb25ubWFyaywKKwkucHJpbnRfYW9wdCA9IHByaW50X2Nvbm5tYXJrLAorfTsKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RjL21fY3N1bS5jIGIvaXByb3V0ZTIvdGMvbV9jc3VtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdkYTZmMAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL21fY3N1bS5jCkBAIC0wLDAgKzEsMjQ2IEBACisvKgorICogbV9jc3VtLmMJY2hlY2tzdW0gdXBkYXRpbmcgYWN0aW9uCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIGRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6IEdyZWdvaXJlIEJhcm9uIDxiYXJvbmNob25AbjdtbS5vcmc+CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxsaW51eC90Y19hY3QvdGNfY3N1bS5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0Y191dGlsLmgiCisKK3N0YXRpYyB2b2lkCitleHBsYWluKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogLi4uIGNzdW0gPFVQREFURT5cbiIKKwkJCSJXaGVyZTogVVBEQVRFIDo9IDxUQVJHRVQ+IFs8VVBEQVRFPl1cbiIKKwkJCSIgICAgICAgVEFSR0VUIDo9IHsgaXA0aCB8IGljbXAgfCBpZ21wIHwiCisJCQkJIiB0Y3AgfCB1ZHAgfCB1ZHBsaXRlIHwgPFNXRUVUUz4gfVxuIgorCQkJIiAgICAgICBTV0VFVFMgOj0geyBhbmQgfCBvciB8IFwnK1wnIH1cbiIpOworfQorCitzdGF0aWMgdm9pZAordXNhZ2Uodm9pZCkKK3sKKwlleHBsYWluKCk7CisJZXhpdCgtMSk7Cit9CisKK3N0YXRpYyBpbnQKK3BhcnNlX2NzdW1fYXJncyhpbnQgKmFyZ2NfcCwgY2hhciAqKiphcmd2X3AsIHN0cnVjdCB0Y19jc3VtICpzZWwpCit7CisJaW50IGFyZ2MgPSAqYXJnY19wOworCWNoYXIgKiphcmd2ID0gKmFyZ3ZfcDsKKworCWlmIChhcmdjIDw9IDApCisJCXJldHVybiAtMTsKKworCXdoaWxlKGFyZ2MgPiAwKSB7CisJCWlmICgobWF0Y2hlcygqYXJndiwgImlwaCIpID09IDApIHx8CisJCSAgICAobWF0Y2hlcygqYXJndiwgImlwNGgiKSA9PSAwKSB8fAorCQkgICAgKG1hdGNoZXMoKmFyZ3YsICJpcHY0aCIpID09IDApKQorCQkJc2VsLT51cGRhdGVfZmxhZ3MgfD0gVENBX0NTVU1fVVBEQVRFX0ZMQUdfSVBWNEhEUjsKKworCQllbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiaWNtcCIpID09IDApCisJCQlzZWwtPnVwZGF0ZV9mbGFncyB8PSBUQ0FfQ1NVTV9VUERBVEVfRkxBR19JQ01QOworCisJCWVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJpZ21wIikgPT0gMCkKKwkJCXNlbC0+dXBkYXRlX2ZsYWdzIHw9IFRDQV9DU1VNX1VQREFURV9GTEFHX0lHTVA7CisKKwkJZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInRjcCIpID09IDApCisJCQlzZWwtPnVwZGF0ZV9mbGFncyB8PSBUQ0FfQ1NVTV9VUERBVEVfRkxBR19UQ1A7CisKKwkJZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInVkcCIpID09IDApCisJCQlzZWwtPnVwZGF0ZV9mbGFncyB8PSBUQ0FfQ1NVTV9VUERBVEVfRkxBR19VRFA7CisKKwkJZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInVkcGxpdGUiKSA9PSAwKQorCQkJc2VsLT51cGRhdGVfZmxhZ3MgfD0gVENBX0NTVU1fVVBEQVRFX0ZMQUdfVURQTElURTsKKworCQllbHNlIGlmICgobWF0Y2hlcygqYXJndiwgImFuZCIpID09IDApIHx8CisJCQkgKG1hdGNoZXMoKmFyZ3YsICJvciIpID09IDApIHx8CisJCQkgKG1hdGNoZXMoKmFyZ3YsICIrIikgPT0gMCkpCisJCQk7IC8qIGp1c3QgaWdub3JlOiAuLi4gY3N1bSBpcGggYW5kIHRjcCBvciB1ZHAgKi8KKwkJZWxzZQorCQkJYnJlYWs7CisJCWFyZ2MtLTsKKwkJYXJndisrOworCX0KKworCSphcmdjX3AgPSBhcmdjOworCSphcmd2X3AgPSBhcmd2OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3BhcnNlX2NzdW0oc3RydWN0IGFjdGlvbl91dGlsICphLCBpbnQgKmFyZ2NfcCwKKwkgICBjaGFyICoqKmFyZ3ZfcCwgaW50IHRjYV9pZCwgc3RydWN0IG5sbXNnaGRyICpuKQoreworCXN0cnVjdCB0Y19jc3VtIHNlbDsKKworCWludCBhcmdjID0gKmFyZ2NfcDsKKwljaGFyICoqYXJndiA9ICphcmd2X3A7CisJaW50IG9rID0gMDsKKwlzdHJ1Y3QgcnRhdHRyICp0YWlsOworCisJbWVtc2V0KCZzZWwsIDAsIHNpemVvZihzZWwpKTsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAobWF0Y2hlcygqYXJndiwgImNzdW0iKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHBhcnNlX2NzdW1fYXJncygmYXJnYywgJmFyZ3YsICZzZWwpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIGNzdW0gY29uc3RydWN0ICglcylcbiIsCisJCQkJCSphcmd2KTsKKwkJCQlleHBsYWluKCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJb2srKzsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJdXNhZ2UoKTsKKwkJfQorCQllbHNlIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFvaykgeworCQlleHBsYWluKCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoc2VsLnVwZGF0ZV9mbGFncyA9PSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBjc3VtIGNvbnN0cnVjdCwgZW1wdHkgPFVQREFURT4gbGlzdFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoYXJnYykgeworCQlpZiAobWF0Y2hlcygqYXJndiwgInJlY2xhc3NpZnkiKSA9PSAwKSB7CisJCQlzZWwuYWN0aW9uID0gVENfQUNUX1JFQ0xBU1NJRlk7CisJCQlhcmdjLS07CisJCQlhcmd2Kys7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInBpcGUiKSA9PSAwKSB7CisJCQlzZWwuYWN0aW9uID0gVENfQUNUX1BJUEU7CisJCQlhcmdjLS07CisJCQlhcmd2Kys7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImRyb3AiKSA9PSAwIHx8CisJCQltYXRjaGVzKCphcmd2LCAic2hvdCIpID09IDApIHsKKwkJCXNlbC5hY3Rpb24gPSBUQ19BQ1RfU0hPVDsKKwkJCWFyZ2MtLTsKKwkJCWFyZ3YrKzsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiY29udGludWUiKSA9PSAwKSB7CisJCQlzZWwuYWN0aW9uID0gVENfQUNUX1VOU1BFQzsKKwkJCWFyZ2MtLTsKKwkJCWFyZ3YrKzsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAicGFzcyIpID09IDApIHsKKwkJCXNlbC5hY3Rpb24gPSBUQ19BQ1RfT0s7CisJCQlhcmdjLS07CisJCQlhcmd2Kys7CisJCX0KKwl9CisKKwlpZiAoYXJnYykgeworCQlpZiAobWF0Y2hlcygqYXJndiwgImluZGV4IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTMyKCZzZWwuaW5kZXgsICphcmd2LCAxMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJpbmRleFwiICglcykgPGNzdW0+XG4iLAorCQkJCQkqYXJndik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYXJnYy0tOworCQkJYXJndisrOworCQl9CisJfQorCisJdGFpbCA9IE5MTVNHX1RBSUwobik7CisJYWRkYXR0cl9sKG4sIE1BWF9NU0csIHRjYV9pZCwgTlVMTCwgMCk7CisJYWRkYXR0cl9sKG4sIE1BWF9NU0csIFRDQV9DU1VNX1BBUk1TLCAmc2VsLCBzaXplb2Yoc2VsKSk7CisJdGFpbC0+cnRhX2xlbiA9IChjaGFyICopTkxNU0dfVEFJTChuKSAtIChjaGFyICopdGFpbDsKKworCSphcmdjX3AgPSBhcmdjOworCSphcmd2X3AgPSBhcmd2OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3ByaW50X2NzdW0oc3RydWN0IGFjdGlvbl91dGlsICphdSwgRklMRSAqIGYsIHN0cnVjdCBydGF0dHIgKmFyZykKK3sKKwlzdHJ1Y3QgdGNfY3N1bSAqc2VsOworCisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX0NTVU1fTUFYICsgMV07CisKKwljaGFyICp1ZmxhZ18xID0gIiI7CisJY2hhciAqdWZsYWdfMiA9ICIiOworCWNoYXIgKnVmbGFnXzMgPSAiIjsKKwljaGFyICp1ZmxhZ180ID0gIiI7CisJY2hhciAqdWZsYWdfNSA9ICIiOworCWNoYXIgKnVmbGFnXzYgPSAiIjsKKwlTUFJJTlRfQlVGKGFjdGlvbl9idWYpOworCisJaW50IHVmbGFnX2NvdW50ID0gMDsKKworCWlmIChhcmcgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJcGFyc2VfcnRhdHRyX25lc3RlZCh0YiwgVENBX0NTVU1fTUFYLCBhcmcpOworCisJaWYgKHRiW1RDQV9DU1VNX1BBUk1TXSA9PSBOVUxMKSB7CisJCWZwcmludGYoZiwgIltOVUxMIGNzdW0gcGFyYW1ldGVyc10iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzZWwgPSBSVEFfREFUQSh0YltUQ0FfQ1NVTV9QQVJNU10pOworCisJaWYgKHNlbC0+dXBkYXRlX2ZsYWdzICYgVENBX0NTVU1fVVBEQVRFX0ZMQUdfSVBWNEhEUikgeworCQl1ZmxhZ18xID0gImlwaCI7CisJCXVmbGFnX2NvdW50Kys7CisJfQorCSNkZWZpbmUgQ1NVTV9VRkxBR19CVUZGRVIoZmxhZ19idWZmZXIsIGZsYWdfdmFsdWUsIGZsYWdfc3RyaW5nKQlcCisJCWRvIHsJCQkJCQkJXAorCQkJaWYgKHNlbC0+dXBkYXRlX2ZsYWdzICYgZmxhZ192YWx1ZSkgewkJXAorCQkJCWZsYWdfYnVmZmVyID0gdWZsYWdfY291bnQgPiAwID8JCVwKKwkJCQkJIiwgIiBmbGFnX3N0cmluZyA6IGZsYWdfc3RyaW5nOyBcCisJCQkJdWZsYWdfY291bnQrKzsJCQkJXAorCQkJfQkJCQkJCVwKKwkJfSB3aGlsZSgwKQorCUNTVU1fVUZMQUdfQlVGRkVSKHVmbGFnXzIsIFRDQV9DU1VNX1VQREFURV9GTEFHX0lDTVAsICJpY21wIik7CisJQ1NVTV9VRkxBR19CVUZGRVIodWZsYWdfMywgVENBX0NTVU1fVVBEQVRFX0ZMQUdfSUdNUCwgImlnbXAiKTsKKwlDU1VNX1VGTEFHX0JVRkZFUih1ZmxhZ180LCBUQ0FfQ1NVTV9VUERBVEVfRkxBR19UQ1AsICJ0Y3AiKTsKKwlDU1VNX1VGTEFHX0JVRkZFUih1ZmxhZ181LCBUQ0FfQ1NVTV9VUERBVEVfRkxBR19VRFAsICJ1ZHAiKTsKKwlDU1VNX1VGTEFHX0JVRkZFUih1ZmxhZ182LCBUQ0FfQ1NVTV9VUERBVEVfRkxBR19VRFBMSVRFLCAidWRwbGl0ZSIpOworCWlmICghdWZsYWdfY291bnQpIHsKKwkJdWZsYWdfMSA9ICI/ZW1wdHkiOworCX0KKworCWZwcmludGYoZiwgImNzdW0gKCVzJXMlcyVzJXMlcykgYWN0aW9uICVzXG4iLAorCQl1ZmxhZ18xLCB1ZmxhZ18yLCB1ZmxhZ18zLAorCQl1ZmxhZ180LCB1ZmxhZ181LCB1ZmxhZ182LAorCQlhY3Rpb25fbjJhKHNlbC0+YWN0aW9uLCBhY3Rpb25fYnVmLCBzaXplb2YoYWN0aW9uX2J1ZikpKTsKKwlmcHJpbnRmKGYsICJcdGluZGV4ICVkIHJlZiAlZCBiaW5kICVkIiwgc2VsLT5pbmRleCwgc2VsLT5yZWZjbnQsIHNlbC0+YmluZGNudCk7CisKKwlpZiAoc2hvd19zdGF0cykgeworCQlpZiAodGJbVENBX0NTVU1fVE1dKSB7CisJCQlzdHJ1Y3QgdGNmX3QgKnRtID0gUlRBX0RBVEEodGJbVENBX0NTVU1fVE1dKTsKKwkJCXByaW50X3RtKGYsdG0pOworCQl9CisJfQorCWZwcmludGYoZiwgIlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGFjdGlvbl91dGlsIGNzdW1fYWN0aW9uX3V0aWwgPSB7CisJLmlkID0gImNzdW0iLAorCS5wYXJzZV9hb3B0ID0gcGFyc2VfY3N1bSwKKwkucHJpbnRfYW9wdCA9IHByaW50X2NzdW0sCit9OwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvbV9lbWF0Y2guYyBiL2lwcm91dGUyL3RjL21fZW1hdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMzYWNmOAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL21fZW1hdGNoLmMKQEAgLTAsMCArMSw1NzAgQEAKKy8qCisgKiBtX2VtYXRjaC5jCQlFeHRlbmRlZCBNYXRjaGVzCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIGRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CVRob21hcyBHcmFmIDx0Z3JhZkBzdXVnLmNoPgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInRjX3V0aWwuaCIKKyNpbmNsdWRlICJtX2VtYXRjaC5oIgorCisjZGVmaW5lIEVNQVRDSF9NQVAgIi9ldGMvaXByb3V0ZTIvZW1hdGNoX21hcCIKKworc3RhdGljIHN0cnVjdCBlbWF0Y2hfdXRpbCAqZW1hdGNoX2xpc3Q7CisKKy8qIGV4cG9ydCB0byBiaXNvbiBwYXJzZXIgKi8KK2ludCBlbWF0Y2hfYXJnYzsKK2NoYXIgKiplbWF0Y2hfYXJndjsKK2NoYXIgKmVtYXRjaF9lcnIgPSBOVUxMOworc3RydWN0IGVtYXRjaCAqZW1hdGNoX3Jvb3Q7CisKK3N0YXRpYyBpbnQgYmVnaW5fYXJnYzsKK3N0YXRpYyBjaGFyICoqYmVnaW5fYXJndjsKKworc3RhdGljIGlubGluZSB2b2lkIG1hcF93YXJuaW5nKGludCBudW0sIGNoYXIgKmtpbmQpCit7CisJZnByaW50ZihzdGRlcnIsCisJICAgICJFcnJvcjogVW5hYmxlIHRvIGZpbmQgZW1hdGNoIFwiJXNcIiBpbiAlc1xuIiBcCisJICAgICJQbGVhc2UgYXNzaWduIGEgdW5pcXVlIElEIHRvIHRoZSBlbWF0Y2gga2luZCB0aGUgc3VnZ2VzdGVkICIgXAorCSAgICAiZW50cnkgaXM6XG4iIFwKKwkgICAgIlx0JWRcdCVzXG4iLAorCSAgICBraW5kLCBFTUFUQ0hfTUFQLCBudW0sIGtpbmQpOworfQorCitzdGF0aWMgaW50IGxvb2t1cF9tYXAoX191MTYgbnVtLCBjaGFyICpkc3QsIGludCBsZW4sIGNvbnN0IGNoYXIgKmZpbGUpCit7CisJaW50IGVyciA9IC1FSU5WQUw7CisJY2hhciBidWZbNTEyXTsKKwlGSUxFICpmZCA9IGZvcGVuKGZpbGUsICJyIik7CisKKwlpZiAoZmQgPT0gTlVMTCkKKwkJcmV0dXJuIC1lcnJubzsKKworCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmZCkpIHsKKwkJY2hhciBuYW1lYnVmWzUxMl0sICpwID0gYnVmOworCQlpbnQgaWQ7CisKKwkJd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKQorCQkJcCsrOworCQlpZiAoKnAgPT0gJyMnIHx8ICpwID09ICdcbicgfHwgKnAgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChzc2NhbmYocCwgIiVkICVzIiwgJmlkLCBuYW1lYnVmKSAhPSAyKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImVtYXRjaCBtYXAgJXMgY29ycnVwdGVkIGF0ICVzXG4iLAorCQkJICAgIGZpbGUsIHApOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoaWQgPT0gbnVtKSB7CisJCQlpZiAoZHN0KQorCQkJCXN0cm5jcHkoZHN0LCBuYW1lYnVmLCBsZW4gLSAxKTsKKwkJCWVyciA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWVyciA9IC1FTk9FTlQ7CitvdXQ6CisJZmNsb3NlKGZkKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGxvb2t1cF9tYXBfaWQoY2hhciAqa2luZCwgaW50ICpkc3QsIGNvbnN0IGNoYXIgKmZpbGUpCit7CisJaW50IGVyciA9IC1FSU5WQUw7CisJY2hhciBidWZbNTEyXTsKKwlGSUxFICpmZCA9IGZvcGVuKGZpbGUsICJyIik7CisKKwlpZiAoZmQgPT0gTlVMTCkKKwkJcmV0dXJuIC1lcnJubzsKKworCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmZCkpIHsKKwkJY2hhciBuYW1lYnVmWzUxMl0sICpwID0gYnVmOworCQlpbnQgaWQ7CisKKwkJd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKQorCQkJcCsrOworCQlpZiAoKnAgPT0gJyMnIHx8ICpwID09ICdcbicgfHwgKnAgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChzc2NhbmYocCwgIiVkICVzIiwgJmlkLCBuYW1lYnVmKSAhPSAyKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImVtYXRjaCBtYXAgJXMgY29ycnVwdGVkIGF0ICVzXG4iLAorCQkJICAgIGZpbGUsIHApOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoIXN0cmNhc2VjbXAobmFtZWJ1Ziwga2luZCkpIHsKKwkJCWlmIChkc3QpCisJCQkJKmRzdCA9IGlkOworCQkJZXJyID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJZXJyID0gLUVOT0VOVDsKKwkqZHN0ID0gMDsKK291dDoKKwlmY2xvc2UoZmQpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZW1hdGNoX3V0aWwgKmdldF9lbWF0Y2hfa2luZChjaGFyICpraW5kKQoreworCXN0YXRpYyB2b2lkICpib2R5OworCXZvaWQgKmRsaDsKKwljaGFyIGJ1ZlsyNTZdOworCXN0cnVjdCBlbWF0Y2hfdXRpbCAqZTsKKworCWZvciAoZSA9IGVtYXRjaF9saXN0OyBlOyBlID0gZS0+bmV4dCkgeworCQlpZiAoc3RyY21wKGUtPmtpbmQsIGtpbmQpID09IDApCisJCQlyZXR1cm4gZTsKKwl9CisKKwlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiZW1fJXMuc28iLCBraW5kKTsKKwlkbGggPSBkbG9wZW4oYnVmLCBSVExEX0xBWlkpOworCWlmIChkbGggPT0gTlVMTCkgeworCQlkbGggPSBib2R5OworCQlpZiAoZGxoID09IE5VTEwpIHsKKwkJCWRsaCA9IGJvZHkgPSBkbG9wZW4oTlVMTCwgUlRMRF9MQVpZKTsKKwkJCWlmIChkbGggPT0gTlVMTCkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlc19lbWF0Y2hfdXRpbCIsIGtpbmQpOworCWUgPSBkbHN5bShkbGgsIGJ1Zik7CisJaWYgKGUgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwllLT5uZXh0ID0gZW1hdGNoX2xpc3Q7CisJZW1hdGNoX2xpc3QgPSBlOworCisJcmV0dXJuIGU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZW1hdGNoX3V0aWwgKmdldF9lbWF0Y2hfa2luZF9udW0oX191MTYga2luZCkKK3sKKwljaGFyIG5hbWVbMzJdOworCisJaWYgKGxvb2t1cF9tYXAoa2luZCwgbmFtZSwgc2l6ZW9mKG5hbWUpLCBFTUFUQ0hfTUFQKSA8IDApCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGdldF9lbWF0Y2hfa2luZChuYW1lKTsKK30KKworc3RhdGljIGludCBwYXJzZV90cmVlKHN0cnVjdCBubG1zZ2hkciAqbiwgc3RydWN0IGVtYXRjaCAqdHJlZSkKK3sKKwlpbnQgaW5kZXggPSAxOworCXN0cnVjdCBlbWF0Y2ggKnQ7CisKKwlmb3IgKHQgPSB0cmVlOyB0OyB0ID0gdC0+bmV4dCkgeworCQlzdHJ1Y3QgcnRhdHRyICp0YWlsID0gTkxNU0dfVEFJTChuKTsKKwkJc3RydWN0IHRjZl9lbWF0Y2hfaGRyIGhkciA9IHsKKwkJCS5mbGFncyA9IHQtPnJlbGF0aW9uCisJCX07CisKKwkJaWYgKHQtPmludmVydGVkKQorCQkJaGRyLmZsYWdzIHw9IFRDRl9FTV9JTlZFUlQ7CisKKwkJYWRkYXR0cl9sKG4sIE1BWF9NU0csIGluZGV4KyssIE5VTEwsIDApOworCisJCWlmICh0LT5jaGlsZCkgeworCQkJX191MzIgciA9IHQtPmNoaWxkX3JlZjsKKwkJCWFkZHJhd19sKG4sIE1BWF9NU0csICZoZHIsIHNpemVvZihoZHIpKTsKKwkJCWFkZHJhd19sKG4sIE1BWF9NU0csICZyLCBzaXplb2YocikpOworCQl9IGVsc2UgeworCQkJaW50IG51bSA9IDAsIGVycjsKKwkJCWNoYXIgYnVmWzY0XTsKKwkJCXN0cnVjdCBlbWF0Y2hfdXRpbCAqZTsKKworCQkJaWYgKHQtPmFyZ3MgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLTE7CisKKwkJCXN0cm5jcHkoYnVmLCAoY2hhciopIHQtPmFyZ3MtPmRhdGEsIHNpemVvZihidWYpLTEpOworCQkJZSA9IGdldF9lbWF0Y2hfa2luZChidWYpOworCQkJaWYgKGUgPT0gTlVMTCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiVW5rbm93biBlbWF0Y2ggXCIlc1wiXG4iLAorCQkJCSAgICBidWYpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKworCQkJZXJyID0gbG9va3VwX21hcF9pZChidWYsICZudW0sIEVNQVRDSF9NQVApOworCQkJaWYgKGVyciA8IDApIHsKKwkJCQlpZiAoZXJyID09IC1FTk9FTlQpCisJCQkJCW1hcF93YXJuaW5nKGUtPmtpbmRfbnVtLCBidWYpOworCQkJCXJldHVybiBlcnI7CisJCQl9CisKKwkJCWhkci5raW5kID0gbnVtOworCQkJaWYgKGUtPnBhcnNlX2VvcHQobiwgJmhkciwgdC0+YXJncy0+bmV4dCkgPCAwKQorCQkJCXJldHVybiAtMTsKKwkJfQorCisJCXRhaWwtPnJ0YV9sZW4gPSAodm9pZCopIE5MTVNHX1RBSUwobikgLSAodm9pZCopIHRhaWw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmxhdHRlbl90cmVlKHN0cnVjdCBlbWF0Y2ggKmhlYWQsIHN0cnVjdCBlbWF0Y2ggKnRyZWUpCit7CisJaW50IGksIGNvdW50ID0gMDsKKwlzdHJ1Y3QgZW1hdGNoICp0OworCisJZm9yICg7OykgeworCQljb3VudCsrOworCisJCWlmICh0cmVlLT5jaGlsZCkgeworCQkJZm9yICh0ID0gaGVhZDsgdC0+bmV4dDsgdCA9IHQtPm5leHQpOworCQkJdC0+bmV4dCA9IHRyZWUtPmNoaWxkOworCQkJY291bnQgKz0gZmxhdHRlbl90cmVlKGhlYWQsIHRyZWUtPmNoaWxkKTsKKwkJfQorCisJCWlmICh0cmVlLT5yZWxhdGlvbiA9PSAwKQorCQkJYnJlYWs7CisKKwkJdHJlZSA9IHRyZWUtPm5leHQ7CisJfQorCisJZm9yIChpID0gMCwgdCA9IGhlYWQ7IHQ7IHQgPSB0LT5uZXh0LCBpKyspCisJCXQtPmluZGV4ID0gaTsKKworCWZvciAodCA9IGhlYWQ7IHQ7IHQgPSB0LT5uZXh0KQorCQlpZiAodC0+Y2hpbGQpCisJCQl0LT5jaGlsZF9yZWYgPSB0LT5jaGlsZC0+aW5kZXg7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK2ludCBlbV9wYXJzZV9lcnJvcihpbnQgZXJyLCBzdHJ1Y3QgYnN0ciAqYXJncywgc3RydWN0IGJzdHIgKmNhcmcsCisJCSAgIHN0cnVjdCBlbWF0Y2hfdXRpbCAqZSwgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhOworCisJdmFfc3RhcnQoYSwgZm10KTsKKwl2ZnByaW50ZihzdGRlcnIsIGZtdCwgYSk7CisJdmFfZW5kKGEpOworCisJaWYgKGVtYXRjaF9lcnIpCisJCWZwcmludGYoc3RkZXJyLCAiOiAlc1xuLi4uICIsIGVtYXRjaF9lcnIpOworCWVsc2UKKwkJZnByaW50ZihzdGRlcnIsICJcbi4uLiAiKTsKKworCXdoaWxlIChlbWF0Y2hfYXJnYyA8IGJlZ2luX2FyZ2MpIHsKKwkJaWYgKGVtYXRjaF9hcmdjID09IChiZWdpbl9hcmdjIC0gMSkpCisJCQlmcHJpbnRmKHN0ZGVyciwgIj4+JXM8PCAiLCAqYmVnaW5fYXJndik7CisJCWVsc2UKKwkJCWZwcmludGYoc3RkZXJyLCAiJXMgIiwgKmJlZ2luX2FyZ3YpOworCQliZWdpbl9hcmd2Kys7CisJCWJlZ2luX2FyZ2MtLTsKKwl9CisKKwlmcHJpbnRmKHN0ZGVyciwgIi4uLlxuIik7CisKKwlpZiAoYXJncykgeworCQlmcHJpbnRmKHN0ZGVyciwgIi4uLiAlcygiLCBlLT5raW5kKTsKKwkJd2hpbGUgKGFyZ3MpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXMiLCBhcmdzID09IGNhcmcgPyAiPj4iIDogIiIpOworCQkJYnN0cl9wcmludChzdGRlcnIsIGFyZ3MsIDEpOworCQkJZnByaW50ZihzdGRlcnIsICIlcyVzIiwgYXJncyA9PSBjYXJnID8gIjw8IiA6ICIiLAorCQkJICAgIGFyZ3MtPm5leHQgPyAiICIgOiAiIik7CisJCQlhcmdzID0gYXJncy0+bmV4dDsKKwkJfQorCQlmcHJpbnRmKHN0ZGVyciwgIikuLi5cbiIpOworCisJfQorCisJaWYgKGUgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwKKwkJICAgICJVc2FnZTogRVhQUlxuIiBcCisJCSAgICAid2hlcmU6IEVYUFIgIDo9IFRFUk0gWyB7IGFuZCB8IG9yIH0gRVhQUiBdXG4iIFwKKwkJICAgICIgICAgICAgVEVSTSAgOj0gWyBub3QgXSB7IE1BVENIIHwgJygnIEVYUFIgJyknIH1cbiIgXAorCQkgICAgIiAgICAgICBNQVRDSCA6PSBtb2R1bGUgJygnIEFSR1MgJyknXG4iIFwKKwkJICAgICIgICAgICAgQVJHUyA6PSBBUkcxIEFSRzIgLi4uXG4iIFwKKwkJICAgICJcbiIgXAorCQkgICAgIkV4YW1wbGU6IGEoeCB5KSBhbmQgbm90IChiKHgpIG9yIGMoeCB5IHopKVxuIik7CisJfSBlbHNlCisJCWUtPnByaW50X3VzYWdlKHN0ZGVycik7CisKKwlyZXR1cm4gLWVycjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZyZWVfZW1hdGNoX2Vycih2b2lkKQoreworCWlmIChlbWF0Y2hfZXJyKSB7CisJCWZyZWUoZW1hdGNoX2Vycik7CisJCWVtYXRjaF9lcnIgPSBOVUxMOworCX0KK30KKworZXh0ZXJuIGludCBlbWF0Y2hfcGFyc2Uodm9pZCk7CisKK2ludCBwYXJzZV9lbWF0Y2goaW50ICphcmdjX3AsIGNoYXIgKioqYXJndl9wLCBpbnQgdGNhX2lkLCBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJYmVnaW5fYXJnYyA9IGVtYXRjaF9hcmdjID0gKmFyZ2NfcDsKKwliZWdpbl9hcmd2ID0gZW1hdGNoX2FyZ3YgPSAqYXJndl9wOworCisJaWYgKGVtYXRjaF9wYXJzZSgpKSB7CisJCWludCBlcnIgPSBlbV9wYXJzZV9lcnJvcihFSU5WQUwsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSAgICAiUGFyc2UgZXJyb3IiKTsKKwkJZnJlZV9lbWF0Y2hfZXJyKCk7CisJCXJldHVybiBlcnI7CisJfQorCisJZnJlZV9lbWF0Y2hfZXJyKCk7CisKKwkvKiB1bmRvIGxvb2sgYWhlYWQgYnkgcGFyc2VyICovCisJZW1hdGNoX2FyZ2MrKzsKKwllbWF0Y2hfYXJndi0tOworCisJaWYgKGVtYXRjaF9yb290KSB7CisJCXN0cnVjdCBydGF0dHIgKnRhaWwsICp0YWlsX2xpc3Q7CisKKwkJc3RydWN0IHRjZl9lbWF0Y2hfdHJlZV9oZHIgaGRyID0geworCQkJLm5tYXRjaGVzID0gZmxhdHRlbl90cmVlKGVtYXRjaF9yb290LCBlbWF0Y2hfcm9vdCksCisJCQkucHJvZ2lkID0gVENGX0VNX1BST0dfVEMKKwkJfTsKKworCQl0YWlsID0gTkxNU0dfVEFJTChuKTsKKwkJYWRkYXR0cl9sKG4sIE1BWF9NU0csIHRjYV9pZCwgTlVMTCwgMCk7CisJCWFkZGF0dHJfbChuLCBNQVhfTVNHLCBUQ0FfRU1BVENIX1RSRUVfSERSLCAmaGRyLCBzaXplb2YoaGRyKSk7CisKKwkJdGFpbF9saXN0ID0gTkxNU0dfVEFJTChuKTsKKwkJYWRkYXR0cl9sKG4sIE1BWF9NU0csIFRDQV9FTUFUQ0hfVFJFRV9MSVNULCBOVUxMLCAwKTsKKworCQlpZiAocGFyc2VfdHJlZShuLCBlbWF0Y2hfcm9vdCkgPCAwKQorCQkJcmV0dXJuIC0xOworCisJCXRhaWxfbGlzdC0+cnRhX2xlbiA9ICh2b2lkKikgTkxNU0dfVEFJTChuKSAtICh2b2lkKikgdGFpbF9saXN0OworCQl0YWlsLT5ydGFfbGVuID0gKHZvaWQqKSBOTE1TR19UQUlMKG4pIC0gKHZvaWQqKSB0YWlsOworCX0KKworCSphcmdjX3AgPSBlbWF0Y2hfYXJnYzsKKwkqYXJndl9wID0gZW1hdGNoX2FyZ3Y7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcmludF9lbWF0Y2hfc2VxKEZJTEUgKmZkLCBzdHJ1Y3QgcnRhdHRyICoqdGIsIGludCBzdGFydCwKKwkJCSAgICBpbnQgcHJlZml4KQoreworCWludCBuLCBpID0gc3RhcnQ7CisJc3RydWN0IHRjZl9lbWF0Y2hfaGRyICpoZHI7CisJaW50IGRsZW47CisJdm9pZCAqZGF0YTsKKworCWZvciAoOzspIHsKKwkJaWYgKHRiW2ldID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisKKwkJZGxlbiA9IFJUQV9QQVlMT0FEKHRiW2ldKSAtIHNpemVvZigqaGRyKTsKKwkJZGF0YSA9ICh2b2lkICopIFJUQV9EQVRBKHRiW2ldKSArIHNpemVvZigqaGRyKTsKKworCQlpZiAoZGxlbiA8IDApCisJCQlyZXR1cm4gLTE7CisKKwkJaGRyID0gUlRBX0RBVEEodGJbaV0pOworCisJCWlmIChoZHItPmZsYWdzICYgVENGX0VNX0lOVkVSVCkKKwkJCWZwcmludGYoZmQsICJOT1QgIik7CisKKwkJaWYgKGhkci0+a2luZCA9PSAwKSB7CisJCQlfX3UzMiByZWY7CisKKwkJCWlmIChkbGVuIDwgc2l6ZW9mKF9fdTMyKSkKKwkJCQlyZXR1cm4gLTE7CisKKwkJCXJlZiA9ICooX191MzIgKikgZGF0YTsKKwkJCWZwcmludGYoZmQsICIoXG4iKTsKKwkJCWZvciAobiA9IDA7IG4gPD0gcHJlZml4OyBuKyspCisJCQkJZnByaW50ZihmZCwgIiAgIik7CisJCQlpZiAocHJpbnRfZW1hdGNoX3NlcShmZCwgdGIsIHJlZiArIDEsIHByZWZpeCArIDEpIDwgMCkKKwkJCQlyZXR1cm4gLTE7CisJCQlmb3IgKG4gPSAwOyBuIDwgcHJlZml4OyBuKyspCisJCQkJZnByaW50ZihmZCwgIiAgIik7CisJCQlmcHJpbnRmKGZkLCAiKSAiKTsKKworCQl9IGVsc2UgeworCQkJc3RydWN0IGVtYXRjaF91dGlsICplOworCisJCQllID0gZ2V0X2VtYXRjaF9raW5kX251bShoZHItPmtpbmQpOworCQkJaWYgKGUgPT0gTlVMTCkKKwkJCQlmcHJpbnRmKGZkLCAiW3Vua25vd24gZW1hdGNoICVkXVxuIiwKKwkJCQkgICAgaGRyLT5raW5kKTsKKwkJCWVsc2UgeworCQkJCWZwcmludGYoZmQsICIlcygiLCBlLT5raW5kKTsKKwkJCQlpZiAoZS0+cHJpbnRfZW9wdChmZCwgaGRyLCBkYXRhLCBkbGVuKSA8IDApCisJCQkJCXJldHVybiAtMTsKKwkJCQlmcHJpbnRmKGZkLCAiKVxuIik7CisJCQl9CisJCQlpZiAoaGRyLT5mbGFncyAmIFRDRl9FTV9SRUxfTUFTSykKKwkJCQlmb3IgKG4gPSAwOyBuIDwgcHJlZml4OyBuKyspCisJCQkJCWZwcmludGYoZmQsICIgICIpOworCQl9CisKKwkJc3dpdGNoIChoZHItPmZsYWdzICYgVENGX0VNX1JFTF9NQVNLKSB7CisJCQljYXNlIFRDRl9FTV9SRUxfQU5EOgorCQkJCWZwcmludGYoZmQsICJBTkQgIik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgVENGX0VNX1JFTF9PUjoKKwkJCQlmcHJpbnRmKGZkLCAiT1IgIik7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIDA7CisJCX0KKworCQlpKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJpbnRfZW1hdGNoX2xpc3QoRklMRSAqZmQsIHN0cnVjdCB0Y2ZfZW1hdGNoX3RyZWVfaGRyICpoZHIsCisJCQkgICAgIHN0cnVjdCBydGF0dHIgKnJ0YSkKK3sKKwlpbnQgZXJyID0gLTE7CisJc3RydWN0IHJ0YXR0ciAqKnRiOworCisJdGIgPSBtYWxsb2MoKGhkci0+bm1hdGNoZXMgKyAxKSAqIHNpemVvZihzdHJ1Y3QgcnRhdHRyICopKTsKKwlpZiAodGIgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGhkci0+bm1hdGNoZXMgPiAwKSB7CisJCWlmIChwYXJzZV9ydGF0dHJfbmVzdGVkKHRiLCBoZHItPm5tYXRjaGVzLCBydGEpIDwgMCkKKwkJCWdvdG8gZXJyb3V0OworCisJCWZwcmludGYoZmQsICJcbiAgIik7CisJCWlmIChwcmludF9lbWF0Y2hfc2VxKGZkLCB0YiwgMSwgMSkgPCAwKQorCQkJZ290byBlcnJvdXQ7CisJfQorCisJZXJyID0gMDsKK2Vycm91dDoKKwlmcmVlKHRiKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgcHJpbnRfZW1hdGNoKEZJTEUgKmZkLCBjb25zdCBzdHJ1Y3QgcnRhdHRyICpydGEpCit7CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX0VNQVRDSF9UUkVFX01BWCsxXTsKKwlzdHJ1Y3QgdGNmX2VtYXRjaF90cmVlX2hkciAqaGRyOworCisJaWYgKHBhcnNlX3J0YXR0cl9uZXN0ZWQodGIsIFRDQV9FTUFUQ0hfVFJFRV9NQVgsIHJ0YSkgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAodGJbVENBX0VNQVRDSF9UUkVFX0hEUl0gPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgZW1hdGNoIHRyZWUgaGVhZGVyXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICh0YltUQ0FfRU1BVENIX1RSRUVfTElTVF0gPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgZW1hdGNoIHRyZWUgbGlzdFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoUlRBX1BBWUxPQUQodGJbVENBX0VNQVRDSF9UUkVFX0hEUl0pIDwgc2l6ZW9mKCpoZHIpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRW1hdGNoIHRyZWUgaGVhZGVyIHNpemUgbWlzbWF0Y2hcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaGRyID0gUlRBX0RBVEEodGJbVENBX0VNQVRDSF9UUkVFX0hEUl0pOworCisJcmV0dXJuIHByaW50X2VtYXRjaF9saXN0KGZkLCBoZHIsIHRiW1RDQV9FTUFUQ0hfVFJFRV9MSVNUXSk7Cit9CisKK3N0cnVjdCBic3RyICogYnN0cl9hbGxvYyhjb25zdCBjaGFyICp0ZXh0KQoreworCXN0cnVjdCBic3RyICpiID0gY2FsbG9jKDEsIHNpemVvZigqYikpOworCisJaWYgKGIgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwliLT5kYXRhID0gc3RyZHVwKHRleHQpOworCWlmIChiLT5kYXRhID09IE5VTEwpIHsKKwkJZnJlZShiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYi0+bGVuID0gc3RybGVuKHRleHQpOworCisJcmV0dXJuIGI7Cit9CisKK3Vuc2lnbmVkIGxvbmcgYnN0cnRvdWwoY29uc3Qgc3RydWN0IGJzdHIgKmIpCit7CisJY2hhciAqaW52ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGw7CisJY2hhciBidWZbYi0+bGVuKzFdOworCisJbWVtY3B5KGJ1ZiwgYi0+ZGF0YSwgYi0+bGVuKTsKKwlidWZbYi0+bGVuXSA9ICdcMCc7CisKKwlsID0gc3RydG91bChidWYsICZpbnYsIDApOworCWlmIChsID09IFVMT05HX01BWCB8fCBpbnYgPT0gYnVmKQorCQlyZXR1cm4gVUxPTkdfTUFYOworCisJcmV0dXJuIGw7Cit9CisKK3ZvaWQgYnN0cl9wcmludChGSUxFICpmZCwgY29uc3Qgc3RydWN0IGJzdHIgKmIsIGludCBhc2NpaSkKK3sKKwlpbnQgaTsKKwljaGFyICpzID0gYi0+ZGF0YTsKKworCWlmIChhc2NpaSkKKwkJZm9yIChpID0gMDsgaSA8IGItPmxlbjsgaSsrKQorCQkgICAgZnByaW50ZihmZCwgIiVjIiwgaXNwcmludChzW2ldKSA/IHNbaV0gOiAnLicpOworCWVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgYi0+bGVuOyBpKyspCisJCSAgICBmcHJpbnRmKGZkLCAiJTAyeCIsIHNbaV0pOworCQlmcHJpbnRmKGZkLCAiXCIiKTsKKwkJZm9yIChpID0gMDsgaSA8IGItPmxlbjsgaSsrKQorCQkgICAgZnByaW50ZihmZCwgIiVjIiwgaXNwcmludChzW2ldKSA/IHNbaV0gOiAnLicpOworCQlmcHJpbnRmKGZkLCAiXCIiKTsKKwl9Cit9CisKK3ZvaWQgcHJpbnRfZW1hdGNoX3RyZWUoY29uc3Qgc3RydWN0IGVtYXRjaCAqdHJlZSkKK3sKKwljb25zdCBzdHJ1Y3QgZW1hdGNoICp0OworCisJZm9yICh0ID0gdHJlZTsgdDsgdCA9IHQtPm5leHQpIHsKKwkJaWYgKHQtPmludmVydGVkKQorCQkJcHJpbnRmKCJOT1QgIik7CisKKwkJaWYgKHQtPmNoaWxkKSB7CisJCQlwcmludGYoIigiKTsKKwkJCXByaW50X2VtYXRjaF90cmVlKHQtPmNoaWxkKTsKKwkJCXByaW50ZigiKSIpOworCQl9IGVsc2UgeworCQkJc3RydWN0IGJzdHIgKmI7CisJCQlmb3IgKGIgPSB0LT5hcmdzOyBiOyBiID0gYi0+bmV4dCkKKwkJCQlwcmludGYoIiVzJXMiLCBiLT5kYXRhLCBiLT5uZXh0ID8gIiAiIDogIiIpOworCQl9CisKKwkJaWYgKHQtPnJlbGF0aW9uID09IFRDRl9FTV9SRUxfQU5EKQorCQkJcHJpbnRmKCIgQU5EICIpOworCQllbHNlIGlmICh0LT5yZWxhdGlvbiA9PSBUQ0ZfRU1fUkVMX09SKQorCQkJcHJpbnRmKCIgT1IgIik7CisJfQorfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvbV9lbWF0Y2guaCBiL2lwcm91dGUyL3RjL21fZW1hdGNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE0NTZhYQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL21fZW1hdGNoLmgKQEAgLTAsMCArMSwxMTIgQEAKKyNpZm5kZWYgX19UQ19FTUFUQ0hfSF8KKyNkZWZpbmUgX19UQ19FTUFUQ0hfSF8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInRjX3V0aWwuaCIKKworI2RlZmluZSBFTUFUQ0hLSU5EU0laIDE2CisKK3N0cnVjdCBic3RyCit7CisJY2hhcgkqZGF0YTsKKwl1bnNpZ25lZCBpbnQJbGVuOworCWludAkJcXVvdGVkOworCXN0cnVjdCBic3RyCSpuZXh0OworfTsKKworZXh0ZXJuIHN0cnVjdCBic3RyICogYnN0cl9hbGxvYyhjb25zdCBjaGFyICp0ZXh0KTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnN0ciAqIGJzdHJfbmV3KGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCit7CisJc3RydWN0IGJzdHIgKmIgPSBjYWxsb2MoMSwgc2l6ZW9mKCpiKSk7CisKKwlpZiAoYiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWItPmRhdGEgPSBkYXRhOworCWItPmxlbiA9IGxlbjsKKworCXJldHVybiBiOworfQorCitzdGF0aWMgaW5saW5lIGludCBic3RyY21wKHN0cnVjdCBic3RyICpiLCBjb25zdCBjaGFyICp0ZXh0KQoreworCWludCBsZW4gPSBzdHJsZW4odGV4dCk7CisJaW50IGQgPSBiLT5sZW4gLSBsZW47CisKKwlpZiAoZCA9PSAwKQorCQlyZXR1cm4gc3RybmNtcChiLT5kYXRhLCB0ZXh0LCBsZW4pOworCisJcmV0dXJuIGQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJzdHIgKmJzdHJfbmV4dChzdHJ1Y3QgYnN0ciAqYikKK3sKKwlyZXR1cm4gYi0+bmV4dDsKK30KKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYnN0cnRvdWwoY29uc3Qgc3RydWN0IGJzdHIgKmIpOworZXh0ZXJuIHZvaWQgYnN0cl9wcmludChGSUxFICpmZCwgY29uc3Qgc3RydWN0IGJzdHIgKmIsIGludCBhc2NpaSk7CisKKworc3RydWN0IGVtYXRjaAoreworCXN0cnVjdCBic3RyCSphcmdzOworCWludAkJaW5kZXg7CisJaW50CQlpbnZlcnRlZDsKKwlpbnQJCXJlbGF0aW9uOworCWludAkJY2hpbGRfcmVmOworCXN0cnVjdCBlbWF0Y2gJKmNoaWxkOworCXN0cnVjdCBlbWF0Y2gJKm5leHQ7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBlbWF0Y2ggKiBuZXdfZW1hdGNoKHN0cnVjdCBic3RyICphcmdzLCBpbnQgaW52ZXJ0ZWQpCit7CisJc3RydWN0IGVtYXRjaCAqZSA9IGNhbGxvYygxLCBzaXplb2YoKmUpKTsKKworCWlmIChlID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJZS0+YXJncyA9IGFyZ3M7CisJZS0+aW52ZXJ0ZWQgPSBpbnZlcnRlZDsKKworCXJldHVybiBlOworfQorCitleHRlcm4gdm9pZCBwcmludF9lbWF0Y2hfdHJlZShjb25zdCBzdHJ1Y3QgZW1hdGNoICp0cmVlKTsKKworCitzdHJ1Y3QgZW1hdGNoX3V0aWwKK3sKKwljaGFyCQkJa2luZFtFTUFUQ0hLSU5EU0laXTsKKwlpbnQJCQlraW5kX251bTsKKwlpbnQJKCpwYXJzZV9lb3B0KShzdHJ1Y3Qgbmxtc2doZHIgKixzdHJ1Y3QgdGNmX2VtYXRjaF9oZHIgKiwKKwkJCSAgICAgIHN0cnVjdCBic3RyICopOworCWludAkoKnByaW50X2VvcHQpKEZJTEUgKiwgc3RydWN0IHRjZl9lbWF0Y2hfaGRyICosIHZvaWQgKiwgaW50KTsKKwl2b2lkCSgqcHJpbnRfdXNhZ2UpKEZJTEUgKik7CisJc3RydWN0IGVtYXRjaF91dGlsCSpuZXh0OworfTsKKworc3RhdGljIGlubGluZSBpbnQgcGFyc2VfbGF5ZXIoc3RydWN0IGJzdHIgKmIpCit7CisJaWYgKCooKGNoYXIgKikgYi0+ZGF0YSkgPT0gJ2wnKQorCQlyZXR1cm4gVENGX0xBWUVSX0xJTks7CisJZWxzZSBpZiAoKigoY2hhciAqKSBiLT5kYXRhKSA9PSAnbicpCisJCXJldHVybiBUQ0ZfTEFZRVJfTkVUV09SSzsKKwllbHNlIGlmICgqKChjaGFyICopIGItPmRhdGEpID09ICd0JykKKwkJcmV0dXJuIFRDRl9MQVlFUl9UUkFOU1BPUlQ7CisJZWxzZQorCQlyZXR1cm4gSU5UX01BWDsKK30KKworZXh0ZXJuIGludCBlbV9wYXJzZV9lcnJvcihpbnQgZXJyLCBzdHJ1Y3QgYnN0ciAqYXJncywgc3RydWN0IGJzdHIgKmNhcmcsCisJCSAgIHN0cnVjdCBlbWF0Y2hfdXRpbCAqLCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gaW50IHByaW50X2VtYXRjaChGSUxFICosIGNvbnN0IHN0cnVjdCBydGF0dHIgKik7CitleHRlcm4gaW50IHBhcnNlX2VtYXRjaChpbnQgKiwgY2hhciAqKiosIGludCwgc3RydWN0IG5sbXNnaGRyICopOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RjL21fZXN0aW1hdG9yLmMgYi9pcHJvdXRlMi90Yy9tX2VzdGltYXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYzg2MjQKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy9tX2VzdGltYXRvci5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBtX2VzdGltYXRvci5jCVBhcnNlL3ByaW50IGVzdGltYXRvciBtb2R1bGUgb3B0aW9ucy4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gdTMyaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAidGNfdXRpbC5oIgorI2luY2x1ZGUgInRjX2NvbW1vbi5oIgorCitzdGF0aWMgdm9pZCBlc3RfaGVscCh2b2lkKTsKKworc3RhdGljIHZvaWQgZXN0X2hlbHAodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAuLi4gZXN0aW1hdG9yIElOVEVSVkFMIFRJTUUtQ09OU1RcbiIpOworCWZwcmludGYoc3RkZXJyLCAiICBJTlRFUlZBTCBpcyBpbnRlcnZhbCBiZXR3ZWVuIG1lYXN1cmVtZW50c1xuIik7CisJZnByaW50ZihzdGRlcnIsICIgIFRJTUUtQ09OU1QgaXMgYXZlcmFnaW5nIHRpbWUgY29uc3RhbnRcbiIpOworCWZwcmludGYoc3RkZXJyLCAiRXhhbXBsZTogLi4uIGVzdCAxc2VjIDhzZWNcbiIpOworfQorCitpbnQgcGFyc2VfZXN0aW1hdG9yKGludCAqcF9hcmdjLCBjaGFyICoqKnBfYXJndiwgc3RydWN0IHRjX2VzdGltYXRvciAqZXN0KQoreworCWludCBhcmdjID0gKnBfYXJnYzsKKwljaGFyICoqYXJndiA9ICpwX2FyZ3Y7CisJdW5zaWduZWQgQSwgdGltZV9jb25zdDsKKworCU5FWFRfQVJHKCk7CisJaWYgKGVzdC0+ZXdtYV9sb2cpCisJCWR1cGFyZygiZXN0aW1hdG9yIiwgKmFyZ3YpOworCWlmIChtYXRjaGVzKCphcmd2LCAiaGVscCIpID09IDApCisJCWVzdF9oZWxwKCk7CisJaWYgKGdldF90aW1lKCZBLCAqYXJndikpCisJCWludmFyZygiZXN0aW1hdG9yIiwgImludmFsaWQgZXN0aW1hdG9yIGludGVydmFsIik7CisJTkVYVF9BUkcoKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKQorCQllc3RfaGVscCgpOworCWlmIChnZXRfdGltZSgmdGltZV9jb25zdCwgKmFyZ3YpKQorCQlpbnZhcmcoImVzdGltYXRvciIsICJpbnZhbGlkIGVzdGltYXRvciB0aW1lIGNvbnN0YW50Iik7CisJaWYgKHRjX3NldHVwX2VzdGltYXRvcihBLCB0aW1lX2NvbnN0LCBlc3QpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBlc3RpbWF0b3IgcGFyYW1ldGVycyBhcmUgb3V0IG9mIHJhbmdlLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHNob3dfcmF3KQorCQlmcHJpbnRmKHN0ZGVyciwgIltlc3RpbWF0b3IgaT0ldSBlPSV1XVxuIiwgZXN0LT5pbnRlcnZhbCwgZXN0LT5ld21hX2xvZyk7CisJKnBfYXJnYyA9IGFyZ2M7CisJKnBfYXJndiA9IGFyZ3Y7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy9tX2dhY3QuYyBiL2lwcm91dGUyL3RjL21fZ2FjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YmQ1ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy9tX2dhY3QuYwpAQCAtMCwwICsxLDI1NSBAQAorLyoKKyAqIG1fZ2FjdC5jCQlnZW5lcmljIGFjdGlvbnMgbW9kdWxlCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIGRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6ICBKIEhhZGkgU2FsaW0gKGhhZGlAY3liZXJ1cy5jYSkKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0Y191dGlsLmgiCisjaW5jbHVkZSA8bGludXgvdGNfYWN0L3RjX2dhY3QuaD4KKworLyogZGVmaW5lIHRvIHR1cm4gb24gcHJvYmFibGl0eSBzdHVmZiAqLworCisjaWZkZWYgQ09ORklHX0dBQ1RfUFJPQgorc3RhdGljIGNvbnN0IGNoYXIgKnByb2JfbjJhKGludCBwKQoreworCWlmIChwID09IFBHQUNUX05PTkUpCisJCXJldHVybiAibm9uZSI7CisJaWYgKHAgPT0gUEdBQ1RfTkVUUkFORCkKKwkJcmV0dXJuICJuZXRyYW5kIjsKKwlpZiAocCA9PSBQR0FDVF9ERVRFUk0pCisJCXJldHVybiAiZGV0ZXJtIjsKKwlyZXR1cm4gIm5vbmUiOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitleHBsYWluKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0dBQ1RfUFJPQgorCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IC4uLiBnYWN0IDxBQ1RJT04+IFtSQU5EXSBbSU5ERVhdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwKKwkJIldoZXJlOiBcdEFDVElPTiA6PSByZWNsYXNzaWZ5IHwgZHJvcCB8IGNvbnRpbnVlIHwgcGFzcyBcbiIKKwkJICAgICAgICAiXHRSQU5EIDo9IHJhbmRvbSA8UkFORFRZUEU+IDxBQ1RJT04+IDxWQUw+XG4iCisJCSAgICAgICAgIlx0UkFORFRZUEUgOj0gbmV0cmFuZCB8IGRldGVybVxuIgorCQkJIlx0VkFMIDogPSB2YWx1ZSBub3QgZXhjZWVkaW5nIDEwMDAwXG4iCisJCQkiXHRJTkRFWCA6PSBpbmRleCB2YWx1ZSB1c2VkXG4iCisJCQkiXG4iKTsKKyNlbHNlCisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogLi4uIGdhY3QgPEFDVElPTj4gW0lOREVYXVxuIik7CisJZnByaW50ZihzdGRlcnIsCisJCSJXaGVyZTogXHRBQ1RJT04gOj0gcmVjbGFzc2lmeSB8IGRyb3AgfCBjb250aW51ZSB8IHBhc3MgXG4iCisJCSJcdElOREVYIDo9IGluZGV4IHZhbHVlIHVzZWRcbiIKKwkJIlxuIik7CisjZW5kaWYKK30KKworCitzdGF0aWMgdm9pZAordXNhZ2Uodm9pZCkKK3sKKwlleHBsYWluKCk7CisJZXhpdCgtMSk7Cit9CisKK3N0YXRpYyBpbnQKK2dldF9hY3QoY2hhciAqKiphcmd2X3ApCit7CisJY2hhciAqKmFyZ3YgPSAqYXJndl9wOworCisJaWYgKG1hdGNoZXMoKmFyZ3YsICJyZWNsYXNzaWZ5IikgPT0gMCkgeworCQlyZXR1cm4gVENfQUNUX1JFQ0xBU1NJRlk7CisJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiZHJvcCIpID09IDAgfHwgbWF0Y2hlcygqYXJndiwgInNob3QiKSA9PSAwKSB7CisJCXJldHVybiBUQ19BQ1RfU0hPVDsKKwl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJjb250aW51ZSIpID09IDApIHsKKwkJcmV0dXJuIFRDX0FDVF9VTlNQRUM7CisJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAicGlwZSIpID09IDApIHsKKwkJcmV0dXJuIFRDX0FDVF9QSVBFOworCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInBhc3MiKSA9PSAwIHx8IG1hdGNoZXMoKmFyZ3YsICJvayIpID09IDApICB7CisJCXJldHVybiBUQ19BQ1RfT0s7CisJfSBlbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsImJhZCBhY3Rpb24gdHlwZSAlc1xuIiwqYXJndik7CisJCXJldHVybiAtMTA7CisJfQorfQorCitzdGF0aWMgaW50CitwYXJzZV9nYWN0KHN0cnVjdCBhY3Rpb25fdXRpbCAqYSwgaW50ICphcmdjX3AsIGNoYXIgKioqYXJndl9wLAorCSAgIGludCB0Y2FfaWQsIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlpbnQgYXJnYyA9ICphcmdjX3A7CisJY2hhciAqKmFyZ3YgPSAqYXJndl9wOworCWludCBvayA9IDA7CisJaW50IGFjdGlvbiA9IFRDX1BPTElDRV9SRUNMQVNTSUZZOworCXN0cnVjdCB0Y19nYWN0IHA7CisjaWZkZWYgQ09ORklHX0dBQ1RfUFJPQgorCWludCByZCA9IDA7CisJc3RydWN0IHRjX2dhY3RfcCBwcDsKKyNlbmRpZgorCXN0cnVjdCBydGF0dHIgKnRhaWw7CisKKwltZW1zZXQoJnAsIDAsIHNpemVvZiAocCkpOworCXAuYWN0aW9uID0gVENfUE9MSUNFX1JFQ0xBU1NJRlk7CisKKwlpZiAoYXJnYyA8IDApCisJCXJldHVybiAtMTsKKworCisJaWYgKG1hdGNoZXMoKmFyZ3YsICJnYWN0IikgPT0gMCkgeworCQlvaysrOworCX0gZWxzZSB7CisJCWFjdGlvbiA9IGdldF9hY3QoJmFyZ3YpOworCQlpZiAoYWN0aW9uICE9IC0xMCkgeworCQkJcC5hY3Rpb24gPSBhY3Rpb247CisJCQlvaysrOworCQl9IGVsc2UgeworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIGFjdGlvbjsKKwkJfQorCX0KKworCWlmIChvaykgeworCQlhcmdjLS07CisJCWFyZ3YrKzsKKwl9CisKKyNpZmRlZiBDT05GSUdfR0FDVF9QUk9CCisJaWYgKG9rICYmIGFyZ2MgPiAwKSB7CisJCWlmIChtYXRjaGVzKCphcmd2LCAicmFuZG9tIikgPT0gMCkgeworCQkJcmQgPSAxOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChtYXRjaGVzKCphcmd2LCAibmV0cmFuZCIpID09IDApIHsKKwkJCQlORVhUX0FSRygpOworCQkJCXBwLnB0eXBlID0gUEdBQ1RfTkVUUkFORDsKKwkJCX0gZWxzZSBpZiAgKG1hdGNoZXMoKmFyZ3YsICJkZXRlcm0iKSA9PSAwKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCQlwcC5wdHlwZSA9IFBHQUNUX0RFVEVSTTsKKwkJCX0gZWxzZSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwicmFuZG9tIHR5cGVcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCisJCQlhY3Rpb24gPSBnZXRfYWN0KCZhcmd2KTsKKwkJCWlmIChhY3Rpb24gIT0gLTEwKSB7IC8qIEZJWE1FICovCisJCQkJcHAucGFjdGlvbiA9IGFjdGlvbjsKKwkJCX0gZWxzZSB7CisJCQkJZXhwbGFpbigpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWFyZ2MtLTsKKwkJCWFyZ3YrKzsKKwkJCWlmIChnZXRfdTE2KCZwcC5wdmFsLCAqYXJndiwgMTApKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIHByb2JhYmlsaXR5IHZhbCAweCV4XG4iLHBwLnB2YWwpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChwcC5wdmFsID4gMTAwMDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgcHJvYmFiaWxpdHkgdmFsICAweCV4XG4iLHBwLnB2YWwpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWFyZ2MtLTsKKwkJCWFyZ3YrKzsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiaGVscCIpID09IDApIHsKKwkJCQl1c2FnZSgpOworCQl9CisJfQorI2VuZGlmCisKKwlpZiAoYXJnYyA+IDApIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJpbmRleCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmcC5pbmRleCwgKmFyZ3YsIDEwKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImluZGV4XCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWFyZ2MtLTsKKwkJCWFyZ3YrKzsKKwkJCW9rKys7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKSB7CisJCQkJdXNhZ2UoKTsKKwkJfQorCX0KKworCWlmICghb2spCisJCXJldHVybiAtMTsKKworCXRhaWwgPSBOTE1TR19UQUlMKG4pOworCWFkZGF0dHJfbChuLCBNQVhfTVNHLCB0Y2FfaWQsIE5VTEwsIDApOworCWFkZGF0dHJfbChuLCBNQVhfTVNHLCBUQ0FfR0FDVF9QQVJNUywgJnAsIHNpemVvZiAocCkpOworI2lmZGVmIENPTkZJR19HQUNUX1BST0IKKwlpZiAocmQpIHsKKwkJYWRkYXR0cl9sKG4sIE1BWF9NU0csIFRDQV9HQUNUX1BST0IsICZwcCwgc2l6ZW9mIChwcCkpOworCX0KKyNlbmRpZgorCXRhaWwtPnJ0YV9sZW4gPSAodm9pZCAqKSBOTE1TR19UQUlMKG4pIC0gKHZvaWQgKikgdGFpbDsKKworCSphcmdjX3AgPSBhcmdjOworCSphcmd2X3AgPSBhcmd2OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwcmludF9nYWN0KHN0cnVjdCBhY3Rpb25fdXRpbCAqYXUsRklMRSAqIGYsIHN0cnVjdCBydGF0dHIgKmFyZykKK3sKKwlTUFJJTlRfQlVGKGIxKTsKKyNpZmRlZiBDT05GSUdfR0FDVF9QUk9CCisJU1BSSU5UX0JVRihiMik7CisJc3RydWN0IHRjX2dhY3RfcCAqcHAgPSBOVUxMOworCXN0cnVjdCB0Y19nYWN0X3AgcHBfZHVtbXk7CisjZW5kaWYKKwlzdHJ1Y3QgdGNfZ2FjdCAqcCA9IE5VTEw7CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX0dBQ1RfTUFYICsgMV07CisKKwlpZiAoYXJnID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBhcnNlX3J0YXR0cl9uZXN0ZWQodGIsIFRDQV9HQUNUX01BWCwgYXJnKTsKKworCWlmICh0YltUQ0FfR0FDVF9QQVJNU10gPT0gTlVMTCkgeworCQlmcHJpbnRmKGYsICJbTlVMTCBnYWN0IHBhcmFtZXRlcnNdIik7CisJCXJldHVybiAtMTsKKwl9CisJcCA9IFJUQV9EQVRBKHRiW1RDQV9HQUNUX1BBUk1TXSk7CisKKwlmcHJpbnRmKGYsICJnYWN0IGFjdGlvbiAlcyIsIGFjdGlvbl9uMmEocC0+YWN0aW9uLCBiMSwgc2l6ZW9mIChiMSkpKTsKKyNpZmRlZiBDT05GSUdfR0FDVF9QUk9CCisJaWYgKE5VTEwgIT0gdGJbVENBX0dBQ1RfUFJPQl0pIHsKKwkJcHAgPSBSVEFfREFUQSh0YltUQ0FfR0FDVF9QUk9CXSk7CisJfSBlbHNlIHsKKwkJLyogbmVlZCB0byBrZWVwIGNvbnNpc3RlbnQgb3V0cHV0ICovCisJCW1lbXNldCgmcHBfZHVtbXksIDAsIHNpemVvZiAocHBfZHVtbXkpKTsKKwkJcHAgPSAmcHBfZHVtbXk7CisJfQorCWZwcmludGYoZiwgIlxuXHQgcmFuZG9tIHR5cGUgJXMgJXMgdmFsICVkIixwcm9iX24yYShwcC0+cHR5cGUpLCBhY3Rpb25fbjJhKHBwLT5wYWN0aW9uLCBiMiwgc2l6ZW9mIChiMikpLCBwcC0+cHZhbCk7CisjZW5kaWYKKwlmcHJpbnRmKGYsICJcblx0IGluZGV4ICVkIHJlZiAlZCBiaW5kICVkIixwLT5pbmRleCwgcC0+cmVmY250LCBwLT5iaW5kY250KTsKKwlpZiAoc2hvd19zdGF0cykgeworCQlpZiAodGJbVENBX0dBQ1RfVE1dKSB7CisJCQlzdHJ1Y3QgdGNmX3QgKnRtID0gUlRBX0RBVEEodGJbVENBX0dBQ1RfVE1dKTsKKwkJCXByaW50X3RtKGYsdG0pOworCQl9CisJfQorCWZwcmludGYoZiwgIlxuICIpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgYWN0aW9uX3V0aWwgZ2FjdF9hY3Rpb25fdXRpbCA9IHsKKwkuaWQgPSAiZ2FjdCIsCisJLnBhcnNlX2FvcHQgPSBwYXJzZV9nYWN0LAorCS5wcmludF9hb3B0ID0gcHJpbnRfZ2FjdCwKK307CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy9tX2lwdC5jIGIvaXByb3V0ZTIvdGMvbV9pcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDhiZWNiCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGMvbV9pcHQuYwpAQCAtMCwwICsxLDYyMCBAQAorLyoKKyAqIG1faXB0LmMJaXB0YWJsZXMgYmFzZWQgdGFyZ2V0cworICoJCXV0aWxpdGllcyBtb3N0bHkgcmlwcGVkIGZyb20gaXB0YWJsZXMgPGR1aCwgaXRzIHRoZSBsaW51eCB3YXk+CisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIGRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6ICBKIEhhZGkgU2FsaW0gKGhhZGlAY3liZXJ1cy5jYSkKKyAqLworCisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGlwdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0Y191dGlsLmgiCisjaW5jbHVkZSA8bGludXgvdGNfYWN0L3RjX2lwdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisKK3N0YXRpYyBjb25zdCBjaGFyICpwbmFtZSA9ICJ0Yy1pcHQiOworc3RhdGljIGNvbnN0IGNoYXIgKnRuYW1lID0gIm1hbmdsZSI7CitzdGF0aWMgY29uc3QgY2hhciAqcHZlcnNpb24gPSAiMC4xIjsKKworc3RhdGljIGNvbnN0IGNoYXIgKmlwdGhvb2tzW10gPSB7CisJIk5GX0lQX1BSRV9ST1VUSU5HIiwKKwkiTkZfSVBfTE9DQUxfSU4iLAorCSJORl9JUF9GT1JXQVJEIiwKKwkiTkZfSVBfTE9DQUxfT1VUIiwKKwkiTkZfSVBfUE9TVF9ST1VUSU5HIiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9yaWdpbmFsX29wdHNbXSA9IHsKKwl7Imp1bXAiLCAxLCAwLCAnaid9LAorCXswLCAwLCAwLCAwfQorfTsKKworc3RhdGljIHN0cnVjdCBpcHRhYmxlc190YXJnZXQgKnRfbGlzdCA9IE5VTEw7CitzdGF0aWMgc3RydWN0IG9wdGlvbiAqb3B0cyA9IG9yaWdpbmFsX29wdHM7CitzdGF0aWMgdW5zaWduZWQgaW50IGdsb2JhbF9vcHRpb25fb2Zmc2V0ID0gMDsKKyNkZWZpbmUgT1BUSU9OX09GRlNFVCAyNTYKKworY2hhciAqbGliX2RpcjsKKwordm9pZAorcmVnaXN0ZXJfdGFyZ2V0KHN0cnVjdCBpcHRhYmxlc190YXJnZXQgKm1lKQoreworLyogICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuRHVtbXkgcmVnaXN0ZXJfdGFyZ2V0ICVzIFxuIiwgbWUtPm5hbWUpOworKi8KKwltZS0+bmV4dCA9IHRfbGlzdDsKKwl0X2xpc3QgPSBtZTsKKworfQorCit2b2lkCit4dGFibGVzX3JlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgaXB0YWJsZXNfdGFyZ2V0ICptZSkKK3sKKwltZS0+bmV4dCA9IHRfbGlzdDsKKwl0X2xpc3QgPSBtZTsKK30KKwordm9pZAorZXhpdF90cnloZWxwKGludCBzdGF0dXMpCit7CisJZnByaW50ZihzdGRlcnIsICJUcnkgYCVzIC1oJyBvciAnJXMgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiIsCisJCXBuYW1lLCBwbmFtZSk7CisJZXhpdChzdGF0dXMpOworfQorCit2b2lkCitleGl0X2Vycm9yKGVudW0gZXhpdHR5cGUgc3RhdHVzLCBjaGFyICptc2csIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLCBtc2cpOworCWZwcmludGYoc3RkZXJyLCAiJXMgdiVzOiAiLCBwbmFtZSwgcHZlcnNpb24pOworCXZmcHJpbnRmKHN0ZGVyciwgbXNnLCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworCWlmIChzdGF0dXMgPT0gUEFSQU1FVEVSX1BST0JMRU0pCisJCWV4aXRfdHJ5aGVscChzdGF0dXMpOworCWlmIChzdGF0dXMgPT0gVkVSU0lPTl9QUk9CTEVNKQorCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJQZXJoYXBzIGlwdGFibGVzIG9yIHlvdXIga2VybmVsIG5lZWRzIHRvIGJlIHVwZ3JhZGVkLlxuIik7CisJZXhpdChzdGF0dXMpOworfQorCisvKiBzdG9sZW4gZnJvbSBpcHRhYmxlcyAxLjIuMTEKK1RoZXkgc2hvdWxkIHJlYWxseSBoYXZlIHRoZW0gYXMgYSBsaWJyYXJ5IHNvIGkgY2FuIGxpbmsgdG8gdGhlbQorRW1haWwgdGhlbSBuZXh0IHRpbWUgaSByZW1lbWJlcgorKi8KKworY2hhciAqCithZGRyX3RvX2RvdHRlZChjb25zdCBzdHJ1Y3QgaW5fYWRkciAqYWRkcnApCit7CisJc3RhdGljIGNoYXIgYnVmWzIwXTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcDsKKworCWJ5dGVwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgJihhZGRycC0+c19hZGRyKTsKKwlzcHJpbnRmKGJ1ZiwgIiVkLiVkLiVkLiVkIiwgYnl0ZXBbMF0sIGJ5dGVwWzFdLCBieXRlcFsyXSwgYnl0ZXBbM10pOworCXJldHVybiBidWY7Cit9CisKK2ludCBzdHJpbmdfdG9fbnVtYmVyX2xsKGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGxvbmcgbG9uZyBtaW4sCisJCQl1bnNpZ25lZCBsb25nIGxvbmcgbWF4LAorCQkgdW5zaWduZWQgbG9uZyBsb25nICpyZXQpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIG51bWJlcjsKKwljaGFyICplbmQ7CisKKwkvKiBIYW5kbGUgaGV4LCBvY3RhbCwgZXRjLiAqLworCWVycm5vID0gMDsKKwludW1iZXIgPSBzdHJ0b3VsbChzLCAmZW5kLCAwKTsKKwlpZiAoKmVuZCA9PSAnXDAnICYmIGVuZCAhPSBzKSB7CisJCS8qIHdlIHBhcnNlZCBhIG51bWJlciwgbGV0J3Mgc2VlIGlmIHdlIHdhbnQgdGhpcyAqLworCQlpZiAoZXJybm8gIT0gRVJBTkdFICYmIG1pbiA8PSBudW1iZXIgJiYgKCFtYXggfHwgbnVtYmVyIDw9IG1heCkpIHsKKwkJCSpyZXQgPSBudW1iZXI7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisKK2ludCBzdHJpbmdfdG9fbnVtYmVyX2woY29uc3QgY2hhciAqcywgdW5zaWduZWQgbG9uZyBtaW4sIHVuc2lnbmVkIGxvbmcgbWF4LAorCQkgICAgICAgdW5zaWduZWQgbG9uZyAqcmV0KQoreworCWludCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBsb25nIG51bWJlcjsKKworCXJlc3VsdCA9IHN0cmluZ190b19udW1iZXJfbGwocywgbWluLCBtYXgsICZudW1iZXIpOworCSpyZXQgPSAodW5zaWduZWQgbG9uZyludW1iZXI7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgc3RyaW5nX3RvX251bWJlcihjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBpbnQgbWluLCB1bnNpZ25lZCBpbnQgbWF4LAorCQl1bnNpZ25lZCBpbnQgKnJldCkKK3sKKwlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgbnVtYmVyOworCisJcmVzdWx0ID0gc3RyaW5nX3RvX251bWJlcl9sKHMsIG1pbiwgbWF4LCAmbnVtYmVyKTsKKwkqcmV0ID0gKHVuc2lnbmVkIGludCludW1iZXI7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBmcmVlX29wdHMoc3RydWN0IG9wdGlvbiAqbG9jYWxfb3B0cykKK3sKKwlpZiAobG9jYWxfb3B0cyAhPSBvcmlnaW5hbF9vcHRzKSB7CisJCWZyZWUobG9jYWxfb3B0cyk7CisJCW9wdHMgPSBvcmlnaW5hbF9vcHRzOworCQlnbG9iYWxfb3B0aW9uX29mZnNldCA9IDA7CisJfQorfQorCitzdGF0aWMgc3RydWN0IG9wdGlvbiAqCittZXJnZV9vcHRpb25zKHN0cnVjdCBvcHRpb24gKm9sZG9wdHMsIGNvbnN0IHN0cnVjdCBvcHRpb24gKm5ld29wdHMsCisJICAgICAgdW5zaWduZWQgaW50ICpvcHRpb25fb2Zmc2V0KQoreworCXN0cnVjdCBvcHRpb24gKm1lcmdlOworCXVuc2lnbmVkIGludCBudW1fb2xkLCBudW1fbmV3LCBpOworCisJZm9yIChudW1fb2xkID0gMDsgb2xkb3B0c1tudW1fb2xkXS5uYW1lOyBudW1fb2xkKyspIDsKKwlmb3IgKG51bV9uZXcgPSAwOyBuZXdvcHRzW251bV9uZXddLm5hbWU7IG51bV9uZXcrKykgOworCisJKm9wdGlvbl9vZmZzZXQgPSBnbG9iYWxfb3B0aW9uX29mZnNldCArIE9QVElPTl9PRkZTRVQ7CisKKwltZXJnZSA9IG1hbGxvYyhzaXplb2YgKHN0cnVjdCBvcHRpb24pICogKG51bV9uZXcgKyBudW1fb2xkICsgMSkpOworCW1lbWNweShtZXJnZSwgb2xkb3B0cywgbnVtX29sZCAqIHNpemVvZiAoc3RydWN0IG9wdGlvbikpOworCWZvciAoaSA9IDA7IGkgPCBudW1fbmV3OyBpKyspIHsKKwkJbWVyZ2VbbnVtX29sZCArIGldID0gbmV3b3B0c1tpXTsKKwkJbWVyZ2VbbnVtX29sZCArIGldLnZhbCArPSAqb3B0aW9uX29mZnNldDsKKwl9CisJbWVtc2V0KG1lcmdlICsgbnVtX29sZCArIG51bV9uZXcsIDAsIHNpemVvZiAoc3RydWN0IG9wdGlvbikpOworCisJcmV0dXJuIG1lcmdlOworfQorCitzdGF0aWMgdm9pZCAqCitmd19jYWxsb2Moc2l6ZV90IGNvdW50LCBzaXplX3Qgc2l6ZSkKK3sKKwl2b2lkICpwOworCisJaWYgKChwID0gKHZvaWQgKikgY2FsbG9jKGNvdW50LCBzaXplKSkgPT0gTlVMTCkgeworCQlwZXJyb3IoImlwdGFibGVzOiBjYWxsb2MgZmFpbGVkIik7CisJCWV4aXQoMSk7CisJfQorCXJldHVybiBwOworfQorCitzdGF0aWMgc3RydWN0IGlwdGFibGVzX3RhcmdldCAqCitmaW5kX3QoY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgaXB0YWJsZXNfdGFyZ2V0ICptOworCWZvciAobSA9IHRfbGlzdDsgbTsgbSA9IG0tPm5leHQpIHsKKwkJaWYgKHN0cmNtcChtLT5uYW1lLCBuYW1lKSA9PSAwKQorCQkJcmV0dXJuIG07CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXB0YWJsZXNfdGFyZ2V0ICoKK2dldF90YXJnZXRfbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworCXZvaWQgKmhhbmRsZTsKKwljaGFyICplcnJvcjsKKwljaGFyICpuZXdfbmFtZSwgKmxuYW1lOworCXN0cnVjdCBpcHRhYmxlc190YXJnZXQgKm07CisJY2hhciBwYXRoW3N0cmxlbihsaWJfZGlyKSArIHNpemVvZiAoIi9saWJpcHRfLnNvIikgKyBzdHJsZW4obmFtZSldOworCisjaWZkZWYgTk9fU0hBUkVEX0xJQlMKKwlyZXR1cm4gTlVMTDsKKyNlbmRpZgorCisJbmV3X25hbWUgPSBtYWxsb2Moc3RybGVuKG5hbWUpICsgMSk7CisJbG5hbWUgPSBtYWxsb2Moc3RybGVuKG5hbWUpICsgMSk7CisJaWYgKG5ld19uYW1lKQorCQltZW1zZXQobmV3X25hbWUsICdcMCcsIHN0cmxlbihuYW1lKSArIDEpOworCWVsc2UKKwkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwgImdldF90YXJnZXRfbmFtZSIpOworCisJaWYgKGxuYW1lKQorCQltZW1zZXQobG5hbWUsICdcMCcsIHN0cmxlbihuYW1lKSArIDEpOworCWVsc2UKKwkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwgImdldF90YXJnZXRfbmFtZSIpOworCisJc3RyY3B5KG5ld19uYW1lLCBuYW1lKTsKKwlzdHJjcHkobG5hbWUsIG5hbWUpOworCisJaWYgKGlzdXBwZXIobG5hbWVbMF0pKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgc3RybGVuKG5hbWUpOyBpKyspIHsKKwkJCWxuYW1lW2ldID0gdG9sb3dlcihsbmFtZVtpXSk7CisJCX0KKwl9CisKKwlpZiAoaXNsb3dlcihuZXdfbmFtZVswXSkpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBzdHJsZW4obmV3X25hbWUpOyBpKyspIHsKKwkJCW5ld19uYW1lW2ldID0gdG91cHBlcihuZXdfbmFtZVtpXSk7CisJCX0KKwl9CisKKwkvKiB0cnkgbGlieHRfeHggZmlyc3QgKi8KKwlzcHJpbnRmKHBhdGgsICIlcy9saWJ4dF8lcy5zbyIsIGxpYl9kaXIsIG5ld19uYW1lKTsKKwloYW5kbGUgPSBkbG9wZW4ocGF0aCwgUlRMRF9MQVpZKTsKKwlpZiAoIWhhbmRsZSkgeworCQkvKiB0cnkgbGliaXB0X3h4IG5leHQgKi8KKwkJc3ByaW50ZihwYXRoLCAiJXMvbGliaXB0XyVzLnNvIiwgbGliX2RpciwgbmV3X25hbWUpOworCQloYW5kbGUgPSBkbG9wZW4ocGF0aCwgUlRMRF9MQVpZKTsKKworCQlpZiAoIWhhbmRsZSkgeworCQkJc3ByaW50ZihwYXRoLCAiJXMvbGlieHRfJXMuc28iLCBsaWJfZGlyICwgbG5hbWUpOworCQkJaGFuZGxlID0gZGxvcGVuKHBhdGgsIFJUTERfTEFaWSk7CisJCX0KKworCQlpZiAoIWhhbmRsZSkgeworCQkJc3ByaW50ZihwYXRoLCAiJXMvbGliaXB0XyVzLnNvIiwgbGliX2RpciAsIGxuYW1lKTsKKwkJCWhhbmRsZSA9IGRsb3BlbihwYXRoLCBSVExEX0xBWlkpOworCQl9CisJCS8qIG9rLCBsZXRzIGdpdmUgdXAgLi4gKi8KKwkJaWYgKCFoYW5kbGUpIHsKKwkJCWZwdXRzKGRsZXJyb3IoKSwgc3RkZXJyKTsKKwkJCXByaW50ZigiXG4iKTsKKwkJCWZyZWUobmV3X25hbWUpOworCQkJZnJlZShsbmFtZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCW0gPSBkbHN5bShoYW5kbGUsIG5ld19uYW1lKTsKKwlpZiAoKGVycm9yID0gZGxlcnJvcigpKSAhPSBOVUxMKSB7CisJCW0gPSAoc3RydWN0IGlwdGFibGVzX3RhcmdldCAqKSBkbHN5bShoYW5kbGUsIGxuYW1lKTsKKwkJaWYgKChlcnJvciA9IGRsZXJyb3IoKSkgIT0gTlVMTCkgeworCQkJbSA9IGZpbmRfdChuZXdfbmFtZSk7CisJCQlpZiAoTlVMTCA9PSBtKSB7CisJCQkJbSA9IGZpbmRfdChsbmFtZSk7CisJCQkJaWYgKE5VTEwgPT0gbSkgeworCQkJCQlmcHV0cyhlcnJvciwgc3RkZXJyKTsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJcbiIpOworCQkJCQlkbGNsb3NlKGhhbmRsZSk7CisJCQkJCWZyZWUobmV3X25hbWUpOworCQkJCQlmcmVlKGxuYW1lKTsKKwkJCQkJcmV0dXJuIE5VTEw7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJZnJlZShuZXdfbmFtZSk7CisJZnJlZShsbmFtZSk7CisJcmV0dXJuIG07Cit9CisKKworc3RydWN0IGluX2FkZHIgKmRvdHRlZF90b19hZGRyKGNvbnN0IGNoYXIgKmRvdHRlZCkKK3sKKwlzdGF0aWMgc3RydWN0IGluX2FkZHIgYWRkcjsKKwl1bnNpZ25lZCBjaGFyICphZGRycDsKKwljaGFyICpwLCAqcTsKKwl1bnNpZ25lZCBpbnQgb25lYnl0ZTsKKwlpbnQgaTsKKwljaGFyIGJ1ZlsyMF07CisKKwkvKiBjb3B5IGRvdHRlZCBzdHJpbmcsIGJlY2F1c2Ugd2UgbmVlZCB0byBtb2RpZnkgaXQgKi8KKwlzdHJuY3B5KGJ1ZiwgZG90dGVkLCBzaXplb2YgKGJ1ZikgLSAxKTsKKwlhZGRycCA9ICh1bnNpZ25lZCBjaGFyICopICYoYWRkci5zX2FkZHIpOworCisJcCA9IGJ1ZjsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCWlmICgocSA9IHN0cmNocihwLCAnLicpKSA9PSBOVUxMKQorCQkJcmV0dXJuIChzdHJ1Y3QgaW5fYWRkciAqKSBOVUxMOworCisJCSpxID0gJ1wwJzsKKwkJaWYgKHN0cmluZ190b19udW1iZXIocCwgMCwgMjU1LCAmb25lYnl0ZSkgPT0gLTEpCisJCQlyZXR1cm4gKHN0cnVjdCBpbl9hZGRyICopIE5VTEw7CisKKwkJYWRkcnBbaV0gPSAodW5zaWduZWQgY2hhcikgb25lYnl0ZTsKKwkJcCA9IHEgKyAxOworCX0KKworCS8qIHdlJ3ZlIGNoZWNrZWQgMyBieXRlcywgbm93IHdlIGNoZWNrIHRoZSBsYXN0IG9uZSAqLworCWlmIChzdHJpbmdfdG9fbnVtYmVyKHAsIDAsIDI1NSwgJm9uZWJ5dGUpID09IC0xKQorCQlyZXR1cm4gKHN0cnVjdCBpbl9hZGRyICopIE5VTEw7CisKKwlhZGRycFszXSA9ICh1bnNpZ25lZCBjaGFyKSBvbmVieXRlOworCisJcmV0dXJuICZhZGRyOworfQorCitzdGF0aWMgdm9pZCBzZXRfcmV2aXNpb24oY2hhciAqbmFtZSwgdV9pbnQ4X3QgcmV2aXNpb24pCit7CisJLyogT2xkIGtlcm5lbCBzb3VyY2VzIGRvbid0IGhhdmUgIi5yZXZpc2lvbiIgZmllbGQsCisJKiAgYnV0IHdlIHN0b2xlIGEgYnl0ZSBmcm9tIG5hbWUuICovCisJbmFtZVtJUFRfRlVOQ1RJT05fTUFYTkFNRUxFTiAtIDJdID0gJ1wwJzsKKwluYW1lW0lQVF9GVU5DVElPTl9NQVhOQU1FTEVOIC0gMV0gPSByZXZpc2lvbjsKK30KKworLyoKKyAqIHdlIG1heSBuZWVkIHRvIGNoZWNrIGZvciB2ZXJzaW9uIG1pc21hdGNoCisqLworaW50CitidWlsZF9zdChzdHJ1Y3QgaXB0YWJsZXNfdGFyZ2V0ICp0YXJnZXQsIHN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICp0KQoreworCXVuc2lnbmVkIGludCBuZmNhY2hlID0gMDsKKworCWlmICh0YXJnZXQpIHsKKwkJc2l6ZV90IHNpemU7CisKKwkJc2l6ZSA9CisJCSAgICBJUFRfQUxJR04oc2l6ZW9mIChzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCkpICsgdGFyZ2V0LT5zaXplOworCisJCWlmIChOVUxMID09IHQpIHsKKwkJCXRhcmdldC0+dCA9IGZ3X2NhbGxvYygxLCBzaXplKTsKKwkJCXRhcmdldC0+dC0+dS50YXJnZXRfc2l6ZSA9IHNpemU7CisKKwkJCWlmICh0YXJnZXQtPmluaXQgIT0gTlVMTCkKKwkJCQl0YXJnZXQtPmluaXQodGFyZ2V0LT50LCAmbmZjYWNoZSk7CisJCQlzZXRfcmV2aXNpb24odGFyZ2V0LT50LT51LnVzZXIubmFtZSwgdGFyZ2V0LT5yZXZpc2lvbik7CisJCX0gZWxzZSB7CisJCQl0YXJnZXQtPnQgPSB0OworCQl9CisJCXN0cmNweSh0YXJnZXQtPnQtPnUudXNlci5uYW1lLCB0YXJnZXQtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfaXB0KHN0cnVjdCBhY3Rpb25fdXRpbCAqYSxpbnQgKmFyZ2NfcCwKKwkJICAgICBjaGFyICoqKmFyZ3ZfcCwgaW50IHRjYV9pZCwgc3RydWN0IG5sbXNnaGRyICpuKQoreworCXN0cnVjdCBpcHRhYmxlc190YXJnZXQgKm0gPSBOVUxMOworCXN0cnVjdCBpcHRfZW50cnkgZnc7CisJc3RydWN0IHJ0YXR0ciAqdGFpbDsKKwlpbnQgYzsKKwlpbnQgcmFyZ2MgPSAqYXJnY19wOworCWNoYXIgKiphcmd2ID0gKmFyZ3ZfcDsKKwlpbnQgYXJnYyA9IDAsIGlhcmdjID0gMDsKKwljaGFyIGtbMTZdOworCWludCBzaXplID0gMDsKKwlpbnQgaW9rID0gMCwgb2sgPSAwOworCV9fdTMyIGhvb2sgPSAwLCBpbmRleCA9IDA7CisKKwlsaWJfZGlyID0gZ2V0ZW52KCJJUFRBQkxFU19MSUJfRElSIik7CisJaWYgKCFsaWJfZGlyKQorCQlsaWJfZGlyID0gSVBUX0xJQl9ESVI7CisKKwl7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgcmFyZ2M7IGkrKykgeworCQkJaWYgKE5VTEwgPT0gYXJndltpXSB8fCAwID09IHN0cmNtcChhcmd2W2ldLCAiYWN0aW9uIikpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpYXJnYyA9IGFyZ2MgPSBpOworCX0KKworCWlmIChhcmdjIDw9IDIpIHsKKwkJZnByaW50ZihzdGRlcnIsImJhZCBhcmd1bWVudHMgdG8gaXB0ICVkIHZzICVkIFxuIiwgYXJnYywgcmFyZ2MpOworCQlyZXR1cm4gLTE7CisJfQorCisJd2hpbGUgKDEpIHsKKwkJYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJqOiIsIG9wdHMsIE5VTEwpOworCQlpZiAoYyA9PSAtMSkKKwkJCWJyZWFrOworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnaic6CisJCQltID0gZ2V0X3RhcmdldF9uYW1lKG9wdGFyZyk7CisJCQlpZiAoTlVMTCAhPSBtKSB7CisKKwkJCQlpZiAoMCA+IGJ1aWxkX3N0KG0sIE5VTEwpKSB7CisJCQkJCXByaW50ZigiICVzIGVycm9yIFxuIiwgbS0+bmFtZSk7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJb3B0cyA9CisJCQkJICAgIG1lcmdlX29wdGlvbnMob3B0cywgbS0+ZXh0cmFfb3B0cywKKwkJCQkJCSAgJm0tPm9wdGlvbl9vZmZzZXQpOworCQkJfSBlbHNlIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwiIGZhaWxlZCB0byBmaW5kIHRhcmdldCAlc1xuXG4iLCBvcHRhcmcpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCW9rKys7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJbWVtc2V0KCZmdywgMCwgc2l6ZW9mIChmdykpOworCQkJaWYgKG0pIHsKKwkJCQltLT5wYXJzZShjIC0gbS0+b3B0aW9uX29mZnNldCwgYXJndiwgMCwKKwkJCQkJICZtLT50ZmxhZ3MsIE5VTEwsICZtLT50KTsKKwkJCX0gZWxzZSB7CisJCQkJZnByaW50ZihzdGRlcnIsIiBmYWlsZWQgdG8gZmluZCB0YXJnZXQgJXNcblxuIiwgb3B0YXJnKTsKKwkJCQlyZXR1cm4gLTE7CisKKwkJCX0KKwkJCW9rKys7CisJCQlicmVhazsKKworCQl9CisJfQorCisJaWYgKGlhcmdjID4gb3B0aW5kKSB7CisJCWlmIChtYXRjaGVzKGFyZ3Zbb3B0aW5kXSwgImluZGV4IikgPT0gMCkgeworCQkJaWYgKGdldF91MzIoJmluZGV4LCBhcmd2W29wdGluZCArIDFdLCAxMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJpbmRleFwiXG4iKTsKKwkJCQlmcmVlX29wdHMob3B0cyk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaW9rKys7CisKKwkJCW9wdGluZCArPSAyOworCQl9CisJfQorCisJaWYgKCFvayAmJiAhaW9rKSB7CisJCWZwcmludGYoc3RkZXJyLCIgaXB0IFBhcnNlciBCQUQhISAoJXMpXG4iLCAqYXJndik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBjaGVjayB0aGF0IHdlIHBhc3NlZCB0aGUgY29ycmVjdCBwYXJhbWV0ZXJzIHRvIHRoZSB0YXJnZXQgKi8KKwlpZiAobSkKKwkJbS0+ZmluYWxfY2hlY2sobS0+dGZsYWdzKTsKKworCXsKKwkJc3RydWN0IHRjbXNnICp0ID0gTkxNU0dfREFUQShuKTsKKwkJaWYgKHQtPnRjbV9wYXJlbnQgIT0gVENfSF9ST09UCisJCSAgICAmJiB0LT50Y21fcGFyZW50ID09IFRDX0hfTUFKKFRDX0hfSU5HUkVTUykpIHsKKwkJCWhvb2sgPSBORl9JUF9QUkVfUk9VVElORzsKKwkJfSBlbHNlIHsKKwkJCWhvb2sgPSBORl9JUF9QT1NUX1JPVVRJTkc7CisJCX0KKwl9CisKKwl0YWlsID0gTkxNU0dfVEFJTChuKTsKKwlhZGRhdHRyX2wobiwgTUFYX01TRywgdGNhX2lkLCBOVUxMLCAwKTsKKwlmcHJpbnRmKHN0ZG91dCwgInRhYmxlbmFtZTogJXMgaG9vazogJXNcbiAiLCB0bmFtZSwgaXB0aG9va3NbaG9va10pOworCWZwcmludGYoc3Rkb3V0LCAiXHR0YXJnZXQ6ICIpOworCisJaWYgKG0pCisJCW0tPnByaW50KE5VTEwsIG0tPnQsIDApOworCWZwcmludGYoc3Rkb3V0LCAiIGluZGV4ICVkXG4iLCBpbmRleCk7CisKKwlpZiAoc3RybGVuKHRuYW1lKSA+IDE2KSB7CisJCXNpemUgPSAxNjsKKwkJa1sxNV0gPSAwOworCX0gZWxzZSB7CisJCXNpemUgPSAxICsgc3RybGVuKHRuYW1lKTsKKwl9CisJc3RybmNweShrLCB0bmFtZSwgc2l6ZSk7CisKKwlhZGRhdHRyX2wobiwgTUFYX01TRywgVENBX0lQVF9UQUJMRSwgaywgc2l6ZSk7CisJYWRkYXR0cl9sKG4sIE1BWF9NU0csIFRDQV9JUFRfSE9PSywgJmhvb2ssIDQpOworCWFkZGF0dHJfbChuLCBNQVhfTVNHLCBUQ0FfSVBUX0lOREVYLCAmaW5kZXgsIDQpOworCWlmIChtKQorCQlhZGRhdHRyX2wobiwgTUFYX01TRywgVENBX0lQVF9UQVJHLCBtLT50LCBtLT50LT51LnRhcmdldF9zaXplKTsKKwl0YWlsLT5ydGFfbGVuID0gKHZvaWQgKikgTkxNU0dfVEFJTChuKSAtICh2b2lkICopIHRhaWw7CisKKwlhcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKwkqYXJnY19wID0gcmFyZ2MgLSBpYXJnYzsKKwkqYXJndl9wID0gYXJndjsKKworCW9wdGluZCA9IDA7CisJZnJlZV9vcHRzKG9wdHMpOworCS8qIENsZWFyIGZsYWdzIGlmIHRhcmdldCB3aWxsIGJlIHVzZWQgYWdhaW4gKi8KKyAgICAgICAgbS0+dGZsYWdzPTA7CisgICAgICAgIG0tPnVzZWQ9MDsKKwkvKiBGcmVlIGFsbG9jYXRlZCBtZW1vcnkgKi8KKyAgICAgICAgaWYgKG0tPnQpCisgICAgICAgICAgICBmcmVlKG0tPnQpOworCisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50CitwcmludF9pcHQoc3RydWN0IGFjdGlvbl91dGlsICphdSxGSUxFICogZiwgc3RydWN0IHJ0YXR0ciAqYXJnKQoreworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9JUFRfTUFYICsgMV07CisJc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKnQgPSBOVUxMOworCisJaWYgKGFyZyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlsaWJfZGlyID0gZ2V0ZW52KCJJUFRBQkxFU19MSUJfRElSIik7CisJaWYgKCFsaWJfZGlyKQorCQlsaWJfZGlyID0gSVBUX0xJQl9ESVI7CisKKwlwYXJzZV9ydGF0dHJfbmVzdGVkKHRiLCBUQ0FfSVBUX01BWCwgYXJnKTsKKworCWlmICh0YltUQ0FfSVBUX1RBQkxFXSA9PSBOVUxMKSB7CisJCWZwcmludGYoZiwgIltOVUxMIGlwdCB0YWJsZSBuYW1lIF0gYXNzdW1pbmcgbWFuZ2xlICIpOworCX0gZWxzZSB7CisJCWZwcmludGYoZiwgInRhYmxlbmFtZTogJXMgIiwKKwkJCXJ0YV9nZXRhdHRyX3N0cih0YltUQ0FfSVBUX1RBQkxFXSkpOworCX0KKworCWlmICh0YltUQ0FfSVBUX0hPT0tdID09IE5VTEwpIHsKKwkJZnByaW50ZihmLCAiW05VTEwgaXB0IGhvb2sgbmFtZSBdXG4gIik7CisJCXJldHVybiAtMTsKKwl9IGVsc2UgeworCQlfX3UzMiBob29rOworCQlob29rID0gcnRhX2dldGF0dHJfdTMyKHRiW1RDQV9JUFRfSE9PS10pOworCQlmcHJpbnRmKGYsICIgaG9vazogJXMgXG4iLCBpcHRob29rc1tob29rXSk7CisJfQorCisJaWYgKHRiW1RDQV9JUFRfVEFSR10gPT0gTlVMTCkgeworCQlmcHJpbnRmKGYsICJcdFtOVUxMIGlwdCB0YXJnZXQgcGFyYW1ldGVycyBdIFxuIik7CisJCXJldHVybiAtMTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgaXB0YWJsZXNfdGFyZ2V0ICptID0gTlVMTDsKKwkJdCA9IFJUQV9EQVRBKHRiW1RDQV9JUFRfVEFSR10pOworCQltID0gZ2V0X3RhcmdldF9uYW1lKHQtPnUudXNlci5uYW1lKTsKKwkJaWYgKE5VTEwgIT0gbSkgeworCQkJaWYgKDAgPiBidWlsZF9zdChtLCB0KSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiICVzIGVycm9yIFxuIiwgbS0+bmFtZSk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCisJCQlvcHRzID0KKwkJCSAgICBtZXJnZV9vcHRpb25zKG9wdHMsIG0tPmV4dHJhX29wdHMsCisJCQkJCSAgJm0tPm9wdGlvbl9vZmZzZXQpOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICIgZmFpbGVkIHRvIGZpbmQgdGFyZ2V0ICVzXG5cbiIsCisJCQkJdC0+dS51c2VyLm5hbWUpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWZwcmludGYoZiwgIlx0dGFyZ2V0ICIpOworCQltLT5wcmludChOVUxMLCBtLT50LCAwKTsKKwkJaWYgKHRiW1RDQV9JUFRfSU5ERVhdID09IE5VTEwpIHsKKwkJCWZwcmludGYoZiwgIiBbTlVMTCBpcHQgdGFyZ2V0IGluZGV4IF1cbiIpOworCQl9IGVsc2UgeworCQkJX191MzIgaW5kZXg7CisJCQlpbmRleCA9IHJ0YV9nZXRhdHRyX3UzMih0YltUQ0FfSVBUX0lOREVYXSk7CisJCQlmcHJpbnRmKGYsICIgXG5cdGluZGV4ICVkIiwgaW5kZXgpOworCQl9CisKKwkJaWYgKHRiW1RDQV9JUFRfQ05UXSkgeworCQkJc3RydWN0IHRjX2NudCAqYyAgPSBSVEFfREFUQSh0YltUQ0FfSVBUX0NOVF0pOzsKKwkJCWZwcmludGYoZiwgIiByZWYgJWQgYmluZCAlZCIsIGMtPnJlZmNudCwgYy0+YmluZGNudCk7CisJCX0KKwkJaWYgKHNob3dfc3RhdHMpIHsKKwkJCWlmICh0YltUQ0FfSVBUX1RNXSkgeworCQkJCXN0cnVjdCB0Y2ZfdCAqdG0gPSBSVEFfREFUQSh0YltUQ0FfSVBUX1RNXSk7CisJCQkJcHJpbnRfdG0oZix0bSk7CisJCQl9CisJCX0KKwkJZnByaW50ZihmLCAiIFxuIik7CisKKwl9CisJZnJlZV9vcHRzKG9wdHMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBhY3Rpb25fdXRpbCBpcHRfYWN0aW9uX3V0aWwgPSB7CisgICAgICAgIC5pZCA9ICJpcHQiLAorICAgICAgICAucGFyc2VfYW9wdCA9IHBhcnNlX2lwdCwKKyAgICAgICAgLnByaW50X2FvcHQgPSBwcmludF9pcHQsCit9OwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvbV9taXJyZWQuYyBiL2lwcm91dGUyL3RjL21fbWlycmVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMyMzFkNwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL21fbWlycmVkLmMKQEAgLTAsMCArMSwyOTggQEAKKy8qCisgKiBtX2VncmVzcy5jCQlpbmdyZXNzL2VncmVzcyBwYWNrZXQgbWlycm9yL3JlZGlyIGFjdGlvbnMgbW9kdWxlCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIGRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6ICBKIEhhZGkgU2FsaW0gKGhhZGlAY3liZXJ1cy5jYSkKKyAqCisgKiBUT0RPOiBBZGQgSW5ncmVzcyBzdXBwb3J0CisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInRjX3V0aWwuaCIKKyNpbmNsdWRlICJ0Y19jb21tb24uaCIKKyNpbmNsdWRlIDxsaW51eC90Y19hY3QvdGNfbWlycmVkLmg+CisKK3N0YXRpYyB2b2lkCitleHBsYWluKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogbWlycmVkIDxESVJFQ1RJT04+IDxBQ1RJT04+IFtpbmRleCBJTkRFWF0gPGRldiBERVZJQ0VOQU1FPiBcbiIpOworCWZwcmludGYoc3RkZXJyLCAid2hlcmU6IFxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdERJUkVDVElPTiA6PSA8aW5ncmVzcyB8IGVncmVzcz5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHRBQ1RJT04gOj0gPG1pcnJvciB8IHJlZGlyZWN0PlxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdElOREVYICBpcyB0aGUgc3BlY2lmaWMgcG9saWN5IGluc3RhbmNlIGlkXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0REVWSUNFTkFNRSBpcyB0aGUgZGV2aWNlbmFtZSBcbiIpOworCit9CisKK3N0YXRpYyB2b2lkCit1c2FnZSh2b2lkKQoreworCWV4cGxhaW4oKTsKKwlleGl0KC0xKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKm1pcnJlZF9uMmEoaW50IGFjdGlvbikKK3sKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgVENBX0VHUkVTU19SRURJUjoKKwkJcmV0dXJuICJFZ3Jlc3MgUmVkaXJlY3QiOworCWNhc2UgVENBX0lOR1JFU1NfUkVESVI6CisJCXJldHVybiAiSW5ncmVzcyBSZWRpcmVjdCI7CisJY2FzZSBUQ0FfRUdSRVNTX01JUlJPUjoKKwkJcmV0dXJuICJFZ3Jlc3MgTWlycm9yIjsKKwljYXNlIFRDQV9JTkdSRVNTX01JUlJPUjoKKwkJcmV0dXJuICJJbmdyZXNzIE1pcnJvciI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJ1bmtub3duIjsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3BhcnNlX2VncmVzcyhzdHJ1Y3QgYWN0aW9uX3V0aWwgKmEsIGludCAqYXJnY19wLCBjaGFyICoqKmFyZ3ZfcCwKKwkgICAgIGludCB0Y2FfaWQsIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKworCWludCBhcmdjID0gKmFyZ2NfcDsKKwljaGFyICoqYXJndiA9ICphcmd2X3A7CisJaW50IG9rID0gMCwgaW9rID0gMCwgbWlycm9yPTAscmVkaXI9MDsKKwlzdHJ1Y3QgdGNfbWlycmVkIHA7CisJc3RydWN0IHJ0YXR0ciAqdGFpbDsKKwljaGFyIGRbMTZdOworCisJbWVtc2V0KGQsMCxzaXplb2YoZCktMSk7CisJbWVtc2V0KCZwLDAsc2l6ZW9mKHN0cnVjdCB0Y19taXJyZWQpKTsKKworCXdoaWxlIChhcmdjID4gMCkgeworCisJCWlmIChtYXRjaGVzKCphcmd2LCAiYWN0aW9uIikgPT0gMCkgeworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImVncmVzcyIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlvaysrOworCQkJY29udGludWU7CisJCX0gZWxzZSB7CisKKwkJCWlmIChtYXRjaGVzKCphcmd2LCAiaW5kZXgiKSA9PSAwKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCQlpZiAoZ2V0X3UzMigmcC5pbmRleCwgKmFyZ3YsIDEwKSkgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJpbmRleFwiXG4iKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlpb2srKzsKKwkJCQlpZiAoIW9rKSB7CisJCQkJCWFyZ2MtLTsKKwkJCQkJYXJndisrOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IGVsc2UgaWYoIW9rKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJ3YXMgZXhwZWN0aW5nIGVncmVzcyAoJXMpXG4iLCAqYXJndik7CisJCQkJYnJlYWs7CisKKwkJCX0gZWxzZSBpZiAoIW1pcnJvciAmJiBtYXRjaGVzKCphcmd2LCAibWlycm9yIikgPT0gMCkgeworCQkJCW1pcnJvcj0xOworCQkJCWlmIChyZWRpcikgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIkNhbid0IGhhdmUgYm90aCBtaXJyb3IgYW5kIHJlZGlyXG4iKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlwLmVhY3Rpb24gPSBUQ0FfRUdSRVNTX01JUlJPUjsKKwkJCQlwLmFjdGlvbiA9IFRDX0FDVF9QSVBFOworCQkJCW9rKys7CisJCQl9IGVsc2UgaWYgKCFyZWRpciAmJiBtYXRjaGVzKCphcmd2LCAicmVkaXJlY3QiKSA9PSAwKSB7CisJCQkJcmVkaXI9MTsKKwkJCQlpZiAobWlycm9yKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiQ2FuJ3QgaGF2ZSBib3RoIG1pcnJvciBhbmQgcmVkaXJcbiIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCXAuZWFjdGlvbiA9IFRDQV9FR1JFU1NfUkVESVI7CisJCQkJcC5hY3Rpb24gPSBUQ19BQ1RfU1RPTEVOOworCQkJCW9rKys7CisJCQl9IGVsc2UgaWYgKChyZWRpciB8fCBtaXJyb3IpICYmIG1hdGNoZXMoKmFyZ3YsICJkZXYiKSA9PSAwKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCQlpZiAoc3RybGVuKGQpKQorCQkJCQlkdXBhcmcoImRldiIsICphcmd2KTsKKworCQkJCXN0cm5jcHkoZCwgKmFyZ3YsIHNpemVvZihkKS0xKTsKKwkJCQlhcmdjLS07CisJCQkJYXJndisrOworCisJCQkJYnJlYWs7CisKKwkJCX0KKwkJfQorCisJCU5FWFRfQVJHKCk7CisJfQorCisJaWYgKCFvayAmJiAhaW9rKSB7CisJCXJldHVybiAtMTsKKwl9CisKKworCisJaWYgKGRbMF0pICB7CisJCWludCBpZHg7CisJCWxsX2luaXRfbWFwKCZydGgpOworCisJCWlmICgoaWR4ID0gbGxfbmFtZV90b19pbmRleChkKSkgPT0gMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJDYW5ub3QgZmluZCBkZXZpY2UgXCIlc1wiXG4iLCBkKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXAuaWZpbmRleCA9IGlkeDsKKwl9CisKKworCWlmIChhcmdjICYmIHAuZWFjdGlvbiA9PSBUQ0FfRUdSRVNTX01JUlJPUikgeworCisJCWlmIChtYXRjaGVzKCphcmd2LCAicmVjbGFzc2lmeSIpID09IDApIHsKKwkJCXAuYWN0aW9uID0gVENfUE9MSUNFX1JFQ0xBU1NJRlk7CisJCQlORVhUX0FSRygpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJwaXBlIikgPT0gMCkgeworCQkJcC5hY3Rpb24gPSBUQ19QT0xJQ0VfUElQRTsKKwkJCU5FWFRfQVJHKCk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImRyb3AiKSA9PSAwIHx8CisJCQkgICBtYXRjaGVzKCphcmd2LCAic2hvdCIpID09IDApIHsKKwkJCXAuYWN0aW9uID0gVENfUE9MSUNFX1NIT1Q7CisJCQlORVhUX0FSRygpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJjb250aW51ZSIpID09IDApIHsKKwkJCXAuYWN0aW9uID0gVENfUE9MSUNFX1VOU1BFQzsKKwkJCU5FWFRfQVJHKCk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInBhc3MiKSA9PSAwKSB7CisJCQlwLmFjdGlvbiA9IFRDX1BPTElDRV9PSzsKKwkJCU5FWFRfQVJHKCk7CisJCX0KKworCX0KKworCWlmIChhcmdjKSB7CisJCWlmIChpb2sgJiYgbWF0Y2hlcygqYXJndiwgImluZGV4IikgPT0gMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJtaXJyZWQ6IElsbGVnYWwgZG91YmxlIGluZGV4XG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHsKKwkJCWlmIChtYXRjaGVzKCphcmd2LCAiaW5kZXgiKSA9PSAwKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCQlpZiAoZ2V0X3UzMigmcC5pbmRleCwgKmFyZ3YsIDEwKSkgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIm1pcnJlZDogSWxsZWdhbCBcImluZGV4XCJcbiIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCWFyZ2MtLTsKKwkJCQlhcmd2Kys7CisJCQl9CisJCX0KKwl9CisKKwl0YWlsID0gTkxNU0dfVEFJTChuKTsKKwlhZGRhdHRyX2wobiwgTUFYX01TRywgdGNhX2lkLCBOVUxMLCAwKTsKKwlhZGRhdHRyX2wobiwgTUFYX01TRywgVENBX01JUlJFRF9QQVJNUywgJnAsIHNpemVvZiAocCkpOworCXRhaWwtPnJ0YV9sZW4gPSAodm9pZCAqKSBOTE1TR19UQUlMKG4pIC0gKHZvaWQgKikgdGFpbDsKKworCSphcmdjX3AgPSBhcmdjOworCSphcmd2X3AgPSBhcmd2OworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK3BhcnNlX21pcnJlZChzdHJ1Y3QgYWN0aW9uX3V0aWwgKmEsIGludCAqYXJnY19wLCBjaGFyICoqKmFyZ3ZfcCwKKwkgICAgIGludCB0Y2FfaWQsIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKworCWludCBhcmdjID0gKmFyZ2NfcDsKKwljaGFyICoqYXJndiA9ICphcmd2X3A7CisKKwlpZiAoYXJnYyA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsIm1pcnJlZCBiYWQgYXJndW1lbnQgY291bnQgJWRcbiIsIGFyZ2MpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKG1hdGNoZXMoKmFyZ3YsICJtaXJyZWQiKSA9PSAwKSB7CisJCU5FWFRfQVJHKCk7CisJfSBlbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsIm1pcnJlZCBiYWQgYXJndW1lbnQgJXNcbiIsICphcmd2KTsKKwkJcmV0dXJuIC0xOworCX0KKworCisJaWYgKG1hdGNoZXMoKmFyZ3YsICJlZ3Jlc3MiKSA9PSAwIHx8IG1hdGNoZXMoKmFyZ3YsICJpbmRleCIpID09IDApIHsKKwkJaW50IHJldCA9IHBhcnNlX2VncmVzcyhhLCAmYXJnYywgJmFyZ3YsIHRjYV9pZCwgbik7CisJCWlmIChyZXQgPT0gMCkgeworCQkJKmFyZ2NfcCA9IGFyZ2M7CisJCQkqYXJndl9wID0gYXJndjsKKwkJCXJldHVybiAwOworCQl9CisKKwl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJpbmdyZXNzIikgPT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwibWlycmVkIGluZ3Jlc3Mgbm90IHN1cHBvcnRlZCBhdCB0aGUgbW9tZW50XG4iKTsKKwl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQl1c2FnZSgpOworCX0gZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCJtaXJyZWQgb3B0aW9uIG5vdCBzdXBwb3J0ZWQgJXNcbiIsICphcmd2KTsKKwl9CisKKwlyZXR1cm4gLTE7CisKK30KKworc3RhdGljIGludAorcHJpbnRfbWlycmVkKHN0cnVjdCBhY3Rpb25fdXRpbCAqYXUsRklMRSAqIGYsIHN0cnVjdCBydGF0dHIgKmFyZykKK3sKKwlzdHJ1Y3QgdGNfbWlycmVkICpwOworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9NSVJSRURfTUFYICsgMV07CisJY29uc3QgY2hhciAqZGV2OworCVNQUklOVF9CVUYoYjEpOworCisJaWYgKGFyZyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlwYXJzZV9ydGF0dHJfbmVzdGVkKHRiLCBUQ0FfTUlSUkVEX01BWCwgYXJnKTsKKworCWlmICh0YltUQ0FfTUlSUkVEX1BBUk1TXSA9PSBOVUxMKSB7CisJCWZwcmludGYoZiwgIltOVUxMIG1pcnJlZCBwYXJhbWV0ZXJzXSIpOworCQlyZXR1cm4gLTE7CisJfQorCXAgPSBSVEFfREFUQSh0YltUQ0FfTUlSUkVEX1BBUk1TXSk7CisKKwkvKgorCWxsX2luaXRfbWFwKCZydGgpOworCSovCisKKworCWlmICgoZGV2ID0gbGxfaW5kZXhfdG9fbmFtZShwLT5pZmluZGV4KSkgPT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBmaW5kIGRldmljZSAlZFxuIiwgcC0+aWZpbmRleCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlmcHJpbnRmKGYsICJtaXJyZWQgKCVzIHRvIGRldmljZSAlcykgJXMiLCBtaXJyZWRfbjJhKHAtPmVhY3Rpb24pLCBkZXYsYWN0aW9uX24yYShwLT5hY3Rpb24sIGIxLCBzaXplb2YgKGIxKSkpOworCisJZnByaW50ZihmLCAiXG4gIik7CisJZnByaW50ZihmLCAiXHRpbmRleCAlZCByZWYgJWQgYmluZCAlZCIscC0+aW5kZXgscC0+cmVmY250LHAtPmJpbmRjbnQpOworCisJaWYgKHNob3dfc3RhdHMpIHsKKwkJaWYgKHRiW1RDQV9NSVJSRURfVE1dKSB7CisJCQlzdHJ1Y3QgdGNmX3QgKnRtID0gUlRBX0RBVEEodGJbVENBX01JUlJFRF9UTV0pOworCQkJcHJpbnRfdG0oZix0bSk7CisJCX0KKwl9CisJZnByaW50ZihmLCAiXG4gIik7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBhY3Rpb25fdXRpbCBtaXJyZWRfYWN0aW9uX3V0aWwgPSB7CisJLmlkID0gIm1pcnJlZCIsCisJLnBhcnNlX2FvcHQgPSBwYXJzZV9taXJyZWQsCisJLnByaW50X2FvcHQgPSBwcmludF9taXJyZWQsCit9OwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvbV9uYXQuYyBiL2lwcm91dGUyL3RjL21fbmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUwMmE4MQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL21fbmF0LmMKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBtX25hdC5jCQlOQVQgbW9kdWxlCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIGRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAidGNfdXRpbC5oIgorI2luY2x1ZGUgPGxpbnV4L3RjX2FjdC90Y19uYXQuaD4KKworc3RhdGljIHZvaWQKK2V4cGxhaW4odm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAuLi4gbmF0IE5BVFxuIgorCQkJIk5BVCA6PSBESVJFQ1RJT04gT0xEIE5FV1xuIgorCQkJIkRJUkVDVElPTiA6PSB7IGluZ3Jlc3MgfCBlZ3Jlc3MgfVxuIgorCQkJIk9MRCA6PSBQUkVGSVhcbiIKKwkJCSJORVcgOj0gQUREUkVTU1xuIik7Cit9CisKK3N0YXRpYyB2b2lkCit1c2FnZSh2b2lkKQoreworCWV4cGxhaW4oKTsKKwlleGl0KC0xKTsKK30KKworc3RhdGljIGludAorcGFyc2VfbmF0X2FyZ3MoaW50ICphcmdjX3AsIGNoYXIgKioqYXJndl9wLHN0cnVjdCB0Y19uYXQgKnNlbCkKK3sKKwlpbnQgYXJnYyA9ICphcmdjX3A7CisJY2hhciAqKmFyZ3YgPSAqYXJndl9wOworCWluZXRfcHJlZml4IGFkZHI7CisKKwlpZiAoYXJnYyA8PSAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAobWF0Y2hlcygqYXJndiwgImVncmVzcyIpID09IDApCisJCXNlbC0+ZmxhZ3MgfD0gVENBX05BVF9GTEFHX0VHUkVTUzsKKwllbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiaW5ncmVzcyIpICE9IDApCisJCWdvdG8gYmFkX3ZhbDsKKworCU5FWFRfQVJHKCk7CisKKwlpZiAoZ2V0X3ByZWZpeF8xKCZhZGRyLCAqYXJndiwgQUZfSU5FVCkpCisJCWdvdG8gYmFkX3ZhbDsKKworCXNlbC0+b2xkX2FkZHIgPSBhZGRyLmRhdGFbMF07CisJc2VsLT5tYXNrID0gaHRvbmwofjB1IDw8ICgzMiAtIGFkZHIuYml0bGVuKSk7CisKKwlORVhUX0FSRygpOworCisJaWYgKGdldF9wcmVmaXhfMSgmYWRkciwgKmFyZ3YsIEFGX0lORVQpKQorCQlnb3RvIGJhZF92YWw7CisKKwlzZWwtPm5ld19hZGRyID0gYWRkci5kYXRhWzBdOworCisJYXJnYy0tOworCWFyZ3YrKzsKKworCSphcmdjX3AgPSBhcmdjOworCSphcmd2X3AgPSBhcmd2OworCXJldHVybiAwOworCitiYWRfdmFsOgorCXJldHVybiAtMTsKK30KKworc3RhdGljIGludAorcGFyc2VfbmF0KHN0cnVjdCBhY3Rpb25fdXRpbCAqYSwgaW50ICphcmdjX3AsIGNoYXIgKioqYXJndl9wLCBpbnQgdGNhX2lkLCBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJc3RydWN0IHRjX25hdCBzZWw7CisKKwlpbnQgYXJnYyA9ICphcmdjX3A7CisJY2hhciAqKmFyZ3YgPSAqYXJndl9wOworCWludCBvayA9IDA7CisJc3RydWN0IHJ0YXR0ciAqdGFpbDsKKworCW1lbXNldCgmc2VsLCAwLCBzaXplb2Yoc2VsKSk7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJuYXQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHBhcnNlX25hdF9hcmdzKCZhcmdjLCAmYXJndiwgJnNlbCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgbmF0IGNvbnN0cnVjdCAoJXMpIFxuIiwKKwkJCQkJKmFyZ3YpOworCQkJCWV4cGxhaW4oKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlvaysrOworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKSB7CisJCQl1c2FnZSgpOworCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCX0KKworCX0KKworCWlmICghb2spIHsKKwkJZXhwbGFpbigpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGFyZ2MpIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJyZWNsYXNzaWZ5IikgPT0gMCkgeworCQkJc2VsLmFjdGlvbiA9IFRDX0FDVF9SRUNMQVNTSUZZOworCQkJYXJnYy0tOworCQkJYXJndisrOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJwaXBlIikgPT0gMCkgeworCQkJc2VsLmFjdGlvbiA9IFRDX0FDVF9QSVBFOworCQkJYXJnYy0tOworCQkJYXJndisrOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJkcm9wIikgPT0gMCB8fAorCQkJbWF0Y2hlcygqYXJndiwgInNob3QiKSA9PSAwKSB7CisJCQlzZWwuYWN0aW9uID0gVENfQUNUX1NIT1Q7CisJCQlhcmdjLS07CisJCQlhcmd2Kys7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImNvbnRpbnVlIikgPT0gMCkgeworCQkJc2VsLmFjdGlvbiA9IFRDX0FDVF9VTlNQRUM7CisJCQlhcmdjLS07CisJCQlhcmd2Kys7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInBhc3MiKSA9PSAwKSB7CisJCQlzZWwuYWN0aW9uID0gVENfQUNUX09LOworCQkJYXJnYy0tOworCQkJYXJndisrOworCQl9CisJfQorCisJaWYgKGFyZ2MpIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJpbmRleCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmc2VsLmluZGV4LCAqYXJndiwgMTApKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJOYXQ6IElsbGVnYWwgXCJpbmRleFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlhcmdjLS07CisJCQlhcmd2Kys7CisJCX0KKwl9CisKKwl0YWlsID0gTkxNU0dfVEFJTChuKTsKKwlhZGRhdHRyX2wobiwgTUFYX01TRywgdGNhX2lkLCBOVUxMLCAwKTsKKwlhZGRhdHRyX2wobiwgTUFYX01TRywgVENBX05BVF9QQVJNUywgJnNlbCwgc2l6ZW9mKHNlbCkpOworCXRhaWwtPnJ0YV9sZW4gPSAoY2hhciAqKU5MTVNHX1RBSUwobikgLSAoY2hhciAqKXRhaWw7CisKKwkqYXJnY19wID0gYXJnYzsKKwkqYXJndl9wID0gYXJndjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcHJpbnRfbmF0KHN0cnVjdCBhY3Rpb25fdXRpbCAqYXUsRklMRSAqIGYsIHN0cnVjdCBydGF0dHIgKmFyZykKK3sKKwlzdHJ1Y3QgdGNfbmF0ICpzZWw7CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX05BVF9NQVggKyAxXTsKKwljaGFyIGJ1ZjFbMjU2XTsKKwljaGFyIGJ1ZjJbMjU2XTsKKwlTUFJJTlRfQlVGKGJ1ZjMpOworCWludCBsZW47CisKKwlpZiAoYXJnID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBhcnNlX3J0YXR0cl9uZXN0ZWQodGIsIFRDQV9OQVRfTUFYLCBhcmcpOworCisJaWYgKHRiW1RDQV9OQVRfUEFSTVNdID09IE5VTEwpIHsKKwkJZnByaW50ZihmLCAiW05VTEwgbmF0IHBhcmFtZXRlcnNdIik7CisJCXJldHVybiAtMTsKKwl9CisJc2VsID0gUlRBX0RBVEEodGJbVENBX05BVF9QQVJNU10pOworCisJbGVuID0gZmZzKHNlbC0+bWFzayk7CisJbGVuID0gbGVuID8gMzMgLSBsZW4gOiAwOworCisJZnByaW50ZihmLCAiIG5hdCAlcyAlcy8lZCAlcyAlcyIsIHNlbC0+ZmxhZ3MgJiBUQ0FfTkFUX0ZMQUdfRUdSRVNTID8KKwkJCQkJICAiZWdyZXNzIiA6ICJpbmdyZXNzIiwKKwkJZm9ybWF0X2hvc3QoQUZfSU5FVCwgNCwgJnNlbC0+b2xkX2FkZHIsIGJ1ZjEsIHNpemVvZihidWYxKSksCisJCWxlbiwKKwkJZm9ybWF0X2hvc3QoQUZfSU5FVCwgNCwgJnNlbC0+bmV3X2FkZHIsIGJ1ZjIsIHNpemVvZihidWYyKSksCisJCWFjdGlvbl9uMmEoc2VsLT5hY3Rpb24sIGJ1ZjMsIHNpemVvZiAoYnVmMykpKTsKKworCWlmIChzaG93X3N0YXRzKSB7CisJCWlmICh0YltUQ0FfTkFUX1RNXSkgeworCQkJc3RydWN0IHRjZl90ICp0bSA9IFJUQV9EQVRBKHRiW1RDQV9OQVRfVE1dKTsKKwkJCXByaW50X3RtKGYsdG0pOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBhY3Rpb25fdXRpbCBuYXRfYWN0aW9uX3V0aWwgPSB7CisJLmlkID0gIm5hdCIsCisJLnBhcnNlX2FvcHQgPSBwYXJzZV9uYXQsCisJLnByaW50X2FvcHQgPSBwcmludF9uYXQsCit9OwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvbV9wZWRpdC5jIGIvaXByb3V0ZTIvdGMvbV9wZWRpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZGQxODkKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy9tX3BlZGl0LmMKQEAgLTAsMCArMSw1OTEgQEAKKy8qCisgKiBtX3BlZGl0LmMJCWdlbmVyaWMgcGFja2V0IGVkaXRvciBhY3Rpb25zIG1vZHVsZQorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOiAgSiBIYWRpIFNhbGltIChoYWRpQGN5YmVydXMuY2EpCisgKgorICogVE9ETzoKKyAqCTEpIEJpZyBlbmRpYW4gYnJva2VuIGluIHNvbWUgc3BvdHMKKyAqCTIpIEEgbG90IG9mIHRoaXMgc3R1ZmYgd2FzIGFkZGVkIG9uIHRoZSBmbHk7IGdldCBhIGJpZyBkb3VibGUtZG91YmxlCisgKglhbmQgY2xlYW4gaXQgdXAgYXQgc29tZSBwb2ludC4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0Y191dGlsLmgiCisjaW5jbHVkZSAibV9wZWRpdC5oIgorCitzdGF0aWMgc3RydWN0IG1fcGVkaXRfdXRpbCAqcGVkaXRfbGlzdDsKK3N0YXRpYyBpbnQgcGVkaXRfZGVidWc7CisKK3N0YXRpYyB2b2lkCitleHBsYWluKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogLi4uIHBlZGl0IG11bmdlIDxNVU5HRT5cbiIpOworCWZwcmludGYoc3RkZXJyLAorCQkiV2hlcmU6IE1VTkdFIDo9IDxSQVc+fDxMQVlFUkVEPlxuIgorCQkiXHQ8UkFXPjo9IDxPRkZTRVRDPltBVENdPENNRD5cbiAiCisJCSJcdFx0T0ZGU0VUQzo9IG9mZnNldCA8b2ZmdmFsPiA8dTh8dTE2fHUzMj5cbiAiCisJCSJcdFx0QVRDOj0gYXQgPGF0dmFsPiBvZmZtYXNrIDxtYXNrdmFsPiBzaGlmdCA8c2hpZnR2YWw+XG4gIgorCQkiXHRcdE5PVEU6IG9mZnZhbCBpcyBieXRlIG9mZnNldCwgbXVzdCBiZSBtdWx0aXBsZSBvZiA0XG4gIgorCQkiXHRcdE5PVEU6IG1hc2t2YWwgaXMgYSAzMiBiaXQgaGV4IG51bWJlclxuICIKKwkJIlx0XHROT1RFOiBzaGlmdHZhbCBpcyBhIGlzIGEgc2hpZnQgdmFsdWVcbiAiCisJCSJcdFx0Q01EOj0gY2xlYXIgfCBpbnZlcnQgfCBzZXQgPHNldHZhbD58IHJldGFpblxuICIKKwkJIlx0PExBWUVSRUQ+Oj0gaXAgPGlwZGF0YT4gfCBpcDYgPGlwNmRhdGE+IFxuICIKKwkJIiBcdFx0fCB1ZHAgPHVkcGRhdGE+IHwgdGNwIDx0Y3BkYXRhPiB8IGljbXAgPGljbXBkYXRhPiBcbiIKKwkJIkZvciBFeGFtcGxlIHVzYWdlIGxvb2sgYXQgdGhlIGV4YW1wbGVzIGRpcmVjdG9yeVxuIik7CisKK30KKworc3RhdGljIHZvaWQKK3VzYWdlKHZvaWQpCit7CisJZXhwbGFpbigpOworCWV4aXQoLTEpOworfQorCitzdGF0aWMgaW50CitwZWRpdF9wYXJzZV9ub3BvcHQgKGludCAqYXJnY19wLCBjaGFyICoqKmFyZ3ZfcCxzdHJ1Y3QgdGNfcGVkaXRfc2VsICpzZWwsc3RydWN0IHRjX3BlZGl0X2tleSAqdGtleSkKK3sKKwlpbnQgYXJnYyA9ICphcmdjX3A7CisJY2hhciAqKmFyZ3YgPSAqYXJndl9wOworCisJaWYgKGFyZ2MpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVbmtub3duIGFjdGlvbiAgaGVuY2Ugb3B0aW9uIFwiJXNcIiBpcyB1bnBhcnNhYmxlXG4iLCAqYXJndik7CisJCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIHN0cnVjdCBtX3BlZGl0X3V0aWwgKmdldF9wZWRpdF9raW5kKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlzdGF0aWMgdm9pZCAqcEJPRFk7CisJdm9pZCAqZGxoOworCWNoYXIgYnVmWzI1Nl07CisJc3RydWN0ICBtX3BlZGl0X3V0aWwgKnA7CisKKwlmb3IgKHAgPSBwZWRpdF9saXN0OyBwOyBwID0gcC0+bmV4dCkgeworCQlpZiAoc3RyY21wKHAtPmlkLCBzdHIpID09IDApCisJCQlyZXR1cm4gcDsKKwl9CisKKwlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAicF8lcy5zbyIsIHN0cik7CisJZGxoID0gZGxvcGVuKGJ1ZiwgUlRMRF9MQVpZKTsKKwlpZiAoZGxoID09IE5VTEwpIHsKKwkJZGxoID0gcEJPRFk7CisJCWlmIChkbGggPT0gTlVMTCkgeworCQkJZGxoID0gcEJPRFkgPSBkbG9wZW4oTlVMTCwgUlRMRF9MQVpZKTsKKwkJCWlmIChkbGggPT0gTlVMTCkKKwkJCQlnb3RvIG5vZXhpc3Q7CisJCX0KKwl9CisKKwlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAicF9wZWRpdF8lcyIsIHN0cik7CisJcCA9IGRsc3ltKGRsaCwgYnVmKTsKKwlpZiAocCA9PSBOVUxMKQorCQlnb3RvIG5vZXhpc3Q7CisKK3JlZzoKKwlwLT5uZXh0ID0gcGVkaXRfbGlzdDsKKwlwZWRpdF9saXN0ID0gcDsKKwlyZXR1cm4gcDsKKworbm9leGlzdDoKKwlwID0gbWFsbG9jKHNpemVvZigqcCkpOworCWlmIChwKSB7CisJCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKKwkJc3RybmNweShwLT5pZCwgc3RyLCBzaXplb2YocC0+aWQpLTEpOworCQlwLT5wYXJzZV9wZW9wdCA9IHBlZGl0X3BhcnNlX25vcG9wdDsKKwkJZ290byByZWc7CisJfQorCXJldHVybiBwOworfQorCitpbnQKK3BhY2tfa2V5KHN0cnVjdCB0Y19wZWRpdF9zZWwgKnNlbCxzdHJ1Y3QgdGNfcGVkaXRfa2V5ICp0a2V5KQoreworCWludCBod20gPSBzZWwtPm5rZXlzOworCisJaWYgKGh3bSA+PSBNQVhfT0ZGUykKKwkJcmV0dXJuIC0xOworCisJaWYgKHRrZXktPm9mZiAlIDQpIHsKKwkJZnByaW50ZihzdGRlcnIsICJvZmZzZXRzIE1VU1QgYmUgaW4gMzIgYml0IGJvdW5kYXJpZXNcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJc2VsLT5rZXlzW2h3bV0udmFsID0gdGtleS0+dmFsOworCXNlbC0+a2V5c1tod21dLm1hc2sgPSB0a2V5LT5tYXNrOworCXNlbC0+a2V5c1tod21dLm9mZiA9IHRrZXktPm9mZjsKKwlzZWwtPmtleXNbaHdtXS5hdCA9IHRrZXktPmF0OworCXNlbC0+a2V5c1tod21dLm9mZm1hc2sgPSB0a2V5LT5vZmZtYXNrOworCXNlbC0+a2V5c1tod21dLnNoaWZ0ID0gdGtleS0+c2hpZnQ7CisJc2VsLT5ua2V5cysrOworCXJldHVybiAwOworfQorCisKK2ludAorcGFja19rZXkzMihfX3UzMiByZXRhaW4sc3RydWN0IHRjX3BlZGl0X3NlbCAqc2VsLHN0cnVjdCB0Y19wZWRpdF9rZXkgKnRrZXkpCit7CisJaWYgKHRrZXktPm9mZiA+ICh0a2V5LT5vZmYgJiB+MykpIHsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkicGFja19rZXkzMjogMzIgYml0IG9mZnNldHMgbXVzdCBiZWdpbiBpbiAzMmJpdCBib3VuZGFyaWVzXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXRrZXktPnZhbCA9IGh0b25sKHRrZXktPnZhbCAmIHJldGFpbik7CisJdGtleS0+bWFzayA9IGh0b25sKHRrZXktPm1hc2sgfCB+cmV0YWluKTsKKwkvKiBqYW1hbCByZW1vdmUgdGhpcyAtIGl0IGlzIG5vdCBuZWNlc3NhcnkgZ2l2ZW4gdGhlIGlmIGNoZWNrIGFib3ZlICovCisJdGtleS0+b2ZmICY9IH4zOworCXJldHVybiBwYWNrX2tleShzZWwsdGtleSk7Cit9CisKK2ludAorcGFja19rZXkxNihfX3UzMiByZXRhaW4sc3RydWN0IHRjX3BlZGl0X3NlbCAqc2VsLHN0cnVjdCB0Y19wZWRpdF9rZXkgKnRrZXkpCit7CisJaW50IGluZCwgc3RyaWRlOworCV9fdTMyIG1bNF0gPSB7MHhGRkZGMDAwMCwweEZGMDAwMEZGLDB4MDAwMEZGRkZ9OworCisJaWYgKHRrZXktPnZhbCA+IDB4RkZGRiB8fCB0a2V5LT5tYXNrID4gMHhGRkZGKSB7CisJCWZwcmludGYoc3RkZXJyLCAicGFja19rZXkxNiBiYWQgdmFsdWVcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaW5kID0gdGtleS0+b2ZmICYgMzsKKworCWlmIChpbmQgPT0gMykgeworCQlmcHJpbnRmKHN0ZGVyciwgInBhY2tfa2V5MTYgYmFkIGluZGV4IHZhbHVlICVkXG4iLGluZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlzdHJpZGUgPSA4ICogaW5kOworCXRrZXktPnZhbCA9IGh0b25zKHRrZXktPnZhbCk7CisJdGtleS0+dmFsIDw8PSBzdHJpZGU7CisJdGtleS0+bWFzayA8PD0gc3RyaWRlOworCXJldGFpbiA8PD0gc3RyaWRlOworCXRrZXktPm1hc2sgPSByZXRhaW58bVtpbmRdOworCisJdGtleS0+b2ZmICY9IH4zOworCisJaWYgKHBlZGl0X2RlYnVnKQorCQlwcmludGYoInBhY2tfa2V5MTY6IEZpbmFsIHZhbCAlMDh4IG1hc2sgJTA4eCBcbiIsdGtleS0+dmFsLHRrZXktPm1hc2spOworCXJldHVybiBwYWNrX2tleShzZWwsdGtleSk7CisKK30KKworaW50CitwYWNrX2tleTgoX191MzIgcmV0YWluLHN0cnVjdCB0Y19wZWRpdF9zZWwgKnNlbCxzdHJ1Y3QgdGNfcGVkaXRfa2V5ICp0a2V5KQoreworCWludCBpbmQsIHN0cmlkZTsKKwlfX3UzMiBtWzRdID0gezB4RkZGRkZGMDAsMHhGRkZGMDBGRiwweEZGMDBGRkZGLDB4MDBGRkZGRkZ9OworCisJaWYgKHRrZXktPnZhbCA+IDB4RkYgfHwgdGtleS0+bWFzayA+IDB4RkYpIHsKKwkJZnByaW50ZihzdGRlcnIsICJwYWNrX2tleTggYmFkIHZhbHVlICh2YWwgJXggbWFzayAleFxuIiwgdGtleS0+dmFsLCB0a2V5LT5tYXNrKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWluZCA9IHRrZXktPm9mZiAmIDM7CisKKwlzdHJpZGUgPSA4ICogaW5kOworCXRrZXktPnZhbCA8PD0gc3RyaWRlOworCXRrZXktPm1hc2sgPDw9IHN0cmlkZTsKKwlyZXRhaW4gPDw9IHN0cmlkZTsKKwl0a2V5LT5tYXNrID0gcmV0YWlufG1baW5kXTsKKworCXRrZXktPm9mZiAmPSB+MzsKKworCWlmIChwZWRpdF9kZWJ1ZykKKwkJcHJpbnRmKCJwYWNrX2tleTg6IEZpbmFsIHdvcmQgb2ZmICVkICB2YWwgJTA4eCBtYXNrICUwOHggXG4iLHRrZXktPm9mZiAsIHRrZXktPnZhbCx0a2V5LT5tYXNrKTsKKwlyZXR1cm4gcGFja19rZXkoc2VsLHRrZXkpOworfQorCitpbnQKK3BhcnNlX3ZhbChpbnQgKmFyZ2NfcCwgY2hhciAqKiphcmd2X3AsIF9fdTMyICogdmFsLCBpbnQgdHlwZSkKK3sKKwlpbnQgYXJnYyA9ICphcmdjX3A7CisJY2hhciAqKmFyZ3YgPSAqYXJndl9wOworCisJaWYgKGFyZ2MgPD0gMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKFRJTlQgPT0gdHlwZSkKKwkJcmV0dXJuIGdldF9pbnRlZ2VyKChpbnQgKikgdmFsLCAqYXJndiwgMCk7CisKKwlpZiAoVFUzMiA9PSB0eXBlKQorCQlyZXR1cm4gZ2V0X3UzMih2YWwsICphcmd2LCAwKTsKKworCWlmIChUSVBWNCA9PSB0eXBlKSB7CisJCWluZXRfcHJlZml4IGFkZHI7CisJCWlmIChnZXRfcHJlZml4XzEoJmFkZHIsICphcmd2LCBBRl9JTkVUKSkgeworCQkJcmV0dXJuIC0xOworCQl9CisJCSp2YWw9YWRkci5kYXRhWzBdOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKFRJUFY2ID09IHR5cGUpIHsKKwkJLyogbm90IGltcGxlbWVudGVkIHlldCAqLworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIC0xOworfQorCitpbnQKK3BhcnNlX2NtZChpbnQgKmFyZ2NfcCwgY2hhciAqKiphcmd2X3AsIF9fdTMyIGxlbiwgaW50IHR5cGUsX191MzIgcmV0YWluLHN0cnVjdCB0Y19wZWRpdF9zZWwgKnNlbCxzdHJ1Y3QgdGNfcGVkaXRfa2V5ICp0a2V5KQoreworCV9fdTMyIG1hc2sgPSAwLCB2YWwgPSAwOworCV9fdTMyIG8gPSAweEZGOworCWludCByZXMgPSAtMTsKKwlpbnQgYXJnYyA9ICphcmdjX3A7CisJY2hhciAqKmFyZ3YgPSAqYXJndl9wOworCisJaWYgKGFyZ2MgPD0gMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKHBlZGl0X2RlYnVnKQorCQlwcmludGYoInBhcnNlX2NtZCBhcmdjICVkICVzIG9mZnNldCAlZCBsZW5ndGggJWRcbiIsYXJnYywqYXJndix0a2V5LT5vZmYsbGVuKTsKKworCWlmIChsZW4gPT0gMikKKwkJbyA9IDB4RkZGRjsKKwlpZiAobGVuID09IDQpCisJCW8gPSAweEZGRkZGRkZGOworCisJaWYgKG1hdGNoZXMoKmFyZ3YsICJpbnZlcnQiKSA9PSAwKSB7CisJCXJldGFpbiA9IHZhbCA9IG1hc2sgPSBvOworCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInNldCIpID09IDApIHsKKwkJTkVYVF9BUkcoKTsKKwkJaWYgKHBhcnNlX3ZhbCgmYXJnYywgJmFyZ3YsICZ2YWwsIHR5cGUpKQorCQkJcmV0dXJuIC0xOworCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInByZXNlcnZlIikgPT0gMCkgeworCQlyZXRhaW4gPSBtYXNrID0gbzsKKwl9IGVsc2UgeworCQlpZiAobWF0Y2hlcygqYXJndiwgImNsZWFyIikgIT0gMCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlhcmdjLS07IGFyZ3YrKzsKKworCWlmIChhcmdjICYmIG1hdGNoZXMoKmFyZ3YsICJyZXRhaW4iKSA9PSAwKSB7CisJCU5FWFRfQVJHKCk7CisJCWlmIChwYXJzZV92YWwoJmFyZ2MsICZhcmd2LCAmcmV0YWluLCBUVTMyKSkKKwkJCXJldHVybiAtMTsKKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJdGtleS0+dmFsID0gdmFsOworCisJaWYgKGxlbiA9PSAxKSB7CisJCXRrZXktPm1hc2sgPSAweEZGOworCQlyZXMgPSBwYWNrX2tleTgocmV0YWluLHNlbCx0a2V5KTsKKwkJZ290byBkb25lOworCX0KKwlpZiAobGVuID09IDIpIHsKKwkJdGtleS0+bWFzayA9IG1hc2s7CisJCXJlcyA9IHBhY2tfa2V5MTYocmV0YWluLHNlbCx0a2V5KTsKKwkJZ290byBkb25lOworCX0KKwlpZiAobGVuID09IDQpIHsKKwkJdGtleS0+bWFzayA9IG1hc2s7CisJCXJlcyA9IHBhY2tfa2V5MzIocmV0YWluLHNlbCx0a2V5KTsKKwkJZ290byBkb25lOworCX0KKworCXJldHVybiAtMTsKK2RvbmU6CisJaWYgKHBlZGl0X2RlYnVnKQorCQlwcmludGYoInBhcnNlX2NtZCBkb25lIGFyZ2MgJWQgJXMgb2Zmc2V0ICVkIGxlbmd0aCAlZFxuIixhcmdjLCphcmd2LHRrZXktPm9mZixsZW4pOworCSphcmdjX3AgPSBhcmdjOworCSphcmd2X3AgPSBhcmd2OworCXJldHVybiByZXM7CisKK30KKworaW50CitwYXJzZV9vZmZzZXQoaW50ICphcmdjX3AsIGNoYXIgKioqYXJndl9wLHN0cnVjdCB0Y19wZWRpdF9zZWwgKnNlbCxzdHJ1Y3QgdGNfcGVkaXRfa2V5ICp0a2V5KQoreworCWludCBvZmY7CisJX191MzIgbGVuLCByZXRhaW47CisJaW50IGFyZ2MgPSAqYXJnY19wOworCWNoYXIgKiphcmd2ID0gKmFyZ3ZfcDsKKwlpbnQgcmVzID0gLTE7CisKKwlpZiAoYXJnYyA8PSAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoZ2V0X2ludGVnZXIoJm9mZiwgKmFyZ3YsIDApKQorCQlyZXR1cm4gLTE7CisJdGtleS0+b2ZmID0gb2ZmOworCisJYXJnYy0tOworCWFyZ3YrKzsKKworCWlmIChhcmdjIDw9IDApCisJCXJldHVybiAtMTsKKworCisJaWYgKG1hdGNoZXMoKmFyZ3YsICJ1MzIiKSA9PSAwKSB7CisJCWxlbiA9IDQ7CisJCXJldGFpbiA9IDB4RkZGRkZGRkY7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKG1hdGNoZXMoKmFyZ3YsICJ1MTYiKSA9PSAwKSB7CisJCWxlbiA9IDI7CisJCXJldGFpbiA9IDB4MDsKKwkJZ290byBkb25lOworCX0KKwlpZiAobWF0Y2hlcygqYXJndiwgInU4IikgPT0gMCkgeworCQlsZW4gPSAxOworCQlyZXRhaW4gPSAweDA7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXR1cm4gLTE7CisKK2RvbmU6CisKKwlORVhUX0FSRygpOworCisJLyogW2F0IDxzb21ldmFsPiBvZmZtYXNrIDxtYXNrdmFsPiBzaGlmdCA8c2hpZnR2YWw+XSAqLworCWlmIChtYXRjaGVzKCphcmd2LCAiYXQiKSA9PSAwKSB7CisKKwkJX191MzIgYXR2PTAsb2ZmbWFzaz0weDAsc2hpZnQ9MDsKKworCQlORVhUX0FSRygpOworCQlpZiAoZ2V0X3UzMigmYXR2LCAqYXJndiwgMCkpCisJCQlyZXR1cm4gLTE7CisJCXRrZXktPmF0ID0gYXR2OworCisJCU5FWFRfQVJHKCk7CisKKwkJaWYgKGdldF91MzIoJm9mZm1hc2ssICphcmd2LCAxNikpCisJCQlyZXR1cm4gLTE7CisJCXRrZXktPm9mZm1hc2sgPSBvZmZtYXNrOworCisJCU5FWFRfQVJHKCk7CisKKwkJaWYgKGdldF91MzIoJnNoaWZ0LCAqYXJndiwgMCkpCisJCQlyZXR1cm4gLTE7CisJCXRrZXktPnNoaWZ0ID0gc2hpZnQ7CisKKwkJTkVYVF9BUkcoKTsKKwl9CisKKwlyZXMgPSBwYXJzZV9jbWQoJmFyZ2MsICZhcmd2LCBsZW4sIFRVMzIscmV0YWluLHNlbCx0a2V5KTsKKworCSphcmdjX3AgPSBhcmdjOworCSphcmd2X3AgPSBhcmd2OworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQKK3BhcnNlX211bmdlKGludCAqYXJnY19wLCBjaGFyICoqKmFyZ3ZfcCxzdHJ1Y3QgdGNfcGVkaXRfc2VsICpzZWwpCit7CisJc3RydWN0IHRjX3BlZGl0X2tleSB0a2V5OworCWludCBhcmdjID0gKmFyZ2NfcDsKKwljaGFyICoqYXJndiA9ICphcmd2X3A7CisJaW50IHJlcyA9IC0xOworCisJaWYgKGFyZ2MgPD0gMCkKKwkJcmV0dXJuIC0xOworCisJbWVtc2V0KCZ0a2V5LCAwLCBzaXplb2YodGtleSkpOworCisJaWYgKG1hdGNoZXMoKmFyZ3YsICJvZmZzZXQiKSA9PSAwKSB7CisJCU5FWFRfQVJHKCk7CisJCXJlcyA9IHBhcnNlX29mZnNldCgmYXJnYywgJmFyZ3Ysc2VsLCZ0a2V5KTsKKwkJZ290byBkb25lOworCX0gZWxzZSB7CisJCWNoYXIga1sxNl07CisJCXN0cnVjdCBtX3BlZGl0X3V0aWwgKnAgPSBOVUxMOworCisJCXN0cm5jcHkoaywgKmFyZ3YsIHNpemVvZiAoaykgLSAxKTsKKworCQlpZiAoYXJnYyA+IDAgKSB7CisJCQlwID0gZ2V0X3BlZGl0X2tpbmQoayk7CisJCQlpZiAoTlVMTCA9PSBwKQorCQkJCWdvdG8gYmFkX3ZhbDsKKwkJCXJlcyA9IHAtPnBhcnNlX3Blb3B0KCZhcmdjLCAmYXJndiwgc2VsLCZ0a2V5KTsKKwkJCWlmIChyZXMgPCAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsImJhZCBwZWRpdCBwYXJzaW5nXG4iKTsKKwkJCQlnb3RvIGJhZF92YWw7CisJCQl9CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKK2JhZF92YWw6CisJcmV0dXJuIC0xOworCitkb25lOgorCisJKmFyZ2NfcCA9IGFyZ2M7CisJKmFyZ3ZfcCA9IGFyZ3Y7CisJcmV0dXJuIHJlczsKK30KKworaW50CitwYXJzZV9wZWRpdChzdHJ1Y3QgYWN0aW9uX3V0aWwgKmEsIGludCAqYXJnY19wLCBjaGFyICoqKmFyZ3ZfcCwgaW50IHRjYV9pZCwgc3RydWN0IG5sbXNnaGRyICpuKQoreworCXN0cnVjdCB7CisJCXN0cnVjdCB0Y19wZWRpdF9zZWwgc2VsOworCQlzdHJ1Y3QgdGNfcGVkaXRfa2V5IGtleXNbTUFYX09GRlNdOworCX0gc2VsOworCisJaW50IGFyZ2MgPSAqYXJnY19wOworCWNoYXIgKiphcmd2ID0gKmFyZ3ZfcDsKKwlpbnQgb2sgPSAwLCBpb2sgPSAwOworCXN0cnVjdCBydGF0dHIgKnRhaWw7CisKKwltZW1zZXQoJnNlbCwgMCwgc2l6ZW9mKHNlbCkpOworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChwZWRpdF9kZWJ1ZyA+IDEpCisJCQlmcHJpbnRmKHN0ZGVyciwgIndoaWxlIHBlZGl0ICglZDolcylcbiIsYXJnYywgKmFyZ3YpOworCQlpZiAobWF0Y2hlcygqYXJndiwgInBlZGl0IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCW9rKys7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiaGVscCIpID09IDApIHsKKwkJCXVzYWdlKCk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgIm11bmdlIikgPT0gMCkgeworCQkJaWYgKCFvaykgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBwZWRpdCBjb25zdHJ1Y3QgKCVzKSBcbiIsICphcmd2KTsKKwkJCQlleHBsYWluKCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChwYXJzZV9tdW5nZSgmYXJnYywgJmFyZ3YsJnNlbC5zZWwpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIHBlZGl0IGNvbnN0cnVjdCAoJXMpIFxuIiwgKmFyZ3YpOworCQkJCWV4cGxhaW4oKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlvaysrOworCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCX0KKworCX0KKworCWlmICghb2spIHsKKwkJZXhwbGFpbigpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGFyZ2MpIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJyZWNsYXNzaWZ5IikgPT0gMCkgeworCQkJc2VsLnNlbC5hY3Rpb24gPSBUQ19BQ1RfUkVDTEFTU0lGWTsKKwkJCU5FWFRfQVJHKCk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInBpcGUiKSA9PSAwKSB7CisJCQlzZWwuc2VsLmFjdGlvbiA9IFRDX0FDVF9QSVBFOworCQkJTkVYVF9BUkcoKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiZHJvcCIpID09IDAgfHwKKwkJCW1hdGNoZXMoKmFyZ3YsICJzaG90IikgPT0gMCkgeworCQkJc2VsLnNlbC5hY3Rpb24gPSBUQ19BQ1RfU0hPVDsKKwkJCU5FWFRfQVJHKCk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImNvbnRpbnVlIikgPT0gMCkgeworCQkJc2VsLnNlbC5hY3Rpb24gPSBUQ19BQ1RfVU5TUEVDOworCQkJTkVYVF9BUkcoKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAicGFzcyIpID09IDApIHsKKwkJCXNlbC5zZWwuYWN0aW9uID0gVENfQUNUX09LOworCQkJTkVYVF9BUkcoKTsKKwkJfQorCX0KKworCWlmIChhcmdjKSB7CisJCWlmIChtYXRjaGVzKCphcmd2LCAiaW5kZXgiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJnNlbC5zZWwuaW5kZXgsICphcmd2LCAxMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlBlZGl0OiBJbGxlZ2FsIFwiaW5kZXhcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYXJnYy0tOworCQkJYXJndisrOworCQkJaW9rKys7CisJCX0KKwl9CisKKwl0YWlsID0gTkxNU0dfVEFJTChuKTsKKwlhZGRhdHRyX2wobiwgTUFYX01TRywgdGNhX2lkLCBOVUxMLCAwKTsKKwlhZGRhdHRyX2wobiwgTUFYX01TRywgVENBX1BFRElUX1BBUk1TLCZzZWwsIHNpemVvZihzZWwuc2VsKStzZWwuc2VsLm5rZXlzKnNpemVvZihzdHJ1Y3QgdGNfcGVkaXRfa2V5KSk7CisJdGFpbC0+cnRhX2xlbiA9ICh2b2lkICopIE5MTVNHX1RBSUwobikgLSAodm9pZCAqKSB0YWlsOworCisJKmFyZ2NfcCA9IGFyZ2M7CisJKmFyZ3ZfcCA9IGFyZ3Y7CisJcmV0dXJuIDA7Cit9CisKK2ludAorcHJpbnRfcGVkaXQoc3RydWN0IGFjdGlvbl91dGlsICphdSxGSUxFICogZiwgc3RydWN0IHJ0YXR0ciAqYXJnKQoreworCXN0cnVjdCB0Y19wZWRpdF9zZWwgKnNlbDsKKwlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfUEVESVRfTUFYICsgMV07CisJU1BSSU5UX0JVRihiMSk7CisKKwlpZiAoYXJnID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBhcnNlX3J0YXR0cl9uZXN0ZWQodGIsIFRDQV9QRURJVF9NQVgsIGFyZyk7CisKKwlpZiAodGJbVENBX1BFRElUX1BBUk1TXSA9PSBOVUxMKSB7CisJCWZwcmludGYoZiwgIltOVUxMIHBlZGl0IHBhcmFtZXRlcnNdIik7CisJCXJldHVybiAtMTsKKwl9CisJc2VsID0gUlRBX0RBVEEodGJbVENBX1BFRElUX1BBUk1TXSk7CisKKwlmcHJpbnRmKGYsICIgcGVkaXQgYWN0aW9uICVzIGtleXMgJWRcbiAiLCBhY3Rpb25fbjJhKHNlbC0+YWN0aW9uLCBiMSwgc2l6ZW9mIChiMSkpLHNlbC0+bmtleXMpOworCWZwcmludGYoZiwgIlx0IGluZGV4ICVkIHJlZiAlZCBiaW5kICVkIiwgc2VsLT5pbmRleCxzZWwtPnJlZmNudCwgc2VsLT5iaW5kY250KTsKKworCWlmIChzaG93X3N0YXRzKSB7CisJCWlmICh0YltUQ0FfUEVESVRfVE1dKSB7CisJCQlzdHJ1Y3QgdGNmX3QgKnRtID0gUlRBX0RBVEEodGJbVENBX1BFRElUX1RNXSk7CisJCQlwcmludF90bShmLHRtKTsKKwkJfQorCX0KKwlpZiAoc2VsLT5ua2V5cykgeworCQlpbnQgaTsKKwkJc3RydWN0IHRjX3BlZGl0X2tleSAqa2V5ID0gc2VsLT5rZXlzOworCisJCWZvciAoaT0wOyBpPHNlbC0+bmtleXM7IGkrKywga2V5KyspIHsKKwkJCWZwcmludGYoZiwgIlxuXHQga2V5ICMlZCIsaSk7CisJCQlmcHJpbnRmKGYsICIgIGF0ICVkOiB2YWwgJTA4eCBtYXNrICUwOHgiLAorCQkJKHVuc2lnbmVkIGludClrZXktPm9mZiwKKwkJCSh1bnNpZ25lZCBpbnQpbnRvaGwoa2V5LT52YWwpLAorCQkJKHVuc2lnbmVkIGludCludG9obChrZXktPm1hc2spKTsKKwkJfQorCX0gZWxzZSB7CisJCWZwcmludGYoZiwgIlxucGVkaXQgJXgga2V5cyAlZCBpcyBub3QgTEVHSVQiLCBzZWwtPmluZGV4LHNlbC0+bmtleXMpOworCX0KKworCisJZnByaW50ZihmLCAiXG4gIik7CisJcmV0dXJuIDA7Cit9CisKK2ludAorcGVkaXRfcHJpbnRfeHN0YXRzKHN0cnVjdCBhY3Rpb25fdXRpbCAqYXUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKnhzdGF0cykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGFjdGlvbl91dGlsIHBlZGl0X2FjdGlvbl91dGlsID0geworCS5pZCA9ICJwZWRpdCIsCisJLnBhcnNlX2FvcHQgPSBwYXJzZV9wZWRpdCwKKwkucHJpbnRfYW9wdCA9IHByaW50X3BlZGl0LAorfTsKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RjL21fcGVkaXQuaCBiL2lwcm91dGUyL3RjL21fcGVkaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjk4Yzk1Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGMvbV9wZWRpdC5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBtX3BlZGl0LmgJCWdlbmVyaWMgcGFja2V0IGVkaXRvciBhY3Rpb25zIG1vZHVsZQorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOiAgSiBIYWRpIFNhbGltIChoYWRpQGN5YmVydXMuY2EpCisgKgorICovCisKKyNpZm5kZWYgX0FDVF9QRURJVF9IXworI2RlZmluZSBfQUNUX1BFRElUX0hfIDEKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAidGNfdXRpbC5oIgorI2luY2x1ZGUgPGxpbnV4L3RjX2FjdC90Y19wZWRpdC5oPgorCisjZGVmaW5lIE1BWF9PRkZTIDEyOAorCisjZGVmaW5lIFRJUFY0IDEKKyNkZWZpbmUgVElQVjYgMgorI2RlZmluZSBUSU5UIDMKKyNkZWZpbmUgVFUzMiA0CisKKyNkZWZpbmUgUlUzMiAweEZGRkZGRkZGCisjZGVmaW5lIFJVMTYgMHhGRkZGCisjZGVmaW5lIFJVOCAweEZGCisKKyNkZWZpbmUgUEVESVRLSU5EU0laIDE2CisKK3N0cnVjdCBtX3BlZGl0X3V0aWwKK3sKKwlzdHJ1Y3QgbV9wZWRpdF91dGlsICpuZXh0OworCWNoYXIgICAgaWRbUEVESVRLSU5EU0laXTsKKwlpbnQgICAgICgqcGFyc2VfcGVvcHQpKGludCAqYXJnY19wLCBjaGFyICoqKmFyZ3ZfcCxzdHJ1Y3QgdGNfcGVkaXRfc2VsICpzZWwsc3RydWN0IHRjX3BlZGl0X2tleSAqdGtleSk7Cit9OworCisKK2V4dGVybiBpbnQgcGFyc2VfY21kKGludCAqYXJnY19wLCBjaGFyICoqKmFyZ3ZfcCwgX191MzIgbGVuLCBpbnQgdHlwZSxfX3UzMiByZXRhaW4sc3RydWN0IHRjX3BlZGl0X3NlbCAqc2VsLHN0cnVjdCB0Y19wZWRpdF9rZXkgKnRrZXkpOworZXh0ZXJuIGludCBwYWNrX2tleShzdHJ1Y3QgdGNfcGVkaXRfc2VsICpzZWwsc3RydWN0IHRjX3BlZGl0X2tleSAqdGtleSk7CitleHRlcm4gaW50IHBhY2tfa2V5MzIoX191MzIgcmV0YWluLHN0cnVjdCB0Y19wZWRpdF9zZWwgKnNlbCxzdHJ1Y3QgdGNfcGVkaXRfa2V5ICp0a2V5KTsKK2V4dGVybiBpbnQgcGFja19rZXkxNihfX3UzMiByZXRhaW4sc3RydWN0IHRjX3BlZGl0X3NlbCAqc2VsLHN0cnVjdCB0Y19wZWRpdF9rZXkgKnRrZXkpOworZXh0ZXJuIGludCBwYWNrX2tleTgoX191MzIgcmV0YWluLHN0cnVjdCB0Y19wZWRpdF9zZWwgKnNlbCxzdHJ1Y3QgdGNfcGVkaXRfa2V5ICp0a2V5KTsKK2V4dGVybiBpbnQgcGFyc2VfdmFsKGludCAqYXJnY19wLCBjaGFyICoqKmFyZ3ZfcCwgX191MzIgKiB2YWwsIGludCB0eXBlKTsKK2V4dGVybiBpbnQgcGFyc2VfY21kKGludCAqYXJnY19wLCBjaGFyICoqKmFyZ3ZfcCwgX191MzIgbGVuLCBpbnQgdHlwZSxfX3UzMiByZXRhaW4sc3RydWN0IHRjX3BlZGl0X3NlbCAqc2VsLHN0cnVjdCB0Y19wZWRpdF9rZXkgKnRrZXkpOworZXh0ZXJuIGludCBwYXJzZV9vZmZzZXQoaW50ICphcmdjX3AsIGNoYXIgKioqYXJndl9wLHN0cnVjdCB0Y19wZWRpdF9zZWwgKnNlbCxzdHJ1Y3QgdGNfcGVkaXRfa2V5ICp0a2V5KTsKK2ludCBwYXJzZV9wZWRpdChzdHJ1Y3QgYWN0aW9uX3V0aWwgKmEsIGludCAqYXJnY19wLCBjaGFyICoqKmFyZ3ZfcCwgaW50IHRjYV9pZCwgc3RydWN0IG5sbXNnaGRyICpuKTsKK2V4dGVybiBpbnQgcHJpbnRfcGVkaXQoc3RydWN0IGFjdGlvbl91dGlsICphdSxGSUxFICogZiwgc3RydWN0IHJ0YXR0ciAqYXJnKTsKK2V4dGVybiBpbnQgcGVkaXRfcHJpbnRfeHN0YXRzKHN0cnVjdCBhY3Rpb25fdXRpbCAqYXUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKnhzdGF0cyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvbV9wb2xpY2UuYyBiL2lwcm91dGUyL3RjL21fcG9saWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE1ZjFhNQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL21fcG9saWNlLmMKQEAgLTAsMCArMSwzNzQgQEAKKy8qCisgKiBtX3BvbGljZS5jCQlQYXJzZS9wcmludCBwb2xpY2luZyBtb2R1bGUgb3B0aW9ucy4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gdTMyaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKiBGSVhFUzogICAgICAgMTk5OTA2MTkgLSBKIEhhZGkgU2FsaW0gKGhhZGlAY3liZXJ1cy5jYSkKKyAqCQlzaW1wbGUgYWRkYXR0ciBwYWNrYWdpbmcgZml4LgorICoJCTIwMDI6IEogSGFkaSBTYWxpbSAtIEFkZCB0YyBhY3Rpb24gZXh0ZW5zaW9ucyBzeW50YXgKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0Y191dGlsLmgiCisKK3N0cnVjdCBhY3Rpb25fdXRpbCBwb2xpY2VfYWN0aW9uX3V0aWwgPSB7CisJLmlkID0gInBvbGljZSIsCisJLnBhcnNlX2FvcHQgPSBhY3RfcGFyc2VfcG9saWNlLAorCS5wcmludF9hb3B0ID0gcHJpbnRfcG9saWNlLAorfTsKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAuLi4gcG9saWNlIHJhdGUgQlBTIGJ1cnN0IEJZVEVTWy9CWVRFU10gWyBtdHUgQllURVNbL0JZVEVTXSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBbIHBlYWtyYXRlIEJQUyBdIFsgYXZyYXRlIEJQUyBdIFsgb3ZlcmhlYWQgQllURVMgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgWyBsaW5rbGF5ZXIgVFlQRSBdIFsgQUNUSU9OVEVSTSBdXG4iKTsKKworCWZwcmludGYoc3RkZXJyLCAiTmV3IFN5bnRheCBBQ1RJT05URVJNIDo9IGNvbmZvcm0tZXhjZWVkIDxFWENFRURBQ1Q+Wy9OT1RFWENFRURBQ1RdIFxuIik7CisJZnByaW50ZihzdGRlcnIsICJXaGVyZTogKkVYQ0VFREFDVCA6PSBwaXBlIHwgb2sgfCByZWNsYXNzaWZ5IHwgZHJvcCB8IGNvbnRpbnVlIFxuIik7CisJZnByaW50ZihzdGRlcnIsICJXaGVyZTogIHBpcGUgaXMgb25seSB2YWxpZCBmb3IgbmV3IHN5bnRheCBcbiIpOworCWV4aXQoLTEpOworfQorCitzdGF0aWMgdm9pZCBleHBsYWluMShjaGFyICphcmcpCit7CisJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwiJXNcIlxuIiwgYXJnKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnBvbGljZV9hY3Rpb25fbjJhKGludCBhY3Rpb24sIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgLTE6CisJCXJldHVybiAiY29udGludWUiOworCQlicmVhazsKKwljYXNlIFRDX1BPTElDRV9PSzoKKwkJcmV0dXJuICJwYXNzIjsKKwkJYnJlYWs7CisJY2FzZSBUQ19QT0xJQ0VfU0hPVDoKKwkJcmV0dXJuICJkcm9wIjsKKwkJYnJlYWs7CisJY2FzZSBUQ19QT0xJQ0VfUkVDTEFTU0lGWToKKwkJcmV0dXJuICJyZWNsYXNzaWZ5IjsKKwljYXNlIFRDX1BPTElDRV9QSVBFOgorCQlyZXR1cm4gInBpcGUiOworCWRlZmF1bHQ6CisJCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJWQiLCBhY3Rpb24pOworCQlyZXR1cm4gYnVmOworCX0KK30KKworc3RhdGljIGludCBwb2xpY2VfYWN0aW9uX2Eybihjb25zdCBjaGFyICphcmcsIGludCAqcmVzdWx0KQoreworCWludCByZXM7CisKKwlpZiAobWF0Y2hlcyhhcmcsICJjb250aW51ZSIpID09IDApCisJCXJlcyA9IC0xOworCWVsc2UgaWYgKG1hdGNoZXMoYXJnLCAiZHJvcCIpID09IDApCisJCXJlcyA9IFRDX1BPTElDRV9TSE9UOworCWVsc2UgaWYgKG1hdGNoZXMoYXJnLCAic2hvdCIpID09IDApCisJCXJlcyA9IFRDX1BPTElDRV9TSE9UOworCWVsc2UgaWYgKG1hdGNoZXMoYXJnLCAicGFzcyIpID09IDApCisJCXJlcyA9IFRDX1BPTElDRV9PSzsKKwllbHNlIGlmIChzdHJjbXAoYXJnLCAib2siKSA9PSAwKQorCQlyZXMgPSBUQ19QT0xJQ0VfT0s7CisJZWxzZSBpZiAobWF0Y2hlcyhhcmcsICJyZWNsYXNzaWZ5IikgPT0gMCkKKwkJcmVzID0gVENfUE9MSUNFX1JFQ0xBU1NJRlk7CisJZWxzZSBpZiAobWF0Y2hlcyhhcmcsICJwaXBlIikgPT0gMCkKKwkJcmVzID0gVENfUE9MSUNFX1BJUEU7CisJZWxzZSB7CisJCWNoYXIgZHVtbXk7CisJCWlmIChzc2NhbmYoYXJnLCAiJWQlYyIsICZyZXMsICZkdW1teSkgIT0gMSkKKwkJCXJldHVybiAtMTsKKwl9CisJKnJlc3VsdCA9IHJlczsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGdldF9wb2xpY2VfcmVzdWx0KGludCAqYWN0aW9uLCBpbnQgKnJlc3VsdCwgY2hhciAqYXJnKQoreworCWNoYXIgKnAgPSBzdHJjaHIoYXJnLCAnLycpOworCisJaWYgKHApCisJCSpwID0gMDsKKworCWlmIChwb2xpY2VfYWN0aW9uX2EybihhcmcsIGFjdGlvbikpIHsKKwkJaWYgKHApCisJCQkqcCA9ICcvJzsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChwKSB7CisJCSpwID0gJy8nOworCQlpZiAocG9saWNlX2FjdGlvbl9hMm4ocCsxLCByZXN1bHQpKQorCQkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworCitpbnQgYWN0X3BhcnNlX3BvbGljZShzdHJ1Y3QgYWN0aW9uX3V0aWwgKmEsaW50ICphcmdjX3AsIGNoYXIgKioqYXJndl9wLCBpbnQgdGNhX2lkLCBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJaW50IGFyZ2MgPSAqYXJnY19wOworCWNoYXIgKiphcmd2ID0gKmFyZ3ZfcDsKKwlpbnQgcmVzID0gLTE7CisJaW50IG9rPTA7CisJc3RydWN0IHRjX3BvbGljZSBwOworCV9fdTMyIHJ0YWJbMjU2XTsKKwlfX3UzMiBwdGFiWzI1Nl07CisJX191MzIgYXZyYXRlID0gMDsKKwlpbnQgcHJlc3VsdCA9IDA7CisJdW5zaWduZWQgYnVmZmVyPTAsIG10dT0wLCBtcHU9MDsKKwl1bnNpZ25lZCBzaG9ydCBvdmVyaGVhZD0wOworCXVuc2lnbmVkIGludCBsaW5rbGF5ZXIgPSBMSU5LTEFZRVJfRVRIRVJORVQ7IC8qIEFzc3VtZSBldGhlcm5ldCAqLworCWludCBSY2VsbF9sb2c9LTEsIFBjZWxsX2xvZyA9IC0xOworCXN0cnVjdCBydGF0dHIgKnRhaWw7CisKKwltZW1zZXQoJnAsIDAsIHNpemVvZihwKSk7CisJcC5hY3Rpb24gPSBUQ19QT0xJQ0VfUkVDTEFTU0lGWTsKKworCWlmIChhKSAvKiBuZXcgd2F5IG9mIGRvaW5nIHRoaW5ncyAqLworCQlORVhUX0FSRygpOworCisJaWYgKGFyZ2MgPD0gMCkKKwkJcmV0dXJuIC0xOworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJpbmRleCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmcC5pbmRleCwgKmFyZ3YsIDEwKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImluZGV4XCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiYnVyc3QiKSA9PSAwIHx8CisJCQlzdHJjbXAoKmFyZ3YsICJidWZmZXIiKSA9PSAwIHx8CisJCQlzdHJjbXAoKmFyZ3YsICJtYXhidXJzdCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoYnVmZmVyKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJEb3VibGUgXCJidWZmZXIvYnVyc3RcIiBzcGVjXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAoZ2V0X3NpemVfYW5kX2NlbGwoJmJ1ZmZlciwgJlJjZWxsX2xvZywgKmFyZ3YpIDwgMCkgeworCQkJCWV4cGxhaW4xKCJidWZmZXIiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibXR1IikgPT0gMCB8fAorCQkJICAgc3RyY21wKCphcmd2LCAibWluYnVyc3QiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKG10dSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiRG91YmxlIFwibXR1L21pbmJ1cnN0XCIgc3BlY1xuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKGdldF9zaXplX2FuZF9jZWxsKCZtdHUsICZQY2VsbF9sb2csICphcmd2KSA8IDApIHsKKwkJCQlleHBsYWluMSgibXR1Iik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm1wdSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAobXB1KSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJEb3VibGUgXCJtcHVcIiBzcGVjXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAoZ2V0X3NpemUoJm1wdSwgKmFyZ3YpKSB7CisJCQkJZXhwbGFpbjEoIm1wdSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJyYXRlIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChwLnJhdGUucmF0ZSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiRG91YmxlIFwicmF0ZVwiIHNwZWNcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChnZXRfcmF0ZSgmcC5yYXRlLnJhdGUsICphcmd2KSkgeworCQkJCWV4cGxhaW4xKCJyYXRlIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImF2cmF0ZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoYXZyYXRlKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJEb3VibGUgXCJhdnJhdGVcIiBzcGVjXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAoZ2V0X3JhdGUoJmF2cmF0ZSwgKmFyZ3YpKSB7CisJCQkJZXhwbGFpbjEoImF2cmF0ZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAicGVha3JhdGUiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHAucGVha3JhdGUucmF0ZSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiRG91YmxlIFwicGVha3JhdGVcIiBzcGVjXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAoZ2V0X3JhdGUoJnAucGVha3JhdGUucmF0ZSwgKmFyZ3YpKSB7CisJCQkJZXhwbGFpbjEoInBlYWtyYXRlIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJyZWNsYXNzaWZ5IikgPT0gMCkgeworCQkJcC5hY3Rpb24gPSBUQ19QT0xJQ0VfUkVDTEFTU0lGWTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiZHJvcCIpID09IDAgfHwKKwkJCSAgIG1hdGNoZXMoKmFyZ3YsICJzaG90IikgPT0gMCkgeworCQkJcC5hY3Rpb24gPSBUQ19QT0xJQ0VfU0hPVDsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiY29udGludWUiKSA9PSAwKSB7CisJCQlwLmFjdGlvbiA9IFRDX1BPTElDRV9VTlNQRUM7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInBhc3MiKSA9PSAwKSB7CisJCQlwLmFjdGlvbiA9IFRDX1BPTElDRV9PSzsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAicGlwZSIpID09IDApIHsKKwkJCXAuYWN0aW9uID0gVENfUE9MSUNFX1BJUEU7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiY29uZm9ybS1leGNlZWQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9wb2xpY2VfcmVzdWx0KCZwLmFjdGlvbiwgJnByZXN1bHQsICphcmd2KSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImFjdGlvblwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgIm92ZXJoZWFkIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTE2KCZvdmVyaGVhZCwgKmFyZ3YsIDEwKSkgeworCQkJCWV4cGxhaW4xKCJvdmVyaGVhZCIpOyByZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImxpbmtsYXllciIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X2xpbmtsYXllcigmbGlua2xheWVyLCAqYXJndikpIHsKKwkJCQlleHBsYWluMSgibGlua2xheWVyIik7IHJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJdXNhZ2UoKTsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJCW9rKys7CisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCWlmICghb2spCisJCXJldHVybiAtMTsKKworCWlmIChwLnJhdGUucmF0ZSAmJiAhYnVmZmVyKSB7CisJCWZwcmludGYoc3RkZXJyLCAiXCJidXJzdFwiIHJlcXVpcmVzIFwicmF0ZVwiLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHAucGVha3JhdGUucmF0ZSkgeworCQlpZiAoIXAucmF0ZS5yYXRlKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlwicGVha3JhdGVcIiByZXF1aXJlcyBcInJhdGVcIi5cbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmICghbXR1KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlwibXR1XCIgaXMgcmVxdWlyZWQsIGlmIFwicGVha3JhdGVcIiBpcyByZXF1ZXN0ZWQuXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWlmIChwLnJhdGUucmF0ZSkgeworCQlwLnJhdGUubXB1ID0gbXB1OworCQlwLnJhdGUub3ZlcmhlYWQgPSBvdmVyaGVhZDsKKwkJaWYgKHRjX2NhbGNfcnRhYmxlKCZwLnJhdGUsIHJ0YWIsIFJjZWxsX2xvZywgbXR1LCBsaW5rbGF5ZXIpIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJUQkY6IGZhaWxlZCB0byBjYWxjdWxhdGUgcmF0ZSB0YWJsZS5cbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXAuYnVyc3QgPSB0Y19jYWxjX3htaXR0aW1lKHAucmF0ZS5yYXRlLCBidWZmZXIpOworCX0KKwlwLm10dSA9IG10dTsKKwlpZiAocC5wZWFrcmF0ZS5yYXRlKSB7CisJCXAucGVha3JhdGUubXB1ID0gbXB1OworCQlwLnBlYWtyYXRlLm92ZXJoZWFkID0gb3ZlcmhlYWQ7CisJCWlmICh0Y19jYWxjX3J0YWJsZSgmcC5wZWFrcmF0ZSwgcHRhYiwgUGNlbGxfbG9nLCBtdHUsIGxpbmtsYXllcikgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlBPTElDRTogZmFpbGVkIHRvIGNhbGN1bGF0ZSBwZWFrIHJhdGUgdGFibGUuXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXRhaWwgPSBOTE1TR19UQUlMKG4pOworCWFkZGF0dHJfbChuLCBNQVhfTVNHLCB0Y2FfaWQsIE5VTEwsIDApOworCWFkZGF0dHJfbChuLCBNQVhfTVNHLCBUQ0FfUE9MSUNFX1RCRiwgJnAsIHNpemVvZihwKSk7CisJaWYgKHAucmF0ZS5yYXRlKQorCQlhZGRhdHRyX2wobiwgTUFYX01TRywgVENBX1BPTElDRV9SQVRFLCBydGFiLCAxMDI0KTsKKwlpZiAocC5wZWFrcmF0ZS5yYXRlKQorICAgICAgICAgICAgICAgIGFkZGF0dHJfbChuLCBNQVhfTVNHLCBUQ0FfUE9MSUNFX1BFQUtSQVRFLCBwdGFiLCAxMDI0KTsKKwlpZiAoYXZyYXRlKQorCQlhZGRhdHRyMzIobiwgTUFYX01TRywgVENBX1BPTElDRV9BVlJBVEUsIGF2cmF0ZSk7CisJaWYgKHByZXN1bHQpCisJCWFkZGF0dHIzMihuLCBNQVhfTVNHLCBUQ0FfUE9MSUNFX1JFU1VMVCwgcHJlc3VsdCk7CisKKwl0YWlsLT5ydGFfbGVuID0gKHZvaWQgKikgTkxNU0dfVEFJTChuKSAtICh2b2lkICopIHRhaWw7CisJcmVzID0gMDsKKworCSphcmdjX3AgPSBhcmdjOworCSphcmd2X3AgPSBhcmd2OworCXJldHVybiByZXM7Cit9CisKK2ludCBwYXJzZV9wb2xpY2UoaW50ICphcmdjX3AsIGNoYXIgKioqYXJndl9wLCBpbnQgdGNhX2lkLCBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJcmV0dXJuIGFjdF9wYXJzZV9wb2xpY2UoTlVMTCxhcmdjX3AsYXJndl9wLHRjYV9pZCxuKTsKK30KKworaW50CitwcmludF9wb2xpY2Uoc3RydWN0IGFjdGlvbl91dGlsICphLCBGSUxFICpmLCBzdHJ1Y3QgcnRhdHRyICphcmcpCit7CisJU1BSSU5UX0JVRihiMSk7CisJU1BSSU5UX0JVRihiMik7CisJc3RydWN0IHRjX3BvbGljZSAqcDsKKwlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfUE9MSUNFX01BWCsxXTsKKwl1bnNpZ25lZCBidWZmZXI7CisJdW5zaWduZWQgaW50IGxpbmtsYXllcjsKKworCWlmIChhcmcgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlwYXJzZV9ydGF0dHJfbmVzdGVkKHRiLCBUQ0FfUE9MSUNFX01BWCwgYXJnKTsKKworCWlmICh0YltUQ0FfUE9MSUNFX1RCRl0gPT0gTlVMTCkgeworCQlmcHJpbnRmKGYsICJbTlVMTCBwb2xpY2UgdGJmXSIpOworCQlyZXR1cm4gMDsKKwl9CisjaWZuZGVmIFNUT09QSURfOEJZVEUKKwlpZiAoUlRBX1BBWUxPQUQodGJbVENBX1BPTElDRV9UQkZdKSAgPCBzaXplb2YoKnApKSB7CisJCWZwcmludGYoZiwgIlt0cnVuY2F0ZWQgcG9saWNlIHRiZl0iKTsKKwkJcmV0dXJuIC0xOworCX0KKyNlbmRpZgorCXAgPSBSVEFfREFUQSh0YltUQ0FfUE9MSUNFX1RCRl0pOworCisJZnByaW50ZihmLCAiIHBvbGljZSAweCV4ICIsIHAtPmluZGV4KTsKKwlmcHJpbnRmKGYsICJyYXRlICVzICIsIHNwcmludF9yYXRlKHAtPnJhdGUucmF0ZSwgYjEpKTsKKwlidWZmZXIgPSB0Y19jYWxjX3htaXRzaXplKHAtPnJhdGUucmF0ZSwgcC0+YnVyc3QpOworCWZwcmludGYoZiwgImJ1cnN0ICVzICIsIHNwcmludF9zaXplKGJ1ZmZlciwgYjEpKTsKKwlmcHJpbnRmKGYsICJtdHUgJXMgIiwgc3ByaW50X3NpemUocC0+bXR1LCBiMSkpOworCWlmIChzaG93X3JhdykKKwkJZnByaW50ZihmLCAiWyUwOHhdICIsIHAtPmJ1cnN0KTsKKwlpZiAocC0+cGVha3JhdGUucmF0ZSkKKwkJZnByaW50ZihmLCAicGVha3JhdGUgJXMgIiwgc3ByaW50X3JhdGUocC0+cGVha3JhdGUucmF0ZSwgYjEpKTsKKwlpZiAodGJbVENBX1BPTElDRV9BVlJBVEVdKQorCQlmcHJpbnRmKGYsICJhdnJhdGUgJXMgIiwgc3ByaW50X3JhdGUocnRhX2dldGF0dHJfdTMyKHRiW1RDQV9QT0xJQ0VfQVZSQVRFXSksIGIxKSk7CisJZnByaW50ZihmLCAiYWN0aW9uICVzIiwgcG9saWNlX2FjdGlvbl9uMmEocC0+YWN0aW9uLCBiMSwgc2l6ZW9mKGIxKSkpOworCWlmICh0YltUQ0FfUE9MSUNFX1JFU1VMVF0pIHsKKwkJZnByaW50ZihmLCAiLyVzICIsIHBvbGljZV9hY3Rpb25fbjJhKCooaW50KilSVEFfREFUQSh0YltUQ0FfUE9MSUNFX1JFU1VMVF0pLCBiMSwgc2l6ZW9mKGIxKSkpOworCX0gZWxzZQorCQlmcHJpbnRmKGYsICIgIik7CisJZnByaW50ZihmLCAib3ZlcmhlYWQgJXViICIsIHAtPnJhdGUub3ZlcmhlYWQpOworCWxpbmtsYXllciA9IChwLT5yYXRlLmxpbmtsYXllciAmIFRDX0xJTktMQVlFUl9NQVNLKTsKKwlpZiAobGlua2xheWVyID4gVENfTElOS0xBWUVSX0VUSEVSTkVUIHx8IHNob3dfZGV0YWlscykKKwkJZnByaW50ZihmLCAibGlua2xheWVyICVzICIsIHNwcmludF9saW5rbGF5ZXIobGlua2xheWVyLCBiMikpOworCWZwcmludGYoZiwgIlxucmVmICVkIGJpbmQgJWRcbiIscC0+cmVmY250LCBwLT5iaW5kY250KTsKKworCXJldHVybiAwOworfQorCitpbnQKK3RjX3ByaW50X3BvbGljZShGSUxFICpmLCBzdHJ1Y3QgcnRhdHRyICphcmcpIHsKKwlyZXR1cm4gcHJpbnRfcG9saWNlKCZwb2xpY2VfYWN0aW9uX3V0aWwsZixhcmcpOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvbV9zaW1wbGUuYyBiL2lwcm91dGUyL3RjL21fc2ltcGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFkNTUyNgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL21fc2ltcGxlLmMKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBtX3NpbXBsZS5jCXNpbXBsZSBhY3Rpb24KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJSiBIYWRpIFNhbGltIDxqaHNAbW9qYXRhdHUuY29tPgorICoKKyAqIFBlZGFnb2dpY2FsIGV4YW1wbGUuIEFkZHMgYSBzdHJpbmcgdGhhdCB3aWxsIGJlIHByaW50ZWQgZXZlcnkgdGltZQorICogdGhlIHNpbXBsZSBpbnN0YW5jZSBpcyBoaXQuCisgKiBVc2UgdGhpcyBhcyBhIHNrZWxldG9uIGFjdGlvbiBhbmQga2VlcCBtb2RpZnlpbmcgaXQgdG8gbWVldCB5b3VyIG5lZWRzLgorICogTG9vayBhdCBsaW51eC90Y19hY3QvdGNfZGVmYWN0LmggZm9yIHRoZSBkaWZmZXJlbnQgY29tcG9uZW50cyBpZHMgYW5kCisgKiBkZWZpbml0aW9ucyB1c2VkIGluICB0aGlzIGFjdGlvbnMKKyAqCisgKiBleGFtcGxlIHVzZSwgeWVsbCAiSW5jb21pbmcgSUNNUCEiIGV2ZXJ5IHRpbWUgeW91IHNlZSBhbiBpbmNvbWluZyBJQ01QIG9uCisgKiBldGgwLiBTdGVwcyBhcmU6CisgKiAxKSBBZGQgYW4gaW5ncmVzcyBxZGlzYyBwb2ludCB0byBldGgwCisgKiAyKSBTdGFydCBhIGNoYWluIG9uIGluZ3Jlc3Mgb2YgZXRoMCB0aGF0IGZpcnN0IG1hdGNoZXMgSUNNUCB0aGVuIGludm9rZXMKKyAqICAgIHRoZSBzaW1wbGUgYWN0aW9uIHRvIHNob3V0LgorICogMykgZGlzcGxheSBzdGF0cyBhbmQgc2hvdyB0aGF0IG5vIHBhY2tldCBoYXMgYmVlbiBzZWVuIGJ5IHRoZSBhY3Rpb24KKyAqIDQpIFNlbmQgb25lIHBpbmcgcGFja2V0IHRvIGdvb2dsZSAoZXhwZWN0IHRvIHJlY2VpdmUgYSByZXNwb25zZSBiYWNrKQorICogNSkgZ3JlcCB0aGUgbG9ncyB0byBzZWUgdGhlIGxvZ2dlZCBtZXNzYWdlCisgKiA2KSBkaXNwbGF5IHN0YXRzIGFnYWluIGFuZCBvYnNlcnZlIGluY3JlbWVudCBieSAxCisgKgorICBoYWRpQG5vbWExOiQgdGMgcWRpc2MgYWRkIGRldiBldGgwIGluZ3Jlc3MKKyAgaGFkaUBub21hMTokdGMgZmlsdGVyIGFkZCBkZXYgZXRoMCBwYXJlbnQgZmZmZjogcHJvdG9jb2wgaXAgcHJpbyA1IFwKKwkgdTMyIG1hdGNoIGlwIHByb3RvY29sIDEgMHhmZiBmbG93aWQgMToxIGFjdGlvbiBzaW1wbGUgIkluY29taW5nIElDTVAiCisKKyAgaGFkaUBub21hMTokIHN1ZG8gdGMgLXMgZmlsdGVyIGxzICBkZXYgZXRoMCBwYXJlbnQgZmZmZjoKKyAgIGZpbHRlciBwcm90b2NvbCBpcCBwcmVmIDUgdTMyCisgICBmaWx0ZXIgcHJvdG9jb2wgaXAgcHJlZiA1IHUzMiBmaCA4MDA6IGh0IGRpdmlzb3IgMQorICAgZmlsdGVyIHByb3RvY29sIGlwIHByZWYgNSB1MzIgZmggODAwOjo4MDAgb3JkZXIgMjA0OCBrZXkgaHQgODAwIGJrdCAwIGZsb3dpZCAxOjEKKyAgICAgbWF0Y2ggMDAwMTAwMDAvMDBmZjAwMDAgYXQgOAorCWFjdGlvbiBvcmRlciAxOiBTaW1wbGUgPEluY29taW5nIElDTVA+CisJIGluZGV4IDQgcmVmIDEgYmluZCAxIGluc3RhbGxlZCAyOSBzZWMgdXNlZCAyOSBzZWMKKwkgQWN0aW9uIHN0YXRpc3RpY3M6CisJCVNlbnQgMCBieXRlcyAwIHBrdCAoZHJvcHBlZCAwLCBvdmVybGltaXRzIDAgcmVxdWV1ZXMgMCkKKwkJYmFja2xvZyAwYiAwcCByZXF1ZXVlcyAwCisKKworICBoYWRpQG5vbWExJCBwaW5nIC1jIDEgd3d3Lmdvb2dsZS5jYQorICBQSU5HIHd3dy5nb29nbGUuY2EgKDc0LjEyNS4yMjUuMTIwKSA1Nig4NCkgYnl0ZXMgb2YgZGF0YS4KKyAgNjQgYnl0ZXMgZnJvbSBvcmQwOHMwOC1pbi1mMjQuMWUxMDAubmV0ICg3NC4xMjUuMjI1LjEyMCk6IGljbXBfcmVxPTEgdHRsPTUzIHRpbWU9MzEuMyBtcworCisgIC0tLSB3d3cuZ29vZ2xlLmNhIHBpbmcgc3RhdGlzdGljcyAtLS0KKyAgMSBwYWNrZXRzIHRyYW5zbWl0dGVkLCAxIHJlY2VpdmVkLCAwJSBwYWNrZXQgbG9zcywgdGltZSAwbXMKKyAgcnR0IG1pbi9hdmcvbWF4L21kZXYgPSAzMS4zMTYvMzEuMzE2LzMxLjMxNi8wLjAwMCBtcworCisgIGhhZGlAbm9tYTEkIGRtZXNnIHwgZ3JlcCBzaW1wbGUKKyAgWzEzNTM1NC40NzM5NTFdIHNpbXBsZTogSW5jb21pbmcgSUNNUF8xCisKKyAgaGFkaUBub21hMSQgc3VkbyB0Yy90YyAtcyBmaWx0ZXIgbHMgIGRldiBldGgwIHBhcmVudCBmZmZmOgorICBmaWx0ZXIgcHJvdG9jb2wgaXAgcHJlZiA1IHUzMgorICBmaWx0ZXIgcHJvdG9jb2wgaXAgcHJlZiA1IHUzMiBmaCA4MDA6IGh0IGRpdmlzb3IgMQorICBmaWx0ZXIgcHJvdG9jb2wgaXAgcHJlZiA1IHUzMiBmaCA4MDA6OjgwMCBvcmRlciAyMDQ4IGtleSBodCA4MDAgYmt0IDAgZmxvd2lkIDE6MQorICAgIG1hdGNoIDAwMDEwMDAwLzAwZmYwMDAwIGF0IDgKKwlhY3Rpb24gb3JkZXIgMTogU2ltcGxlIDxJbmNvbWluZyBJQ01QPgorCSBpbmRleCA0IHJlZiAxIGJpbmQgMSBpbnN0YWxsZWQgMjA2IHNlYyB1c2VkIDY3IHNlYworCUFjdGlvbiBzdGF0aXN0aWNzOgorCVNlbnQgODQgYnl0ZXMgMSBwa3QgKGRyb3BwZWQgMCwgb3ZlcmxpbWl0cyAwIHJlcXVldWVzIDApCisJYmFja2xvZyAwYiAwcCByZXF1ZXVlcyAwCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0Y191dGlsLmgiCisjaW5jbHVkZSA8bGludXgvdGNfYWN0L3RjX2RlZmFjdC5oPgorCisjaWZuZGVmIFNJTVBfTUFYX0RBVEEKKyNkZWZpbmUgU0lNUF9NQVhfREFUQSAgIDMyCisjZW5kaWYKK3N0YXRpYyB2b2lkIGV4cGxhaW4odm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAuLi4gc2ltcGxlIFNUUklOR1xuIgorCQkiU1RSSU5HIGJlaW5nIGFuIGFyYml0cmFyeSBzdHJpbmdcbiIKKwkJImV4YW1wbGU6IFwic2ltcGxlIGJsYWhcIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisJZXhwbGFpbigpOworCWV4aXQoLTEpOworfQorCitzdGF0aWMgaW50CitwYXJzZV9zaW1wbGUoc3RydWN0IGFjdGlvbl91dGlsICphLCBpbnQgKmFyZ2NfcCwgY2hhciAqKiphcmd2X3AsIGludCB0Y2FfaWQsCisJICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJc3RydWN0IHRjX2RlZmFjdCBzZWwgPSB7fTsKKwlpbnQgYXJnYyA9ICphcmdjX3A7CisJY2hhciAqKmFyZ3YgPSAqYXJndl9wOworCWludCBvayA9IDA7CisJc3RydWN0IHJ0YXR0ciAqdGFpbDsKKwljaGFyICpzaW1wZGF0YSA9IE5VTEw7CisKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAobWF0Y2hlcygqYXJndiwgInNpbXBsZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlzaW1wZGF0YSA9ICphcmd2OworCQkJb2sgPSAxOworCQkJYXJnYy0tOworCQkJYXJndisrOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKSB7CisJCQl1c2FnZSgpOworCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCX0KKworCX0KKworCWlmICghb2spIHsKKwkJZXhwbGFpbigpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGFyZ2MpIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJpbmRleCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmc2VsLmluZGV4LCAqYXJndiwgMTApKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJzaW1wbGU6IElsbGVnYWwgXCJpbmRleFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlhcmdjLS07CisJCQlhcmd2Kys7CisJCX0KKwl9CisKKwlpZiAoc3RybGVuKHNpbXBkYXRhKSA+IChTSU1QX01BWF9EQVRBIC0gMSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJzaW1wbGU6IElsbGVnYWwgc3RyaW5nIGxlbiAlenUgPCVzPiBcbiIsCisJCQlzdHJsZW4oc2ltcGRhdGEpLCBzaW1wZGF0YSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlzZWwuYWN0aW9uID0gVENfQUNUX1BJUEU7CisKKwl0YWlsID0gTkxNU0dfVEFJTChuKTsKKwlhZGRhdHRyX2wobiwgTUFYX01TRywgdGNhX2lkLCBOVUxMLCAwKTsKKwlhZGRhdHRyX2wobiwgTUFYX01TRywgVENBX0RFRl9QQVJNUywgJnNlbCwgc2l6ZW9mKHNlbCkpOworCWFkZGF0dHJfbChuLCBNQVhfTVNHLCBUQ0FfREVGX0RBVEEsIHNpbXBkYXRhLCBTSU1QX01BWF9EQVRBKTsKKwl0YWlsLT5ydGFfbGVuID0gKGNoYXIgKilOTE1TR19UQUlMKG4pIC0gKGNoYXIgKil0YWlsOworCisJKmFyZ2NfcCA9IGFyZ2M7CisJKmFyZ3ZfcCA9IGFyZ3Y7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJpbnRfc2ltcGxlKHN0cnVjdCBhY3Rpb25fdXRpbCAqYXUsIEZJTEUgKiBmLCBzdHJ1Y3QgcnRhdHRyICphcmcpCit7CisJc3RydWN0IHRjX2RlZmFjdCAqc2VsOworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9ERUZfTUFYICsgMV07CisJY2hhciAqc2ltcGRhdGE7CisKKwlpZiAoYXJnID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBhcnNlX3J0YXR0cl9uZXN0ZWQodGIsIFRDQV9ERUZfTUFYLCBhcmcpOworCisJaWYgKHRiW1RDQV9ERUZfUEFSTVNdID09IE5VTEwpIHsKKwkJZnByaW50ZihmLCAiW05VTEwgc2ltcGxlIHBhcmFtZXRlcnNdIik7CisJCXJldHVybiAtMTsKKwl9CisJc2VsID0gUlRBX0RBVEEodGJbVENBX0RFRl9QQVJNU10pOworCisJaWYgKHRiW1RDQV9ERUZfREFUQV0gPT0gTlVMTCkgeworCQlmcHJpbnRmKGYsICJbbWlzc2luZyBzaW1wbGUgc3RyaW5nXSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJc2ltcGRhdGEgPSBSVEFfREFUQSh0YltUQ0FfREVGX0RBVEFdKTsKKworCWZwcmludGYoZiwgIlNpbXBsZSA8JXM+XG4iLCBzaW1wZGF0YSk7CisJZnByaW50ZihmLCAiXHQgaW5kZXggJWQgcmVmICVkIGJpbmQgJWQiLCBzZWwtPmluZGV4LAorCQlzZWwtPnJlZmNudCwgc2VsLT5iaW5kY250KTsKKworCWlmIChzaG93X3N0YXRzKSB7CisJCWlmICh0YltUQ0FfREVGX1RNXSkgeworCQkJc3RydWN0IHRjZl90ICp0bSA9IFJUQV9EQVRBKHRiW1RDQV9ERUZfVE1dKTsKKwkJCXByaW50X3RtKGYsIHRtKTsKKwkJfQorCX0KKwlmcHJpbnRmKGYsICJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBhY3Rpb25fdXRpbCBzaW1wbGVfYWN0aW9uX3V0aWwgPSB7CisJLmlkID0gInNpbXBsZSIsCisJLnBhcnNlX2FvcHQgPSBwYXJzZV9zaW1wbGUsCisJLnByaW50X2FvcHQgPSBwcmludF9zaW1wbGUsCit9OwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvbV9za2JlZGl0LmMgYi9pcHJvdXRlMi90Yy9tX3NrYmVkaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjMyM2E5Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGMvbV9za2JlZGl0LmMKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBtX3NrYmVkaXQuYwkJU0tCIEVkaXRpbmcgbW9kdWxlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzPi4KKyAqCisgKiBBdXRob3JzOglBbGV4YW5kZXIgRHV5Y2sgPGFsZXhhbmRlci5oLmR1eWNrQGludGVsLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0Y191dGlsLmgiCisjaW5jbHVkZSA8bGludXgvdGNfYWN0L3RjX3NrYmVkaXQuaD4KKworc3RhdGljIHZvaWQKK2V4cGxhaW4odm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAuLi4gc2tiZWRpdCA8W1FNXSBbUE1dIFtNTV0+XG4iCisJCSJRTSA9IHF1ZXVlX21hcHBpbmcgUVVFVUVfTUFQUElOR1xuIgorCQkiUE0gPSBwcmlvcml0eSBQUklPUklUWSBcbiIKKwkJIk1NID0gbWFyayBNQVJLIFxuIgorCQkiUVVFVUVfTUFQUElORyA9IGRldmljZSB0cmFuc21pdCBxdWV1ZSB0byB1c2VcbiIKKwkJIlBSSU9SSVRZID0gY2xhc3NJRCB0byBhc3NpZ24gdG8gcHJpb3JpdHkgZmllbGRcbiIKKwkJIk1BUksgPSBmaXJld2FsbCBtYXJrIHRvIHNldFxuIik7Cit9CisKK3N0YXRpYyB2b2lkCit1c2FnZSh2b2lkKQoreworCWV4cGxhaW4oKTsKKwlleGl0KC0xKTsKK30KKworc3RhdGljIGludAorcGFyc2Vfc2tiZWRpdChzdHJ1Y3QgYWN0aW9uX3V0aWwgKmEsIGludCAqYXJnY19wLCBjaGFyICoqKmFyZ3ZfcCwgaW50IHRjYV9pZCwKKwkgICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJaW50IGFyZ2MgPSAqYXJnY19wOworCWNoYXIgKiphcmd2ID0gKmFyZ3ZfcDsKKwlpbnQgb2sgPSAwOworCXN0cnVjdCBydGF0dHIgKnRhaWw7CisJdW5zaWduZWQgaW50IHRtcDsKKwlfX3UxNiBxdWV1ZV9tYXBwaW5nOworCV9fdTMyIGZsYWdzID0gMCwgcHJpb3JpdHksIG1hcms7CisJc3RydWN0IHRjX3NrYmVkaXQgc2VsID0geyAwIH07CisKKwlpZiAobWF0Y2hlcygqYXJndiwgInNrYmVkaXQiKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwlORVhUX0FSRygpOworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChtYXRjaGVzKCphcmd2LCAicXVldWVfbWFwcGluZyIpID09IDApIHsKKwkJCWZsYWdzIHw9IFNLQkVESVRfRl9RVUVVRV9NQVBQSU5HOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdW5zaWduZWQoJnRtcCwgKmFyZ3YsIDEwKSB8fCB0bXAgPiA2NTUzNSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBxdWV1ZV9tYXBwaW5nXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlxdWV1ZV9tYXBwaW5nID0gdG1wOworCQkJb2srKzsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAicHJpb3JpdHkiKSA9PSAwKSB7CisJCQlmbGFncyB8PSBTS0JFRElUX0ZfUFJJT1JJVFk7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF90Y19jbGFzc2lkKCZwcmlvcml0eSwgKmFyZ3YpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIHByaW9yaXR5XG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlvaysrOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJtYXJrIikgPT0gMCkgeworCQkJZmxhZ3MgfD0gU0tCRURJVF9GX01BUks7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJm1hcmssICphcmd2LCAwKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBtYXJrXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlvaysrOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJdXNhZ2UoKTsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJCWFyZ2MtLTsKKwkJYXJndisrOworCX0KKworCXNlbC5hY3Rpb24gPSBUQ19BQ1RfUElQRTsKKwlpZiAoYXJnYykgeworCQlpZiAobWF0Y2hlcygqYXJndiwgInJlY2xhc3NpZnkiKSA9PSAwKSB7CisJCQlzZWwuYWN0aW9uID0gVENfQUNUX1JFQ0xBU1NJRlk7CisJCQlORVhUX0FSRygpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJwaXBlIikgPT0gMCkgeworCQkJc2VsLmFjdGlvbiA9IFRDX0FDVF9QSVBFOworCQkJTkVYVF9BUkcoKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiZHJvcCIpID09IDAgfHwKKwkJCW1hdGNoZXMoKmFyZ3YsICJzaG90IikgPT0gMCkgeworCQkJc2VsLmFjdGlvbiA9IFRDX0FDVF9TSE9UOworCQkJTkVYVF9BUkcoKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiY29udGludWUiKSA9PSAwKSB7CisJCQlzZWwuYWN0aW9uID0gVENfQUNUX1VOU1BFQzsKKwkJCU5FWFRfQVJHKCk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInBhc3MiKSA9PSAwKSB7CisJCQlzZWwuYWN0aW9uID0gVENfQUNUX09LOworCQkJTkVYVF9BUkcoKTsKKwkJfQorCX0KKworCWlmIChhcmdjKSB7CisJCWlmIChtYXRjaGVzKCphcmd2LCAiaW5kZXgiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJnNlbC5pbmRleCwgKmFyZ3YsIDEwKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiUGVkaXQ6IElsbGVnYWwgXCJpbmRleFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlhcmdjLS07CisJCQlhcmd2Kys7CisJCQlvaysrOworCQl9CisJfQorCisJaWYgKCFvaykgeworCQlleHBsYWluKCk7CisJCXJldHVybiAtMTsKKwl9CisKKworCXRhaWwgPSBOTE1TR19UQUlMKG4pOworCWFkZGF0dHJfbChuLCBNQVhfTVNHLCB0Y2FfaWQsIE5VTEwsIDApOworCWFkZGF0dHJfbChuLCBNQVhfTVNHLCBUQ0FfU0tCRURJVF9QQVJNUywgJnNlbCwgc2l6ZW9mKHNlbCkpOworCWlmIChmbGFncyAmIFNLQkVESVRfRl9RVUVVRV9NQVBQSU5HKQorCQlhZGRhdHRyX2wobiwgTUFYX01TRywgVENBX1NLQkVESVRfUVVFVUVfTUFQUElORywKKwkJCSAgJnF1ZXVlX21hcHBpbmcsIHNpemVvZihxdWV1ZV9tYXBwaW5nKSk7CisJaWYgKGZsYWdzICYgU0tCRURJVF9GX1BSSU9SSVRZKQorCQlhZGRhdHRyX2wobiwgTUFYX01TRywgVENBX1NLQkVESVRfUFJJT1JJVFksCisJCQkgICZwcmlvcml0eSwgc2l6ZW9mKHByaW9yaXR5KSk7CisJaWYgKGZsYWdzICYgU0tCRURJVF9GX01BUkspCisJCWFkZGF0dHJfbChuLCBNQVhfTVNHLCBUQ0FfU0tCRURJVF9NQVJLLAorCQkJICAmbWFyaywgc2l6ZW9mKG1hcmspKTsKKwl0YWlsLT5ydGFfbGVuID0gKGNoYXIgKilOTE1TR19UQUlMKG4pIC0gKGNoYXIgKil0YWlsOworCisJKmFyZ2NfcCA9IGFyZ2M7CisJKmFyZ3ZfcCA9IGFyZ3Y7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJpbnRfc2tiZWRpdChzdHJ1Y3QgYWN0aW9uX3V0aWwgKmF1LCBGSUxFICpmLCBzdHJ1Y3QgcnRhdHRyICphcmcpCit7CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX1NLQkVESVRfTUFYICsgMV07CisJU1BSSU5UX0JVRihiMSk7CisJX191MzIgKnByaW9yaXR5OworCV9fdTMyICptYXJrOworCV9fdTE2ICpxdWV1ZV9tYXBwaW5nOworCXN0cnVjdCB0Y19za2JlZGl0ICpwID0gTlVMTDsKKworCWlmIChhcmcgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJcGFyc2VfcnRhdHRyX25lc3RlZCh0YiwgVENBX1NLQkVESVRfTUFYLCBhcmcpOworCisJaWYgKHRiW1RDQV9TS0JFRElUX1BBUk1TXSA9PSBOVUxMKSB7CisJCWZwcmludGYoZiwgIltOVUxMIHNrYmVkaXQgcGFyYW1ldGVyc10iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwID0gUlRBX0RBVEEodGJbVENBX1NLQkVESVRfUEFSTVNdKTsKKworCWZwcmludGYoZiwgIiBza2JlZGl0Iik7CisKKwlpZiAodGJbVENBX1NLQkVESVRfUVVFVUVfTUFQUElOR10gIT0gTlVMTCkgeworCQlxdWV1ZV9tYXBwaW5nID0gUlRBX0RBVEEodGJbVENBX1NLQkVESVRfUVVFVUVfTUFQUElOR10pOworCQlmcHJpbnRmKGYsICIgcXVldWVfbWFwcGluZyAldSIsICpxdWV1ZV9tYXBwaW5nKTsKKwl9CisJaWYgKHRiW1RDQV9TS0JFRElUX1BSSU9SSVRZXSAhPSBOVUxMKSB7CisJCXByaW9yaXR5ID0gUlRBX0RBVEEodGJbVENBX1NLQkVESVRfUFJJT1JJVFldKTsKKwkJZnByaW50ZihmLCAiIHByaW9yaXR5ICVzIiwgc3ByaW50X3RjX2NsYXNzaWQoKnByaW9yaXR5LCBiMSkpOworCX0KKwlpZiAodGJbVENBX1NLQkVESVRfTUFSS10gIT0gTlVMTCkgeworCQltYXJrID0gUlRBX0RBVEEodGJbVENBX1NLQkVESVRfTUFSS10pOworCQlmcHJpbnRmKGYsICIgbWFyayAlZCIsICptYXJrKTsKKwl9CisKKwlmcHJpbnRmKGYsICJcblx0IGluZGV4ICVkIHJlZiAlZCBiaW5kICVkIiwgcC0+aW5kZXgsIHAtPnJlZmNudCwgcC0+YmluZGNudCk7CisKKwlpZiAoc2hvd19zdGF0cykgeworCQlpZiAodGJbVENBX1NLQkVESVRfVE1dKSB7CisJCQlzdHJ1Y3QgdGNmX3QgKnRtID0gUlRBX0RBVEEodGJbVENBX1NLQkVESVRfVE1dKTsKKwkJCXByaW50X3RtKGYsIHRtKTsKKwkJfQorCX0KKworCWZwcmludGYoZiwgIlxuICIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBhY3Rpb25fdXRpbCBza2JlZGl0X2FjdGlvbl91dGlsID0geworCS5pZCA9ICJza2JlZGl0IiwKKwkucGFyc2VfYW9wdCA9IHBhcnNlX3NrYmVkaXQsCisJLnByaW50X2FvcHQgPSBwcmludF9za2JlZGl0LAorfTsKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RjL21fdmxhbi5jIGIvaXByb3V0ZTIvdGMvbV92bGFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJkYjVlZAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL21fdmxhbi5jCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogbV92bGFuLmMJCXZsYW4gbWFuaXB1bGF0aW9uIG1vZHVsZQorICoKKyAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6ICAgICBKaXJpIFBpcmtvIDxqaXJpQHJlc251bGxpLnVzPgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJydF9uYW1lcy5oIgorI2luY2x1ZGUgInRjX3V0aWwuaCIKKyNpbmNsdWRlIDxsaW51eC90Y19hY3QvdGNfdmxhbi5oPgorCitzdGF0aWMgdm9pZCBleHBsYWluKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogdmxhbiBwb3BcbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgIHZsYW4gcHVzaCBbIHByb3RvY29sIFZMQU5QUk9UTyBdIGlkIFZMQU5JRFxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgVkxBTlBST1RPIGlzIG9uZSBvZiA4MDIuMVEgb3IgODAyLjFBRFxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICB3aXRoIGRlZmF1bHQ6IDgwMi4xUVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisJZXhwbGFpbigpOworCWV4aXQoLTEpOworfQorCitzdGF0aWMgaW50IHBhcnNlX3ZsYW4oc3RydWN0IGFjdGlvbl91dGlsICphLCBpbnQgKmFyZ2NfcCwgY2hhciAqKiphcmd2X3AsCisJCSAgICAgIGludCB0Y2FfaWQsIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlpbnQgYXJnYyA9ICphcmdjX3A7CisJY2hhciAqKmFyZ3YgPSAqYXJndl9wOworCXN0cnVjdCBydGF0dHIgKnRhaWw7CisJaW50IGFjdGlvbiA9IDA7CisJX191MTYgaWQ7CisJaW50IGlkX3NldCA9IDA7CisJX191MTYgcHJvdG87CisJaW50IHByb3RvX3NldCA9IDA7CisJc3RydWN0IHRjX3ZsYW4gcGFybSA9IHsgMCB9OworCisJaWYgKG1hdGNoZXMoKmFyZ3YsICJ2bGFuIikgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJTkVYVF9BUkcoKTsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAobWF0Y2hlcygqYXJndiwgInBvcCIpID09IDApIHsKKwkJCWlmIChhY3Rpb24pIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgInVuZXhwZWN0ZWQgXCIlc1wiIC0gYWN0aW9uIGFscmVhZHkgc3BlY2lmaWVkXG4iLAorCQkJCQkqYXJndik7CisJCQkJZXhwbGFpbigpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWFjdGlvbiA9IFRDQV9WTEFOX0FDVF9QT1A7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInB1c2giKSA9PSAwKSB7CisJCQlpZiAoYWN0aW9uKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJ1bmV4cGVjdGVkIFwiJXNcIiAtIGFjdGlvbiBhbHJlYWR5IHNwZWNpZmllZFxuIiwKKwkJCQkJKmFyZ3YpOworCQkJCWV4cGxhaW4oKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlhY3Rpb24gPSBUQ0FfVkxBTl9BQ1RfUFVTSDsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiaWQiKSA9PSAwKSB7CisJCQlpZiAoYWN0aW9uICE9IFRDQV9WTEFOX0FDVF9QVVNIKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJcIiVzXCIgaXMgb25seSB2YWxpZCBmb3IgcHVzaFxuIiwKKwkJCQkJKmFyZ3YpOworCQkJCWV4cGxhaW4oKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MTYoJmlkLCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJpZCBpcyBpbnZhbGlkIiwgKmFyZ3YpOworCQkJaWRfc2V0ID0gMTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAicHJvdG9jb2wiKSA9PSAwKSB7CisJCQlpZiAoYWN0aW9uICE9IFRDQV9WTEFOX0FDVF9QVVNIKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJcIiVzXCIgaXMgb25seSB2YWxpZCBmb3IgcHVzaFxuIiwKKwkJCQkJKmFyZ3YpOworCQkJCWV4cGxhaW4oKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlORVhUX0FSRygpOworCQkJaWYgKGxsX3Byb3RvX2EybigmcHJvdG8sICphcmd2KSkKKwkJCQlpbnZhcmcoInByb3RvY29sIGlzIGludmFsaWQiLCAqYXJndik7CisJCQlwcm90b19zZXQgPSAxOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJdXNhZ2UoKTsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJCWFyZ2MtLTsKKwkJYXJndisrOworCX0KKworCXBhcm0uYWN0aW9uID0gVENfQUNUX1BJUEU7CisJaWYgKGFyZ2MpIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJyZWNsYXNzaWZ5IikgPT0gMCkgeworCQkJcGFybS5hY3Rpb24gPSBUQ19BQ1RfUkVDTEFTU0lGWTsKKwkJCWFyZ2MtLTsKKwkJCWFyZ3YrKzsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAicGlwZSIpID09IDApIHsKKwkJCXBhcm0uYWN0aW9uID0gVENfQUNUX1BJUEU7CisJCQlhcmdjLS07CisJCQlhcmd2Kys7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImRyb3AiKSA9PSAwIHx8CisJCQkgICBtYXRjaGVzKCphcmd2LCAic2hvdCIpID09IDApIHsKKwkJCXBhcm0uYWN0aW9uID0gVENfQUNUX1NIT1Q7CisJCQlhcmdjLS07CisJCQlhcmd2Kys7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImNvbnRpbnVlIikgPT0gMCkgeworCQkJcGFybS5hY3Rpb24gPSBUQ19BQ1RfVU5TUEVDOworCQkJYXJnYy0tOworCQkJYXJndisrOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJwYXNzIikgPT0gMCkgeworCQkJcGFybS5hY3Rpb24gPSBUQ19BQ1RfT0s7CisJCQlhcmdjLS07CisJCQlhcmd2Kys7CisJCX0KKwl9CisKKwlpZiAoYXJnYykgeworCQlpZiAobWF0Y2hlcygqYXJndiwgImluZGV4IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTMyKCZwYXJtLmluZGV4LCAqYXJndiwgMTApKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJ2bGFuOiBJbGxlZ2FsIFwiaW5kZXhcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYXJnYy0tOworCQkJYXJndisrOworCQl9CisJfQorCisJaWYgKGFjdGlvbiA9PSBUQ0FfVkxBTl9BQ1RfUFVTSCAmJiAhaWRfc2V0KSB7CisJCWZwcmludGYoc3RkZXJyLCAiaWQgbmVlZHMgdG8gYmUgc2V0IGZvciBwdXNoXG4iKTsKKwkJZXhwbGFpbigpOworCQlyZXR1cm4gLTE7CisJfQorCisJcGFybS52X2FjdGlvbiA9IGFjdGlvbjsKKwl0YWlsID0gTkxNU0dfVEFJTChuKTsKKwlhZGRhdHRyX2wobiwgTUFYX01TRywgdGNhX2lkLCBOVUxMLCAwKTsKKwlhZGRhdHRyX2wobiwgTUFYX01TRywgVENBX1ZMQU5fUEFSTVMsICZwYXJtLCBzaXplb2YocGFybSkpOworCWlmIChpZF9zZXQpCisJCWFkZGF0dHJfbChuLCBNQVhfTVNHLCBUQ0FfVkxBTl9QVVNIX1ZMQU5fSUQsICZpZCwgMik7CisJaWYgKHByb3RvX3NldCkgeworCQlpZiAocHJvdG8gIT0gaHRvbnMoRVRIX1BfODAyMVEpICYmCisJCSAgICBwcm90byAhPSBodG9ucyhFVEhfUF84MDIxQUQpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgInByb3RvY29sIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJYWRkYXR0cl9sKG4sIE1BWF9NU0csIFRDQV9WTEFOX1BVU0hfVkxBTl9QUk9UT0NPTCwgJnByb3RvLCAyKTsKKwl9CisJdGFpbC0+cnRhX2xlbiA9IChjaGFyICopTkxNU0dfVEFJTChuKSAtIChjaGFyICopdGFpbDsKKworCSphcmdjX3AgPSBhcmdjOworCSphcmd2X3AgPSBhcmd2OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByaW50X3ZsYW4oc3RydWN0IGFjdGlvbl91dGlsICphdSwgRklMRSAqZiwgc3RydWN0IHJ0YXR0ciAqYXJnKQoreworCVNQUklOVF9CVUYoYjEpOworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9WTEFOX01BWCArIDFdOworCV9fdTE2IHZhbDsKKwlzdHJ1Y3QgdGNfdmxhbiAqcGFybTsKKworCWlmIChhcmcgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJcGFyc2VfcnRhdHRyX25lc3RlZCh0YiwgVENBX1ZMQU5fTUFYLCBhcmcpOworCisJaWYgKCF0YltUQ0FfVkxBTl9QQVJNU10pIHsKKwkJZnByaW50ZihmLCAiW05VTEwgdmxhbiBwYXJhbWV0ZXJzXSIpOworCQlyZXR1cm4gLTE7CisJfQorCXBhcm0gPSBSVEFfREFUQSh0YltUQ0FfVkxBTl9QQVJNU10pOworCisJZnByaW50ZihmLCAiIHZsYW4iKTsKKworCXN3aXRjaChwYXJtLT52X2FjdGlvbikgeworCWNhc2UgVENBX1ZMQU5fQUNUX1BPUDoKKwkJZnByaW50ZihmLCAiIHBvcCIpOworCQlicmVhazsKKwljYXNlIFRDQV9WTEFOX0FDVF9QVVNIOgorCQlmcHJpbnRmKGYsICIgcHVzaCIpOworCQlpZiAodGJbVENBX1ZMQU5fUFVTSF9WTEFOX0lEXSkgeworCQkJdmFsID0gcnRhX2dldGF0dHJfdTE2KHRiW1RDQV9WTEFOX1BVU0hfVkxBTl9JRF0pOworCQkJZnByaW50ZihmLCAiIGlkICV1IiwgdmFsKTsKKwkJfQorCQlpZiAodGJbVENBX1ZMQU5fUFVTSF9WTEFOX1BST1RPQ09MXSkgeworCQkJZnByaW50ZihmLCAiIHByb3RvY29sICVzIiwKKwkJCQlsbF9wcm90b19uMmEocnRhX2dldGF0dHJfdTE2KHRiW1RDQV9WTEFOX1BVU0hfVkxBTl9QUk9UT0NPTF0pLAorCQkJCQkgICAgIGIxLCBzaXplb2YoYjEpKSk7CisJCX0KKwkJYnJlYWs7CisJfQorCWZwcmludGYoZiwgIiAlcyIsIGFjdGlvbl9uMmEocGFybS0+YWN0aW9uLCBiMSwgc2l6ZW9mIChiMSkpKTsKKworCWZwcmludGYoZiwgIlxuXHQgaW5kZXggJWQgcmVmICVkIGJpbmQgJWQiLCBwYXJtLT5pbmRleCwgcGFybS0+cmVmY250LAorCQlwYXJtLT5iaW5kY250KTsKKworCWlmIChzaG93X3N0YXRzKSB7CisJCWlmICh0YltUQ0FfVkxBTl9UTV0pIHsKKwkJCXN0cnVjdCB0Y2ZfdCAqdG0gPSBSVEFfREFUQSh0YltUQ0FfVkxBTl9UTV0pOworCQkJcHJpbnRfdG0oZiwgdG0pOworCQl9CisJfQorCisJZnByaW50ZihmLCAiXG4gIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGFjdGlvbl91dGlsIHZsYW5fYWN0aW9uX3V0aWwgPSB7CisJLmlkID0gInZsYW4iLAorCS5wYXJzZV9hb3B0ID0gcGFyc2VfdmxhbiwKKwkucHJpbnRfYW9wdCA9IHByaW50X3ZsYW4sCit9OwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvbV94dC5jIGIvaXByb3V0ZTIvdGMvbV94dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNjAzZmMKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy9tX3h0LmMKQEAgLTAsMCArMSwzOTAgQEAKKy8qCisgKiBtX3h0LmMJeHRhYmxlcyBiYXNlZCB0YXJnZXRzCisgKgkJdXRpbGl0aWVzIG1vc3RseSByaXBwZWQgZnJvbSBpcHRhYmxlcyA8ZHVoLCBpdHMgdGhlIGxpbnV4IHdheT4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczogIEogSGFkaSBTYWxpbSAoaGFkaUBjeWJlcnVzLmNhKQorICovCisKKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPHh0YWJsZXMuaD4KKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInRjX3V0aWwuaCIKKyNpbmNsdWRlIDxsaW51eC90Y19hY3QvdGNfaXB0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpZm5kZWYgWFRfTElCX0RJUgorIyAgICAgICBkZWZpbmUgWFRfTElCX0RJUiAiL2xpYi94dGFibGVzIgorI2VuZGlmCisKKyNpZm5kZWYgX19BTElHTl9LRVJORUwKKyNkZWZpbmUgX19BTElHTl9LRVJORUwoeCwgYSkJCV9fQUxJR05fS0VSTkVMX01BU0soeCwgKHR5cGVvZih4KSkoYSkgLSAxKQorI2RlZmluZSBfX0FMSUdOX0tFUk5FTF9NQVNLKHgsIG1hc2spCSgoKHgpICsgKG1hc2spKSAmIH4obWFzaykpCisjZW5kaWYKKworI2lmbmRlZiBBTElHTgorI2RlZmluZSBBTElHTih4LGEpCV9fQUxJR05fS0VSTkVMKCh4KSwgKGEpKQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBjaGFyICp0bmFtZSA9ICJtYW5nbGUiOworCitjaGFyICpsaWJfZGlyOworCitzdGF0aWMgY29uc3QgY2hhciAqaXB0aG9va3NbXSA9IHsKKwkiTkZfSVBfUFJFX1JPVVRJTkciLAorCSJORl9JUF9MT0NBTF9JTiIsCisJIk5GX0lQX0ZPUldBUkQiLAorCSJORl9JUF9MT0NBTF9PVVQiLAorCSJORl9JUF9QT1NUX1JPVVRJTkciLAorfTsKKworc3RhdGljIHN0cnVjdCBvcHRpb24gb3JpZ2luYWxfb3B0c1tdID0geworCXsKKwkJLm5hbWUgPSAianVtcCIsCisJCS5oYXNfYXJnID0gMSwKKwkJLnZhbCA9ICdqJworCX0sCisJezAsIDAsIDAsIDB9Cit9OworCitzdGF0aWMgc3RydWN0IHh0YWJsZXNfZ2xvYmFscyB0Y2lwdF9nbG9iYWxzID0geworCS5vcHRpb25fb2Zmc2V0ID0gMCwKKwkucHJvZ3JhbV9uYW1lID0gInRjLWlwdCIsCisJLnByb2dyYW1fdmVyc2lvbiA9ICIwLjIiLAorCS5vcmlnX29wdHMgPSBvcmlnaW5hbF9vcHRzLAorCS5vcHRzID0gb3JpZ2luYWxfb3B0cywKKwkuZXhpdF9lcnIgPSBOVUxMLAorfTsKKworLyoKKyAqIHdlIG1heSBuZWVkIHRvIGNoZWNrIGZvciB2ZXJzaW9uIG1pc21hdGNoCisqLworc3RhdGljIGludAorYnVpbGRfc3Qoc3RydWN0IHh0YWJsZXNfdGFyZ2V0ICp0YXJnZXQsIHN0cnVjdCB4dF9lbnRyeV90YXJnZXQgKnQpCit7CisKKwlzaXplX3Qgc2l6ZSA9CisJCSAgICBYVF9BTElHTihzaXplb2YgKHN0cnVjdCB4dF9lbnRyeV90YXJnZXQpKSArIHRhcmdldC0+c2l6ZTsKKworCWlmIChOVUxMID09IHQpIHsKKwkJdGFyZ2V0LT50ID0geHRhYmxlc19jYWxsb2MoMSwgc2l6ZSk7CisJCXRhcmdldC0+dC0+dS50YXJnZXRfc2l6ZSA9IHNpemU7CisJCXN0cmNweSh0YXJnZXQtPnQtPnUudXNlci5uYW1lLCB0YXJnZXQtPm5hbWUpOworCQl0YXJnZXQtPnQtPnUudXNlci5yZXZpc2lvbiA9IHRhcmdldC0+cmV2aXNpb247CisKKwkJaWYgKHRhcmdldC0+aW5pdCAhPSBOVUxMKQorCQkJdGFyZ2V0LT5pbml0KHRhcmdldC0+dCk7CisJfSBlbHNlIHsKKwkJdGFyZ2V0LT50ID0gdDsKKwl9CisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIHZvaWQgc2V0X2xpYl9kaXIodm9pZCkKK3sKKworCWxpYl9kaXIgPSBnZXRlbnYoIlhUQUJMRVNfTElCRElSIik7CisJaWYgKCFsaWJfZGlyKSB7CisJCWxpYl9kaXIgPSBnZXRlbnYoIklQVEFCTEVTX0xJQl9ESVIiKTsKKwkJaWYgKGxpYl9kaXIpCisJCQlmcHJpbnRmKHN0ZGVyciwgInVzaW5nIGRlcHJlY2F0ZWQgSVBUQUJMRVNfTElCX0RJUiBcbiIpOworCX0KKwlpZiAobGliX2RpciA9PSBOVUxMKQorCQlsaWJfZGlyID0gWFRfTElCX0RJUjsKKworfQorCitzdGF0aWMgaW50IHBhcnNlX2lwdChzdHJ1Y3QgYWN0aW9uX3V0aWwgKmEsaW50ICphcmdjX3AsCisJCSAgICAgY2hhciAqKiphcmd2X3AsIGludCB0Y2FfaWQsIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlzdHJ1Y3QgeHRhYmxlc190YXJnZXQgKm0gPSBOVUxMOworCXN0cnVjdCBpcHRfZW50cnkgZnc7CisJc3RydWN0IHJ0YXR0ciAqdGFpbDsKKworCWludCBjOworCWludCByYXJnYyA9ICphcmdjX3A7CisJY2hhciAqKmFyZ3YgPSAqYXJndl9wOworCWludCBhcmdjID0gMCwgaWFyZ2MgPSAwOworCWNoYXIga1sxNl07CisJaW50IHNpemUgPSAwOworCWludCBpb2sgPSAwLCBvayA9IDA7CisJX191MzIgaG9vayA9IDAsIGluZGV4ID0gMDsKKwlzdHJ1Y3Qgb3B0aW9uICpvcHRzID0gTlVMTDsKKworCXh0YWJsZXNfaW5pdF9hbGwoJnRjaXB0X2dsb2JhbHMsIE5GUFJPVE9fSVBWNCk7CisJc2V0X2xpYl9kaXIoKTsKKworCXsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCByYXJnYzsgaSsrKSB7CisJCQlpZiAoTlVMTCA9PSBhcmd2W2ldIHx8IDAgPT0gc3RyY21wKGFyZ3ZbaV0sICJhY3Rpb24iKSkgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlhcmdjID0gYXJnYyA9IGk7CisJfQorCisJaWYgKGFyZ2MgPD0gMikgeworCQlmcHJpbnRmKHN0ZGVyciwiYmFkIGFyZ3VtZW50cyB0byBpcHQgJWQgdnMgJWQgXG4iLCBhcmdjLCByYXJnYyk7CisJCXJldHVybiAtMTsKKwl9CisKKwl3aGlsZSAoMSkgeworCQljID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImo6IiwgdGNpcHRfZ2xvYmFscy5vcHRzLCBOVUxMKTsKKwkJaWYgKGMgPT0gLTEpCisJCQlicmVhazsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ2onOgorCQkJbSA9IHh0YWJsZXNfZmluZF90YXJnZXQob3B0YXJnLCBYVEZfVFJZX0xPQUQpOworCQkJaWYgKE5VTEwgIT0gbSkgeworCisJCQkJaWYgKDAgPiBidWlsZF9zdChtLCBOVUxMKSkgeworCQkJCQlwcmludGYoIiAlcyBlcnJvciBcbiIsIG0tPm5hbWUpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorI2lmIChYVEFCTEVTX1ZFUlNJT05fQ09ERSA+PSA2KQorCQkJb3B0cyA9IHh0YWJsZXNfb3B0aW9uc194ZnJtKHRjaXB0X2dsb2JhbHMub3JpZ19vcHRzLAorCQkJCQkJICAgIHRjaXB0X2dsb2JhbHMub3B0cywKKwkJCQkJCSAgICBtLT54Nl9vcHRpb25zLAorCQkJCQkJICAgICZtLT5vcHRpb25fb2Zmc2V0KTsKKyNlbHNlCisJCQlvcHRzID0geHRhYmxlc19tZXJnZV9vcHRpb25zKHRjaXB0X2dsb2JhbHMub3B0cywKKwkJCQkJCSAgICAgbS0+ZXh0cmFfb3B0cywKKwkJCQkJCSAgICAgJm0tPm9wdGlvbl9vZmZzZXQpOworI2VuZGlmCisJCQlpZiAob3B0cyA9PSBOVUxMKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICIgZmFpbGVkIHRvIGZpbmQgYWRkaXRpb25hbCBvcHRpb25zIGZvciB0YXJnZXQgJXNcblxuIiwgb3B0YXJnKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9IGVsc2UKKwkJCQl0Y2lwdF9nbG9iYWxzLm9wdHMgPSBvcHRzOworCQkJfSBlbHNlIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwiIGZhaWxlZCB0byBmaW5kIHRhcmdldCAlc1xuXG4iLCBvcHRhcmcpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCW9rKys7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJbWVtc2V0KCZmdywgMCwgc2l6ZW9mIChmdykpOworI2lmIChYVEFCTEVTX1ZFUlNJT05fQ09ERSA+PSA2KQorCQlpZiAobSAhPSBOVUxMICYmIG0tPng2X3BhcnNlICE9IE5VTEwgKSB7CisJCQl4dGFibGVzX29wdGlvbl90cGNhbGwoYywgYXJndiwgMCAsIG0sIE5VTEwpOworI2Vsc2UKKwkJaWYgKG0gIT0gTlVMTCAmJiBtLT5wYXJzZSAhPSBOVUxMICkgeworCQkJbS0+cGFyc2UoYyAtIG0tPm9wdGlvbl9vZmZzZXQsIGFyZ3YsIDAsICZtLT50ZmxhZ3MsCisJCQkJIE5VTEwsICZtLT50KTsKKyNlbmRpZgorCQkJfSBlbHNlIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwiZmFpbGVkIHRvIGZpbmQgdGFyZ2V0ICVzXG5cbiIsIG9wdGFyZyk7CisJCQkJcmV0dXJuIC0xOworCisJCQl9CisJCQlvaysrOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaWFyZ2MgPiBvcHRpbmQpIHsKKwkJaWYgKG1hdGNoZXMoYXJndltvcHRpbmRdLCAiaW5kZXgiKSA9PSAwKSB7CisJCQlpZiAoZ2V0X3UzMigmaW5kZXgsIGFyZ3Zbb3B0aW5kICsgMV0sIDEwKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImluZGV4XCJcbiIpOworCQkJCXh0YWJsZXNfZnJlZV9vcHRzKDEpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlvaysrOworCisJCQlvcHRpbmQgKz0gMjsKKwkJfQorCX0KKworCWlmICghb2sgJiYgIWlvaykgeworCQlmcHJpbnRmKHN0ZGVyciwiIGlwdCBQYXJzZXIgQkFEISEgKCVzKVxuIiwgKmFyZ3YpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogY2hlY2sgdGhhdCB3ZSBwYXNzZWQgdGhlIGNvcnJlY3QgcGFyYW1ldGVycyB0byB0aGUgdGFyZ2V0ICovCisjaWYgKFhUQUJMRVNfVkVSU0lPTl9DT0RFID49IDYpCisJaWYgKG0pCisJCXh0YWJsZXNfb3B0aW9uX3RmY2FsbChtKTsKKyNlbHNlCisJaWYgKG0gJiYgbS0+ZmluYWxfY2hlY2spCisJCW0tPmZpbmFsX2NoZWNrKG0tPnRmbGFncyk7CisjZW5kaWYKKworCXsKKwkJc3RydWN0IHRjbXNnICp0ID0gTkxNU0dfREFUQShuKTsKKwkJaWYgKHQtPnRjbV9wYXJlbnQgIT0gVENfSF9ST09UCisJCSAgICAmJiB0LT50Y21fcGFyZW50ID09IFRDX0hfTUFKKFRDX0hfSU5HUkVTUykpIHsKKwkJCWhvb2sgPSBORl9JUF9QUkVfUk9VVElORzsKKwkJfSBlbHNlIHsKKwkJCWhvb2sgPSBORl9JUF9QT1NUX1JPVVRJTkc7CisJCX0KKwl9CisKKwl0YWlsID0gTkxNU0dfVEFJTChuKTsKKwlhZGRhdHRyX2wobiwgTUFYX01TRywgdGNhX2lkLCBOVUxMLCAwKTsKKwlmcHJpbnRmKHN0ZG91dCwgInRhYmxlbmFtZTogJXMgaG9vazogJXNcbiAiLCB0bmFtZSwgaXB0aG9va3NbaG9va10pOworCWZwcmludGYoc3Rkb3V0LCAiXHR0YXJnZXQ6ICIpOworCisJaWYgKG0pCisJCW0tPnByaW50KE5VTEwsIG0tPnQsIDApOworCWZwcmludGYoc3Rkb3V0LCAiIGluZGV4ICVkXG4iLCBpbmRleCk7CisKKwlpZiAoc3RybGVuKHRuYW1lKSA+IDE2KSB7CisJCXNpemUgPSAxNjsKKwkJa1sxNV0gPSAwOworCX0gZWxzZSB7CisJCXNpemUgPSAxICsgc3RybGVuKHRuYW1lKTsKKwl9CisJc3RybmNweShrLCB0bmFtZSwgc2l6ZSk7CisKKwlhZGRhdHRyX2wobiwgTUFYX01TRywgVENBX0lQVF9UQUJMRSwgaywgc2l6ZSk7CisJYWRkYXR0cl9sKG4sIE1BWF9NU0csIFRDQV9JUFRfSE9PSywgJmhvb2ssIDQpOworCWFkZGF0dHJfbChuLCBNQVhfTVNHLCBUQ0FfSVBUX0lOREVYLCAmaW5kZXgsIDQpOworCWlmIChtKQorCQlhZGRhdHRyX2wobiwgTUFYX01TRywgVENBX0lQVF9UQVJHLCBtLT50LCBtLT50LT51LnRhcmdldF9zaXplKTsKKwl0YWlsLT5ydGFfbGVuID0gKHZvaWQgKikgTkxNU0dfVEFJTChuKSAtICh2b2lkICopIHRhaWw7CisKKwlhcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKwkqYXJnY19wID0gcmFyZ2MgLSBpYXJnYzsKKwkqYXJndl9wID0gYXJndjsKKworCW9wdGluZCA9IDA7CisJeHRhYmxlc19mcmVlX29wdHMoMSk7CisKKwlpZiAobSkgeworCQkvKiBDbGVhciBmbGFncyBpZiB0YXJnZXQgd2lsbCBiZSB1c2VkIGFnYWluICovCisJCW0tPnRmbGFncyA9IDA7CisJCW0tPnVzZWQgPSAwOworCQkvKiBGcmVlIGFsbG9jYXRlZCBtZW1vcnkgKi8KKwkJaWYgKG0tPnQpCisJCQlmcmVlKG0tPnQpOworCX0KKworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQKK3ByaW50X2lwdChzdHJ1Y3QgYWN0aW9uX3V0aWwgKmF1LEZJTEUgKiBmLCBzdHJ1Y3QgcnRhdHRyICphcmcpCit7CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX0lQVF9NQVggKyAxXTsKKwlzdHJ1Y3QgeHRfZW50cnlfdGFyZ2V0ICp0ID0gTlVMTDsKKwlzdHJ1Y3Qgb3B0aW9uICpvcHRzID0gTlVMTDsKKworCWlmIChhcmcgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJLyogY29weSB0Y2lwdF9nbG9iYWxzIGJlY2F1c2UgLm9wdHMgd2lsbCBiZSBtb2RpZmllZCBieSBpcHRhYmxlcyAqLworCXN0cnVjdCB4dGFibGVzX2dsb2JhbHMgdG1wX3RjaXB0X2dsb2JhbHMgPSB0Y2lwdF9nbG9iYWxzOworCisJeHRhYmxlc19pbml0X2FsbCgmdG1wX3RjaXB0X2dsb2JhbHMsIE5GUFJPVE9fSVBWNCk7CisJc2V0X2xpYl9kaXIoKTsKKworCXBhcnNlX3J0YXR0cl9uZXN0ZWQodGIsIFRDQV9JUFRfTUFYLCBhcmcpOworCisJaWYgKHRiW1RDQV9JUFRfVEFCTEVdID09IE5VTEwpIHsKKwkJZnByaW50ZihmLCAiW05VTEwgaXB0IHRhYmxlIG5hbWUgXSBhc3N1bWluZyBtYW5nbGUgIik7CisJfSBlbHNlIHsKKwkJZnByaW50ZihmLCAidGFibGVuYW1lOiAlcyAiLAorCQkJcnRhX2dldGF0dHJfc3RyKHRiW1RDQV9JUFRfVEFCTEVdKSk7CisJfQorCisJaWYgKHRiW1RDQV9JUFRfSE9PS10gPT0gTlVMTCkgeworCQlmcHJpbnRmKGYsICJbTlVMTCBpcHQgaG9vayBuYW1lIF1cbiAiKTsKKwkJcmV0dXJuIC0xOworCX0gZWxzZSB7CisJCV9fdTMyIGhvb2s7CisJCWhvb2sgPSBydGFfZ2V0YXR0cl91MzIodGJbVENBX0lQVF9IT09LXSk7CisJCWZwcmludGYoZiwgIiBob29rOiAlcyBcbiIsIGlwdGhvb2tzW2hvb2tdKTsKKwl9CisKKwlpZiAodGJbVENBX0lQVF9UQVJHXSA9PSBOVUxMKSB7CisJCWZwcmludGYoZiwgIlx0W05VTEwgaXB0IHRhcmdldCBwYXJhbWV0ZXJzIF0gXG4iKTsKKwkJcmV0dXJuIC0xOworCX0gZWxzZSB7CisJCXN0cnVjdCB4dGFibGVzX3RhcmdldCAqbSA9IE5VTEw7CisJCXQgPSBSVEFfREFUQSh0YltUQ0FfSVBUX1RBUkddKTsKKwkJbSA9IHh0YWJsZXNfZmluZF90YXJnZXQodC0+dS51c2VyLm5hbWUsIFhURl9UUllfTE9BRCk7CisJCWlmIChOVUxMICE9IG0pIHsKKwkJCWlmICgwID4gYnVpbGRfc3QobSwgdCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiAlcyBlcnJvciBcbiIsIG0tPm5hbWUpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKworI2lmIChYVEFCTEVTX1ZFUlNJT05fQ09ERSA+PSA2KQorCQlvcHRzID0geHRhYmxlc19vcHRpb25zX3hmcm0odG1wX3RjaXB0X2dsb2JhbHMub3JpZ19vcHRzLAorCQkJCQkgICAgdG1wX3RjaXB0X2dsb2JhbHMub3B0cywKKwkJCQkJICAgIG0tPng2X29wdGlvbnMsCisJCQkJCSAgICAmbS0+b3B0aW9uX29mZnNldCk7CisjZWxzZQorCQlvcHRzID0geHRhYmxlc19tZXJnZV9vcHRpb25zKHRtcF90Y2lwdF9nbG9iYWxzLm9wdHMsCisJCQkJCSAgICAgbS0+ZXh0cmFfb3B0cywKKwkJCQkJICAgICAmbS0+b3B0aW9uX29mZnNldCk7CisjZW5kaWYKKwlpZiAob3B0cyA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiIGZhaWxlZCB0byBmaW5kIGFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgdGFyZ2V0ICVzXG5cbiIsIG9wdGFyZyk7CisJCXJldHVybiAtMTsKKwl9IGVsc2UKKwkJdG1wX3RjaXB0X2dsb2JhbHMub3B0cyA9IG9wdHM7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiBmYWlsZWQgdG8gZmluZCB0YXJnZXQgJXNcblxuIiwKKwkJCQl0LT51LnVzZXIubmFtZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZnByaW50ZihmLCAiXHR0YXJnZXQgIik7CisJCW0tPnByaW50KE5VTEwsIG0tPnQsIDApOworCQlpZiAodGJbVENBX0lQVF9JTkRFWF0gPT0gTlVMTCkgeworCQkJZnByaW50ZihmLCAiIFtOVUxMIGlwdCB0YXJnZXQgaW5kZXggXVxuIik7CisJCX0gZWxzZSB7CisJCQlfX3UzMiBpbmRleDsKKwkJCWluZGV4ID0gcnRhX2dldGF0dHJfdTMyKHRiW1RDQV9JUFRfSU5ERVhdKTsKKwkJCWZwcmludGYoZiwgIiBcblx0aW5kZXggJWQiLCBpbmRleCk7CisJCX0KKworCQlpZiAodGJbVENBX0lQVF9DTlRdKSB7CisJCQlzdHJ1Y3QgdGNfY250ICpjICA9IFJUQV9EQVRBKHRiW1RDQV9JUFRfQ05UXSk7OworCQkJZnByaW50ZihmLCAiIHJlZiAlZCBiaW5kICVkIiwgYy0+cmVmY250LCBjLT5iaW5kY250KTsKKwkJfQorCQlpZiAoc2hvd19zdGF0cykgeworCQkJaWYgKHRiW1RDQV9JUFRfVE1dKSB7CisJCQkJc3RydWN0IHRjZl90ICp0bSA9IFJUQV9EQVRBKHRiW1RDQV9JUFRfVE1dKTsKKwkJCQlwcmludF90bShmLHRtKTsKKwkJCX0KKwkJfQorCQlmcHJpbnRmKGYsICIgXG4iKTsKKworCX0KKwl4dGFibGVzX2ZyZWVfb3B0cygxKTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgYWN0aW9uX3V0aWwgeHRfYWN0aW9uX3V0aWwgPSB7CisgICAgICAgIC5pZCA9ICJ4dCIsCisgICAgICAgIC5wYXJzZV9hb3B0ID0gcGFyc2VfaXB0LAorICAgICAgICAucHJpbnRfYW9wdCA9IHByaW50X2lwdCwKK307CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy9tX3h0X29sZC5jIGIvaXByb3V0ZTIvdGMvbV94dF9vbGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTY0MzA4Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGMvbV94dF9vbGQuYwpAQCAtMCwwICsxLDQzNSBAQAorLyoKKyAqIG1feHQuYwl4dGFibGVzIGJhc2VkIHRhcmdldHMKKyAqCQl1dGlsaXRpZXMgbW9zdGx5IHJpcHBlZCBmcm9tIGlwdGFibGVzIDxkdWgsIGl0cyB0aGUgbGludXggd2F5PgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOiAgSiBIYWRpIFNhbGltIChoYWRpQGN5YmVydXMuY2EpCisgKi8KKworLypYWFg6IGluIHRoZSBmdXR1cmUgKHh0YWJsZXMgMS40LjM/KSBnZXQgcmlkIG9mIGV2ZXJ5dGhpbmcgdGFnZ2VkCisgKiBhcyBUQ19DT05GSUdfWFRfSCAqLworCisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDx4dGFibGVzLmg+CisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0Y191dGlsLmgiCisjaW5jbHVkZSA8bGludXgvdGNfYWN0L3RjX2lwdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2lmZGVmIFRDX0NPTkZJR19YVF9ICisjaW5jbHVkZSAieHQtaW50ZXJuYWwuaCIKKyNlbmRpZgorCisjaWZuZGVmIEFMSUdOCisjZGVmaW5lIEFMSUdOKHgsYSkJCV9fQUxJR05fTUFTSyh4LCh0eXBlb2YoeCkpKGEpLTEpCisjZGVmaW5lIF9fQUxJR05fTUFTSyh4LG1hc2spCSgoKHgpKyhtYXNrKSkmfihtYXNrKSkKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciAqcG5hbWUgPSAidGMtaXB0IjsKK3N0YXRpYyBjb25zdCBjaGFyICp0bmFtZSA9ICJtYW5nbGUiOworc3RhdGljIGNvbnN0IGNoYXIgKnB2ZXJzaW9uID0gIjAuMiI7CisKK3N0YXRpYyBjb25zdCBjaGFyICppcHRob29rc1tdID0geworCSJORl9JUF9QUkVfUk9VVElORyIsCisJIk5GX0lQX0xPQ0FMX0lOIiwKKwkiTkZfSVBfRk9SV0FSRCIsCisJIk5GX0lQX0xPQ0FMX09VVCIsCisJIk5GX0lQX1BPU1RfUk9VVElORyIsCit9OworCitzdGF0aWMgc3RydWN0IG9wdGlvbiBvcmlnaW5hbF9vcHRzW10gPSB7CisJeyJqdW1wIiwgMSwgMCwgJ2onfSwKKwl7MCwgMCwgMCwgMH0KK307CisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uICpvcHRzID0gb3JpZ2luYWxfb3B0czsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2xvYmFsX29wdGlvbl9vZmZzZXQgPSAwOworY2hhciAqbGliX2RpcjsKK2NvbnN0IGNoYXIgKnByb2dyYW1fdmVyc2lvbiA9IFhUQUJMRVNfVkVSU0lPTjsKK2NvbnN0IGNoYXIgKnByb2dyYW1fbmFtZSA9ICJ0Yy1pcHQiOworc3RydWN0IGFmaW5mbyBhZmluZm8gPSB7CisJLmZhbWlseSAgICAgICAgID0gQUZfSU5FVCwKKwkubGlicHJlZml4ICAgICAgPSAibGlieHRfIiwKKwkuaXBwcm90byAgICAgICAgPSBJUFBST1RPX0lQLAorCS5rbW9kICAgICAgICAgICA9ICJpcF90YWJsZXMiLAorCS5zb19yZXZfdGFyZ2V0ICA9IElQVF9TT19HRVRfUkVWSVNJT05fVEFSR0VULAorfTsKKworCisjZGVmaW5lIE9QVElPTl9PRkZTRVQgMjU2CisKKy8qWFhYOiBUQ19DT05GSUdfWFRfSCAqLworc3RhdGljIHZvaWQgZnJlZV9vcHRzKHN0cnVjdCBvcHRpb24gKmxvY2FsX29wdHMpCit7CisJaWYgKGxvY2FsX29wdHMgIT0gb3JpZ2luYWxfb3B0cykgeworCQlmcmVlKGxvY2FsX29wdHMpOworCQlvcHRzID0gb3JpZ2luYWxfb3B0czsKKwkJZ2xvYmFsX29wdGlvbl9vZmZzZXQgPSAwOworCX0KK30KKworLypYWFg6IFRDX0NPTkZJR19YVF9IICovCitzdGF0aWMgc3RydWN0IG9wdGlvbiAqCittZXJnZV9vcHRpb25zKHN0cnVjdCBvcHRpb24gKm9sZG9wdHMsIGNvbnN0IHN0cnVjdCBvcHRpb24gKm5ld29wdHMsCisJICAgICAgdW5zaWduZWQgaW50ICpvcHRpb25fb2Zmc2V0KQoreworCXN0cnVjdCBvcHRpb24gKm1lcmdlOworCXVuc2lnbmVkIGludCBudW1fb2xkLCBudW1fbmV3LCBpOworCisJZm9yIChudW1fb2xkID0gMDsgb2xkb3B0c1tudW1fb2xkXS5uYW1lOyBudW1fb2xkKyspIDsKKwlmb3IgKG51bV9uZXcgPSAwOyBuZXdvcHRzW251bV9uZXddLm5hbWU7IG51bV9uZXcrKykgOworCisJKm9wdGlvbl9vZmZzZXQgPSBnbG9iYWxfb3B0aW9uX29mZnNldCArIE9QVElPTl9PRkZTRVQ7CisKKwltZXJnZSA9IG1hbGxvYyhzaXplb2YgKHN0cnVjdCBvcHRpb24pICogKG51bV9uZXcgKyBudW1fb2xkICsgMSkpOworCW1lbWNweShtZXJnZSwgb2xkb3B0cywgbnVtX29sZCAqIHNpemVvZiAoc3RydWN0IG9wdGlvbikpOworCWZvciAoaSA9IDA7IGkgPCBudW1fbmV3OyBpKyspIHsKKwkJbWVyZ2VbbnVtX29sZCArIGldID0gbmV3b3B0c1tpXTsKKwkJbWVyZ2VbbnVtX29sZCArIGldLnZhbCArPSAqb3B0aW9uX29mZnNldDsKKwl9CisJbWVtc2V0KG1lcmdlICsgbnVtX29sZCArIG51bV9uZXcsIDAsIHNpemVvZiAoc3RydWN0IG9wdGlvbikpOworCisJcmV0dXJuIG1lcmdlOworfQorCisKKy8qWFhYOiBUQ19DT05GSUdfWFRfSCAqLworI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgMQorI2VuZGlmCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFIDAKKyNlbmRpZgorCisvKlhYWDogVENfQ09ORklHX1hUX0ggKi8KK2ludAorY2hlY2tfaW52ZXJzZShjb25zdCBjaGFyIG9wdGlvbltdLCBpbnQgKmludmVydCwgaW50ICpteV9vcHRpbmQsIGludCBhcmdjKQoreworICAgICAgICBpZiAob3B0aW9uICYmIHN0cmNtcChvcHRpb24sICIhIikgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmICgqaW52ZXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk11bHRpcGxlIGAhJyBmbGFncyBub3QgYWxsb3dlZCIpOworICAgICAgICAgICAgICAgICppbnZlcnQgPSBUUlVFOworICAgICAgICAgICAgICAgIGlmIChteV9vcHRpbmQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgKysqbXlfb3B0aW5kOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ2MgJiYgKm15X29wdGluZCA+IGFyZ2MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vIGFyZ3VtZW50IGZvbGxvd2luZyBgISciKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qWFhYOiBUQ19DT05GSUdfWFRfSCAqLwordm9pZCBleGl0X2Vycm9yKGVudW0gZXhpdHR5cGUgc3RhdHVzLCBjb25zdCBjaGFyICptc2csIC4uLikKK3sKKyAgICAgICAgdmFfbGlzdCBhcmdzOworCisgICAgICAgIHZhX3N0YXJ0KGFyZ3MsIG1zZyk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMgdiVzOiAiLCBwbmFtZSwgcHZlcnNpb24pOworICAgICAgICB2ZnByaW50ZihzdGRlcnIsIG1zZywgYXJncyk7CisgICAgICAgIHZhX2VuZChhcmdzKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgICAgICAvKiBPbiBlcnJvciBwYXRocywgbWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QgbGVhayBtZW1vcnkgKi8KKyAgICAgICAgZXhpdChzdGF0dXMpOworfQorCisvKlhYWDogVENfQ09ORklHX1hUX0ggKi8KK3N0YXRpYyB2b2lkIHNldF9yZXZpc2lvbihjaGFyICpuYW1lLCB1X2ludDhfdCByZXZpc2lvbikKK3sKKwkvKiBPbGQga2VybmVsIHNvdXJjZXMgZG9uJ3QgaGF2ZSAiLnJldmlzaW9uIiBmaWVsZCwKKwkqICBidXQgd2Ugc3RvbGUgYSBieXRlIGZyb20gbmFtZS4gKi8KKwluYW1lW0lQVF9GVU5DVElPTl9NQVhOQU1FTEVOIC0gMl0gPSAnXDAnOworCW5hbWVbSVBUX0ZVTkNUSU9OX01BWE5BTUVMRU4gLSAxXSA9IHJldmlzaW9uOworfQorCisvKgorICogd2UgbWF5IG5lZWQgdG8gY2hlY2sgZm9yIHZlcnNpb24gbWlzbWF0Y2gKKyovCitpbnQKK2J1aWxkX3N0KHN0cnVjdCB4dGFibGVzX3RhcmdldCAqdGFyZ2V0LCBzdHJ1Y3QgeHRfZW50cnlfdGFyZ2V0ICp0KQoreworCisJc2l6ZV90IHNpemUgPQorCQkgICAgWFRfQUxJR04oc2l6ZW9mIChzdHJ1Y3QgeHRfZW50cnlfdGFyZ2V0KSkgKyB0YXJnZXQtPnNpemU7CisKKwlpZiAoTlVMTCA9PSB0KSB7CisJCXRhcmdldC0+dCA9IGZ3X2NhbGxvYygxLCBzaXplKTsKKwkJdGFyZ2V0LT50LT51LnRhcmdldF9zaXplID0gc2l6ZTsKKwkJc3RyY3B5KHRhcmdldC0+dC0+dS51c2VyLm5hbWUsIHRhcmdldC0+bmFtZSk7CisJCXNldF9yZXZpc2lvbih0YXJnZXQtPnQtPnUudXNlci5uYW1lLCB0YXJnZXQtPnJldmlzaW9uKTsKKworCQlpZiAodGFyZ2V0LT5pbml0ICE9IE5VTEwpCisJCQl0YXJnZXQtPmluaXQodGFyZ2V0LT50KTsKKwl9IGVsc2UgeworCQl0YXJnZXQtPnQgPSB0OworCX0KKwlyZXR1cm4gMDsKKworfQorCitpbmxpbmUgdm9pZCBzZXRfbGliX2Rpcih2b2lkKQoreworCisJbGliX2RpciA9IGdldGVudigiWFRBQkxFU19MSUJESVIiKTsKKwlpZiAoIWxpYl9kaXIpIHsKKwkJbGliX2RpciA9IGdldGVudigiSVBUQUJMRVNfTElCX0RJUiIpOworCQlpZiAobGliX2RpcikKKwkJCWZwcmludGYoc3RkZXJyLCAidXNpbmcgZGVwcmVjYXRlZCBJUFRBQkxFU19MSUJfRElSIFxuIik7CisJfQorCWlmIChsaWJfZGlyID09IE5VTEwpCisJCWxpYl9kaXIgPSBYVF9MSUJfRElSOworCit9CisKK3N0YXRpYyBpbnQgcGFyc2VfaXB0KHN0cnVjdCBhY3Rpb25fdXRpbCAqYSxpbnQgKmFyZ2NfcCwKKwkJICAgICBjaGFyICoqKmFyZ3ZfcCwgaW50IHRjYV9pZCwgc3RydWN0IG5sbXNnaGRyICpuKQoreworCXN0cnVjdCB4dGFibGVzX3RhcmdldCAqbSA9IE5VTEw7CisJc3RydWN0IGlwdF9lbnRyeSBmdzsKKwlzdHJ1Y3QgcnRhdHRyICp0YWlsOworCWludCBjOworCWludCByYXJnYyA9ICphcmdjX3A7CisJY2hhciAqKmFyZ3YgPSAqYXJndl9wOworCWludCBhcmdjID0gMCwgaWFyZ2MgPSAwOworCWNoYXIga1sxNl07CisJaW50IHNpemUgPSAwOworCWludCBpb2sgPSAwLCBvayA9IDA7CisJX191MzIgaG9vayA9IDAsIGluZGV4ID0gMDsKKworCXNldF9saWJfZGlyKCk7CisKKwl7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgcmFyZ2M7IGkrKykgeworCQkJaWYgKE5VTEwgPT0gYXJndltpXSB8fCAwID09IHN0cmNtcChhcmd2W2ldLCAiYWN0aW9uIikpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpYXJnYyA9IGFyZ2MgPSBpOworCX0KKworCWlmIChhcmdjIDw9IDIpIHsKKwkJZnByaW50ZihzdGRlcnIsImJhZCBhcmd1bWVudHMgdG8gaXB0ICVkIHZzICVkIFxuIiwgYXJnYywgcmFyZ2MpOworCQlyZXR1cm4gLTE7CisJfQorCisJd2hpbGUgKDEpIHsKKwkJYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJqOiIsIG9wdHMsIE5VTEwpOworCQlpZiAoYyA9PSAtMSkKKwkJCWJyZWFrOworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnaic6CisJCQltID0gZmluZF90YXJnZXQob3B0YXJnLCBUUllfTE9BRCk7CisJCQlpZiAoTlVMTCAhPSBtKSB7CisKKwkJCQlpZiAoMCA+IGJ1aWxkX3N0KG0sIE5VTEwpKSB7CisJCQkJCXByaW50ZigiICVzIGVycm9yIFxuIiwgbS0+bmFtZSk7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJb3B0cyA9CisJCQkJICAgIG1lcmdlX29wdGlvbnMob3B0cywgbS0+ZXh0cmFfb3B0cywKKwkJCQkJCSAgJm0tPm9wdGlvbl9vZmZzZXQpOworCQkJfSBlbHNlIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwiIGZhaWxlZCB0byBmaW5kIHRhcmdldCAlc1xuXG4iLCBvcHRhcmcpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCW9rKys7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJbWVtc2V0KCZmdywgMCwgc2l6ZW9mIChmdykpOworCQkJaWYgKG0pIHsKKwkJCQltLT5wYXJzZShjIC0gbS0+b3B0aW9uX29mZnNldCwgYXJndiwgMCwKKwkJCQkJICZtLT50ZmxhZ3MsIE5VTEwsICZtLT50KTsKKwkJCX0gZWxzZSB7CisJCQkJZnByaW50ZihzdGRlcnIsIiBmYWlsZWQgdG8gZmluZCB0YXJnZXQgJXNcblxuIiwgb3B0YXJnKTsKKwkJCQlyZXR1cm4gLTE7CisKKwkJCX0KKwkJCW9rKys7CisJCQlicmVhazsKKworCQl9CisJfQorCisJaWYgKGlhcmdjID4gb3B0aW5kKSB7CisJCWlmIChtYXRjaGVzKGFyZ3Zbb3B0aW5kXSwgImluZGV4IikgPT0gMCkgeworCQkJaWYgKGdldF91MzIoJmluZGV4LCBhcmd2W29wdGluZCArIDFdLCAxMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJpbmRleFwiXG4iKTsKKwkJCQlmcmVlX29wdHMob3B0cyk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaW9rKys7CisKKwkJCW9wdGluZCArPSAyOworCQl9CisJfQorCisJaWYgKCFvayAmJiAhaW9rKSB7CisJCWZwcmludGYoc3RkZXJyLCIgaXB0IFBhcnNlciBCQUQhISAoJXMpXG4iLCAqYXJndik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBjaGVjayB0aGF0IHdlIHBhc3NlZCB0aGUgY29ycmVjdCBwYXJhbWV0ZXJzIHRvIHRoZSB0YXJnZXQgKi8KKwlpZiAobSkKKwkJbS0+ZmluYWxfY2hlY2sobS0+dGZsYWdzKTsKKworCXsKKwkJc3RydWN0IHRjbXNnICp0ID0gTkxNU0dfREFUQShuKTsKKwkJaWYgKHQtPnRjbV9wYXJlbnQgIT0gVENfSF9ST09UCisJCSAgICAmJiB0LT50Y21fcGFyZW50ID09IFRDX0hfTUFKKFRDX0hfSU5HUkVTUykpIHsKKwkJCWhvb2sgPSBORl9JUF9QUkVfUk9VVElORzsKKwkJfSBlbHNlIHsKKwkJCWhvb2sgPSBORl9JUF9QT1NUX1JPVVRJTkc7CisJCX0KKwl9CisKKwl0YWlsID0gTkxNU0dfVEFJTChuKTsKKwlhZGRhdHRyX2wobiwgTUFYX01TRywgdGNhX2lkLCBOVUxMLCAwKTsKKwlmcHJpbnRmKHN0ZG91dCwgInRhYmxlbmFtZTogJXMgaG9vazogJXNcbiAiLCB0bmFtZSwgaXB0aG9va3NbaG9va10pOworCWZwcmludGYoc3Rkb3V0LCAiXHR0YXJnZXQ6ICIpOworCisJaWYgKG0pCisJCW0tPnByaW50KE5VTEwsIG0tPnQsIDApOworCWZwcmludGYoc3Rkb3V0LCAiIGluZGV4ICVkXG4iLCBpbmRleCk7CisKKwlpZiAoc3RybGVuKHRuYW1lKSA+IDE2KSB7CisJCXNpemUgPSAxNjsKKwkJa1sxNV0gPSAwOworCX0gZWxzZSB7CisJCXNpemUgPSAxICsgc3RybGVuKHRuYW1lKTsKKwl9CisJc3RybmNweShrLCB0bmFtZSwgc2l6ZSk7CisKKwlhZGRhdHRyX2wobiwgTUFYX01TRywgVENBX0lQVF9UQUJMRSwgaywgc2l6ZSk7CisJYWRkYXR0cl9sKG4sIE1BWF9NU0csIFRDQV9JUFRfSE9PSywgJmhvb2ssIDQpOworCWFkZGF0dHJfbChuLCBNQVhfTVNHLCBUQ0FfSVBUX0lOREVYLCAmaW5kZXgsIDQpOworCWlmIChtKQorCQlhZGRhdHRyX2wobiwgTUFYX01TRywgVENBX0lQVF9UQVJHLCBtLT50LCBtLT50LT51LnRhcmdldF9zaXplKTsKKwl0YWlsLT5ydGFfbGVuID0gKHZvaWQgKikgTkxNU0dfVEFJTChuKSAtICh2b2lkICopIHRhaWw7CisKKwlhcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKwkqYXJnY19wID0gcmFyZ2MgLSBpYXJnYzsKKwkqYXJndl9wID0gYXJndjsKKworCW9wdGluZCA9IDA7CisJZnJlZV9vcHRzKG9wdHMpOworCS8qIENsZWFyIGZsYWdzIGlmIHRhcmdldCB3aWxsIGJlIHVzZWQgYWdhaW4gKi8KKyAgICAgICAgbS0+dGZsYWdzPTA7CisgICAgICAgIG0tPnVzZWQ9MDsKKwkvKiBGcmVlIGFsbG9jYXRlZCBtZW1vcnkgKi8KKyAgICAgICAgaWYgKG0tPnQpCisgICAgICAgICAgICBmcmVlKG0tPnQpOworCisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50CitwcmludF9pcHQoc3RydWN0IGFjdGlvbl91dGlsICphdSxGSUxFICogZiwgc3RydWN0IHJ0YXR0ciAqYXJnKQoreworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9JUFRfTUFYICsgMV07CisJc3RydWN0IHh0X2VudHJ5X3RhcmdldCAqdCA9IE5VTEw7CisKKwlpZiAoYXJnID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXNldF9saWJfZGlyKCk7CisKKwlwYXJzZV9ydGF0dHJfbmVzdGVkKHRiLCBUQ0FfSVBUX01BWCwgYXJnKTsKKworCWlmICh0YltUQ0FfSVBUX1RBQkxFXSA9PSBOVUxMKSB7CisJCWZwcmludGYoZiwgIltOVUxMIGlwdCB0YWJsZSBuYW1lIF0gYXNzdW1pbmcgbWFuZ2xlICIpOworCX0gZWxzZSB7CisJCWZwcmludGYoZiwgInRhYmxlbmFtZTogJXMgIiwKKwkJCXJ0YV9nZXRhdHRyX3N0cih0YltUQ0FfSVBUX1RBQkxFXSkpOworCX0KKworCWlmICh0YltUQ0FfSVBUX0hPT0tdID09IE5VTEwpIHsKKwkJZnByaW50ZihmLCAiW05VTEwgaXB0IGhvb2sgbmFtZSBdXG4gIik7CisJCXJldHVybiAtMTsKKwl9IGVsc2UgeworCQlfX3UzMiBob29rOworCQlob29rID0gcnRhX2dldGF0dHJfdTMyKHRiW1RDQV9JUFRfSE9PS10pOworCQlmcHJpbnRmKGYsICIgaG9vazogJXMgXG4iLCBpcHRob29rc1tob29rXSk7CisJfQorCisJaWYgKHRiW1RDQV9JUFRfVEFSR10gPT0gTlVMTCkgeworCQlmcHJpbnRmKGYsICJcdFtOVUxMIGlwdCB0YXJnZXQgcGFyYW1ldGVycyBdIFxuIik7CisJCXJldHVybiAtMTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgeHRhYmxlc190YXJnZXQgKm0gPSBOVUxMOworCQl0ID0gUlRBX0RBVEEodGJbVENBX0lQVF9UQVJHXSk7CisJCW0gPSBmaW5kX3RhcmdldCh0LT51LnVzZXIubmFtZSwgVFJZX0xPQUQpOworCQlpZiAoTlVMTCAhPSBtKSB7CisJCQlpZiAoMCA+IGJ1aWxkX3N0KG0sIHQpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICIgJXMgZXJyb3IgXG4iLCBtLT5uYW1lKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJCW9wdHMgPQorCQkJICAgIG1lcmdlX29wdGlvbnMob3B0cywgbS0+ZXh0cmFfb3B0cywKKwkJCQkJICAmbS0+b3B0aW9uX29mZnNldCk7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiBmYWlsZWQgdG8gZmluZCB0YXJnZXQgJXNcblxuIiwKKwkJCQl0LT51LnVzZXIubmFtZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZnByaW50ZihmLCAiXHR0YXJnZXQgIik7CisJCW0tPnByaW50KE5VTEwsIG0tPnQsIDApOworCQlpZiAodGJbVENBX0lQVF9JTkRFWF0gPT0gTlVMTCkgeworCQkJZnByaW50ZihmLCAiIFtOVUxMIGlwdCB0YXJnZXQgaW5kZXggXVxuIik7CisJCX0gZWxzZSB7CisJCQlfX3UzMiBpbmRleDsKKwkJCWluZGV4ID0gcnRhX2dldGF0dHJfdTMyKHRiW1RDQV9JUFRfSU5ERVhdKTsKKwkJCWZwcmludGYoZiwgIiBcblx0aW5kZXggJWQiLCBpbmRleCk7CisJCX0KKworCQlpZiAodGJbVENBX0lQVF9DTlRdKSB7CisJCQlzdHJ1Y3QgdGNfY250ICpjICA9IFJUQV9EQVRBKHRiW1RDQV9JUFRfQ05UXSk7OworCQkJZnByaW50ZihmLCAiIHJlZiAlZCBiaW5kICVkIiwgYy0+cmVmY250LCBjLT5iaW5kY250KTsKKwkJfQorCQlpZiAoc2hvd19zdGF0cykgeworCQkJaWYgKHRiW1RDQV9JUFRfVE1dKSB7CisJCQkJc3RydWN0IHRjZl90ICp0bSA9IFJUQV9EQVRBKHRiW1RDQV9JUFRfVE1dKTsKKwkJCQlwcmludF90bShmLHRtKTsKKwkJCX0KKwkJfQorCQlmcHJpbnRmKGYsICIgXG4iKTsKKworCX0KKwlmcmVlX29wdHMob3B0cyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGFjdGlvbl91dGlsIGlwdF9hY3Rpb25fdXRpbCA9IHsKKyAgICAgICAgLmlkID0gImlwdCIsCisgICAgICAgIC5wYXJzZV9hb3B0ID0gcGFyc2VfaXB0LAorICAgICAgICAucHJpbnRfYW9wdCA9IHByaW50X2lwdCwKK307CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy9wX2ljbXAuYyBiL2lwcm91dGUyL3RjL3BfaWNtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YjgwYzIKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy9wX2ljbXAuYwpAQCAtMCwwICsxLDYxIEBACisvKgorICogbV9wZWRpdF9pY21wLmMJcGFja2V0IGVkaXRvcjogSUNNUCBoZWFkZXIKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczogIEogSGFkaSBTYWxpbSAoaGFkaUBjeWJlcnVzLmNhKQorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0Y191dGlsLmgiCisjaW5jbHVkZSAibV9wZWRpdC5oIgorCisKK3N0YXRpYyBpbnQKK3BhcnNlX2ljbXAoaW50ICphcmdjX3AsIGNoYXIgKioqYXJndl9wLHN0cnVjdCB0Y19wZWRpdF9zZWwgKnNlbCxzdHJ1Y3QgdGNfcGVkaXRfa2V5ICp0a2V5KQoreworCWludCByZXMgPSAtMTsKKyNpZiAwCisJaW50IGFyZ2MgPSAqYXJnY19wOworCWNoYXIgKiphcmd2ID0gKmFyZ3ZfcDsKKworCWlmIChhcmdjIDwgMikKKwkJcmV0dXJuIC0xOworCisJaWYgKHN0cmNtcCgqYXJndiwgInR5cGUiKSA9PSAwKSB7CisJCU5FWFRfQVJHKCk7CisJCXJlcyA9IHBhcnNlX3U4KCZhcmdjLCAmYXJndiwgMCk7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKHN0cmNtcCgqYXJndiwgImNvZGUiKSA9PSAwKSB7CisJCU5FWFRfQVJHKCk7CisJCXJlcyA9IHBhcnNlX3U4KCZhcmdjLCAmYXJndiwgMSk7CisJCWdvdG8gZG9uZTsKKwl9CisJcmV0dXJuIC0xOworCisgICAgICBkb25lOgorCSphcmdjX3AgPSBhcmdjOworCSphcmd2X3AgPSBhcmd2OworI2VuZGlmCisJcmV0dXJuIHJlczsKK30KKworc3RydWN0IG1fcGVkaXRfdXRpbCBwX3BlZGl0X2ljbXAgPSB7CisJTlVMTCwKKwkiaWNtcCIsCisJcGFyc2VfaWNtcCwKK307CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy9wX2lwLmMgYi9pcHJvdXRlMi90Yy9wX2lwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhmZGJhYQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL3BfaXAuYwpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIG1fcGVkaXQuYwkJcGFja2V0IGVkaXRvcjogSVBWNC82IGhlYWRlcgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOiAgSiBIYWRpIFNhbGltIChoYWRpQGN5YmVydXMuY2EpCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInRjX3V0aWwuaCIKKyNpbmNsdWRlICJtX3BlZGl0LmgiCisKK3N0YXRpYyBpbnQKK3BhcnNlX2lwKGludCAqYXJnY19wLCBjaGFyICoqKmFyZ3ZfcCxzdHJ1Y3QgdGNfcGVkaXRfc2VsICpzZWwsc3RydWN0IHRjX3BlZGl0X2tleSAqdGtleSkKK3sKKwlpbnQgcmVzID0gLTE7CisJaW50IGFyZ2MgPSAqYXJnY19wOworCWNoYXIgKiphcmd2ID0gKmFyZ3ZfcDsKKworCWlmIChhcmdjIDwgMikKKwkJcmV0dXJuIC0xOworCisJaWYgKHN0cmNtcCgqYXJndiwgInNyYyIpID09IDApIHsKKwkJTkVYVF9BUkcoKTsKKwkJdGtleS0+b2ZmID0gMTI7CisJCXJlcyA9IHBhcnNlX2NtZCgmYXJnYywgJmFyZ3YsIDQsIFRJUFY0LFJVMzIsc2VsLHRrZXkpOworCQlnb3RvIGRvbmU7CisJfQorCWlmIChzdHJjbXAoKmFyZ3YsICJkc3QiKSA9PSAwKSB7CisJCU5FWFRfQVJHKCk7CisJCXRrZXktPm9mZiA9IDE2OworCQlyZXMgPSBwYXJzZV9jbWQoJmFyZ2MsICZhcmd2LCA0LCBUSVBWNCxSVTMyLHNlbCx0a2V5KTsKKwkJZ290byBkb25lOworCX0KKwkvKiBqYW1hbCAtIGxvb2sgYXQgdGhlc2UgYW5kIG1ha2UgdGhlbSBlaXRoZXIgb2xkIG9yIG5ldworCSoqIHNjaGVtZSBnaXZlbiBkaWZmc2VydgorCSoqIGRvbnQgZm9yZ2V0IHRoZSBDRSBiaXQKKwkqLworCWlmIChzdHJjbXAoKmFyZ3YsICJ0b3MiKSA9PSAwIHx8IG1hdGNoZXMoKmFyZ3YsICJkc2ZpZWxkIikgPT0gMCkgeworCQlORVhUX0FSRygpOworCQl0a2V5LT5vZmYgPSAxOworCQlyZXMgPSBwYXJzZV9jbWQoJmFyZ2MsICZhcmd2LCAgMSwgVFUzMixSVTgsc2VsLHRrZXkpOworCQlnb3RvIGRvbmU7CisJfQorCWlmIChzdHJjbXAoKmFyZ3YsICJpaGwiKSA9PSAwKSB7CisJCU5FWFRfQVJHKCk7CisJCXRrZXktPm9mZiA9IDA7CisJCXJlcyA9IHBhcnNlX2NtZCgmYXJnYywgJmFyZ3YsIDEsIFRVMzIsUlU4LHNlbCx0a2V5KTsKKwkJZ290byBkb25lOworCX0KKwlpZiAoc3RyY21wKCphcmd2LCAicHJvdG9jb2wiKSA9PSAwKSB7CisJCU5FWFRfQVJHKCk7CisJCXRrZXktPm9mZiA9IDk7CisJCXJlcyA9IHBhcnNlX2NtZCgmYXJnYywgJmFyZ3YsIDEsIFRVMzIsUlU4LHNlbCx0a2V5KTsKKwkJZ290byBkb25lOworCX0KKwkvKiBqYW1hbCAtIGZpeCB0aGlzICovCisJaWYgKG1hdGNoZXMoKmFyZ3YsICJwcmVjZWRlbmNlIikgPT0gMCkgeworCQlORVhUX0FSRygpOworCQl0a2V5LT5vZmYgPSAxOworCQlyZXMgPSBwYXJzZV9jbWQoJmFyZ2MsICZhcmd2LCAxLCBUVTMyLFJVOCxzZWwsdGtleSk7CisJCWdvdG8gZG9uZTsKKwl9CisJLyogamFtYWwgLSB2YWxpZGF0ZSB0aGlzIGF0IHNvbWUgcG9pbnQgKi8KKwlpZiAoc3RyY21wKCphcmd2LCAibm9mcmFnIikgPT0gMCkgeworCQlORVhUX0FSRygpOworCQl0a2V5LT5vZmYgPSA2OworCQlyZXMgPSBwYXJzZV9jbWQoJmFyZ2MsICZhcmd2LCAxLCBUVTMyLDB4M0Ysc2VsLHRrZXkpOworCQlnb3RvIGRvbmU7CisJfQorCS8qIGphbWFsIC0gdmFsaWRhdGUgdGhpcyBhdCBzb21lIHBvaW50ICovCisJaWYgKHN0cmNtcCgqYXJndiwgImZpcnN0ZnJhZyIpID09IDApIHsKKwkJTkVYVF9BUkcoKTsKKwkJdGtleS0+b2ZmID0gNjsKKwkJcmVzID0gcGFyc2VfY21kKCZhcmdjLCAmYXJndiwgMSwgVFUzMiwweDFGLHNlbCx0a2V5KTsKKwkJZ290byBkb25lOworCX0KKwlpZiAoc3RyY21wKCphcmd2LCAiY2UiKSA9PSAwKSB7CisJCU5FWFRfQVJHKCk7CisJCXRrZXktPm9mZiA9IDY7CisJCXJlcyA9IHBhcnNlX2NtZCgmYXJnYywgJmFyZ3YsIDEsIFRVMzIsMHg4MCxzZWwsdGtleSk7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKHN0cmNtcCgqYXJndiwgImRmIikgPT0gMCkgeworCQlORVhUX0FSRygpOworCQl0a2V5LT5vZmYgPSA2OworCQlyZXMgPSBwYXJzZV9jbWQoJmFyZ2MsICZhcmd2LCAxLCBUVTMyLDB4NDAsc2VsLHRrZXkpOworCQlnb3RvIGRvbmU7CisJfQorCWlmIChzdHJjbXAoKmFyZ3YsICJtZiIpID09IDApIHsKKwkJTkVYVF9BUkcoKTsKKwkJdGtleS0+b2ZmID0gNjsKKwkJcmVzID0gcGFyc2VfY21kKCZhcmdjLCAmYXJndiwgMSwgVFUzMiwweDIwLHNlbCx0a2V5KTsKKwkJZ290byBkb25lOworCX0KKwlpZiAoc3RyY21wKCphcmd2LCAiZHBvcnQiKSA9PSAwKSB7CisJCU5FWFRfQVJHKCk7CisJCXRrZXktPm9mZiA9IDIyOworCQlyZXMgPSBwYXJzZV9jbWQoJmFyZ2MsICZhcmd2LCAyLCBUVTMyLFJVMTYsc2VsLHRrZXkpOworCQlnb3RvIGRvbmU7CisJfQorCWlmIChzdHJjbXAoKmFyZ3YsICJzcG9ydCIpID09IDApIHsKKwkJTkVYVF9BUkcoKTsKKwkJdGtleS0+b2ZmID0gMjA7CisJCXJlcyA9IHBhcnNlX2NtZCgmYXJnYywgJmFyZ3YsIDIsIFRVMzIsUlUxNixzZWwsdGtleSk7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKHN0cmNtcCgqYXJndiwgImljbXBfdHlwZSIpID09IDApIHsKKwkJTkVYVF9BUkcoKTsKKwkJdGtleS0+b2ZmID0gMjA7CisJCXJlcyA9IHBhcnNlX2NtZCgmYXJnYywgJmFyZ3YsIDEsIFRVMzIsUlU4LHNlbCx0a2V5KTsKKwkJZ290byBkb25lOworCX0KKwlpZiAoc3RyY21wKCphcmd2LCAiaWNtcF9jb2RlIikgPT0gMCkgeworCQlORVhUX0FSRygpOworCQl0a2V5LT5vZmYgPSAyMDsKKwkJcmVzID0gcGFyc2VfY21kKCZhcmdjLCAmYXJndiwgMSwgVFUzMixSVTgsc2VsLHRrZXkpOworCQlnb3RvIGRvbmU7CisJfQorCXJldHVybiAtMTsKKworICAgICAgZG9uZToKKwkqYXJnY19wID0gYXJnYzsKKwkqYXJndl9wID0gYXJndjsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50CitwYXJzZV9pcDYoaW50ICphcmdjX3AsIGNoYXIgKioqYXJndl9wLHN0cnVjdCB0Y19wZWRpdF9zZWwgKnNlbCxzdHJ1Y3QgdGNfcGVkaXRfa2V5ICp0a2V5KQoreworCWludCByZXMgPSAtMTsKKwlyZXR1cm4gcmVzOworfQorCitzdHJ1Y3QgbV9wZWRpdF91dGlsIHBfcGVkaXRfaXAgPSB7CisJTlVMTCwKKwkiaXAiLAorCXBhcnNlX2lwLAorfTsKKworCitzdHJ1Y3QgbV9wZWRpdF91dGlsIHBfcGVkaXRfaXA2ID0geworCU5VTEwsCisJImlwNiIsCisJcGFyc2VfaXA2LAorfTsKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RjL3BfdGNwLmMgYi9pcHJvdXRlMi90Yy9wX3RjcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZmZjMDIKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy9wX3RjcC5jCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBtX3BlZGl0X3RjcC5jCXBhY2tldCBlZGl0b3I6IFRDUCBoZWFkZXIKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczogIEogSGFkaSBTYWxpbSAoaGFkaUBjeWJlcnVzLmNhKQorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0Y191dGlsLmgiCisjaW5jbHVkZSAibV9wZWRpdC5oIgorCitzdGF0aWMgaW50CitwYXJzZV90Y3AoaW50ICphcmdjX3AsIGNoYXIgKioqYXJndl9wLHN0cnVjdCB0Y19wZWRpdF9zZWwgKnNlbCxzdHJ1Y3QgdGNfcGVkaXRfa2V5ICp0a2V5KQoreworCWludCByZXMgPSAtMTsKKwlyZXR1cm4gcmVzOworfQorc3RydWN0IG1fcGVkaXRfdXRpbCBwX3BlZGl0X3RjcCA9IHsKKwlOVUxMLAorCSJ0Y3AiLAorCXBhcnNlX3RjcCwKK307CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy9wX3VkcC5jIGIvaXByb3V0ZTIvdGMvcF91ZHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjliODhmCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGMvcF91ZHAuYwpAQCAtMCwwICsxLDM3IEBACisvKgorICogbV9wZWRpdF91ZHAuYwlwYWNrZXQgZWRpdG9yOiBVRFAgaGVhZGVyCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIGRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6ICBKIEhhZGkgU2FsaW0gKGhhZGlAY3liZXJ1cy5jYSkKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAidGNfdXRpbC5oIgorI2luY2x1ZGUgIm1fcGVkaXQuaCIKKworc3RhdGljIGludAorcGFyc2VfdWRwKGludCAqYXJnY19wLCBjaGFyICoqKmFyZ3ZfcCxzdHJ1Y3QgdGNfcGVkaXRfc2VsICpzZWwsc3RydWN0IHRjX3BlZGl0X2tleSAqdGtleSkKK3sKKwlpbnQgcmVzID0gLTE7CisJcmV0dXJuIHJlczsKK30KKworc3RydWN0IG1fcGVkaXRfdXRpbCBwX3BlZGl0X3VkcCA9IHsKKwlOVUxMLAorCSJ1ZHAiLAorCXBhcnNlX3VkcCwKK307CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy9xX2F0bS5jIGIvaXByb3V0ZTIvdGMvcV9hdG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTk4ZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGMvcV9hdG0uYwpAQCAtMCwwICsxLDI1OCBAQAorLyoKKyAqIHFfYXRtLmMJCUFUTS4KKyAqCisgKiBIYWNrZWQgMTk5OC0yMDAwIGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgRVBGTCBJQ0EKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXRtLmg+CisjaW5jbHVkZSA8bGludXgvYXRtZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvYXRtYXJwLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInRjX3V0aWwuaCIKKworCisjZGVmaW5lIE1BWF9IRFJfTEVOIDY0CisKKworc3RhdGljIGludCBhdG1fcGFyc2Vfb3B0KHN0cnVjdCBxZGlzY191dGlsICpxdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJaWYgKGFyZ2MpIHsKKwkJZnByaW50ZihzdGRlcnIsIlVzYWdlOiBhdG1cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGV4cGxhaW4odm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAuLi4gYXRtICggcHZjIEFERFIgfCBzdmMgQUREUiBbIHNhcCBTQVAgXSApICIKKwkgICAgIlsgcW9zIFFPUyBdIFsgc25kYnVmIEJZVEVTIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICBbIGhkciBIRVguLi4gXSBbIGV4Y2VzcyAoIENMQVNTSUQgfCBjbHAgKSBdICIKKwkgICJbIGNsaXAgXVxuIik7Cit9CisKKworc3RhdGljIGludCBhdG1fcGFyc2VfY2xhc3Nfb3B0KHN0cnVjdCBxZGlzY191dGlsICpxdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorICAgc3RydWN0IG5sbXNnaGRyICpuKQoreworCXN0cnVjdCBzb2NrYWRkcl9hdG1zdmMgYWRkcjsKKwlzdHJ1Y3QgYXRtX3FvcyBxb3M7CisJc3RydWN0IGF0bV9zYXAgc2FwOworCXVuc2lnbmVkIGNoYXIgaGRyW01BWF9IRFJfTEVOXTsKKwlfX3UzMiBleGNlc3MgPSAwOworCXN0cnVjdCBydGF0dHIgKnRhaWw7CisJaW50IHNuZGJ1ZiA9IDA7CisJaW50IGhkcl9sZW4gPSAtMTsKKwlpbnQgc2V0X2NsaXAgPSAwOworCWludCBzOworCisJbWVtc2V0KCZhZGRyLDAsc2l6ZW9mKGFkZHIpKTsKKwkodm9pZCkgdGV4dDJxb3MoImFhbDUsdWJyOnNkdT05MTgwLHJ4Om5vbmUiLCZxb3MsMCk7CisJKHZvaWQpIHRleHQyc2FwKCJibGxpOmwyPWlzbzg4MDIiLCZzYXAsMCk7CisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmICghc3RyY21wKCphcmd2LCJwdmMiKSkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmICh0ZXh0MmF0bSgqYXJndiwoc3RydWN0IHNvY2thZGRyICopICZhZGRyLAorCQkJICAgIHNpemVvZihhZGRyKSxUMkFfUFZDIHwgVDJBX05BTUUpIDwgMCkgeworCQkJCWV4cGxhaW4oKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwic3ZjIikpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAodGV4dDJhdG0oKmFyZ3YsKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwKKwkJCSAgICBzaXplb2YoYWRkciksVDJBX1NWQyB8IFQyQV9OQU1FKSA8IDApIHsKKwkJCQlleHBsYWluKCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3YsInFvcyIpKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHRleHQycW9zKCphcmd2LCZxb3MsMCkgPCAwKSB7CisJCQkJZXhwbGFpbigpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICghc3RyY21wKCphcmd2LCJzbmRidWYiKSkgeworCQkJY2hhciAqZW5kOworCisJCQlORVhUX0FSRygpOworCQkJc25kYnVmID0gc3RydG9sKCphcmd2LCZlbmQsMCk7CisJCQlpZiAoKmVuZCkgeworCQkJCWV4cGxhaW4oKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwic2FwIikpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoYWRkci5zYXNfZmFtaWx5ICE9IEFGX0FUTVNWQyB8fAorCQkJICAgIHRleHQyc2FwKCphcmd2LCZzYXAsVDJBX05BTUUpIDwgMCkgeworCQkJCWV4cGxhaW4oKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwiaGRyIikpIHsKKwkJCXVuc2lnbmVkIGNoYXIgKnB0cjsKKwkJCWNoYXIgKndhbGs7CisKKwkJCU5FWFRfQVJHKCk7CisJCQlwdHIgPSBoZHI7CisJCQlmb3IgKHdhbGsgPSAqYXJndjsgKndhbGs7IHdhbGsrKykgeworCQkJCWludCB0bXA7CisKKwkJCQlpZiAocHRyID09IGhkcitNQVhfSERSX0xFTikgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwiaGVhZGVyIGlzIHRvbyBsb25nXG4iKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlpZiAoKndhbGsgPT0gJy4nKSBjb250aW51ZTsKKwkJCQlpZiAoIWlzeGRpZ2l0KHdhbGtbMF0pIHx8ICF3YWxrWzFdIHx8CisJCQkJICAgICFpc3hkaWdpdCh3YWxrWzFdKSkgeworCQkJCQlleHBsYWluKCk7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJc3NjYW5mKHdhbGssIiUyeCIsJnRtcCk7CisJCQkJKnB0cisrID0gdG1wOworCQkJCXdhbGsrKzsKKwkJCX0KKwkJCWhkcl9sZW4gPSBwdHItaGRyOworCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3YsImV4Y2VzcyIpKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKCFzdHJjbXAoKmFyZ3YsImNscCIpKSBleGNlc3MgPSAwOworCQkJZWxzZSBpZiAoZ2V0X3RjX2NsYXNzaWQoJmV4Y2VzcywqYXJndikpIHsKKwkJCQkJZXhwbGFpbigpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3YsImNsaXAiKSkgeworCQkJc2V0X2NsaXAgPSAxOworCQl9CisJCWVsc2UgeworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJYXJnYy0tOworCQlhcmd2Kys7CisJfQorCXMgPSBzb2NrZXQoYWRkci5zYXNfZmFtaWx5LFNPQ0tfREdSQU0sMCk7CisJaWYgKHMgPCAwKSB7CisJCXBlcnJvcigic29ja2V0Iik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHNldHNvY2tvcHQocyxTT0xfQVRNLFNPX0FUTVFPUywmcW9zLHNpemVvZihxb3MpKSA8IDApIHsKKwkJcGVycm9yKCJTT19BVE1RT1MiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoc25kYnVmKQorCSAgICBpZiAoc2V0c29ja29wdChzLFNPTF9TT0NLRVQsU09fU05EQlVGLCZzbmRidWYsc2l6ZW9mKHNuZGJ1ZikpIDwgMCkgeworCQlwZXJyb3IoIlNPX1NOREJVRiIpOworCSAgICByZXR1cm4gLTE7CisJfQorCWlmIChhZGRyLnNhc19mYW1pbHkgPT0gQUZfQVRNU1ZDICYmIHNldHNvY2tvcHQocyxTT0xfQVRNLFNPX0FUTVNBUCwKKwkgICAgJnNhcCxzaXplb2Yoc2FwKSkgPCAwKSB7CisJCXBlcnJvcigiU09fQVRNU0FQIik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKGNvbm5lY3Qocywoc3RydWN0IHNvY2thZGRyICopICZhZGRyLGFkZHIuc2FzX2ZhbWlseSA9PSBBRl9BVE1QVkMgPworCSAgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2F0bXB2YykgOiBzaXplb2YoYWRkcikpIDwgMCkgeworCQlwZXJyb3IoImNvbm5lY3QiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoc2V0X2NsaXApCisJCWlmIChpb2N0bChzLEFUTUFSUF9NS0lQLDApIDwgMCkgeworCQkJcGVycm9yKCJpb2N0bCBBVE1BUlBfTUtJUCIpOworCQkJcmV0dXJuIC0xOworCQl9CisJdGFpbCA9IE5MTVNHX1RBSUwobik7CisJYWRkYXR0cl9sKG4sMTAyNCxUQ0FfT1BUSU9OUyxOVUxMLDApOworCWFkZGF0dHJfbChuLDEwMjQsVENBX0FUTV9GRCwmcyxzaXplb2YocykpOworCWlmIChleGNlc3MpIGFkZGF0dHJfbChuLDEwMjQsVENBX0FUTV9FWENFU1MsJmV4Y2VzcyxzaXplb2YoZXhjZXNzKSk7CisJaWYgKGhkcl9sZW4gIT0gLTEpIGFkZGF0dHJfbChuLDEwMjQsVENBX0FUTV9IRFIsaGRyLGhkcl9sZW4pOworCXRhaWwtPnJ0YV9sZW4gPSAodm9pZCAqKSBOTE1TR19UQUlMKG4pIC0gKHZvaWQgKikgdGFpbDsKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBpbnQgYXRtX3ByaW50X29wdChzdHJ1Y3QgcWRpc2NfdXRpbCAqcXUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKm9wdCkKK3sKKwlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfQVRNX01BWCsxXTsKKwljaGFyIGJ1ZmZlcltNQVhfQVRNX0FERFJfTEVOKzFdOworCisJaWYgKG9wdCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXBhcnNlX3J0YXR0cl9uZXN0ZWQodGIsIFRDQV9BVE1fTUFYLCBvcHQpOworCWlmICh0YltUQ0FfQVRNX0FERFJdKSB7CisJCWlmIChSVEFfUEFZTE9BRCh0YltUQ0FfQVRNX0FERFJdKSA8CisJCSAgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2F0bXB2YykpCisJCQlmcHJpbnRmKHN0ZGVyciwiQVRNOiBhZGRyZXNzIHRvbyBzaG9ydFxuIik7CisJCWVsc2UgeworCQkJaWYgKGF0bTJ0ZXh0KGJ1ZmZlcixNQVhfQVRNX0FERFJfTEVOLAorCQkJICAgIFJUQV9EQVRBKHRiW1RDQV9BVE1fQUREUl0pLEEyVF9QUkVUVFkgfCBBMlRfTkFNRSkgPAorCQkJICAgIDApIGZwcmludGYoc3RkZXJyLCJhdG0ydGV4dCBlcnJvclxuIik7CisJCQlmcHJpbnRmKGYsInB2YyAlcyAiLGJ1ZmZlcik7CisJCX0KKwl9CisJaWYgKHRiW1RDQV9BVE1fSERSXSkgeworCQlpbnQgaTsKKwkJY29uc3QgX191OCAqaGRyID0gUlRBX0RBVEEodGJbVENBX0FUTV9IRFJdKTsKKworCQlmcHJpbnRmKGYsImhkciIpOworCQlmb3IgKGkgPSAwOyBpIDwgUlRBX1BBWUxPQUQodGJbVENBX0FUTV9IRFJdKTsgaSsrKQorCQkJZnByaW50ZihmLCIlYyUwMngiLCBpID8gJy4nIDogJyAnLCBoZHJbaV0pOworCQlpZiAoIWkpIGZwcmludGYoZiwiIC4iKTsKKwkJZnByaW50ZihmLCIgIik7CisJfQorCWlmICh0YltUQ0FfQVRNX0VYQ0VTU10pIHsKKwkJX191MzIgZXhjZXNzOworCisJCWlmIChSVEFfUEFZTE9BRCh0YltUQ0FfQVRNX0VYQ0VTU10pIDwgc2l6ZW9mKGV4Y2VzcykpCisJCQlmcHJpbnRmKHN0ZGVyciwiQVRNOiBleGNlc3MgY2xhc3MgSUQgdG9vIHNob3J0XG4iKTsKKwkJZWxzZSB7CisJCQlleGNlc3MgPSBydGFfZ2V0YXR0cl91MzIodGJbVENBX0FUTV9FWENFU1NdKTsKKwkJCWlmICghZXhjZXNzKSBmcHJpbnRmKGYsImV4Y2VzcyBjbHAgIik7CisJCQllbHNlIHsKKwkJCQljaGFyIGJ1Zls2NF07CisKKwkJCQlwcmludF90Y19jbGFzc2lkKGJ1ZixzaXplb2YoYnVmKSxleGNlc3MpOworCQkJCWZwcmludGYoZiwiZXhjZXNzICVzICIsYnVmKTsKKwkJCX0KKwkJfQorCX0KKwlpZiAodGJbVENBX0FUTV9TVEFURV0pIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKm1hcFtdID0geyBBVE1fVlMyVFhUX01BUCB9OworCQlpbnQgc3RhdGU7CisKKwkJaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9BVE1fU1RBVEVdKSA8IHNpemVvZihzdGF0ZSkpCisJCQlmcHJpbnRmKHN0ZGVyciwiQVRNOiBzdGF0ZSBmaWVsZCB0b28gc2hvcnRcbiIpOworCQllbHNlIHsKKwkJCXN0YXRlID0gKihpbnQgKikgUlRBX0RBVEEodGJbVENBX0FUTV9TVEFURV0pOworCQkJZnByaW50ZihmLCIlcyAiLG1hcFtzdGF0ZV0pOworCQl9CisJfQorCXJldHVybiAwOworfQorCisKK3N0cnVjdCBxZGlzY191dGlsIGF0bV9xZGlzY191dGlsID0geworCS5pZCAJCT0gImF0bSIsCisJLnBhcnNlX3FvcHQJPSBhdG1fcGFyc2Vfb3B0LAorCS5wcmludF9xb3B0CT0gYXRtX3ByaW50X29wdCwKKwkucGFyc2VfY29wdAk9IGF0bV9wYXJzZV9jbGFzc19vcHQsCisJLnByaW50X2NvcHQJPSBhdG1fcHJpbnRfb3B0LAorfTsKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RjL3FfY2JxLmMgYi9pcHJvdXRlMi90Yy9xX2NicS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YTYxNjMKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy9xX2NicS5jCkBAIC0wLDAgKzEsNTg0IEBACisvKgorICogcV9jYnEuYwkJQ0JRLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0Y191dGlsLmgiCisjaW5jbHVkZSAidGNfY2JxLmgiCisKK3N0YXRpYyB2b2lkIGV4cGxhaW5fY2xhc3Modm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAuLi4gY2JxIGJhbmR3aWR0aCBCUFMgcmF0ZSBCUFMgbWF4YnVyc3QgUEtUUyBbIGF2cGt0IEJZVEVTIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgWyBtaW5idXJzdCBQS1RTIF0gWyBib3VuZGVkIF0gWyBpc29sYXRlZCBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgIFsgYWxsb3QgQllURVMgXSBbIG1wdSBCWVRFUyBdIFsgd2VpZ2h0IFJBVEUgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICBbIHByaW8gTlVNQkVSIF0gWyBjZWxsIEJZVEVTIF0gWyBld21hIExPRyBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgIFsgZXN0aW1hdG9yIElOVEVSVkFMIFRJTUVfQ09OU1RBTlQgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICBbIHNwbGl0IENMQVNTSUQgXSBbIGRlZm1hcCBNQVNLL0NIQU5HRSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgIFsgb3ZlcmhlYWQgQllURVMgXSBbIGxpbmtsYXllciBUWVBFIF1cbiIpOworfQorCitzdGF0aWMgdm9pZCBleHBsYWluKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogLi4uIGNicSBiYW5kd2lkdGggQlBTIGF2cGt0IEJZVEVTIFsgbXB1IEJZVEVTIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgWyBjZWxsIEJZVEVTIF0gWyBld21hIExPRyBdXG4iKTsKK30KKworc3RhdGljIHZvaWQgZXhwbGFpbjEoY2hhciAqYXJnKQoreworCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcIiVzXCJcbiIsIGFyZyk7Cit9CisKKworc3RhdGljIGludCBjYnFfcGFyc2Vfb3B0KHN0cnVjdCBxZGlzY191dGlsICpxdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJc3RydWN0IHRjX3JhdGVzcGVjIHI7CisJc3RydWN0IHRjX2NicV9sc3NvcHQgbHNzOworCV9fdTMyIHJ0YWJbMjU2XTsKKwl1bnNpZ25lZCBtcHU9MCwgYXZwa3Q9MCwgYWxsb3Q9MDsKKwl1bnNpZ25lZCBzaG9ydCBvdmVyaGVhZD0wOworCXVuc2lnbmVkIGludCBsaW5rbGF5ZXIgPSBMSU5LTEFZRVJfRVRIRVJORVQ7IC8qIEFzc3VtZSBldGhlcm5ldCAqLworCWludCBjZWxsX2xvZz0tMTsKKwlpbnQgZXdtYV9sb2c9LTE7CisJc3RydWN0IHJ0YXR0ciAqdGFpbDsKKworCW1lbXNldCgmbHNzLCAwLCBzaXplb2YobHNzKSk7CisJbWVtc2V0KCZyLCAwLCBzaXplb2YocikpOworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChtYXRjaGVzKCphcmd2LCAiYmFuZHdpZHRoIikgPT0gMCB8fAorCQkgICAgbWF0Y2hlcygqYXJndiwgInJhdGUiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9yYXRlKCZyLnJhdGUsICphcmd2KSkgeworCQkJCWV4cGxhaW4xKCJiYW5kd2lkdGgiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImV3bWEiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9pbnRlZ2VyKCZld21hX2xvZywgKmFyZ3YsIDApKSB7CisJCQkJZXhwbGFpbjEoImV3bWEiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAoZXdtYV9sb2cgPiAzMSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiZXdtYV9sb2cgbXVzdCBiZSA8IDMyXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImNlbGwiKSA9PSAwKSB7CisJCQl1bnNpZ25lZCBjZWxsOworCQkJaW50IGk7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9zaXplKCZjZWxsLCAqYXJndikpIHsKKwkJCQlleHBsYWluMSgiY2VsbCIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWZvciAoaT0wOyBpPDMyOyBpKyspCisJCQkJaWYgKCgxPDxpKSA9PSBjZWxsKQorCQkJCQlicmVhazsKKwkJCWlmIChpPj0zMikgeworCQkJCWZwcmludGYoc3RkZXJyLCAiY2VsbCBtdXN0IGJlIDJeblxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJY2VsbF9sb2cgPSBpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJhdnBrdCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3NpemUoJmF2cGt0LCAqYXJndikpIHsKKwkJCQlleHBsYWluMSgiYXZwa3QiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgIm1wdSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3NpemUoJm1wdSwgKmFyZ3YpKSB7CisJCQkJZXhwbGFpbjEoIm1wdSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiYWxsb3QiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJLyogQWNjZXB0IGFuZCBpZ25vcmUgImFsbG90IiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworCQkJaWYgKGdldF9zaXplKCZhbGxvdCwgKmFyZ3YpKSB7CisJCQkJZXhwbGFpbjEoImFsbG90Iik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJvdmVyaGVhZCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UxNigmb3ZlcmhlYWQsICphcmd2LCAxMCkpIHsKKwkJCQlleHBsYWluMSgib3ZlcmhlYWQiKTsgcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJsaW5rbGF5ZXIiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9saW5rbGF5ZXIoJmxpbmtsYXllciwgKmFyZ3YpKSB7CisJCQkJZXhwbGFpbjEoImxpbmtsYXllciIpOyByZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKSB7CisJCQlleHBsYWluKCk7CisJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIldoYXQgaXMgXCIlc1wiP1xuIiwgKmFyZ3YpOworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCS8qIE9LLiBBbGwgb3B0aW9ucyBhcmUgcGFyc2VkLiAqLworCisJaWYgKHIucmF0ZSA9PSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ0JROiBiYW5kd2lkdGggaXMgcmVxdWlyZWQgcGFyYW1ldGVyLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKGF2cGt0ID09IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDQlE6IFwiYXZwa3RcIiBpcyByZXF1aXJlZC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChhbGxvdCA8IChhdnBrdCozKS8yKQorCQlhbGxvdCA9IChhdnBrdCozKS8yOworCisJci5tcHUgPSBtcHU7CisJci5vdmVyaGVhZCA9IG92ZXJoZWFkOworCWlmICh0Y19jYWxjX3J0YWJsZSgmciwgcnRhYiwgY2VsbF9sb2csIGFsbG90LCBsaW5rbGF5ZXIpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNCUTogZmFpbGVkIHRvIGNhbGN1bGF0ZSByYXRlIHRhYmxlLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoZXdtYV9sb2cgPCAwKQorCQlld21hX2xvZyA9IFRDX0NCUV9ERUZfRVdNQTsKKwlsc3MuZXdtYV9sb2cgPSBld21hX2xvZzsKKwlsc3MubWF4aWRsZSA9IHRjX2NhbGNfeG1pdHRpbWUoci5yYXRlLCBhdnBrdCk7CisJbHNzLmNoYW5nZSA9IFRDRl9DQlFfTFNTX01BWElETEV8VENGX0NCUV9MU1NfRVdNQXxUQ0ZfQ0JRX0xTU19BVlBLVDsKKwlsc3MuYXZwa3QgPSBhdnBrdDsKKworCXRhaWwgPSBOTE1TR19UQUlMKG4pOworCWFkZGF0dHJfbChuLCAxMDI0LCBUQ0FfT1BUSU9OUywgTlVMTCwgMCk7CisJYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9DQlFfUkFURSwgJnIsIHNpemVvZihyKSk7CisJYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9DQlFfTFNTT1BULCAmbHNzLCBzaXplb2YobHNzKSk7CisJYWRkYXR0cl9sKG4sIDMwMjQsIFRDQV9DQlFfUlRBQiwgcnRhYiwgMTAyNCk7CisJaWYgKHNob3dfcmF3KSB7CisJCWludCBpOworCQlmb3IgKGk9MDsgaTwyNTY7IGkrKykKKwkJCXByaW50ZigiJXUgIiwgcnRhYltpXSk7CisJCXByaW50ZigiXG4iKTsKKwl9CisJdGFpbC0+cnRhX2xlbiA9ICh2b2lkICopIE5MTVNHX1RBSUwobikgLSAodm9pZCAqKSB0YWlsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNicV9wYXJzZV9jbGFzc19vcHQoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlpbnQgd3JyX29rPTAsIGZvcHRfb2s9MDsKKwlzdHJ1Y3QgdGNfcmF0ZXNwZWMgcjsKKwlzdHJ1Y3QgdGNfY2JxX2xzc29wdCBsc3M7CisJc3RydWN0IHRjX2NicV93cnJvcHQgd3JyOworCXN0cnVjdCB0Y19jYnFfZm9wdCBmb3B0OworCXN0cnVjdCB0Y19jYnFfb3ZsIG92bDsKKwlfX3UzMiBydGFiWzI1Nl07CisJdW5zaWduZWQgbXB1PTA7CisJaW50IGNlbGxfbG9nPS0xOworCWludCBld21hX2xvZz0tMTsKKwl1bnNpZ25lZCBibmR3ID0gMDsKKwl1bnNpZ25lZCBtaW5idXJzdD0wLCBtYXhidXJzdD0wOworCXVuc2lnbmVkIHNob3J0IG92ZXJoZWFkPTA7CisJdW5zaWduZWQgaW50IGxpbmtsYXllciA9IExJTktMQVlFUl9FVEhFUk5FVDsgLyogQXNzdW1lIGV0aGVybmV0ICovCisJc3RydWN0IHJ0YXR0ciAqdGFpbDsKKworCW1lbXNldCgmciwgMCwgc2l6ZW9mKHIpKTsKKwltZW1zZXQoJmxzcywgMCwgc2l6ZW9mKGxzcykpOworCW1lbXNldCgmd3JyLCAwLCBzaXplb2Yod3JyKSk7CisJbWVtc2V0KCZmb3B0LCAwLCBzaXplb2YoZm9wdCkpOworCW1lbXNldCgmb3ZsLCAwLCBzaXplb2Yob3ZsKSk7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJyYXRlIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfcmF0ZSgmci5yYXRlLCAqYXJndikpIHsKKwkJCQlleHBsYWluMSgicmF0ZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiYmFuZHdpZHRoIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfcmF0ZSgmYm5kdywgKmFyZ3YpKSB7CisJCQkJZXhwbGFpbjEoImJhbmR3aWR0aCIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAibWluaWRsZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmbHNzLm1pbmlkbGUsICphcmd2LCAwKSkgeworCQkJCWV4cGxhaW4xKCJtaW5pZGxlIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJbHNzLmNoYW5nZSB8PSBUQ0ZfQ0JRX0xTU19NSU5JRExFOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJtaW5idXJzdCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmbWluYnVyc3QsICphcmd2LCAwKSkgeworCQkJCWV4cGxhaW4xKCJtaW5idXJzdCIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWxzcy5jaGFuZ2UgfD0gVENGX0NCUV9MU1NfT0ZGVElNRTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAibWF4YnVyc3QiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJm1heGJ1cnN0LCAqYXJndiwgMCkpIHsKKwkJCQlleHBsYWluMSgibWF4YnVyc3QiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlsc3MuY2hhbmdlIHw9IFRDRl9DQlFfTFNTX01BWElETEU7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImJvdW5kZWQiKSA9PSAwKSB7CisJCQlsc3MuZmxhZ3MgfD0gVENGX0NCUV9MU1NfQk9VTkRFRDsKKwkJCWxzcy5jaGFuZ2UgfD0gVENGX0NCUV9MU1NfRkxBR1M7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImJvcnJvdyIpID09IDApIHsKKwkJCWxzcy5mbGFncyAmPSB+VENGX0NCUV9MU1NfQk9VTkRFRDsKKwkJCWxzcy5jaGFuZ2UgfD0gVENGX0NCUV9MU1NfRkxBR1M7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImlzb2xhdGVkIikgPT0gMCkgeworCQkJbHNzLmZsYWdzIHw9IFRDRl9DQlFfTFNTX0lTT0xBVEVEOworCQkJbHNzLmNoYW5nZSB8PSBUQ0ZfQ0JRX0xTU19GTEFHUzsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAic2hhcmluZyIpID09IDApIHsKKwkJCWxzcy5mbGFncyAmPSB+VENGX0NCUV9MU1NfSVNPTEFURUQ7CisJCQlsc3MuY2hhbmdlIHw9IFRDRl9DQlFfTFNTX0ZMQUdTOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJld21hIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfaW50ZWdlcigmZXdtYV9sb2csICphcmd2LCAwKSkgeworCQkJCWV4cGxhaW4xKCJld21hIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKGV3bWFfbG9nID4gMzEpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgImV3bWFfbG9nIG11c3QgYmUgPCAzMlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJbHNzLmNoYW5nZSB8PSBUQ0ZfQ0JRX0xTU19FV01BOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJjZWxsIikgPT0gMCkgeworCQkJdW5zaWduZWQgY2VsbDsKKwkJCWludCBpOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfc2l6ZSgmY2VsbCwgKmFyZ3YpKSB7CisJCQkJZXhwbGFpbjEoImNlbGwiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlmb3IgKGk9MDsgaTwzMjsgaSsrKQorCQkJCWlmICgoMTw8aSkgPT0gY2VsbCkKKwkJCQkJYnJlYWs7CisJCQlpZiAoaT49MzIpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgImNlbGwgbXVzdCBiZSAyXm5cbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWNlbGxfbG9nID0gaTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAicHJpbyIpID09IDApIHsKKwkJCXVuc2lnbmVkIHByaW87CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJnByaW8sICphcmd2LCAwKSkgeworCQkJCWV4cGxhaW4xKCJwcmlvIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKHByaW8gPiBUQ19DQlFfTUFYUFJJTykgeworCQkJCWZwcmludGYoc3RkZXJyLCAiXCJwcmlvXCIgbXVzdCBiZSBudW1iZXIgaW4gdGhlIHJhbmdlIDEuLi4lZFxuIiwgVENfQ0JRX01BWFBSSU8pOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXdyci5wcmlvcml0eSA9IHByaW87CisJCQl3cnJfb2srKzsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiYWxsb3QiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9zaXplKCZ3cnIuYWxsb3QsICphcmd2KSkgeworCQkJCWV4cGxhaW4xKCJhbGxvdCIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiYXZwa3QiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9zaXplKCZsc3MuYXZwa3QsICphcmd2KSkgeworCQkJCWV4cGxhaW4xKCJhdnBrdCIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWxzcy5jaGFuZ2UgfD0gVENGX0NCUV9MU1NfQVZQS1Q7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgIm1wdSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3NpemUoJm1wdSwgKmFyZ3YpKSB7CisJCQkJZXhwbGFpbjEoIm1wdSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAid2VpZ2h0IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfc2l6ZSgmd3JyLndlaWdodCwgKmFyZ3YpKSB7CisJCQkJZXhwbGFpbjEoIndlaWdodCIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXdycl9vaysrOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJzcGxpdCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3RjX2NsYXNzaWQoJmZvcHQuc3BsaXQsICphcmd2KSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBzcGxpdCBub2RlIElELlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJZm9wdF9vaysrOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJkZWZtYXAiKSA9PSAwKSB7CisJCQlpbnQgZXJyOworCQkJTkVYVF9BUkcoKTsKKwkJCWVyciA9IHNzY2FuZigqYXJndiwgIiUwOHgvJTA4eCIsICZmb3B0LmRlZm1hcCwgJmZvcHQuZGVmY2hhbmdlKTsKKwkJCWlmIChlcnIgPCAxKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGRlZm1hcCwgc2hvdWxkIGJlIE1BU0szMlsvTUFTS11cbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChlcnIgPT0gMSkKKwkJCQlmb3B0LmRlZmNoYW5nZSA9IH4wOworCQkJZm9wdF9vaysrOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJvdmVyaGVhZCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UxNigmb3ZlcmhlYWQsICphcmd2LCAxMCkpIHsKKwkJCQlleHBsYWluMSgib3ZlcmhlYWQiKTsgcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJsaW5rbGF5ZXIiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9saW5rbGF5ZXIoJmxpbmtsYXllciwgKmFyZ3YpKSB7CisJCQkJZXhwbGFpbjEoImxpbmtsYXllciIpOyByZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKSB7CisJCQlleHBsYWluX2NsYXNzKCk7CisJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIldoYXQgaXMgXCIlc1wiP1xuIiwgKmFyZ3YpOworCQkJZXhwbGFpbl9jbGFzcygpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCS8qIE9LLiBBbGwgb3B0aW9ucyBhcmUgcGFyc2VkLiAqLworCisJLyogMS4gUHJlcGFyZSBsaW5rIHNoYXJpbmcgc2NoZWR1bGVyIHBhcmFtZXRlcnMgKi8KKwlpZiAoci5yYXRlKSB7CisJCXVuc2lnbmVkIHBrdHNpemUgPSB3cnIuYWxsb3Q7CisJCWlmICh3cnIuYWxsb3QgPCAobHNzLmF2cGt0KjMpLzIpCisJCQl3cnIuYWxsb3QgPSAobHNzLmF2cGt0KjMpLzI7CisJCXIubXB1ID0gbXB1OworCQlyLm92ZXJoZWFkID0gb3ZlcmhlYWQ7CisJCWlmICh0Y19jYWxjX3J0YWJsZSgmciwgcnRhYiwgY2VsbF9sb2csIHBrdHNpemUsIGxpbmtsYXllcikgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNCUTogZmFpbGVkIHRvIGNhbGN1bGF0ZSByYXRlIHRhYmxlLlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJaWYgKGV3bWFfbG9nIDwgMCkKKwkJZXdtYV9sb2cgPSBUQ19DQlFfREVGX0VXTUE7CisJbHNzLmV3bWFfbG9nID0gZXdtYV9sb2c7CisJaWYgKGxzcy5jaGFuZ2UmKFRDRl9DQlFfTFNTX09GRlRJTUV8VENGX0NCUV9MU1NfTUFYSURMRSkpIHsKKwkJaWYgKGxzcy5hdnBrdCA9PSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNCUTogYXZwa3QgaXMgcmVxdWlyZWQgZm9yIG1heC9taW5idXJzdC5cbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChibmR3PT0wIHx8IHIucmF0ZSA9PSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNCUTogYmFuZHdpZHRoJnJhdGUgYXJlIHJlcXVpcmVkIGZvciBtYXgvbWluYnVyc3QuXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlpZiAod3JyLnByaW9yaXR5ID09IDAgJiYgKG4tPm5sbXNnX2ZsYWdzJk5MTV9GX0VYQ0wpKSB7CisJCXdycl9vayA9IDE7CisJCXdyci5wcmlvcml0eSA9IFRDX0NCUV9NQVhQUklPOworCQlpZiAod3JyLmFsbG90ID09IDApCisJCQl3cnIuYWxsb3QgPSAobHNzLmF2cGt0KjMpLzI7CisJfQorCWlmICh3cnJfb2spIHsKKwkJaWYgKHdyci53ZWlnaHQgPT0gMCkKKwkJCXdyci53ZWlnaHQgPSAod3JyLnByaW9yaXR5ID09IFRDX0NCUV9NQVhQUklPKSA/IDEgOiByLnJhdGU7CisJCWlmICh3cnIuYWxsb3QgPT0gMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJDQlE6IFwiYWxsb3RcIiBpcyByZXF1aXJlZCB0byBzZXQgV1JSIHBhcmFtZXRlcnMuXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlpZiAobHNzLmNoYW5nZSZUQ0ZfQ0JRX0xTU19NQVhJRExFKSB7CisJCWxzcy5tYXhpZGxlID0gdGNfY2JxX2NhbGNfbWF4aWRsZShibmR3LCByLnJhdGUsIGxzcy5hdnBrdCwgZXdtYV9sb2csIG1heGJ1cnN0KTsKKwkJbHNzLmNoYW5nZSB8PSBUQ0ZfQ0JRX0xTU19NQVhJRExFOworCQlsc3MuY2hhbmdlIHw9IFRDRl9DQlFfTFNTX0VXTUF8VENGX0NCUV9MU1NfQVZQS1Q7CisJfQorCWlmIChsc3MuY2hhbmdlJlRDRl9DQlFfTFNTX09GRlRJTUUpIHsKKwkJbHNzLm9mZnRpbWUgPSB0Y19jYnFfY2FsY19vZmZ0aW1lKGJuZHcsIHIucmF0ZSwgbHNzLmF2cGt0LCBld21hX2xvZywgbWluYnVyc3QpOworCQlsc3MuY2hhbmdlIHw9IFRDRl9DQlFfTFNTX09GRlRJTUU7CisJCWxzcy5jaGFuZ2UgfD0gVENGX0NCUV9MU1NfRVdNQXxUQ0ZfQ0JRX0xTU19BVlBLVDsKKwl9CisJaWYgKGxzcy5jaGFuZ2UmVENGX0NCUV9MU1NfTUlOSURMRSkgeworCQlsc3MubWluaWRsZSA8PD0gbHNzLmV3bWFfbG9nOworCQlsc3MuY2hhbmdlIHw9IFRDRl9DQlFfTFNTX0VXTUE7CisJfQorCisJdGFpbCA9IE5MTVNHX1RBSUwobik7CisJYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9PUFRJT05TLCBOVUxMLCAwKTsKKwlpZiAobHNzLmNoYW5nZSkgeworCQlsc3MuY2hhbmdlIHw9IFRDRl9DQlFfTFNTX0ZMQUdTOworCQlhZGRhdHRyX2wobiwgMTAyNCwgVENBX0NCUV9MU1NPUFQsICZsc3MsIHNpemVvZihsc3MpKTsKKwl9CisJaWYgKHdycl9vaykKKwkJYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9DQlFfV1JST1BULCAmd3JyLCBzaXplb2Yod3JyKSk7CisJaWYgKGZvcHRfb2spCisJCWFkZGF0dHJfbChuLCAxMDI0LCBUQ0FfQ0JRX0ZPUFQsICZmb3B0LCBzaXplb2YoZm9wdCkpOworCWlmIChyLnJhdGUpIHsKKwkJYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9DQlFfUkFURSwgJnIsIHNpemVvZihyKSk7CisJCWFkZGF0dHJfbChuLCAzMDI0LCBUQ0FfQ0JRX1JUQUIsIHJ0YWIsIDEwMjQpOworCQlpZiAoc2hvd19yYXcpIHsKKwkJCWludCBpOworCQkJZm9yIChpPTA7IGk8MjU2OyBpKyspCisJCQkJcHJpbnRmKCIldSAiLCBydGFiW2ldKTsKKwkJCXByaW50ZigiXG4iKTsKKwkJfQorCX0KKwl0YWlsLT5ydGFfbGVuID0gKHZvaWQgKikgTkxNU0dfVEFJTChuKSAtICh2b2lkICopIHRhaWw7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBjYnFfcHJpbnRfb3B0KHN0cnVjdCBxZGlzY191dGlsICpxdSwgRklMRSAqZiwgc3RydWN0IHJ0YXR0ciAqb3B0KQoreworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9DQlFfTUFYKzFdOworCXN0cnVjdCB0Y19yYXRlc3BlYyAqciA9IE5VTEw7CisJc3RydWN0IHRjX2NicV9sc3NvcHQgKmxzcyA9IE5VTEw7CisJc3RydWN0IHRjX2NicV93cnJvcHQgKndyciA9IE5VTEw7CisJc3RydWN0IHRjX2NicV9mb3B0ICpmb3B0ID0gTlVMTDsKKwlzdHJ1Y3QgdGNfY2JxX292bCAqb3ZsID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgbGlua2xheWVyOworCVNQUklOVF9CVUYoYjEpOworCVNQUklOVF9CVUYoYjIpOworCisJaWYgKG9wdCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXBhcnNlX3J0YXR0cl9uZXN0ZWQodGIsIFRDQV9DQlFfTUFYLCBvcHQpOworCisJaWYgKHRiW1RDQV9DQlFfUkFURV0pIHsKKwkJaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9DQlFfUkFURV0pIDwgc2l6ZW9mKCpyKSkKKwkJCWZwcmludGYoc3RkZXJyLCAiQ0JROiB0b28gc2hvcnQgcmF0ZSBvcHRcbiIpOworCQllbHNlCisJCQlyID0gUlRBX0RBVEEodGJbVENBX0NCUV9SQVRFXSk7CisJfQorCWlmICh0YltUQ0FfQ0JRX0xTU09QVF0pIHsKKwkJaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9DQlFfTFNTT1BUXSkgPCBzaXplb2YoKmxzcykpCisJCQlmcHJpbnRmKHN0ZGVyciwgIkNCUTogdG9vIHNob3J0IGxzcyBvcHRcbiIpOworCQllbHNlCisJCQlsc3MgPSBSVEFfREFUQSh0YltUQ0FfQ0JRX0xTU09QVF0pOworCX0KKwlpZiAodGJbVENBX0NCUV9XUlJPUFRdKSB7CisJCWlmIChSVEFfUEFZTE9BRCh0YltUQ0FfQ0JRX1dSUk9QVF0pIDwgc2l6ZW9mKCp3cnIpKQorCQkJZnByaW50ZihzdGRlcnIsICJDQlE6IHRvbyBzaG9ydCB3cnIgb3B0XG4iKTsKKwkJZWxzZQorCQkJd3JyID0gUlRBX0RBVEEodGJbVENBX0NCUV9XUlJPUFRdKTsKKwl9CisJaWYgKHRiW1RDQV9DQlFfRk9QVF0pIHsKKwkJaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9DQlFfRk9QVF0pIDwgc2l6ZW9mKCpmb3B0KSkKKwkJCWZwcmludGYoc3RkZXJyLCAiQ0JROiB0b28gc2hvcnQgZm9wdFxuIik7CisJCWVsc2UKKwkJCWZvcHQgPSBSVEFfREFUQSh0YltUQ0FfQ0JRX0ZPUFRdKTsKKwl9CisJaWYgKHRiW1RDQV9DQlFfT1ZMX1NUUkFURUdZXSkgeworCQlpZiAoUlRBX1BBWUxPQUQodGJbVENBX0NCUV9PVkxfU1RSQVRFR1ldKSA8IHNpemVvZigqb3ZsKSkKKwkJCWZwcmludGYoc3RkZXJyLCAiQ0JROiB0b28gc2hvcnQgb3ZlcmxpbWl0IHN0cmF0ZWd5ICV1LyV1XG4iLAorCQkJCSh1bnNpZ25lZCkgUlRBX1BBWUxPQUQodGJbVENBX0NCUV9PVkxfU1RSQVRFR1ldKSwKKwkJCQkodW5zaWduZWQpIHNpemVvZigqb3ZsKSk7CisJCWVsc2UKKwkJCW92bCA9IFJUQV9EQVRBKHRiW1RDQV9DQlFfT1ZMX1NUUkFURUdZXSk7CisJfQorCisJaWYgKHIpIHsKKwkJY2hhciBidWZbNjRdOworCQlwcmludF9yYXRlKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHItPnJhdGUpOworCQlmcHJpbnRmKGYsICJyYXRlICVzICIsIGJ1Zik7CisJCWxpbmtsYXllciA9IChyLT5saW5rbGF5ZXIgJiBUQ19MSU5LTEFZRVJfTUFTSyk7CisJCWlmIChsaW5rbGF5ZXIgPiBUQ19MSU5LTEFZRVJfRVRIRVJORVQgfHwgc2hvd19kZXRhaWxzKQorCQkJZnByaW50ZihmLCAibGlua2xheWVyICVzICIsIHNwcmludF9saW5rbGF5ZXIobGlua2xheWVyLCBiMikpOworCQlpZiAoc2hvd19kZXRhaWxzKSB7CisJCQlmcHJpbnRmKGYsICJjZWxsICV1YiAiLCAxPDxyLT5jZWxsX2xvZyk7CisJCQlpZiAoci0+bXB1KQorCQkJCWZwcmludGYoZiwgIm1wdSAldWIgIiwgci0+bXB1KTsKKwkJCWlmIChyLT5vdmVyaGVhZCkKKwkJCQlmcHJpbnRmKGYsICJvdmVyaGVhZCAldWIgIiwgci0+b3ZlcmhlYWQpOworCQl9CisJfQorCWlmIChsc3MgJiYgbHNzLT5mbGFncykgeworCQlpbnQgY29tbWE9MDsKKwkJZnByaW50ZihmLCAiKCIpOworCQlpZiAobHNzLT5mbGFncyZUQ0ZfQ0JRX0xTU19CT1VOREVEKSB7CisJCQlmcHJpbnRmKGYsICJib3VuZGVkIik7CisJCQljb21tYT0xOworCQl9CisJCWlmIChsc3MtPmZsYWdzJlRDRl9DQlFfTFNTX0lTT0xBVEVEKSB7CisJCQlpZiAoY29tbWEpCisJCQkJZnByaW50ZihmLCAiLCIpOworCQkJZnByaW50ZihmLCAiaXNvbGF0ZWQiKTsKKwkJfQorCQlmcHJpbnRmKGYsICIpICIpOworCX0KKwlpZiAod3JyKSB7CisJCWlmICh3cnItPnByaW9yaXR5ICE9IFRDX0NCUV9NQVhQUklPKQorCQkJZnByaW50ZihmLCAicHJpbyAldSIsIHdyci0+cHJpb3JpdHkpOworCQllbHNlCisJCQlmcHJpbnRmKGYsICJwcmlvIG5vLXRyYW5zbWl0Iik7CisJCWlmIChzaG93X2RldGFpbHMpIHsKKwkJCWNoYXIgYnVmWzY0XTsKKwkJCWZwcmludGYoZiwgIi8ldSAiLCB3cnItPmNwcmlvcml0eSk7CisJCQlpZiAod3JyLT53ZWlnaHQgIT0gMSkgeworCQkJCXByaW50X3JhdGUoYnVmLCBzaXplb2YoYnVmKSwgd3JyLT53ZWlnaHQpOworCQkJCWZwcmludGYoZiwgIndlaWdodCAlcyAiLCBidWYpOworCQkJfQorCQkJaWYgKHdyci0+YWxsb3QpCisJCQkJZnByaW50ZihmLCAiYWxsb3QgJXViICIsIHdyci0+YWxsb3QpOworCQl9CisJfQorCWlmIChsc3MgJiYgc2hvd19kZXRhaWxzKSB7CisJCWZwcmludGYoZiwgIlxubGV2ZWwgJXUgZXdtYSAldSBhdnBrdCAldWIgIiwgbHNzLT5sZXZlbCwgbHNzLT5ld21hX2xvZywgbHNzLT5hdnBrdCk7CisJCWlmIChsc3MtPm1heGlkbGUpIHsKKwkJCWZwcmludGYoZiwgIm1heGlkbGUgJXMgIiwgc3ByaW50X3RpY2tzKGxzcy0+bWF4aWRsZT4+bHNzLT5ld21hX2xvZywgYjEpKTsKKwkJCWlmIChzaG93X3JhdykKKwkJCQlmcHJpbnRmKGYsICJbJTA4eF0gIiwgbHNzLT5tYXhpZGxlKTsKKwkJfQorCQlpZiAobHNzLT5taW5pZGxlIT0weDdmZmZmZmZmKSB7CisJCQlmcHJpbnRmKGYsICJtaW5pZGxlICVzICIsIHNwcmludF90aWNrcyhsc3MtPm1pbmlkbGU+Pmxzcy0+ZXdtYV9sb2csIGIxKSk7CisJCQlpZiAoc2hvd19yYXcpCisJCQkJZnByaW50ZihmLCAiWyUwOHhdICIsIGxzcy0+bWluaWRsZSk7CisJCX0KKwkJaWYgKGxzcy0+b2ZmdGltZSkgeworCQkJZnByaW50ZihmLCAib2ZmdGltZSAlcyAiLCBzcHJpbnRfdGlja3MobHNzLT5vZmZ0aW1lLCBiMSkpOworCQkJaWYgKHNob3dfcmF3KQorCQkJCWZwcmludGYoZiwgIlslMDh4XSAiLCBsc3MtPm9mZnRpbWUpOworCQl9CisJfQorCWlmIChmb3B0ICYmIHNob3dfZGV0YWlscykgeworCQljaGFyIGJ1Zls2NF07CisJCXByaW50X3RjX2NsYXNzaWQoYnVmLCBzaXplb2YoYnVmKSwgZm9wdC0+c3BsaXQpOworCQlmcHJpbnRmKGYsICJcbnNwbGl0ICVzICIsIGJ1Zik7CisJCWlmIChmb3B0LT5kZWZtYXApIHsKKwkJCWZwcmludGYoZiwgImRlZm1hcCAlMDh4IiwgZm9wdC0+ZGVmbWFwKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYnFfcHJpbnRfeHN0YXRzKHN0cnVjdCBxZGlzY191dGlsICpxdSwgRklMRSAqZiwgc3RydWN0IHJ0YXR0ciAqeHN0YXRzKQoreworCXN0cnVjdCB0Y19jYnFfeHN0YXRzICpzdDsKKworCWlmICh4c3RhdHMgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoUlRBX1BBWUxPQUQoeHN0YXRzKSA8IHNpemVvZigqc3QpKQorCQlyZXR1cm4gLTE7CisKKwlzdCA9IFJUQV9EQVRBKHhzdGF0cyk7CisJZnByaW50ZihmLCAiICBib3Jyb3dlZCAldSBvdmVyYWN0aW9ucyAldSBhdmdpZGxlICVnIHVuZGVydGltZSAlZyIsIHN0LT5ib3Jyb3dzLAorCQlzdC0+b3ZlcmFjdGlvbnMsIChkb3VibGUpc3QtPmF2Z2lkbGUsIChkb3VibGUpc3QtPnVuZGVydGltZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBxZGlzY191dGlsIGNicV9xZGlzY191dGlsID0geworCS5pZAkJPSAiY2JxIiwKKwkucGFyc2VfcW9wdAk9IGNicV9wYXJzZV9vcHQsCisJLnByaW50X3FvcHQJPSBjYnFfcHJpbnRfb3B0LAorCS5wcmludF94c3RhdHMJPSBjYnFfcHJpbnRfeHN0YXRzLAorCS5wYXJzZV9jb3B0CT0gY2JxX3BhcnNlX2NsYXNzX29wdCwKKwkucHJpbnRfY29wdAk9IGNicV9wcmludF9vcHQsCit9OwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvcV9jaG9rZS5jIGIvaXByb3V0ZTIvdGMvcV9jaG9rZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOWNlYjgKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy9xX2Nob2tlLmMKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBxX2Nob2tlLmMJCUNIT0tFLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CVN0ZXBoZW4gSGVtbWluZ2VyIDxzaGVtbWluZ2VyQHZ5YXR0YS5jb20+CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAidGNfdXRpbC5oIgorCisjaW5jbHVkZSAidGNfcmVkLmgiCisKK3N0YXRpYyB2b2lkIGV4cGxhaW4odm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAuLi4gY2hva2UgbGltaXQgUEFDS0VUUyBiYW5kd2lkdGggS0JQUyBbZWNuXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgIFsgbWluIFBBQ0tFVFMgXSBbIG1heCBQQUNLRVRTIF0gWyBidXJzdCBQQUNLRVRTIF1cbiIpOworfQorCitzdGF0aWMgaW50IGNob2tlX3BhcnNlX29wdChzdHJ1Y3QgcWRpc2NfdXRpbCAqcXUsIGludCBhcmdjLCBjaGFyICoqYXJndiwKKwkJCSAgIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlzdHJ1Y3QgdGNfcmVkX3FvcHQgb3B0OworCXVuc2lnbmVkIGJ1cnN0ID0gMDsKKwl1bnNpZ25lZCBhdnBrdCA9IDEwMDA7CisJZG91YmxlIHByb2JhYmlsaXR5ID0gMC4wMjsKKwl1bnNpZ25lZCByYXRlID0gMDsKKwlpbnQgZWNuX29rID0gMDsKKwlpbnQgd2xvZzsKKwlfX3U4IHNidWZbMjU2XTsKKwlfX3UzMiBtYXhfUDsKKwlzdHJ1Y3QgcnRhdHRyICp0YWlsOworCisJbWVtc2V0KCZvcHQsIDAsIHNpemVvZihvcHQpKTsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAoc3RyY21wKCphcmd2LCAibGltaXQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91bnNpZ25lZCgmb3B0LmxpbWl0LCAqYXJndiwgMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJsaW1pdFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiYmFuZHdpZHRoIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfcmF0ZSgmcmF0ZSwgKmFyZ3YpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwiYmFuZHdpZHRoXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJlY24iKSA9PSAwKSB7CisJCQllY25fb2sgPSAxOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm1pbiIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3Vuc2lnbmVkKCZvcHQucXRoX21pbiwgKmFyZ3YsIDApKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwibWluXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJtYXgiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91bnNpZ25lZCgmb3B0LnF0aF9tYXgsICphcmd2LCAwKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcIm1heFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiYnVyc3QiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91bnNpZ25lZCgmYnVyc3QsICphcmd2LCAwKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImJ1cnN0XCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJhdnBrdCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3NpemUoJmF2cGt0LCAqYXJndikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJhdnBrdFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAicHJvYmFiaWxpdHkiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHNzY2FuZigqYXJndiwgIiVsZyIsICZwcm9iYWJpbGl0eSkgIT0gMSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcInByb2JhYmlsaXR5XCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJXaGF0IGlzIFwiJXNcIj9cbiIsICphcmd2KTsKKwkJCWV4cGxhaW4oKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisKKwlpZiAoIXJhdGUgfHwgIW9wdC5saW1pdCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlJlcXVpcmVkIHBhcmFtZXRlciAoYmFuZHdpZHRoLCBsaW1pdCkgaXMgbWlzc2luZ1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBDb21wdXRlIGRlZmF1bHQgbWluL21heCB0aHJlc2hvbGRzIGJhc2VkIG9uCisJICAgU2FsbHkgRmxveWQncyByZWNvbW1lbmRhdGlvbnM6CisJICAgaHR0cDovL3d3dy5pY2lyLm9yZy9mbG95ZC9SRURwYXJhbWV0ZXJzLnR4dAorCSovCisJaWYgKCFvcHQucXRoX21heCkKKwkJb3B0LnF0aF9tYXggPSBvcHQubGltaXQgLyA0OworCWlmICghb3B0LnF0aF9taW4pCisJCW9wdC5xdGhfbWluID0gb3B0LnF0aF9tYXggLyAzOworCWlmICghYnVyc3QpCisJCWJ1cnN0ID0gKDIgKiBvcHQucXRoX21pbiArIG9wdC5xdGhfbWF4KSAvIDM7CisKKwlpZiAob3B0LnF0aF9tYXggPiBvcHQubGltaXQpIHsKKwkJZnByaW50ZihzdGRlcnIsICJcIm1heFwiIGlzIGxhcmdlciB0aGFuIFwibGltaXRcIlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAob3B0LnF0aF9taW4gPj0gb3B0LnF0aF9tYXgpIHsKKwkJZnByaW50ZihzdGRlcnIsICJcIm1pblwiIGlzIG5vdCBzbWFsbGVyIHRoYW4gXCJtYXhcIlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwl3bG9nID0gdGNfcmVkX2V2YWxfZXdtYShvcHQucXRoX21pbiphdnBrdCwgYnVyc3QsIGF2cGt0KTsKKwlpZiAod2xvZyA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDSE9LRTogZmFpbGVkIHRvIGNhbGN1bGF0ZSBFV01BIGNvbnN0YW50LlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHdsb2cgPj0gMTApCisJCWZwcmludGYoc3RkZXJyLCAiQ0hPS0U6IFdBUk5JTkcuIEJ1cnN0ICVkIHNlZW1zIHRvIGJlIHRvbyBsYXJnZS5cbiIsIGJ1cnN0KTsKKwlvcHQuV2xvZyA9IHdsb2c7CisKKwl3bG9nID0gdGNfcmVkX2V2YWxfUChvcHQucXRoX21pbiphdnBrdCwgb3B0LnF0aF9tYXgqYXZwa3QsIHByb2JhYmlsaXR5KTsKKwlpZiAod2xvZyA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDSE9LRTogZmFpbGVkIHRvIGNhbGN1bGF0ZSBwcm9iYWJpbGl0eS5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCW9wdC5QbG9nID0gd2xvZzsKKworCXdsb2cgPSB0Y19yZWRfZXZhbF9pZGxlX2RhbXBpbmcob3B0Lldsb2csIGF2cGt0LCByYXRlLCBzYnVmKTsKKwlpZiAod2xvZyA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDSE9LRTogZmFpbGVkIHRvIGNhbGN1bGF0ZSBpZGxlIGRhbXBpbmcgdGFibGUuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlvcHQuU2NlbGxfbG9nID0gd2xvZzsKKwlpZiAoZWNuX29rKQorCQlvcHQuZmxhZ3MgfD0gVENfUkVEX0VDTjsKKworCXRhaWwgPSBOTE1TR19UQUlMKG4pOworCWFkZGF0dHJfbChuLCAxMDI0LCBUQ0FfT1BUSU9OUywgTlVMTCwgMCk7CisJYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9DSE9LRV9QQVJNUywgJm9wdCwgc2l6ZW9mKG9wdCkpOworCWFkZGF0dHJfbChuLCAxMDI0LCBUQ0FfQ0hPS0VfU1RBQiwgc2J1ZiwgMjU2KTsKKwltYXhfUCA9IHByb2JhYmlsaXR5ICogcG93KDIsIDMyKTsKKwlhZGRhdHRyX2wobiwgMTAyNCwgVENBX0NIT0tFX01BWF9QLCAmbWF4X1AsIHNpemVvZihtYXhfUCkpOworCXRhaWwtPnJ0YV9sZW4gPSAodm9pZCAqKSBOTE1TR19UQUlMKG4pIC0gKHZvaWQgKikgdGFpbDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaG9rZV9wcmludF9vcHQoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBGSUxFICpmLCBzdHJ1Y3QgcnRhdHRyICpvcHQpCit7CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX0NIT0tFX01BWCsxXTsKKwljb25zdCBzdHJ1Y3QgdGNfcmVkX3FvcHQgKnFvcHQ7CisJX191MzIgbWF4X1AgPSAwOworCisJaWYgKG9wdCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXBhcnNlX3J0YXR0cl9uZXN0ZWQodGIsIFRDQV9DSE9LRV9NQVgsIG9wdCk7CisKKwlpZiAodGJbVENBX0NIT0tFX1BBUk1TXSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJcW9wdCA9IFJUQV9EQVRBKHRiW1RDQV9DSE9LRV9QQVJNU10pOworCWlmIChSVEFfUEFZTE9BRCh0YltUQ0FfQ0hPS0VfUEFSTVNdKSAgPCBzaXplb2YoKnFvcHQpKQorCQlyZXR1cm4gLTE7CisJaWYgKHRiW1RDQV9DSE9LRV9NQVhfUF0gJiYKKwkgICAgUlRBX1BBWUxPQUQodGJbVENBX0NIT0tFX01BWF9QXSkgPj0gc2l6ZW9mKF9fdTMyKSkKKwkJbWF4X1AgPSBydGFfZ2V0YXR0cl91MzIodGJbVENBX0NIT0tFX01BWF9QXSk7CisKKwlmcHJpbnRmKGYsICJsaW1pdCAldXAgbWluICV1cCBtYXggJXVwICIsCisJCXFvcHQtPmxpbWl0LCBxb3B0LT5xdGhfbWluLCBxb3B0LT5xdGhfbWF4KTsKKworCWlmIChxb3B0LT5mbGFncyAmIFRDX1JFRF9FQ04pCisJCWZwcmludGYoZiwgImVjbiAiKTsKKworCWlmIChzaG93X2RldGFpbHMpIHsKKwkJZnByaW50ZihmLCAiZXdtYSAldSAiLCBxb3B0LT5XbG9nKTsKKwkJaWYgKG1heF9QKQorCQkJZnByaW50ZihmLCAicHJvYmFiaWxpdHkgJWcgIiwgbWF4X1AgLyBwb3coMiwgMzIpKTsKKwkJZWxzZQorCQkJZnByaW50ZihmLCAiUGxvZyAldSAiLCBxb3B0LT5QbG9nKTsKKwkJZnByaW50ZihmLCAiU2NlbGxfbG9nICV1IiwgcW9wdC0+U2NlbGxfbG9nKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hva2VfcHJpbnRfeHN0YXRzKHN0cnVjdCBxZGlzY191dGlsICpxdSwgRklMRSAqZiwKKwkJCSAgICAgIHN0cnVjdCBydGF0dHIgKnhzdGF0cykKK3sKKwlzdHJ1Y3QgdGNfY2hva2VfeHN0YXRzICpzdDsKKworCWlmICh4c3RhdHMgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoUlRBX1BBWUxPQUQoeHN0YXRzKSA8IHNpemVvZigqc3QpKQorCQlyZXR1cm4gLTE7CisKKwlzdCA9IFJUQV9EQVRBKHhzdGF0cyk7CisJZnByaW50ZihmLCAiICBtYXJrZWQgJXUgZWFybHkgJXUgcGRyb3AgJXUgb3RoZXIgJXUgbWF0Y2hlZCAldSIsCisJCXN0LT5tYXJrZWQsIHN0LT5lYXJseSwgc3QtPnBkcm9wLCBzdC0+b3RoZXIsIHN0LT5tYXRjaGVkKTsKKwlyZXR1cm4gMDsKKworfQorCitzdHJ1Y3QgcWRpc2NfdXRpbCBjaG9rZV9xZGlzY191dGlsID0geworCS5pZAkJPSAiY2hva2UiLAorCS5wYXJzZV9xb3B0CT0gY2hva2VfcGFyc2Vfb3B0LAorCS5wcmludF9xb3B0CT0gY2hva2VfcHJpbnRfb3B0LAorCS5wcmludF94c3RhdHMJPSBjaG9rZV9wcmludF94c3RhdHMsCit9OwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvcV9jbHNhY3QuYyBiL2lwcm91dGUyL3RjL3FfY2xzYWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMwNWRiZAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL3FfY2xzYWN0LmMKQEAgLTAsMCArMSwzNCBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInRjX3V0aWwuaCIKKworc3RhdGljIHZvaWQgZXhwbGFpbih2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IC4uLiBjbHNhY3RcbiIpOworfQorCitzdGF0aWMgaW50IGNsc2FjdF9wYXJzZV9vcHQoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCisJCQkgICAgc3RydWN0IG5sbXNnaGRyICpuKQoreworCWlmIChhcmdjID4gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIldoYXQgaXMgXCIlc1wiP1xuIiwgKmFyZ3YpOworCQlleHBsYWluKCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlhZGRhdHRyX2wobiwgMTAyNCwgVENBX09QVElPTlMsIE5VTEwsIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNsc2FjdF9wcmludF9vcHQoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBGSUxFICpmLCBzdHJ1Y3QgcnRhdHRyICpvcHQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBxZGlzY191dGlsIGNsc2FjdF9xZGlzY191dGlsID0geworCS5pZAkJPSAiY2xzYWN0IiwKKwkucGFyc2VfcW9wdAk9IGNsc2FjdF9wYXJzZV9vcHQsCisJLnByaW50X3FvcHQJPSBjbHNhY3RfcHJpbnRfb3B0LAorfTsKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RjL3FfY29kZWwuYyBiL2lwcm91dGUyL3RjL3FfY29kZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjQyNDZjCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGMvcV9jb2RlbC5jCkBAIC0wLDAgKzEsMjExIEBACisvKgorICogQ29kZWwgLSBUaGUgQ29udHJvbGxlZC1EZWxheSBBY3RpdmUgUXVldWUgTWFuYWdlbWVudCBhbGdvcml0aG0KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgS2F0aGxlZW4gTmljaG9scyA8bmljaG9sc0Bwb2xsZXJlLmNvbT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBWYW4gSmFjb2Jzb24gPHZhbkBwb2xsZXJlLmNvbT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMTIgTWljaGFlbCBELiBUYWh0IDxkYXZlLnRhaHRAYnVmZmVyYmxvYXQubmV0PgorICogIENvcHlyaWdodCAoQykgMjAxMiwyMDE1IEVyaWMgRHVtYXpldCA8ZWR1bWF6ZXRAZ29vZ2xlLmNvbT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYXV0aG9ycyBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIGlzIHJldGFpbmVkIGluIGZ1bGwsIHRoaXMKKyAqIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUKKyAqIEdQTCBhcHBseSBJTlNURUFEIE9GIHRob3NlIGdpdmVuIGFib3ZlLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInRjX3V0aWwuaCIKKworc3RhdGljIHZvaWQgZXhwbGFpbih2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IC4uLiBjb2RlbCBbIGxpbWl0IFBBQ0tFVFMgXSBbIHRhcmdldCBUSU1FXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgIFsgaW50ZXJ2YWwgVElNRSBdIFsgZWNuIHwgbm9lY24gXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgIFsgY2VfdGhyZXNob2xkIFRJTUUgXVxuIik7Cit9CisKK3N0YXRpYyBpbnQgY29kZWxfcGFyc2Vfb3B0KHN0cnVjdCBxZGlzY191dGlsICpxdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCQkJICAgc3RydWN0IG5sbXNnaGRyICpuKQoreworCXVuc2lnbmVkIGxpbWl0ID0gMDsKKwl1bnNpZ25lZCB0YXJnZXQgPSAwOworCXVuc2lnbmVkIGludGVydmFsID0gMDsKKwl1bnNpZ25lZCBjZV90aHJlc2hvbGQgPSB+MFU7CisJaW50IGVjbiA9IC0xOworCXN0cnVjdCBydGF0dHIgKnRhaWw7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgImxpbWl0IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdW5zaWduZWQoJmxpbWl0LCAqYXJndiwgMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJsaW1pdFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAidGFyZ2V0IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdGltZSgmdGFyZ2V0LCAqYXJndikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJ0YXJnZXRcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImNlX3RocmVzaG9sZCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3RpbWUoJmNlX3RocmVzaG9sZCwgKmFyZ3YpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwiY2VfdGhyZXNob2xkXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJpbnRlcnZhbCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3RpbWUoJmludGVydmFsLCAqYXJndikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJpbnRlcnZhbFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZWNuIikgPT0gMCkgeworCQkJZWNuID0gMTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJub2VjbiIpID09IDApIHsKKwkJCWVjbiA9IDA7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaGVscCIpID09IDApIHsKKwkJCWV4cGxhaW4oKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiV2hhdCBpcyBcIiVzXCI/XG4iLCAqYXJndik7CisJCQlleHBsYWluKCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJdGFpbCA9IE5MTVNHX1RBSUwobik7CisJYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9PUFRJT05TLCBOVUxMLCAwKTsKKwlpZiAobGltaXQpCisJCWFkZGF0dHJfbChuLCAxMDI0LCBUQ0FfQ09ERUxfTElNSVQsICZsaW1pdCwgc2l6ZW9mKGxpbWl0KSk7CisJaWYgKGludGVydmFsKQorCQlhZGRhdHRyX2wobiwgMTAyNCwgVENBX0NPREVMX0lOVEVSVkFMLCAmaW50ZXJ2YWwsIHNpemVvZihpbnRlcnZhbCkpOworCWlmICh0YXJnZXQpCisJCWFkZGF0dHJfbChuLCAxMDI0LCBUQ0FfQ09ERUxfVEFSR0VULCAmdGFyZ2V0LCBzaXplb2YodGFyZ2V0KSk7CisJaWYgKGVjbiAhPSAtMSkKKwkJYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9DT0RFTF9FQ04sICZlY24sIHNpemVvZihlY24pKTsKKwlpZiAoY2VfdGhyZXNob2xkICE9IH4wVSkKKwkJYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9DT0RFTF9DRV9USFJFU0hPTEQsCisJCQkgICZjZV90aHJlc2hvbGQsIHNpemVvZihjZV90aHJlc2hvbGQpKTsKKworCXRhaWwtPnJ0YV9sZW4gPSAodm9pZCAqKSBOTE1TR19UQUlMKG4pIC0gKHZvaWQgKikgdGFpbDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb2RlbF9wcmludF9vcHQoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBGSUxFICpmLCBzdHJ1Y3QgcnRhdHRyICpvcHQpCit7CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX0NPREVMX01BWCArIDFdOworCXVuc2lnbmVkIGxpbWl0OworCXVuc2lnbmVkIGludGVydmFsOworCXVuc2lnbmVkIHRhcmdldDsKKwl1bnNpZ25lZCBlY247CisJdW5zaWduZWQgY2VfdGhyZXNob2xkOworCVNQUklOVF9CVUYoYjEpOworCisJaWYgKG9wdCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXBhcnNlX3J0YXR0cl9uZXN0ZWQodGIsIFRDQV9DT0RFTF9NQVgsIG9wdCk7CisKKwlpZiAodGJbVENBX0NPREVMX0xJTUlUXSAmJgorCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfQ09ERUxfTElNSVRdKSA+PSBzaXplb2YoX191MzIpKSB7CisJCWxpbWl0ID0gcnRhX2dldGF0dHJfdTMyKHRiW1RDQV9DT0RFTF9MSU1JVF0pOworCQlmcHJpbnRmKGYsICJsaW1pdCAldXAgIiwgbGltaXQpOworCX0KKwlpZiAodGJbVENBX0NPREVMX1RBUkdFVF0gJiYKKwkgICAgUlRBX1BBWUxPQUQodGJbVENBX0NPREVMX1RBUkdFVF0pID49IHNpemVvZihfX3UzMikpIHsKKwkJdGFyZ2V0ID0gcnRhX2dldGF0dHJfdTMyKHRiW1RDQV9DT0RFTF9UQVJHRVRdKTsKKwkJZnByaW50ZihmLCAidGFyZ2V0ICVzICIsIHNwcmludF90aW1lKHRhcmdldCwgYjEpKTsKKwl9CisJaWYgKHRiW1RDQV9DT0RFTF9DRV9USFJFU0hPTERdICYmCisJICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9DT0RFTF9DRV9USFJFU0hPTERdKSA+PSBzaXplb2YoX191MzIpKSB7CisJCWNlX3RocmVzaG9sZCA9IHJ0YV9nZXRhdHRyX3UzMih0YltUQ0FfQ09ERUxfQ0VfVEhSRVNIT0xEXSk7CisJCWZwcmludGYoZiwgImNlX3RocmVzaG9sZCAlcyAiLCBzcHJpbnRfdGltZShjZV90aHJlc2hvbGQsIGIxKSk7CisJfQorCWlmICh0YltUQ0FfQ09ERUxfSU5URVJWQUxdICYmCisJICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9DT0RFTF9JTlRFUlZBTF0pID49IHNpemVvZihfX3UzMikpIHsKKwkJaW50ZXJ2YWwgPSBydGFfZ2V0YXR0cl91MzIodGJbVENBX0NPREVMX0lOVEVSVkFMXSk7CisJCWZwcmludGYoZiwgImludGVydmFsICVzICIsIHNwcmludF90aW1lKGludGVydmFsLCBiMSkpOworCX0KKwlpZiAodGJbVENBX0NPREVMX0VDTl0gJiYKKwkgICAgUlRBX1BBWUxPQUQodGJbVENBX0NPREVMX0VDTl0pID49IHNpemVvZihfX3UzMikpIHsKKwkJZWNuID0gcnRhX2dldGF0dHJfdTMyKHRiW1RDQV9DT0RFTF9FQ05dKTsKKwkJaWYgKGVjbikKKwkJCWZwcmludGYoZiwgImVjbiAiKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb2RlbF9wcmludF94c3RhdHMoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBGSUxFICpmLAorCQkJICAgICAgc3RydWN0IHJ0YXR0ciAqeHN0YXRzKQoreworCXN0cnVjdCB0Y19jb2RlbF94c3RhdHMgX3N0LCAqc3Q7CisJU1BSSU5UX0JVRihiMSk7CisKKwlpZiAoeHN0YXRzID09IE5VTEwpCisJCXJldHVybiAwOworCisJc3QgPSBSVEFfREFUQSh4c3RhdHMpOworCWlmIChSVEFfUEFZTE9BRCh4c3RhdHMpIDwgc2l6ZW9mKCpzdCkpIHsKKwkJbWVtc2V0KCZfc3QsIDAsIHNpemVvZihfc3QpKTsKKwkJbWVtY3B5KCZfc3QsIHN0LCBSVEFfUEFZTE9BRCh4c3RhdHMpKTsKKwkJc3QgPSAmX3N0OworCX0KKworCWZwcmludGYoZiwgIiAgY291bnQgJXUgbGFzdGNvdW50ICV1IGxkZWxheSAlcyIsCisJCXN0LT5jb3VudCwgc3QtPmxhc3Rjb3VudCwgc3ByaW50X3RpbWUoc3QtPmxkZWxheSwgYjEpKTsKKwlpZiAoc3QtPmRyb3BwaW5nKQorCQlmcHJpbnRmKGYsICIgZHJvcHBpbmciKTsKKwlpZiAoc3QtPmRyb3BfbmV4dCA8IDApCisJCWZwcmludGYoZiwgIiBkcm9wX25leHQgLSVzIiwgc3ByaW50X3RpbWUoLXN0LT5kcm9wX25leHQsIGIxKSk7CisJZWxzZQorCQlmcHJpbnRmKGYsICIgZHJvcF9uZXh0ICVzIiwgc3ByaW50X3RpbWUoc3QtPmRyb3BfbmV4dCwgYjEpKTsKKwlmcHJpbnRmKGYsICJcbiAgbWF4cGFja2V0ICV1IGVjbl9tYXJrICV1IGRyb3Bfb3ZlcmxpbWl0ICV1IiwKKwkJc3QtPm1heHBhY2tldCwgc3QtPmVjbl9tYXJrLCBzdC0+ZHJvcF9vdmVybGltaXQpOworCWlmIChzdC0+Y2VfbWFyaykKKwkJZnByaW50ZihmLCAiIGNlX21hcmsgJXUiLCBzdC0+Y2VfbWFyayk7CisJcmV0dXJuIDA7CisKK30KKworc3RydWN0IHFkaXNjX3V0aWwgY29kZWxfcWRpc2NfdXRpbCA9IHsKKwkuaWQJCT0gImNvZGVsIiwKKwkucGFyc2VfcW9wdAk9IGNvZGVsX3BhcnNlX29wdCwKKwkucHJpbnRfcW9wdAk9IGNvZGVsX3ByaW50X29wdCwKKwkucHJpbnRfeHN0YXRzCT0gY29kZWxfcHJpbnRfeHN0YXRzLAorfTsKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RjL3FfZHJyLmMgYi9pcHJvdXRlMi90Yy9xX2Ryci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NjczNmQKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy9xX2Ryci5jCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogcV9kcnIuYwkJRFJSLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CVBhdHJpY2sgTWNIYXJkeSA8a2FiZXJAdHJhc2gubmV0PgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInRjX3V0aWwuaCIKKworc3RhdGljIHZvaWQgZXhwbGFpbih2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IC4uLiBkcnJcbiIpOworfQorCitzdGF0aWMgdm9pZCBleHBsYWluMih2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IC4uLiBkcnIgcXVhbnR1bSBTSVpFXG4iKTsKK30KKworCitzdGF0aWMgaW50IGRycl9wYXJzZV9vcHQoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwl3aGlsZSAoYXJnYykgeworCQlpZiAoc3RyY21wKCphcmd2LCAiaGVscCIpID09IDApIHsKKwkJCWV4cGxhaW4oKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiV2hhdCBpcyBcIiVzXCI/XG4iLCAqYXJndik7CisJCQlleHBsYWluKCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHJyX3BhcnNlX2NsYXNzX29wdChzdHJ1Y3QgcWRpc2NfdXRpbCAqcXUsIGludCBhcmdjLCBjaGFyICoqYXJndiwKKwkJCSAgICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJc3RydWN0IHJ0YXR0ciAqdGFpbDsKKwlfX3UzMiB0bXA7CisKKwl0YWlsID0gTkxNU0dfVEFJTChuKTsKKwlhZGRhdHRyX2wobiwgMTAyNCwgVENBX09QVElPTlMsIE5VTEwsIDApOworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChzdHJjbXAoKmFyZ3YsICJxdWFudHVtIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfc2l6ZSgmdG1wLCAqYXJndikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJxdWFudHVtXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWFkZGF0dHJfbChuLCAxMDI0LCBUQ0FfRFJSX1FVQU5UVU0sICZ0bXAsIHNpemVvZih0bXApKTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJZXhwbGFpbjIoKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiV2hhdCBpcyBcIiVzXCI/XG4iLCAqYXJndik7CisJCQlleHBsYWluMigpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCXRhaWwtPnJ0YV9sZW4gPSAodm9pZCAqKSBOTE1TR19UQUlMKG4pIC0gKHZvaWQgKil0YWlsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRycl9wcmludF9vcHQoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBGSUxFICpmLCBzdHJ1Y3QgcnRhdHRyICpvcHQpCit7CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX0RSUl9NQVggKyAxXTsKKwlTUFJJTlRfQlVGKGIxKTsKKworCWlmIChvcHQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlwYXJzZV9ydGF0dHJfbmVzdGVkKHRiLCBUQ0FfRFJSX01BWCwgb3B0KTsKKworCWlmICh0YltUQ0FfRFJSX1FVQU5UVU1dKQorCQlmcHJpbnRmKGYsICJxdWFudHVtICVzICIsCisJCQlzcHJpbnRfc2l6ZShydGFfZ2V0YXR0cl91MzIodGJbVENBX0RSUl9RVUFOVFVNXSksIGIxKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHJyX3ByaW50X3hzdGF0cyhzdHJ1Y3QgcWRpc2NfdXRpbCAqcXUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKnhzdGF0cykKK3sKKwlzdHJ1Y3QgdGNfZHJyX3N0YXRzICp4OworCVNQUklOVF9CVUYoYjEpOworCisJaWYgKHhzdGF0cyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlpZiAoUlRBX1BBWUxPQUQoeHN0YXRzKSA8IHNpemVvZigqeCkpCisJCXJldHVybiAtMTsKKwl4ID0gUlRBX0RBVEEoeHN0YXRzKTsKKworCWZwcmludGYoZiwgIiBkZWZpY2l0ICVzICIsIHNwcmludF9zaXplKHgtPmRlZmljaXQsIGIxKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBxZGlzY191dGlsIGRycl9xZGlzY191dGlsID0geworCS5pZAkJPSAiZHJyIiwKKwkucGFyc2VfcW9wdAk9IGRycl9wYXJzZV9vcHQsCisJLnByaW50X3FvcHQJPSBkcnJfcHJpbnRfb3B0LAorCS5wcmludF94c3RhdHMJPSBkcnJfcHJpbnRfeHN0YXRzLAorCS5wYXJzZV9jb3B0CT0gZHJyX3BhcnNlX2NsYXNzX29wdCwKKwkucHJpbnRfY29wdAk9IGRycl9wcmludF9vcHQsCit9OwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvcV9kc21hcmsuYyBiL2lwcm91dGUyL3RjL3FfZHNtYXJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUxODVjMAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL3FfZHNtYXJrLmMKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBxX2RzbWFyay5jCQlEaWZmZXJlbnRpYXRlZCBTZXJ2aWNlcyBmaWVsZCBtYXJraW5nLgorICoKKyAqIEhhY2tlZCAxOTk4LDE5OTkgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMIElDQQorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInRjX3V0aWwuaCIKKworCitzdGF0aWMgdm9pZCBleHBsYWluKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsIlVzYWdlOiBkc21hcmsgaW5kaWNlcyBJTkRJQ0VTIFsgZGVmYXVsdF9pbmRleCAiCisJICAgICJERUZBVUxUX0lOREVYIF0gWyBzZXRfdGNfaW5kZXggXVxuIik7Cit9CisKKworc3RhdGljIGludCBkc21hcmtfcGFyc2Vfb3B0KHN0cnVjdCBxZGlzY191dGlsICpxdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorICAgIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlzdHJ1Y3QgcnRhdHRyICp0YWlsOworCV9fdTE2IGluZDsKKwljaGFyICplbmQ7CisJaW50IGRmbHQsc2V0X3RjX2luZGV4OworCisJaW5kID0gc2V0X3RjX2luZGV4ID0gMDsKKwlkZmx0ID0gLTE7CisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmICghc3RyY21wKCphcmd2LCJpbmRpY2VzIikpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpbmQgPSBzdHJ0b3VsKCphcmd2LCZlbmQsMCk7CisJCQlpZiAoKmVuZCkgeworCQkJCWV4cGxhaW4oKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwiZGVmYXVsdF9pbmRleCIpIHx8ICFzdHJjbXAoKmFyZ3YsCisJCSAgICAiZGVmYXVsdCIpKSB7CisJCQlORVhUX0FSRygpOworCQkJZGZsdCA9IHN0cnRvdWwoKmFyZ3YsJmVuZCwwKTsKKwkJCWlmICgqZW5kKSB7CisJCQkJZXhwbGFpbigpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICghc3RyY21wKCphcmd2LCJzZXRfdGNfaW5kZXgiKSkgeworCQkJc2V0X3RjX2luZGV4ID0gMTsKKwkJfQorCQllbHNlIHsKKwkJCWV4cGxhaW4oKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlhcmdjLS07CisJCWFyZ3YrKzsKKwl9CisJaWYgKCFpbmQpIHsKKwkJZXhwbGFpbigpOworCQlyZXR1cm4gLTE7CisJfQorCXRhaWwgPSBOTE1TR19UQUlMKG4pOworCWFkZGF0dHJfbChuLDEwMjQsVENBX09QVElPTlMsTlVMTCwwKTsKKwlhZGRhdHRyX2wobiwxMDI0LFRDQV9EU01BUktfSU5ESUNFUywmaW5kLHNpemVvZihpbmQpKTsKKwlpZiAoZGZsdCAhPSAtMSkgeworCSAgICBfX3UxNiB0bXAgPSBkZmx0OworCisJICAgIGFkZGF0dHJfbChuLDEwMjQsVENBX0RTTUFSS19ERUZBVUxUX0lOREVYLCZ0bXAsc2l6ZW9mKHRtcCkpOworCX0KKwlpZiAoc2V0X3RjX2luZGV4KSBhZGRhdHRyX2wobiwxMDI0LFRDQV9EU01BUktfU0VUX1RDX0lOREVYLE5VTEwsMCk7CisJdGFpbC0+cnRhX2xlbiA9ICh2b2lkICopIE5MTVNHX1RBSUwobikgLSAodm9pZCAqKSB0YWlsOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGV4cGxhaW5fY2xhc3Modm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAuLi4gZHNtYXJrIFsgbWFzayBNQVNLIF0gWyB2YWx1ZSBWQUxVRSBdXG4iKTsKK30KKworCitzdGF0aWMgaW50IGRzbWFya19wYXJzZV9jbGFzc19vcHQoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCisgICBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJc3RydWN0IHJ0YXR0ciAqdGFpbDsKKwlfX3U4IHRtcDsKKwljaGFyICplbmQ7CisKKwl0YWlsID0gTkxNU0dfVEFJTChuKTsKKwlhZGRhdHRyX2wobiwxMDI0LFRDQV9PUFRJT05TLE5VTEwsMCk7CisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmICghc3RyY21wKCphcmd2LCJtYXNrIikpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQl0bXAgPSBzdHJ0b3VsKCphcmd2LCZlbmQsMCk7CisJCQlpZiAoKmVuZCkgeworCQkJCWV4cGxhaW5fY2xhc3MoKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlhZGRhdHRyX2wobiwxMDI0LFRDQV9EU01BUktfTUFTSywmdG1wLDEpOworCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3YsInZhbHVlIikpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQl0bXAgPSBzdHJ0b3VsKCphcmd2LCZlbmQsMCk7CisJCQlpZiAoKmVuZCkgeworCQkJCWV4cGxhaW5fY2xhc3MoKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlhZGRhdHRyX2wobiwxMDI0LFRDQV9EU01BUktfVkFMVUUsJnRtcCwxKTsKKwkJfQorCQllbHNlIHsKKwkJCWV4cGxhaW5fY2xhc3MoKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlhcmdjLS07CisJCWFyZ3YrKzsKKwl9CisJdGFpbC0+cnRhX2xlbiA9ICh2b2lkICopIE5MTVNHX1RBSUwobikgLSAodm9pZCAqKSB0YWlsOworCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCBkc21hcmtfcHJpbnRfb3B0KHN0cnVjdCBxZGlzY191dGlsICpxdSwgRklMRSAqZiwgc3RydWN0IHJ0YXR0ciAqb3B0KQoreworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9EU01BUktfTUFYKzFdOworCisJaWYgKCFvcHQpIHJldHVybiAwOworCW1lbXNldCh0YiwgMCwgc2l6ZW9mKHRiKSk7CisJcGFyc2VfcnRhdHRyKHRiLCBUQ0FfRFNNQVJLX01BWCwgUlRBX0RBVEEob3B0KSwgUlRBX1BBWUxPQUQob3B0KSk7CisJaWYgKHRiW1RDQV9EU01BUktfTUFTS10pIHsKKwkJaWYgKCFSVEFfUEFZTE9BRCh0YltUQ0FfRFNNQVJLX01BU0tdKSkKKwkJCWZwcmludGYoc3RkZXJyLCJkc21hcms6IGVtcHR5IG1hc2tcbiIpOworCQllbHNlIGZwcmludGYoZiwibWFzayAweCUwMnggIiwKKwkJCSAgICBydGFfZ2V0YXR0cl91OCh0YltUQ0FfRFNNQVJLX01BU0tdKSk7CisJfQorCWlmICh0YltUQ0FfRFNNQVJLX1ZBTFVFXSkgeworCQlpZiAoIVJUQV9QQVlMT0FEKHRiW1RDQV9EU01BUktfVkFMVUVdKSkKKwkJCWZwcmludGYoc3RkZXJyLCJkc21hcms6IGVtcHR5IHZhbHVlXG4iKTsKKwkJZWxzZSBmcHJpbnRmKGYsInZhbHVlIDB4JTAyeCAiLAorCQkJICAgIHJ0YV9nZXRhdHRyX3U4KHRiW1RDQV9EU01BUktfVkFMVUVdKSk7CisJfQorCWlmICh0YltUQ0FfRFNNQVJLX0lORElDRVNdKSB7CisJCWlmIChSVEFfUEFZTE9BRCh0YltUQ0FfRFNNQVJLX0lORElDRVNdKSA8IHNpemVvZihfX3UxNikpCisJCQlmcHJpbnRmKHN0ZGVyciwiZHNtYXJrOiBpbmRpY2VzIHRvbyBzaG9ydFxuIik7CisJCWVsc2UgZnByaW50ZihmLCJpbmRpY2VzIDB4JTA0eCAiLAorCQkJICAgIHJ0YV9nZXRhdHRyX3UxNih0YltUQ0FfRFNNQVJLX0lORElDRVNdKSk7CisJfQorCWlmICh0YltUQ0FfRFNNQVJLX0RFRkFVTFRfSU5ERVhdKSB7CisJCWlmIChSVEFfUEFZTE9BRCh0YltUQ0FfRFNNQVJLX0RFRkFVTFRfSU5ERVhdKSA8IHNpemVvZihfX3UxNikpCisJCQlmcHJpbnRmKHN0ZGVyciwiZHNtYXJrOiBkZWZhdWx0X2luZGV4IHRvbyBzaG9ydFxuIik7CisJCWVsc2UgZnByaW50ZihmLCJkZWZhdWx0X2luZGV4IDB4JTA0eCAiLAorCQkJICAgIHJ0YV9nZXRhdHRyX3UxNih0YltUQ0FfRFNNQVJLX0RFRkFVTFRfSU5ERVhdKSk7CisJfQorCWlmICh0YltUQ0FfRFNNQVJLX1NFVF9UQ19JTkRFWF0pIGZwcmludGYoZiwic2V0X3RjX2luZGV4ICIpOworCXJldHVybiAwOworfQorCisKK3N0cnVjdCBxZGlzY191dGlsIGRzbWFya19xZGlzY191dGlsID0geworCS5pZAkJPSAiZHNtYXJrIiwKKwkucGFyc2VfcW9wdAk9IGRzbWFya19wYXJzZV9vcHQsCisJLnByaW50X3FvcHQJPSBkc21hcmtfcHJpbnRfb3B0LAorCS5wYXJzZV9jb3B0CT0gZHNtYXJrX3BhcnNlX2NsYXNzX29wdCwKKwkucHJpbnRfY29wdAk9IGRzbWFya19wcmludF9vcHQsCit9OwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvcV9maWZvLmMgYi9pcHJvdXRlMi90Yy9xX2ZpZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWFiMTIzCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGMvcV9maWZvLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBxX2ZpZm8uYwkJRklGTy4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAidGNfdXRpbC5oIgorCitzdGF0aWMgdm9pZCBleHBsYWluKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogLi4uIDxbcHxiXWZpZm8gfCBwZmlmb19oZWFkX2Ryb3A+IFsgbGltaXQgTlVNQkVSIF1cbiIpOworfQorCitzdGF0aWMgaW50IGZpZm9fcGFyc2Vfb3B0KHN0cnVjdCBxZGlzY191dGlsICpxdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJaW50IG9rPTA7CisJc3RydWN0IHRjX2ZpZm9fcW9wdCBvcHQ7CisJbWVtc2V0KCZvcHQsIDAsIHNpemVvZihvcHQpKTsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAoc3RyY21wKCphcmd2LCAibGltaXQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9zaXplKCZvcHQubGltaXQsICphcmd2KSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiJXM6IElsbGVnYWwgdmFsdWUgZm9yIFwibGltaXRcIjogXCIlc1wiXG4iLCBxdS0+aWQsICphcmd2KTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlvaysrOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImhlbHAiKSA9PSAwKSB7CisJCQlleHBsYWluKCk7CisJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiB1bmtub3duIHBhcmFtZXRlciBcIiVzXCJcbiIsIHF1LT5pZCwgKmFyZ3YpOworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCWlmIChvaykKKwkJYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9PUFRJT05TLCAmb3B0LCBzaXplb2Yob3B0KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlmb19wcmludF9vcHQoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBGSUxFICpmLCBzdHJ1Y3QgcnRhdHRyICpvcHQpCit7CisJc3RydWN0IHRjX2ZpZm9fcW9wdCAqcW9wdDsKKworCWlmIChvcHQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoUlRBX1BBWUxPQUQob3B0KSAgPCBzaXplb2YoKnFvcHQpKQorCQlyZXR1cm4gLTE7CisJcW9wdCA9IFJUQV9EQVRBKG9wdCk7CisJaWYgKHN0cmNtcChxdS0+aWQsICJiZmlmbyIpID09IDApIHsKKwkJU1BSSU5UX0JVRihiMSk7CisJCWZwcmludGYoZiwgImxpbWl0ICVzIiwgc3ByaW50X3NpemUocW9wdC0+bGltaXQsIGIxKSk7CisJfSBlbHNlCisJCWZwcmludGYoZiwgImxpbWl0ICV1cCIsIHFvcHQtPmxpbWl0KTsKKwlyZXR1cm4gMDsKK30KKworCitzdHJ1Y3QgcWRpc2NfdXRpbCBiZmlmb19xZGlzY191dGlsID0geworCS5pZCA9ICJiZmlmbyIsCisJLnBhcnNlX3FvcHQgPSBmaWZvX3BhcnNlX29wdCwKKwkucHJpbnRfcW9wdCA9IGZpZm9fcHJpbnRfb3B0LAorfTsKKworc3RydWN0IHFkaXNjX3V0aWwgcGZpZm9fcWRpc2NfdXRpbCA9IHsKKwkuaWQgPSAicGZpZm8iLAorCS5wYXJzZV9xb3B0ID0gZmlmb19wYXJzZV9vcHQsCisJLnByaW50X3FvcHQgPSBmaWZvX3ByaW50X29wdCwKK307CisKK3N0cnVjdCBxZGlzY191dGlsIHBmaWZvX2hlYWRfZHJvcF9xZGlzY191dGlsID0geworCS5pZCA9ICJwZmlmb19oZWFkX2Ryb3AiLAorCS5wYXJzZV9xb3B0ID0gZmlmb19wYXJzZV9vcHQsCisJLnByaW50X3FvcHQgPSBmaWZvX3ByaW50X29wdCwKK307CisKK2V4dGVybiBpbnQgcHJpb19wcmludF9vcHQoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBGSUxFICpmLCBzdHJ1Y3QgcnRhdHRyICpvcHQpOworc3RydWN0IHFkaXNjX3V0aWwgcGZpZm9fZmFzdF9xZGlzY191dGlsID0geworCS5pZCA9ICJwZmlmb19mYXN0IiwKKwkucHJpbnRfcW9wdCA9IHByaW9fcHJpbnRfb3B0LAorfTsKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RjL3FfZnEuYyBiL2lwcm91dGUyL3RjL3FfZnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTM3MGIzCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGMvcV9mcS5jCkBAIC0wLDAgKzEsMzI5IEBACisvKgorICogRmFpciBRdWV1ZQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNSBFcmljIER1bWF6ZXQgPGVkdW1hemV0QGdvb2dsZS5jb20+CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGF1dGhvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSBpcyByZXRhaW5lZCBpbiBmdWxsLCB0aGlzCisgKiBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlCisgKiBHUEwgYXBwbHkgSU5TVEVBRCBPRiB0aG9zZSBnaXZlbiBhYm92ZS4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAidGNfdXRpbC5oIgorCitzdGF0aWMgdm9pZCBleHBsYWluKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogLi4uIGZxIFsgbGltaXQgUEFDS0VUUyBdIFsgZmxvd19saW1pdCBQQUNLRVRTIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICBbIHF1YW50dW0gQllURVMgXSBbIGluaXRpYWxfcXVhbnR1bSBCWVRFUyBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgWyBtYXhyYXRlIFJBVEUgIF0gWyBidWNrZXRzIE5VTUJFUiBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgWyBbbm9dcGFjaW5nIF0gWyByZWZpbGxfZGVsYXkgVElNRSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgWyBvcnBoYW5fbWFzayBNQVNLXVxuIik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaWxvZzIodW5zaWduZWQgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgcmVzID0gMDsKKworCXZhbC0tOworCXdoaWxlICh2YWwpIHsKKwkJcmVzKys7CisJCXZhbCA+Pj0gMTsKKwl9CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBmcV9wYXJzZV9vcHQoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCisJCQlzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJdW5zaWduZWQgaW50IHBsaW1pdDsKKwl1bnNpZ25lZCBpbnQgZmxvd19wbGltaXQ7CisJdW5zaWduZWQgaW50IHF1YW50dW07CisJdW5zaWduZWQgaW50IGluaXRpYWxfcXVhbnR1bTsKKwl1bnNpZ25lZCBpbnQgYnVja2V0cyA9IDA7CisJdW5zaWduZWQgaW50IG1heHJhdGU7CisJdW5zaWduZWQgaW50IGRlZnJhdGU7CisJdW5zaWduZWQgaW50IHJlZmlsbF9kZWxheTsKKwl1bnNpZ25lZCBpbnQgb3JwaGFuX21hc2s7CisJYm9vbCBzZXRfcGxpbWl0ID0gZmFsc2U7CisJYm9vbCBzZXRfZmxvd19wbGltaXQgPSBmYWxzZTsKKwlib29sIHNldF9xdWFudHVtID0gZmFsc2U7CisJYm9vbCBzZXRfaW5pdGlhbF9xdWFudHVtID0gZmFsc2U7CisJYm9vbCBzZXRfbWF4cmF0ZSA9IGZhbHNlOworCWJvb2wgc2V0X2RlZnJhdGUgPSBmYWxzZTsKKwlib29sIHNldF9yZWZpbGxfZGVsYXkgPSBmYWxzZTsKKwlib29sIHNldF9vcnBoYW5fbWFzayA9IGZhbHNlOworCWludCBwYWNpbmcgPSAtMTsKKwlzdHJ1Y3QgcnRhdHRyICp0YWlsOworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChzdHJjbXAoKmFyZ3YsICJsaW1pdCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3Vuc2lnbmVkKCZwbGltaXQsICphcmd2LCAwKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImxpbWl0XCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXNldF9wbGltaXQgPSB0cnVlOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImZsb3dfbGltaXQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91bnNpZ25lZCgmZmxvd19wbGltaXQsICphcmd2LCAwKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImZsb3dfbGltaXRcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJc2V0X2Zsb3dfcGxpbWl0ID0gdHJ1ZTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJidWNrZXRzIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdW5zaWduZWQoJmJ1Y2tldHMsICphcmd2LCAwKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImJ1Y2tldHNcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm1heHJhdGUiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9yYXRlKCZtYXhyYXRlLCAqYXJndikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJtYXhyYXRlXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXNldF9tYXhyYXRlID0gdHJ1ZTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJkZWZyYXRlIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfcmF0ZSgmZGVmcmF0ZSwgKmFyZ3YpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwiZGVmcmF0ZVwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlzZXRfZGVmcmF0ZSA9IHRydWU7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAicXVhbnR1bSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3Vuc2lnbmVkKCZxdWFudHVtLCAqYXJndiwgMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJxdWFudHVtXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXNldF9xdWFudHVtID0gdHJ1ZTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJpbml0aWFsX3F1YW50dW0iKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91bnNpZ25lZCgmaW5pdGlhbF9xdWFudHVtLCAqYXJndiwgMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJpbml0aWFsX3F1YW50dW1cIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJc2V0X2luaXRpYWxfcXVhbnR1bSA9IHRydWU7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAib3JwaGFuX21hc2siKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91bnNpZ25lZCgmb3JwaGFuX21hc2ssICphcmd2LCAwKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImluaXRpYWxfcXVhbnR1bVwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlzZXRfb3JwaGFuX21hc2sgPSB0cnVlOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInJlZmlsbF9kZWxheSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3RpbWUoJnJlZmlsbF9kZWxheSwgKmFyZ3YpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwicmVmaWxsX2RlbGF5XCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXNldF9yZWZpbGxfZGVsYXkgPSB0cnVlOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInBhY2luZyIpID09IDApIHsKKwkJCXBhY2luZyA9IDE7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibm9wYWNpbmciKSA9PSAwKSB7CisJCQlwYWNpbmcgPSAwOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImhlbHAiKSA9PSAwKSB7CisJCQlleHBsYWluKCk7CisJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIldoYXQgaXMgXCIlc1wiP1xuIiwgKmFyZ3YpOworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCXRhaWwgPSBOTE1TR19UQUlMKG4pOworCWFkZGF0dHJfbChuLCAxMDI0LCBUQ0FfT1BUSU9OUywgTlVMTCwgMCk7CisJaWYgKGJ1Y2tldHMpIHsKKwkJdW5zaWduZWQgaW50IGxvZyA9IGlsb2cyKGJ1Y2tldHMpOworCisJCWFkZGF0dHJfbChuLCAxMDI0LCBUQ0FfRlFfQlVDS0VUU19MT0csCisJCQkgICZsb2csIHNpemVvZihsb2cpKTsKKwl9CisJaWYgKHNldF9wbGltaXQpCisJCWFkZGF0dHJfbChuLCAxMDI0LCBUQ0FfRlFfUExJTUlULAorCQkJICAmcGxpbWl0LCBzaXplb2YocGxpbWl0KSk7CisJaWYgKHNldF9mbG93X3BsaW1pdCkKKwkJYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9GUV9GTE9XX1BMSU1JVCwKKwkJCSAgJmZsb3dfcGxpbWl0LCBzaXplb2YoZmxvd19wbGltaXQpKTsKKwlpZiAoc2V0X3F1YW50dW0pCisJCWFkZGF0dHJfbChuLCAxMDI0LCBUQ0FfRlFfUVVBTlRVTSwgJnF1YW50dW0sIHNpemVvZihxdWFudHVtKSk7CisJaWYgKHNldF9pbml0aWFsX3F1YW50dW0pCisJCWFkZGF0dHJfbChuLCAxMDI0LCBUQ0FfRlFfSU5JVElBTF9RVUFOVFVNLAorCQkJICAmaW5pdGlhbF9xdWFudHVtLCBzaXplb2YoaW5pdGlhbF9xdWFudHVtKSk7CisJaWYgKHBhY2luZyAhPSAtMSkKKwkJYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9GUV9SQVRFX0VOQUJMRSwKKwkJCSAgJnBhY2luZywgc2l6ZW9mKHBhY2luZykpOworCWlmIChzZXRfbWF4cmF0ZSkKKwkJYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9GUV9GTE9XX01BWF9SQVRFLAorCQkJICAmbWF4cmF0ZSwgc2l6ZW9mKG1heHJhdGUpKTsKKwlpZiAoc2V0X2RlZnJhdGUpCisJCWFkZGF0dHJfbChuLCAxMDI0LCBUQ0FfRlFfRkxPV19ERUZBVUxUX1JBVEUsCisJCQkgICZkZWZyYXRlLCBzaXplb2YoZGVmcmF0ZSkpOworCWlmIChzZXRfcmVmaWxsX2RlbGF5KQorCQlhZGRhdHRyX2wobiwgMTAyNCwgVENBX0ZRX0ZMT1dfUkVGSUxMX0RFTEFZLAorCQkJICAmcmVmaWxsX2RlbGF5LCBzaXplb2YocmVmaWxsX2RlbGF5KSk7CisJaWYgKHNldF9vcnBoYW5fbWFzaykKKwkJYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9GUV9PUlBIQU5fTUFTSywKKwkJCSAgJm9ycGhhbl9tYXNrLCBzaXplb2YocmVmaWxsX2RlbGF5KSk7CisJdGFpbC0+cnRhX2xlbiA9ICh2b2lkICopIE5MTVNHX1RBSUwobikgLSAodm9pZCAqKSB0YWlsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZxX3ByaW50X29wdChzdHJ1Y3QgcWRpc2NfdXRpbCAqcXUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKm9wdCkKK3sKKwlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfRlFfTUFYICsgMV07CisJdW5zaWduZWQgaW50IHBsaW1pdCwgZmxvd19wbGltaXQ7CisJdW5zaWduZWQgaW50IGJ1Y2tldHNfbG9nOworCWludCBwYWNpbmc7CisJdW5zaWduZWQgaW50IHJhdGUsIHF1YW50dW07CisJdW5zaWduZWQgaW50IHJlZmlsbF9kZWxheTsKKwl1bnNpZ25lZCBpbnQgb3JwaGFuX21hc2s7CisJU1BSSU5UX0JVRihiMSk7CisKKwlpZiAob3B0ID09IE5VTEwpCisJCXJldHVybiAwOworCisJcGFyc2VfcnRhdHRyX25lc3RlZCh0YiwgVENBX0ZRX01BWCwgb3B0KTsKKworCWlmICh0YltUQ0FfRlFfUExJTUlUXSAmJgorCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfRlFfUExJTUlUXSkgPj0gc2l6ZW9mKF9fdTMyKSkgeworCQlwbGltaXQgPSBydGFfZ2V0YXR0cl91MzIodGJbVENBX0ZRX1BMSU1JVF0pOworCQlmcHJpbnRmKGYsICJsaW1pdCAldXAgIiwgcGxpbWl0KTsKKwl9CisJaWYgKHRiW1RDQV9GUV9GTE9XX1BMSU1JVF0gJiYKKwkgICAgUlRBX1BBWUxPQUQodGJbVENBX0ZRX0ZMT1dfUExJTUlUXSkgPj0gc2l6ZW9mKF9fdTMyKSkgeworCQlmbG93X3BsaW1pdCA9IHJ0YV9nZXRhdHRyX3UzMih0YltUQ0FfRlFfRkxPV19QTElNSVRdKTsKKwkJZnByaW50ZihmLCAiZmxvd19saW1pdCAldXAgIiwgZmxvd19wbGltaXQpOworCX0KKwlpZiAodGJbVENBX0ZRX0JVQ0tFVFNfTE9HXSAmJgorCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfRlFfQlVDS0VUU19MT0ddKSA+PSBzaXplb2YoX191MzIpKSB7CisJCWJ1Y2tldHNfbG9nID0gcnRhX2dldGF0dHJfdTMyKHRiW1RDQV9GUV9CVUNLRVRTX0xPR10pOworCQlmcHJpbnRmKGYsICJidWNrZXRzICV1ICIsIDFVIDw8IGJ1Y2tldHNfbG9nKTsKKwl9CisJaWYgKHRiW1RDQV9GUV9PUlBIQU5fTUFTS10gJiYKKwkgICAgUlRBX1BBWUxPQUQodGJbVENBX0ZRX09SUEhBTl9NQVNLXSkgPj0gc2l6ZW9mKF9fdTMyKSkgeworCQlvcnBoYW5fbWFzayA9IHJ0YV9nZXRhdHRyX3UzMih0YltUQ0FfRlFfT1JQSEFOX01BU0tdKTsKKwkJZnByaW50ZihmLCAib3JwaGFuX21hc2sgJXUgIiwgb3JwaGFuX21hc2spOworCX0KKwlpZiAodGJbVENBX0ZRX1JBVEVfRU5BQkxFXSAmJgorCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfRlFfUkFURV9FTkFCTEVdKSA+PSBzaXplb2YoaW50KSkgeworCQlwYWNpbmcgPSBydGFfZ2V0YXR0cl91MzIodGJbVENBX0ZRX1JBVEVfRU5BQkxFXSk7CisJCWlmIChwYWNpbmcgPT0gMCkKKwkJCWZwcmludGYoZiwgIm5vcGFjaW5nICIpOworCX0KKwlpZiAodGJbVENBX0ZRX1FVQU5UVU1dICYmCisJICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9GUV9RVUFOVFVNXSkgPj0gc2l6ZW9mKF9fdTMyKSkgeworCQlxdWFudHVtID0gcnRhX2dldGF0dHJfdTMyKHRiW1RDQV9GUV9RVUFOVFVNXSk7CisJCWZwcmludGYoZiwgInF1YW50dW0gJXUgIiwgcXVhbnR1bSk7CisJfQorCWlmICh0YltUQ0FfRlFfSU5JVElBTF9RVUFOVFVNXSAmJgorCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfRlFfSU5JVElBTF9RVUFOVFVNXSkgPj0gc2l6ZW9mKF9fdTMyKSkgeworCQlxdWFudHVtID0gcnRhX2dldGF0dHJfdTMyKHRiW1RDQV9GUV9JTklUSUFMX1FVQU5UVU1dKTsKKwkJZnByaW50ZihmLCAiaW5pdGlhbF9xdWFudHVtICV1ICIsIHF1YW50dW0pOworCX0KKwlpZiAodGJbVENBX0ZRX0ZMT1dfTUFYX1JBVEVdICYmCisJICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9GUV9GTE9XX01BWF9SQVRFXSkgPj0gc2l6ZW9mKF9fdTMyKSkgeworCQlyYXRlID0gcnRhX2dldGF0dHJfdTMyKHRiW1RDQV9GUV9GTE9XX01BWF9SQVRFXSk7CisKKwkJaWYgKHJhdGUgIT0gfjBVKQorCQkJZnByaW50ZihmLCAibWF4cmF0ZSAlcyAiLCBzcHJpbnRfcmF0ZShyYXRlLCBiMSkpOworCX0KKwlpZiAodGJbVENBX0ZRX0ZMT1dfREVGQVVMVF9SQVRFXSAmJgorCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfRlFfRkxPV19ERUZBVUxUX1JBVEVdKSA+PSBzaXplb2YoX191MzIpKSB7CisJCXJhdGUgPSBydGFfZ2V0YXR0cl91MzIodGJbVENBX0ZRX0ZMT1dfREVGQVVMVF9SQVRFXSk7CisKKwkJaWYgKHJhdGUgIT0gMCkKKwkJCWZwcmludGYoZiwgImRlZnJhdGUgJXMgIiwgc3ByaW50X3JhdGUocmF0ZSwgYjEpKTsKKwl9CisJaWYgKHRiW1RDQV9GUV9GTE9XX1JFRklMTF9ERUxBWV0gJiYKKwkgICAgUlRBX1BBWUxPQUQodGJbVENBX0ZRX0ZMT1dfUkVGSUxMX0RFTEFZXSkgPj0gc2l6ZW9mKF9fdTMyKSkgeworCQlyZWZpbGxfZGVsYXkgPSBydGFfZ2V0YXR0cl91MzIodGJbVENBX0ZRX0ZMT1dfUkVGSUxMX0RFTEFZXSk7CisJCWZwcmludGYoZiwgInJlZmlsbF9kZWxheSAlcyAiLCBzcHJpbnRfdGltZShyZWZpbGxfZGVsYXksIGIxKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnFfcHJpbnRfeHN0YXRzKHN0cnVjdCBxZGlzY191dGlsICpxdSwgRklMRSAqZiwKKwkJCSAgIHN0cnVjdCBydGF0dHIgKnhzdGF0cykKK3sKKwlzdHJ1Y3QgdGNfZnFfcWRfc3RhdHMgKnN0OworCisJaWYgKHhzdGF0cyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWlmIChSVEFfUEFZTE9BRCh4c3RhdHMpIDwgc2l6ZW9mKCpzdCkpCisJCXJldHVybiAtMTsKKworCXN0ID0gUlRBX0RBVEEoeHN0YXRzKTsKKworCWZwcmludGYoZiwgIiAgJXUgZmxvd3MgKCV1IGluYWN0aXZlLCAldSB0aHJvdHRsZWQpIiwKKwkJc3QtPmZsb3dzLCBzdC0+aW5hY3RpdmVfZmxvd3MsIHN0LT50aHJvdHRsZWRfZmxvd3MpOworCisJaWYgKHN0LT50aW1lX25leHRfZGVsYXllZF9mbG93ID4gMCkKKwkJZnByaW50ZihmLCAiLCBuZXh0IHBhY2tldCBkZWxheSAlbGx1IG5zIiwgc3QtPnRpbWVfbmV4dF9kZWxheWVkX2Zsb3cpOworCisJZnByaW50ZihmLCAiXG4gICVsbHUgZ2MsICVsbHUgaGlnaHByaW8iLAorCQlzdC0+Z2NfZmxvd3MsIHN0LT5oaWdocHJpb19wYWNrZXRzKTsKKworCWlmIChzdC0+dGNwX3JldHJhbnMpCisJCWZwcmludGYoZiwgIiwgJWxsdSByZXRyYW5zIiwgc3QtPnRjcF9yZXRyYW5zKTsKKworCWZwcmludGYoZiwgIiwgJWxsdSB0aHJvdHRsZWQiLCBzdC0+dGhyb3R0bGVkKTsKKworCWlmIChzdC0+Zmxvd3NfcGxpbWl0KQorCQlmcHJpbnRmKGYsICIsICVsbHUgZmxvd3NfcGxpbWl0Iiwgc3QtPmZsb3dzX3BsaW1pdCk7CisKKwlpZiAoc3QtPnBrdHNfdG9vX2xvbmcgfHwgc3QtPmFsbG9jYXRpb25fZXJyb3JzKQorCQlmcHJpbnRmKGYsICJcbiAgJWxsdSB0b28gbG9uZyBwa3RzLCAlbGx1IGFsbG9jIGVycm9yc1xuIiwKKwkJCXN0LT5wa3RzX3Rvb19sb25nLCBzdC0+YWxsb2NhdGlvbl9lcnJvcnMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBxZGlzY191dGlsIGZxX3FkaXNjX3V0aWwgPSB7CisJLmlkCQk9ICJmcSIsCisJLnBhcnNlX3FvcHQJPSBmcV9wYXJzZV9vcHQsCisJLnByaW50X3FvcHQJPSBmcV9wcmludF9vcHQsCisJLnByaW50X3hzdGF0cwk9IGZxX3ByaW50X3hzdGF0cywKK307CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy9xX2ZxX2NvZGVsLmMgYi9pcHJvdXRlMi90Yy9xX2ZxX2NvZGVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY3NDdlYgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL3FfZnFfY29kZWwuYwpAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIEZhaXIgUXVldWUgQ29kZWwKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEyLDIwMTUgRXJpYyBEdW1hemV0IDxlZHVtYXpldEBnb29nbGUuY29tPgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhdXRob3JzIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgaXMgcmV0YWluZWQgaW4gZnVsbCwgdGhpcworICogc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZQorICogR1BMIGFwcGx5IElOU1RFQUQgT0YgdGhvc2UgZ2l2ZW4gYWJvdmUuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAidGNfdXRpbC5oIgorCitzdGF0aWMgdm9pZCBleHBsYWluKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogLi4uIGZxX2NvZGVsIFsgbGltaXQgUEFDS0VUUyBdIFsgZmxvd3MgTlVNQkVSIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgICAgICBbIHRhcmdldCBUSU1FXSBbIGludGVydmFsIFRJTUUgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgICAgIFsgcXVhbnR1bSBCWVRFUyBdIFsgW25vXWVjbiBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICAgICAgWyBjZV90aHJlc2hvbGQgVElNRSBdXG4iKTsKK30KKworc3RhdGljIGludCBmcV9jb2RlbF9wYXJzZV9vcHQoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCisJCQkgICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJdW5zaWduZWQgbGltaXQgPSAwOworCXVuc2lnbmVkIGZsb3dzID0gMDsKKwl1bnNpZ25lZCB0YXJnZXQgPSAwOworCXVuc2lnbmVkIGludGVydmFsID0gMDsKKwl1bnNpZ25lZCBxdWFudHVtID0gMDsKKwl1bnNpZ25lZCBjZV90aHJlc2hvbGQgPSB+MFU7CisJaW50IGVjbiA9IC0xOworCXN0cnVjdCBydGF0dHIgKnRhaWw7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgImxpbWl0IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdW5zaWduZWQoJmxpbWl0LCAqYXJndiwgMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJsaW1pdFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZmxvd3MiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91bnNpZ25lZCgmZmxvd3MsICphcmd2LCAwKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImZsb3dzXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJxdWFudHVtIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdW5zaWduZWQoJnF1YW50dW0sICphcmd2LCAwKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcInF1YW50dW1cIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInRhcmdldCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3RpbWUoJnRhcmdldCwgKmFyZ3YpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwidGFyZ2V0XCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJjZV90aHJlc2hvbGQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF90aW1lKCZjZV90aHJlc2hvbGQsICphcmd2KSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImNlX3RocmVzaG9sZFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaW50ZXJ2YWwiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF90aW1lKCZpbnRlcnZhbCwgKmFyZ3YpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwiaW50ZXJ2YWxcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImVjbiIpID09IDApIHsKKwkJCWVjbiA9IDE7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibm9lY24iKSA9PSAwKSB7CisJCQllY24gPSAwOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImhlbHAiKSA9PSAwKSB7CisJCQlleHBsYWluKCk7CisJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIldoYXQgaXMgXCIlc1wiP1xuIiwgKmFyZ3YpOworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCXRhaWwgPSBOTE1TR19UQUlMKG4pOworCWFkZGF0dHJfbChuLCAxMDI0LCBUQ0FfT1BUSU9OUywgTlVMTCwgMCk7CisJaWYgKGxpbWl0KQorCQlhZGRhdHRyX2wobiwgMTAyNCwgVENBX0ZRX0NPREVMX0xJTUlULCAmbGltaXQsIHNpemVvZihsaW1pdCkpOworCWlmIChmbG93cykKKwkJYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9GUV9DT0RFTF9GTE9XUywgJmZsb3dzLCBzaXplb2YoZmxvd3MpKTsKKwlpZiAocXVhbnR1bSkKKwkJYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9GUV9DT0RFTF9RVUFOVFVNLCAmcXVhbnR1bSwgc2l6ZW9mKHF1YW50dW0pKTsKKwlpZiAoaW50ZXJ2YWwpCisJCWFkZGF0dHJfbChuLCAxMDI0LCBUQ0FfRlFfQ09ERUxfSU5URVJWQUwsICZpbnRlcnZhbCwgc2l6ZW9mKGludGVydmFsKSk7CisJaWYgKHRhcmdldCkKKwkJYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9GUV9DT0RFTF9UQVJHRVQsICZ0YXJnZXQsIHNpemVvZih0YXJnZXQpKTsKKwlpZiAoZWNuICE9IC0xKQorCQlhZGRhdHRyX2wobiwgMTAyNCwgVENBX0ZRX0NPREVMX0VDTiwgJmVjbiwgc2l6ZW9mKGVjbikpOworCWlmIChjZV90aHJlc2hvbGQgIT0gfjBVKQorCQlhZGRhdHRyX2wobiwgMTAyNCwgVENBX0ZRX0NPREVMX0NFX1RIUkVTSE9MRCwKKwkJCSAgJmNlX3RocmVzaG9sZCwgc2l6ZW9mKGNlX3RocmVzaG9sZCkpOworCXRhaWwtPnJ0YV9sZW4gPSAodm9pZCAqKSBOTE1TR19UQUlMKG4pIC0gKHZvaWQgKikgdGFpbDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmcV9jb2RlbF9wcmludF9vcHQoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBGSUxFICpmLCBzdHJ1Y3QgcnRhdHRyICpvcHQpCit7CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX0ZRX0NPREVMX01BWCArIDFdOworCXVuc2lnbmVkIGxpbWl0OworCXVuc2lnbmVkIGZsb3dzOworCXVuc2lnbmVkIGludGVydmFsOworCXVuc2lnbmVkIHRhcmdldDsKKwl1bnNpZ25lZCBlY247CisJdW5zaWduZWQgcXVhbnR1bTsKKwl1bnNpZ25lZCBjZV90aHJlc2hvbGQ7CisJU1BSSU5UX0JVRihiMSk7CisKKwlpZiAob3B0ID09IE5VTEwpCisJCXJldHVybiAwOworCisJcGFyc2VfcnRhdHRyX25lc3RlZCh0YiwgVENBX0ZRX0NPREVMX01BWCwgb3B0KTsKKworCWlmICh0YltUQ0FfRlFfQ09ERUxfTElNSVRdICYmCisJICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9GUV9DT0RFTF9MSU1JVF0pID49IHNpemVvZihfX3UzMikpIHsKKwkJbGltaXQgPSBydGFfZ2V0YXR0cl91MzIodGJbVENBX0ZRX0NPREVMX0xJTUlUXSk7CisJCWZwcmludGYoZiwgImxpbWl0ICV1cCAiLCBsaW1pdCk7CisJfQorCWlmICh0YltUQ0FfRlFfQ09ERUxfRkxPV1NdICYmCisJICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9GUV9DT0RFTF9GTE9XU10pID49IHNpemVvZihfX3UzMikpIHsKKwkJZmxvd3MgPSBydGFfZ2V0YXR0cl91MzIodGJbVENBX0ZRX0NPREVMX0ZMT1dTXSk7CisJCWZwcmludGYoZiwgImZsb3dzICV1ICIsIGZsb3dzKTsKKwl9CisJaWYgKHRiW1RDQV9GUV9DT0RFTF9RVUFOVFVNXSAmJgorCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfRlFfQ09ERUxfUVVBTlRVTV0pID49IHNpemVvZihfX3UzMikpIHsKKwkJcXVhbnR1bSA9IHJ0YV9nZXRhdHRyX3UzMih0YltUQ0FfRlFfQ09ERUxfUVVBTlRVTV0pOworCQlmcHJpbnRmKGYsICJxdWFudHVtICV1ICIsIHF1YW50dW0pOworCX0KKwlpZiAodGJbVENBX0ZRX0NPREVMX1RBUkdFVF0gJiYKKwkgICAgUlRBX1BBWUxPQUQodGJbVENBX0ZRX0NPREVMX1RBUkdFVF0pID49IHNpemVvZihfX3UzMikpIHsKKwkJdGFyZ2V0ID0gcnRhX2dldGF0dHJfdTMyKHRiW1RDQV9GUV9DT0RFTF9UQVJHRVRdKTsKKwkJZnByaW50ZihmLCAidGFyZ2V0ICVzICIsIHNwcmludF90aW1lKHRhcmdldCwgYjEpKTsKKwl9CisJaWYgKHRiW1RDQV9GUV9DT0RFTF9DRV9USFJFU0hPTERdICYmCisJICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9GUV9DT0RFTF9DRV9USFJFU0hPTERdKSA+PSBzaXplb2YoX191MzIpKSB7CisJCWNlX3RocmVzaG9sZCA9IHJ0YV9nZXRhdHRyX3UzMih0YltUQ0FfRlFfQ09ERUxfQ0VfVEhSRVNIT0xEXSk7CisJCWZwcmludGYoZiwgImNlX3RocmVzaG9sZCAlcyAiLCBzcHJpbnRfdGltZShjZV90aHJlc2hvbGQsIGIxKSk7CisJfQorCWlmICh0YltUQ0FfRlFfQ09ERUxfSU5URVJWQUxdICYmCisJICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9GUV9DT0RFTF9JTlRFUlZBTF0pID49IHNpemVvZihfX3UzMikpIHsKKwkJaW50ZXJ2YWwgPSBydGFfZ2V0YXR0cl91MzIodGJbVENBX0ZRX0NPREVMX0lOVEVSVkFMXSk7CisJCWZwcmludGYoZiwgImludGVydmFsICVzICIsIHNwcmludF90aW1lKGludGVydmFsLCBiMSkpOworCX0KKwlpZiAodGJbVENBX0ZRX0NPREVMX0VDTl0gJiYKKwkgICAgUlRBX1BBWUxPQUQodGJbVENBX0ZRX0NPREVMX0VDTl0pID49IHNpemVvZihfX3UzMikpIHsKKwkJZWNuID0gcnRhX2dldGF0dHJfdTMyKHRiW1RDQV9GUV9DT0RFTF9FQ05dKTsKKwkJaWYgKGVjbikKKwkJCWZwcmludGYoZiwgImVjbiAiKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmcV9jb2RlbF9wcmludF94c3RhdHMoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBGSUxFICpmLAorCQkJCSBzdHJ1Y3QgcnRhdHRyICp4c3RhdHMpCit7CisJc3RydWN0IHRjX2ZxX2NvZGVsX3hzdGF0cyBfc3QsICpzdDsKKwlTUFJJTlRfQlVGKGIxKTsKKworCWlmICh4c3RhdHMgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlzdCA9IFJUQV9EQVRBKHhzdGF0cyk7CisJaWYgKFJUQV9QQVlMT0FEKHhzdGF0cykgPCBzaXplb2YoKnN0KSkgeworCQltZW1zZXQoJl9zdCwgMCwgc2l6ZW9mKF9zdCkpOworCQltZW1jcHkoJl9zdCwgc3QsIFJUQV9QQVlMT0FEKHhzdGF0cykpOworCQlzdCA9ICZfc3Q7CisJfQorCWlmIChzdC0+dHlwZSA9PSBUQ0FfRlFfQ09ERUxfWFNUQVRTX1FESVNDKSB7CisJCWZwcmludGYoZiwgIiAgbWF4cGFja2V0ICV1IGRyb3Bfb3ZlcmxpbWl0ICV1IG5ld19mbG93X2NvdW50ICV1IGVjbl9tYXJrICV1IiwKKwkJCXN0LT5xZGlzY19zdGF0cy5tYXhwYWNrZXQsCisJCQlzdC0+cWRpc2Nfc3RhdHMuZHJvcF9vdmVybGltaXQsCisJCQlzdC0+cWRpc2Nfc3RhdHMubmV3X2Zsb3dfY291bnQsCisJCQlzdC0+cWRpc2Nfc3RhdHMuZWNuX21hcmspOworCQlpZiAoc3QtPnFkaXNjX3N0YXRzLmNlX21hcmspCisJCQlmcHJpbnRmKGYsICIgY2VfbWFyayAldSIsIHN0LT5xZGlzY19zdGF0cy5jZV9tYXJrKTsKKwkJZnByaW50ZihmLCAiXG4gIG5ld19mbG93c19sZW4gJXUgb2xkX2Zsb3dzX2xlbiAldSIsCisJCQlzdC0+cWRpc2Nfc3RhdHMubmV3X2Zsb3dzX2xlbiwKKwkJCXN0LT5xZGlzY19zdGF0cy5vbGRfZmxvd3NfbGVuKTsKKwl9CisJaWYgKHN0LT50eXBlID09IFRDQV9GUV9DT0RFTF9YU1RBVFNfQ0xBU1MpIHsKKwkJZnByaW50ZihmLCAiICBkZWZpY2l0ICVkIGNvdW50ICV1IGxhc3Rjb3VudCAldSBsZGVsYXkgJXMiLAorCQkJc3QtPmNsYXNzX3N0YXRzLmRlZmljaXQsCisJCQlzdC0+Y2xhc3Nfc3RhdHMuY291bnQsCisJCQlzdC0+Y2xhc3Nfc3RhdHMubGFzdGNvdW50LAorCQkJc3ByaW50X3RpbWUoc3QtPmNsYXNzX3N0YXRzLmxkZWxheSwgYjEpKTsKKwkJaWYgKHN0LT5jbGFzc19zdGF0cy5kcm9wcGluZykgeworCQkJZnByaW50ZihmLCAiIGRyb3BwaW5nIik7CisJCQlpZiAoc3QtPmNsYXNzX3N0YXRzLmRyb3BfbmV4dCA8IDApCisJCQkJZnByaW50ZihmLCAiIGRyb3BfbmV4dCAtJXMiLAorCQkJCQlzcHJpbnRfdGltZSgtc3QtPmNsYXNzX3N0YXRzLmRyb3BfbmV4dCwgYjEpKTsKKwkJCWVsc2UKKwkJCQlmcHJpbnRmKGYsICIgZHJvcF9uZXh0ICVzIiwKKwkJCQkJc3ByaW50X3RpbWUoc3QtPmNsYXNzX3N0YXRzLmRyb3BfbmV4dCwgYjEpKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKKworfQorCitzdHJ1Y3QgcWRpc2NfdXRpbCBmcV9jb2RlbF9xZGlzY191dGlsID0geworCS5pZAkJPSAiZnFfY29kZWwiLAorCS5wYXJzZV9xb3B0CT0gZnFfY29kZWxfcGFyc2Vfb3B0LAorCS5wcmludF9xb3B0CT0gZnFfY29kZWxfcHJpbnRfb3B0LAorCS5wcmludF94c3RhdHMJPSBmcV9jb2RlbF9wcmludF94c3RhdHMsCit9OwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvcV9ncmVkLmMgYi9pcHJvdXRlMi90Yy9xX2dyZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzFkYWEzCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGMvcV9ncmVkLmMKQEAgLTAsMCArMSwzNTQgQEAKKy8qCisgKiBxX2dyZWQuYwkJR1JFRC4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOiAgICBKIEhhZGkgU2FsaW0oaGFkaUBub3J0ZWxuZXR3b3Jrcy5jb20pCisgKiAgICAgICAgICAgICBjb2RlIHJ1dGhsZXNzbHkgcmlwcGVkIGZyb20KKyAqCSAgICAgICBBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInRjX3V0aWwuaCIKKworI2luY2x1ZGUgInRjX3JlZC5oIgorCisKKyNpZiAwCisjZGVmaW5lIERQUklOVEYoZm9ybWF0LGFyZ3MuLi4pIGZwcmludGYoc3RkZXJyLGZvcm1hdCwjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBEUFJJTlRGKGZvcm1hdCxhcmdzLi4uKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGV4cGxhaW4odm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiB0YyBxZGlzYyB7IGFkZCB8IHJlcGxhY2UgfCBjaGFuZ2UgfSAuLi4gZ3JlZCBzZXR1cCB2cXMgTlVNQkVSXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgZGVmYXVsdCBERUZBVUxUX1ZRIFsgZ3JpbyBdIFsgbGltaXQgQllURVMgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgdGMgcWRpc2MgY2hhbmdlIC4uLiBncmVkIHZxIFZRIFsgcHJpbyBWQUxVRSBdIGxpbWl0IEJZVEVTXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgbWluIEJZVEVTIG1heCBCWVRFUyBhdnBrdCBCWVRFUyBbIGJ1cnN0IFBBQ0tFVFMgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgIFsgcHJvYmFiaWxpdHkgUFJPQkFCSUxJVFkgXSBbIGJhbmR3aWR0aCBLQlBTIF1cbiIpOworfQorCitzdGF0aWMgaW50IGluaXRfZ3JlZChzdHJ1Y3QgcWRpc2NfdXRpbCAqcXUsIGludCBhcmdjLCBjaGFyICoqYXJndiwKKwkJICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisKKwlzdHJ1Y3QgcnRhdHRyICp0YWlsOworCXN0cnVjdCB0Y19ncmVkX3NvcHQgb3B0ID0geyAwIH07CisJX191MzIgbGltaXQgPSAwOworCisJb3B0LmRlZl9EUCA9IE1BWF9EUHM7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJRFBSSU5URihzdGRlcnIsImluaXRfZ3JlZDogaW52b2tlZCB3aXRoICVzXG4iLCphcmd2KTsKKwkJaWYgKHN0cmNtcCgqYXJndiwgInZxcyIpID09IDAgfHwKKwkJICAgIHN0cmNtcCgqYXJndiwgIkRQcyIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3Vuc2lnbmVkKCZvcHQuRFBzLCAqYXJndiwgMTApKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwidnFzXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0gZWxzZSBpZiAob3B0LkRQcyA+IE1BWF9EUHMpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkdSRUQ6IG9ubHkgJXUgVlFzIGFyZSAiCisJCQkJCSJjdXJyZW50bHkgc3VwcG9ydGVkXG4iLCBNQVhfRFBzKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZGVmYXVsdCIpID09IDApIHsKKwkJCWlmIChvcHQuRFBzID09IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlwiZGVmYXVsdFwiIG11c3QgYmUgZGVmaW5lZCAiCisJCQkJCSJhZnRlciBcInZxc1wiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91bnNpZ25lZCgmb3B0LmRlZl9EUCwgKmFyZ3YsIDEwKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImRlZmF1bHRcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfSBlbHNlIGlmIChvcHQuZGVmX0RQID49IG9wdC5EUHMpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlwiZGVmYXVsdFwiIG11c3QgYmUgbGVzcyB0aGFuICIKKwkJCQkJIlwidnFzXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJncmlvIikgPT0gMCkgeworCQkJb3B0LmdyaW8gPSAxOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImxpbWl0IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfc2l6ZSgmbGltaXQsICphcmd2KSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImxpbWl0XCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJXaGF0IGlzIFwiJXNcIj9cbiIsICphcmd2KTsKKwkJCWV4cGxhaW4oKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisKKwlpZiAoIW9wdC5EUHMgfHwgb3B0LmRlZl9EUCA9PSBNQVhfRFBzKSB7CisJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBncmVkIHNldHVwIHBhcmFtZXRlcnMgXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCURQUklOVEYoIlRDX0dSRUQ6IHNlbmRpbmcgRFBzPSV1IGRlZl9EUD0ldVxuIixvcHQuRFBzLG9wdC5kZWZfRFApOworCW4tPm5sbXNnX2ZsYWdzfD1OTE1fRl9DUkVBVEU7CisJdGFpbCA9IE5MTVNHX1RBSUwobik7CisJYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9PUFRJT05TLCBOVUxMLCAwKTsKKwlhZGRhdHRyX2wobiwgMTAyNCwgVENBX0dSRURfRFBTLCAmb3B0LCBzaXplb2Yoc3RydWN0IHRjX2dyZWRfc29wdCkpOworCWlmIChsaW1pdCkKKwkJYWRkYXR0cjMyKG4sIDEwMjQsIFRDQV9HUkVEX0xJTUlULCBsaW1pdCk7CisJdGFpbC0+cnRhX2xlbiA9ICh2b2lkICopIE5MTVNHX1RBSUwobikgLSAodm9pZCAqKSB0YWlsOworCXJldHVybiAwOworfQorLyoKK15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisqLworc3RhdGljIGludCBncmVkX3BhcnNlX29wdChzdHJ1Y3QgcWRpc2NfdXRpbCAqcXUsIGludCBhcmdjLCBjaGFyICoqYXJndiwgc3RydWN0IG5sbXNnaGRyICpuKQoreworCWludCBvaz0wOworCXN0cnVjdCB0Y19ncmVkX3FvcHQgb3B0ID0geyAwIH07CisJdW5zaWduZWQgYnVyc3QgPSAwOworCXVuc2lnbmVkIGF2cGt0ID0gMDsKKwlkb3VibGUgcHJvYmFiaWxpdHkgPSAwLjAyOworCXVuc2lnbmVkIHJhdGUgPSAwOworCWludCBwYXJtOworCV9fdTggc2J1ZlsyNTZdOworCXN0cnVjdCBydGF0dHIgKnRhaWw7CisJX191MzIgbWF4X1A7CisKKwlvcHQuRFAgPSBNQVhfRFBzOworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChzdHJjbXAoKmFyZ3YsICJsaW1pdCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3NpemUoJm9wdC5saW1pdCwgKmFyZ3YpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwibGltaXRcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJb2srKzsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJzZXR1cCIpID09IDApIHsKKwkJCWlmIChvaykgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcInNldHVwXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXJldHVybiBpbml0X2dyZWQocXUsIGFyZ2MtMSwgYXJndisxLCBuKTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJtaW4iKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9zaXplKCZvcHQucXRoX21pbiwgKmFyZ3YpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwibWluXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCW9rKys7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibWF4IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfc2l6ZSgmb3B0LnF0aF9tYXgsICphcmd2KSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcIm1heFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlvaysrOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInZxIikgPT0gMCB8fAorCQkJICAgc3RyY21wKCphcmd2LCAiRFAiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91bnNpZ25lZCgmb3B0LkRQLCAqYXJndiwgMTApKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwidnFcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfSBlbHNlIGlmIChvcHQuRFAgPj0gTUFYX0RQcykgeworCQkJCWZwcmludGYoc3RkZXJyLCAiR1JFRDogb25seSAldSBWUXMgYXJlICIKKwkJCQkJImN1cnJlbnRseSBzdXBwb3J0ZWRcbiIsIE1BWF9EUHMpOworCQkJCXJldHVybiAtMTsKKwkJCX0gLyogbmVlZCBhIGJldHRlciBlcnJvciBjaGVjayAqLworCQkJb2srKzsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJidXJzdCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3Vuc2lnbmVkKCZidXJzdCwgKmFyZ3YsIDApKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwiYnVyc3RcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJb2srKzsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJhdnBrdCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3NpemUoJmF2cGt0LCAqYXJndikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJhdnBrdFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlvaysrOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInByb2JhYmlsaXR5IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChzc2NhbmYoKmFyZ3YsICIlbGciLCAmcHJvYmFiaWxpdHkpICE9IDEpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJwcm9iYWJpbGl0eVwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlvaysrOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInByaW8iKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJb3B0LnByaW89c3RydG9sKCphcmd2LCAoY2hhciAqKilOVUxMLCAxMCk7CisJCQkvKiBzb21lIGVycm9yIGNoZWNrIGhlcmUgKi8KKwkJCW9rKys7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiYmFuZHdpZHRoIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfcmF0ZSgmcmF0ZSwgKmFyZ3YpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwiYmFuZHdpZHRoXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCW9rKys7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaGVscCIpID09IDApIHsKKwkJCWV4cGxhaW4oKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiV2hhdCBpcyBcIiVzXCI/XG4iLCAqYXJndik7CisJCQlleHBsYWluKCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJaWYgKCFvaykgeworCQlleHBsYWluKCk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKG9wdC5EUCA9PSBNQVhfRFBzIHx8ICFvcHQubGltaXQgfHwgIW9wdC5xdGhfbWluIHx8ICFvcHQucXRoX21heCB8fAorCSAgICAhYXZwa3QpIHsKKwkJZnByaW50ZihzdGRlcnIsICJSZXF1aXJlZCBwYXJhbWV0ZXIgKHZxLCBsaW1pdCwgbWluLCBtYXgsICIKKwkJCSJhdnBrdCkgaXMgbWlzc2luZ1xuIik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKCFidXJzdCkgeworCQlidXJzdCA9ICgyICogb3B0LnF0aF9taW4gKyBvcHQucXRoX21heCkgLyAoMyAqIGF2cGt0KTsKKwkJZnByaW50ZihzdGRlcnIsICJHUkVEOiBzZXQgYnVyc3QgdG8gJXVcbiIsIGJ1cnN0KTsKKwl9CisJaWYgKCFyYXRlKSB7CisJCWdldF9yYXRlKCZyYXRlLCAiMTBNYml0Iik7CisJCWZwcmludGYoc3RkZXJyLCAiR1JFRDogc2V0IGJhbmR3aWR0aCB0byAxME1iaXRcbiIpOworCX0KKwlpZiAoKHBhcm0gPSB0Y19yZWRfZXZhbF9ld21hKG9wdC5xdGhfbWluLCBidXJzdCwgYXZwa3QpKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJHUkVEOiBmYWlsZWQgdG8gY2FsY3VsYXRlIEVXTUEgY29uc3RhbnQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAocGFybSA+PSAxMCkKKwkJZnByaW50ZihzdGRlcnIsICJHUkVEOiBXQVJOSU5HLiBCdXJzdCAldSBzZWVtcyB0byBiZSB0b28gIgorCQkgICAgImxhcmdlLlxuIiwgYnVyc3QpOworCW9wdC5XbG9nID0gcGFybTsKKwlpZiAoKHBhcm0gPSB0Y19yZWRfZXZhbF9QKG9wdC5xdGhfbWluLCBvcHQucXRoX21heCwgcHJvYmFiaWxpdHkpKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJHUkVEOiBmYWlsZWQgdG8gY2FsY3VsYXRlIHByb2JhYmlsaXR5LlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJb3B0LlBsb2cgPSBwYXJtOworCWlmICgocGFybSA9IHRjX3JlZF9ldmFsX2lkbGVfZGFtcGluZyhvcHQuV2xvZywgYXZwa3QsIHJhdGUsIHNidWYpKSA8IDApCisJICAgIHsKKwkJZnByaW50ZihzdGRlcnIsICJHUkVEOiBmYWlsZWQgdG8gY2FsY3VsYXRlIGlkbGUgZGFtcGluZyAiCisJCSAgICAidGFibGUuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlvcHQuU2NlbGxfbG9nID0gcGFybTsKKworCXRhaWwgPSBOTE1TR19UQUlMKG4pOworCWFkZGF0dHJfbChuLCAxMDI0LCBUQ0FfT1BUSU9OUywgTlVMTCwgMCk7CisJYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9HUkVEX1BBUk1TLCAmb3B0LCBzaXplb2Yob3B0KSk7CisJYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9HUkVEX1NUQUIsIHNidWYsIDI1Nik7CisJbWF4X1AgPSBwcm9iYWJpbGl0eSAqIHBvdygyLCAzMik7CisJYWRkYXR0cjMyKG4sIDEwMjQsIFRDQV9HUkVEX01BWF9QLCBtYXhfUCk7CisJdGFpbC0+cnRhX2xlbiA9ICh2b2lkICopIE5MTVNHX1RBSUwobikgLSAodm9pZCAqKSB0YWlsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdyZWRfcHJpbnRfb3B0KHN0cnVjdCBxZGlzY191dGlsICpxdSwgRklMRSAqZiwgc3RydWN0IHJ0YXR0ciAqb3B0KQoreworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9HUkVEX01BWCArIDFdOworCXN0cnVjdCB0Y19ncmVkX3NvcHQgKnNvcHQ7CisJc3RydWN0IHRjX2dyZWRfcW9wdCAqcW9wdDsKKwlfX3UzMiAqbWF4X3AgPSBOVUxMOworCV9fdTMyICpsaW1pdCA9IE5VTEw7CisJdW5zaWduZWQgaTsKKwlTUFJJTlRfQlVGKGIxKTsKKwlTUFJJTlRfQlVGKGIyKTsKKwlTUFJJTlRfQlVGKGIzKTsKKworCWlmIChvcHQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlwYXJzZV9ydGF0dHJfbmVzdGVkKHRiLCBUQ0FfR1JFRF9NQVgsIG9wdCk7CisKKwlpZiAodGJbVENBX0dSRURfUEFSTVNdID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmICh0YltUQ0FfR1JFRF9NQVhfUF0gJiYKKwkgICAgUlRBX1BBWUxPQUQodGJbVENBX0dSRURfTUFYX1BdKSA+PSBzaXplb2YoX191MzIpICogTUFYX0RQcykKKwkJbWF4X3AgPSBSVEFfREFUQSh0YltUQ0FfR1JFRF9NQVhfUF0pOworCisJaWYgKHRiW1RDQV9HUkVEX0xJTUlUXSAmJgorCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfR1JFRF9MSU1JVF0pID09IHNpemVvZihfX3UzMikpCisJCWxpbWl0ID0gUlRBX0RBVEEodGJbVENBX0dSRURfTElNSVRdKTsKKworCXNvcHQgPSBSVEFfREFUQSh0YltUQ0FfR1JFRF9EUFNdKTsKKwlxb3B0ID0gUlRBX0RBVEEodGJbVENBX0dSRURfUEFSTVNdKTsKKwlpZiAoUlRBX1BBWUxPQUQodGJbVENBX0dSRURfRFBTXSkgPCBzaXplb2YoKnNvcHQpIHx8CisJICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9HUkVEX1BBUk1TXSkgPCBzaXplb2YoKnFvcHQpKk1BWF9EUHMpIHsKKwkJZnByaW50ZihmLCJcbiBHUkVEIHJlY2VpdmVkIG1lc3NhZ2Ugc21hbGxlciB0aGFuIGV4cGVjdGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworLyogQmFkIGhhY2shIHNob3VsZCByZWFsbHkgcmV0dXJuIGEgcHJvcGVyIG1lc3NhZ2UgYXMgc2hvd24gYWJvdmUqLworCisJZnByaW50ZihmLCAidnFzICV1IGRlZmF1bHQgJXUgJXMiLAorCQlzb3B0LT5EUHMsCisJCXNvcHQtPmRlZl9EUCwKKwkJc29wdC0+Z3JpbyA/ICJncmlvICIgOiAiIik7CisKKwlpZiAobGltaXQpCisJCWZwcmludGYoZiwgImxpbWl0ICVzICIsCisJCQlzcHJpbnRfc2l6ZSgqbGltaXQsIGIxKSk7CisKKwlmb3IgKGk9MDtpPE1BWF9EUHM7aSsrLCBxb3B0KyspIHsKKwkJaWYgKHFvcHQtPkRQID49IE1BWF9EUHMpIGNvbnRpbnVlOworCQlmcHJpbnRmKGYsICJcbiB2cSAldSBwcmlvICVoaHUgbGltaXQgJXMgbWluICVzIG1heCAlcyAiLAorCQkJcW9wdC0+RFAsCisJCQlxb3B0LT5wcmlvLAorCQkJc3ByaW50X3NpemUocW9wdC0+bGltaXQsIGIxKSwKKwkJCXNwcmludF9zaXplKHFvcHQtPnF0aF9taW4sIGIyKSwKKwkJCXNwcmludF9zaXplKHFvcHQtPnF0aF9tYXgsIGIzKSk7CisJCWlmIChzaG93X2RldGFpbHMpIHsKKwkJCWZwcmludGYoZiwgImV3bWEgJXUgIiwgcW9wdC0+V2xvZyk7CisJCQlpZiAobWF4X3ApCisJCQkJZnByaW50ZihmLCAicHJvYmFiaWxpdHkgJWxnICIsIG1heF9wW2ldIC8gcG93KDIsIDMyKSk7CisJCQllbHNlCisJCQkJZnByaW50ZihmLCAiUGxvZyAldSAiLCBxb3B0LT5QbG9nKTsKKwkJCWZwcmludGYoZiwgIlNjZWxsX2xvZyAldSAiLCBxb3B0LT5TY2VsbF9sb2cpOworCQl9CisJCWlmIChzaG93X3N0YXRzKSB7CisJCQlmcHJpbnRmKGYsICJcbiAgUXVldWUgc2l6ZTogYXZlcmFnZSAlcyBjdXJyZW50ICVzICIsCisJCQkJc3ByaW50X3NpemUocW9wdC0+cWF2ZSwgYjEpLAorCQkJCXNwcmludF9zaXplKHFvcHQtPmJhY2tsb2csIGIyKSk7CisJCQlmcHJpbnRmKGYsICJcbiAgRHJvcHBlZCBwYWNrZXRzOiBmb3JjZWQgJXUgZWFybHkgJXUgcGRyb3AgJXUgb3RoZXIgJXUgIiwKKwkJCQlxb3B0LT5mb3JjZWQsCisJCQkJcW9wdC0+ZWFybHksCisJCQkJcW9wdC0+cGRyb3AsCisJCQkJcW9wdC0+b3RoZXIpOworCQkJZnByaW50ZihmLCAiXG4gIFRvdGFsIHBhY2tldHM6ICV1ICglcykgIiwKKwkJCQlxb3B0LT5wYWNrZXRzLAorCQkJCXNwcmludF9zaXplKHFvcHQtPmJ5dGVzaW4sIGIxKSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBxZGlzY191dGlsIGdyZWRfcWRpc2NfdXRpbCA9IHsKKwkuaWQJCT0gImdyZWQiLAorCS5wYXJzZV9xb3B0CT0gZ3JlZF9wYXJzZV9vcHQsCisJLnByaW50X3FvcHQJPSBncmVkX3ByaW50X29wdCwKK307CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy9xX2hmc2MuYyBiL2lwcm91dGUyL3RjL3FfaGZzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNTM5ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy9xX2hmc2MuYwpAQCAtMCwwICsxLDQxMCBAQAorLyoKKyAqIHFfaGZzYy5jCUhGU0MuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJUGF0cmljayBNY0hhcmR5LCA8a2FiZXJAdHJhc2gubmV0PgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0Y191dGlsLmgiCisKK3N0YXRpYyBpbnQgaGZzY19nZXRfc2MoaW50ICosIGNoYXIgKioqLCBzdHJ1Y3QgdGNfc2VydmljZV9jdXJ2ZSAqKTsKKworCitzdGF0aWMgdm9pZAorZXhwbGFpbl9xZGlzYyh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLAorCQkiVXNhZ2U6IC4uLiBoZnNjIFsgZGVmYXVsdCBDTEFTU0lEIF1cbiIKKwkJIlxuIgorCQkiIGRlZmF1bHQ6IGRlZmF1bHQgY2xhc3MgZm9yIHVuY2xhc3NpZmllZCBwYWNrZXRzXG4iCisJKTsKK30KKworc3RhdGljIHZvaWQKK2V4cGxhaW5fY2xhc3Modm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwKKwkJIlVzYWdlOiAuLi4gaGZzYyBbIFsgcnQgU0MgXSBbIGxzIFNDIF0gfCBbIHNjIFNDIF0gXSBbIHVsIFNDIF1cbiIKKwkJIlxuIgorCQkiU0MgOj0gWyBbIG0xIEJQUyBdIGQgU0VDIF0gbTIgQlBTXG4iCisJCSJcbiIKKwkJIiBtMSA6IHNsb3BlIG9mIGZpcnN0IHNlZ21lbnRcbiIKKwkJIiBkICA6IHgtY29vcmRpbmF0ZSBvZiBpbnRlcnNlY3Rpb25cbiIKKwkJIiBtMiA6IHNsb3BlIG9mIHNlY29uZCBzZWdtZW50XG4iCisJCSJcbiIKKwkJIkFsdGVybmF0aXZlIGZvcm1hdDpcbiIKKwkJIlxuIgorCQkiU0MgOj0gWyBbIHVtYXggQllURSBdIGRtYXggU0VDIF0gcmF0ZSBCUFNcbiIKKwkJIlxuIgorCQkiIHVtYXggOiBtYXhpbXVtIHVuaXQgb2Ygd29ya1xuIgorCQkiIGRtYXggOiBtYXhpbXVtIGRlbGF5XG4iCisJCSIgcmF0ZSA6IHJhdGVcbiIKKwkJIlxuIgorCQkiUmVtYXJrczpcbiIKKwkJIiAtIGF0IGxlYXN0IG9uZSBvZiAncnQnLCAnbHMnIG9yICdzYycgbXVzdCBiZSBzcGVjaWZpZWRcbiIKKwkJIiAtICd1bCcgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIHdpdGggJ2xzJyBvciAnc2MnXG4iCisJCSJcbiIKKwkpOworfQorCitzdGF0aWMgdm9pZAorZXhwbGFpbjEoY2hhciAqYXJnKQoreworCWZwcmludGYoc3RkZXJyLCAiSEZTQzogSWxsZWdhbCBcIiVzXCJcbiIsIGFyZyk7Cit9CisKK3N0YXRpYyBpbnQKK2hmc2NfcGFyc2Vfb3B0KHN0cnVjdCBxZGlzY191dGlsICpxdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJc3RydWN0IHRjX2hmc2NfcW9wdCBxb3B0OworCisJbWVtc2V0KCZxb3B0LCAwLCBzaXplb2YocW9wdCkpOworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChtYXRjaGVzKCphcmd2LCAiZGVmYXVsdCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocW9wdC5kZWZjbHMgIT0gMCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSEZTQzogRG91YmxlIFwiZGVmYXVsdFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAoZ2V0X3UxNigmcW9wdC5kZWZjbHMsICphcmd2LCAxNikgPCAwKSB7CisJCQkJZXhwbGFpbjEoImRlZmF1bHQiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKSB7CisJCQlleHBsYWluX3FkaXNjKCk7CisJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkhGU0M6IFdoYXQgaXMgXCIlc1wiID9cbiIsICphcmd2KTsKKwkJCWV4cGxhaW5fcWRpc2MoKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlhcmdjLS0sIGFyZ3YrKzsKKwl9CisKKwlhZGRhdHRyX2wobiwgMTAyNCwgVENBX09QVElPTlMsICZxb3B0LCBzaXplb2YocW9wdCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitoZnNjX3ByaW50X29wdChzdHJ1Y3QgcWRpc2NfdXRpbCAqcXUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKm9wdCkKK3sKKwlzdHJ1Y3QgdGNfaGZzY19xb3B0ICpxb3B0OworCisJaWYgKG9wdCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlpZiAoUlRBX1BBWUxPQUQob3B0KSA8IHNpemVvZigqcW9wdCkpCisJCXJldHVybiAtMTsKKwlxb3B0ID0gUlRBX0RBVEEob3B0KTsKKworCWlmIChxb3B0LT5kZWZjbHMgIT0gMCkKKwkJZnByaW50ZihmLCAiZGVmYXVsdCAleCAiLCBxb3B0LT5kZWZjbHMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2hmc2NfcHJpbnRfeHN0YXRzKHN0cnVjdCBxZGlzY191dGlsICpxdSwgRklMRSAqZiwgc3RydWN0IHJ0YXR0ciAqeHN0YXRzKQoreworCXN0cnVjdCB0Y19oZnNjX3N0YXRzICpzdDsKKworCWlmICh4c3RhdHMgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJaWYgKFJUQV9QQVlMT0FEKHhzdGF0cykgPCBzaXplb2YoKnN0KSkKKwkJcmV0dXJuIC0xOworCXN0ID0gUlRBX0RBVEEoeHN0YXRzKTsKKworCWZwcmludGYoZiwgIiBwZXJpb2QgJXUgIiwgc3QtPnBlcmlvZCk7CisJaWYgKHN0LT53b3JrICE9IDApCisJCWZwcmludGYoZiwgIndvcmsgJWxsdSBieXRlcyAiLCAodW5zaWduZWQgbG9uZyBsb25nKSBzdC0+d29yayk7CisJaWYgKHN0LT5ydHdvcmsgIT0gMCkKKwkJZnByaW50ZihmLCAicnR3b3JrICVsbHUgYnl0ZXMgIiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3QtPnJ0d29yayk7CisJZnByaW50ZihmLCAibGV2ZWwgJXUgIiwgc3QtPmxldmVsKTsKKwlmcHJpbnRmKGYsICJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2hmc2NfcGFyc2VfY2xhc3Nfb3B0KHN0cnVjdCBxZGlzY191dGlsICpxdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5sbXNnaGRyICpuKQoreworCXN0cnVjdCB0Y19zZXJ2aWNlX2N1cnZlIHJzYywgZnNjLCB1c2M7CisJaW50IHJzY19vaywgZnNjX29rLCB1c2Nfb2s7CisJc3RydWN0IHJ0YXR0ciAqdGFpbDsKKworCW1lbXNldCgmcnNjLCAwLCBzaXplb2YocnNjKSk7CisJbWVtc2V0KCZmc2MsIDAsIHNpemVvZihmc2MpKTsKKwltZW1zZXQoJnVzYywgMCwgc2l6ZW9mKHVzYykpOworCXJzY19vayA9IGZzY19vayA9IHVzY19vayA9IDA7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJydCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoaGZzY19nZXRfc2MoJmFyZ2MsICZhcmd2LCAmcnNjKSA8IDApIHsKKwkJCQlleHBsYWluMSgicnQiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlyc2Nfb2sgPSAxOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJscyIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoaGZzY19nZXRfc2MoJmFyZ2MsICZhcmd2LCAmZnNjKSA8IDApIHsKKwkJCQlleHBsYWluMSgibHMiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlmc2Nfb2sgPSAxOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJzYyIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoaGZzY19nZXRfc2MoJmFyZ2MsICZhcmd2LCAmcnNjKSA8IDApIHsKKwkJCQlleHBsYWluMSgic2MiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQltZW1jcHkoJmZzYywgJnJzYywgc2l6ZW9mKGZzYykpOworCQkJcnNjX29rID0gMTsKKwkJCWZzY19vayA9IDE7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInVsIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChoZnNjX2dldF9zYygmYXJnYywgJmFyZ3YsICZ1c2MpIDwgMCkgeworCQkJCWV4cGxhaW4xKCJ1bCIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXVzY19vayA9IDE7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKSB7CisJCQlleHBsYWluX2NsYXNzKCk7CisJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkhGU0M6IFdoYXQgaXMgXCIlc1wiID9cbiIsICphcmd2KTsKKwkJCWV4cGxhaW5fY2xhc3MoKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlhcmdjLS0sIGFyZ3YrKzsKKwl9CisKKwlpZiAoIShyc2Nfb2sgfHwgZnNjX29rIHx8IHVzY19vaykpIHsKKwkJZnByaW50ZihzdGRlcnIsICJIRlNDOiBubyBwYXJhbWV0ZXJzIGdpdmVuXG4iKTsKKwkJZXhwbGFpbl9jbGFzcygpOworCQlyZXR1cm4gLTE7CisJfQorCWlmICh1c2Nfb2sgJiYgIWZzY19vaykgeworCQlmcHJpbnRmKHN0ZGVyciwgIkhGU0M6IFVwcGVyLWxpbWl0IFNlcnZpY2UgQ3VydmUgd2l0aG91dCAiCisJCSAgICAgICAgICAgICAgICAiTGluay1TaGFyZSBTZXJ2aWNlIEN1cnZlXG4iKTsKKwkJZXhwbGFpbl9jbGFzcygpOworCQlyZXR1cm4gLTE7CisJfQorCisJdGFpbCA9IE5MTVNHX1RBSUwobik7CisKKwlhZGRhdHRyX2wobiwgMTAyNCwgVENBX09QVElPTlMsIE5VTEwsIDApOworCWlmIChyc2Nfb2spCisJCWFkZGF0dHJfbChuLCAxMDI0LCBUQ0FfSEZTQ19SU0MsICZyc2MsIHNpemVvZihyc2MpKTsKKwlpZiAoZnNjX29rKQorCQlhZGRhdHRyX2wobiwgMTAyNCwgVENBX0hGU0NfRlNDLCAmZnNjLCBzaXplb2YoZnNjKSk7CisJaWYgKHVzY19vaykKKwkJYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9IRlNDX1VTQywgJnVzYywgc2l6ZW9mKHVzYykpOworCisJdGFpbC0+cnRhX2xlbiA9ICh2b2lkICopIE5MTVNHX1RBSUwobikgLSAodm9pZCAqKSB0YWlsOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAoraGZzY19wcmludF9zYyhGSUxFICpmLCBjaGFyICpuYW1lLCBzdHJ1Y3QgdGNfc2VydmljZV9jdXJ2ZSAqc2MpCit7CisJU1BSSU5UX0JVRihiMSk7CisKKwlmcHJpbnRmKGYsICIlcyAiLCBuYW1lKTsKKwlmcHJpbnRmKGYsICJtMSAlcyAiLCBzcHJpbnRfcmF0ZShzYy0+bTEsIGIxKSk7CisJZnByaW50ZihmLCAiZCAlcyAiLCBzcHJpbnRfdGltZSh0Y19jb3JlX2t0aW1lMnRpbWUoc2MtPmQpLCBiMSkpOworCWZwcmludGYoZiwgIm0yICVzICIsIHNwcmludF9yYXRlKHNjLT5tMiwgYjEpKTsKK30KKworc3RhdGljIGludAoraGZzY19wcmludF9jbGFzc19vcHQoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBGSUxFICpmLCBzdHJ1Y3QgcnRhdHRyICpvcHQpCit7CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX0hGU0NfTUFYKzFdOworCXN0cnVjdCB0Y19zZXJ2aWNlX2N1cnZlICpyc2MgPSBOVUxMLCAqZnNjID0gTlVMTCwgKnVzYyA9IE5VTEw7CisKKwlpZiAob3B0ID09IE5VTEwpCisJCXJldHVybiAwOworCisJcGFyc2VfcnRhdHRyX25lc3RlZCh0YiwgVENBX0hGU0NfTUFYLCBvcHQpOworCisJaWYgKHRiW1RDQV9IRlNDX1JTQ10pIHsKKwkJaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9IRlNDX1JTQ10pIDwgc2l6ZW9mKCpyc2MpKQorCQkJZnByaW50ZihzdGRlcnIsICJIRlNDOiB0cnVuY2F0ZWQgcmVhbHRpbWUgb3B0aW9uXG4iKTsKKwkJZWxzZQorCQkJcnNjID0gUlRBX0RBVEEodGJbVENBX0hGU0NfUlNDXSk7CisJfQorCWlmICh0YltUQ0FfSEZTQ19GU0NdKSB7CisJCWlmIChSVEFfUEFZTE9BRCh0YltUQ0FfSEZTQ19GU0NdKSA8IHNpemVvZigqZnNjKSkKKwkJCWZwcmludGYoc3RkZXJyLCAiSEZTQzogdHJ1bmNhdGVkIGxpbmtzaGFyZSBvcHRpb25cbiIpOworCQllbHNlCisJCQlmc2MgPSBSVEFfREFUQSh0YltUQ0FfSEZTQ19GU0NdKTsKKwl9CisJaWYgKHRiW1RDQV9IRlNDX1VTQ10pIHsKKwkJaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9IRlNDX1VTQ10pIDwgc2l6ZW9mKCp1c2MpKQorCQkJZnByaW50ZihzdGRlcnIsICJIRlNDOiB0cnVuY2F0ZWQgdXBwZXJsaW1pdCBvcHRpb25cbiIpOworCQllbHNlCisJCQl1c2MgPSBSVEFfREFUQSh0YltUQ0FfSEZTQ19VU0NdKTsKKwl9CisKKworCWlmIChyc2MgIT0gTlVMTCAmJiBmc2MgIT0gTlVMTCAmJgorCSAgICBtZW1jbXAocnNjLCBmc2MsIHNpemVvZigqcnNjKSkgPT0gMCkKKwkJaGZzY19wcmludF9zYyhmLCAic2MiLCByc2MpOworCWVsc2UgeworCQlpZiAocnNjICE9IE5VTEwpCisJCQloZnNjX3ByaW50X3NjKGYsICJydCIsIHJzYyk7CisJCWlmIChmc2MgIT0gTlVMTCkKKwkJCWhmc2NfcHJpbnRfc2MoZiwgImxzIiwgZnNjKTsKKwl9CisJaWYgKHVzYyAhPSBOVUxMKQorCQloZnNjX3ByaW50X3NjKGYsICJ1bCIsIHVzYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHFkaXNjX3V0aWwgaGZzY19xZGlzY191dGlsID0geworCS5pZAkJPSAiaGZzYyIsCisJLnBhcnNlX3FvcHQJPSBoZnNjX3BhcnNlX29wdCwKKwkucHJpbnRfcW9wdAk9IGhmc2NfcHJpbnRfb3B0LAorCS5wcmludF94c3RhdHMJPSBoZnNjX3ByaW50X3hzdGF0cywKKwkucGFyc2VfY29wdAk9IGhmc2NfcGFyc2VfY2xhc3Nfb3B0LAorCS5wcmludF9jb3B0CT0gaGZzY19wcmludF9jbGFzc19vcHQsCit9OworCitzdGF0aWMgaW50CitoZnNjX2dldF9zYzEoaW50ICphcmdjcCwgY2hhciAqKiphcmd2cCwgc3RydWN0IHRjX3NlcnZpY2VfY3VydmUgKnNjKQoreworCWNoYXIgKiphcmd2ID0gKmFyZ3ZwOworCWludCBhcmdjID0gKmFyZ2NwOworCXVuc2lnbmVkIGludCBtMSA9IDAsIGQgPSAwLCBtMiA9IDA7CisKKwlpZiAobWF0Y2hlcygqYXJndiwgIm0xIikgPT0gMCkgeworCQlORVhUX0FSRygpOworCQlpZiAoZ2V0X3JhdGUoJm0xLCAqYXJndikgPCAwKSB7CisJCQlleHBsYWluMSgibTEiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlORVhUX0FSRygpOworCX0KKworCWlmIChtYXRjaGVzKCphcmd2LCAiZCIpID09IDApIHsKKwkJTkVYVF9BUkcoKTsKKwkJaWYgKGdldF90aW1lKCZkLCAqYXJndikgPCAwKSB7CisJCQlleHBsYWluMSgiZCIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCU5FWFRfQVJHKCk7CisJfQorCisJaWYgKG1hdGNoZXMoKmFyZ3YsICJtMiIpID09IDApIHsKKwkJTkVYVF9BUkcoKTsKKwkJaWYgKGdldF9yYXRlKCZtMiwgKmFyZ3YpIDwgMCkgeworCQkJZXhwbGFpbjEoIm0yIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9IGVsc2UKKwkJcmV0dXJuIC0xOworCisJc2MtPm0xID0gbTE7CisJc2MtPmQgID0gdGNfY29yZV90aW1lMmt0aW1lKGQpOworCXNjLT5tMiA9IG0yOworCisJKmFyZ3ZwID0gYXJndjsKKwkqYXJnY3AgPSBhcmdjOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitoZnNjX2dldF9zYzIoaW50ICphcmdjcCwgY2hhciAqKiphcmd2cCwgc3RydWN0IHRjX3NlcnZpY2VfY3VydmUgKnNjKQoreworCWNoYXIgKiphcmd2ID0gKmFyZ3ZwOworCWludCBhcmdjID0gKmFyZ2NwOworCXVuc2lnbmVkIGludCB1bWF4ID0gMCwgZG1heCA9IDAsIHJhdGUgPSAwOworCisJaWYgKG1hdGNoZXMoKmFyZ3YsICJ1bWF4IikgPT0gMCkgeworCQlORVhUX0FSRygpOworCQlpZiAoZ2V0X3NpemUoJnVtYXgsICphcmd2KSA8IDApIHsKKwkJCWV4cGxhaW4xKCJ1bWF4Iik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJTkVYVF9BUkcoKTsKKwl9CisKKwlpZiAobWF0Y2hlcygqYXJndiwgImRtYXgiKSA9PSAwKSB7CisJCU5FWFRfQVJHKCk7CisJCWlmIChnZXRfdGltZSgmZG1heCwgKmFyZ3YpIDwgMCkgeworCQkJZXhwbGFpbjEoImRtYXgiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlORVhUX0FSRygpOworCX0KKworCWlmIChtYXRjaGVzKCphcmd2LCAicmF0ZSIpID09IDApIHsKKwkJTkVYVF9BUkcoKTsKKwkJaWYgKGdldF9yYXRlKCZyYXRlLCAqYXJndikgPCAwKSB7CisJCQlleHBsYWluMSgicmF0ZSIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfSBlbHNlCisJCXJldHVybiAtMTsKKworCWlmICh1bWF4ICE9IDAgJiYgZG1heCA9PSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiSEZTQzogdW1heCBnaXZlbiBidXQgZG1heCBpcyB6ZXJvLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoZG1heCAhPSAwICYmIGNlaWwoMS4wICogdW1heCAqIFRJTUVfVU5JVFNfUEVSX1NFQyAvIGRtYXgpID4gcmF0ZSkgeworCQkvKgorCQkgKiBjb25jYXZlIGN1cnZlLCBzbG9wZSBvZiBmaXJzdCBzZWdtZW50IGlzIHVtYXgvZG1heCwKKwkJICogaW50ZXJzZWN0aW9uIGlzIGF0IGRtYXgKKwkJICovCisJCXNjLT5tMSA9IGNlaWwoMS4wICogdW1heCAqIFRJTUVfVU5JVFNfUEVSX1NFQyAvIGRtYXgpOyAvKiBpbiBicHMgKi8KKwkJc2MtPmQgID0gdGNfY29yZV90aW1lMmt0aW1lKGRtYXgpOworCQlzYy0+bTIgPSByYXRlOworCX0gZWxzZSB7CisJCS8qCisJCSAqIGNvbnZleCBjdXJ2ZSwgc2xvcGUgb2YgZmlyc3Qgc2VnbWVudCBpcyAwLCBpbnRlcnNlY3Rpb24KKwkJICogaXMgYXQgZG1heCAtIHVtYXggLyByYXRlCisJCSAqLworCQlzYy0+bTEgPSAwOworCQlzYy0+ZCAgPSB0Y19jb3JlX3RpbWUya3RpbWUoY2VpbChkbWF4IC0gdW1heCAqIFRJTUVfVU5JVFNfUEVSX1NFQyAvIHJhdGUpKTsKKwkJc2MtPm0yID0gcmF0ZTsKKwl9CisKKwkqYXJndnAgPSBhcmd2OworCSphcmdjcCA9IGFyZ2M7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2hmc2NfZ2V0X3NjKGludCAqYXJnY3AsIGNoYXIgKioqYXJndnAsIHN0cnVjdCB0Y19zZXJ2aWNlX2N1cnZlICpzYykKK3sKKwlpZiAoaGZzY19nZXRfc2MxKGFyZ2NwLCBhcmd2cCwgc2MpIDwgMCAmJgorCSAgICBoZnNjX2dldF9zYzIoYXJnY3AsIGFyZ3ZwLCBzYykgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoc2MtPm0xID09IDAgJiYgc2MtPm0yID09IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJIRlNDOiBTZXJ2aWNlIEN1cnZlIGhhcyB0d28gemVybyBzbG9wZXNcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy9xX2hoZi5jIGIvaXByb3V0ZTIvdGMvcV9oaGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmVjOGEyCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGMvcV9oaGYuYwpAQCAtMCwwICsxLDE5OSBAQAorLyogcV9oaGYuYwkJSGVhdnktSGl0dGVyIEZpbHRlciAoSEhGKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUZXJyeSBMYW0gPHZ0bGFtQGdvb2dsZS5jb20+CisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAidGNfdXRpbC5oIgorCitzdGF0aWMgdm9pZCBleHBsYWluKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogLi4uIGhoZiBbIGxpbWl0IFBBQ0tFVFMgXSBbIHF1YW50dW0gQllURVNdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgIFsgaGhfbGltaXQgTlVNQkVSIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgWyByZXNldF90aW1lb3V0IFRJTUUgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICBbIGFkbWl0X2J5dGVzIEJZVEVTIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgWyBldmljdF90aW1lb3V0IFRJTUUgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICBbIG5vbl9oaF93ZWlnaHQgTlVNQkVSIF1cbiIpOworfQorCitzdGF0aWMgaW50IGhoZl9wYXJzZV9vcHQoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCisJCQkgc3RydWN0IG5sbXNnaGRyICpuKQoreworCXVuc2lnbmVkIGxpbWl0ID0gMDsKKwl1bnNpZ25lZCBxdWFudHVtID0gMDsKKwl1bnNpZ25lZCBoaF9saW1pdCA9IDA7CisJdW5zaWduZWQgcmVzZXRfdGltZW91dCA9IDA7CisJdW5zaWduZWQgYWRtaXRfYnl0ZXMgPSAwOworCXVuc2lnbmVkIGV2aWN0X3RpbWVvdXQgPSAwOworCXVuc2lnbmVkIG5vbl9oaF93ZWlnaHQgPSAwOworCXN0cnVjdCBydGF0dHIgKnRhaWw7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgImxpbWl0IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdW5zaWduZWQoJmxpbWl0LCAqYXJndiwgMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJsaW1pdFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAicXVhbnR1bSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3Vuc2lnbmVkKCZxdWFudHVtLCAqYXJndiwgMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJxdWFudHVtXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJoaF9saW1pdCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3Vuc2lnbmVkKCZoaF9saW1pdCwgKmFyZ3YsIDApKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwiaGhfbGltaXRcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInJlc2V0X3RpbWVvdXQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF90aW1lKCZyZXNldF90aW1lb3V0LCAqYXJndikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJyZXNldF90aW1lb3V0XCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJhZG1pdF9ieXRlcyIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3Vuc2lnbmVkKCZhZG1pdF9ieXRlcywgKmFyZ3YsIDApKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwiYWRtaXRfYnl0ZXNcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImV2aWN0X3RpbWVvdXQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF90aW1lKCZldmljdF90aW1lb3V0LCAqYXJndikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJldmljdF90aW1lb3V0XCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJub25faGhfd2VpZ2h0IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdW5zaWduZWQoJm5vbl9oaF93ZWlnaHQsICphcmd2LCAwKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcIm5vbl9oaF93ZWlnaHRcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImhlbHAiKSA9PSAwKSB7CisJCQlleHBsYWluKCk7CisJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIldoYXQgaXMgXCIlc1wiP1xuIiwgKmFyZ3YpOworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCXRhaWwgPSBOTE1TR19UQUlMKG4pOworCWFkZGF0dHJfbChuLCAxMDI0LCBUQ0FfT1BUSU9OUywgTlVMTCwgMCk7CisJaWYgKGxpbWl0KQorCQlhZGRhdHRyX2wobiwgMTAyNCwgVENBX0hIRl9CQUNLTE9HX0xJTUlULCAmbGltaXQsCisJCQkgIHNpemVvZihsaW1pdCkpOworCWlmIChxdWFudHVtKQorCQlhZGRhdHRyX2wobiwgMTAyNCwgVENBX0hIRl9RVUFOVFVNLCAmcXVhbnR1bSwgc2l6ZW9mKHF1YW50dW0pKTsKKwlpZiAoaGhfbGltaXQpCisJCWFkZGF0dHJfbChuLCAxMDI0LCBUQ0FfSEhGX0hIX0ZMT1dTX0xJTUlULCAmaGhfbGltaXQsCisJCQkgIHNpemVvZihoaF9saW1pdCkpOworCWlmIChyZXNldF90aW1lb3V0KQorCQlhZGRhdHRyX2wobiwgMTAyNCwgVENBX0hIRl9SRVNFVF9USU1FT1VULCAmcmVzZXRfdGltZW91dCwKKwkJCSAgc2l6ZW9mKHJlc2V0X3RpbWVvdXQpKTsKKwlpZiAoYWRtaXRfYnl0ZXMpCisJCWFkZGF0dHJfbChuLCAxMDI0LCBUQ0FfSEhGX0FETUlUX0JZVEVTLCAmYWRtaXRfYnl0ZXMsCisJCQkgIHNpemVvZihhZG1pdF9ieXRlcykpOworCWlmIChldmljdF90aW1lb3V0KQorCQlhZGRhdHRyX2wobiwgMTAyNCwgVENBX0hIRl9FVklDVF9USU1FT1VULCAmZXZpY3RfdGltZW91dCwKKwkJCSAgc2l6ZW9mKGV2aWN0X3RpbWVvdXQpKTsKKwlpZiAobm9uX2hoX3dlaWdodCkKKwkJYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9ISEZfTk9OX0hIX1dFSUdIVCwgJm5vbl9oaF93ZWlnaHQsCisJCQkgIHNpemVvZihub25faGhfd2VpZ2h0KSk7CisJdGFpbC0+cnRhX2xlbiA9ICh2b2lkICopIE5MTVNHX1RBSUwobikgLSAodm9pZCAqKSB0YWlsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhoZl9wcmludF9vcHQoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBGSUxFICpmLCBzdHJ1Y3QgcnRhdHRyICpvcHQpCit7CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX0hIRl9NQVggKyAxXTsKKwl1bnNpZ25lZCBsaW1pdDsKKwl1bnNpZ25lZCBxdWFudHVtOworCXVuc2lnbmVkIGhoX2xpbWl0OworCXVuc2lnbmVkIHJlc2V0X3RpbWVvdXQ7CisJdW5zaWduZWQgYWRtaXRfYnl0ZXM7CisJdW5zaWduZWQgZXZpY3RfdGltZW91dDsKKwl1bnNpZ25lZCBub25faGhfd2VpZ2h0OworCVNQUklOVF9CVUYoYjEpOworCisJaWYgKG9wdCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXBhcnNlX3J0YXR0cl9uZXN0ZWQodGIsIFRDQV9ISEZfTUFYLCBvcHQpOworCisJaWYgKHRiW1RDQV9ISEZfQkFDS0xPR19MSU1JVF0gJiYKKwkgICAgUlRBX1BBWUxPQUQodGJbVENBX0hIRl9CQUNLTE9HX0xJTUlUXSkgPj0gc2l6ZW9mKF9fdTMyKSkgeworCQlsaW1pdCA9IHJ0YV9nZXRhdHRyX3UzMih0YltUQ0FfSEhGX0JBQ0tMT0dfTElNSVRdKTsKKwkJZnByaW50ZihmLCAibGltaXQgJXVwICIsIGxpbWl0KTsKKwl9CisJaWYgKHRiW1RDQV9ISEZfUVVBTlRVTV0gJiYKKwkgICAgUlRBX1BBWUxPQUQodGJbVENBX0hIRl9RVUFOVFVNXSkgPj0gc2l6ZW9mKF9fdTMyKSkgeworCQlxdWFudHVtID0gcnRhX2dldGF0dHJfdTMyKHRiW1RDQV9ISEZfUVVBTlRVTV0pOworCQlmcHJpbnRmKGYsICJxdWFudHVtICV1ICIsIHF1YW50dW0pOworCX0KKwlpZiAodGJbVENBX0hIRl9ISF9GTE9XU19MSU1JVF0gJiYKKwkgICAgUlRBX1BBWUxPQUQodGJbVENBX0hIRl9ISF9GTE9XU19MSU1JVF0pID49IHNpemVvZihfX3UzMikpIHsKKwkJaGhfbGltaXQgPSBydGFfZ2V0YXR0cl91MzIodGJbVENBX0hIRl9ISF9GTE9XU19MSU1JVF0pOworCQlmcHJpbnRmKGYsICJoaF9saW1pdCAldSAiLCBoaF9saW1pdCk7CisJfQorCWlmICh0YltUQ0FfSEhGX1JFU0VUX1RJTUVPVVRdICYmCisJICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9ISEZfUkVTRVRfVElNRU9VVF0pID49IHNpemVvZihfX3UzMikpIHsKKwkJcmVzZXRfdGltZW91dCA9IHJ0YV9nZXRhdHRyX3UzMih0YltUQ0FfSEhGX1JFU0VUX1RJTUVPVVRdKTsKKwkJZnByaW50ZihmLCAicmVzZXRfdGltZW91dCAlcyAiLCBzcHJpbnRfdGltZShyZXNldF90aW1lb3V0LCBiMSkpOworCX0KKwlpZiAodGJbVENBX0hIRl9BRE1JVF9CWVRFU10gJiYKKwkgICAgUlRBX1BBWUxPQUQodGJbVENBX0hIRl9BRE1JVF9CWVRFU10pID49IHNpemVvZihfX3UzMikpIHsKKwkJYWRtaXRfYnl0ZXMgPSBydGFfZ2V0YXR0cl91MzIodGJbVENBX0hIRl9BRE1JVF9CWVRFU10pOworCQlmcHJpbnRmKGYsICJhZG1pdF9ieXRlcyAldSAiLCBhZG1pdF9ieXRlcyk7CisJfQorCWlmICh0YltUQ0FfSEhGX0VWSUNUX1RJTUVPVVRdICYmCisJICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9ISEZfRVZJQ1RfVElNRU9VVF0pID49IHNpemVvZihfX3UzMikpIHsKKwkJZXZpY3RfdGltZW91dCA9IHJ0YV9nZXRhdHRyX3UzMih0YltUQ0FfSEhGX0VWSUNUX1RJTUVPVVRdKTsKKwkJZnByaW50ZihmLCAiZXZpY3RfdGltZW91dCAlcyAiLCBzcHJpbnRfdGltZShldmljdF90aW1lb3V0LCBiMSkpOworCX0KKwlpZiAodGJbVENBX0hIRl9OT05fSEhfV0VJR0hUXSAmJgorCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfSEhGX05PTl9ISF9XRUlHSFRdKSA+PSBzaXplb2YoX191MzIpKSB7CisJCW5vbl9oaF93ZWlnaHQgPSBydGFfZ2V0YXR0cl91MzIodGJbVENBX0hIRl9OT05fSEhfV0VJR0hUXSk7CisJCWZwcmludGYoZiwgIm5vbl9oaF93ZWlnaHQgJXUgIiwgbm9uX2hoX3dlaWdodCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhoZl9wcmludF94c3RhdHMoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBGSUxFICpmLAorCQkJICAgIHN0cnVjdCBydGF0dHIgKnhzdGF0cykKK3sKKwlzdHJ1Y3QgdGNfaGhmX3hzdGF0cyAqc3Q7CisKKwlpZiAoeHN0YXRzID09IE5VTEwpCisJCXJldHVybiAwOworCisJaWYgKFJUQV9QQVlMT0FEKHhzdGF0cykgPCBzaXplb2YoKnN0KSkKKwkJcmV0dXJuIC0xOworCisJc3QgPSBSVEFfREFUQSh4c3RhdHMpOworCisJZnByaW50ZihmLCAiICBkcm9wX292ZXJsaW1pdCAldSBoaF9vdmVybGltaXQgJXUgdG90X2hoICV1IGN1cl9oaCAldSIsCisJCXN0LT5kcm9wX292ZXJsaW1pdCwgc3QtPmhoX292ZXJsaW1pdCwKKwkJc3QtPmhoX3RvdF9jb3VudCwgc3QtPmhoX2N1cl9jb3VudCk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBxZGlzY191dGlsIGhoZl9xZGlzY191dGlsID0geworCS5pZAkJPSAiaGhmIiwKKwkucGFyc2VfcW9wdAk9IGhoZl9wYXJzZV9vcHQsCisJLnByaW50X3FvcHQJPSBoaGZfcHJpbnRfb3B0LAorCS5wcmludF94c3RhdHMJPSBoaGZfcHJpbnRfeHN0YXRzLAorfTsKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RjL3FfaHRiLmMgYi9pcHJvdXRlMi90Yy9xX2h0Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNzVhNGMKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy9xX2h0Yi5jCkBAIC0wLDAgKzEsMzc2IEBACisvKgorICogcV9odGIuYwkJSFRCLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CU1hcnRpbiBEZXZlcmEsIGRldmlrQGNkaS5jegorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInRjX3V0aWwuaCIKKworI2RlZmluZSBIVEJfVENfVkVSIDB4MzAwMDMKKyNpZiBIVEJfVENfVkVSID4+IDE2ICE9IFRDX0hUQl9QUk9UT1ZFUgorI2Vycm9yICJEaWZmZXJlbnQga2VybmVsIGFuZCBUQyBIVEIgdmVyc2lvbnMiCisjZW5kaWYKKworc3RhdGljIHZvaWQgZXhwbGFpbih2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IC4uLiBxZGlzYyBhZGQgLi4uIGh0YiBbZGVmYXVsdCBOXSBbcjJxIE5dXG4iCisJCSIgICAgICAgICAgICAgICAgICAgICAgW2RpcmVjdF9xbGVuIFBdXG4iCisJCSIgZGVmYXVsdCAgbWlub3IgaWQgb2YgY2xhc3MgdG8gd2hpY2ggdW5jbGFzc2lmaWVkIHBhY2tldHMgYXJlIHNlbnQgezB9XG4iCisJCSIgcjJxICAgICAgRFJSIHF1YW50dW1zIGFyZSBjb21wdXRlZCBhcyByYXRlIGluIEJwcy9yMnEgezEwfVxuIgorCQkiIGRlYnVnICAgIHN0cmluZyBvZiAxNiBudW1iZXJzIGVhY2ggMC0zIHswfVxuXG4iCisJCSIgZGlyZWN0X3FsZW4gIExpbWl0IG9mIHRoZSBkaXJlY3QgcXVldWUge2luIHBhY2tldHN9XG4iCisJCSIuLi4gY2xhc3MgYWRkIC4uLiBodGIgcmF0ZSBSMSBbYnVyc3QgQjFdIFttcHUgQl0gW292ZXJoZWFkIE9dXG4iCisJCSIgICAgICAgICAgICAgICAgICAgICAgW3ByaW8gUF0gW3Nsb3QgU10gW3BzbG90IFBTXVxuIgorCQkiICAgICAgICAgICAgICAgICAgICAgIFtjZWlsIFIyXSBbY2J1cnN0IEIyXSBbbXR1IE1UVV0gW3F1YW50dW0gUV1cbiIKKwkJIiByYXRlICAgICByYXRlIGFsbG9jYXRlZCB0byB0aGlzIGNsYXNzIChjbGFzcyBjYW4gc3RpbGwgYm9ycm93KVxuIgorCQkiIGJ1cnN0ICAgIG1heCBieXRlcyBidXJzdCB3aGljaCBjYW4gYmUgYWNjdW11bGF0ZWQgZHVyaW5nIGlkbGUgcGVyaW9kIHtjb21wdXRlZH1cbiIKKwkJIiBtcHUgICAgICBtaW5pbXVtIHBhY2tldCBzaXplIHVzZWQgaW4gcmF0ZSBjb21wdXRhdGlvbnNcbiIKKwkJIiBvdmVyaGVhZCBwZXItcGFja2V0IHNpemUgb3ZlcmhlYWQgdXNlZCBpbiByYXRlIGNvbXB1dGF0aW9uc1xuIgorCQkiIGxpbmtsYXkgIGFkYXB0aW5nIHRvIGEgbGlua2xheWVyIGUuZy4gYXRtXG4iCisJCSIgY2VpbCAgICAgZGVmaW5pdGUgdXBwZXIgY2xhc3MgcmF0ZSAobm8gYm9ycm93cykge3JhdGV9XG4iCisJCSIgY2J1cnN0ICAgYnVyc3QgYnV0IGZvciBjZWlsIHtjb21wdXRlZH1cbiIKKwkJIiBtdHUgICAgICBtYXggcGFja2V0IHNpemUgd2UgY3JlYXRlIHJhdGUgbWFwIGZvciB7MTYwMH1cbiIKKwkJIiBwcmlvICAgICBwcmlvcml0eSBvZiBsZWFmOyBsb3dlciBhcmUgc2VydmVkIGZpcnN0IHswfVxuIgorCQkiIHF1YW50dW0gIGhvdyBtdWNoIGJ5dGVzIHRvIHNlcnZlIGZyb20gbGVhZiBhdCBvbmNlIHt1c2UgcjJxfVxuIgorCQkiXG5UQyBIVEIgdmVyc2lvbiAlZC4lZFxuIixIVEJfVENfVkVSPj4xNixIVEJfVENfVkVSJjB4ZmZmZgorCQkpOworfQorCitzdGF0aWMgdm9pZCBleHBsYWluMShjaGFyICphcmcpCit7CisgICAgZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwiJXNcIlxuIiwgYXJnKTsKKyAgICBleHBsYWluKCk7Cit9CisKKworc3RhdGljIGludCBodGJfcGFyc2Vfb3B0KHN0cnVjdCBxZGlzY191dGlsICpxdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJdW5zaWduZWQgaW50IGRpcmVjdF9xbGVuID0gfjBVOworCXN0cnVjdCB0Y19odGJfZ2xvYiBvcHQ7CisJc3RydWN0IHJ0YXR0ciAqdGFpbDsKKwl1bnNpZ25lZCBpOyBjaGFyICpwOworCW1lbXNldCgmb3B0LDAsc2l6ZW9mKG9wdCkpOworCW9wdC5yYXRlMnF1YW50dW0gPSAxMDsKKwlvcHQudmVyc2lvbiA9IDM7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJyMnEiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJm9wdC5yYXRlMnF1YW50dW0sICphcmd2LCAxMCkpIHsKKwkJCQlleHBsYWluMSgicjJxIik7IHJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiZGVmYXVsdCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmb3B0LmRlZmNscywgKmFyZ3YsIDE2KSkgeworCQkJCWV4cGxhaW4xKCJkZWZhdWx0Iik7IHJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiZGVidWciKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOyBwID0gKmFyZ3Y7CisJCQlmb3IgKGk9MDsgaTwxNjsgaSsrLHArKykgeworCQkJCWlmICgqcDwnMCcgfHwgKnA+JzMnKSBicmVhazsKKwkJCQlvcHQuZGVidWcgfD0gKCpwLScwJyk8PCgyKmkpOworCQkJfQorCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJkaXJlY3RfcWxlbiIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmZGlyZWN0X3FsZW4sICphcmd2LCAxMCkpIHsKKwkJCQlleHBsYWluMSgiZGlyZWN0X3FsZW4iKTsgcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJXaGF0IGlzIFwiJXNcIj9cbiIsICphcmd2KTsKKwkJCWV4cGxhaW4oKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisJdGFpbCA9IE5MTVNHX1RBSUwobik7CisJYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9PUFRJT05TLCBOVUxMLCAwKTsKKwlhZGRhdHRyX2wobiwgMjAyNCwgVENBX0hUQl9JTklULCAmb3B0LCBOTE1TR19BTElHTihzaXplb2Yob3B0KSkpOworCWlmIChkaXJlY3RfcWxlbiAhPSB+MFUpCisJCWFkZGF0dHJfbChuLCAyMDI0LCBUQ0FfSFRCX0RJUkVDVF9RTEVOLAorCQkJICAmZGlyZWN0X3FsZW4sIHNpemVvZihkaXJlY3RfcWxlbikpOworCXRhaWwtPnJ0YV9sZW4gPSAodm9pZCAqKSBOTE1TR19UQUlMKG4pIC0gKHZvaWQgKikgdGFpbDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBodGJfcGFyc2VfY2xhc3Nfb3B0KHN0cnVjdCBxZGlzY191dGlsICpxdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJaW50IG9rPTA7CisJc3RydWN0IHRjX2h0Yl9vcHQgb3B0OworCV9fdTMyIHJ0YWJbMjU2XSxjdGFiWzI1Nl07CisJdW5zaWduZWQgYnVmZmVyPTAsY2J1ZmZlcj0wOworCWludCBjZWxsX2xvZz0tMSxjY2VsbF9sb2cgPSAtMTsKKwl1bnNpZ25lZCBtdHU7CisJdW5zaWduZWQgc2hvcnQgbXB1ID0gMDsKKwl1bnNpZ25lZCBzaG9ydCBvdmVyaGVhZCA9IDA7CisJdW5zaWduZWQgaW50IGxpbmtsYXllciAgPSBMSU5LTEFZRVJfRVRIRVJORVQ7IC8qIEFzc3VtZSBldGhlcm5ldCAqLworCXN0cnVjdCBydGF0dHIgKnRhaWw7CisJX191NjQgY2VpbDY0ID0gMCwgcmF0ZTY0ID0gMDsKKworCW1lbXNldCgmb3B0LCAwLCBzaXplb2Yob3B0KSk7IG10dSA9IDE2MDA7IC8qIGV0aCBwYWNrZXQgbGVuICovCisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJwcmlvIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTMyKCZvcHQucHJpbywgKmFyZ3YsIDEwKSkgeworCQkJCWV4cGxhaW4xKCJwcmlvIik7IHJldHVybiAtMTsKKwkJCX0KKwkJCW9rKys7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgIm10dSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmbXR1LCAqYXJndiwgMTApKSB7CisJCQkJZXhwbGFpbjEoIm10dSIpOyByZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgIm1wdSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UxNigmbXB1LCAqYXJndiwgMTApKSB7CisJCQkJZXhwbGFpbjEoIm1wdSIpOyByZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgIm92ZXJoZWFkIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTE2KCZvdmVyaGVhZCwgKmFyZ3YsIDEwKSkgeworCQkJCWV4cGxhaW4xKCJvdmVyaGVhZCIpOyByZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImxpbmtsYXllciIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X2xpbmtsYXllcigmbGlua2xheWVyLCAqYXJndikpIHsKKwkJCQlleHBsYWluMSgibGlua2xheWVyIik7IHJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAicXVhbnR1bSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmb3B0LnF1YW50dW0sICphcmd2LCAxMCkpIHsKKwkJCQlleHBsYWluMSgicXVhbnR1bSIpOyByZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImJ1cnN0IikgPT0gMCB8fAorCQkJICAgc3RyY21wKCphcmd2LCAiYnVmZmVyIikgPT0gMCB8fAorCQkJICAgc3RyY21wKCphcmd2LCAibWF4YnVyc3QiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9zaXplX2FuZF9jZWxsKCZidWZmZXIsICZjZWxsX2xvZywgKmFyZ3YpIDwgMCkgeworCQkJCWV4cGxhaW4xKCJidWZmZXIiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlvaysrOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJjYnVyc3QiKSA9PSAwIHx8CisJCQkgICBzdHJjbXAoKmFyZ3YsICJjYnVmZmVyIikgPT0gMCB8fAorCQkJICAgc3RyY21wKCphcmd2LCAiY21heGJ1cnN0IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfc2l6ZV9hbmRfY2VsbCgmY2J1ZmZlciwgJmNjZWxsX2xvZywgKmFyZ3YpIDwgMCkgeworCQkJCWV4cGxhaW4xKCJjYnVmZmVyIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJb2srKzsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJjZWlsIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChjZWlsNjQpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkRvdWJsZSBcImNlaWxcIiBzcGVjXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAoZ2V0X3JhdGU2NCgmY2VpbDY0LCAqYXJndikpIHsKKwkJCQlleHBsYWluMSgiY2VpbCIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCW9rKys7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAicmF0ZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocmF0ZTY0KSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJEb3VibGUgXCJyYXRlXCIgc3BlY1xuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKGdldF9yYXRlNjQoJnJhdGU2NCwgKmFyZ3YpKSB7CisJCQkJZXhwbGFpbjEoInJhdGUiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlvaysrOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImhlbHAiKSA9PSAwKSB7CisJCQlleHBsYWluKCk7CisJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIldoYXQgaXMgXCIlc1wiP1xuIiwgKmFyZ3YpOworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCS8qCWlmICghb2spCisJCXJldHVybiAwOyovCisKKwlpZiAoIXJhdGU2NCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlwicmF0ZVwiIGlzIHJlcXVpcmVkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJLyogaWYgY2VpbCBwYXJhbXMgYXJlIG1pc3NpbmcsIHVzZSB0aGUgc2FtZSBhcyByYXRlICovCisJaWYgKCFjZWlsNjQpCisJCWNlaWw2NCA9IHJhdGU2NDsKKworCW9wdC5yYXRlLnJhdGUgPSAocmF0ZTY0ID49ICgxVUxMIDw8IDMyKSkgPyB+MFUgOiByYXRlNjQ7CisJb3B0LmNlaWwucmF0ZSA9IChjZWlsNjQgPj0gKDFVTEwgPDwgMzIpKSA/IH4wVSA6IGNlaWw2NDsKKworCS8qIGNvbXB1dGUgbWluaW1hbCBhbGxvd2VkIGJ1cnN0IGZyb20gcmF0ZTsgbXR1IGlzIGFkZGVkIGhlcmUgdG8gbWFrZQorCSAgIHN1dGUgdGhhdCBidWZmZXIgaXMgbGFyZ2VyIHRoYW4gbXR1IGFuZCB0byBoYXZlIHNvbWUgc2FmZWd1YXJkIHNwYWNlICovCisJaWYgKCFidWZmZXIpCisJCWJ1ZmZlciA9IHJhdGU2NCAvIGdldF9oeigpICsgbXR1OworCWlmICghY2J1ZmZlcikKKwkJY2J1ZmZlciA9IGNlaWw2NCAvIGdldF9oeigpICsgbXR1OworCisJb3B0LmNlaWwub3ZlcmhlYWQgPSBvdmVyaGVhZDsKKwlvcHQucmF0ZS5vdmVyaGVhZCA9IG92ZXJoZWFkOworCisJb3B0LmNlaWwubXB1ID0gbXB1OworCW9wdC5yYXRlLm1wdSA9IG1wdTsKKworCWlmICh0Y19jYWxjX3J0YWJsZSgmb3B0LnJhdGUsIHJ0YWIsIGNlbGxfbG9nLCBtdHUsIGxpbmtsYXllcikgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiaHRiOiBmYWlsZWQgdG8gY2FsY3VsYXRlIHJhdGUgdGFibGUuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlvcHQuYnVmZmVyID0gdGNfY2FsY194bWl0dGltZShyYXRlNjQsIGJ1ZmZlcik7CisKKwlpZiAodGNfY2FsY19ydGFibGUoJm9wdC5jZWlsLCBjdGFiLCBjY2VsbF9sb2csIG10dSwgbGlua2xheWVyKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJodGI6IGZhaWxlZCB0byBjYWxjdWxhdGUgY2VpbCByYXRlIHRhYmxlLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJb3B0LmNidWZmZXIgPSB0Y19jYWxjX3htaXR0aW1lKGNlaWw2NCwgY2J1ZmZlcik7CisKKwl0YWlsID0gTkxNU0dfVEFJTChuKTsKKwlhZGRhdHRyX2wobiwgMTAyNCwgVENBX09QVElPTlMsIE5VTEwsIDApOworCisJaWYgKHJhdGU2NCA+PSAoMVVMTCA8PCAzMikpCisJCWFkZGF0dHJfbChuLCAxMTI0LCBUQ0FfSFRCX1JBVEU2NCwgJnJhdGU2NCwgc2l6ZW9mKHJhdGU2NCkpOworCisJaWYgKGNlaWw2NCA+PSAoMVVMTCA8PCAzMikpCisJCWFkZGF0dHJfbChuLCAxMjI0LCBUQ0FfSFRCX0NFSUw2NCwgJmNlaWw2NCwgc2l6ZW9mKGNlaWw2NCkpOworCisJYWRkYXR0cl9sKG4sIDIwMjQsIFRDQV9IVEJfUEFSTVMsICZvcHQsIHNpemVvZihvcHQpKTsKKwlhZGRhdHRyX2wobiwgMzAyNCwgVENBX0hUQl9SVEFCLCBydGFiLCAxMDI0KTsKKwlhZGRhdHRyX2wobiwgNDAyNCwgVENBX0hUQl9DVEFCLCBjdGFiLCAxMDI0KTsKKwl0YWlsLT5ydGFfbGVuID0gKHZvaWQgKikgTkxNU0dfVEFJTChuKSAtICh2b2lkICopIHRhaWw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHRiX3ByaW50X29wdChzdHJ1Y3QgcWRpc2NfdXRpbCAqcXUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKm9wdCkKK3sKKwlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfSFRCX01BWCArIDFdOworCXN0cnVjdCB0Y19odGJfb3B0ICpob3B0OworCXN0cnVjdCB0Y19odGJfZ2xvYiAqZ29wdDsKKwlkb3VibGUgYnVmZmVyLGNidWZmZXI7CisJdW5zaWduZWQgaW50IGxpbmtsYXllcjsKKwlfX3U2NCByYXRlNjQsIGNlaWw2NDsKKwlTUFJJTlRfQlVGKGIxKTsKKwlTUFJJTlRfQlVGKGIyKTsKKwlTUFJJTlRfQlVGKGIzKTsKKwlTUFJJTlRfQlVGKGI0KTsKKworCWlmIChvcHQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlwYXJzZV9ydGF0dHJfbmVzdGVkKHRiLCBUQ0FfSFRCX01BWCwgb3B0KTsKKworCWlmICh0YltUQ0FfSFRCX1BBUk1TXSkgeworCQlob3B0ID0gUlRBX0RBVEEodGJbVENBX0hUQl9QQVJNU10pOworCQlpZiAoUlRBX1BBWUxPQUQodGJbVENBX0hUQl9QQVJNU10pICA8IHNpemVvZigqaG9wdCkpIHJldHVybiAtMTsKKworCQlpZiAoIWhvcHQtPmxldmVsKSB7CisJCQlmcHJpbnRmKGYsICJwcmlvICVkICIsIChpbnQpaG9wdC0+cHJpbyk7CisJCQlpZiAoc2hvd19kZXRhaWxzKQorCQkJCWZwcmludGYoZiwgInF1YW50dW0gJWQgIiwgKGludClob3B0LT5xdWFudHVtKTsKKwkJfQorCisJCXJhdGU2NCA9IGhvcHQtPnJhdGUucmF0ZTsKKwkJaWYgKHRiW1RDQV9IVEJfUkFURTY0XSAmJgorCQkgICAgUlRBX1BBWUxPQUQodGJbVENBX0hUQl9SQVRFNjRdKSA+PSBzaXplb2YocmF0ZTY0KSkgeworCQkJcmF0ZTY0ID0gcnRhX2dldGF0dHJfdTY0KHRiW1RDQV9IVEJfUkFURTY0XSk7CisJCX0KKworCQljZWlsNjQgPSBob3B0LT5jZWlsLnJhdGU7CisJCWlmICh0YltUQ0FfSFRCX0NFSUw2NF0gJiYKKwkJICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9IVEJfQ0VJTDY0XSkgPj0gc2l6ZW9mKGNlaWw2NCkpCisJCQljZWlsNjQgPSBydGFfZ2V0YXR0cl91NjQodGJbVENBX0hUQl9DRUlMNjRdKTsKKworCQlmcHJpbnRmKGYsICJyYXRlICVzICIsIHNwcmludF9yYXRlKHJhdGU2NCwgYjEpKTsKKwkJaWYgKGhvcHQtPnJhdGUub3ZlcmhlYWQpCisJCQlmcHJpbnRmKGYsICJvdmVyaGVhZCAldSAiLCBob3B0LT5yYXRlLm92ZXJoZWFkKTsKKwkJYnVmZmVyID0gdGNfY2FsY194bWl0c2l6ZShyYXRlNjQsIGhvcHQtPmJ1ZmZlcik7CisKKwkJZnByaW50ZihmLCAiY2VpbCAlcyAiLCBzcHJpbnRfcmF0ZShjZWlsNjQsIGIxKSk7CisJCWNidWZmZXIgPSB0Y19jYWxjX3htaXRzaXplKGNlaWw2NCwgaG9wdC0+Y2J1ZmZlcik7CisJCWxpbmtsYXllciA9IChob3B0LT5yYXRlLmxpbmtsYXllciAmIFRDX0xJTktMQVlFUl9NQVNLKTsKKwkJaWYgKGxpbmtsYXllciA+IFRDX0xJTktMQVlFUl9FVEhFUk5FVCB8fCBzaG93X2RldGFpbHMpCisJCQlmcHJpbnRmKGYsICJsaW5rbGF5ZXIgJXMgIiwgc3ByaW50X2xpbmtsYXllcihsaW5rbGF5ZXIsIGI0KSk7CisJCWlmIChzaG93X2RldGFpbHMpIHsKKwkJCWZwcmludGYoZiwgImJ1cnN0ICVzLyV1IG1wdSAlcyBvdmVyaGVhZCAlcyAiLAorCQkJCXNwcmludF9zaXplKGJ1ZmZlciwgYjEpLAorCQkJCTE8PGhvcHQtPnJhdGUuY2VsbF9sb2csCisJCQkJc3ByaW50X3NpemUoaG9wdC0+cmF0ZS5tcHUmMHhGRiwgYjIpLAorCQkJCXNwcmludF9zaXplKChob3B0LT5yYXRlLm1wdT4+OCkmMHhGRiwgYjMpKTsKKwkJCWZwcmludGYoZiwgImNidXJzdCAlcy8ldSBtcHUgJXMgb3ZlcmhlYWQgJXMgIiwKKwkJCQlzcHJpbnRfc2l6ZShjYnVmZmVyLCBiMSksCisJCQkJMTw8aG9wdC0+Y2VpbC5jZWxsX2xvZywKKwkJCQlzcHJpbnRfc2l6ZShob3B0LT5jZWlsLm1wdSYweEZGLCBiMiksCisJCQkJc3ByaW50X3NpemUoKGhvcHQtPmNlaWwubXB1Pj44KSYweEZGLCBiMykpOworCQkJZnByaW50ZihmLCAibGV2ZWwgJWQgIiwgKGludClob3B0LT5sZXZlbCk7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKGYsICJidXJzdCAlcyAiLCBzcHJpbnRfc2l6ZShidWZmZXIsIGIxKSk7CisJCQlmcHJpbnRmKGYsICJjYnVyc3QgJXMgIiwgc3ByaW50X3NpemUoY2J1ZmZlciwgYjEpKTsKKwkJfQorCQlpZiAoc2hvd19yYXcpCisJCQlmcHJpbnRmKGYsICJidWZmZXIgWyUwOHhdIGNidWZmZXIgWyUwOHhdICIsCisJCQkJaG9wdC0+YnVmZmVyLGhvcHQtPmNidWZmZXIpOworCX0KKwlpZiAodGJbVENBX0hUQl9JTklUXSkgeworCQlnb3B0ID0gUlRBX0RBVEEodGJbVENBX0hUQl9JTklUXSk7CisJCWlmIChSVEFfUEFZTE9BRCh0YltUQ0FfSFRCX0lOSVRdKSAgPCBzaXplb2YoKmdvcHQpKSByZXR1cm4gLTE7CisKKwkJZnByaW50ZihmLCAicjJxICVkIGRlZmF1bHQgJXggZGlyZWN0X3BhY2tldHNfc3RhdCAldSIsCisJCQlnb3B0LT5yYXRlMnF1YW50dW0sZ29wdC0+ZGVmY2xzLGdvcHQtPmRpcmVjdF9wa3RzKTsKKwkJaWYgKHNob3dfZGV0YWlscykKKwkJCWZwcmludGYoZiwiIHZlciAlZC4lZCIsZ29wdC0+dmVyc2lvbiA+PiAxNixnb3B0LT52ZXJzaW9uICYgMHhmZmZmKTsKKwl9CisJaWYgKHRiW1RDQV9IVEJfRElSRUNUX1FMRU5dICYmCisJICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9IVEJfRElSRUNUX1FMRU5dKSA+PSBzaXplb2YoX191MzIpKSB7CisJCV9fdTMyIGRpcmVjdF9xbGVuID0gcnRhX2dldGF0dHJfdTMyKHRiW1RDQV9IVEJfRElSRUNUX1FMRU5dKTsKKworCQlmcHJpbnRmKGYsICIgZGlyZWN0X3FsZW4gJXUiLCBkaXJlY3RfcWxlbik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGh0Yl9wcmludF94c3RhdHMoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBGSUxFICpmLCBzdHJ1Y3QgcnRhdHRyICp4c3RhdHMpCit7CisJc3RydWN0IHRjX2h0Yl94c3RhdHMgKnN0OworCWlmICh4c3RhdHMgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoUlRBX1BBWUxPQUQoeHN0YXRzKSA8IHNpemVvZigqc3QpKQorCQlyZXR1cm4gLTE7CisKKwlzdCA9IFJUQV9EQVRBKHhzdGF0cyk7CisJZnByaW50ZihmLCAiIGxlbmRlZDogJXUgYm9ycm93ZWQ6ICV1IGdpYW50czogJXVcbiIsCisJCXN0LT5sZW5kcyxzdC0+Ym9ycm93cyxzdC0+Z2lhbnRzKTsKKwlmcHJpbnRmKGYsICIgdG9rZW5zOiAlZCBjdG9rZW5zOiAlZFxuIiwgc3QtPnRva2VucyxzdC0+Y3Rva2Vucyk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBxZGlzY191dGlsIGh0Yl9xZGlzY191dGlsID0geworCS5pZCAJCT0gImh0YiIsCisJLnBhcnNlX3FvcHQJPSBodGJfcGFyc2Vfb3B0LAorCS5wcmludF9xb3B0CT0gaHRiX3ByaW50X29wdCwKKwkucHJpbnRfeHN0YXRzIAk9IGh0Yl9wcmludF94c3RhdHMsCisJLnBhcnNlX2NvcHQJPSBodGJfcGFyc2VfY2xhc3Nfb3B0LAorCS5wcmludF9jb3B0CT0gaHRiX3ByaW50X29wdCwKK307CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy9xX2luZ3Jlc3MuYyBiL2lwcm91dGUyL3RjL3FfaW5ncmVzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYzliNDAKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy9xX2luZ3Jlc3MuYwpAQCAtMCwwICsxLDUyIEBACisvKgorICogcV9pbmdyZXNzLmMgICAgICAgICAgICAgSU5HUkVTUy4KKyAqCisgKiAgICAgICAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICAgICAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgICAgICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgICAgICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOiAgICBKIEhhZGkgU2FsaW0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAidGNfdXRpbC5oIgorCitzdGF0aWMgdm9pZCBleHBsYWluKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogLi4uIGluZ3Jlc3NcbiIpOworfQorCitzdGF0aWMgaW50IGluZ3Jlc3NfcGFyc2Vfb3B0KHN0cnVjdCBxZGlzY191dGlsICpxdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCQkJICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChzdHJjbXAoKmFyZ3YsICJoYW5kbGUiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJYXJnYy0tOyBhcmd2Kys7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIldoYXQgaXMgXCIlc1wiP1xuIiwgKmFyZ3YpOworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9PUFRJT05TLCBOVUxMLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbmdyZXNzX3ByaW50X29wdChzdHJ1Y3QgcWRpc2NfdXRpbCAqcXUsIEZJTEUgKmYsCisJCQkgICAgIHN0cnVjdCBydGF0dHIgKm9wdCkKK3sKKwlmcHJpbnRmKGYsICItLS0tLS0tLS0tLS0tLS0tICIpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcWRpc2NfdXRpbCBpbmdyZXNzX3FkaXNjX3V0aWwgPSB7CisJLmlkCQk9ICJpbmdyZXNzIiwKKwkucGFyc2VfcW9wdAk9IGluZ3Jlc3NfcGFyc2Vfb3B0LAorCS5wcmludF9xb3B0CT0gaW5ncmVzc19wcmludF9vcHQsCit9OwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvcV9tcXByaW8uYyBiL2lwcm91dGUyL3RjL3FfbXFwcmlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmExMDIyYgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL3FfbXFwcmlvLmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBxX21xcHJpby5jCU1RIHByaW8gcWRpc2MKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3I6CUpvaG4gRmFzdGFiZW5kLCA8am9obi5yLmZhc3RhYmVuZEBpbnRlbC5jb20+CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0Y191dGlsLmgiCisKK3N0YXRpYyB2b2lkIGV4cGxhaW4odm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAuLi4gbXFwcmlvIFtudW1fdGMgTlVNQkVSXSBbbWFwIFAwIFAxIC4uLl1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgICAgW3F1ZXVlcyBjb3VudDFAb2Zmc2V0MSBjb3VudDJAb2Zmc2V0MiAuLi5dICIpOworCWZwcmludGYoc3RkZXJyLCAiW2h3IDF8MF1cbiIpOworfQorCitzdGF0aWMgaW50IG1xcHJpb19wYXJzZV9vcHQoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBpbnQgYXJnYywKKwkJCSAgICBjaGFyICoqYXJndiwgc3RydWN0IG5sbXNnaGRyICpuKQoreworCWludCBpZHg7CisJc3RydWN0IHRjX21xcHJpb19xb3B0IG9wdCA9IHsKKwkJCQkgICAgIDgsCisJCQkJICAgICB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgMCwgMSwgMSwgMSwgMywgMywgMywgM30sCisJCQkJICAgICAxLAorCQkJCSAgICB9OworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlkeCA9IDA7CisJCWlmIChzdHJjbXAoKmFyZ3YsICJudW1fdGMiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91OCgmb3B0Lm51bV90YywgKmFyZ3YsIDEwKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcIm51bV90Y1wiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibWFwIikgPT0gMCkgeworCQkJd2hpbGUgKGlkeCA8IFRDX1FPUFRfTUFYX1FVRVVFICYmIE5FWFRfQVJHX09LKCkpIHsKKwkJCQlORVhUX0FSRygpOworCQkJCWlmIChnZXRfdTgoJm9wdC5wcmlvX3RjX21hcFtpZHhdLCAqYXJndiwgMTApKSB7CisJCQkJCVBSRVZfQVJHKCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZHgrKzsKKwkJCX0KKwkJCWZvciAoIDsgaWR4IDwgVENfUU9QVF9NQVhfUVVFVUU7IGlkeCsrKQorCQkJCW9wdC5wcmlvX3RjX21hcFtpZHhdID0gMDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJxdWV1ZXMiKSA9PSAwKSB7CisJCQljaGFyICp0bXAsICp0b2s7CisKKwkJCXdoaWxlIChpZHggPCBUQ19RT1BUX01BWF9RVUVVRSAmJiBORVhUX0FSR19PSygpKSB7CisJCQkJTkVYVF9BUkcoKTsKKworCQkJCXRtcCA9IHN0cmR1cCgqYXJndik7CisJCQkJaWYgKCF0bXApCisJCQkJCWJyZWFrOworCisJCQkJdG9rID0gc3RydG9rKHRtcCwgIkAiKTsKKwkJCQlpZiAoZ2V0X3UxNigmb3B0LmNvdW50W2lkeF0sIHRvaywgMTApKSB7CisJCQkJCWZyZWUodG1wKTsKKwkJCQkJUFJFVl9BUkcoKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXRvayA9IHN0cnRvayhOVUxMLCAiQCIpOworCQkJCWlmIChnZXRfdTE2KCZvcHQub2Zmc2V0W2lkeF0sIHRvaywgMTApKSB7CisJCQkJCWZyZWUodG1wKTsKKwkJCQkJUFJFVl9BUkcoKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWZyZWUodG1wKTsKKwkJCQlpZHgrKzsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJodyIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3U4KCZvcHQuaHcsICphcmd2LCAxMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJod1wiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZHgrKzsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJVbmtub3duIGFyZ3VtZW50XG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisKKwlhZGRhdHRyX2wobiwgMTAyNCwgVENBX09QVElPTlMsICZvcHQsIHNpemVvZihvcHQpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtcXByaW9fcHJpbnRfb3B0KHN0cnVjdCBxZGlzY191dGlsICpxdSwgRklMRSAqZiwgc3RydWN0IHJ0YXR0ciAqb3B0KQoreworCWludCBpOworCXN0cnVjdCB0Y19tcXByaW9fcW9wdCAqcW9wdDsKKworCWlmIChvcHQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlxb3B0ID0gUlRBX0RBVEEob3B0KTsKKworCWZwcmludGYoZiwgIiB0YyAldSBtYXAgIiwgcW9wdC0+bnVtX3RjKTsKKwlmb3IgKGkgPSAwOyBpIDw9IFRDX1BSSU9fTUFYOyBpKyspCisJCWZwcmludGYoZiwgIiV1ICIsIHFvcHQtPnByaW9fdGNfbWFwW2ldKTsKKwlmcHJpbnRmKGYsICJcbiAgICAgICAgICAgICBxdWV1ZXM6Iik7CisJZm9yIChpID0gMDsgaSA8IHFvcHQtPm51bV90YzsgaSsrKQorCQlmcHJpbnRmKGYsICIoJXU6JXUpICIsIHFvcHQtPm9mZnNldFtpXSwKKwkJCXFvcHQtPm9mZnNldFtpXSArIHFvcHQtPmNvdW50W2ldIC0gMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBxZGlzY191dGlsIG1xcHJpb19xZGlzY191dGlsID0geworCS5pZAkJPSAibXFwcmlvIiwKKwkucGFyc2VfcW9wdAk9IG1xcHJpb19wYXJzZV9vcHQsCisJLnByaW50X3FvcHQJPSBtcXByaW9fcHJpbnRfb3B0LAorfTsKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RjL3FfbXVsdGlxLmMgYi9pcHJvdXRlMi90Yy9xX211bHRpcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZjQxZjcKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy9xX211bHRpcS5jCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBxX211bHRpcS5jCQlNdWx0aXF1ZXVlIGF3YXJlIHFkaXNjCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzPi4KKyAqCisgKiBBdXRob3I6IEFsZXhhbmRlciBEdXljayA8YWxleGFuZGVyLmguZHV5Y2tAaW50ZWwuY29tPgorICoKKyAqIE9yaWdpbmFsIEF1dGhvcnM6CVBKIFdhc2tpZXdpY3osIDxwZXRlci5wLndhc2tpZXdpY3ouanJAaW50ZWwuY29tPiAoUlIpCisgKgkJCUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4gKGZyb20gUFJJTykKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0Y191dGlsLmgiCisKK3N0YXRpYyB2b2lkIGV4cGxhaW4odm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAuLi4gbXVsdGlxIFtoZWxwXVxuIik7Cit9CisKK3N0YXRpYyBpbnQgbXVsdGlxX3BhcnNlX29wdChzdHJ1Y3QgcWRpc2NfdXRpbCAqcXUsIGludCBhcmdjLCBjaGFyICoqYXJndiwKKwkJCSAgICBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJc3RydWN0IHRjX211bHRpcV9xb3B0IG9wdDsKKworCWlmIChhcmdjKSB7CisJCWlmIChzdHJjbXAoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJXaGF0IGlzIFwiJXNcIj9cbiIsICphcmd2KTsKKwkJCWV4cGxhaW4oKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWFkZGF0dHJfbChuLCAxMDI0LCBUQ0FfT1BUSU9OUywgJm9wdCwgc2l6ZW9mKG9wdCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG11bHRpcV9wcmludF9vcHQoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBGSUxFICpmLCBzdHJ1Y3QgcnRhdHRyICpvcHQpCit7CisJc3RydWN0IHRjX211bHRpcV9xb3B0ICpxb3B0OworCisJaWYgKG9wdCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlpZiAoUlRBX1BBWUxPQUQob3B0KSA8IHNpemVvZigqcW9wdCkpCisJCXJldHVybiAwOworCisJcW9wdCA9IFJUQV9EQVRBKG9wdCk7CisKKwlmcHJpbnRmKGYsICJiYW5kcyAldS8ldSAiLCBxb3B0LT5iYW5kcywgcW9wdC0+bWF4X2JhbmRzKTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcWRpc2NfdXRpbCBtdWx0aXFfcWRpc2NfdXRpbCA9IHsKKwkuaWQJIAk9ICJtdWx0aXEiLAorCS5wYXJzZV9xb3B0CT0gbXVsdGlxX3BhcnNlX29wdCwKKwkucHJpbnRfcW9wdAk9IG11bHRpcV9wcmludF9vcHQsCit9OwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvcV9uZXRlbS5jIGIvaXByb3V0ZTIvdGMvcV9uZXRlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYzhjNmEKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy9xX25ldGVtLmMKQEAgLTAsMCArMSw2OTAgQEAKKy8qCisgKiBxX25ldGVtLmMJCU5FVEVNLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CVN0ZXBoZW4gSGVtbWluZ2VyIDxzaGVtbWluZ2VyQGxpbnV4LWZvdW5kYXRpb24ub3JnPgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAidGNfdXRpbC5oIgorI2luY2x1ZGUgInRjX2NvbW1vbi5oIgorCitzdGF0aWMgdm9pZCBleHBsYWluKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsCisiVXNhZ2U6IC4uLiBuZXRlbSBbIGxpbWl0IFBBQ0tFVFMgXSBcbiIgXAorIiAgICAgICAgICAgICAgICAgWyBkZWxheSBUSU1FIFsgSklUVEVSIFtDT1JSRUxBVElPTl1dXVxuIiBcCisiICAgICAgICAgICAgICAgICBbIGRpc3RyaWJ1dGlvbiB7dW5pZm9ybXxub3JtYWx8cGFyZXRvfHBhcmV0b25vcm1hbH0gXVxuIiBcCisiICAgICAgICAgICAgICAgICBbIGNvcnJ1cHQgUEVSQ0VOVCBbQ09SUkVMQVRJT05dXSBcbiIgXAorIiAgICAgICAgICAgICAgICAgWyBkdXBsaWNhdGUgUEVSQ0VOVCBbQ09SUkVMQVRJT05dXVxuIiBcCisiICAgICAgICAgICAgICAgICBbIGxvc3MgcmFuZG9tIFBFUkNFTlQgW0NPUlJFTEFUSU9OXV1cbiIgXAorIiAgICAgICAgICAgICAgICAgWyBsb3NzIHN0YXRlIFAxMyBbUDMxIFtQMzIgW1AyMyBQMTRdXV1cbiIgXAorIiAgICAgICAgICAgICAgICAgWyBsb3NzIGdlbW9kZWwgUEVSQ0VOVCBbUiBbMS1IIFsxLUtdXV1cbiIgXAorIiAgICAgICAgICAgICAgICAgWyBlY24gXVxuIiBcCisiICAgICAgICAgICAgICAgICBbIHJlb3JkZXIgUFJFQ0VOVCBbQ09SUkVMQVRJT05dIFsgZ2FwIERJU1RBTkNFIF1dXG4iIFwKKyIgICAgICAgICAgICAgICAgIFsgcmF0ZSBSQVRFIFtQQUNLRVRPVkVSSEVBRF0gW0NFTExTSVpFXSBbQ0VMTE9WRVJIRUFEXV1cbiIpOworfQorCitzdGF0aWMgdm9pZCBleHBsYWluMShjb25zdCBjaGFyICphcmcpCit7CisJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwiJXNcIlxuIiwgYXJnKTsKK30KKworLyogVXBwZXIgYm91bmQgb24gc2l6ZSBvZiBkaXN0cmlidXRpb24KKyAqICByZWFsbHkgKFRDQV9CVUZfTUFYIC0gb3RoZXIgaGVhZGVycykgLyBzaXplb2YgKF9fczE2KQorICovCisjZGVmaW5lIE1BWF9ESVNUCSgxNioxMDI0KQorCitzdGF0aWMgY29uc3QgZG91YmxlIG1heF9wZXJjZW50X3ZhbHVlID0gMHhmZmZmZmZmZjsKKworLyogc2NhbGVkIHZhbHVlIHVzZWQgdG8gcGVyY2VudCBvZiBtYXhpbXVtLiAqLworc3RhdGljIHZvaWQgc2V0X3BlcmNlbnQoX191MzIgKnBlcmNlbnQsIGRvdWJsZSBwZXIpCit7CisJKnBlcmNlbnQgPSAodW5zaWduZWQpIHJpbnQocGVyICogbWF4X3BlcmNlbnRfdmFsdWUpOworfQorCisKKy8qIFBhcnNlIGVpdGhlciBhIGZyYWN0aW9uICcuMycgb3IgcGVyY2VudCAnMzAlCisgKiByZXR1cm46IDAgPSBvaywgLTEgPSBlcnJvciwgMSA9IG91dCBvZiByYW5nZQorICovCitzdGF0aWMgaW50IHBhcnNlX3BlcmNlbnQoZG91YmxlICp2YWwsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwljaGFyICpwOworCisJKnZhbCA9IHN0cnRvZChzdHIsICZwKSAvIDEwMC47CisJaWYgKCpwICYmIHN0cmNtcChwLCAiJSIpICkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3BlcmNlbnQoX191MzIgKnBlcmNlbnQsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlkb3VibGUgcGVyOworCisJaWYgKHBhcnNlX3BlcmNlbnQoJnBlciwgc3RyKSkKKwkJcmV0dXJuIC0xOworCisJc2V0X3BlcmNlbnQocGVyY2VudCwgcGVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfcGVyY2VudChjaGFyICpidWYsIGludCBsZW4sIF9fdTMyIHBlcikKK3sKKwlzbnByaW50ZihidWYsIGxlbiwgIiVnJSUiLCAxMDAuICogKGRvdWJsZSkgcGVyIC8gbWF4X3BlcmNlbnRfdmFsdWUpOworfQorCitzdGF0aWMgY2hhciAqIHNwcmludF9wZXJjZW50KF9fdTMyIHBlciwgY2hhciAqYnVmKQoreworCXByaW50X3BlcmNlbnQoYnVmLCBTUFJJTlRfQlNJWkUtMSwgcGVyKTsKKwlyZXR1cm4gYnVmOworfQorCisvKgorICogU2ltcGxpc3RpYyBmaWxlIHBhcnNlciBmb3IgZGlzdHJidXRpb24gZGF0YS4KKyAqIEZvcm1hdCBpczoKKyAqCSMgY29tbWVudCBsaW5lKHMpCisgKglkYXRhMCBkYXRhMSAuLi4KKyAqLworc3RhdGljIGludCBnZXRfZGlzdHJpYnV0aW9uKGNvbnN0IGNoYXIgKnR5cGUsIF9fczE2ICpkYXRhLCBpbnQgbWF4ZGF0YSkKK3sKKwlGSUxFICpmOworCWludCBuOworCWxvbmcgeDsKKwlzaXplX3QgbGVuOworCWNoYXIgKmxpbmUgPSBOVUxMOworCWNoYXIgbmFtZVsxMjhdOworCisJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXMvJXMuZGlzdCIsIGdldF90Y19saWIoKSwgdHlwZSk7CisJaWYgKChmID0gZm9wZW4obmFtZSwgInIiKSkgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vIGRpc3RyaWJ1dGlvbiBkYXRhIGZvciAlcyAoJXM6ICVzKVxuIiwKKwkJCXR5cGUsIG5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwluID0gMDsKKwl3aGlsZSAoZ2V0bGluZSgmbGluZSwgJmxlbiwgZikgIT0gLTEpIHsKKwkJY2hhciAqcCwgKmVuZHA7CisJCWlmICgqbGluZSA9PSAnXG4nIHx8ICpsaW5lID09ICcjJykKKwkJCWNvbnRpbnVlOworCisJCWZvciAocCA9IGxpbmU7IDsgcCA9IGVuZHApIHsKKwkJCXggPSBzdHJ0b2wocCwgJmVuZHAsIDApOworCQkJaWYgKGVuZHAgPT0gcCkKKwkJCQlicmVhazsKKworCQkJaWYgKG4gPj0gbWF4ZGF0YSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiJXM6IHRvbyBtdWNoIGRhdGFcbiIsCisJCQkJCW5hbWUpOworCQkJCW4gPSAtMTsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQkJZGF0YVtuKytdID0geDsKKwkJfQorCX0KKyBlcnJvcjoKKwlmcmVlKGxpbmUpOworCWZjbG9zZShmKTsKKwlyZXR1cm4gbjsKK30KKworI2RlZmluZSBORVhUX0lTX05VTUJFUigpIChORVhUX0FSR19PSygpICYmIGlzZGlnaXQoYXJndlsxXVswXSkpCisjZGVmaW5lIE5FWFRfSVNfU0lHTkVEX05VTUJFUigpIFwKKwkoTkVYVF9BUkdfT0soKSAmJiAoaXNkaWdpdChhcmd2WzFdWzBdKSB8fCBhcmd2WzFdWzBdID09ICctJykpCisKKy8qIEFkanVzdCBmb3IgdGhlIGZhY3QgdGhhdCBwc2NoZWRfdGlja3MgYXJlbid0IGFsd2F5cyB1c2VjcworICAgKGJhc2VkIG9uIGtlcm5lbCBQU0NIRURfQ0xPQ0sgY29uZmlndXJhdGlvbiAqLworc3RhdGljIGludCBnZXRfdGlja3MoX191MzIgKnRpY2tzLCBjb25zdCBjaGFyICpzdHIpCit7CisJdW5zaWduZWQgdDsKKworCWlmKGdldF90aW1lKCZ0LCBzdHIpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAodGNfY29yZV90aW1lMmJpZyh0KSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgJXUgdGltZSAodG9vIGxhcmdlKVxuIiwgdCk7CisJCXJldHVybiAtMTsKKwl9CisKKwkqdGlja3MgPSB0Y19jb3JlX3RpbWUydGljayh0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXRlbV9wYXJzZV9vcHQoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCisJCQkgICBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJaW50IGRpc3Rfc2l6ZSA9IDA7CisJc3RydWN0IHJ0YXR0ciAqdGFpbDsKKwlzdHJ1Y3QgdGNfbmV0ZW1fcW9wdCBvcHQgPSB7IC5saW1pdCA9IDEwMDAgfTsKKwlzdHJ1Y3QgdGNfbmV0ZW1fY29yciBjb3I7CisJc3RydWN0IHRjX25ldGVtX3Jlb3JkZXIgcmVvcmRlcjsKKwlzdHJ1Y3QgdGNfbmV0ZW1fY29ycnVwdCBjb3JydXB0OworCXN0cnVjdCB0Y19uZXRlbV9naW1vZGVsIGdpbW9kZWw7CisJc3RydWN0IHRjX25ldGVtX2dlbW9kZWwgZ2Vtb2RlbDsKKwlzdHJ1Y3QgdGNfbmV0ZW1fcmF0ZSByYXRlOworCV9fczE2ICpkaXN0X2RhdGEgPSBOVUxMOworCV9fdTE2IGxvc3NfdHlwZSA9IE5FVEVNX0xPU1NfVU5TUEVDOworCWludCBwcmVzZW50W19fVENBX05FVEVNX01BWF07CisJX191NjQgcmF0ZTY0ID0gMDsKKworCW1lbXNldCgmY29yLCAwLCBzaXplb2YoY29yKSk7CisJbWVtc2V0KCZyZW9yZGVyLCAwLCBzaXplb2YocmVvcmRlcikpOworCW1lbXNldCgmY29ycnVwdCwgMCwgc2l6ZW9mKGNvcnJ1cHQpKTsKKwltZW1zZXQoJnJhdGUsIDAsIHNpemVvZihyYXRlKSk7CisJbWVtc2V0KHByZXNlbnQsIDAsIHNpemVvZihwcmVzZW50KSk7CisKKwlmb3IoIDsgYXJnYyA+IDA7IC0tYXJnYywgKythcmd2KSB7CisJCWlmIChtYXRjaGVzKCphcmd2LCAibGltaXQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9zaXplKCZvcHQubGltaXQsICphcmd2KSkgeworCQkJCWV4cGxhaW4xKCJsaW1pdCIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAibGF0ZW5jeSIpID09IDAgfHwKKwkJCSAgIG1hdGNoZXMoKmFyZ3YsICJkZWxheSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3RpY2tzKCZvcHQubGF0ZW5jeSwgKmFyZ3YpKSB7CisJCQkJZXhwbGFpbjEoImxhdGVuY3kiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJCWlmIChORVhUX0lTX05VTUJFUigpKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCQlpZiAoZ2V0X3RpY2tzKCZvcHQuaml0dGVyLCAqYXJndikpIHsKKwkJCQkJZXhwbGFpbjEoImxhdGVuY3kiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKworCQkJCWlmIChORVhUX0lTX05VTUJFUigpKSB7CisJCQkJCU5FWFRfQVJHKCk7CisJCQkJCSsrcHJlc2VudFtUQ0FfTkVURU1fQ09SUl07CisJCQkJCWlmIChnZXRfcGVyY2VudCgmY29yLmRlbGF5X2NvcnIsICphcmd2KSkgeworCQkJCQkJZXhwbGFpbjEoImxhdGVuY3kiKTsKKwkJCQkJCXJldHVybiAtMTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAibG9zcyIpID09IDAgfHwKKwkJCSAgIG1hdGNoZXMoKmFyZ3YsICJkcm9wIikgPT0gMCkgeworCQkJaWYgKG9wdC5sb3NzID4gMCB8fCBsb3NzX3R5cGUgIT0gTkVURU1fTE9TU19VTlNQRUMpIHsKKwkJCQlleHBsYWluMSgiZHVwbGljYXRlIGxvc3MgYXJndW1lbnRcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKworCQkJTkVYVF9BUkcoKTsKKwkJCS8qIE9sZCAoZGVwcmVjYXRlZCkgcmFuZG9tIGxvc3MgbW9kZWwgc3ludGF4ICovCisJCQlpZiAoaXNkaWdpdChhcmd2WzBdWzBdKSkKKwkJCQlnb3RvIHJhbmRvbV9sb3NzX21vZGVsOworCisJCQlpZiAoIXN0cmNtcCgqYXJndiwgInJhbmRvbSIpKSB7CisJCQkJTkVYVF9BUkcoKTsKKwlyYW5kb21fbG9zc19tb2RlbDoKKwkJCQlpZiAoZ2V0X3BlcmNlbnQoJm9wdC5sb3NzLCAqYXJndikpIHsKKwkJCQkJZXhwbGFpbjEoImxvc3MgcGVyY2VudCIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCWlmIChORVhUX0lTX05VTUJFUigpKSB7CisJCQkJCU5FWFRfQVJHKCk7CisJCQkJCSsrcHJlc2VudFtUQ0FfTkVURU1fQ09SUl07CisJCQkJCWlmIChnZXRfcGVyY2VudCgmY29yLmxvc3NfY29yciwgKmFyZ3YpKSB7CisJCQkJCQlleHBsYWluMSgibG9zcyBjb3JyZWxsYXRpb24iKTsKKwkJCQkJCXJldHVybiAtMTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwgInN0YXRlIikpIHsKKwkJCQlkb3VibGUgcDEzOworCisJCQkJTkVYVF9BUkcoKTsKKwkJCQlpZiAocGFyc2VfcGVyY2VudCgmcDEzLCAqYXJndikpIHsKKwkJCQkJZXhwbGFpbjEoImxvc3MgcDEzIik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisKKwkJCQkvKiBzZXQgZGVmYXVsdHMgKi8KKwkJCQlzZXRfcGVyY2VudCgmZ2ltb2RlbC5wMTMsIHAxMyk7CisJCQkJc2V0X3BlcmNlbnQoJmdpbW9kZWwucDMxLCAxLiAtIHAxMyk7CisJCQkJc2V0X3BlcmNlbnQoJmdpbW9kZWwucDMyLCAwKTsKKwkJCQlzZXRfcGVyY2VudCgmZ2ltb2RlbC5wMjMsIDEuKTsKKwkJCQlzZXRfcGVyY2VudCgmZ2ltb2RlbC5wMTQsIDApOworCQkJCWxvc3NfdHlwZSA9IE5FVEVNX0xPU1NfR0k7CisKKwkJCQlpZiAoIU5FWFRfSVNfTlVNQkVSKCkpCisJCQkJCWNvbnRpbnVlOworCQkJCU5FWFRfQVJHKCk7CisJCQkJaWYgKGdldF9wZXJjZW50KCZnaW1vZGVsLnAzMSwgKmFyZ3YpKSB7CisJCQkJCWV4cGxhaW4xKCJsb3NzIHAzMSIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCisJCQkJaWYgKCFORVhUX0lTX05VTUJFUigpKQorCQkJCQljb250aW51ZTsKKwkJCQlORVhUX0FSRygpOworCQkJCWlmIChnZXRfcGVyY2VudCgmZ2ltb2RlbC5wMzIsICphcmd2KSkgeworCQkJCQlleHBsYWluMSgibG9zcyBwMzIiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKworCQkJCWlmICghTkVYVF9JU19OVU1CRVIoKSkKKwkJCQkJY29udGludWU7CisJCQkJTkVYVF9BUkcoKTsKKwkJCQlpZiAoZ2V0X3BlcmNlbnQoJmdpbW9kZWwucDIzLCAqYXJndikpIHsKKwkJCQkJZXhwbGFpbjEoImxvc3MgcDIzIik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJaWYgKCFORVhUX0lTX05VTUJFUigpKQorCQkJCQljb250aW51ZTsKKwkJCQlORVhUX0FSRygpOworCQkJCWlmIChnZXRfcGVyY2VudCgmZ2ltb2RlbC5wMTQsICphcmd2KSkgeworCQkJCQlleHBsYWluMSgibG9zcyBwMTQiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKworCQkJfSBlbHNlIGlmICghc3RyY21wKCphcmd2LCAiZ2Vtb2RlbCIpKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCQlpZiAoZ2V0X3BlcmNlbnQoJmdlbW9kZWwucCwgKmFyZ3YpKSB7CisJCQkJCWV4cGxhaW4xKCJsb3NzIGdlbW9kZWwgcCIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCisJCQkJLyogc2V0IGRlZmF1bHRzICovCisJCQkJc2V0X3BlcmNlbnQoJmdlbW9kZWwuciwgMS4pOworCQkJCXNldF9wZXJjZW50KCZnZW1vZGVsLmgsIDApOworCQkJCXNldF9wZXJjZW50KCZnZW1vZGVsLmsxLCAwKTsKKwkJCQlsb3NzX3R5cGUgPSBORVRFTV9MT1NTX0dFOworCisJCQkJaWYgKCFORVhUX0lTX05VTUJFUigpKQorCQkJCQljb250aW51ZTsKKwkJCQlORVhUX0FSRygpOworCQkJCWlmIChnZXRfcGVyY2VudCgmZ2Vtb2RlbC5yLCAqYXJndikpIHsKKwkJCQkJZXhwbGFpbjEoImxvc3MgZ2Vtb2RlbCByIik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisKKwkJCQlpZiAoIU5FWFRfSVNfTlVNQkVSKCkpCisJCQkJCWNvbnRpbnVlOworCQkJCU5FWFRfQVJHKCk7CisJCQkJaWYgKGdldF9wZXJjZW50KCZnZW1vZGVsLmgsICphcmd2KSkgeworCQkJCQlleHBsYWluMSgibG9zcyBnZW1vZGVsIGgiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQkvKiBuZXRlbSBvcHRpb24gaXMgIjEtaCIgYnV0IGtlcm5lbAorCQkJCSAqIGV4cGVjdHMgImgiLgorCQkJCSAqLworCQkJCWdlbW9kZWwuaCA9IG1heF9wZXJjZW50X3ZhbHVlIC0gZ2Vtb2RlbC5oOworCisJCQkJaWYgKCFORVhUX0lTX05VTUJFUigpKQorCQkJCQljb250aW51ZTsKKwkJCQlORVhUX0FSRygpOworCQkJCWlmIChnZXRfcGVyY2VudCgmZ2Vtb2RlbC5rMSwgKmFyZ3YpKSB7CisJCQkJCWV4cGxhaW4xKCJsb3NzIGdlbW9kZWwgayIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gbG9zcyBwYXJhbWV0ZXI6ICVzXG4iLAorCQkJCQkqYXJndik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJlY24iKSA9PSAwKSB7CisJCQkJcHJlc2VudFtUQ0FfTkVURU1fRUNOXSA9IDE7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInJlb3JkZXIiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJcHJlc2VudFtUQ0FfTkVURU1fUkVPUkRFUl0gPSAxOworCQkJaWYgKGdldF9wZXJjZW50KCZyZW9yZGVyLnByb2JhYmlsaXR5LCAqYXJndikpIHsKKwkJCQlleHBsYWluMSgicmVvcmRlciIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChORVhUX0lTX05VTUJFUigpKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCQkrK3ByZXNlbnRbVENBX05FVEVNX0NPUlJdOworCQkJCWlmIChnZXRfcGVyY2VudCgmcmVvcmRlci5jb3JyZWxhdGlvbiwgKmFyZ3YpKSB7CisJCQkJCWV4cGxhaW4xKCJyZW9yZGVyIik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImNvcnJ1cHQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJcHJlc2VudFtUQ0FfTkVURU1fQ09SUlVQVF0gPSAxOworCQkJaWYgKGdldF9wZXJjZW50KCZjb3JydXB0LnByb2JhYmlsaXR5LCAqYXJndikpIHsKKwkJCQlleHBsYWluMSgiY29ycnVwdCIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChORVhUX0lTX05VTUJFUigpKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCQkrK3ByZXNlbnRbVENBX05FVEVNX0NPUlJdOworCQkJCWlmIChnZXRfcGVyY2VudCgmY29ycnVwdC5jb3JyZWxhdGlvbiwgKmFyZ3YpKSB7CisJCQkJCWV4cGxhaW4xKCJjb3JydXB0Iik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImdhcCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmb3B0LmdhcCwgKmFyZ3YsIDApKSB7CisJCQkJZXhwbGFpbjEoImdhcCIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiZHVwbGljYXRlIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfcGVyY2VudCgmb3B0LmR1cGxpY2F0ZSwgKmFyZ3YpKSB7CisJCQkJZXhwbGFpbjEoImR1cGxpY2F0ZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChORVhUX0lTX05VTUJFUigpKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCQlpZiAoZ2V0X3BlcmNlbnQoJmNvci5kdXBfY29yciwgKmFyZ3YpKSB7CisJCQkJCWV4cGxhaW4xKCJkdXBsaWNhdGUiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiZGlzdHJpYnV0aW9uIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWRpc3RfZGF0YSA9IGNhbGxvYyhzaXplb2YoZGlzdF9kYXRhWzBdKSwgTUFYX0RJU1QpOworCQkJZGlzdF9zaXplID0gZ2V0X2Rpc3RyaWJ1dGlvbigqYXJndiwgZGlzdF9kYXRhLCBNQVhfRElTVCk7CisJCQlpZiAoZGlzdF9zaXplIDw9IDApIHsKKwkJCQlmcmVlKGRpc3RfZGF0YSk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJyYXRlIikgPT0gMCkgeworCQkJKytwcmVzZW50W1RDQV9ORVRFTV9SQVRFXTsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3JhdGU2NCgmcmF0ZTY0LCAqYXJndikpIHsKKwkJCQlleHBsYWluMSgicmF0ZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChORVhUX0lTX1NJR05FRF9OVU1CRVIoKSkgeworCQkJCU5FWFRfQVJHKCk7CisJCQkJaWYgKGdldF9zMzIoJnJhdGUucGFja2V0X292ZXJoZWFkLCAqYXJndiwgMCkpIHsKKwkJCQkJZXhwbGFpbjEoInJhdGUiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCX0KKwkJCWlmIChORVhUX0lTX05VTUJFUigpKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCQlpZiAoZ2V0X3UzMigmcmF0ZS5jZWxsX3NpemUsICphcmd2LCAwKSkgeworCQkJCQlleHBsYWluMSgicmF0ZSIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJfQorCQkJaWYgKE5FWFRfSVNfU0lHTkVEX05VTUJFUigpKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCQlpZiAoZ2V0X3MzMigmcmF0ZS5jZWxsX292ZXJoZWFkLCAqYXJndiwgMCkpIHsKKwkJCQkJZXhwbGFpbjEoInJhdGUiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJXaGF0IGlzIFwiJXNcIj9cbiIsICphcmd2KTsKKwkJCWV4cGxhaW4oKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXRhaWwgPSBOTE1TR19UQUlMKG4pOworCisJaWYgKHJlb3JkZXIucHJvYmFiaWxpdHkpIHsKKwkJaWYgKG9wdC5sYXRlbmN5ID09IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAicmVvcmRlcmluZyBub3QgcG9zc2libGUgd2l0aG91dCBzcGVjaWZ5aW5nIHNvbWUgZGVsYXlcbiIpOworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChvcHQuZ2FwID09IDApCisJCQlvcHQuZ2FwID0gMTsKKwl9IGVsc2UgaWYgKG9wdC5nYXAgPiAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZ2FwIHNwZWNpZmllZCB3aXRob3V0IHJlb3JkZXIgcHJvYmFiaWxpdHlcbiIpOworCQlleHBsYWluKCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAocHJlc2VudFtUQ0FfTkVURU1fRUNOXSkgeworCQlpZiAob3B0Lmxvc3MgPD0gMCAmJiBsb3NzX3R5cGUgPT0gTkVURU1fTE9TU19VTlNQRUMpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiZWNuIHJlcXVlc3RlZCB3aXRob3V0IGxvc3MgbW9kZWxcbiIpOworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJaWYgKGRpc3RfZGF0YSAmJiAob3B0LmxhdGVuY3kgPT0gMCB8fCBvcHQuaml0dGVyID09IDApKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZGlzdHJpYnV0aW9uIHNwZWNpZmllZCBidXQgbm8gbGF0ZW5jeSBhbmQgaml0dGVyIHZhbHVlc1xuIik7CisJCWV4cGxhaW4oKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChhZGRhdHRyX2wobiwgMTAyNCwgVENBX09QVElPTlMsICZvcHQsIHNpemVvZihvcHQpKSA8IDApCisJCXJldHVybiAtMTsKKworCWlmIChwcmVzZW50W1RDQV9ORVRFTV9DT1JSXSAmJgorCSAgICBhZGRhdHRyX2wobiwgMTAyNCwgVENBX05FVEVNX0NPUlIsICZjb3IsIHNpemVvZihjb3IpKSA8IDApCisJCQlyZXR1cm4gLTE7CisKKwlpZiAocHJlc2VudFtUQ0FfTkVURU1fUkVPUkRFUl0gJiYKKwkgICAgYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9ORVRFTV9SRU9SREVSLCAmcmVvcmRlciwgc2l6ZW9mKHJlb3JkZXIpKSA8IDApCisJCXJldHVybiAtMTsKKworCWlmIChwcmVzZW50W1RDQV9ORVRFTV9FQ05dICYmCisJICAgIGFkZGF0dHJfbChuLCAxMDI0LCBUQ0FfTkVURU1fRUNOLCAmcHJlc2VudFtUQ0FfTkVURU1fRUNOXSwKKwkJICAgICAgc2l6ZW9mKHByZXNlbnRbVENBX05FVEVNX0VDTl0pKSA8IDApCisJCQlyZXR1cm4gLTE7CisKKwlpZiAocHJlc2VudFtUQ0FfTkVURU1fQ09SUlVQVF0gJiYKKwkgICAgYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9ORVRFTV9DT1JSVVBULCAmY29ycnVwdCwgc2l6ZW9mKGNvcnJ1cHQpKSA8IDApCisJCXJldHVybiAtMTsKKworCWlmIChsb3NzX3R5cGUgIT0gTkVURU1fTE9TU19VTlNQRUMpIHsKKwkJc3RydWN0IHJ0YXR0ciAqc3RhcnQ7CisKKwkJc3RhcnQgPSBhZGRhdHRyX25lc3QobiwgMTAyNCwgVENBX05FVEVNX0xPU1MgfCBOTEFfRl9ORVNURUQpOworCQlpZiAobG9zc190eXBlID09IE5FVEVNX0xPU1NfR0kpIHsKKwkJCWlmIChhZGRhdHRyX2wobiwgMTAyNCwgTkVURU1fTE9TU19HSSwKKwkJCQkgICAgICAmZ2ltb2RlbCwgc2l6ZW9mKGdpbW9kZWwpKSA8IDApCisJCQkgICAgcmV0dXJuIC0xOworCQl9IGVsc2UgaWYgKGxvc3NfdHlwZSA9PSBORVRFTV9MT1NTX0dFKSB7CisJCQlpZiAoYWRkYXR0cl9sKG4sIDEwMjQsIE5FVEVNX0xPU1NfR0UsCisJCQkJICAgICAgJmdlbW9kZWwsIHNpemVvZihnZW1vZGVsKSkgPCAwKQorCQkJICAgIHJldHVybiAtMTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAibG9zcyBpbiB0aGUgd2VlZHMhXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWFkZGF0dHJfbmVzdF9lbmQobiwgc3RhcnQpOworCX0KKworCWlmIChwcmVzZW50W1RDQV9ORVRFTV9SQVRFXSkgeworCQlpZiAocmF0ZTY0ID49ICgxVUxMIDw8IDMyKSkgeworCQkJaWYgKGFkZGF0dHJfbChuLCAxMDI0LAorCQkJCSAgICAgIFRDQV9ORVRFTV9SQVRFNjQsICZyYXRlNjQsIHNpemVvZihyYXRlNjQpKSA8IDApCisJCQkJcmV0dXJuIC0xOworCQkJcmF0ZS5yYXRlID0gfjBVOworCQl9IGVsc2UgeworCQkJcmF0ZS5yYXRlID0gcmF0ZTY0OworCQl9CisJCWlmIChhZGRhdHRyX2wobiwgMTAyNCwgVENBX05FVEVNX1JBVEUsICZyYXRlLCBzaXplb2YocmF0ZSkpIDwgMCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoZGlzdF9kYXRhKSB7CisJCWlmIChhZGRhdHRyX2wobiwgTUFYX0RJU1QgKiBzaXplb2YoZGlzdF9kYXRhWzBdKSwKKwkJCSAgICAgIFRDQV9ORVRFTV9ERUxBWV9ESVNULAorCQkJICAgICAgZGlzdF9kYXRhLCBkaXN0X3NpemUgKiBzaXplb2YoZGlzdF9kYXRhWzBdKSkgPCAwKQorCQkJcmV0dXJuIC0xOworCQlmcmVlKGRpc3RfZGF0YSk7CisJfQorCXRhaWwtPnJ0YV9sZW4gPSAodm9pZCAqKSBOTE1TR19UQUlMKG4pIC0gKHZvaWQgKikgdGFpbDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXRlbV9wcmludF9vcHQoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBGSUxFICpmLCBzdHJ1Y3QgcnRhdHRyICpvcHQpCit7CisJY29uc3Qgc3RydWN0IHRjX25ldGVtX2NvcnIgKmNvciA9IE5VTEw7CisJY29uc3Qgc3RydWN0IHRjX25ldGVtX3Jlb3JkZXIgKnJlb3JkZXIgPSBOVUxMOworCWNvbnN0IHN0cnVjdCB0Y19uZXRlbV9jb3JydXB0ICpjb3JydXB0ID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgdGNfbmV0ZW1fZ2ltb2RlbCAqZ2ltb2RlbCA9IE5VTEw7CisJY29uc3Qgc3RydWN0IHRjX25ldGVtX2dlbW9kZWwgKmdlbW9kZWwgPSBOVUxMOworCWludCAqZWNuID0gTlVMTDsKKwlzdHJ1Y3QgdGNfbmV0ZW1fcW9wdCBxb3B0OworCWNvbnN0IHN0cnVjdCB0Y19uZXRlbV9yYXRlICpyYXRlID0gTlVMTDsKKwlpbnQgbGVuID0gUlRBX1BBWUxPQUQob3B0KSAtIHNpemVvZihxb3B0KTsKKwlfX3U2NCByYXRlNjQgPSAwOworCVNQUklOVF9CVUYoYjEpOworCisJaWYgKG9wdCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWlmIChsZW4gPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAib3B0aW9ucyBzaXplIGVycm9yXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1jcHkoJnFvcHQsIFJUQV9EQVRBKG9wdCksIHNpemVvZihxb3B0KSk7CisKKwlpZiAobGVuID4gMCkgeworCQlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfTkVURU1fTUFYKzFdOworCQlwYXJzZV9ydGF0dHIodGIsIFRDQV9ORVRFTV9NQVgsIFJUQV9EQVRBKG9wdCkgKyBzaXplb2YocW9wdCksCisJCQkgICAgIGxlbik7CisKKwkJaWYgKHRiW1RDQV9ORVRFTV9DT1JSXSkgeworCQkJaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9ORVRFTV9DT1JSXSkgPCBzaXplb2YoKmNvcikpCisJCQkJcmV0dXJuIC0xOworCQkJY29yID0gUlRBX0RBVEEodGJbVENBX05FVEVNX0NPUlJdKTsKKwkJfQorCQlpZiAodGJbVENBX05FVEVNX1JFT1JERVJdKSB7CisJCQlpZiAoUlRBX1BBWUxPQUQodGJbVENBX05FVEVNX1JFT1JERVJdKSA8IHNpemVvZigqcmVvcmRlcikpCisJCQkJcmV0dXJuIC0xOworCQkJcmVvcmRlciA9IFJUQV9EQVRBKHRiW1RDQV9ORVRFTV9SRU9SREVSXSk7CisJCX0KKwkJaWYgKHRiW1RDQV9ORVRFTV9DT1JSVVBUXSkgeworCQkJaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9ORVRFTV9DT1JSVVBUXSkgPCBzaXplb2YoKmNvcnJ1cHQpKQorCQkJCXJldHVybiAtMTsKKwkJCWNvcnJ1cHQgPSBSVEFfREFUQSh0YltUQ0FfTkVURU1fQ09SUlVQVF0pOworCQl9CisJCWlmICh0YltUQ0FfTkVURU1fTE9TU10pIHsKKwkJCXN0cnVjdCBydGF0dHIgKmxiW05FVEVNX0xPU1NfTUFYICsgMV07CisKKwkJCXBhcnNlX3J0YXR0cl9uZXN0ZWQobGIsIE5FVEVNX0xPU1NfTUFYLCB0YltUQ0FfTkVURU1fTE9TU10pOworCQkJaWYgKGxiW05FVEVNX0xPU1NfR0ldKQorCQkJCWdpbW9kZWwgPSBSVEFfREFUQShsYltORVRFTV9MT1NTX0dJXSk7CisJCQlpZiAobGJbTkVURU1fTE9TU19HRV0pCisJCQkJZ2Vtb2RlbCA9IFJUQV9EQVRBKGxiW05FVEVNX0xPU1NfR0VdKTsKKwkJfQorCQlpZiAodGJbVENBX05FVEVNX1JBVEVdKSB7CisJCQlpZiAoUlRBX1BBWUxPQUQodGJbVENBX05FVEVNX1JBVEVdKSA8IHNpemVvZigqcmF0ZSkpCisJCQkJcmV0dXJuIC0xOworCQkJcmF0ZSA9IFJUQV9EQVRBKHRiW1RDQV9ORVRFTV9SQVRFXSk7CisJCX0KKwkJaWYgKHRiW1RDQV9ORVRFTV9FQ05dKSB7CisJCQlpZiAoUlRBX1BBWUxPQUQodGJbVENBX05FVEVNX0VDTl0pIDwgc2l6ZW9mKCplY24pKQorCQkJCXJldHVybiAtMTsKKwkJCWVjbiA9IFJUQV9EQVRBKHRiW1RDQV9ORVRFTV9FQ05dKTsKKwkJfQorCQlpZiAodGJbVENBX05FVEVNX1JBVEU2NF0pIHsKKwkJCWlmIChSVEFfUEFZTE9BRCh0YltUQ0FfTkVURU1fUkFURTY0XSkgPCBzaXplb2YocmF0ZTY0KSkKKwkJCQlyZXR1cm4gLTE7CisJCQlyYXRlNjQgPSBydGFfZ2V0YXR0cl91NjQodGJbVENBX05FVEVNX1JBVEU2NF0pOworCQl9CisJfQorCisJZnByaW50ZihmLCAibGltaXQgJWQiLCBxb3B0LmxpbWl0KTsKKworCWlmIChxb3B0LmxhdGVuY3kpIHsKKwkJZnByaW50ZihmLCAiIGRlbGF5ICVzIiwgc3ByaW50X3RpY2tzKHFvcHQubGF0ZW5jeSwgYjEpKTsKKworCQlpZiAocW9wdC5qaXR0ZXIpIHsKKwkJCWZwcmludGYoZiwgIiAgJXMiLCBzcHJpbnRfdGlja3MocW9wdC5qaXR0ZXIsIGIxKSk7CisJCQlpZiAoY29yICYmIGNvci0+ZGVsYXlfY29ycikKKwkJCQlmcHJpbnRmKGYsICIgJXMiLCBzcHJpbnRfcGVyY2VudChjb3ItPmRlbGF5X2NvcnIsIGIxKSk7CisJCX0KKwl9CisKKwlpZiAocW9wdC5sb3NzKSB7CisJCWZwcmludGYoZiwgIiBsb3NzICVzIiwgc3ByaW50X3BlcmNlbnQocW9wdC5sb3NzLCBiMSkpOworCQlpZiAoY29yICYmIGNvci0+bG9zc19jb3JyKQorCQkJZnByaW50ZihmLCAiICVzIiwgc3ByaW50X3BlcmNlbnQoY29yLT5sb3NzX2NvcnIsIGIxKSk7CisJfQorCisJaWYgKGdpbW9kZWwpIHsKKwkJZnByaW50ZihmLCAiIGxvc3Mgc3RhdGUgcDEzICVzIiwgc3ByaW50X3BlcmNlbnQoZ2ltb2RlbC0+cDEzLCBiMSkpOworCQlmcHJpbnRmKGYsICIgcDMxICVzIiwgc3ByaW50X3BlcmNlbnQoZ2ltb2RlbC0+cDMxLCBiMSkpOworCQlmcHJpbnRmKGYsICIgcDMyICVzIiwgc3ByaW50X3BlcmNlbnQoZ2ltb2RlbC0+cDMyLCBiMSkpOworCQlmcHJpbnRmKGYsICIgcDIzICVzIiwgc3ByaW50X3BlcmNlbnQoZ2ltb2RlbC0+cDIzLCBiMSkpOworCQlmcHJpbnRmKGYsICIgcDE0ICVzIiwgc3ByaW50X3BlcmNlbnQoZ2ltb2RlbC0+cDE0LCBiMSkpOworCX0KKworCWlmIChnZW1vZGVsKSB7CisJCWZwcmludGYoZiwgIiBsb3NzIGdlbW9kZWwgcCAlcyIsCisJCQlzcHJpbnRfcGVyY2VudChnZW1vZGVsLT5wLCBiMSkpOworCQlmcHJpbnRmKGYsICIgciAlcyIsIHNwcmludF9wZXJjZW50KGdlbW9kZWwtPnIsIGIxKSk7CisJCWZwcmludGYoZiwgIiAxLWggJXMiLCBzcHJpbnRfcGVyY2VudChtYXhfcGVyY2VudF92YWx1ZSAtCisJCQkJCQkgICAgIGdlbW9kZWwtPmgsIGIxKSk7CisJCWZwcmludGYoZiwgIiAxLWsgJXMiLCBzcHJpbnRfcGVyY2VudChnZW1vZGVsLT5rMSwgYjEpKTsKKwl9CisKKwlpZiAocW9wdC5kdXBsaWNhdGUpIHsKKwkJZnByaW50ZihmLCAiIGR1cGxpY2F0ZSAlcyIsCisJCQlzcHJpbnRfcGVyY2VudChxb3B0LmR1cGxpY2F0ZSwgYjEpKTsKKwkJaWYgKGNvciAmJiBjb3ItPmR1cF9jb3JyKQorCQkJZnByaW50ZihmLCAiICVzIiwgc3ByaW50X3BlcmNlbnQoY29yLT5kdXBfY29yciwgYjEpKTsKKwl9CisKKwlpZiAocmVvcmRlciAmJiByZW9yZGVyLT5wcm9iYWJpbGl0eSkgeworCQlmcHJpbnRmKGYsICIgcmVvcmRlciAlcyIsCisJCQlzcHJpbnRfcGVyY2VudChyZW9yZGVyLT5wcm9iYWJpbGl0eSwgYjEpKTsKKwkJaWYgKHJlb3JkZXItPmNvcnJlbGF0aW9uKQorCQkJZnByaW50ZihmLCAiICVzIiwKKwkJCQlzcHJpbnRfcGVyY2VudChyZW9yZGVyLT5jb3JyZWxhdGlvbiwgYjEpKTsKKwl9CisKKwlpZiAoY29ycnVwdCAmJiBjb3JydXB0LT5wcm9iYWJpbGl0eSkgeworCQlmcHJpbnRmKGYsICIgY29ycnVwdCAlcyIsCisJCQlzcHJpbnRfcGVyY2VudChjb3JydXB0LT5wcm9iYWJpbGl0eSwgYjEpKTsKKwkJaWYgKGNvcnJ1cHQtPmNvcnJlbGF0aW9uKQorCQkJZnByaW50ZihmLCAiICVzIiwKKwkJCQlzcHJpbnRfcGVyY2VudChjb3JydXB0LT5jb3JyZWxhdGlvbiwgYjEpKTsKKwl9CisKKwlpZiAocmF0ZSAmJiByYXRlLT5yYXRlKSB7CisJCWlmIChyYXRlNjQpCisJCQlmcHJpbnRmKGYsICIgcmF0ZSAlcyIsIHNwcmludF9yYXRlKHJhdGU2NCwgYjEpKTsKKwkJZWxzZQorCQkJZnByaW50ZihmLCAiIHJhdGUgJXMiLCBzcHJpbnRfcmF0ZShyYXRlLT5yYXRlLCBiMSkpOworCQlpZiAocmF0ZS0+cGFja2V0X292ZXJoZWFkKQorCQkJZnByaW50ZihmLCAiIHBhY2tldG92ZXJoZWFkICVkIiwgcmF0ZS0+cGFja2V0X292ZXJoZWFkKTsKKwkJaWYgKHJhdGUtPmNlbGxfc2l6ZSkKKwkJCWZwcmludGYoZiwgIiBjZWxsc2l6ZSAldSIsIHJhdGUtPmNlbGxfc2l6ZSk7CisJCWlmIChyYXRlLT5jZWxsX292ZXJoZWFkKQorCQkJZnByaW50ZihmLCAiIGNlbGxvdmVyaGVhZCAlZCIsIHJhdGUtPmNlbGxfb3ZlcmhlYWQpOworCX0KKworCWlmIChlY24pCisJCWZwcmludGYoZiwgIiBlY24gIik7CisKKwlpZiAocW9wdC5nYXApCisJCWZwcmludGYoZiwgIiBnYXAgJWx1IiwgKHVuc2lnbmVkIGxvbmcpcW9wdC5nYXApOworCisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHFkaXNjX3V0aWwgbmV0ZW1fcWRpc2NfdXRpbCA9IHsKKwkuaWQJICAgCT0gIm5ldGVtIiwKKwkucGFyc2VfcW9wdAk9IG5ldGVtX3BhcnNlX29wdCwKKwkucHJpbnRfcW9wdAk9IG5ldGVtX3ByaW50X29wdCwKK307CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy9xX3BpZS5jIGIvaXByb3V0ZTIvdGMvcV9waWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTNiMDVkCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGMvcV9waWUuYwpAQCAtMCwwICsxLDIxOCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDEzIENpc2NvIFN5c3RlbXMsIEluYywgMjAxMy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQXV0aG9yOiBWaWpheSBTdWJyYW1hbmlhbiA8dmlqYXluc3VAY2lzY28uY29tPgorICogQXV0aG9yOiBNeXRoaWxpIFByYWJodSA8bXlzdXJ5YW5AY2lzY28uY29tPgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0Y191dGlsLmgiCisKK3N0YXRpYyB2b2lkIGV4cGxhaW4odm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAuLi4gcGllIFsgbGltaXQgUEFDS0VUUyBdWyB0YXJnZXQgVElNRSB1c11cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICBbIHR1cGRhdGUgVElNRSB1c11bIGFscGhhIEFMUEhBIF0iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIltiZXRhIEJFVEEgXVtieXRlbW9kZSB8IG5vYnl0ZW1vZGVdW2VjbiB8IG5vZWNuIF1cbiIpOworfQorCisjZGVmaW5lIEFMUEhBX01BWCAzMgorI2RlZmluZSBBTFBIQV9NSU4gMAorI2RlZmluZSBCRVRBX01BWCAzMgorI2RlZmluZSBCRVRBX01JTiAwCisKK3N0YXRpYyBpbnQgcGllX3BhcnNlX29wdChzdHJ1Y3QgcWRpc2NfdXRpbCAqcXUsIGludCBhcmdjLCBjaGFyICoqYXJndiwKKwkJCSBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJdW5zaWduZWQgaW50IGxpbWl0ICAgPSAwOworCXVuc2lnbmVkIGludCB0YXJnZXQgID0gMDsKKwl1bnNpZ25lZCBpbnQgdHVwZGF0ZSA9IDA7CisJdW5zaWduZWQgaW50IGFscGhhICAgPSAwOworCXVuc2lnbmVkIGludCBiZXRhICAgID0gMDsKKwlpbnQgZWNuID0gLTE7CisJaW50IGJ5dGVtb2RlID0gLTE7CisJc3RydWN0IHJ0YXR0ciAqdGFpbDsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAoc3RyY21wKCphcmd2LCAibGltaXQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91bnNpZ25lZCgmbGltaXQsICphcmd2LCAwKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImxpbWl0XCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJ0YXJnZXQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF90aW1lKCZ0YXJnZXQsICphcmd2KSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcInRhcmdldFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAidHVwZGF0ZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3RpbWUoJnR1cGRhdGUsICphcmd2KSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcInR1cGRhdGVcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImFscGhhIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdW5zaWduZWQoJmFscGhhLCAqYXJndiwgMCkgfHwKKwkJCSAgICAoYWxwaGEgPiBBTFBIQV9NQVgpIHx8IChhbHBoYSA8IEFMUEhBX01JTikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJhbHBoYVwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiYmV0YSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3Vuc2lnbmVkKCZiZXRhLCAqYXJndiwgMCkgfHwKKwkJCSAgICAoYmV0YSA+IEJFVEFfTUFYKSB8fCAoYmV0YSA8IEJFVEFfTUlOKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImJldGFcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImVjbiIpID09IDApIHsKKwkJCWVjbiA9IDE7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibm9lY24iKSA9PSAwKSB7CisJCQllY24gPSAwOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImJ5dGVtb2RlIikgPT0gMCkgeworCQkJYnl0ZW1vZGUgPSAxOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm5vYnl0ZW1vZGUiKSA9PSAwKSB7CisJCQlieXRlbW9kZSA9IDA7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaGVscCIpID09IDApIHsKKwkJCWV4cGxhaW4oKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiV2hhdCBpcyBcIiVzXCI/XG4iLCAqYXJndik7CisJCQlleHBsYWluKCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYXJnYy0tOworCQlhcmd2Kys7CisJfQorCisJdGFpbCA9IE5MTVNHX1RBSUwobik7CisJYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9PUFRJT05TLCBOVUxMLCAwKTsKKwlpZiAobGltaXQpCisJCWFkZGF0dHJfbChuLCAxMDI0LCBUQ0FfUElFX0xJTUlULCAmbGltaXQsIHNpemVvZihsaW1pdCkpOworCWlmICh0dXBkYXRlKQorCQlhZGRhdHRyX2wobiwgMTAyNCwgVENBX1BJRV9UVVBEQVRFLCAmdHVwZGF0ZSwgc2l6ZW9mKHR1cGRhdGUpKTsKKwlpZiAodGFyZ2V0KQorCQlhZGRhdHRyX2wobiwgMTAyNCwgVENBX1BJRV9UQVJHRVQsICZ0YXJnZXQsIHNpemVvZih0YXJnZXQpKTsKKwlpZiAoYWxwaGEpCisJCWFkZGF0dHJfbChuLCAxMDI0LCBUQ0FfUElFX0FMUEhBLCAmYWxwaGEsIHNpemVvZihhbHBoYSkpOworCWlmIChiZXRhKQorCQlhZGRhdHRyX2wobiwgMTAyNCwgVENBX1BJRV9CRVRBLCAmYmV0YSwgc2l6ZW9mKGJldGEpKTsKKwlpZiAoZWNuICE9IC0xKQorCQlhZGRhdHRyX2wobiwgMTAyNCwgVENBX1BJRV9FQ04sICZlY24sIHNpemVvZihlY24pKTsKKwlpZiAoYnl0ZW1vZGUgIT0gLTEpCisJCWFkZGF0dHJfbChuLCAxMDI0LCBUQ0FfUElFX0JZVEVNT0RFLCAmYnl0ZW1vZGUsCisJCQkgIHNpemVvZihieXRlbW9kZSkpOworCisJdGFpbC0+cnRhX2xlbiA9ICh2b2lkICopTkxNU0dfVEFJTChuKSAtICh2b2lkICopdGFpbDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwaWVfcHJpbnRfb3B0KHN0cnVjdCBxZGlzY191dGlsICpxdSwgRklMRSAqZiwgc3RydWN0IHJ0YXR0ciAqb3B0KQoreworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9QSUVfTUFYICsgMV07CisJdW5zaWduZWQgaW50IGxpbWl0OworCXVuc2lnbmVkIGludCB0dXBkYXRlOworCXVuc2lnbmVkIGludCB0YXJnZXQ7CisJdW5zaWduZWQgaW50IGFscGhhOworCXVuc2lnbmVkIGludCBiZXRhOworCXVuc2lnbmVkIGVjbjsKKwl1bnNpZ25lZCBieXRlbW9kZTsKKwlTUFJJTlRfQlVGKGIxKTsKKworCWlmIChvcHQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlwYXJzZV9ydGF0dHJfbmVzdGVkKHRiLCBUQ0FfUElFX01BWCwgb3B0KTsKKworCWlmICh0YltUQ0FfUElFX0xJTUlUXSAmJgorCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfUElFX0xJTUlUXSkgPj0gc2l6ZW9mKF9fdTMyKSkgeworCQlsaW1pdCA9IHJ0YV9nZXRhdHRyX3UzMih0YltUQ0FfUElFX0xJTUlUXSk7CisJCWZwcmludGYoZiwgImxpbWl0ICV1cCAiLCBsaW1pdCk7CisJfQorCWlmICh0YltUQ0FfUElFX1RBUkdFVF0gJiYKKwkgICAgUlRBX1BBWUxPQUQodGJbVENBX1BJRV9UQVJHRVRdKSA+PSBzaXplb2YoX191MzIpKSB7CisJCXRhcmdldCA9IHJ0YV9nZXRhdHRyX3UzMih0YltUQ0FfUElFX1RBUkdFVF0pOworCQlmcHJpbnRmKGYsICJ0YXJnZXQgJXMgIiwgc3ByaW50X3RpbWUodGFyZ2V0LCBiMSkpOworCX0KKwlpZiAodGJbVENBX1BJRV9UVVBEQVRFXSAmJgorCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfUElFX1RVUERBVEVdKSA+PSBzaXplb2YoX191MzIpKSB7CisJCXR1cGRhdGUgPSBydGFfZ2V0YXR0cl91MzIodGJbVENBX1BJRV9UVVBEQVRFXSk7CisJCWZwcmludGYoZiwgInR1cGRhdGUgJXMgIiwgc3ByaW50X3RpbWUodHVwZGF0ZSwgYjEpKTsKKwl9CisJaWYgKHRiW1RDQV9QSUVfQUxQSEFdICYmCisJICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9QSUVfQUxQSEFdKSA+PSBzaXplb2YoX191MzIpKSB7CisJCWFscGhhID0gcnRhX2dldGF0dHJfdTMyKHRiW1RDQV9QSUVfQUxQSEFdKTsKKwkJZnByaW50ZihmLCAiYWxwaGEgJXUgIiwgYWxwaGEpOworCX0KKwlpZiAodGJbVENBX1BJRV9CRVRBXSAmJgorCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfUElFX0JFVEFdKSA+PSBzaXplb2YoX191MzIpKSB7CisJCWJldGEgPSBydGFfZ2V0YXR0cl91MzIodGJbVENBX1BJRV9CRVRBXSk7CisJCWZwcmludGYoZiwgImJldGEgJXUgIiwgYmV0YSk7CisJfQorCisJaWYgKHRiW1RDQV9QSUVfRUNOXSAmJiBSVEFfUEFZTE9BRCh0YltUQ0FfUElFX0VDTl0pID49IHNpemVvZihfX3UzMikpIHsKKwkJZWNuID0gcnRhX2dldGF0dHJfdTMyKHRiW1RDQV9QSUVfRUNOXSk7CisJCWlmIChlY24pCisJCQlmcHJpbnRmKGYsICJlY24gIik7CisJfQorCisJaWYgKHRiW1RDQV9QSUVfQllURU1PREVdICYmCisJICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9QSUVfQllURU1PREVdKSA+PSBzaXplb2YoX191MzIpKSB7CisJCWJ5dGVtb2RlID0gcnRhX2dldGF0dHJfdTMyKHRiW1RDQV9QSUVfQllURU1PREVdKTsKKwkJaWYgKGJ5dGVtb2RlKQorCQkJZnByaW50ZihmLCAiYnl0ZW1vZGUgIik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGllX3ByaW50X3hzdGF0cyhzdHJ1Y3QgcWRpc2NfdXRpbCAqcXUsIEZJTEUgKmYsCisJCQkgICAgc3RydWN0IHJ0YXR0ciAqeHN0YXRzKQoreworCXN0cnVjdCB0Y19waWVfeHN0YXRzICpzdDsKKworCWlmICh4c3RhdHMgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoUlRBX1BBWUxPQUQoeHN0YXRzKSA8IHNpemVvZigqc3QpKQorCQlyZXR1cm4gLTE7CisKKwlzdCA9IFJUQV9EQVRBKHhzdGF0cyk7CisJLypwcm9iIGlzIHJldHVybmVkIGFzIGEgZnJhY2lvbiBvZiBtYXhpbXVtIGludGVnZXIgdmFsdWUgKi8KKwlmcHJpbnRmKGYsICJwcm9iICVmIGRlbGF5ICV1dXMgYXZnX2RxX3JhdGUgJXVcbiIsCisJCShkb3VibGUpc3QtPnByb2IgLyAoZG91YmxlKTB4ZmZmZmZmZmYsIHN0LT5kZWxheSwKKwkJc3QtPmF2Z19kcV9yYXRlKTsKKwlmcHJpbnRmKGYsICJwa3RzX2luICV1IG92ZXJsaW1pdCAldSBkcm9wcGVkICV1IG1heHEgJXUgZWNuX21hcmsgJXVcbiIsCisJCXN0LT5wYWNrZXRzX2luLCBzdC0+b3ZlcmxpbWl0LCBzdC0+ZHJvcHBlZCwgc3QtPm1heHEsCisJCXN0LT5lY25fbWFyayk7CisJcmV0dXJuIDA7CisKK30KKworc3RydWN0IHFkaXNjX3V0aWwgcGllX3FkaXNjX3V0aWwgPSB7CisJLmlkID0gInBpZSIsCisJLnBhcnNlX3FvcHQJPSBwaWVfcGFyc2Vfb3B0LAorCS5wcmludF9xb3B0CT0gcGllX3ByaW50X29wdCwKKwkucHJpbnRfeHN0YXRzCT0gcGllX3ByaW50X3hzdGF0cywKK307CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy9xX3ByaW8uYyBiL2lwcm91dGUyL3RjL3FfcHJpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMzZiZWMKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy9xX3ByaW8uYwpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIHFfcHJpby5jCQlQUklPLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0Y191dGlsLmgiCisKK3N0YXRpYyB2b2lkIGV4cGxhaW4odm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAuLi4gcHJpbyBiYW5kcyBOVU1CRVIgcHJpb21hcCBQMSBQMi4uLlttdWx0aXF1ZXVlXVxuIik7Cit9CisKK3N0YXRpYyBpbnQgcHJpb19wYXJzZV9vcHQoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlpbnQgcG1hcF9tb2RlID0gMDsKKwlpbnQgaWR4ID0gMDsKKwlzdHJ1Y3QgdGNfcHJpb19xb3B0IG9wdD17Myx7IDEsIDIsIDIsIDIsIDEsIDIsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEgfX07CisJc3RydWN0IHJ0YXR0ciAqbmVzdDsKKwl1bnNpZ25lZCBjaGFyIG1xID0gMDsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAoc3RyY21wKCphcmd2LCAiYmFuZHMiKSA9PSAwKSB7CisJCQlpZiAocG1hcF9tb2RlKQorCQkJCWV4cGxhaW4oKTsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X2ludGVnZXIoJm9wdC5iYW5kcywgKmFyZ3YsIDEwKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImJhbmRzXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJwcmlvbWFwIikgPT0gMCkgeworCQkJaWYgKHBtYXBfbW9kZSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiRXJyb3I6IGR1cGxpY2F0ZSBwcmlvbWFwXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwbWFwX21vZGUgPSAxOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm11bHRpcXVldWUiKSA9PSAwKSB7CisJCQltcSA9IDE7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaGVscCIpID09IDApIHsKKwkJCWV4cGxhaW4oKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHsKKwkJCXVuc2lnbmVkIGJhbmQ7CisJCQlpZiAoIXBtYXBfbW9kZSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiV2hhdCBpcyBcIiVzXCI/XG4iLCAqYXJndik7CisJCQkJZXhwbGFpbigpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChnZXRfdW5zaWduZWQoJmJhbmQsICphcmd2LCAxMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJwcmlvbWFwXCIgZWxlbWVudFxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKGJhbmQgPj0gb3B0LmJhbmRzKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJcInByaW9tYXBcIiBlbGVtZW50IGlzIG91dCBvZiBiYW5kc1xuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKGlkeCA+IFRDX1BSSU9fTUFYKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJcInByaW9tYXBcIiBpbmRleCA+IFRDX1BSSU9fTUFYPSV1XG4iLCBUQ19QUklPX01BWCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJb3B0LnByaW9tYXBbaWR4KytdID0gYmFuZDsKKwkJfQorCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisKKy8qCisJaWYgKHBtYXBfbW9kZSkgeworCQlmb3IgKDsgaWR4IDwgVENfUFJJT19NQVg7IGlkeCsrKQorCQkJb3B0LnByaW9tYXBbaWR4XSA9IG9wdC5wcmlvbWFwW1RDX1BSSU9fQkVTVEVGRk9SVF07CisJfQorKi8KKwluZXN0ID0gYWRkYXR0cl9uZXN0X2NvbXBhdChuLCAxMDI0LCBUQ0FfT1BUSU9OUywgJm9wdCwgc2l6ZW9mKG9wdCkpOworCWlmIChtcSkKKwkJYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9QUklPX01RLCBOVUxMLCAwKTsKKwlhZGRhdHRyX25lc3RfY29tcGF0X2VuZChuLCBuZXN0KTsKKwlyZXR1cm4gMDsKK30KKworaW50IHByaW9fcHJpbnRfb3B0KHN0cnVjdCBxZGlzY191dGlsICpxdSwgRklMRSAqZiwgc3RydWN0IHJ0YXR0ciAqb3B0KQoreworCWludCBpOworCXN0cnVjdCB0Y19wcmlvX3FvcHQgKnFvcHQ7CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX1BSSU9fTUFYKzFdOworCisJaWYgKG9wdCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWlmIChwYXJzZV9ydGF0dHJfbmVzdGVkX2NvbXBhdCh0YiwgVENBX1BSSU9fTUFYLCBvcHQsIHFvcHQsCisJCQkJCXNpemVvZigqcW9wdCkpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworCWZwcmludGYoZiwgImJhbmRzICV1IHByaW9tYXAgIiwgcW9wdC0+YmFuZHMpOworCWZvciAoaT0wOyBpPD1UQ19QUklPX01BWDsgaSsrKQorCQlmcHJpbnRmKGYsICIgJWQiLCBxb3B0LT5wcmlvbWFwW2ldKTsKKworCWlmICh0YltUQ0FfUFJJT19NUV0pCisJCWZwcmludGYoZiwgIiBtdWx0aXF1ZXVlOiAlcyAiLAorCQkJcnRhX2dldGF0dHJfdTgodGJbVENBX1BSSU9fTVFdKSA/ICJvbiIgOiAib2ZmIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHFkaXNjX3V0aWwgcHJpb19xZGlzY191dGlsID0geworCS5pZAkgCT0gInByaW8iLAorCS5wYXJzZV9xb3B0CT0gcHJpb19wYXJzZV9vcHQsCisJLnByaW50X3FvcHQJPSBwcmlvX3ByaW50X29wdCwKK307CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy9xX3FmcS5jIGIvaXByb3V0ZTIvdGMvcV9xZnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWI0ZDg0Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGMvcV9xZnEuYwpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIHFfcWZxLmMJUUZRLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CVN0ZXBoZW4gSGVtbWluZ2VyIDxzaGVtbWluZ2VyQHZ5YXR0YS5jb20+CisgKgkJRmFiaW8gQ2hlY2NvbmkgPGZhYmlvQGdhbmRhbGYuc3NzdXAuaXQ+CisgKgorICovCisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0Y191dGlsLmgiCisKK3N0YXRpYyB2b2lkIGV4cGxhaW4odm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAuLi4gcWZxXG4iKTsKK30KKworc3RhdGljIHZvaWQgZXhwbGFpbjEoY29uc3QgY2hhciAqYXJnKQoreworCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcIiVzXCJcbiIsIGFyZyk7Cit9CisKK3N0YXRpYyB2b2lkIGV4cGxhaW5fY2xhc3Modm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAuLi4gcWZxIHdlaWdodCBOVU1CRVIgbWF4cGt0IEJZVEVTXG4iKTsKK30KKworc3RhdGljIGludCBxZnFfcGFyc2Vfb3B0KHN0cnVjdCBxZGlzY191dGlsICpxdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCQkJIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJXaGF0IGlzIFwiJXNcIj9cbiIsICphcmd2KTsKKwkJCWV4cGxhaW4oKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxZnFfcGFyc2VfY2xhc3Nfb3B0KHN0cnVjdCBxZGlzY191dGlsICpxdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCQkJICAgICAgIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlzdHJ1Y3QgcnRhdHRyICp0YWlsOworCV9fdTMyIHRtcDsKKworCXRhaWwgPSBOTE1TR19UQUlMKG4pOworCWFkZGF0dHJfbChuLCA0MDk2LCBUQ0FfT1BUSU9OUywgTlVMTCwgMCk7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJ3ZWlnaHQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJnRtcCwgKmFyZ3YsIDEwKSkgeworCQkJCWV4cGxhaW4xKCJ3ZWlnaHQiKTsgcmV0dXJuIC0xOworCQkJfQorCQkJYWRkYXR0cjMyKG4sIDQwOTYsIFRDQV9RRlFfV0VJR0hULCB0bXApOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJtYXhwa3QiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJnRtcCwgKmFyZ3YsIDEwKSkgeworCQkJCWV4cGxhaW4xKCJtYXhwa3QiKTsgcmV0dXJuIC0xOworCQkJfQorCQkJYWRkYXR0cjMyKG4sIDQwOTYsIFRDQV9RRlFfTE1BWCwgdG1wKTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJZXhwbGFpbl9jbGFzcygpOworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJXaGF0IGlzIFwiJXNcIj9cbiIsICphcmd2KTsKKwkJCWV4cGxhaW5fY2xhc3MoKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisKKwl0YWlsLT5ydGFfbGVuID0gKHZvaWQgKilOTE1TR19UQUlMKG4pIC0gKHZvaWQgKil0YWlsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcWZxX3ByaW50X29wdChzdHJ1Y3QgcWRpc2NfdXRpbCAqcXUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKm9wdCkKK3sKKwlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfUUZRX01BWCArIDFdOworCisJaWYgKG9wdCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXBhcnNlX3J0YXR0cl9uZXN0ZWQodGIsIFRDQV9RRlFfTUFYLCBvcHQpOworCisJaWYgKHRiW1RDQV9RRlFfV0VJR0hUXSkgeworCQlmcHJpbnRmKGYsICJ3ZWlnaHQgJXUgIiwKKwkJCXJ0YV9nZXRhdHRyX3UzMih0YltUQ0FfUUZRX1dFSUdIVF0pKTsKKwl9CisKKwlpZiAodGJbVENBX1FGUV9MTUFYXSkgeworCQlmcHJpbnRmKGYsICJtYXhwa3QgJXUgIiwKKwkJCXJ0YV9nZXRhdHRyX3UzMih0YltUQ0FfUUZRX0xNQVhdKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBxZGlzY191dGlsIHFmcV9xZGlzY191dGlsID0geworCS5pZAkJPSAicWZxIiwKKwkucGFyc2VfcW9wdAk9IHFmcV9wYXJzZV9vcHQsCisJLnByaW50X3FvcHQJPSBxZnFfcHJpbnRfb3B0LAorCS5wYXJzZV9jb3B0CT0gcWZxX3BhcnNlX2NsYXNzX29wdCwKKwkucHJpbnRfY29wdAk9IHFmcV9wcmludF9vcHQsCit9OwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvcV9yZWQuYyBiL2lwcm91dGUyL3RjL3FfcmVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkODZjNwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL3FfcmVkLmMKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisgKiBxX3JlZC5jCQlSRUQuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0Y191dGlsLmgiCisKKyNpbmNsdWRlICJ0Y19yZWQuaCIKKworc3RhdGljIHZvaWQgZXhwbGFpbih2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IC4uLiByZWQgbGltaXQgQllURVMgW21pbiBCWVRFU10gW21heCBCWVRFU10gYXZwa3QgQllURVMgW2J1cnN0IFBBQ0tFVFNdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgIFthZGFwdGl2ZV0gW3Byb2JhYmlsaXR5IFBST0JBQklMSVRZXSBbYmFuZHdpZHRoIEtCUFNdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgIFtlY25dIFtoYXJkZHJvcF1cbiIpOworfQorCitzdGF0aWMgaW50IHJlZF9wYXJzZV9vcHQoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlzdHJ1Y3QgdGNfcmVkX3FvcHQgb3B0OworCXVuc2lnbmVkIGJ1cnN0ID0gMDsKKwl1bnNpZ25lZCBhdnBrdCA9IDA7CisJZG91YmxlIHByb2JhYmlsaXR5ID0gMC4wMjsKKwl1bnNpZ25lZCByYXRlID0gMDsKKwlpbnQgcGFybTsKKwlfX3U4IHNidWZbMjU2XTsKKwlfX3UzMiBtYXhfUDsKKwlzdHJ1Y3QgcnRhdHRyICp0YWlsOworCisJbWVtc2V0KCZvcHQsIDAsIHNpemVvZihvcHQpKTsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAoc3RyY21wKCphcmd2LCAibGltaXQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9zaXplKCZvcHQubGltaXQsICphcmd2KSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImxpbWl0XCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJtaW4iKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9zaXplKCZvcHQucXRoX21pbiwgKmFyZ3YpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwibWluXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJtYXgiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9zaXplKCZvcHQucXRoX21heCwgKmFyZ3YpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwibWF4XCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJidXJzdCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3Vuc2lnbmVkKCZidXJzdCwgKmFyZ3YsIDApKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwiYnVyc3RcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImF2cGt0IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfc2l6ZSgmYXZwa3QsICphcmd2KSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImF2cGt0XCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJwcm9iYWJpbGl0eSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoc3NjYW5mKCphcmd2LCAiJWxnIiwgJnByb2JhYmlsaXR5KSAhPSAxKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwicHJvYmFiaWxpdHlcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImJhbmR3aWR0aCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3JhdGUoJnJhdGUsICphcmd2KSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImJhbmR3aWR0aFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZWNuIikgPT0gMCkgeworCQkJb3B0LmZsYWdzIHw9IFRDX1JFRF9FQ047CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaGFyZGRyb3AiKSA9PSAwKSB7CisJCQlvcHQuZmxhZ3MgfD0gVENfUkVEX0hBUkREUk9QOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImFkYXB0YXRpdmUiKSA9PSAwKSB7CisJCQlvcHQuZmxhZ3MgfD0gVENfUkVEX0FEQVBUQVRJVkU7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiYWRhcHRpdmUiKSA9PSAwKSB7CisJCQlvcHQuZmxhZ3MgfD0gVENfUkVEX0FEQVBUQVRJVkU7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaGVscCIpID09IDApIHsKKwkJCWV4cGxhaW4oKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiV2hhdCBpcyBcIiVzXCI/XG4iLCAqYXJndik7CisJCQlleHBsYWluKCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJaWYgKCFvcHQubGltaXQgfHwgIWF2cGt0KSB7CisJCWZwcmludGYoc3RkZXJyLCAiUkVEOiBSZXF1aXJlZCBwYXJhbWV0ZXIgKGxpbWl0LCBhdnBrdCkgaXMgbWlzc2luZ1xuIik7CisJCXJldHVybiAtMTsKKwl9CisJLyogQ29tcHV0ZSBkZWZhdWx0IG1pbi9tYXggdGhyZXNob2xkcyBiYXNlZCBvbgorCSAqIFNhbGx5IEZsb3lkJ3MgcmVjb21tZW5kYXRpb25zOgorCSAqIGh0dHA6Ly93d3cuaWNpci5vcmcvZmxveWQvUkVEcGFyYW1ldGVycy50eHQKKwkgKi8KKwlpZiAoIW9wdC5xdGhfbWF4KQorCQlvcHQucXRoX21heCA9IG9wdC5xdGhfbWluID8gb3B0LnF0aF9taW4gKiAzIDogb3B0LmxpbWl0IC8gNDsKKwlpZiAoIW9wdC5xdGhfbWluKQorCQlvcHQucXRoX21pbiA9IG9wdC5xdGhfbWF4IC8gMzsKKwlpZiAoIWJ1cnN0KQorCQlidXJzdCA9ICgyICogb3B0LnF0aF9taW4gKyBvcHQucXRoX21heCkgLyAoMyAqIGF2cGt0KTsKKwlpZiAoIXJhdGUpIHsKKwkJZ2V0X3JhdGUoJnJhdGUsICIxME1iaXQiKTsKKwkJZnByaW50ZihzdGRlcnIsICJSRUQ6IHNldCBiYW5kd2lkdGggdG8gMTBNYml0XG4iKTsKKwl9CisJaWYgKChwYXJtID0gdGNfcmVkX2V2YWxfZXdtYShvcHQucXRoX21pbiwgYnVyc3QsIGF2cGt0KSkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiUkVEOiBmYWlsZWQgdG8gY2FsY3VsYXRlIEVXTUEgY29uc3RhbnQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAocGFybSA+PSAxMCkKKwkJZnByaW50ZihzdGRlcnIsICJSRUQ6IFdBUk5JTkcuIEJ1cnN0ICV1IHNlZW1zIHRvIGJlIHRvbyBsYXJnZS5cbiIsIGJ1cnN0KTsKKwlvcHQuV2xvZyA9IHBhcm07CisJaWYgKChwYXJtID0gdGNfcmVkX2V2YWxfUChvcHQucXRoX21pbiwgb3B0LnF0aF9tYXgsIHByb2JhYmlsaXR5KSkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiUkVEOiBmYWlsZWQgdG8gY2FsY3VsYXRlIHByb2JhYmlsaXR5LlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJb3B0LlBsb2cgPSBwYXJtOworCWlmICgocGFybSA9IHRjX3JlZF9ldmFsX2lkbGVfZGFtcGluZyhvcHQuV2xvZywgYXZwa3QsIHJhdGUsIHNidWYpKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJSRUQ6IGZhaWxlZCB0byBjYWxjdWxhdGUgaWRsZSBkYW1waW5nIHRhYmxlLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJb3B0LlNjZWxsX2xvZyA9IHBhcm07CisKKwl0YWlsID0gTkxNU0dfVEFJTChuKTsKKwlhZGRhdHRyX2wobiwgMTAyNCwgVENBX09QVElPTlMsIE5VTEwsIDApOworCWFkZGF0dHJfbChuLCAxMDI0LCBUQ0FfUkVEX1BBUk1TLCAmb3B0LCBzaXplb2Yob3B0KSk7CisJYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9SRURfU1RBQiwgc2J1ZiwgMjU2KTsKKwltYXhfUCA9IHByb2JhYmlsaXR5ICogcG93KDIsIDMyKTsKKwlhZGRhdHRyX2wobiwgMTAyNCwgVENBX1JFRF9NQVhfUCwgJm1heF9QLCBzaXplb2YobWF4X1ApKTsKKwl0YWlsLT5ydGFfbGVuID0gKHZvaWQgKikgTkxNU0dfVEFJTChuKSAtICh2b2lkICopIHRhaWw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVkX3ByaW50X29wdChzdHJ1Y3QgcWRpc2NfdXRpbCAqcXUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKm9wdCkKK3sKKwlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfUkVEX01BWCArIDFdOworCXN0cnVjdCB0Y19yZWRfcW9wdCAqcW9wdDsKKwlfX3UzMiBtYXhfUCA9IDA7CisJU1BSSU5UX0JVRihiMSk7CisJU1BSSU5UX0JVRihiMik7CisJU1BSSU5UX0JVRihiMyk7CisKKwlpZiAob3B0ID09IE5VTEwpCisJCXJldHVybiAwOworCisJcGFyc2VfcnRhdHRyX25lc3RlZCh0YiwgVENBX1JFRF9NQVgsIG9wdCk7CisKKwlpZiAodGJbVENBX1JFRF9QQVJNU10gPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCXFvcHQgPSBSVEFfREFUQSh0YltUQ0FfUkVEX1BBUk1TXSk7CisJaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9SRURfUEFSTVNdKSAgPCBzaXplb2YoKnFvcHQpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAodGJbVENBX1JFRF9NQVhfUF0gJiYKKwkgICAgUlRBX1BBWUxPQUQodGJbVENBX1JFRF9NQVhfUF0pID49IHNpemVvZihfX3UzMikpCisJCW1heF9QID0gcnRhX2dldGF0dHJfdTMyKHRiW1RDQV9SRURfTUFYX1BdKTsKKworCWZwcmludGYoZiwgImxpbWl0ICVzIG1pbiAlcyBtYXggJXMgIiwKKwkJc3ByaW50X3NpemUocW9wdC0+bGltaXQsIGIxKSwKKwkJc3ByaW50X3NpemUocW9wdC0+cXRoX21pbiwgYjIpLAorCQlzcHJpbnRfc2l6ZShxb3B0LT5xdGhfbWF4LCBiMykpOworCWlmIChxb3B0LT5mbGFncyAmIFRDX1JFRF9FQ04pCisJCWZwcmludGYoZiwgImVjbiAiKTsKKwlpZiAocW9wdC0+ZmxhZ3MgJiBUQ19SRURfSEFSRERST1ApCisJCWZwcmludGYoZiwgImhhcmRkcm9wICIpOworCWlmIChxb3B0LT5mbGFncyAmIFRDX1JFRF9BREFQVEFUSVZFKQorCQlmcHJpbnRmKGYsICJhZGFwdGl2ZSAiKTsKKwlpZiAoc2hvd19kZXRhaWxzKSB7CisJCWZwcmludGYoZiwgImV3bWEgJXUgIiwgcW9wdC0+V2xvZyk7CisJCWlmIChtYXhfUCkKKwkJCWZwcmludGYoZiwgInByb2JhYmlsaXR5ICVsZyAiLCBtYXhfUCAvIHBvdygyLCAzMikpOworCQllbHNlCisJCQlmcHJpbnRmKGYsICJQbG9nICV1ICIsIHFvcHQtPlBsb2cpOworCQlmcHJpbnRmKGYsICJTY2VsbF9sb2cgJXUiLCBxb3B0LT5TY2VsbF9sb2cpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWRfcHJpbnRfeHN0YXRzKHN0cnVjdCBxZGlzY191dGlsICpxdSwgRklMRSAqZiwgc3RydWN0IHJ0YXR0ciAqeHN0YXRzKQoreworI2lmZGVmIFRDX1JFRF9FQ04KKwlzdHJ1Y3QgdGNfcmVkX3hzdGF0cyAqc3Q7CisKKwlpZiAoeHN0YXRzID09IE5VTEwpCisJCXJldHVybiAwOworCisJaWYgKFJUQV9QQVlMT0FEKHhzdGF0cykgPCBzaXplb2YoKnN0KSkKKwkJcmV0dXJuIC0xOworCisJc3QgPSBSVEFfREFUQSh4c3RhdHMpOworCWZwcmludGYoZiwgIiAgbWFya2VkICV1IGVhcmx5ICV1IHBkcm9wICV1IG90aGVyICV1IiwKKwkJc3QtPm1hcmtlZCwgc3QtPmVhcmx5LCBzdC0+cGRyb3AsIHN0LT5vdGhlcik7CisJcmV0dXJuIDA7CisKKyNlbmRpZgorCXJldHVybiAwOworfQorCisKK3N0cnVjdCBxZGlzY191dGlsIHJlZF9xZGlzY191dGlsID0geworCS5pZAkJPSAicmVkIiwKKwkucGFyc2VfcW9wdAk9IHJlZF9wYXJzZV9vcHQsCisJLnByaW50X3FvcHQJPSByZWRfcHJpbnRfb3B0LAorCS5wcmludF94c3RhdHMJPSByZWRfcHJpbnRfeHN0YXRzLAorfTsKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RjL3FfcnIuYyBiL2lwcm91dGUyL3RjL3FfcnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGE5MTY1Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGMvcV9yci5jCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogcV9yci5jCQlSUi4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglQSiBXYXNraWV3aWN6LCA8cGV0ZXIucC53YXNraWV3aWN6LmpyQGludGVsLmNvbT4KKyAqIE9yaWdpbmFsIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4gKGZyb20gUFJJTykKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInRjX3V0aWwuaCIKKworc3RhdGljIHZvaWQgZXhwbGFpbih2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IC4uLiByciBiYW5kcyBOVU1CRVIgcHJpb21hcCBQMSBQMi4uLiBbbXVsdGlxdWV1ZV1cbiIpOworfQorCisKK3N0YXRpYyBpbnQgcnJfcGFyc2Vfb3B0KHN0cnVjdCBxZGlzY191dGlsICpxdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJaW50IHBtYXBfbW9kZSA9IDA7CisJaW50IGlkeCA9IDA7CisJc3RydWN0IHRjX3ByaW9fcW9wdCBvcHQ9ezMseyAxLCAyLCAyLCAyLCAxLCAyLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxIH19OworCXN0cnVjdCBydGF0dHIgKm5lc3Q7CisJdW5zaWduZWQgY2hhciBtcSA9IDA7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgImJhbmRzIikgPT0gMCkgeworCQkJaWYgKHBtYXBfbW9kZSkKKwkJCQlleHBsYWluKCk7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9pbnRlZ2VyKCZvcHQuYmFuZHMsICphcmd2LCAxMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJiYW5kc1wiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAicHJpb21hcCIpID09IDApIHsKKwkJCWlmIChwbWFwX21vZGUpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBkdXBsaWNhdGUgcHJpb21hcFxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcG1hcF9tb2RlID0gMTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm11bHRpcXVldWUiKSA9PSAwKSB7CisJCQltcSA9IDE7CisJCX0gZWxzZSB7CisJCQl1bnNpZ25lZCBiYW5kOworCQkJaWYgKCFwbWFwX21vZGUpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIldoYXQgaXMgXCIlc1wiP1xuIiwgKmFyZ3YpOworCQkJCWV4cGxhaW4oKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAoZ2V0X3Vuc2lnbmVkKCZiYW5kLCAqYXJndiwgMTApKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwicHJpb21hcFwiIGVsZW1lbnRcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChiYW5kID4gb3B0LmJhbmRzKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJcInByaW9tYXBcIiBlbGVtZW50IGlzIG91dCBvZiBiYW5kc1xuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKGlkeCA+IFRDX1BSSU9fTUFYKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJcInByaW9tYXBcIiBpbmRleCA+IFRDX1JSX01BWD0ldVxuIiwgVENfUFJJT19NQVgpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCW9wdC5wcmlvbWFwW2lkeCsrXSA9IGJhbmQ7CisJCX0KKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJbmVzdCA9IGFkZGF0dHJfbmVzdF9jb21wYXQobiwgMTAyNCwgVENBX09QVElPTlMsICZvcHQsIHNpemVvZihvcHQpKTsKKwlpZiAobXEpCisJCWFkZGF0dHJfbChuLCAxMDI0LCBUQ0FfUFJJT19NUSwgTlVMTCwgMCk7CisJYWRkYXR0cl9uZXN0X2NvbXBhdF9lbmQobiwgbmVzdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnJfcHJpbnRfb3B0KHN0cnVjdCBxZGlzY191dGlsICpxdSwgRklMRSAqZiwgc3RydWN0IHJ0YXR0ciAqb3B0KQoreworCWludCBpOworCXN0cnVjdCB0Y19wcmlvX3FvcHQgKnFvcHQ7CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX1BSSU9fTUFYICsgMV07CisKKwlpZiAob3B0ID09IE5VTEwpCisJCXJldHVybiAwOworCisJaWYgKHBhcnNlX3J0YXR0cl9uZXN0ZWRfY29tcGF0KHRiLCBUQ0FfUFJJT19NQVgsIG9wdCwgcW9wdCwKKwkJCQkJCXNpemVvZigqcW9wdCkpKQorCQlyZXR1cm4gLTE7CisKKwlmcHJpbnRmKGYsICJiYW5kcyAldSBwcmlvbWFwICIsIHFvcHQtPmJhbmRzKTsKKwlmb3IgKGk9MDsgaSA8PSBUQ19QUklPX01BWDsgaSsrKQorCQlmcHJpbnRmKGYsICIgJWQiLCBxb3B0LT5wcmlvbWFwW2ldKTsKKworCWlmICh0YltUQ0FfUFJJT19NUV0pCisJCWZwcmludGYoZiwgIiBtdWx0aXF1ZXVlOiAlcyAiLAorCQkJcnRhX2dldGF0dHJfdTgodGJbVENBX1BSSU9fTVFdKSA/ICJvbiIgOiAib2ZmIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHFkaXNjX3V0aWwgcnJfcWRpc2NfdXRpbCA9IHsKKwkuaWQJIAk9ICJyciIsCisJLnBhcnNlX3FvcHQJPSBycl9wYXJzZV9vcHQsCisJLnByaW50X3FvcHQJPSBycl9wcmludF9vcHQsCit9OwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvcV9zZmIuYyBiL2lwcm91dGUyL3RjL3Ffc2ZiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjExYzMzYQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL3Ffc2ZiLmMKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBxX3NmYi5jCVN0b2NoYXN0aWMgRmFpciBCbHVlLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUp1bGl1c3ogQ2hyb2JvY3playA8amNoQHBwcy5qdXNzaWV1LmZyPgorICoKKyAqLworCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0Y191dGlsLmgiCisKK3N0YXRpYyB2b2lkIGV4cGxhaW4odm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwKKwkJIlVzYWdlOiAuLi4gc2ZiIFsgcmVoYXNoIFNFQ1MgXSBbIGRiIFNFQ1MgXVxuIgorCQkiCSAgICBbIGxpbWl0IFBBQ0tFVFMgXSBbIG1heCBQQUNLRVRTIF0gWyB0YXJnZXQgUEFDS0VUUyBdXG4iCisJCSIJICAgIFsgaW5jcmVtZW50IEZMT0FUIF0gWyBkZWNyZW1lbnQgRkxPQVQgXVxuIgorCQkiCSAgICBbIHBlbmFsdHlfcmF0ZSBQUFMgXSBbIHBlbmFsdHlfYnVyc3QgUEFDS0VUUyBdXG4iKTsKK30KKworc3RhdGljIGludCBnZXRfcHJvYihfX3UzMiAqdmFsLCBjb25zdCBjaGFyICphcmcpCit7CisJZG91YmxlIGQ7CisJY2hhciAqcHRyOworCisJaWYgKCFhcmcgfHwgISphcmcpCisJCXJldHVybiAtMTsKKwlkID0gc3RydG9kKGFyZywgJnB0cik7CisJaWYgKCFwdHIgfHwgcHRyID09IGFyZyB8fCBkIDwgMC4wIHx8IGQgPiAxLjApCisJCXJldHVybiAtMTsKKwkqdmFsID0gKF9fdTMyKShkICogU0ZCX01BWF9QUk9CICsgMC41KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZmJfcGFyc2Vfb3B0KHN0cnVjdCBxZGlzY191dGlsICpxdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCQkJIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlzdHJ1Y3QgdGNfc2ZiX3FvcHQgb3B0OworCXN0cnVjdCBydGF0dHIgKnRhaWw7CisKKwltZW1zZXQoJm9wdCwgMCwgc2l6ZW9mKG9wdCkpOworCW9wdC5yZWhhc2hfaW50ZXJ2YWwgPSA2MDAqMTAwMDsKKwlvcHQud2FybXVwX3RpbWUgPSA2MCoxMDAwOworCW9wdC5wZW5hbHR5X3JhdGUgPSAxMDsKKwlvcHQucGVuYWx0eV9idXJzdCA9IDIwOworCW9wdC5pbmNyZW1lbnQgPSAoU0ZCX01BWF9QUk9CICsgMTAwMCkgLyAyMDAwOworCW9wdC5kZWNyZW1lbnQgPSAoU0ZCX01BWF9QUk9CICsgMTAwMDApIC8gMjAwMDA7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkgICAgaWYgKHN0cmNtcCgqYXJndiwgInJlaGFzaCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmb3B0LnJlaGFzaF9pbnRlcnZhbCwgKmFyZ3YsIDApKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwicmVoYXNoXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJkYiIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmb3B0Lndhcm11cF90aW1lLCAqYXJndiwgMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJkYlwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibGltaXQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJm9wdC5saW1pdCwgKmFyZ3YsIDApKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwibGltaXRcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm1heCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmb3B0Lm1heCwgKmFyZ3YsIDApKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwibWF4XCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJ0YXJnZXQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJm9wdC5iaW5fc2l6ZSwgKmFyZ3YsIDApKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwidGFyZ2V0XCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJpbmNyZW1lbnQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9wcm9iKCZvcHQuaW5jcmVtZW50LCAqYXJndikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJpbmNyZW1lbnRcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImRlY3JlbWVudCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3Byb2IoJm9wdC5kZWNyZW1lbnQsICphcmd2KSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImRlY3JlbWVudFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAicGVuYWx0eV9yYXRlIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTMyKCZvcHQucGVuYWx0eV9yYXRlLCAqYXJndiwgMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJwZW5hbHR5X3JhdGVcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInBlbmFsdHlfYnVyc3QiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJm9wdC5wZW5hbHR5X2J1cnN0LCAqYXJndiwgMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJwZW5hbHR5X2J1cnN0XCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiV2hhdCBpcyBcIiVzXCI/XG4iLCAqYXJndik7CisJCQlleHBsYWluKCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJaWYgKG9wdC5tYXggPT0gMCkgeworCQlpZiAob3B0LmJpbl9zaXplID49IDEpCisJCQlvcHQubWF4ID0gKG9wdC5iaW5fc2l6ZSAqIDUgKyAxKSAvIDQ7CisJCWVsc2UKKwkJCW9wdC5tYXggPSAyNTsKKwl9CisJaWYgKG9wdC5iaW5fc2l6ZSA9PSAwKQorCQlvcHQuYmluX3NpemUgPSAob3B0Lm1heCAqIDQgKyAzKSAvIDU7CisKKwl0YWlsID0gTkxNU0dfVEFJTChuKTsKKwlhZGRhdHRyX2wobiwgMTAyNCwgVENBX09QVElPTlMsIE5VTEwsIDApOworCWFkZGF0dHJfbChuLCAxMDI0LCBUQ0FfU0ZCX1BBUk1TLCAmb3B0LCBzaXplb2Yob3B0KSk7CisJdGFpbC0+cnRhX2xlbiA9ICh2b2lkICopIE5MTVNHX1RBSUwobikgLSAodm9pZCAqKSB0YWlsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNmYl9wcmludF9vcHQoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBGSUxFICpmLCBzdHJ1Y3QgcnRhdHRyICpvcHQpCit7CisJc3RydWN0IHJ0YXR0ciAqdGJbX19UQ0FfU0ZCX01BWF07CisJc3RydWN0IHRjX3NmYl9xb3B0ICpxb3B0OworCisJaWYgKG9wdCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXBhcnNlX3J0YXR0cl9uZXN0ZWQodGIsIFRDQV9TRkJfTUFYLCBvcHQpOworCWlmICh0YltUQ0FfU0ZCX1BBUk1TXSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJcW9wdCA9IFJUQV9EQVRBKHRiW1RDQV9TRkJfUEFSTVNdKTsKKwlpZiAoUlRBX1BBWUxPQUQodGJbVENBX1NGQl9QQVJNU10pIDwgc2l6ZW9mKCpxb3B0KSkKKwkJcmV0dXJuIC0xOworCisJZnByaW50ZihmLAorCQkibGltaXQgJWQgbWF4ICVkIHRhcmdldCAlZFxuIgorCQkiICBpbmNyZW1lbnQgJS41ZiBkZWNyZW1lbnQgJS41ZiBwZW5hbHR5IHJhdGUgJWQgYnVyc3QgJWQgIgorCQkiKCV1bXMgJXVtcykiLAorCQlxb3B0LT5saW1pdCwgcW9wdC0+bWF4LCBxb3B0LT5iaW5fc2l6ZSwKKwkJKGRvdWJsZSlxb3B0LT5pbmNyZW1lbnQgLyBTRkJfTUFYX1BST0IsCisJCShkb3VibGUpcW9wdC0+ZGVjcmVtZW50IC8gU0ZCX01BWF9QUk9CLAorCQlxb3B0LT5wZW5hbHR5X3JhdGUsIHFvcHQtPnBlbmFsdHlfYnVyc3QsCisJCXFvcHQtPnJlaGFzaF9pbnRlcnZhbCwgcW9wdC0+d2FybXVwX3RpbWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2ZiX3ByaW50X3hzdGF0cyhzdHJ1Y3QgcWRpc2NfdXRpbCAqcXUsIEZJTEUgKmYsCisJCQkgICAgc3RydWN0IHJ0YXR0ciAqeHN0YXRzKQoreworICAgIHN0cnVjdCB0Y19zZmJfeHN0YXRzICpzdDsKKworICAgIGlmICh4c3RhdHMgPT0gTlVMTCkKKwkgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoUlRBX1BBWUxPQUQoeHN0YXRzKSA8IHNpemVvZigqc3QpKQorCSAgICByZXR1cm4gLTE7CisKKyAgICBzdCA9IFJUQV9EQVRBKHhzdGF0cyk7CisgICAgZnByaW50ZihmLAorCSAgICAiICBlYXJseWRyb3AgJXUgcGVuYWx0eWRyb3AgJXUgYnVja2V0ZHJvcCAldSBxdWV1ZWRyb3AgJXUgY2hpbGRkcm9wICV1IG1hcmtlZCAldVxuIgorCSAgICAiICBtYXhxbGVuICV1IG1heHByb2IgJS41ZiBhdmdwcm9iICUuNWYgIiwKKwkgICAgc3QtPmVhcmx5ZHJvcCwgc3QtPnBlbmFsdHlkcm9wLCBzdC0+YnVja2V0ZHJvcCwgc3QtPnF1ZXVlZHJvcCwgc3QtPmNoaWxkZHJvcCwKKwkgICAgc3QtPm1hcmtlZCwKKwkgICAgc3QtPm1heHFsZW4sIChkb3VibGUpc3QtPm1heHByb2IgLyBTRkJfTUFYX1BST0IsCisJCShkb3VibGUpc3QtPmF2Z3Byb2IgLyBTRkJfTUFYX1BST0IpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBxZGlzY191dGlsIHNmYl9xZGlzY191dGlsID0geworCS5pZAkJPSAic2ZiIiwKKwkucGFyc2VfcW9wdAk9IHNmYl9wYXJzZV9vcHQsCisJLnByaW50X3FvcHQJPSBzZmJfcHJpbnRfb3B0LAorCS5wcmludF94c3RhdHMJPSBzZmJfcHJpbnRfeHN0YXRzLAorfTsKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RjL3Ffc2ZxLmMgYi9pcHJvdXRlMi90Yy9xX3NmcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwODQ2YTkKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy9xX3NmcS5jCkBAIC0wLDAgKzEsMjc3IEBACisvKgorICogcV9zZnEuYwkJU0ZRLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAidGNfdXRpbC5oIgorI2luY2x1ZGUgInRjX3JlZC5oIgorCitzdGF0aWMgdm9pZCBleHBsYWluKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogLi4uIHNmcSBbIGxpbWl0IE5VTUJFUiBdIFsgcGVydHVyYiBTRUNTIF0gWyBxdWFudHVtIEJZVEVTIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgWyBkaXZpc29yIE5VTUJFUiBdIFsgZmxvd3MgTlVNQkVSXSBbIGRlcHRoIE5VTUJFUiBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgIFsgaGVhZGRyb3AgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICBbIHJlZGZsb3dsaW1pdCBCWVRFUyBdIFsgbWluIEJZVEVTIF0gWyBtYXggQllURVMgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICBbIGF2cGt0IEJZVEVTIF0gWyBidXJzdCBQQUNLRVRTIF0gWyBwcm9iYWJpbGl0eSBQIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgWyBlY24gXSBbIGhhcmRkcm9wIF1cbiIpOworfQorCitzdGF0aWMgaW50IHNmcV9wYXJzZV9vcHQoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlpbnQgb2sgPSAwLCByZWQgPSAwOworCXN0cnVjdCB0Y19zZnFfcW9wdF92MSBvcHQ7CisJdW5zaWduZWQgaW50IGJ1cnN0ID0gMDsKKwlpbnQgd2xvZzsKKwl1bnNpZ25lZCBpbnQgYXZwa3QgPSAxMDAwOworCWRvdWJsZSBwcm9iYWJpbGl0eSA9IDAuMDI7CisKKwltZW1zZXQoJm9wdCwgMCwgc2l6ZW9mKG9wdCkpOworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChzdHJjbXAoKmFyZ3YsICJxdWFudHVtIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfc2l6ZSgmb3B0LnYwLnF1YW50dW0sICphcmd2KSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImxpbWl0XCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCW9rKys7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAicGVydHVyYiIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X2ludGVnZXIoJm9wdC52MC5wZXJ0dXJiX3BlcmlvZCwgKmFyZ3YsIDApKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwicGVydHVyYlwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlvaysrOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImxpbWl0IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTMyKCZvcHQudjAubGltaXQsICphcmd2LCAwKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImxpbWl0XCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChvcHQudjAubGltaXQgPCAyKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwibGltaXRcIiwgbXVzdCBiZSA+IDFcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCW9rKys7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZGl2aXNvciIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmb3B0LnYwLmRpdmlzb3IsICphcmd2LCAwKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImRpdmlzb3JcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJb2srKzsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJmbG93cyIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmb3B0LnYwLmZsb3dzLCAqYXJndiwgMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJmbG93c1wiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlvaysrOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImRlcHRoIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfdTMyKCZvcHQuZGVwdGgsICphcmd2LCAwKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImZsb3dzXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCW9rKys7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaGVhZGRyb3AiKSA9PSAwKSB7CisJCQlvcHQuaGVhZGRyb3AgPSAxOworCQkJb2srKzsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJyZWRmbG93bGltaXQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJm9wdC5saW1pdCwgKmFyZ3YsIDApKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwicmVkZmxvd2xpbWl0XCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXJlZCsrOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm1pbiIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3UzMigmb3B0LnF0aF9taW4sICphcmd2LCAwKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcIm1pblwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlyZWQrKzsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJtYXgiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91MzIoJm9wdC5xdGhfbWF4LCAqYXJndiwgMCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJtYXhcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcmVkKys7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiYnVyc3QiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF91bnNpZ25lZCgmYnVyc3QsICphcmd2LCAwKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImJ1cnN0XCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXJlZCsrOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImF2cGt0IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfc2l6ZSgmYXZwa3QsICphcmd2KSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBcImF2cGt0XCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXJlZCsrOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInByb2JhYmlsaXR5IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChzc2NhbmYoKmFyZ3YsICIlbGciLCAmcHJvYmFiaWxpdHkpICE9IDEpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgXCJwcm9iYWJpbGl0eVwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlyZWQrKzsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJlY24iKSA9PSAwKSB7CisJCQlvcHQuZmxhZ3MgfD0gVENfUkVEX0VDTjsKKwkJCXJlZCsrOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImhhcmRkcm9wIikgPT0gMCkgeworCQkJb3B0LmZsYWdzIHw9IFRDX1JFRF9IQVJERFJPUDsKKwkJCXJlZCsrOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImhlbHAiKSA9PSAwKSB7CisJCQlleHBsYWluKCk7CisJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIldoYXQgaXMgXCIlc1wiP1xuIiwgKmFyZ3YpOworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWFyZ2MtLTsgYXJndisrOworCX0KKwlpZiAocmVkKSB7CisJCWlmICghb3B0LmxpbWl0KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlJlcXVpcmVkIHBhcmFtZXRlciAocmVkZmxvd2xpbWl0KSBpcyBtaXNzaW5nXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQkvKiBDb21wdXRlIGRlZmF1bHQgbWluL21heCB0aHJlc2hvbGRzIGJhc2VkIG9uCisJCSAgIFNhbGx5IEZsb3lkJ3MgcmVjb21tZW5kYXRpb25zOgorCQkgICBodHRwOi8vd3d3LmljaXIub3JnL2Zsb3lkL1JFRHBhcmFtZXRlcnMudHh0CisJCSovCisJCWlmICghb3B0LnF0aF9tYXgpCisJCQlvcHQucXRoX21heCA9IG9wdC5saW1pdCAvIDQ7CisJCWlmICghb3B0LnF0aF9taW4pCisJCQlvcHQucXRoX21pbiA9IG9wdC5xdGhfbWF4IC8gMzsKKwkJaWYgKCFidXJzdCkKKwkJCWJ1cnN0ID0gKDIgKiBvcHQucXRoX21pbiArIG9wdC5xdGhfbWF4KSAvICgzICogYXZwa3QpOworCisJCWlmIChvcHQucXRoX21heCA+IG9wdC5saW1pdCkgeworCQkJZnByaW50ZihzdGRlcnIsICJcIm1heFwiIGlzIGxhcmdlciB0aGFuIFwibGltaXRcIlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAob3B0LnF0aF9taW4gPj0gb3B0LnF0aF9tYXgpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiXCJtaW5cIiBpcyBub3Qgc21hbGxlciB0aGFuIFwibWF4XCJcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJd2xvZyA9IHRjX3JlZF9ldmFsX2V3bWEob3B0LnF0aF9taW4sIGJ1cnN0LCBhdnBrdCk7CisJCWlmICh3bG9nIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJTRlE6IGZhaWxlZCB0byBjYWxjdWxhdGUgRVdNQSBjb25zdGFudC5cbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmICh3bG9nID49IDEwKQorCQkJZnByaW50ZihzdGRlcnIsICJTRlE6IFdBUk5JTkcuIEJ1cnN0ICV1IHNlZW1zIHRvIGJlIHRvbyBsYXJnZS5cbiIsIGJ1cnN0KTsKKwkJb3B0Lldsb2cgPSB3bG9nOworCisJCXdsb2cgPSB0Y19yZWRfZXZhbF9QKG9wdC5xdGhfbWluLCBvcHQucXRoX21heCwgcHJvYmFiaWxpdHkpOworCQlpZiAod2xvZyA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiU0ZROiBmYWlsZWQgdG8gY2FsY3VsYXRlIHByb2JhYmlsaXR5LlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJb3B0LlBsb2cgPSB3bG9nOworCQlvcHQubWF4X1AgPSBwcm9iYWJpbGl0eSAqIHBvdygyLCAzMik7CisJfQorCisJaWYgKG9rIHx8IHJlZCkKKwkJYWRkYXR0cl9sKG4sIDEwMjQsIFRDQV9PUFRJT05TLCAmb3B0LCBzaXplb2Yob3B0KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2ZxX3ByaW50X29wdChzdHJ1Y3QgcWRpc2NfdXRpbCAqcXUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKm9wdCkKK3sKKwlzdHJ1Y3QgdGNfc2ZxX3FvcHQgKnFvcHQ7CisJc3RydWN0IHRjX3NmcV9xb3B0X3YxICpxb3B0X2V4dCA9IE5VTEw7CisJU1BSSU5UX0JVRihiMSk7CisJU1BSSU5UX0JVRihiMik7CisJU1BSSU5UX0JVRihiMyk7CisJaWYgKG9wdCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWlmIChSVEFfUEFZTE9BRChvcHQpICA8IHNpemVvZigqcW9wdCkpCisJCXJldHVybiAtMTsKKwlpZiAoUlRBX1BBWUxPQUQob3B0KSA+PSBzaXplb2YoKnFvcHRfZXh0KSkKKwkJcW9wdF9leHQgPSBSVEFfREFUQShvcHQpOworCXFvcHQgPSBSVEFfREFUQShvcHQpOworCWZwcmludGYoZiwgImxpbWl0ICV1cCAiLCBxb3B0LT5saW1pdCk7CisJZnByaW50ZihmLCAicXVhbnR1bSAlcyAiLCBzcHJpbnRfc2l6ZShxb3B0LT5xdWFudHVtLCBiMSkpOworCWlmIChxb3B0X2V4dCAmJiBxb3B0X2V4dC0+ZGVwdGgpCisJCWZwcmludGYoZiwgImRlcHRoICV1ICIsIHFvcHRfZXh0LT5kZXB0aCk7CisJaWYgKHFvcHRfZXh0ICYmIHFvcHRfZXh0LT5oZWFkZHJvcCkKKwkJZnByaW50ZihmLCAiaGVhZGRyb3AgIik7CisKKwlpZiAoc2hvd19kZXRhaWxzKSB7CisJCWZwcmludGYoZiwgImZsb3dzICV1LyV1ICIsIHFvcHQtPmZsb3dzLCBxb3B0LT5kaXZpc29yKTsKKwl9CisJZnByaW50ZihmLCAiZGl2aXNvciAldSAiLCBxb3B0LT5kaXZpc29yKTsKKwlpZiAocW9wdC0+cGVydHVyYl9wZXJpb2QpCisJCWZwcmludGYoZiwgInBlcnR1cmIgJWRzZWMgIiwgcW9wdC0+cGVydHVyYl9wZXJpb2QpOworCWlmIChxb3B0X2V4dCAmJiBxb3B0X2V4dC0+cXRoX21pbikgeworCQlmcHJpbnRmKGYsICJcbiBld21hICV1ICIsIHFvcHRfZXh0LT5XbG9nKTsKKwkJZnByaW50ZihmLCAibWluICVzIG1heCAlcyBwcm9iYWJpbGl0eSAlZyAiLAorCQkJc3ByaW50X3NpemUocW9wdF9leHQtPnF0aF9taW4sIGIyKSwKKwkJCXNwcmludF9zaXplKHFvcHRfZXh0LT5xdGhfbWF4LCBiMyksCisJCQlxb3B0X2V4dC0+bWF4X1AgLyBwb3coMiwgMzIpKTsKKwkJaWYgKHFvcHRfZXh0LT5mbGFncyAmIFRDX1JFRF9FQ04pCisJCQlmcHJpbnRmKGYsICJlY24gIik7CisJCWlmIChzaG93X3N0YXRzKSB7CisJCQlmcHJpbnRmKGYsICJcbiBwcm9iX21hcmsgJXUgcHJvYl9tYXJrX2hlYWQgJXUgcHJvYl9kcm9wICV1IiwKKwkJCQlxb3B0X2V4dC0+c3RhdHMucHJvYl9tYXJrLAorCQkJCXFvcHRfZXh0LT5zdGF0cy5wcm9iX21hcmtfaGVhZCwKKwkJCQlxb3B0X2V4dC0+c3RhdHMucHJvYl9kcm9wKTsKKwkJCWZwcmludGYoZiwgIlxuIGZvcmNlZF9tYXJrICV1IGZvcmNlZF9tYXJrX2hlYWQgJXUgZm9yY2VkX2Ryb3AgJXUiLAorCQkJCXFvcHRfZXh0LT5zdGF0cy5mb3JjZWRfbWFyaywKKwkJCQlxb3B0X2V4dC0+c3RhdHMuZm9yY2VkX21hcmtfaGVhZCwKKwkJCQlxb3B0X2V4dC0+c3RhdHMuZm9yY2VkX2Ryb3ApOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNmcV9wcmludF94c3RhdHMoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBGSUxFICpmLAorCQkJICAgIHN0cnVjdCBydGF0dHIgKnhzdGF0cykKK3sKKwlzdHJ1Y3QgdGNfc2ZxX3hzdGF0cyAqc3Q7CisKKwlpZiAoeHN0YXRzID09IE5VTEwpCisJCXJldHVybiAwOworCWlmIChSVEFfUEFZTE9BRCh4c3RhdHMpIDwgc2l6ZW9mKCpzdCkpCisJCXJldHVybiAtMTsKKwlzdCA9IFJUQV9EQVRBKHhzdGF0cyk7CisKKwlmcHJpbnRmKGYsICIgYWxsb3QgJWQgIiwgc3QtPmFsbG90KTsKKwlmcHJpbnRmKGYsICJcbiIpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcWRpc2NfdXRpbCBzZnFfcWRpc2NfdXRpbCA9IHsKKwkuaWQJCT0gInNmcSIsCisJLnBhcnNlX3FvcHQJPSBzZnFfcGFyc2Vfb3B0LAorCS5wcmludF9xb3B0CT0gc2ZxX3ByaW50X29wdCwKKwkucHJpbnRfeHN0YXRzCT0gc2ZxX3ByaW50X3hzdGF0cywKK307CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy9xX3RiZi5jIGIvaXByb3V0ZTIvdGMvcV90YmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTgxZTZmCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGMvcV90YmYuYwpAQCAtMCwwICsxLDMzMCBAQAorLyoKKyAqIHFfdGJmLmMJCVRCRi4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAidGNfdXRpbC5oIgorCitzdGF0aWMgdm9pZCBleHBsYWluKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogLi4uIHRiZiBsaW1pdCBCWVRFUyBidXJzdCBCWVRFU1svQllURVNdIHJhdGUgS0JQUyBbIG10dSBCWVRFU1svQllURVNdIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgWyBwZWFrcmF0ZSBLQlBTIF0gWyBsYXRlbmN5IFRJTUUgXSAiKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlsgb3ZlcmhlYWQgQllURVMgXSBbIGxpbmtsYXllciBUWVBFIF1cbiIpOworfQorCitzdGF0aWMgdm9pZCBleHBsYWluMShjb25zdCBjaGFyICphcmcsIGNvbnN0IGNoYXIgKnZhbCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgInRiZjogaWxsZWdhbCB2YWx1ZSBmb3IgXCIlc1wiOiBcIiVzXCJcbiIsIGFyZywgdmFsKTsKK30KKworCitzdGF0aWMgaW50IHRiZl9wYXJzZV9vcHQoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlpbnQgb2s9MDsKKwlzdHJ1Y3QgdGNfdGJmX3FvcHQgb3B0OworCV9fdTMyIHJ0YWJbMjU2XTsKKwlfX3UzMiBwdGFiWzI1Nl07CisJdW5zaWduZWQgYnVmZmVyPTAsIG10dT0wLCBtcHU9MCwgbGF0ZW5jeT0wOworCWludCBSY2VsbF9sb2c9LTEsIFBjZWxsX2xvZyA9IC0xOworCXVuc2lnbmVkIHNob3J0IG92ZXJoZWFkPTA7CisJdW5zaWduZWQgaW50IGxpbmtsYXllciA9IExJTktMQVlFUl9FVEhFUk5FVDsgLyogQXNzdW1lIGV0aGVybmV0ICovCisJc3RydWN0IHJ0YXR0ciAqdGFpbDsKKwlfX3U2NCByYXRlNjQgPSAwLCBwcmF0ZTY0ID0gMDsKKworCW1lbXNldCgmb3B0LCAwLCBzaXplb2Yob3B0KSk7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJsaW1pdCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAob3B0LmxpbWl0KSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJ0YmY6IGR1cGxpY2F0ZSBcImxpbWl0XCIgc3BlY2lmaWNhdGlvblxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKGxhdGVuY3kpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgInRiZjogc3BlY2lmeWluZyBib3RoIFwibGF0ZW5jeVwiIGFuZCBcImxpbWl0XCIgaXMgbm90IGFsbG93ZWRcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChnZXRfc2l6ZSgmb3B0LmxpbWl0LCAqYXJndikpIHsKKwkJCQlleHBsYWluMSgibGltaXQiLCAqYXJndik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJb2srKzsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAibGF0ZW5jeSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAobGF0ZW5jeSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAidGJmOiBkdXBsaWNhdGUgXCJsYXRlbmN5XCIgc3BlY2lmaWNhdGlvblxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKG9wdC5saW1pdCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAidGJmOiBzcGVjaWZ5aW5nIGJvdGggXCJsaW1pdFwiIGFuZCBcIi9sYXRlbmN5XCIgaXMgbm90IGFsbG93ZWRcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChnZXRfdGltZSgmbGF0ZW5jeSwgKmFyZ3YpKSB7CisJCQkJZXhwbGFpbjEoImxhdGVuY3kiLCAqYXJndik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJb2srKzsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiYnVyc3QiKSA9PSAwIHx8CisJCQlzdHJjbXAoKmFyZ3YsICJidWZmZXIiKSA9PSAwIHx8CisJCQlzdHJjbXAoKmFyZ3YsICJtYXhidXJzdCIpID09IDApIHsKKwkJCWNvbnN0IGNoYXIgKnBhcm1fbmFtZSA9ICphcmd2OworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChidWZmZXIpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgInRiZjogZHVwbGljYXRlIFwiYnVmZmVyL2J1cnN0L21heGJ1cnN0XCIgc3BlY2lmaWNhdGlvblxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKGdldF9zaXplX2FuZF9jZWxsKCZidWZmZXIsICZSY2VsbF9sb2csICphcmd2KSA8IDApIHsKKwkJCQlleHBsYWluMShwYXJtX25hbWUsICphcmd2KTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlvaysrOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm10dSIpID09IDAgfHwKKwkJCSAgIHN0cmNtcCgqYXJndiwgIm1pbmJ1cnN0IikgPT0gMCkgeworCQkJY29uc3QgY2hhciAqcGFybV9uYW1lID0gKmFyZ3Y7CisJCQlORVhUX0FSRygpOworCQkJaWYgKG10dSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAidGJmOiBkdXBsaWNhdGUgXCJtdHUvbWluYnVyc3RcIiBzcGVjaWZpY2F0aW9uXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAoZ2V0X3NpemVfYW5kX2NlbGwoJm10dSwgJlBjZWxsX2xvZywgKmFyZ3YpIDwgMCkgeworCQkJCWV4cGxhaW4xKHBhcm1fbmFtZSwgKmFyZ3YpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCW9rKys7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAibXB1IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChtcHUpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgInRiZjogZHVwbGljYXRlIFwibXB1XCIgc3BlY2lmaWNhdGlvblxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKGdldF9zaXplKCZtcHUsICphcmd2KSkgeworCQkJCWV4cGxhaW4xKCJtcHUiLCAqYXJndik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJb2srKzsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJyYXRlIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChyYXRlNjQpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgInRiZjogZHVwbGljYXRlIFwicmF0ZVwiIHNwZWNpZmljYXRpb25cbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChnZXRfcmF0ZTY0KCZyYXRlNjQsICphcmd2KSkgeworCQkJCWV4cGxhaW4xKCJyYXRlIiwgKmFyZ3YpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCW9rKys7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgInBlYWtyYXRlIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChwcmF0ZTY0KSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJ0YmY6IGR1cGxpY2F0ZSBcInBlYWtyYXRlXCIgc3BlY2lmaWNhdGlvblxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKGdldF9yYXRlNjQoJnByYXRlNjQsICphcmd2KSkgeworCQkJCWV4cGxhaW4xKCJwZWFrcmF0ZSIsICphcmd2KTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlvaysrOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJvdmVyaGVhZCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAob3ZlcmhlYWQpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgInRiZjogZHVwbGljYXRlIFwib3ZlcmhlYWRcIiBzcGVjaWZpY2F0aW9uXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAoZ2V0X3UxNigmb3ZlcmhlYWQsICphcmd2LCAxMCkpIHsKKwkJCQlleHBsYWluMSgib3ZlcmhlYWQiLCAqYXJndik7IHJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAibGlua2xheWVyIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfbGlua2xheWVyKCZsaW5rbGF5ZXIsICphcmd2KSkgeworCQkJCWV4cGxhaW4xKCJsaW5rbGF5ZXIiLCAqYXJndik7IHJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJ0YmY6IHVua25vd24gcGFyYW1ldGVyIFwiJXNcIlxuIiwgKmFyZ3YpOworCQkJZXhwbGFpbigpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWFyZ2MtLTsgYXJndisrOworCX0KKworICAgICAgICBpbnQgdmVyZGljdCA9IDA7CisKKyAgICAgICAgLyogQmUgbmljZSB0byB0aGUgdXNlcjogdHJ5IHRvIGVtaXQgYWxsIGVycm9yIG1lc3NhZ2VzIGluCisgICAgICAgICAqIG9uZSBnbyByYXRoZXIgdGhhbiByZXZlYWwgb25lIG1vcmUgcHJvYmxlbSB3aGVuIGEKKyAgICAgICAgICogcHJldmlvdXMgb25lIGhhcyBiZWVuIGZpeGVkLgorICAgICAgICAgKi8KKwlpZiAocmF0ZTY0ID09IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJ0YmY6IHRoZSBcInJhdGVcIiBwYXJhbWV0ZXIgaXMgbWFuZGF0b3J5LlxuIik7CisJCXZlcmRpY3QgPSAtMTsKKwl9CisJaWYgKCFidWZmZXIpIHsKKwkJZnByaW50ZihzdGRlcnIsICJ0YmY6IHRoZSBcImJ1cnN0XCIgcGFyYW1ldGVyIGlzIG1hbmRhdG9yeS5cbiIpOworCQl2ZXJkaWN0ID0gLTE7CisJfQorCWlmIChwcmF0ZTY0KSB7CisJCWlmICghbXR1KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgInRiZjogd2hlbiBcInBlYWtyYXRlXCIgaXMgc3BlY2lmaWVkLCBcIm10dVwiIG11c3QgYWxzbyBiZSBzcGVjaWZpZWQuXG4iKTsKKwkJCXZlcmRpY3QgPSAtMTsKKwkJfQorCX0KKworCWlmIChvcHQubGltaXQgPT0gMCAmJiBsYXRlbmN5ID09IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJ0YmY6IGVpdGhlciBcImxpbWl0XCIgb3IgXCJsYXRlbmN5XCIgaXMgcmVxdWlyZWQuXG4iKTsKKwkJdmVyZGljdCA9IC0xOworCX0KKworICAgICAgICBpZiAodmVyZGljdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgZXhwbGFpbigpOworICAgICAgICAgICAgICAgIHJldHVybiB2ZXJkaWN0OworICAgICAgICB9CisKKwlvcHQucmF0ZS5yYXRlID0gKHJhdGU2NCA+PSAoMVVMTCA8PCAzMikpID8gfjBVIDogcmF0ZTY0OworCW9wdC5wZWFrcmF0ZS5yYXRlID0gKHByYXRlNjQgPj0gKDFVTEwgPDwgMzIpKSA/IH4wVSA6IHByYXRlNjQ7CisKKwlpZiAob3B0LmxpbWl0ID09IDApIHsKKwkJZG91YmxlIGxpbSA9IHJhdGU2NCooZG91YmxlKWxhdGVuY3kvVElNRV9VTklUU19QRVJfU0VDICsgYnVmZmVyOworCQlpZiAocHJhdGU2NCkgeworCQkJZG91YmxlIGxpbTIgPSBwcmF0ZTY0Kihkb3VibGUpbGF0ZW5jeS9USU1FX1VOSVRTX1BFUl9TRUMgKyBtdHU7CisJCQlpZiAobGltMiA8IGxpbSkKKwkJCQlsaW0gPSBsaW0yOworCQl9CisJCW9wdC5saW1pdCA9IGxpbTsKKwl9CisKKwlvcHQucmF0ZS5tcHUgICAgICA9IG1wdTsKKwlvcHQucmF0ZS5vdmVyaGVhZCA9IG92ZXJoZWFkOworCWlmICh0Y19jYWxjX3J0YWJsZSgmb3B0LnJhdGUsIHJ0YWIsIFJjZWxsX2xvZywgbXR1LCBsaW5rbGF5ZXIpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInRiZjogZmFpbGVkIHRvIGNhbGN1bGF0ZSByYXRlIHRhYmxlLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJb3B0LmJ1ZmZlciA9IHRjX2NhbGNfeG1pdHRpbWUob3B0LnJhdGUucmF0ZSwgYnVmZmVyKTsKKworCWlmIChvcHQucGVha3JhdGUucmF0ZSkgeworCQlvcHQucGVha3JhdGUubXB1ICAgICAgPSBtcHU7CisJCW9wdC5wZWFrcmF0ZS5vdmVyaGVhZCA9IG92ZXJoZWFkOworCQlpZiAodGNfY2FsY19ydGFibGUoJm9wdC5wZWFrcmF0ZSwgcHRhYiwgUGNlbGxfbG9nLCBtdHUsIGxpbmtsYXllcikgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgInRiZjogZmFpbGVkIHRvIGNhbGN1bGF0ZSBwZWFrIHJhdGUgdGFibGUuXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlvcHQubXR1ID0gdGNfY2FsY194bWl0dGltZShvcHQucGVha3JhdGUucmF0ZSwgbXR1KTsKKwl9CisKKwl0YWlsID0gTkxNU0dfVEFJTChuKTsKKwlhZGRhdHRyX2wobiwgMTAyNCwgVENBX09QVElPTlMsIE5VTEwsIDApOworCWFkZGF0dHJfbChuLCAyMDI0LCBUQ0FfVEJGX1BBUk1TLCAmb3B0LCBzaXplb2Yob3B0KSk7CisJYWRkYXR0cl9sKG4sIDIxMjQsIFRDQV9UQkZfQlVSU1QsICZidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKwlpZiAocmF0ZTY0ID49ICgxVUxMIDw8IDMyKSkKKwkJYWRkYXR0cl9sKG4sIDIxMjQsIFRDQV9UQkZfUkFURTY0LCAmcmF0ZTY0LCBzaXplb2YocmF0ZTY0KSk7CisJYWRkYXR0cl9sKG4sIDMwMjQsIFRDQV9UQkZfUlRBQiwgcnRhYiwgMTAyNCk7CisJaWYgKG9wdC5wZWFrcmF0ZS5yYXRlKSB7CisJCWlmIChwcmF0ZTY0ID49ICgxVUxMIDw8IDMyKSkKKwkJCWFkZGF0dHJfbChuLCAzMTI0LCBUQ0FfVEJGX1BSQVRFNjQsICZwcmF0ZTY0LCBzaXplb2YocHJhdGU2NCkpOworCQlhZGRhdHRyX2wobiwgMzIyNCwgVENBX1RCRl9QQlVSU1QsICZtdHUsIHNpemVvZihtdHUpKTsKKwkJYWRkYXR0cl9sKG4sIDQwOTYsIFRDQV9UQkZfUFRBQiwgcHRhYiwgMTAyNCk7CisJfQorCXRhaWwtPnJ0YV9sZW4gPSAodm9pZCAqKSBOTE1TR19UQUlMKG4pIC0gKHZvaWQgKikgdGFpbDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YmZfcHJpbnRfb3B0KHN0cnVjdCBxZGlzY191dGlsICpxdSwgRklMRSAqZiwgc3RydWN0IHJ0YXR0ciAqb3B0KQoreworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9UQkZfTUFYKzFdOworCXN0cnVjdCB0Y190YmZfcW9wdCAqcW9wdDsKKwl1bnNpZ25lZCBpbnQgbGlua2xheWVyOworCWRvdWJsZSBidWZmZXIsIG10dTsKKwlkb3VibGUgbGF0ZW5jeTsKKwlfX3U2NCByYXRlNjQgPSAwLCBwcmF0ZTY0ID0gMDsKKwlTUFJJTlRfQlVGKGIxKTsKKwlTUFJJTlRfQlVGKGIyKTsKKwlTUFJJTlRfQlVGKGIzKTsKKworCWlmIChvcHQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlwYXJzZV9ydGF0dHJfbmVzdGVkKHRiLCBUQ0FfVEJGX01BWCwgb3B0KTsKKworCWlmICh0YltUQ0FfVEJGX1BBUk1TXSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlxb3B0ID0gUlRBX0RBVEEodGJbVENBX1RCRl9QQVJNU10pOworCWlmIChSVEFfUEFZTE9BRCh0YltUQ0FfVEJGX1BBUk1TXSkgIDwgc2l6ZW9mKCpxb3B0KSkKKwkJcmV0dXJuIC0xOworCXJhdGU2NCA9IHFvcHQtPnJhdGUucmF0ZTsKKwlpZiAodGJbVENBX1RCRl9SQVRFNjRdICYmCisJICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9UQkZfUkFURTY0XSkgPj0gc2l6ZW9mKHJhdGU2NCkpCisJCXJhdGU2NCA9IHJ0YV9nZXRhdHRyX3U2NCh0YltUQ0FfVEJGX1JBVEU2NF0pOworCWZwcmludGYoZiwgInJhdGUgJXMgIiwgc3ByaW50X3JhdGUocmF0ZTY0LCBiMSkpOworCWJ1ZmZlciA9IHRjX2NhbGNfeG1pdHNpemUocmF0ZTY0LCBxb3B0LT5idWZmZXIpOworCWlmIChzaG93X2RldGFpbHMpIHsKKwkJZnByaW50ZihmLCAiYnVyc3QgJXMvJXUgbXB1ICVzICIsIHNwcmludF9zaXplKGJ1ZmZlciwgYjEpLAorCQkJMTw8cW9wdC0+cmF0ZS5jZWxsX2xvZywgc3ByaW50X3NpemUocW9wdC0+cmF0ZS5tcHUsIGIyKSk7CisJfSBlbHNlIHsKKwkJZnByaW50ZihmLCAiYnVyc3QgJXMgIiwgc3ByaW50X3NpemUoYnVmZmVyLCBiMSkpOworCX0KKwlpZiAoc2hvd19yYXcpCisJCWZwcmludGYoZiwgIlslMDh4XSAiLCBxb3B0LT5idWZmZXIpOworCXByYXRlNjQgPSBxb3B0LT5wZWFrcmF0ZS5yYXRlOworCWlmICh0YltUQ0FfVEJGX1BSQVRFNjRdICYmCisJICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9UQkZfUFJBVEU2NF0pID49IHNpemVvZihwcmF0ZTY0KSkKKwkJcHJhdGU2NCA9IHJ0YV9nZXRhdHRyX3U2NCh0YltUQ0FfVEJGX1BSQVRFNjRdKTsKKwlpZiAocHJhdGU2NCkgeworCQlmcHJpbnRmKGYsICJwZWFrcmF0ZSAlcyAiLCBzcHJpbnRfcmF0ZShwcmF0ZTY0LCBiMSkpOworCQlpZiAocW9wdC0+bXR1IHx8IHFvcHQtPnBlYWtyYXRlLm1wdSkgeworCQkJbXR1ID0gdGNfY2FsY194bWl0c2l6ZShwcmF0ZTY0LCBxb3B0LT5tdHUpOworCQkJaWYgKHNob3dfZGV0YWlscykgeworCQkJCWZwcmludGYoZiwgIm10dSAlcy8ldSBtcHUgJXMgIiwgc3ByaW50X3NpemUobXR1LCBiMSksCisJCQkJCTE8PHFvcHQtPnBlYWtyYXRlLmNlbGxfbG9nLCBzcHJpbnRfc2l6ZShxb3B0LT5wZWFrcmF0ZS5tcHUsIGIyKSk7CisJCQl9IGVsc2UgeworCQkJCWZwcmludGYoZiwgIm1pbmJ1cnN0ICVzICIsIHNwcmludF9zaXplKG10dSwgYjEpKTsKKwkJCX0KKwkJCWlmIChzaG93X3JhdykKKwkJCQlmcHJpbnRmKGYsICJbJTA4eF0gIiwgcW9wdC0+bXR1KTsKKwkJfQorCX0KKworCWxhdGVuY3kgPSBUSU1FX1VOSVRTX1BFUl9TRUMqKHFvcHQtPmxpbWl0Lyhkb3VibGUpcmF0ZTY0KSAtIHRjX2NvcmVfdGljazJ0aW1lKHFvcHQtPmJ1ZmZlcik7CisJaWYgKHByYXRlNjQpIHsKKwkJZG91YmxlIGxhdDIgPSBUSU1FX1VOSVRTX1BFUl9TRUMqKHFvcHQtPmxpbWl0Lyhkb3VibGUpcHJhdGU2NCkgLSB0Y19jb3JlX3RpY2sydGltZShxb3B0LT5tdHUpOworCQlpZiAobGF0MiA+IGxhdGVuY3kpCisJCQlsYXRlbmN5ID0gbGF0MjsKKwl9CisJaWYgKGxhdGVuY3kgPj0gMC4wKQorCQlmcHJpbnRmKGYsICJsYXQgJXMgIiwgc3ByaW50X3RpbWUobGF0ZW5jeSwgYjEpKTsKKwlpZiAoc2hvd19yYXcgfHwgbGF0ZW5jeSA8IDAuMCkKKwkJZnByaW50ZihmLCAibGltaXQgJXMgIiwgc3ByaW50X3NpemUocW9wdC0+bGltaXQsIGIxKSk7CisKKwlpZiAocW9wdC0+cmF0ZS5vdmVyaGVhZCkgeworCQlmcHJpbnRmKGYsICJvdmVyaGVhZCAlZCIsIHFvcHQtPnJhdGUub3ZlcmhlYWQpOworCX0KKwlsaW5rbGF5ZXIgPSAocW9wdC0+cmF0ZS5saW5rbGF5ZXIgJiBUQ19MSU5LTEFZRVJfTUFTSyk7CisJaWYgKGxpbmtsYXllciA+IFRDX0xJTktMQVlFUl9FVEhFUk5FVCB8fCBzaG93X2RldGFpbHMpCisJCWZwcmludGYoZiwgImxpbmtsYXllciAlcyAiLCBzcHJpbnRfbGlua2xheWVyKGxpbmtsYXllciwgYjMpKTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcWRpc2NfdXRpbCB0YmZfcWRpc2NfdXRpbCA9IHsKKwkuaWQJCT0gInRiZiIsCisJLnBhcnNlX3FvcHQJPSB0YmZfcGFyc2Vfb3B0LAorCS5wcmludF9xb3B0CT0gdGJmX3ByaW50X29wdCwKK307CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy9zdGF0aWMtc3ltcy5jIGIvaXByb3V0ZTIvdGMvc3RhdGljLXN5bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmM4MDc0Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGMvc3RhdGljLXN5bXMuYwpAQCAtMCwwICsxLDE0IEBACisvKgorICogVGhpcyBmaWxlIGNyZWF0ZXMgYSBkdW1teSB2ZXJzaW9uIG9mIGR5bmFtaWMgbG9hZGluZworICogZm9yIGVudmlyb25tZW50cyB3aGVyZSBkeW5hbWljIGxpbmtpbmcKKyAqIGlzIG5vdCB1c2VkIG9yIGF2YWlsYWJsZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZGxmY24uaCIKKwordm9pZCAqX2Rsc3ltKGNvbnN0IGNoYXIgKnN5bSkKK3sKKyNpbmNsdWRlICJzdGF0aWMtc3ltcy5oIgorCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvdGMuYyBiL2lwcm91dGUyL3RjL3RjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFkNGJjMwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL3RjLmMKQEAgLTAsMCArMSwzOTMgQEAKKy8qCisgKiB0Yy5jCQkidGMiIHV0aWxpdHkgZnJvbnRlbmQuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICoKKyAqIEZpeGVzOgorICoKKyAqIFBldHJpIE1hdHRpbGEgPHBldHJpQHByaWhhdGVhbS5maT4gOTkwMzA4OiB3cm9uZyBtZW1zZXQncyByZXN1bHRlZCBpbiBmYXVsdHMKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAiU05BUFNIT1QuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInRjX3V0aWwuaCIKKyNpbmNsdWRlICJ0Y19jb21tb24uaCIKKyNpbmNsdWRlICJuYW1lc3BhY2UuaCIKKworaW50IHNob3dfc3RhdHMgPSAwOworaW50IHNob3dfZGV0YWlscyA9IDA7CitpbnQgc2hvd19yYXcgPSAwOworaW50IHNob3dfcHJldHR5ID0gMDsKK2ludCBzaG93X2dyYXBoID0gMDsKK2ludCB0aW1lc3RhbXA7CisKK2ludCBiYXRjaF9tb2RlID0gMDsKK2ludCByZXNvbHZlX2hvc3RzID0gMDsKK2ludCB1c2VfaWVjID0gMDsKK2ludCBmb3JjZSA9IDA7Citib29sIHVzZV9uYW1lcyA9IGZhbHNlOworCitzdGF0aWMgY2hhciAqY29uZl9maWxlOworCitzdHJ1Y3QgcnRubF9oYW5kbGUgcnRoOworCitzdGF0aWMgdm9pZCAqQk9EWSA9IE5VTEw7CS8qIGNhY2hlZCBoYW5kbGUgZGxvcGVuKE5VTEwpICovCitzdGF0aWMgc3RydWN0IHFkaXNjX3V0aWwgKiBxZGlzY19saXN0Oworc3RhdGljIHN0cnVjdCBmaWx0ZXJfdXRpbCAqIGZpbHRlcl9saXN0OworCisjaWZkZWYgQU5EUk9JRAorZXh0ZXJuIHN0cnVjdCBxZGlzY191dGlsIGNicV9xZGlzY191dGlsOworZXh0ZXJuIHN0cnVjdCBxZGlzY191dGlsIGh0Yl9xZGlzY191dGlsOworZXh0ZXJuIHN0cnVjdCBxZGlzY191dGlsIGluZ3Jlc3NfcWRpc2NfdXRpbDsKK2V4dGVybiBzdHJ1Y3QgZmlsdGVyX3V0aWwgdTMyX2ZpbHRlcl91dGlsOworI2VuZGlmCisKK3N0YXRpYyBpbnQgcHJpbnRfbm9xb3B0KHN0cnVjdCBxZGlzY191dGlsICpxdSwgRklMRSAqZiwKKwkJCXN0cnVjdCBydGF0dHIgKm9wdCkKK3sKKwlpZiAob3B0ICYmIFJUQV9QQVlMT0FEKG9wdCkpCisJCWZwcmludGYoZiwgIltVbmtub3duIHFkaXNjLCBvcHRsZW49JXVdICIsCisJCQkodW5zaWduZWQpIFJUQV9QQVlMT0FEKG9wdCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX25vcW9wdChzdHJ1Y3QgcWRpc2NfdXRpbCAqcXUsIGludCBhcmdjLCBjaGFyICoqYXJndiwgc3RydWN0IG5sbXNnaGRyICpuKQoreworCWlmIChhcmdjKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5rbm93biBxZGlzYyBcIiVzXCIsIGhlbmNlIG9wdGlvbiBcIiVzXCIgaXMgdW5wYXJzYWJsZVxuIiwgcXUtPmlkLCAqYXJndik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJpbnRfbm9mb3B0KHN0cnVjdCBmaWx0ZXJfdXRpbCAqcXUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKm9wdCwgX191MzIgZmhhbmRsZSkKK3sKKwlpZiAob3B0ICYmIFJUQV9QQVlMT0FEKG9wdCkpCisJCWZwcmludGYoZiwgImZoICUwOHggW1Vua25vd24gZmlsdGVyLCBvcHRsZW49JXVdICIsCisJCQlmaGFuZGxlLCAodW5zaWduZWQpIFJUQV9QQVlMT0FEKG9wdCkpOworCWVsc2UgaWYgKGZoYW5kbGUpCisJCWZwcmludGYoZiwgImZoICUwOHggIiwgZmhhbmRsZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfbm9mb3B0KHN0cnVjdCBmaWx0ZXJfdXRpbCAqcXUsIGNoYXIgKmZoYW5kbGUsIGludCBhcmdjLCBjaGFyICoqYXJndiwgc3RydWN0IG5sbXNnaGRyICpuKQoreworCV9fdTMyIGhhbmRsZTsKKworCWlmIChhcmdjKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5rbm93biBmaWx0ZXIgXCIlc1wiLCBoZW5jZSBvcHRpb24gXCIlc1wiIGlzIHVucGFyc2FibGVcbiIsIHF1LT5pZCwgKmFyZ3YpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChmaGFuZGxlKSB7CisJCXN0cnVjdCB0Y21zZyAqdCA9IE5MTVNHX0RBVEEobik7CisJCWlmIChnZXRfdTMyKCZoYW5kbGUsIGZoYW5kbGUsIDE2KSkgeworCQkJZnByaW50ZihzdGRlcnIsICJVbnBhcnNhYmxlIGZpbHRlciBJRCBcIiVzXCJcbiIsIGZoYW5kbGUpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXQtPnRjbV9oYW5kbGUgPSBoYW5kbGU7CisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3QgcWRpc2NfdXRpbCAqZ2V0X3FkaXNjX2tpbmQoY29uc3QgY2hhciAqc3RyKQoreworCXZvaWQgKmRsaDsKKwljaGFyIGJ1ZlsyNTZdOworCXN0cnVjdCBxZGlzY191dGlsICpxOworCisjaWZkZWYgQU5EUk9JRAorCWlmICghc3RyY21wKHN0ciwgImNicSIpKQorCQlyZXR1cm4gJmNicV9xZGlzY191dGlsOworCWVsc2UgaWYgKCFzdHJjbXAoc3RyLCAiaHRiIikpCisJCXJldHVybiAmaHRiX3FkaXNjX3V0aWw7CisJZWxzZSBpZiAoIXN0cmNtcChzdHIsICJpbmdyZXNzIikpCisJCXJldHVybiAmaW5ncmVzc19xZGlzY191dGlsOworCWVsc2UgeworCQlmcHJpbnRmKHN0ZGVyciwgIkFuZHJvaWQgZG9lcyBub3Qgc3VwcG9ydCBxZGlzYyAnJXMnXG4iLCBzdHIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisjZW5kaWYKKwlmb3IgKHEgPSBxZGlzY19saXN0OyBxOyBxID0gcS0+bmV4dCkKKwkJaWYgKHN0cmNtcChxLT5pZCwgc3RyKSA9PSAwKQorCQkJcmV0dXJuIHE7CisKKwlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMvcV8lcy5zbyIsIGdldF90Y19saWIoKSwgc3RyKTsKKwlkbGggPSBkbG9wZW4oYnVmLCBSVExEX0xBWlkpOworCWlmICghZGxoKSB7CisJCS8qIGxvb2sgaW4gY3VycmVudCBiaW5hcnksIG9ubHkgb3BlbiBvbmNlICovCisJCWRsaCA9IEJPRFk7CisJCWlmIChkbGggPT0gTlVMTCkgeworCQkJZGxoID0gQk9EWSA9IGRsb3BlbihOVUxMLCBSVExEX0xBWlkpOworCQkJaWYgKGRsaCA9PSBOVUxMKQorCQkJCWdvdG8gbm9leGlzdDsKKwkJfQorCX0KKworCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlc19xZGlzY191dGlsIiwgc3RyKTsKKwlxID0gZGxzeW0oZGxoLCBidWYpOworCWlmIChxID09IE5VTEwpCisJCWdvdG8gbm9leGlzdDsKKworcmVnOgorCXEtPm5leHQgPSBxZGlzY19saXN0OworCXFkaXNjX2xpc3QgPSBxOworCXJldHVybiBxOworCitub2V4aXN0OgorCXEgPSBtYWxsb2Moc2l6ZW9mKCpxKSk7CisJaWYgKHEpIHsKKworCQltZW1zZXQocSwgMCwgc2l6ZW9mKCpxKSk7CisJCXEtPmlkID0gc3RyY3B5KG1hbGxvYyhzdHJsZW4oc3RyKSsxKSwgc3RyKTsKKwkJcS0+cGFyc2VfcW9wdCA9IHBhcnNlX25vcW9wdDsKKwkJcS0+cHJpbnRfcW9wdCA9IHByaW50X25vcW9wdDsKKwkJZ290byByZWc7CisJfQorCXJldHVybiBxOworfQorCisKK3N0cnVjdCBmaWx0ZXJfdXRpbCAqZ2V0X2ZpbHRlcl9raW5kKGNvbnN0IGNoYXIgKnN0cikKK3sKKwl2b2lkICpkbGg7CisJY2hhciBidWZbMjU2XTsKKwlzdHJ1Y3QgZmlsdGVyX3V0aWwgKnE7CisjaWZkZWYgQU5EUk9JRAorCWlmICghc3RyY21wKHN0ciwgInUzMiIpKQorCQlyZXR1cm4gJnUzMl9maWx0ZXJfdXRpbDsKKwllbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsICJBbmRyb2lkIGRvZXMgbm90IHN1cHBvcnQgZmlsdGVyICclcydcbiIsIHN0cik7CisJCXJldHVybiBOVUxMOworCX0KKyNlbmRpZgorCisJZm9yIChxID0gZmlsdGVyX2xpc3Q7IHE7IHEgPSBxLT5uZXh0KQorCQlpZiAoc3RyY21wKHEtPmlkLCBzdHIpID09IDApCisJCQlyZXR1cm4gcTsKKworCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcy9mXyVzLnNvIiwgZ2V0X3RjX2xpYigpLCBzdHIpOworCWRsaCA9IGRsb3BlbihidWYsIFJUTERfTEFaWSk7CisJaWYgKGRsaCA9PSBOVUxMKSB7CisJCWRsaCA9IEJPRFk7CisJCWlmIChkbGggPT0gTlVMTCkgeworCQkJZGxoID0gQk9EWSA9IGRsb3BlbihOVUxMLCBSVExEX0xBWlkpOworCQkJaWYgKGRsaCA9PSBOVUxMKQorCQkJCWdvdG8gbm9leGlzdDsKKwkJfQorCX0KKworCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlc19maWx0ZXJfdXRpbCIsIHN0cik7CisJcSA9IGRsc3ltKGRsaCwgYnVmKTsKKwlpZiAocSA9PSBOVUxMKQorCQlnb3RvIG5vZXhpc3Q7CisKK3JlZzoKKwlxLT5uZXh0ID0gZmlsdGVyX2xpc3Q7CisJZmlsdGVyX2xpc3QgPSBxOworCXJldHVybiBxOworbm9leGlzdDoKKwlxID0gbWFsbG9jKHNpemVvZigqcSkpOworCWlmIChxKSB7CisJCW1lbXNldChxLCAwLCBzaXplb2YoKnEpKTsKKwkJc3RybmNweShxLT5pZCwgc3RyLCAxNSk7CisJCXEtPnBhcnNlX2ZvcHQgPSBwYXJzZV9ub2ZvcHQ7CisJCXEtPnByaW50X2ZvcHQgPSBwcmludF9ub2ZvcHQ7CisJCWdvdG8gcmVnOworCX0KKwlyZXR1cm4gcTsKK30KKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiB0YyBbIE9QVElPTlMgXSBPQkpFQ1QgeyBDT01NQU5EIHwgaGVscCB9XG4iCisjaWZkZWYgQU5EUk9JRAorCQkJIiAgICAgICB0YyBbLWZvcmNlXVxuIgorI2Vsc2UKKwkJCSIgICAgICAgdGMgWy1mb3JjZV0gLWJhdGNoIGZpbGVuYW1lXG4iCisjZW5kaWYKKwkgICAgICAgICAgICAgICAgIndoZXJlICBPQkpFQ1QgOj0geyBxZGlzYyB8IGNsYXNzIHwgZmlsdGVyIHwgYWN0aW9uIHwgbW9uaXRvciB8IGV4ZWMgfVxuIgorCSAgICAgICAgICAgICAgICAiICAgICAgIE9QVElPTlMgOj0geyAtc1t0YXRpc3RpY3NdIHwgLWRbZXRhaWxzXSB8IC1yW2F3XSB8IC1wW3JldHR5XSB8IC1iW2F0Y2hdIFtmaWxlbmFtZV0gfCAiCisJCQkiLW5bZXRuc10gbmFtZSB8XG4iCisJCQkiICAgICAgICAgICAgICAgICAgICAtbm0gfCAtbmFtW2VzXSB8IHsgLWNmIHwgLWNvbmYgfSBwYXRoIH1cbiIpOworfQorCitzdGF0aWMgaW50IGRvX2NtZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaWYgKG1hdGNoZXMoKmFyZ3YsICJxZGlzYyIpID09IDApCisJCXJldHVybiBkb19xZGlzYyhhcmdjLTEsIGFyZ3YrMSk7CisJaWYgKG1hdGNoZXMoKmFyZ3YsICJjbGFzcyIpID09IDApCisJCXJldHVybiBkb19jbGFzcyhhcmdjLTEsIGFyZ3YrMSk7CisJaWYgKG1hdGNoZXMoKmFyZ3YsICJmaWx0ZXIiKSA9PSAwKQorCQlyZXR1cm4gZG9fZmlsdGVyKGFyZ2MtMSwgYXJndisxKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgImFjdGlvbnMiKSA9PSAwKQorCQlyZXR1cm4gZG9fYWN0aW9uKGFyZ2MtMSwgYXJndisxKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgIm1vbml0b3IiKSA9PSAwKQorCQlyZXR1cm4gZG9fdGNtb25pdG9yKGFyZ2MtMSwgYXJndisxKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgImV4ZWMiKSA9PSAwKQorCQlyZXR1cm4gZG9fZXhlYyhhcmdjLTEsIGFyZ3YrMSk7CisJaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQl1c2FnZSgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlmcHJpbnRmKHN0ZGVyciwgIk9iamVjdCBcIiVzXCIgaXMgdW5rbm93biwgdHJ5IFwidGMgaGVscFwiLlxuIiwKKwkJKmFyZ3YpOworCXJldHVybiAtMTsKK30KKworI2lmbmRlZiBBTkRST0lECitzdGF0aWMgaW50IGJhdGNoKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY2hhciAqbGluZSA9IE5VTEw7CisJc2l6ZV90IGxlbiA9IDA7CisJaW50IHJldCA9IDA7CisKKwliYXRjaF9tb2RlID0gMTsKKwlpZiAobmFtZSAmJiBzdHJjbXAobmFtZSwgIi0iKSAhPSAwKSB7CisJCWlmIChmcmVvcGVuKG5hbWUsICJyIiwgc3RkaW4pID09IE5VTEwpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9wZW4gZmlsZSBcIiVzXCIgZm9yIHJlYWRpbmc6ICVzXG4iLAorCQkJCW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwl0Y19jb3JlX2luaXQoKTsKKworCWlmIChydG5sX29wZW4oJnJ0aCwgMCkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9wZW4gcnRuZXRsaW5rXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNtZGxpbmVubyA9IDA7CisJd2hpbGUgKGdldGNtZGxpbmUoJmxpbmUsICZsZW4sIHN0ZGluKSAhPSAtMSkgeworCQljaGFyICpsYXJndlsxMDBdOworCQlpbnQgbGFyZ2M7CisKKwkJbGFyZ2MgPSBtYWtlYXJncyhsaW5lLCBsYXJndiwgMTAwKTsKKwkJaWYgKGxhcmdjID09IDApCisJCQljb250aW51ZTsJLyogYmxhbmsgbGluZSAqLworCisJCWlmIChkb19jbWQobGFyZ2MsIGxhcmd2KSkgeworCQkJZnByaW50ZihzdGRlcnIsICJDb21tYW5kIGZhaWxlZCAlczolZFxuIiwgbmFtZSwgY21kbGluZW5vKTsKKwkJCXJldCA9IDE7CisJCQlpZiAoIWZvcmNlKQorCQkJCWJyZWFrOworCQl9CisJfQorCWlmIChsaW5lKQorCQlmcmVlKGxpbmUpOworCisJcnRubF9jbG9zZSgmcnRoKTsKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCByZXQ7CisjaWZuZGVmIEFORFJPSUQKKwljaGFyICpiYXRjaF9maWxlID0gTlVMTDsKKyNlbmRpZgorCisJd2hpbGUgKGFyZ2MgPiAxKSB7CisJCWlmIChhcmd2WzFdWzBdICE9ICctJykKKwkJCWJyZWFrOworCQlpZiAobWF0Y2hlcyhhcmd2WzFdLCAiLXN0YXRzIikgPT0gMCB8fAorCQkJIG1hdGNoZXMoYXJndlsxXSwgIi1zdGF0aXN0aWNzIikgPT0gMCkgeworCQkJKytzaG93X3N0YXRzOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoYXJndlsxXSwgIi1kZXRhaWxzIikgPT0gMCkgeworCQkJKytzaG93X2RldGFpbHM7CisJCX0gZWxzZSBpZiAobWF0Y2hlcyhhcmd2WzFdLCAiLXJhdyIpID09IDApIHsKKwkJCSsrc2hvd19yYXc7CisJCX0gZWxzZSBpZiAobWF0Y2hlcyhhcmd2WzFdLCAiLXByZXR0eSIpID09IDApIHsKKwkJCSsrc2hvd19wcmV0dHk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcyhhcmd2WzFdLCAiLWdyYXBoIikgPT0gMCkgeworCQkJc2hvd19ncmFwaCA9IDE7CisJCX0gZWxzZSBpZiAobWF0Y2hlcyhhcmd2WzFdLCAiLVZlcnNpb24iKSA9PSAwKSB7CisJCQlwcmludGYoInRjIHV0aWxpdHksIGlwcm91dGUyLXNzJXNcbiIsIFNOQVBTSE9UKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoYXJndlsxXSwgIi1pZWMiKSA9PSAwKSB7CisJCQkrK3VzZV9pZWM7CisJCX0gZWxzZSBpZiAobWF0Y2hlcyhhcmd2WzFdLCAiLWhlbHAiKSA9PSAwKSB7CisJCQl1c2FnZSgpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAobWF0Y2hlcyhhcmd2WzFdLCAiLWZvcmNlIikgPT0gMCkgeworCQkJKytmb3JjZTsKKyNpZm5kZWYgQU5EUk9JRAorCQl9IGVsc2UgaWYgKG1hdGNoZXMoYXJndlsxXSwgIi1iYXRjaCIpID09IDApIHsKKwkJCWFyZ2MtLTsJYXJndisrOworCQkJaWYgKGFyZ2MgPD0gMSkKKwkJCQl1c2FnZSgpOworCQkJYmF0Y2hfZmlsZSA9IGFyZ3ZbMV07CisjZW5kaWYKKwkJfSBlbHNlIGlmIChtYXRjaGVzKGFyZ3ZbMV0sICItbmV0bnMiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKG5ldG5zX3N3aXRjaChhcmd2WzFdKSkKKwkJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSBpZiAobWF0Y2hlcyhhcmd2WzFdLCAiLW5hbWVzIikgPT0gMCB8fAorCQkJCW1hdGNoZXMoYXJndlsxXSwgIi1ubSIpID09IDApIHsKKwkJCXVzZV9uYW1lcyA9IHRydWU7CisJCX0gZWxzZSBpZiAobWF0Y2hlcyhhcmd2WzFdLCAiLWNmIikgPT0gMCB8fAorCQkJCW1hdGNoZXMoYXJndlsxXSwgIi1jb25mIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWNvbmZfZmlsZSA9IGFyZ3ZbMV07CisJCX0gZWxzZSBpZiAobWF0Y2hlcyhhcmd2WzFdLCAiLXRpbWVzdGFtcCIpID09IDApIHsKKwkJCXRpbWVzdGFtcCsrOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoYXJndlsxXSwgIi10c2hvcnQiKSA9PSAwKSB7CisJCQkrK3RpbWVzdGFtcDsKKwkJCSsrdGltZXN0YW1wX3Nob3J0OworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJPcHRpb24gXCIlc1wiIGlzIHVua25vd24sIHRyeSBcInRjIC1oZWxwXCIuXG4iLCBhcmd2WzFdKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlhcmdjLS07CWFyZ3YrKzsKKwl9CisKKyNpZm5kZWYgQU5EUk9JRAorCWlmIChiYXRjaF9maWxlKQorCQlyZXR1cm4gYmF0Y2goYmF0Y2hfZmlsZSk7CisjZW5kaWYKKworCWlmIChhcmdjIDw9IDEpIHsKKwkJdXNhZ2UoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJdGNfY29yZV9pbml0KCk7CisJaWYgKHJ0bmxfb3BlbigmcnRoLCAwKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgb3BlbiBydG5ldGxpbmtcbiIpOworCQlleGl0KDEpOworCX0KKworCWlmICh1c2VfbmFtZXMgJiYgY2xzX25hbWVzX2luaXQoY29uZl9maWxlKSkgeworCQlyZXQgPSAtMTsKKwkJZ290byBFeGl0OworCX0KKworCXJldCA9IGRvX2NtZChhcmdjLTEsIGFyZ3YrMSk7CitFeGl0OgorCXJ0bmxfY2xvc2UoJnJ0aCk7CisKKwlpZiAodXNlX25hbWVzKQorCQljbHNfbmFtZXNfdW5pbml0KCk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvdGNfYnBmLmMgYi9pcHJvdXRlMi90Yy90Y19icGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmM4ODQxCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGMvdGNfYnBmLmMKQEAgLTAsMCArMSwxODkyIEBACisvKgorICogdGNfYnBmLmMJQlBGIGNvbW1vbiBjb2RlCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIGRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CURhbmllbCBCb3JrbWFubiA8ZGJvcmttYW5AcmVkaGF0LmNvbT4KKyAqCQlKaXJpIFBpcmtvIDxqaXJpQHJlc251bGxpLnVzPgorICoJCUFsZXhlaSBTdGFyb3ZvaXRvdiA8YXN0QHBsdW1ncmlkLmNvbT4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaWZkZWYgSEFWRV9FTEYKKyNpbmNsdWRlIDxsaWJlbGYuaD4KKyNpbmNsdWRlIDxnZWxmLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisjaW5jbHVkZSA8c3lzL3Zmcy5oPgorI2luY2x1ZGUgPHN5cy9tb3VudC5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8c3lzL3NlbmRmaWxlLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9icGYuaD4KKyNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hbGcuaD4KKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKworI2luY2x1ZGUgImJwZl9lbGYuaCIKKyNpbmNsdWRlICJicGZfc2NtLmgiCisKKyNpbmNsdWRlICJ0Y191dGlsLmgiCisjaW5jbHVkZSAidGNfYnBmLmgiCisKKyNpZmRlZiBIQVZFX0VMRgorc3RhdGljIGludCBicGZfb2JqX29wZW4oY29uc3QgY2hhciAqcGF0aCwgZW51bSBicGZfcHJvZ190eXBlIHR5cGUsCisJCQljb25zdCBjaGFyICpzZWMsIGJvb2wgdmVyYm9zZSk7CisjZWxzZQorc3RhdGljIGludCBicGZfb2JqX29wZW4oY29uc3QgY2hhciAqcGF0aCwgZW51bSBicGZfcHJvZ190eXBlIHR5cGUsCisJCQljb25zdCBjaGFyICpzZWMsIGJvb2wgdmVyYm9zZSkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIk5vIEVMRiBsaWJyYXJ5IHN1cHBvcnQgY29tcGlsZWQgaW4uXG4iKTsKKwllcnJubyA9IEVOT1NZUzsKKwlyZXR1cm4gLTE7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSBfX3U2NCBicGZfcHRyX3RvX3U2NChjb25zdCB2b2lkICpwdHIpCit7CisJcmV0dXJuIChfX3U2NCkodW5zaWduZWQgbG9uZylwdHI7Cit9CisKK3N0YXRpYyBpbnQgYnBmKGludCBjbWQsIHVuaW9uIGJwZl9hdHRyICphdHRyLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKyNpZmRlZiBfX05SX2JwZgorCXJldHVybiBzeXNjYWxsKF9fTlJfYnBmLCBjbWQsIGF0dHIsIHNpemUpOworI2Vsc2UKKwlmcHJpbnRmKHN0ZGVyciwgIk5vIGJwZiBzeXNjYWxsLCBrZXJuZWwgaGVhZGVycyB0b28gb2xkP1xuIik7CisJZXJybm8gPSBFTk9TWVM7CisJcmV0dXJuIC0xOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgYnBmX21hcF91cGRhdGUoaW50IGZkLCBjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKnZhbHVlLAorCQkJICB1aW50NjRfdCBmbGFncykKK3sKKwl1bmlvbiBicGZfYXR0ciBhdHRyID0geworCQkubWFwX2ZkCQk9IGZkLAorCQkua2V5CQk9IGJwZl9wdHJfdG9fdTY0KGtleSksCisJCS52YWx1ZQkJPSBicGZfcHRyX3RvX3U2NCh2YWx1ZSksCisJCS5mbGFncwkJPSBmbGFncywKKwl9OworCisJcmV0dXJuIGJwZihCUEZfTUFQX1VQREFURV9FTEVNLCAmYXR0ciwgc2l6ZW9mKGF0dHIpKTsKK30KKworc3RhdGljIGludCBicGZfcGFyc2Vfc3RyaW5nKGNoYXIgKmFyZywgYm9vbCBmcm9tX2ZpbGUsIF9fdTE2ICpicGZfbGVuLAorCQkJICAgIGNoYXIgKipicGZfc3RyaW5nLCBib29sICpuZWVkX3JlbGVhc2UsCisJCQkgICAgY29uc3QgY2hhciBzZXBhcmF0b3IpCit7CisJY2hhciBzcDsKKworCWlmIChmcm9tX2ZpbGUpIHsKKwkJc2l6ZV90IHRtcF9sZW4sIG9wX2xlbiA9IHNpemVvZigiNjU1MzUgMjU1IDI1NSA0Mjk0OTY3Mjk1LCIpOworCQljaGFyICp0bXBfc3RyaW5nOworCQlGSUxFICpmcDsKKworCQl0bXBfbGVuID0gc2l6ZW9mKCI0MDk2LCIpICsgQlBGX01BWElOU05TICogb3BfbGVuOworCQl0bXBfc3RyaW5nID0gbWFsbG9jKHRtcF9sZW4pOworCQlpZiAodG1wX3N0cmluZyA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJbWVtc2V0KHRtcF9zdHJpbmcsIDAsIHRtcF9sZW4pOworCisJCWZwID0gZm9wZW4oYXJnLCAiciIpOworCQlpZiAoZnAgPT0gTlVMTCkgeworCQkJcGVycm9yKCJDYW5ub3QgZm9wZW4iKTsKKwkJCWZyZWUodG1wX3N0cmluZyk7CisJCQlyZXR1cm4gLUVOT0VOVDsKKwkJfQorCisJCWlmICghZmdldHModG1wX3N0cmluZywgdG1wX2xlbiwgZnApKSB7CisJCQlmcmVlKHRtcF9zdHJpbmcpOworCQkJZmNsb3NlKGZwKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJZmNsb3NlKGZwKTsKKworCQkqbmVlZF9yZWxlYXNlID0gdHJ1ZTsKKwkJKmJwZl9zdHJpbmcgPSB0bXBfc3RyaW5nOworCX0gZWxzZSB7CisJCSpuZWVkX3JlbGVhc2UgPSBmYWxzZTsKKwkJKmJwZl9zdHJpbmcgPSBhcmc7CisJfQorCisJaWYgKHNzY2FuZigqYnBmX3N0cmluZywgIiVodSVjIiwgYnBmX2xlbiwgJnNwKSAhPSAyIHx8CisJICAgIHNwICE9IHNlcGFyYXRvcikgeworCQlpZiAoKm5lZWRfcmVsZWFzZSkKKwkJCWZyZWUoKmJwZl9zdHJpbmcpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBicGZfb3BzX3BhcnNlKGludCBhcmdjLCBjaGFyICoqYXJndiwgc3RydWN0IHNvY2tfZmlsdGVyICpicGZfb3BzLAorCQkJIGJvb2wgZnJvbV9maWxlKQoreworCWNoYXIgKmJwZl9zdHJpbmcsICp0b2tlbiwgc2VwYXJhdG9yID0gJywnOworCWludCByZXQgPSAwLCBpID0gMDsKKwlib29sIG5lZWRfcmVsZWFzZTsKKwlfX3UxNiBicGZfbGVuID0gMDsKKworCWlmIChhcmdjIDwgMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGJwZl9wYXJzZV9zdHJpbmcoYXJndlswXSwgZnJvbV9maWxlLCAmYnBmX2xlbiwgJmJwZl9zdHJpbmcsCisJCQkgICAgICZuZWVkX3JlbGVhc2UsIHNlcGFyYXRvcikpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChicGZfbGVuID09IDAgfHwgYnBmX2xlbiA+IEJQRl9NQVhJTlNOUykgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwl0b2tlbiA9IGJwZl9zdHJpbmc7CisJd2hpbGUgKCh0b2tlbiA9IHN0cmNocih0b2tlbiwgc2VwYXJhdG9yKSkgJiYgKCsrdG9rZW4pWzBdKSB7CisJCWlmIChpID49IGJwZl9sZW4pIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiUmVhbCBwcm9ncmFtIGxlbmd0aCBleGNlZWRzIGVuY29kZWQgIgorCQkJCSJsZW5ndGggcGFyYW1ldGVyIVxuIik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoc3NjYW5mKHRva2VuLCAiJWh1ICVoaHUgJWhodSAldSwiLAorCQkJICAgJmJwZl9vcHNbaV0uY29kZSwgJmJwZl9vcHNbaV0uanQsCisJCQkgICAmYnBmX29wc1tpXS5qZiwgJmJwZl9vcHNbaV0uaykgIT0gNCkgeworCQkJZnByaW50ZihzdGRlcnIsICJFcnJvciBhdCBpbnN0cnVjdGlvbiAlZCFcbiIsIGkpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaSsrOworCX0KKworCWlmIChpICE9IGJwZl9sZW4pIHsKKwkJZnByaW50ZihzdGRlcnIsICJQYXJzZWQgcHJvZ3JhbSBsZW5ndGggaXMgbGVzcyB0aGFuIGVuY29kZWQiCisJCQkibGVuZ3RoIHBhcmFtZXRlciFcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJcmV0ID0gYnBmX2xlbjsKK291dDoKKwlpZiAobmVlZF9yZWxlYXNlKQorCQlmcmVlKGJwZl9zdHJpbmcpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBicGZfcHJpbnRfb3BzKEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKmJwZl9vcHMsIF9fdTE2IGxlbikKK3sKKwlzdHJ1Y3Qgc29ja19maWx0ZXIgKm9wcyA9IChzdHJ1Y3Qgc29ja19maWx0ZXIgKikgUlRBX0RBVEEoYnBmX29wcyk7CisJaW50IGk7CisKKwlpZiAobGVuID09IDApCisJCXJldHVybjsKKworCWZwcmludGYoZiwgImJ5dGVjb2RlIFwnJXUsIiwgbGVuKTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW4gLSAxOyBpKyspCisJCWZwcmludGYoZiwgIiVodSAlaGh1ICVoaHUgJXUsIiwgb3BzW2ldLmNvZGUsIG9wc1tpXS5qdCwKKwkJCW9wc1tpXS5qZiwgb3BzW2ldLmspOworCisJZnByaW50ZihmLCAiJWh1ICVoaHUgJWhodSAldVwnIiwgb3BzW2ldLmNvZGUsIG9wc1tpXS5qdCwKKwkJb3BzW2ldLmpmLCBvcHNbaV0uayk7Cit9CisKK3N0YXRpYyBpbnQgYnBmX21hcF9zZWxmY2hlY2tfcGlubmVkKGludCBmZCwgY29uc3Qgc3RydWN0IGJwZl9lbGZfbWFwICptYXAsCisJCQkJICAgIGludCBsZW5ndGgpCit7CisJY2hhciBmaWxlW1BBVEhfTUFYXSwgYnVmZls0MDk2XTsKKwlzdHJ1Y3QgYnBmX2VsZl9tYXAgdG1wLCB6ZXJvOworCXVuc2lnbmVkIGludCB2YWw7CisJRklMRSAqZnA7CisKKwlzbnByaW50ZihmaWxlLCBzaXplb2YoZmlsZSksICIvcHJvYy8lZC9mZGluZm8vJWQiLCBnZXRwaWQoKSwgZmQpOworCisJZnAgPSBmb3BlbihmaWxlLCAiciIpOworCWlmICghZnApIHsKKwkJZnByaW50ZihzdGRlcnIsICJObyBwcm9jZnMgc3VwcG9ydD8hXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKKwl3aGlsZSAoZmdldHMoYnVmZiwgc2l6ZW9mKGJ1ZmYpLCBmcCkpIHsKKwkJaWYgKHNzY2FuZihidWZmLCAibWFwX3R5cGU6XHQldSIsICZ2YWwpID09IDEpCisJCQl0bXAudHlwZSA9IHZhbDsKKwkJZWxzZSBpZiAoc3NjYW5mKGJ1ZmYsICJrZXlfc2l6ZTpcdCV1IiwgJnZhbCkgPT0gMSkKKwkJCXRtcC5zaXplX2tleSA9IHZhbDsKKwkJZWxzZSBpZiAoc3NjYW5mKGJ1ZmYsICJ2YWx1ZV9zaXplOlx0JXUiLCAmdmFsKSA9PSAxKQorCQkJdG1wLnNpemVfdmFsdWUgPSB2YWw7CisJCWVsc2UgaWYgKHNzY2FuZihidWZmLCAibWF4X2VudHJpZXM6XHQldSIsICZ2YWwpID09IDEpCisJCQl0bXAubWF4X2VsZW0gPSB2YWw7CisJfQorCisJZmNsb3NlKGZwKTsKKworCWlmICghbWVtY21wKCZ0bXAsIG1hcCwgbGVuZ3RoKSkgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQltZW1zZXQoJnplcm8sIDAsIHNpemVvZih6ZXJvKSk7CisJCS8qIElmIGtlcm5lbCBkb2Vzbid0IGhhdmUgZUJQRi1yZWxhdGVkIGZkaW5mbywgd2UgY2Fubm90IGRvIG11Y2gsCisJCSAqIHNvIGp1c3QgYWNjZXB0IGl0LiBXZSBrbm93IHdlIGRvIGhhdmUgYW4gZUJQRiBmZCBhbmQgaW4gdGhpcworCQkgKiBjYXNlLCBldmVyeXRoaW5nIGlzIDAuIEl0IGlzIGd1YXJhbnRlZWQgdGhhdCBubyBzdWNoIG1hcCBleGlzdHMKKwkJICogc2luY2UgbWFwIHR5cGUgb2YgMCBpcyB1bmxvYWRhYmxlIEJQRl9NQVBfVFlQRV9VTlNQRUMuCisJCSAqLworCQlpZiAoIW1lbWNtcCgmdG1wLCAmemVybywgbGVuZ3RoKSkKKwkJCXJldHVybiAwOworCisJCWZwcmludGYoc3RkZXJyLCAiTWFwIHNwZWNzIGZyb20gcGlubmVkIGZpbGUgZGlmZmVyIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludCBicGZfbW50X2ZzKGNvbnN0IGNoYXIgKnRhcmdldCkKK3sKKwlib29sIGJpbmRfZG9uZSA9IGZhbHNlOworCisJd2hpbGUgKG1vdW50KCIiLCB0YXJnZXQsICJub25lIiwgTVNfUFJJVkFURSB8IE1TX1JFQywgTlVMTCkpIHsKKwkJaWYgKGVycm5vICE9IEVJTlZBTCB8fCBiaW5kX2RvbmUpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAibW91bnQgLS1tYWtlLXByaXZhdGUgJXMgZmFpbGVkOiAlc1xuIiwKKwkJCQl0YXJnZXQsCXN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAobW91bnQodGFyZ2V0LCB0YXJnZXQsICJub25lIiwgTVNfQklORCwgTlVMTCkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAibW91bnQgLS1iaW5kICVzICVzIGZhaWxlZDogJXNcbiIsCisJCQkJdGFyZ2V0LAl0YXJnZXQsIHN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQliaW5kX2RvbmUgPSB0cnVlOworCX0KKworCWlmIChtb3VudCgiYnBmIiwgdGFyZ2V0LCAiYnBmIiwgMCwgTlVMTCkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJtb3VudCAtdCBicGYgYnBmICVzIGZhaWxlZDogJXNcbiIsCisJCQl0YXJnZXQsCXN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBicGZfdmFsaWRfbW50cHQoY29uc3QgY2hhciAqbW50LCB1bnNpZ25lZCBsb25nIG1hZ2ljKQoreworCXN0cnVjdCBzdGF0ZnMgc3RfZnM7CisKKwlpZiAoc3RhdGZzKG1udCwgJnN0X2ZzKSA8IDApCisJCXJldHVybiAtRU5PRU5UOworCWlmICgodW5zaWduZWQgbG9uZylzdF9mcy5mX3R5cGUgIT0gbWFnaWMpCisJCXJldHVybiAtRU5PRU5UOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpicGZfZmluZF9tbnRwdChjb25zdCBjaGFyICpmc3R5cGUsIHVuc2lnbmVkIGxvbmcgbWFnaWMsCisJCQkJICBjaGFyICptbnQsIGludCBsZW4sCisJCQkJICBjb25zdCBjaGFyICogY29uc3QgKmtub3duX21udHMpCit7CisJY29uc3QgY2hhciAqIGNvbnN0ICpwdHI7CisJY2hhciB0eXBlWzEwMF07CisJRklMRSAqZnA7CisKKwlpZiAoa25vd25fbW50cykgeworCQlwdHIgPSBrbm93bl9tbnRzOworCQl3aGlsZSAoKnB0cikgeworCQkJaWYgKGJwZl92YWxpZF9tbnRwdCgqcHRyLCBtYWdpYykgPT0gMCkgeworCQkJCXN0cm5jcHkobW50LCAqcHRyLCBsZW4gLSAxKTsKKwkJCQltbnRbbGVuIC0gMV0gPSAwOworCQkJCXJldHVybiBtbnQ7CisJCQl9CisJCQlwdHIrKzsKKwkJfQorCX0KKworCWZwID0gZm9wZW4oIi9wcm9jL21vdW50cyIsICJyIik7CisJaWYgKGZwID09IE5VTEwgfHwgbGVuICE9IFBBVEhfTUFYKQorCQlyZXR1cm4gTlVMTDsKKworCXdoaWxlIChmc2NhbmYoZnAsICIlKnMgJSIgdGV4dGlmeShQQVRIX01BWCkgInMgJTk5cyAlKnMgJSpkICUqZFxuIiwKKwkJICAgICAgbW50LCB0eXBlKSA9PSAyKSB7CisJCWlmIChzdHJjbXAodHlwZSwgZnN0eXBlKSA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJZmNsb3NlKGZwKTsKKwlpZiAoc3RyY21wKHR5cGUsIGZzdHlwZSkgIT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gbW50OworfQorCitpbnQgYnBmX3RyYWNlX3BpcGUodm9pZCkKK3sKKwljaGFyIHRyYWNlZnNfbW50W1BBVEhfTUFYXSA9IFRSQUNFX0RJUl9NTlQ7CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0cmFjZWZzX2tub3duX21udHNbXSA9IHsKKwkJVFJBQ0VfRElSX01OVCwKKwkJIi9zeXMva2VybmVsL2RlYnVnL3RyYWNpbmciLAorCQkiL3RyYWNpbmciLAorCQkiL3RyYWNlIiwKKwkJMCwKKwl9OworCWNoYXIgdHBpcGVbUEFUSF9NQVhdOworCWNvbnN0IGNoYXIgKm1udDsKKwlpbnQgZmQ7CisKKwltbnQgPSBicGZfZmluZF9tbnRwdCgidHJhY2VmcyIsIFRSQUNFRlNfTUFHSUMsIHRyYWNlZnNfbW50LAorCQkJICAgICBzaXplb2YodHJhY2Vmc19tbnQpLCB0cmFjZWZzX2tub3duX21udHMpOworCWlmICghbW50KSB7CisJCWZwcmludGYoc3RkZXJyLCAidHJhY2VmcyBub3QgbW91bnRlZD9cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJc25wcmludGYodHBpcGUsIHNpemVvZih0cGlwZSksICIlcy90cmFjZV9waXBlIiwgbW50KTsKKworCWZkID0gb3Blbih0cGlwZSwgT19SRE9OTFkpOworCWlmIChmZCA8IDApCisJCXJldHVybiAtMTsKKworCWZwcmludGYoc3RkZXJyLCAiUnVubmluZyEgSGFuZyB1cCB3aXRoIF5DIVxuXG4iKTsKKwl3aGlsZSAoMSkgeworCQlzdGF0aWMgY2hhciBidWZmWzQwOTZdOworCQlzc2l6ZV90IHJldDsKKworCQlyZXQgPSByZWFkKGZkLCBidWZmLCBzaXplb2YoYnVmZikgLSAxKTsKKwkJaWYgKHJldCA+IDApIHsKKwkJCXdyaXRlKDIsIGJ1ZmYsIHJldCk7CisJCQlmZmx1c2goc3RkZXJyKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYnBmX2dldF90Y19kaXIodm9pZCkKK3sKKwlzdGF0aWMgYm9vbCBicGZfbW50X2NhY2hlZCA9IGZhbHNlOworCXN0YXRpYyBjaGFyIGJwZl90Y19kaXJbUEFUSF9NQVhdOworCXN0YXRpYyBjb25zdCBjaGFyICptbnQ7CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBicGZfa25vd25fbW50c1tdID0geworCQlCUEZfRElSX01OVCwKKwkJMCwKKwl9OworCWNoYXIgYnBmX21udFtQQVRIX01BWF0gPSBCUEZfRElSX01OVDsKKwljaGFyIGJwZl9nbG9fZGlyW1BBVEhfTUFYXTsKKwlpbnQgcmV0OworCisJaWYgKGJwZl9tbnRfY2FjaGVkKQorCQlnb3RvIGRvbmU7CisKKwltbnQgPSBicGZfZmluZF9tbnRwdCgiYnBmIiwgQlBGX0ZTX01BR0lDLCBicGZfbW50LCBzaXplb2YoYnBmX21udCksCisJCQkgICAgIGJwZl9rbm93bl9tbnRzKTsKKwlpZiAoIW1udCkgeworCQltbnQgPSBnZXRlbnYoQlBGX0VOVl9NTlQpOworCQlpZiAoIW1udCkKKwkJCW1udCA9IEJQRl9ESVJfTU5UOworCQlyZXQgPSBicGZfbW50X2ZzKG1udCk7CisJCWlmIChyZXQpIHsKKwkJCW1udCA9IE5VTEw7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCXNucHJpbnRmKGJwZl90Y19kaXIsIHNpemVvZihicGZfdGNfZGlyKSwgIiVzLyVzIiwgbW50LCBCUEZfRElSX1RDKTsKKwlyZXQgPSBta2RpcihicGZfdGNfZGlyLCBTX0lSV1hVKTsKKwlpZiAocmV0ICYmIGVycm5vICE9IEVFWElTVCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIm1rZGlyICVzIGZhaWxlZDogJXNcbiIsIGJwZl90Y19kaXIsCisJCQlzdHJlcnJvcihlcnJubykpOworCQltbnQgPSBOVUxMOworCQlnb3RvIG91dDsKKwl9CisKKwlzbnByaW50ZihicGZfZ2xvX2Rpciwgc2l6ZW9mKGJwZl9nbG9fZGlyKSwgIiVzLyVzIiwKKwkJIGJwZl90Y19kaXIsIEJQRl9ESVJfR0xPQkFMUyk7CisJcmV0ID0gbWtkaXIoYnBmX2dsb19kaXIsIFNfSVJXWFUpOworCWlmIChyZXQgJiYgZXJybm8gIT0gRUVYSVNUKSB7CisJCWZwcmludGYoc3RkZXJyLCAibWtkaXIgJXMgZmFpbGVkOiAlc1xuIiwgYnBmX2dsb19kaXIsCisJCQlzdHJlcnJvcihlcnJubykpOworCQltbnQgPSBOVUxMOworCQlnb3RvIG91dDsKKwl9CisKKwltbnQgPSBicGZfdGNfZGlyOworb3V0OgorCWJwZl9tbnRfY2FjaGVkID0gdHJ1ZTsKK2RvbmU6CisJcmV0dXJuIG1udDsKK30KKworc3RhdGljIGludCBicGZfb2JqX2dldChjb25zdCBjaGFyICpwYXRobmFtZSkKK3sKKwl1bmlvbiBicGZfYXR0ciBhdHRyOworCWNoYXIgdG1wW1BBVEhfTUFYXTsKKworCWlmIChzdHJsZW4ocGF0aG5hbWUpID4gMiAmJiBwYXRobmFtZVswXSA9PSAnbScgJiYKKwkgICAgcGF0aG5hbWVbMV0gPT0gJzonICYmIGJwZl9nZXRfdGNfZGlyKCkpIHsKKwkJc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIiVzLyVzIiwKKwkJCSBicGZfZ2V0X3RjX2RpcigpLCBwYXRobmFtZSArIDIpOworCQlwYXRobmFtZSA9IHRtcDsKKwl9CisKKwltZW1zZXQoJmF0dHIsIDAsIHNpemVvZihhdHRyKSk7CisJYXR0ci5wYXRobmFtZSA9IGJwZl9wdHJfdG9fdTY0KHBhdGhuYW1lKTsKKworCXJldHVybiBicGYoQlBGX09CSl9HRVQsICZhdHRyLCBzaXplb2YoYXR0cikpOworfQorCitjb25zdCBjaGFyICpicGZfZGVmYXVsdF9zZWN0aW9uKGNvbnN0IGVudW0gYnBmX3Byb2dfdHlwZSB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFM6CisJCXJldHVybiBFTEZfU0VDVElPTl9DTEFTU0lGSUVSOworCWNhc2UgQlBGX1BST0dfVFlQRV9TQ0hFRF9BQ1Q6CisJCXJldHVybiBFTEZfU0VDVElPTl9BQ1RJT047CisJZGVmYXVsdDoKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCitlbnVtIGJwZl9tb2RlIHsKKwlDQlBGX0JZVEVDT0RFID0gMCwKKwlDQlBGX0ZJTEUsCisJRUJQRl9PQkpFQ1QsCisJRUJQRl9QSU5ORUQsCisJX19CUEZfTU9ERV9NQVgsCisjZGVmaW5lIEJQRl9NT0RFX01BWAlfX0JQRl9NT0RFX01BWAorfTsKKworc3RhdGljIGludCBicGZfcGFyc2UoaW50ICpwdHJfYXJnYywgY2hhciAqKipwdHJfYXJndiwgY29uc3QgYm9vbCAqb3B0X3RibCwKKwkJICAgICBlbnVtIGJwZl9wcm9nX3R5cGUgKnR5cGUsIGVudW0gYnBmX21vZGUgKm1vZGUsCisJCSAgICAgY29uc3QgY2hhciAqKnB0cl9vYmplY3QsIGNvbnN0IGNoYXIgKipwdHJfc2VjdGlvbiwKKwkJICAgICBjb25zdCBjaGFyICoqcHRyX3Vkc19uYW1lLCBzdHJ1Y3Qgc29ja19maWx0ZXIgKm9wY29kZXMpCit7CisJY29uc3QgY2hhciAqZmlsZSwgKnNlY3Rpb24sICp1ZHNfbmFtZTsKKwlib29sIHZlcmJvc2UgPSBmYWxzZTsKKwlpbnQgcmV0LCBhcmdjOworCWNoYXIgKiphcmd2OworCisJYXJndiA9ICpwdHJfYXJndjsKKwlhcmdjID0gKnB0cl9hcmdjOworCisJaWYgKG9wdF90YmxbQ0JQRl9CWVRFQ09ERV0gJiYKKwkgICAgKG1hdGNoZXMoKmFyZ3YsICJieXRlY29kZSIpID09IDAgfHwKKwkgICAgIHN0cmNtcCgqYXJndiwgImJjIikgPT0gMCkpIHsKKwkJKm1vZGUgPSBDQlBGX0JZVEVDT0RFOworCX0gZWxzZSBpZiAob3B0X3RibFtDQlBGX0ZJTEVdICYmCisJCSAgIChtYXRjaGVzKCphcmd2LCAiYnl0ZWNvZGUtZmlsZSIpID09IDAgfHwKKwkJICAgIHN0cmNtcCgqYXJndiwgImJjZiIpID09IDApKSB7CisJCSptb2RlID0gQ0JQRl9GSUxFOworCX0gZWxzZSBpZiAob3B0X3RibFtFQlBGX09CSkVDVF0gJiYKKwkJICAgKG1hdGNoZXMoKmFyZ3YsICJvYmplY3QtZmlsZSIpID09IDAgfHwKKwkJICAgIHN0cmNtcCgqYXJndiwgIm9iaiIpID09IDApKSB7CisJCSptb2RlID0gRUJQRl9PQkpFQ1Q7CisJfSBlbHNlIGlmIChvcHRfdGJsW0VCUEZfUElOTkVEXSAmJgorCQkgICAobWF0Y2hlcygqYXJndiwgIm9iamVjdC1waW5uZWQiKSA9PSAwIHx8CisJCSAgICBtYXRjaGVzKCphcmd2LCAicGlubmVkIikgPT0gMCB8fAorCQkgICAgbWF0Y2hlcygqYXJndiwgImZkIikgPT0gMCkpIHsKKwkJKm1vZGUgPSBFQlBGX1BJTk5FRDsKKwl9IGVsc2UgeworCQlmcHJpbnRmKHN0ZGVyciwgIldoYXQgbW9kZSBpcyBcIiVzXCI/XG4iLCAqYXJndik7CisJCXJldHVybiAtMTsKKwl9CisKKwlORVhUX0FSRygpOworCWZpbGUgPSBzZWN0aW9uID0gdWRzX25hbWUgPSBOVUxMOworCWlmICgqbW9kZSA9PSBFQlBGX09CSkVDVCB8fCAqbW9kZSA9PSBFQlBGX1BJTk5FRCkgeworCQlmaWxlID0gKmFyZ3Y7CisJCU5FWFRfQVJHX0ZXRCgpOworCisJCWlmICgqdHlwZSA9PSBCUEZfUFJPR19UWVBFX1VOU1BFQykgeworCQkJaWYgKGFyZ2MgPiAwICYmIG1hdGNoZXMoKmFyZ3YsICJ0eXBlIikgPT0gMCkgeworCQkJCU5FWFRfQVJHKCk7CisJCQkJaWYgKG1hdGNoZXMoKmFyZ3YsICJjbHMiKSA9PSAwKSB7CisJCQkJCSp0eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFM7CisJCQkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiYWN0IikgPT0gMCkgeworCQkJCQkqdHlwZSA9IEJQRl9QUk9HX1RZUEVfU0NIRURfQUNUOworCQkJCX0gZWxzZSB7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiV2hhdCB0eXBlIGlzIFwiJXNcIj9cbiIsCisJCQkJCQkqYXJndik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJTkVYVF9BUkdfRldEKCk7CisJCQl9IGVsc2UgeworCQkJCSp0eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFM7CisJCQl9CisJCX0KKworCQlzZWN0aW9uID0gYnBmX2RlZmF1bHRfc2VjdGlvbigqdHlwZSk7CisJCWlmIChhcmdjID4gMCAmJiBtYXRjaGVzKCphcmd2LCAic2VjdGlvbiIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlzZWN0aW9uID0gKmFyZ3Y7CisJCQlORVhUX0FSR19GV0QoKTsKKwkJfQorCisJCXVkc19uYW1lID0gZ2V0ZW52KEJQRl9FTlZfVURTKTsKKwkJaWYgKGFyZ2MgPiAwICYmICF1ZHNfbmFtZSAmJgorCQkgICAgbWF0Y2hlcygqYXJndiwgImV4cG9ydCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQl1ZHNfbmFtZSA9ICphcmd2OworCQkJTkVYVF9BUkdfRldEKCk7CisJCX0KKworCQlpZiAoYXJnYyA+IDAgJiYgbWF0Y2hlcygqYXJndiwgInZlcmJvc2UiKSA9PSAwKSB7CisJCQl2ZXJib3NlID0gdHJ1ZTsKKwkJCU5FWFRfQVJHX0ZXRCgpOworCQl9CisKKwkJUFJFVl9BUkcoKTsKKwl9CisKKwlpZiAoKm1vZGUgPT0gQ0JQRl9CWVRFQ09ERSB8fCAqbW9kZSA9PSBDQlBGX0ZJTEUpCisJCXJldCA9IGJwZl9vcHNfcGFyc2UoYXJnYywgYXJndiwgb3Bjb2RlcywgKm1vZGUgPT0gQ0JQRl9GSUxFKTsKKwllbHNlIGlmICgqbW9kZSA9PSBFQlBGX09CSkVDVCkKKwkJcmV0ID0gYnBmX29ial9vcGVuKGZpbGUsICp0eXBlLCBzZWN0aW9uLCB2ZXJib3NlKTsKKwllbHNlIGlmICgqbW9kZSA9PSBFQlBGX1BJTk5FRCkKKwkJcmV0ID0gYnBmX29ial9nZXQoZmlsZSk7CisJZWxzZQorCQlyZXR1cm4gLTE7CisKKwlpZiAocHRyX29iamVjdCkKKwkJKnB0cl9vYmplY3QgPSBmaWxlOworCWlmIChwdHJfc2VjdGlvbikKKwkJKnB0cl9zZWN0aW9uID0gc2VjdGlvbjsKKwlpZiAocHRyX3Vkc19uYW1lKQorCQkqcHRyX3Vkc19uYW1lID0gdWRzX25hbWU7CisKKwkqcHRyX2FyZ2MgPSBhcmdjOworCSpwdHJfYXJndiA9IGFyZ3Y7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYnBmX3BhcnNlX2NvbW1vbihpbnQgKnB0cl9hcmdjLCBjaGFyICoqKnB0cl9hcmd2LCBjb25zdCBpbnQgKm5sYV90YmwsCisJCSAgICAgZW51bSBicGZfcHJvZ190eXBlIHR5cGUsIGNvbnN0IGNoYXIgKipwdHJfb2JqZWN0LAorCQkgICAgIGNvbnN0IGNoYXIgKipwdHJfdWRzX25hbWUsIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlzdHJ1Y3Qgc29ja19maWx0ZXIgb3Bjb2Rlc1tCUEZfTUFYSU5TTlNdOworCWNvbnN0IGJvb2wgb3B0X3RibFtCUEZfTU9ERV9NQVhdID0geworCQlbQ0JQRl9CWVRFQ09ERV0JPSB0cnVlLAorCQlbQ0JQRl9GSUxFXQk9IHRydWUsCisJCVtFQlBGX09CSkVDVF0JPSB0cnVlLAorCQlbRUJQRl9QSU5ORURdCT0gdHJ1ZSwKKwl9OworCWNoYXIgYW5ub3RhdGlvblsyNTZdOworCWNvbnN0IGNoYXIgKnNlY3Rpb247CisJZW51bSBicGZfbW9kZSBtb2RlOworCWludCByZXQ7CisKKwlyZXQgPSBicGZfcGFyc2UocHRyX2FyZ2MsIHB0cl9hcmd2LCBvcHRfdGJsLCAmdHlwZSwgJm1vZGUsCisJCQlwdHJfb2JqZWN0LCAmc2VjdGlvbiwgcHRyX3Vkc19uYW1lLCBvcGNvZGVzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChtb2RlID09IENCUEZfQllURUNPREUgfHwgbW9kZSA9PSBDQlBGX0ZJTEUpIHsKKwkJYWRkYXR0cjE2KG4sIE1BWF9NU0csIG5sYV90YmxbQlBGX05MQV9PUFNfTEVOXSwgcmV0KTsKKwkJYWRkYXR0cl9sKG4sIE1BWF9NU0csIG5sYV90YmxbQlBGX05MQV9PUFNdLCBvcGNvZGVzLAorCQkJICByZXQgKiBzaXplb2Yoc3RydWN0IHNvY2tfZmlsdGVyKSk7CisJfQorCisJaWYgKG1vZGUgPT0gRUJQRl9PQkpFQ1QgfHwgbW9kZSA9PSBFQlBGX1BJTk5FRCkgeworCQlzbnByaW50Zihhbm5vdGF0aW9uLCBzaXplb2YoYW5ub3RhdGlvbiksICIlczpbJXNdIiwKKwkJCSBiYXNlbmFtZSgqcHRyX29iamVjdCksIG1vZGUgPT0gRUJQRl9QSU5ORUQgPworCQkJICIqZnNvYmoiIDogc2VjdGlvbik7CisKKwkJYWRkYXR0cjMyKG4sIE1BWF9NU0csIG5sYV90YmxbQlBGX05MQV9GRF0sIHJldCk7CisJCWFkZGF0dHJzdHJ6KG4sIE1BWF9NU0csIG5sYV90YmxbQlBGX05MQV9OQU1FXSwgYW5ub3RhdGlvbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBicGZfZ3JhZnRfbWFwKGNvbnN0IGNoYXIgKm1hcF9wYXRoLCB1aW50MzJfdCAqa2V5LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJZW51bSBicGZfcHJvZ190eXBlIHR5cGUgPSBCUEZfUFJPR19UWVBFX1VOU1BFQzsKKwljb25zdCBib29sIG9wdF90YmxbQlBGX01PREVfTUFYXSA9IHsKKwkJW0NCUEZfQllURUNPREVdCT0gZmFsc2UsCisJCVtDQlBGX0ZJTEVdCT0gZmFsc2UsCisJCVtFQlBGX09CSkVDVF0JPSB0cnVlLAorCQlbRUJQRl9QSU5ORURdCT0gdHJ1ZSwKKwl9OworCWNvbnN0IHN0cnVjdCBicGZfZWxmX21hcCB0ZXN0ID0geworCQkudHlwZQkJPSBCUEZfTUFQX1RZUEVfUFJPR19BUlJBWSwKKwkJLnNpemVfa2V5CT0gc2l6ZW9mKGludCksCisJCS5zaXplX3ZhbHVlCT0gc2l6ZW9mKGludCksCisJfTsKKwlpbnQgcmV0LCBwcm9nX2ZkLCBtYXBfZmQ7CisJY29uc3QgY2hhciAqc2VjdGlvbjsKKwllbnVtIGJwZl9tb2RlIG1vZGU7CisJdWludDMyX3QgbWFwX2tleTsKKworCXByb2dfZmQgPSBicGZfcGFyc2UoJmFyZ2MsICZhcmd2LCBvcHRfdGJsLCAmdHlwZSwgJm1vZGUsCisJCQkgICAgTlVMTCwgJnNlY3Rpb24sIE5VTEwsIE5VTEwpOworCWlmIChwcm9nX2ZkIDwgMCkKKwkJcmV0dXJuIHByb2dfZmQ7CisJaWYgKGtleSkgeworCQltYXBfa2V5ID0gKmtleTsKKwl9IGVsc2UgeworCQlyZXQgPSBzc2NhbmYoc2VjdGlvbiwgIiUqaS8laSIsICZtYXBfa2V5KTsKKwkJaWYgKHJldCAhPSAxKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkblwndCBpbmZlciBtYXAga2V5IGZyb20gc2VjdGlvbiAiCisJCQkJIm5hbWUhIFBsZWFzZSBwcm92aWRlIFwna2V5XCcgYXJndW1lbnQhXG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9wcm9nOworCQl9CisJfQorCisJbWFwX2ZkID0gYnBmX29ial9nZXQobWFwX3BhdGgpOworCWlmIChtYXBfZmQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuXCd0IHJldHJpZXZlIHBpbm5lZCBtYXAgXCclc1wnOiAlc1xuIiwKKwkJCW1hcF9wYXRoLCBzdHJlcnJvcihlcnJubykpOworCQlyZXQgPSBtYXBfZmQ7CisJCWdvdG8gb3V0X3Byb2c7CisJfQorCisJcmV0ID0gYnBmX21hcF9zZWxmY2hlY2tfcGlubmVkKG1hcF9mZCwgJnRlc3QsCisJCQkJICAgICAgIG9mZnNldG9mKHN0cnVjdCBicGZfZWxmX21hcCwgbWF4X2VsZW0pKTsKKwlpZiAocmV0IDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk1hcCBcJyVzXCcgc2VsZi1jaGVjayBmYWlsZWQhXG4iLCBtYXBfcGF0aCk7CisJCWdvdG8gb3V0X21hcDsKKwl9CisKKwlyZXQgPSBicGZfbWFwX3VwZGF0ZShtYXBfZmQsICZtYXBfa2V5LCAmcHJvZ19mZCwgQlBGX0FOWSk7CisJaWYgKHJldCA8IDApCisJCWZwcmludGYoc3RkZXJyLCAiTWFwIHVwZGF0ZSBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworb3V0X21hcDoKKwljbG9zZShtYXBfZmQpOworb3V0X3Byb2c6CisJY2xvc2UocHJvZ19mZCk7CisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIEhBVkVfRUxGCitzdHJ1Y3QgYnBmX2VsZl9wcm9nIHsKKwllbnVtIGJwZl9wcm9nX3R5cGUJdHlwZTsKKwljb25zdCBzdHJ1Y3QgYnBmX2luc24JKmluc25zOworCXNpemVfdAkJCXNpemU7CisJY29uc3QgY2hhcgkJKmxpY2Vuc2U7Cit9OworCitzdHJ1Y3QgYnBmX2hhc2hfZW50cnkgeworCXVuc2lnbmVkIGludAkJcGlubmluZzsKKwljb25zdCBjaGFyCQkqc3VicGF0aDsKKwlzdHJ1Y3QgYnBmX2hhc2hfZW50cnkJKm5leHQ7Cit9OworCitzdHJ1Y3QgYnBmX2VsZl9jdHggeworCUVsZgkJCSplbGZfZmQ7CisJR0VsZl9FaGRyCQllbGZfaGRyOworCUVsZl9EYXRhCQkqc3ltX3RhYjsKKwlFbGZfRGF0YQkJKnN0cl90YWI7CisJaW50CQkJb2JqX2ZkOworCWludAkJCW1hcF9mZHNbRUxGX01BWF9NQVBTXTsKKwlzdHJ1Y3QgYnBmX2VsZl9tYXAJbWFwc1tFTEZfTUFYX01BUFNdOworCWludAkJCXN5bV9udW07CisJaW50CQkJbWFwX251bTsKKwlib29sCQkJKnNlY19kb25lOworCWludAkJCXNlY19tYXBzOworCWNoYXIJCQlsaWNlbnNlW0VMRl9NQVhfTElDRU5TRV9MRU5dOworCWVudW0gYnBmX3Byb2dfdHlwZQl0eXBlOworCWJvb2wJCQl2ZXJib3NlOworCXN0cnVjdCBicGZfZWxmX3N0CXN0YXQ7CisJc3RydWN0IGJwZl9oYXNoX2VudHJ5CSpodFsyNTZdOworfTsKKworc3RydWN0IGJwZl9lbGZfc2VjX2RhdGEgeworCUdFbGZfU2hkcgkJc2VjX2hkcjsKKwlFbGZfRGF0YQkJKnNlY19kYXRhOworCWNvbnN0IGNoYXIJCSpzZWNfbmFtZTsKK307CisKK3N0cnVjdCBicGZfbWFwX2RhdGEgeworCWludAkJCSpmZHM7CisJY29uc3QgY2hhcgkJKm9iajsKKwlzdHJ1Y3QgYnBmX2VsZl9zdAkqc3Q7CisJc3RydWN0IGJwZl9lbGZfbWFwCSplbnQ7Cit9OworCisvKiBJZiB3ZSBwcm92aWRlIGEgc21hbGwgYnVmZmVyIHdpdGggbG9nIGxldmVsIGVuYWJsZWQsIHRoZSBrZXJuZWwKKyAqIGNvdWxkIGZhaWwgcHJvZ3JhbSBsb2FkIGFzIG5vIGJ1ZmZlciBzcGFjZSBpcyBhdmFpbGFibGUgZm9yIHRoZQorICogbG9nIGFuZCB0aHVzIHZlcmlmaWVyIGZhaWxzLiBJbiBjYXNlIHNvbWV0aGluZyBkb2Vzbid0IHBhc3MgdGhlCisgKiB2ZXJpZmllciB3ZSBzdGlsbCB3YW50IHRvIGhhbmQgc29tZXRoaW5nIGRlc2NyaXB0aXZlIHRvIHRoZSB1c2VyLgorICovCitzdGF0aWMgY2hhciBicGZfbG9nX2J1Zls2NTUzNl07CisKK3N0YXRpYyBfX2NoZWNrX2Zvcm1hdF9zdHJpbmcoMSwgMikgdm9pZCBicGZfZHVtcF9lcnJvcihjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IHZsOworCisJdmFfc3RhcnQodmwsIGZvcm1hdCk7CisJdmZwcmludGYoc3RkZXJyLCBmb3JtYXQsIHZsKTsKKwl2YV9lbmQodmwpOworCisJaWYgKGJwZl9sb2dfYnVmWzBdKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGJwZl9sb2dfYnVmKTsKKwkJbWVtc2V0KGJwZl9sb2dfYnVmLCAwLCBzaXplb2YoYnBmX2xvZ19idWYpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYnBmX21hcF9jcmVhdGUoZW51bSBicGZfbWFwX3R5cGUgdHlwZSwgdW5zaWduZWQgaW50IHNpemVfa2V5LAorCQkJICB1bnNpZ25lZCBpbnQgc2l6ZV92YWx1ZSwgdW5zaWduZWQgaW50IG1heF9lbGVtKQoreworCXVuaW9uIGJwZl9hdHRyIGF0dHIgPSB7CisJCS5tYXBfdHlwZQk9IHR5cGUsCisJCS5rZXlfc2l6ZQk9IHNpemVfa2V5LAorCQkudmFsdWVfc2l6ZQk9IHNpemVfdmFsdWUsCisJCS5tYXhfZW50cmllcwk9IG1heF9lbGVtLAorCX07CisKKwlyZXR1cm4gYnBmKEJQRl9NQVBfQ1JFQVRFLCAmYXR0ciwgc2l6ZW9mKGF0dHIpKTsKK30KKworc3RhdGljIGludCBicGZfcHJvZ19sb2FkKGVudW0gYnBmX3Byb2dfdHlwZSB0eXBlLCBjb25zdCBzdHJ1Y3QgYnBmX2luc24gKmluc25zLAorCQkJIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpsaWNlbnNlKQoreworCXVuaW9uIGJwZl9hdHRyIGF0dHIgPSB7CisJCS5wcm9nX3R5cGUJPSB0eXBlLAorCQkuaW5zbnMJCT0gYnBmX3B0cl90b191NjQoaW5zbnMpLAorCQkuaW5zbl9jbnQJPSBzaXplIC8gc2l6ZW9mKHN0cnVjdCBicGZfaW5zbiksCisJCS5saWNlbnNlCT0gYnBmX3B0cl90b191NjQobGljZW5zZSksCisJCS5sb2dfYnVmCT0gYnBmX3B0cl90b191NjQoYnBmX2xvZ19idWYpLAorCQkubG9nX3NpemUJPSBzaXplb2YoYnBmX2xvZ19idWYpLAorCQkubG9nX2xldmVsCT0gMSwKKwl9OworCisJaWYgKGdldGVudihCUEZfRU5WX05PTE9HKSkgeworCQlhdHRyLmxvZ19idWYJPSAwOworCQlhdHRyLmxvZ19zaXplCT0gMDsKKwkJYXR0ci5sb2dfbGV2ZWwJPSAwOworCX0KKworCXJldHVybiBicGYoQlBGX1BST0dfTE9BRCwgJmF0dHIsIHNpemVvZihhdHRyKSk7Cit9CisKK3N0YXRpYyBpbnQgYnBmX29ial9waW4oaW50IGZkLCBjb25zdCBjaGFyICpwYXRobmFtZSkKK3sKKwl1bmlvbiBicGZfYXR0ciBhdHRyID0geworCQkucGF0aG5hbWUJPSBicGZfcHRyX3RvX3U2NChwYXRobmFtZSksCisJCS5icGZfZmQJCT0gZmQsCisJfTsKKworCXJldHVybiBicGYoQlBGX09CSl9QSU4sICZhdHRyLCBzaXplb2YoYXR0cikpOworfQorCitzdGF0aWMgaW50IGJwZl9vYmpfaGFzaChjb25zdCBjaGFyICpvYmplY3QsIHVpbnQ4X3QgKm91dCwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfYWxnIGFsZyA9IHsKKwkJLnNhbGdfZmFtaWx5CT0gQUZfQUxHLAorCQkuc2FsZ190eXBlCT0gImhhc2giLAorCQkuc2FsZ19uYW1lCT0gInNoYTEiLAorCX07CisJaW50IHJldCwgY2ZkLCBvZmQsIGZmZDsKKwlzdHJ1Y3Qgc3RhdCBzdGJ1ZmY7CisJc3NpemVfdCBzaXplOworCisJaWYgKCFvYmplY3QgfHwgbGVuICE9IDIwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNmZCA9IHNvY2tldChBRl9BTEcsIFNPQ0tfU0VRUEFDS0VULCAwKTsKKwlpZiAoY2ZkIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBnZXQgQUZfQUxHIHNvY2tldDogJXNcbiIsCisJCQlzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gY2ZkOworCX0KKworCXJldCA9IGJpbmQoY2ZkLCAoc3RydWN0IHNvY2thZGRyICopJmFsZywgc2l6ZW9mKGFsZykpOworCWlmIChyZXQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRXJyb3IgYmluZGluZyBzb2NrZXQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQlnb3RvIG91dF9jZmQ7CisJfQorCisJb2ZkID0gYWNjZXB0KGNmZCwgTlVMTCwgMCk7CisJaWYgKG9mZCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJFcnJvciBhY2NlcHRpbmcgc29ja2V0OiAlc1xuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCXJldCA9IG9mZDsKKwkJZ290byBvdXRfY2ZkOworCX0KKworCWZmZCA9IG9wZW4ob2JqZWN0LCBPX1JET05MWSk7CisJaWYgKGZmZCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJFcnJvciBvcGVuaW5nIG9iamVjdCAlczogJXNcbiIsCisJCQlvYmplY3QsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldCA9IGZmZDsKKwkJZ290byBvdXRfb2ZkOworCX0KKworICAgICAgICByZXQgPSBmc3RhdChmZmQsICZzdGJ1ZmYpOworCWlmIChyZXQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRXJyb3IgZG9pbmcgZnN0YXQ6ICVzXG4iLAorCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBvdXRfZmZkOworCX0KKworCXNpemUgPSBzZW5kZmlsZShvZmQsIGZmZCwgTlVMTCwgc3RidWZmLnN0X3NpemUpOworCWlmIChzaXplICE9IHN0YnVmZi5zdF9zaXplKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRXJyb3IgZnJvbSBzZW5kZmlsZSAoJXpkIHZzICV6dSBieXRlcyk6ICVzXG4iLAorCQkJc2l6ZSwgc3RidWZmLnN0X3NpemUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldCA9IC0xOworCQlnb3RvIG91dF9mZmQ7CisJfQorCisJc2l6ZSA9IHJlYWQob2ZkLCBvdXQsIGxlbik7CisJaWYgKHNpemUgIT0gbGVuKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRXJyb3IgZnJvbSByZWFkICglemQgdnMgJXp1IGJ5dGVzKTogJXNcbiIsCisJCQlzaXplLCBsZW4sIHN0cmVycm9yKGVycm5vKSk7CisJCXJldCA9IC0xOworCX0gZWxzZSB7CisJCXJldCA9IDA7CisJfQorb3V0X2ZmZDoKKwljbG9zZShmZmQpOworb3V0X29mZDoKKwljbG9zZShvZmQpOworb3V0X2NmZDoKKwljbG9zZShjZmQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpicGZfZ2V0X29ial91aWQoY29uc3QgY2hhciAqcGF0aG5hbWUpCit7CisJc3RhdGljIGJvb2wgYnBmX3VpZF9jYWNoZWQgPSBmYWxzZTsKKwlzdGF0aWMgY2hhciBicGZfdWlkWzY0XTsKKwl1aW50OF90IHRtcFsyMF07CisJaW50IHJldDsKKworCWlmIChicGZfdWlkX2NhY2hlZCkKKwkJZ290byBkb25lOworCisJcmV0ID0gYnBmX29ial9oYXNoKHBhdGhuYW1lLCB0bXAsIHNpemVvZih0bXApKTsKKwlpZiAocmV0KSB7CisJCWZwcmludGYoc3RkZXJyLCAiT2JqZWN0IGhhc2hpbmcgZmFpbGVkIVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWhleHN0cmluZ19uMmEodG1wLCBzaXplb2YodG1wKSwgYnBmX3VpZCwgc2l6ZW9mKGJwZl91aWQpKTsKKwlicGZfdWlkX2NhY2hlZCA9IHRydWU7Citkb25lOgorCXJldHVybiBicGZfdWlkOworfQorCitzdGF0aWMgaW50IGJwZl9pbml0X2Vudihjb25zdCBjaGFyICpwYXRobmFtZSkKK3sKKwlzdHJ1Y3QgcmxpbWl0IGxpbWl0ID0geworCQkucmxpbV9jdXIgPSBSTElNX0lORklOSVRZLAorCQkucmxpbV9tYXggPSBSTElNX0lORklOSVRZLAorCX07CisKKwkvKiBEb24ndCBib3RoZXIgaW4gY2FzZSB3ZSBmYWlsISAqLworCXNldHJsaW1pdChSTElNSVRfTUVNTE9DSywgJmxpbWl0KTsKKworCWlmICghYnBmX2dldF90Y19kaXIoKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvbnRpbnVpbmcgd2l0aG91dCBtb3VudGVkIGVCUEYgZnMuICIKKwkJCSJUb28gb2xkIGtlcm5lbD9cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWJwZl9nZXRfb2JqX3VpZChwYXRobmFtZSkpCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYnBmX2N1c3RvbV9waW5uaW5nKGNvbnN0IHN0cnVjdCBicGZfZWxmX2N0eCAqY3R4LAorCQkJCSAgICAgIHVpbnQzMl90IHBpbm5pbmcpCit7CisJc3RydWN0IGJwZl9oYXNoX2VudHJ5ICplbnRyeTsKKworCWVudHJ5ID0gY3R4LT5odFtwaW5uaW5nICYgKEFSUkFZX1NJWkUoY3R4LT5odCkgLSAxKV07CisJd2hpbGUgKGVudHJ5ICYmIGVudHJ5LT5waW5uaW5nICE9IHBpbm5pbmcpCisJCWVudHJ5ID0gZW50cnktPm5leHQ7CisKKwlyZXR1cm4gZW50cnkgPyBlbnRyeS0+c3VicGF0aCA6IE5VTEw7Cit9CisKK3N0YXRpYyBib29sIGJwZl9ub19waW5uaW5nKGNvbnN0IHN0cnVjdCBicGZfZWxmX2N0eCAqY3R4LAorCQkJICAgdWludDMyX3QgcGlubmluZykKK3sKKwlzd2l0Y2ggKHBpbm5pbmcpIHsKKwljYXNlIFBJTl9PQkpFQ1RfTlM6CisJY2FzZSBQSU5fR0xPQkFMX05TOgorCQlyZXR1cm4gZmFsc2U7CisJY2FzZSBQSU5fTk9ORToKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuICFicGZfY3VzdG9tX3Bpbm5pbmcoY3R4LCBwaW5uaW5nKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJwZl9tYWtlX3BhdGhuYW1lKGNoYXIgKnBhdGhuYW1lLCBzaXplX3QgbGVuLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgICAgY29uc3Qgc3RydWN0IGJwZl9lbGZfY3R4ICpjdHgsIHVpbnQzMl90IHBpbm5pbmcpCit7CisJc3dpdGNoIChwaW5uaW5nKSB7CisJY2FzZSBQSU5fT0JKRUNUX05TOgorCQlzbnByaW50ZihwYXRobmFtZSwgbGVuLCAiJXMvJXMvJXMiLCBicGZfZ2V0X3RjX2RpcigpLAorCQkJIGJwZl9nZXRfb2JqX3VpZChOVUxMKSwgbmFtZSk7CisJCWJyZWFrOworCWNhc2UgUElOX0dMT0JBTF9OUzoKKwkJc25wcmludGYocGF0aG5hbWUsIGxlbiwgIiVzLyVzLyVzIiwgYnBmX2dldF90Y19kaXIoKSwKKwkJCSBCUEZfRElSX0dMT0JBTFMsIG5hbWUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzbnByaW50ZihwYXRobmFtZSwgbGVuLCAiJXMvLi4vJXMvJXMiLCBicGZfZ2V0X3RjX2RpcigpLAorCQkJIGJwZl9jdXN0b21fcGlubmluZyhjdHgsIHBpbm5pbmcpLCBuYW1lKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IGJwZl9wcm9iZV9waW5uZWQoY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3RydWN0IGJwZl9lbGZfY3R4ICpjdHgsCisJCQkgICAgdWludDMyX3QgcGlubmluZykKK3sKKwljaGFyIHBhdGhuYW1lW1BBVEhfTUFYXTsKKworCWlmIChicGZfbm9fcGlubmluZyhjdHgsIHBpbm5pbmcpIHx8ICFicGZfZ2V0X3RjX2RpcigpKQorCQlyZXR1cm4gMDsKKworCWJwZl9tYWtlX3BhdGhuYW1lKHBhdGhuYW1lLCBzaXplb2YocGF0aG5hbWUpLCBuYW1lLCBjdHgsIHBpbm5pbmcpOworCXJldHVybiBicGZfb2JqX2dldChwYXRobmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgYnBmX21ha2Vfb2JqX3BhdGgodm9pZCkKK3sKKwljaGFyIHRtcFtQQVRIX01BWF07CisJaW50IHJldDsKKworCXNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICIlcy8lcyIsIGJwZl9nZXRfdGNfZGlyKCksCisJCSBicGZfZ2V0X29ial91aWQoTlVMTCkpOworCisJcmV0ID0gbWtkaXIodG1wLCBTX0lSV1hVKTsKKwlpZiAocmV0ICYmIGVycm5vICE9IEVFWElTVCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIm1rZGlyICVzIGZhaWxlZDogJXNcbiIsIHRtcCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBicGZfbWFrZV9jdXN0b21fcGF0aChjb25zdCBjaGFyICp0b2RvKQoreworCWNoYXIgdG1wW1BBVEhfTUFYXSwgcmVtW1BBVEhfTUFYXSwgKnN1YjsKKwlpbnQgcmV0OworCisJc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIiVzLy4uLyIsIGJwZl9nZXRfdGNfZGlyKCkpOworCXNucHJpbnRmKHJlbSwgc2l6ZW9mKHJlbSksICIlcy8iLCB0b2RvKTsKKwlzdWIgPSBzdHJ0b2socmVtLCAiLyIpOworCisJd2hpbGUgKHN1YikgeworCQlpZiAoc3RybGVuKHRtcCkgKyBzdHJsZW4oc3ViKSArIDIgPiBQQVRIX01BWCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXN0cmNhdCh0bXAsIHN1Yik7CisJCXN0cmNhdCh0bXAsICIvIik7CisKKwkJcmV0ID0gbWtkaXIodG1wLCBTX0lSV1hVKTsKKwkJaWYgKHJldCAmJiBlcnJubyAhPSBFRVhJU1QpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAibWtkaXIgJXMgZmFpbGVkOiAlc1xuIiwgdG1wLAorCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJc3ViID0gc3RydG9rKE5VTEwsICIvIik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnBmX3BsYWNlX3Bpbm5lZChpbnQgZmQsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgY29uc3Qgc3RydWN0IGJwZl9lbGZfY3R4ICpjdHgsIHVpbnQzMl90IHBpbm5pbmcpCit7CisJY2hhciBwYXRobmFtZVtQQVRIX01BWF07CisJY29uc3QgY2hhciAqdG1wOworCWludCByZXQgPSAwOworCisJaWYgKGJwZl9ub19waW5uaW5nKGN0eCwgcGlubmluZykgfHwgIWJwZl9nZXRfdGNfZGlyKCkpCisJCXJldHVybiAwOworCisJaWYgKHBpbm5pbmcgPT0gUElOX09CSkVDVF9OUykKKwkJcmV0ID0gYnBmX21ha2Vfb2JqX3BhdGgoKTsKKwllbHNlIGlmICgodG1wID0gYnBmX2N1c3RvbV9waW5uaW5nKGN0eCwgcGlubmluZykpKQorCQlyZXQgPSBicGZfbWFrZV9jdXN0b21fcGF0aCh0bXApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJYnBmX21ha2VfcGF0aG5hbWUocGF0aG5hbWUsIHNpemVvZihwYXRobmFtZSksIG5hbWUsIGN0eCwgcGlubmluZyk7CisJcmV0dXJuIGJwZl9vYmpfcGluKGZkLCBwYXRobmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgYnBmX3Byb2dfYXR0YWNoKGNvbnN0IGNoYXIgKnNlY3Rpb24sCisJCQkgICBjb25zdCBzdHJ1Y3QgYnBmX2VsZl9wcm9nICpwcm9nLCBib29sIHZlcmJvc2UpCit7CisJaW50IGZkOworCisJLyogV2UgY2FuIGFkZCBwaW5uaW5nIGhlcmUgbGF0ZXIgYXMgd2VsbCwgc2FtZSBhcyBicGZfbWFwX2F0dGFjaCgpLiAqLworCWVycm5vID0gMDsKKwlmZCA9IGJwZl9wcm9nX2xvYWQocHJvZy0+dHlwZSwgcHJvZy0+aW5zbnMsIHByb2ctPnNpemUsCisJCQkgICBwcm9nLT5saWNlbnNlKTsKKwlpZiAoZmQgPCAwIHx8IHZlcmJvc2UpIHsKKwkJYnBmX2R1bXBfZXJyb3IoIlByb2cgc2VjdGlvbiBcJyVzXCcgKHR5cGU6JXUgaW5zbnM6JXp1ICIKKwkJCSAgICAgICAibGljZW5zZTpcJyVzXCcpICVzJXMgKCVkKSFcblxuIiwKKwkJCSAgICAgICBzZWN0aW9uLCBwcm9nLT50eXBlLAorCQkJICAgICAgIHByb2ctPnNpemUgLyBzaXplb2Yoc3RydWN0IGJwZl9pbnNuKSwKKwkJCSAgICAgICBwcm9nLT5saWNlbnNlLCBmZCA8IDAgPyAicmVqZWN0ZWQ6ICIgOgorCQkJICAgICAgICJsb2FkZWQiLCBmZCA8IDAgPyBzdHJlcnJvcihlcnJubykgOiAiIiwKKwkJCSAgICAgICBmZCA8IDAgPyBlcnJubyA6IGZkKTsKKwl9CisKKwlyZXR1cm4gZmQ7Cit9CisKK3N0YXRpYyBpbnQgYnBmX21hcF9hdHRhY2goY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3RydWN0IGJwZl9lbGZfbWFwICptYXAsCisJCQkgIGNvbnN0IHN0cnVjdCBicGZfZWxmX2N0eCAqY3R4LCBib29sIHZlcmJvc2UpCit7CisJaW50IGZkLCByZXQ7CisKKwlmZCA9IGJwZl9wcm9iZV9waW5uZWQobmFtZSwgY3R4LCBtYXAtPnBpbm5pbmcpOworCWlmIChmZCA+IDApIHsKKwkJcmV0ID0gYnBmX21hcF9zZWxmY2hlY2tfcGlubmVkKGZkLCBtYXAsCisJCQkJCSAgICAgICBvZmZzZXRvZihzdHJ1Y3QgYnBmX2VsZl9tYXAsCisJCQkJCQkJaWQpKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWNsb3NlKGZkKTsKKwkJCWZwcmludGYoc3RkZXJyLCAiTWFwIFwnJXNcJyBzZWxmLWNoZWNrIGZhaWxlZCFcbiIsCisJCQkJbmFtZSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWlmICh2ZXJib3NlKQorCQkJZnByaW50ZihzdGRlcnIsICJNYXAgXCclc1wnIGxvYWRlZCBhcyBwaW5uZWQhXG4iLAorCQkJCW5hbWUpOworCQlyZXR1cm4gZmQ7CisJfQorCisJZXJybm8gPSAwOworCWZkID0gYnBmX21hcF9jcmVhdGUobWFwLT50eXBlLCBtYXAtPnNpemVfa2V5LCBtYXAtPnNpemVfdmFsdWUsCisJCQkgICAgbWFwLT5tYXhfZWxlbSk7CisJaWYgKGZkIDwgMCB8fCB2ZXJib3NlKSB7CisJCWJwZl9kdW1wX2Vycm9yKCJNYXAgXCclc1wnICh0eXBlOiV1IGlkOiV1IHBpbm5pbmc6JXUgIgorCQkJICAgICAgICJrc2l6ZToldSB2c2l6ZToldSBtYXgtZWxlbXM6JXUpICVzJXMgKCVkKSFcbiIsCisJCQkgICAgICAgbmFtZSwgbWFwLT50eXBlLCBtYXAtPmlkLCBtYXAtPnBpbm5pbmcsCisJCQkgICAgICAgbWFwLT5zaXplX2tleSwgbWFwLT5zaXplX3ZhbHVlLCBtYXAtPm1heF9lbGVtLAorCQkJICAgICAgIGZkIDwgMCA/ICJyZWplY3RlZDogIiA6ICJsb2FkZWQiLCBmZCA8IDAgPworCQkJICAgICAgIHN0cmVycm9yKGVycm5vKSA6ICIiLCBmZCA8IDAgPyBlcnJubyA6IGZkKTsKKwkJaWYgKGZkIDwgMCkKKwkJCXJldHVybiBmZDsKKwl9CisKKwlyZXQgPSBicGZfcGxhY2VfcGlubmVkKGZkLCBuYW1lLCBjdHgsIG1hcC0+cGlubmluZyk7CisJaWYgKHJldCA8IDAgJiYgZXJybm8gIT0gRUVYSVNUKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IHBpbiAlcyBtYXA6ICVzXG4iLCBuYW1lLAorCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBmZDsKK30KKworI2RlZmluZSBfX0VMRl9TVF9CSU5EKHgpCSgoeCkgPj4gNCkKKyNkZWZpbmUgX19FTEZfU1RfVFlQRSh4KQkoKCh1bnNpZ25lZCBpbnQpIHgpICYgMHhmKQorCitzdGF0aWMgY29uc3QgY2hhciAqYnBmX3N0cl90YWJfbmFtZShjb25zdCBzdHJ1Y3QgYnBmX2VsZl9jdHggKmN0eCwKKwkJCQkgICAgY29uc3QgR0VsZl9TeW0gKnN5bSkKK3sKKwlyZXR1cm4gY3R4LT5zdHJfdGFiLT5kX2J1ZiArIHN5bS0+c3RfbmFtZTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmJwZl9tYXBfZmV0Y2hfbmFtZShzdHJ1Y3QgYnBmX2VsZl9jdHggKmN0eCwgaW50IHdoaWNoKQoreworCUdFbGZfU3ltIHN5bTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjdHgtPnN5bV9udW07IGkrKykgeworCQlpZiAoZ2VsZl9nZXRzeW0oY3R4LT5zeW1fdGFiLCBpLCAmc3ltKSAhPSAmc3ltKQorCQkJY29udGludWU7CisKKwkJaWYgKF9fRUxGX1NUX0JJTkQoc3ltLnN0X2luZm8pICE9IFNUQl9HTE9CQUwgfHwKKwkJICAgIF9fRUxGX1NUX1RZUEUoc3ltLnN0X2luZm8pICE9IFNUVF9OT1RZUEUgfHwKKwkJICAgIHN5bS5zdF9zaG5keCAhPSBjdHgtPnNlY19tYXBzIHx8CisJCSAgICBzeW0uc3RfdmFsdWUgLyBzaXplb2Yoc3RydWN0IGJwZl9lbGZfbWFwKSAhPSB3aGljaCkKKwkJCWNvbnRpbnVlOworCisJCXJldHVybiBicGZfc3RyX3RhYl9uYW1lKGN0eCwgJnN5bSk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgYnBmX21hcHNfYXR0YWNoX2FsbChzdHJ1Y3QgYnBmX2VsZl9jdHggKmN0eCkKK3sKKwljb25zdCBjaGFyICptYXBfbmFtZTsKKwlpbnQgaSwgZmQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgY3R4LT5tYXBfbnVtOyBpKyspIHsKKwkJbWFwX25hbWUgPSBicGZfbWFwX2ZldGNoX25hbWUoY3R4LCBpKTsKKwkJaWYgKCFtYXBfbmFtZSkKKwkJCXJldHVybiAtRUlPOworCisJCWZkID0gYnBmX21hcF9hdHRhY2gobWFwX25hbWUsICZjdHgtPm1hcHNbaV0sIGN0eCwKKwkJCQkgICAgY3R4LT52ZXJib3NlKTsKKwkJaWYgKGZkIDwgMCkKKwkJCXJldHVybiBmZDsKKworCQljdHgtPm1hcF9mZHNbaV0gPSBmZDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBicGZfZmlsbF9zZWN0aW9uX2RhdGEoc3RydWN0IGJwZl9lbGZfY3R4ICpjdHgsIGludCBzZWN0aW9uLAorCQkJCSBzdHJ1Y3QgYnBmX2VsZl9zZWNfZGF0YSAqZGF0YSkKK3sKKwlFbGZfRGF0YSAqc2VjX2VkYXRhOworCUdFbGZfU2hkciBzZWNfaGRyOworCUVsZl9TY24gKnNlY19mZDsKKwljaGFyICpzZWNfbmFtZTsKKworCW1lbXNldChkYXRhLCAwLCBzaXplb2YoKmRhdGEpKTsKKworCXNlY19mZCA9IGVsZl9nZXRzY24oY3R4LT5lbGZfZmQsIHNlY3Rpb24pOworCWlmICghc2VjX2ZkKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZ2VsZl9nZXRzaGRyKHNlY19mZCwgJnNlY19oZHIpICE9ICZzZWNfaGRyKQorCQlyZXR1cm4gLUVJTzsKKworCXNlY19uYW1lID0gZWxmX3N0cnB0cihjdHgtPmVsZl9mZCwgY3R4LT5lbGZfaGRyLmVfc2hzdHJuZHgsCisJCQkgICAgICBzZWNfaGRyLnNoX25hbWUpOworCWlmICghc2VjX25hbWUgfHwgIXNlY19oZHIuc2hfc2l6ZSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlzZWNfZWRhdGEgPSBlbGZfZ2V0ZGF0YShzZWNfZmQsIE5VTEwpOworCWlmICghc2VjX2VkYXRhIHx8IGVsZl9nZXRkYXRhKHNlY19mZCwgc2VjX2VkYXRhKSkKKwkJcmV0dXJuIC1FSU87CisKKwltZW1jcHkoJmRhdGEtPnNlY19oZHIsICZzZWNfaGRyLCBzaXplb2Yoc2VjX2hkcikpOworCisJZGF0YS0+c2VjX25hbWUgPSBzZWNfbmFtZTsKKwlkYXRhLT5zZWNfZGF0YSA9IHNlY19lZGF0YTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBicGZfZmV0Y2hfbWFwcyhzdHJ1Y3QgYnBmX2VsZl9jdHggKmN0eCwgaW50IHNlY3Rpb24sCisJCQkgIHN0cnVjdCBicGZfZWxmX3NlY19kYXRhICpkYXRhKQoreworCWlmIChkYXRhLT5zZWNfZGF0YS0+ZF9zaXplICUgc2l6ZW9mKHN0cnVjdCBicGZfZWxmX21hcCkgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljdHgtPm1hcF9udW0gPSBkYXRhLT5zZWNfZGF0YS0+ZF9zaXplIC8gc2l6ZW9mKHN0cnVjdCBicGZfZWxmX21hcCk7CisJY3R4LT5zZWNfbWFwcyA9IHNlY3Rpb247CisJY3R4LT5zZWNfZG9uZVtzZWN0aW9uXSA9IHRydWU7CisKKwlpZiAoY3R4LT5tYXBfbnVtID4gQVJSQVlfU0laRShjdHgtPm1hcF9mZHMpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVG9vIG1hbnkgQlBGIG1hcHMgaW4gRUxGIHNlY3Rpb24hXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtY3B5KGN0eC0+bWFwcywgZGF0YS0+c2VjX2RhdGEtPmRfYnVmLCBkYXRhLT5zZWNfZGF0YS0+ZF9zaXplKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBicGZfZmV0Y2hfbGljZW5zZShzdHJ1Y3QgYnBmX2VsZl9jdHggKmN0eCwgaW50IHNlY3Rpb24sCisJCQkgICAgIHN0cnVjdCBicGZfZWxmX3NlY19kYXRhICpkYXRhKQoreworCWlmIChkYXRhLT5zZWNfZGF0YS0+ZF9zaXplID4gc2l6ZW9mKGN0eC0+bGljZW5zZSkpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtY3B5KGN0eC0+bGljZW5zZSwgZGF0YS0+c2VjX2RhdGEtPmRfYnVmLCBkYXRhLT5zZWNfZGF0YS0+ZF9zaXplKTsKKwljdHgtPnNlY19kb25lW3NlY3Rpb25dID0gdHJ1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBicGZfZmV0Y2hfc3ltdGFiKHN0cnVjdCBicGZfZWxmX2N0eCAqY3R4LCBpbnQgc2VjdGlvbiwKKwkJCSAgICBzdHJ1Y3QgYnBmX2VsZl9zZWNfZGF0YSAqZGF0YSkKK3sKKwljdHgtPnN5bV90YWIgPSBkYXRhLT5zZWNfZGF0YTsKKwljdHgtPnN5bV9udW0gPSBkYXRhLT5zZWNfaGRyLnNoX3NpemUgLyBkYXRhLT5zZWNfaGRyLnNoX2VudHNpemU7CisJY3R4LT5zZWNfZG9uZVtzZWN0aW9uXSA9IHRydWU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnBmX2ZldGNoX3N0cnRhYihzdHJ1Y3QgYnBmX2VsZl9jdHggKmN0eCwgaW50IHNlY3Rpb24sCisJCQkgICAgc3RydWN0IGJwZl9lbGZfc2VjX2RhdGEgKmRhdGEpCit7CisJY3R4LT5zdHJfdGFiID0gZGF0YS0+c2VjX2RhdGE7CisJY3R4LT5zZWNfZG9uZVtzZWN0aW9uXSA9IHRydWU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnBmX2ZldGNoX2FuY2lsbGFyeShzdHJ1Y3QgYnBmX2VsZl9jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgYnBmX2VsZl9zZWNfZGF0YSBkYXRhOworCWludCBpLCByZXQgPSAtMTsKKworCWZvciAoaSA9IDE7IGkgPCBjdHgtPmVsZl9oZHIuZV9zaG51bTsgaSsrKSB7CisJCXJldCA9IGJwZl9maWxsX3NlY3Rpb25fZGF0YShjdHgsIGksICZkYXRhKTsKKwkJaWYgKHJldCA8IDApCisJCQljb250aW51ZTsKKworCQlpZiAoZGF0YS5zZWNfaGRyLnNoX3R5cGUgPT0gU0hUX1BST0dCSVRTICYmCisJCSAgICAhc3RyY21wKGRhdGEuc2VjX25hbWUsIEVMRl9TRUNUSU9OX01BUFMpKQorCQkJcmV0ID0gYnBmX2ZldGNoX21hcHMoY3R4LCBpLCAmZGF0YSk7CisJCWVsc2UgaWYgKGRhdGEuc2VjX2hkci5zaF90eXBlID09IFNIVF9QUk9HQklUUyAmJgorCQkJICFzdHJjbXAoZGF0YS5zZWNfbmFtZSwgRUxGX1NFQ1RJT05fTElDRU5TRSkpCisJCQlyZXQgPSBicGZfZmV0Y2hfbGljZW5zZShjdHgsIGksICZkYXRhKTsKKwkJZWxzZSBpZiAoZGF0YS5zZWNfaGRyLnNoX3R5cGUgPT0gU0hUX1NZTVRBQiAmJgorCQkJICFzdHJjbXAoZGF0YS5zZWNfbmFtZSwgIi5zeW10YWIiKSkKKwkJCXJldCA9IGJwZl9mZXRjaF9zeW10YWIoY3R4LCBpLCAmZGF0YSk7CisJCWVsc2UgaWYgKGRhdGEuc2VjX2hkci5zaF90eXBlID09IFNIVF9TVFJUQUIgJiYKKwkJCSAhc3RyY21wKGRhdGEuc2VjX25hbWUsICIuc3RydGFiIikpCisJCQlyZXQgPSBicGZfZmV0Y2hfc3RydGFiKGN0eCwgaSwgJmRhdGEpOworCQlpZiAocmV0IDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJFcnJvciBwYXJzaW5nIHNlY3Rpb24gJWQhIFBlcmhhcHMiCisJCQkJImNoZWNrIHdpdGggcmVhZGVsZiAtYT9cbiIsIGkpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoY3R4LT5zeW1fdGFiICYmIGN0eC0+c3RyX3RhYiAmJiBjdHgtPnNlY19tYXBzKSB7CisJCXJldCA9IGJwZl9tYXBzX2F0dGFjaF9hbGwoY3R4KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiRXJyb3IgbG9hZGluZyBtYXBzIGludG8ga2VybmVsIVxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBicGZfZmV0Y2hfcHJvZyhzdHJ1Y3QgYnBmX2VsZl9jdHggKmN0eCwgY29uc3QgY2hhciAqc2VjdGlvbikKK3sKKwlzdHJ1Y3QgYnBmX2VsZl9zZWNfZGF0YSBkYXRhOworCXN0cnVjdCBicGZfZWxmX3Byb2cgcHJvZzsKKwlpbnQgcmV0LCBpLCBmZCA9IC0xOworCisJZm9yIChpID0gMTsgaSA8IGN0eC0+ZWxmX2hkci5lX3NobnVtOyBpKyspIHsKKwkJaWYgKGN0eC0+c2VjX2RvbmVbaV0pCisJCQljb250aW51ZTsKKworCQlyZXQgPSBicGZfZmlsbF9zZWN0aW9uX2RhdGEoY3R4LCBpLCAmZGF0YSk7CisJCWlmIChyZXQgPCAwIHx8CisJCSAgICAhKGRhdGEuc2VjX2hkci5zaF90eXBlID09IFNIVF9QUk9HQklUUyAmJgorCQkgICAgICBkYXRhLnNlY19oZHIuc2hfZmxhZ3MgJiBTSEZfRVhFQ0lOU1RSICYmCisJCSAgICAgICFzdHJjbXAoZGF0YS5zZWNfbmFtZSwgc2VjdGlvbikpKQorCQkJY29udGludWU7CisKKwkJbWVtc2V0KCZwcm9nLCAwLCBzaXplb2YocHJvZykpOworCQlwcm9nLnR5cGUgICAgPSBjdHgtPnR5cGU7CisJCXByb2cuaW5zbnMgICA9IGRhdGEuc2VjX2RhdGEtPmRfYnVmOworCQlwcm9nLnNpemUgICAgPSBkYXRhLnNlY19kYXRhLT5kX3NpemU7CisJCXByb2cubGljZW5zZSA9IGN0eC0+bGljZW5zZTsKKworCQlmZCA9IGJwZl9wcm9nX2F0dGFjaChzZWN0aW9uLCAmcHJvZywgY3R4LT52ZXJib3NlKTsKKwkJaWYgKGZkIDwgMCkKKwkJCWNvbnRpbnVlOworCisJCWN0eC0+c2VjX2RvbmVbaV0gPSB0cnVlOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZmQ7Cit9CisKK3N0YXRpYyBpbnQgYnBmX2FwcGx5X3JlbG9fZGF0YShzdHJ1Y3QgYnBmX2VsZl9jdHggKmN0eCwKKwkJCSAgICAgICBzdHJ1Y3QgYnBmX2VsZl9zZWNfZGF0YSAqZGF0YV9yZWxvLAorCQkJICAgICAgIHN0cnVjdCBicGZfZWxmX3NlY19kYXRhICpkYXRhX2luc24pCit7CisJRWxmX0RhdGEgKmlkYXRhID0gZGF0YV9pbnNuLT5zZWNfZGF0YTsKKwlHRWxmX1NoZHIgKnJoZHIgPSAmZGF0YV9yZWxvLT5zZWNfaGRyOworCWludCByZWxvX2VudCwgcmVsb19udW0gPSByaGRyLT5zaF9zaXplIC8gcmhkci0+c2hfZW50c2l6ZTsKKwlzdHJ1Y3QgYnBmX2luc24gKmluc25zID0gaWRhdGEtPmRfYnVmOworCXVuc2lnbmVkIGludCBudW1faW5zbnMgPSBpZGF0YS0+ZF9zaXplIC8gc2l6ZW9mKCppbnNucyk7CisKKwlmb3IgKHJlbG9fZW50ID0gMDsgcmVsb19lbnQgPCByZWxvX251bTsgcmVsb19lbnQrKykgeworCQl1bnNpZ25lZCBpbnQgaW9mZiwgcm1hcDsKKwkJR0VsZl9SZWwgcmVsbzsKKwkJR0VsZl9TeW0gc3ltOworCisJCWlmIChnZWxmX2dldHJlbChkYXRhX3JlbG8tPnNlY19kYXRhLCByZWxvX2VudCwgJnJlbG8pICE9ICZyZWxvKQorCQkJcmV0dXJuIC1FSU87CisKKwkJaW9mZiA9IHJlbG8ucl9vZmZzZXQgLyBzaXplb2Yoc3RydWN0IGJwZl9pbnNuKTsKKwkJaWYgKGlvZmYgPj0gbnVtX2luc25zIHx8CisJCSAgICBpbnNuc1tpb2ZmXS5jb2RlICE9IChCUEZfTEQgfCBCUEZfSU1NIHwgQlBGX0RXKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChnZWxmX2dldHN5bShjdHgtPnN5bV90YWIsIEdFTEZfUl9TWU0ocmVsby5yX2luZm8pLCAmc3ltKSAhPSAmc3ltKQorCQkJcmV0dXJuIC1FSU87CisKKwkJcm1hcCA9IHN5bS5zdF92YWx1ZSAvIHNpemVvZihzdHJ1Y3QgYnBmX2VsZl9tYXApOworCQlpZiAocm1hcCA+PSBBUlJBWV9TSVpFKGN0eC0+bWFwX2ZkcykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFjdHgtPm1hcF9mZHNbcm1hcF0pCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoY3R4LT52ZXJib3NlKQorCQkJZnByaW50ZihzdGRlcnIsICJNYXAgXCclc1wnICglZCkgaW5qZWN0ZWQgaW50byBwcm9nICIKKwkJCQkic2VjdGlvbiBcJyVzXCcgYXQgb2Zmc2V0ICV1IVxuIiwKKwkJCQlicGZfc3RyX3RhYl9uYW1lKGN0eCwgJnN5bSksIGN0eC0+bWFwX2Zkc1tybWFwXSwKKwkJCQlkYXRhX2luc24tPnNlY19uYW1lLCBpb2ZmKTsKKworCQlpbnNuc1tpb2ZmXS5zcmNfcmVnID0gQlBGX1BTRVVET19NQVBfRkQ7CisJCWluc25zW2lvZmZdLmltbSAgICAgPSBjdHgtPm1hcF9mZHNbcm1hcF07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnBmX2ZldGNoX3Byb2dfcmVsbyhzdHJ1Y3QgYnBmX2VsZl9jdHggKmN0eCwgY29uc3QgY2hhciAqc2VjdGlvbikKK3sKKwlzdHJ1Y3QgYnBmX2VsZl9zZWNfZGF0YSBkYXRhX3JlbG8sIGRhdGFfaW5zbjsKKwlzdHJ1Y3QgYnBmX2VsZl9wcm9nIHByb2c7CisJaW50IHJldCwgaWR4LCBpLCBmZCA9IC0xOworCisJZm9yIChpID0gMTsgaSA8IGN0eC0+ZWxmX2hkci5lX3NobnVtOyBpKyspIHsKKwkJcmV0ID0gYnBmX2ZpbGxfc2VjdGlvbl9kYXRhKGN0eCwgaSwgJmRhdGFfcmVsbyk7CisJCWlmIChyZXQgPCAwIHx8IGRhdGFfcmVsby5zZWNfaGRyLnNoX3R5cGUgIT0gU0hUX1JFTCkKKwkJCWNvbnRpbnVlOworCisJCWlkeCA9IGRhdGFfcmVsby5zZWNfaGRyLnNoX2luZm87CisJCXJldCA9IGJwZl9maWxsX3NlY3Rpb25fZGF0YShjdHgsIGlkeCwgJmRhdGFfaW5zbik7CisJCWlmIChyZXQgPCAwIHx8CisJCSAgICAhKGRhdGFfaW5zbi5zZWNfaGRyLnNoX3R5cGUgPT0gU0hUX1BST0dCSVRTICYmCisJCSAgICAgIGRhdGFfaW5zbi5zZWNfaGRyLnNoX2ZsYWdzICYgU0hGX0VYRUNJTlNUUiAmJgorCQkgICAgICAhc3RyY21wKGRhdGFfaW5zbi5zZWNfbmFtZSwgc2VjdGlvbikpKQorCQkJY29udGludWU7CisKKwkJcmV0ID0gYnBmX2FwcGx5X3JlbG9fZGF0YShjdHgsICZkYXRhX3JlbG8sICZkYXRhX2luc24pOworCQlpZiAocmV0IDwgMCkKKwkJCWNvbnRpbnVlOworCisJCW1lbXNldCgmcHJvZywgMCwgc2l6ZW9mKHByb2cpKTsKKwkJcHJvZy50eXBlICAgID0gY3R4LT50eXBlOworCQlwcm9nLmluc25zICAgPSBkYXRhX2luc24uc2VjX2RhdGEtPmRfYnVmOworCQlwcm9nLnNpemUgICAgPSBkYXRhX2luc24uc2VjX2RhdGEtPmRfc2l6ZTsKKwkJcHJvZy5saWNlbnNlID0gY3R4LT5saWNlbnNlOworCisJCWZkID0gYnBmX3Byb2dfYXR0YWNoKHNlY3Rpb24sICZwcm9nLCBjdHgtPnZlcmJvc2UpOworCQlpZiAoZmQgPCAwKQorCQkJY29udGludWU7CisKKwkJY3R4LT5zZWNfZG9uZVtpXSAgID0gdHJ1ZTsKKwkJY3R4LT5zZWNfZG9uZVtpZHhdID0gdHJ1ZTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGZkOworfQorCitzdGF0aWMgaW50IGJwZl9mZXRjaF9wcm9nX3NlYyhzdHJ1Y3QgYnBmX2VsZl9jdHggKmN0eCwgY29uc3QgY2hhciAqc2VjdGlvbikKK3sKKwlpbnQgcmV0ID0gLTE7CisKKwlpZiAoY3R4LT5zeW1fdGFiKQorCQlyZXQgPSBicGZfZmV0Y2hfcHJvZ19yZWxvKGN0eCwgc2VjdGlvbik7CisJaWYgKHJldCA8IDApCisJCXJldCA9IGJwZl9mZXRjaF9wcm9nKGN0eCwgc2VjdGlvbik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGJwZl9maW5kX21hcF9ieV9pZChzdHJ1Y3QgYnBmX2VsZl9jdHggKmN0eCwgdWludDMyX3QgaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjdHgtPm1hcF9mZHMpOyBpKyspCisJCWlmIChjdHgtPm1hcF9mZHNbaV0gJiYgY3R4LT5tYXBzW2ldLmlkID09IGlkICYmCisJCSAgICBjdHgtPm1hcHNbaV0udHlwZSA9PSBCUEZfTUFQX1RZUEVfUFJPR19BUlJBWSkKKwkJCXJldHVybiBpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBicGZfZmlsbF9wcm9nX2FycmF5cyhzdHJ1Y3QgYnBmX2VsZl9jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgYnBmX2VsZl9zZWNfZGF0YSBkYXRhOworCXVpbnQzMl90IG1hcF9pZCwga2V5X2lkOworCWludCBmZCwgaSwgcmV0LCBpZHg7CisKKwlmb3IgKGkgPSAxOyBpIDwgY3R4LT5lbGZfaGRyLmVfc2hudW07IGkrKykgeworCQlpZiAoY3R4LT5zZWNfZG9uZVtpXSkKKwkJCWNvbnRpbnVlOworCisJCXJldCA9IGJwZl9maWxsX3NlY3Rpb25fZGF0YShjdHgsIGksICZkYXRhKTsKKwkJaWYgKHJldCA8IDApCisJCQljb250aW51ZTsKKworCQlyZXQgPSBzc2NhbmYoZGF0YS5zZWNfbmFtZSwgIiVpLyVpIiwgJm1hcF9pZCwgJmtleV9pZCk7CisJCWlmIChyZXQgIT0gMikKKwkJCWNvbnRpbnVlOworCisJCWlkeCA9IGJwZl9maW5kX21hcF9ieV9pZChjdHgsIG1hcF9pZCk7CisJCWlmIChpZHggPCAwKQorCQkJY29udGludWU7CisKKwkJZmQgPSBicGZfZmV0Y2hfcHJvZ19zZWMoY3R4LCBkYXRhLnNlY19uYW1lKTsKKwkJaWYgKGZkIDwgMCkKKwkJCXJldHVybiAtRUlPOworCisJCXJldCA9IGJwZl9tYXBfdXBkYXRlKGN0eC0+bWFwX2Zkc1tpZHhdLCAma2V5X2lkLAorCQkJCSAgICAgJmZkLCBCUEZfQU5ZKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gLUVOT0VOVDsKKworCQljdHgtPnNlY19kb25lW2ldID0gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYnBmX3NhdmVfZmluZm8oc3RydWN0IGJwZl9lbGZfY3R4ICpjdHgpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJaW50IHJldDsKKworCW1lbXNldCgmY3R4LT5zdGF0LCAwLCBzaXplb2YoY3R4LT5zdGF0KSk7CisKKwlyZXQgPSBmc3RhdChjdHgtPm9ial9mZCwgJnN0KTsKKwlpZiAocmV0IDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlN0YXQgb2YgZWxmIGZpbGUgZmFpbGVkOiAlc1xuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybjsKKwl9CisKKwljdHgtPnN0YXQuc3RfZGV2ID0gc3Quc3RfZGV2OworCWN0eC0+c3RhdC5zdF9pbm8gPSBzdC5zdF9pbm87Cit9CisKK3N0YXRpYyBpbnQgYnBmX3JlYWRfcGluX21hcHBpbmcoRklMRSAqZnAsIHVpbnQzMl90ICppZCwgY2hhciAqcGF0aCkKK3sKKwljaGFyIGJ1ZmZbUEFUSF9NQVhdOworCisJd2hpbGUgKGZnZXRzKGJ1ZmYsIHNpemVvZihidWZmKSwgZnApKSB7CisJCWNoYXIgKnB0ciA9IGJ1ZmY7CisKKwkJd2hpbGUgKCpwdHIgPT0gJyAnIHx8ICpwdHIgPT0gJ1x0JykKKwkJCXB0cisrOworCisJCWlmICgqcHRyID09ICcjJyB8fCAqcHRyID09ICdcbicgfHwgKnB0ciA9PSAwKQorCQkJY29udGludWU7CisKKwkJaWYgKHNzY2FuZihwdHIsICIlaSAlc1xuIiwgaWQsIHBhdGgpICE9IDIgJiYKKwkJICAgIHNzY2FuZihwdHIsICIlaSAlcyAjIiwgaWQsIHBhdGgpICE9IDIpIHsKKwkJCXN0cmNweShwYXRoLCBwdHIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sIGJwZl9waW5uaW5nX3Jlc2VydmVkKHVpbnQzMl90IHBpbm5pbmcpCit7CisJc3dpdGNoIChwaW5uaW5nKSB7CisJY2FzZSBQSU5fTk9ORToKKwljYXNlIFBJTl9PQkpFQ1RfTlM6CisJY2FzZSBQSU5fR0xPQkFMX05TOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitzdGF0aWMgdm9pZCBicGZfaGFzaF9pbml0KHN0cnVjdCBicGZfZWxmX2N0eCAqY3R4LCBjb25zdCBjaGFyICpkYl9maWxlKQoreworCXN0cnVjdCBicGZfaGFzaF9lbnRyeSAqZW50cnk7CisJY2hhciBzdWJwYXRoW1BBVEhfTUFYXTsKKwl1aW50MzJfdCBwaW5uaW5nOworCUZJTEUgKmZwOworCWludCByZXQ7CisKKwlmcCA9IGZvcGVuKGRiX2ZpbGUsICJyIik7CisJaWYgKCFmcCkKKwkJcmV0dXJuOworCisJbWVtc2V0KHN1YnBhdGgsIDAsIHNpemVvZihzdWJwYXRoKSk7CisJd2hpbGUgKChyZXQgPSBicGZfcmVhZF9waW5fbWFwcGluZyhmcCwgJnBpbm5pbmcsIHN1YnBhdGgpKSkgeworCQlpZiAocmV0ID09IC0xKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkRhdGFiYXNlICVzIGlzIGNvcnJ1cHRlZCBhdDogJXNcbiIsCisJCQkJZGJfZmlsZSwgc3VicGF0aCk7CisJCQlmY2xvc2UoZnApOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKGJwZl9waW5uaW5nX3Jlc2VydmVkKHBpbm5pbmcpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkRhdGFiYXNlICVzLCBpZCAldSBpcyByZXNlcnZlZCAtICIKKwkJCQkiaWdub3JpbmchXG4iLCBkYl9maWxlLCBwaW5uaW5nKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZW50cnkgPSBtYWxsb2Moc2l6ZW9mKCplbnRyeSkpOworCQlpZiAoIWVudHJ5KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIk5vIG1lbW9yeSBsZWZ0IGZvciBkYiBlbnRyeSFcbiIpOworCQkJY29udGludWU7CisJCX0KKworCQllbnRyeS0+cGlubmluZyA9IHBpbm5pbmc7CisJCWVudHJ5LT5zdWJwYXRoID0gc3RyZHVwKHN1YnBhdGgpOworCQlpZiAoIWVudHJ5LT5zdWJwYXRoKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIk5vIG1lbW9yeSBsZWZ0IGZvciBkYiBlbnRyeSFcbiIpOworCQkJZnJlZShlbnRyeSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWVudHJ5LT5uZXh0ID0gY3R4LT5odFtwaW5uaW5nICYgKEFSUkFZX1NJWkUoY3R4LT5odCkgLSAxKV07CisJCWN0eC0+aHRbcGlubmluZyAmIChBUlJBWV9TSVpFKGN0eC0+aHQpIC0gMSldID0gZW50cnk7CisJfQorCisJZmNsb3NlKGZwKTsKK30KKworc3RhdGljIHZvaWQgYnBmX2hhc2hfZGVzdHJveShzdHJ1Y3QgYnBmX2VsZl9jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgYnBmX2hhc2hfZW50cnkgKmVudHJ5OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3R4LT5odCk7IGkrKykgeworCQl3aGlsZSAoKGVudHJ5ID0gY3R4LT5odFtpXSkgIT0gTlVMTCkgeworCQkJY3R4LT5odFtpXSA9IGVudHJ5LT5uZXh0OworCQkJZnJlZSgoY2hhciAqKWVudHJ5LT5zdWJwYXRoKTsKKwkJCWZyZWUoZW50cnkpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGJwZl9lbGZfY2hlY2tfZWhkcihjb25zdCBzdHJ1Y3QgYnBmX2VsZl9jdHggKmN0eCkKK3sKKwlpZiAoY3R4LT5lbGZfaGRyLmVfdHlwZSAhPSBFVF9SRUwgfHwKKwkgICAgY3R4LT5lbGZfaGRyLmVfbWFjaGluZSAhPSAwIHx8CisJICAgIGN0eC0+ZWxmX2hkci5lX3ZlcnNpb24gIT0gRVZfQ1VSUkVOVCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkVMRiBmb3JtYXQgZXJyb3IsIEVMRiBmaWxlIG5vdCBmb3IgZUJQRj9cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGN0eC0+ZWxmX2hkci5lX2lkZW50W0VJX0RBVEFdKSB7CisJZGVmYXVsdDoKKwkJZnByaW50ZihzdGRlcnIsICJFTEYgZm9ybWF0IGVycm9yLCB3cm9uZyBlbmRpYW5uZXNzIGluZm8/XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBFTEZEQVRBMkxTQjoKKwkJaWYgKGh0b25zKDEpID09IDEpIHsKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJXZSBhcmUgYmlnIGVuZGlhbiwgZUJQRiBvYmplY3QgaXMgbGl0dGxlIGVuZGlhbiFcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFTEZEQVRBMk1TQjoKKwkJaWYgKGh0b25zKDEpICE9IDEpIHsKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJXZSBhcmUgbGl0dGxlIGVuZGlhbiwgZUJQRiBvYmplY3QgaXMgYmlnIGVuZGlhbiFcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnBmX2VsZl9jdHhfaW5pdChzdHJ1Y3QgYnBmX2VsZl9jdHggKmN0eCwgY29uc3QgY2hhciAqcGF0aG5hbWUsCisJCQkgICAgZW51bSBicGZfcHJvZ190eXBlIHR5cGUsIGJvb2wgdmVyYm9zZSkKK3sKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCWlmIChlbGZfdmVyc2lvbihFVl9DVVJSRU5UKSA9PSBFVl9OT05FIHx8CisJICAgIGJwZl9pbml0X2VudihwYXRobmFtZSkpCisJCXJldHVybiByZXQ7CisKKwltZW1zZXQoY3R4LCAwLCBzaXplb2YoKmN0eCkpOworCWN0eC0+dmVyYm9zZSA9IHZlcmJvc2U7CisJY3R4LT50eXBlICAgID0gdHlwZTsKKworCWN0eC0+b2JqX2ZkID0gb3BlbihwYXRobmFtZSwgT19SRE9OTFkpOworCWlmIChjdHgtPm9ial9mZCA8IDApCisJCXJldHVybiBjdHgtPm9ial9mZDsKKworCWN0eC0+ZWxmX2ZkID0gZWxmX2JlZ2luKGN0eC0+b2JqX2ZkLCBFTEZfQ19SRUFELCBOVUxMKTsKKwlpZiAoIWN0eC0+ZWxmX2ZkKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2ZkOworCX0KKworCWlmIChlbGZfa2luZChjdHgtPmVsZl9mZCkgIT0gRUxGX0tfRUxGKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2ZkOworCX0KKworCWlmIChnZWxmX2dldGVoZHIoY3R4LT5lbGZfZmQsICZjdHgtPmVsZl9oZHIpICE9CisJICAgICZjdHgtPmVsZl9oZHIpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXRfZWxmOworCX0KKworCXJldCA9IGJwZl9lbGZfY2hlY2tfZWhkcihjdHgpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dF9lbGY7CisKKwljdHgtPnNlY19kb25lID0gY2FsbG9jKGN0eC0+ZWxmX2hkci5lX3NobnVtLAorCQkJICAgICAgIHNpemVvZigqKGN0eC0+c2VjX2RvbmUpKSk7CisJaWYgKCFjdHgtPnNlY19kb25lKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2VsZjsKKwl9CisKKwlicGZfc2F2ZV9maW5mbyhjdHgpOworCWJwZl9oYXNoX2luaXQoY3R4LCBDT05GRElSICIvYnBmX3Bpbm5pbmciKTsKKworCXJldHVybiAwOworb3V0X2VsZjoKKwllbGZfZW5kKGN0eC0+ZWxmX2ZkKTsKK291dF9mZDoKKwljbG9zZShjdHgtPm9ial9mZCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBicGZfbWFwc19jb3VudChzdHJ1Y3QgYnBmX2VsZl9jdHggKmN0eCkKK3sKKwlpbnQgaSwgY291bnQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3R4LT5tYXBfZmRzKTsgaSsrKSB7CisJCWlmICghY3R4LT5tYXBfZmRzW2ldKQorCQkJYnJlYWs7CisJCWNvdW50Kys7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgdm9pZCBicGZfbWFwc190ZWFyZG93bihzdHJ1Y3QgYnBmX2VsZl9jdHggKmN0eCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGN0eC0+bWFwX2Zkcyk7IGkrKykgeworCQlpZiAoY3R4LT5tYXBfZmRzW2ldKQorCQkJY2xvc2UoY3R4LT5tYXBfZmRzW2ldKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJwZl9lbGZfY3R4X2Rlc3Ryb3koc3RydWN0IGJwZl9lbGZfY3R4ICpjdHgsIGJvb2wgZmFpbHVyZSkKK3sKKwlpZiAoZmFpbHVyZSkKKwkJYnBmX21hcHNfdGVhcmRvd24oY3R4KTsKKworCWJwZl9oYXNoX2Rlc3Ryb3koY3R4KTsKKwlmcmVlKGN0eC0+c2VjX2RvbmUpOworCWVsZl9lbmQoY3R4LT5lbGZfZmQpOworCWNsb3NlKGN0eC0+b2JqX2ZkKTsKK30KKworc3RhdGljIHN0cnVjdCBicGZfZWxmX2N0eCBfX2N0eDsKKworc3RhdGljIGludCBicGZfb2JqX29wZW4oY29uc3QgY2hhciAqcGF0aG5hbWUsIGVudW0gYnBmX3Byb2dfdHlwZSB0eXBlLAorCQkJY29uc3QgY2hhciAqc2VjdGlvbiwgYm9vbCB2ZXJib3NlKQoreworCXN0cnVjdCBicGZfZWxmX2N0eCAqY3R4ID0gJl9fY3R4OworCWludCBmZCA9IDAsIHJldDsKKworCXJldCA9IGJwZl9lbGZfY3R4X2luaXQoY3R4LCBwYXRobmFtZSwgdHlwZSwgdmVyYm9zZSk7CisJaWYgKHJldCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDYW5ub3QgaW5pdGlhbGl6ZSBFTEYgY29udGV4dCFcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGJwZl9mZXRjaF9hbmNpbGxhcnkoY3R4KTsKKwlpZiAocmV0IDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGZldGNoaW5nIEVMRiBhbmNpbGxhcnkgZGF0YSFcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlmZCA9IGJwZl9mZXRjaF9wcm9nX3NlYyhjdHgsIHNlY3Rpb24pOworCWlmIChmZCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJFcnJvciBmZXRjaGluZyBwcm9ncmFtL21hcCFcbiIpOworCQlyZXQgPSBmZDsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gYnBmX2ZpbGxfcHJvZ19hcnJheXMoY3R4KTsKKwlpZiAocmV0IDwgMCkKKwkJZnByaW50ZihzdGRlcnIsICJFcnJvciBmaWxsaW5nIHByb2dyYW0gYXJyYXlzIVxuIik7CitvdXQ6CisJYnBmX2VsZl9jdHhfZGVzdHJveShjdHgsIHJldCA8IDApOworCWlmIChyZXQgPCAwKSB7CisJCWlmIChmZCkKKwkJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gZmQ7Cit9CisKK3N0YXRpYyBpbnQKK2JwZl9tYXBfc2V0X3NlbmQoaW50IGZkLCBzdHJ1Y3Qgc29ja2FkZHJfdW4gKmFkZHIsIHVuc2lnbmVkIGludCBhZGRyX2xlbiwKKwkJIGNvbnN0IHN0cnVjdCBicGZfbWFwX2RhdGEgKmF1eCwgdW5zaWduZWQgaW50IGVudHJpZXMpCit7CisJc3RydWN0IGJwZl9tYXBfc2V0X21zZyBtc2c7CisJaW50ICpjbXNnX2J1ZiwgbWluX2ZkOworCWNoYXIgKmFtc2dfYnVmOworCWludCBpOworCisJbWVtc2V0KCZtc2csIDAsIHNpemVvZihtc2cpKTsKKworCW1zZy5hdXgudWRzX3ZlciA9IEJQRl9TQ01fQVVYX1ZFUjsKKwltc2cuYXV4Lm51bV9lbnQgPSBlbnRyaWVzOworCisJc3RybmNweShtc2cuYXV4Lm9ial9uYW1lLCBhdXgtPm9iaiwgc2l6ZW9mKG1zZy5hdXgub2JqX25hbWUpKTsKKwltZW1jcHkoJm1zZy5hdXgub2JqX3N0LCBhdXgtPnN0LCBzaXplb2YobXNnLmF1eC5vYmpfc3QpKTsKKworCWNtc2dfYnVmID0gYnBmX21hcF9zZXRfaW5pdCgmbXNnLCBhZGRyLCBhZGRyX2xlbik7CisJYW1zZ19idWYgPSAoY2hhciAqKW1zZy5hdXguZW50OworCisJZm9yIChpID0gMDsgaSA8IGVudHJpZXM7IGkgKz0gbWluX2ZkKSB7CisJCWludCByZXQ7CisKKwkJbWluX2ZkID0gbWluKEJQRl9TQ01fTUFYX0ZEUyAqIDFVLCBlbnRyaWVzIC0gaSk7CisJCWJwZl9tYXBfc2V0X2luaXRfc2luZ2xlKCZtc2csIG1pbl9mZCk7CisKKwkJbWVtY3B5KGNtc2dfYnVmLCAmYXV4LT5mZHNbaV0sIHNpemVvZihhdXgtPmZkc1swXSkgKiBtaW5fZmQpOworCQltZW1jcHkoYW1zZ19idWYsICZhdXgtPmVudFtpXSwgc2l6ZW9mKGF1eC0+ZW50WzBdKSAqIG1pbl9mZCk7CisKKwkJcmV0ID0gc2VuZG1zZyhmZCwgJm1zZy5oZHIsIDApOworCQlpZiAocmV0IDw9IDApCisJCQlyZXR1cm4gcmV0ID8gOiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYnBmX21hcF9zZXRfcmVjdihpbnQgZmQsIGludCAqZmRzLCAgc3RydWN0IGJwZl9tYXBfYXV4ICphdXgsCisJCSB1bnNpZ25lZCBpbnQgZW50cmllcykKK3sKKwlzdHJ1Y3QgYnBmX21hcF9zZXRfbXNnIG1zZzsKKwlpbnQgKmNtc2dfYnVmLCBtaW5fZmQ7CisJY2hhciAqYW1zZ19idWYsICptbXNnX2J1ZjsKKwl1bnNpZ25lZCBpbnQgbmVlZGVkID0gMTsKKwlpbnQgaTsKKworCWNtc2dfYnVmID0gYnBmX21hcF9zZXRfaW5pdCgmbXNnLCBOVUxMLCAwKTsKKwlhbXNnX2J1ZiA9IChjaGFyICopbXNnLmF1eC5lbnQ7CisJbW1zZ19idWYgPSAoY2hhciAqKSZtc2cuYXV4OworCisJZm9yIChpID0gMDsgaSA8IG1pbihlbnRyaWVzLCBuZWVkZWQpOyBpICs9IG1pbl9mZCkgeworCQlzdHJ1Y3QgY21zZ2hkciAqY21zZzsKKwkJaW50IHJldDsKKworCQltaW5fZmQgPSBtaW4oZW50cmllcywgZW50cmllcyAtIGkpOworCQlicGZfbWFwX3NldF9pbml0X3NpbmdsZSgmbXNnLCBtaW5fZmQpOworCisJCXJldCA9IHJlY3Ztc2coZmQsICZtc2cuaGRyLCAwKTsKKwkJaWYgKHJldCA8PSAwKQorCQkJcmV0dXJuIHJldCA/IDogLTE7CisKKwkJY21zZyA9IENNU0dfRklSU1RIRFIoJm1zZy5oZHIpOworCQlpZiAoIWNtc2cgfHwgY21zZy0+Y21zZ190eXBlICE9IFNDTV9SSUdIVFMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKG1zZy5oZHIubXNnX2ZsYWdzICYgTVNHX0NUUlVOQykKKwkJCXJldHVybiAtRUlPOworCQlpZiAobXNnLmF1eC51ZHNfdmVyICE9IEJQRl9TQ01fQVVYX1ZFUikKKwkJCXJldHVybiAtRU5PU1lTOworCisJCW1pbl9mZCA9IChjbXNnLT5jbXNnX2xlbiAtIHNpemVvZigqY21zZykpIC8gc2l6ZW9mKGZkKTsKKwkJaWYgKG1pbl9mZCA+IGVudHJpZXMgfHwgbWluX2ZkIDw9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQltZW1jcHkoJmZkc1tpXSwgY21zZ19idWYsIHNpemVvZihmZHNbMF0pICogbWluX2ZkKTsKKwkJbWVtY3B5KCZhdXgtPmVudFtpXSwgYW1zZ19idWYsIHNpemVvZihhdXgtPmVudFswXSkgKiBtaW5fZmQpOworCQltZW1jcHkoYXV4LCBtbXNnX2J1Ziwgb2Zmc2V0b2Yoc3RydWN0IGJwZl9tYXBfYXV4LCBlbnQpKTsKKworCQluZWVkZWQgPSBhdXgtPm51bV9lbnQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBicGZfc2VuZF9tYXBfZmRzKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm9iaikKK3sKKwlzdHJ1Y3QgYnBmX2VsZl9jdHggKmN0eCA9ICZfX2N0eDsKKwlzdHJ1Y3Qgc29ja2FkZHJfdW4gYWRkcjsKKwlzdHJ1Y3QgYnBmX21hcF9kYXRhIGJwZl9hdXg7CisJaW50IGZkLCByZXQ7CisKKwlmZCA9IHNvY2tldChBRl9VTklYLCBTT0NLX0RHUkFNLCAwKTsKKwlpZiAoZmQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9wZW4gc29ja2V0OiAlc1xuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisJYWRkci5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKwlzdHJuY3B5KGFkZHIuc3VuX3BhdGgsIHBhdGgsIHNpemVvZihhZGRyLnN1bl9wYXRoKSk7CisKKwlyZXQgPSBjb25uZWN0KGZkLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSk7CisJaWYgKHJldCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDYW5ub3QgY29ubmVjdCB0byAlczogJXNcbiIsCisJCQlwYXRoLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCisJbWVtc2V0KCZicGZfYXV4LCAwLCBzaXplb2YoYnBmX2F1eCkpOworCisJYnBmX2F1eC5mZHMgPSBjdHgtPm1hcF9mZHM7CisJYnBmX2F1eC5lbnQgPSBjdHgtPm1hcHM7CisJYnBmX2F1eC5zdCAgPSAmY3R4LT5zdGF0OworCWJwZl9hdXgub2JqID0gb2JqOworCisJcmV0ID0gYnBmX21hcF9zZXRfc2VuZChmZCwgJmFkZHIsIHNpemVvZihhZGRyKSwgJmJwZl9hdXgsCisJCQkgICAgICAgYnBmX21hcHNfY291bnQoY3R4KSk7CisJaWYgKHJldCA8IDApCisJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IHNlbmQgZmRzIHRvICVzOiAlc1xuIiwKKwkJCXBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisKKwlicGZfbWFwc190ZWFyZG93bihjdHgpOworCWNsb3NlKGZkKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYnBmX3JlY3ZfbWFwX2Zkcyhjb25zdCBjaGFyICpwYXRoLCBpbnQgKmZkcywgc3RydWN0IGJwZl9tYXBfYXV4ICphdXgsCisJCSAgICAgdW5zaWduZWQgaW50IGVudHJpZXMpCit7CisJc3RydWN0IHNvY2thZGRyX3VuIGFkZHI7CisJaW50IGZkLCByZXQ7CisKKwlmZCA9IHNvY2tldChBRl9VTklYLCBTT0NLX0RHUkFNLCAwKTsKKwlpZiAoZmQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9wZW4gc29ja2V0OiAlc1xuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisJYWRkci5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKwlzdHJuY3B5KGFkZHIuc3VuX3BhdGgsIHBhdGgsIHNpemVvZihhZGRyLnN1bl9wYXRoKSk7CisKKwlyZXQgPSBiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSk7CisJaWYgKHJldCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDYW5ub3QgYmluZCB0byBzb2NrZXQ6ICVzXG4iLAorCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldCA9IGJwZl9tYXBfc2V0X3JlY3YoZmQsIGZkcywgYXV4LCBlbnRyaWVzKTsKKwlpZiAocmV0IDwgMCkKKwkJZnByaW50ZihzdGRlcnIsICJDYW5ub3QgcmVjdiBmZHMgZnJvbSAlczogJXNcbiIsCisJCQlwYXRoLCBzdHJlcnJvcihlcnJubykpOworCisJdW5saW5rKGFkZHIuc3VuX3BhdGgpOworCWNsb3NlKGZkKTsKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmIC8qIEhBVkVfRUxGICovCmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy90Y19icGYuaCBiL2lwcm91dGUyL3RjL3RjX2JwZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNmQwYjEKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy90Y19icGYuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogdGNfYnBmLmgJQlBGIGNvbW1vbiBjb2RlCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIGRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CURhbmllbCBCb3JrbWFubiA8ZGJvcmttYW5AcmVkaGF0LmNvbT4KKyAqCQlKaXJpIFBpcmtvIDxqaXJpQHJlc251bGxpLnVzPgorICovCisKKyNpZm5kZWYgX1RDX0JQRl9IXworI2RlZmluZSBfVENfQlBGX0hfIDEKKworI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9icGYuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJicGZfc2NtLmgiCisKK2VudW0geworCUJQRl9OTEFfT1BTX0xFTiA9IDAsCisJQlBGX05MQV9PUFMsCisJQlBGX05MQV9GRCwKKwlCUEZfTkxBX05BTUUsCisJX19CUEZfTkxBX01BWCwKK307CisKKyNkZWZpbmUgQlBGX05MQV9NQVgJX19CUEZfTkxBX01BWAorCisjZGVmaW5lIEJQRl9FTlZfVURTCSJUQ19CUEZfVURTIgorI2RlZmluZSBCUEZfRU5WX01OVAkiVENfQlBGX01OVCIKKyNkZWZpbmUgQlBGX0VOVl9OT0xPRwkiVENfQlBGX05PTE9HIgorCisjaWZuZGVmIEJQRl9GU19NQUdJQworIyBkZWZpbmUgQlBGX0ZTX01BR0lDCTB4Y2FmZTRhMTEKKyNlbmRpZgorCisjZGVmaW5lIEJQRl9ESVJfTU5UCSIvc3lzL2ZzL2JwZiIKKworI2RlZmluZSBCUEZfRElSX1RDCSJ0YyIKKyNkZWZpbmUgQlBGX0RJUl9HTE9CQUxTCSJnbG9iYWxzIgorCisjaWZuZGVmIFRSQUNFRlNfTUFHSUMKKyMgZGVmaW5lIFRSQUNFRlNfTUFHSUMJMHg3NDcyNjE2MworI2VuZGlmCisKKyNkZWZpbmUgVFJBQ0VfRElSX01OVAkiL3N5cy9rZXJuZWwvdHJhY2luZyIKKworaW50IGJwZl90cmFjZV9waXBlKHZvaWQpOworY29uc3QgY2hhciAqYnBmX2RlZmF1bHRfc2VjdGlvbihjb25zdCBlbnVtIGJwZl9wcm9nX3R5cGUgdHlwZSk7CisKK2ludCBicGZfcGFyc2VfY29tbW9uKGludCAqcHRyX2FyZ2MsIGNoYXIgKioqcHRyX2FyZ3YsIGNvbnN0IGludCAqbmxhX3RibCwKKwkJICAgICBlbnVtIGJwZl9wcm9nX3R5cGUgdHlwZSwgY29uc3QgY2hhciAqKnB0cl9vYmplY3QsCisJCSAgICAgY29uc3QgY2hhciAqKnB0cl91ZHNfbmFtZSwgc3RydWN0IG5sbXNnaGRyICpuKTsKK2ludCBicGZfZ3JhZnRfbWFwKGNvbnN0IGNoYXIgKm1hcF9wYXRoLCB1aW50MzJfdCAqa2V5LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCit2b2lkIGJwZl9wcmludF9vcHMoRklMRSAqZiwgc3RydWN0IHJ0YXR0ciAqYnBmX29wcywgX191MTYgbGVuKTsKKworI2lmZGVmIEhBVkVfRUxGCitpbnQgYnBmX3NlbmRfbWFwX2Zkcyhjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpvYmopOworaW50IGJwZl9yZWN2X21hcF9mZHMoY29uc3QgY2hhciAqcGF0aCwgaW50ICpmZHMsIHN0cnVjdCBicGZfbWFwX2F1eCAqYXV4LAorCQkgICAgIHVuc2lnbmVkIGludCBlbnRyaWVzKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBicGZfc2VuZF9tYXBfZmRzKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm9iaikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYnBmX3JlY3ZfbWFwX2Zkcyhjb25zdCBjaGFyICpwYXRoLCBpbnQgKmZkcywKKwkJCQkgICBzdHJ1Y3QgYnBmX21hcF9hdXggKmF1eCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgZW50cmllcykKK3sKKwlyZXR1cm4gLTE7Cit9CisjZW5kaWYgLyogSEFWRV9FTEYgKi8KKyNlbmRpZiAvKiBfVENfQlBGX0hfICovCmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy90Y19jYnEuYyBiL2lwcm91dGUyL3RjL3RjX2NicS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYjI2MmUKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy90Y19jYnEuYwpAQCAtMCwwICsxLDU3IEBACisvKgorICogdGNfY2JxLmMJCUNCUSBtYWludGFuYW5jZSByb3V0aW5lcy4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ0Y19jb3JlLmgiCisjaW5jbHVkZSAidGNfY2JxLmgiCisKK3Vuc2lnbmVkIHRjX2NicV9jYWxjX21heGlkbGUodW5zaWduZWQgYm5kdywgdW5zaWduZWQgcmF0ZSwgdW5zaWduZWQgYXZwa3QsCisJCQkgICAgIGludCBld21hX2xvZywgdW5zaWduZWQgbWF4YnVyc3QpCit7CisJZG91YmxlIG1heGlkbGU7CisJZG91YmxlIGcgPSAxLjAgLSAxLjAvKDE8PGV3bWFfbG9nKTsKKwlkb3VibGUgeG10ID0gKGRvdWJsZSlhdnBrdC9ibmR3OworCisJbWF4aWRsZSA9IHhtdCooMS1nKTsKKwlpZiAoYm5kdyAhPSByYXRlICYmIG1heGJ1cnN0KSB7CisJCWRvdWJsZSB2eG10ID0gKGRvdWJsZSlhdnBrdC9yYXRlIC0geG10OworCQl2eG10ICo9IChwb3coZywgLShkb3VibGUpbWF4YnVyc3QpIC0gMSk7CisJCWlmICh2eG10ID4gbWF4aWRsZSkKKwkJCW1heGlkbGUgPSB2eG10OworCX0KKwlyZXR1cm4gdGNfY29yZV90aW1lMnRpY2sobWF4aWRsZSooMTw8ZXdtYV9sb2cpKlRJTUVfVU5JVFNfUEVSX1NFQyk7Cit9CisKK3Vuc2lnbmVkIHRjX2NicV9jYWxjX29mZnRpbWUodW5zaWduZWQgYm5kdywgdW5zaWduZWQgcmF0ZSwgdW5zaWduZWQgYXZwa3QsCisJCQkgICAgIGludCBld21hX2xvZywgdW5zaWduZWQgbWluYnVyc3QpCit7CisJZG91YmxlIGcgPSAxLjAgLSAxLjAvKDE8PGV3bWFfbG9nKTsKKwlkb3VibGUgb2ZmdGltZSA9IChkb3VibGUpYXZwa3QvcmF0ZSAtIChkb3VibGUpYXZwa3QvYm5kdzsKKworCWlmIChtaW5idXJzdCA9PSAwKQorCQlyZXR1cm4gMDsKKwlpZiAobWluYnVyc3QgPT0gMSkKKwkJb2ZmdGltZSAqPSBwb3coZywgLShkb3VibGUpbWluYnVyc3QpIC0gMTsKKwllbHNlCisJCW9mZnRpbWUgKj0gMSArIChwb3coZywgLShkb3VibGUpKG1pbmJ1cnN0LTEpKSAtIDEpLygxLWcpOworCXJldHVybiB0Y19jb3JlX3RpbWUydGljayhvZmZ0aW1lKlRJTUVfVU5JVFNfUEVSX1NFQyk7Cit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy90Y19jYnEuaCBiL2lwcm91dGUyL3RjL3RjX2NicS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmOTU2NDkKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy90Y19jYnEuaApAQCAtMCwwICsxLDkgQEAKKyNpZm5kZWYgX1RDX0NCUV9IXworI2RlZmluZSBfVENfQ0JRX0hfIDEKKwordW5zaWduZWQgdGNfY2JxX2NhbGNfbWF4aWRsZSh1bnNpZ25lZCBibmR3LCB1bnNpZ25lZCByYXRlLCB1bnNpZ25lZCBhdnBrdCwKKwkJCSAgICAgaW50IGV3bWFfbG9nLCB1bnNpZ25lZCBtYXhidXJzdCk7Cit1bnNpZ25lZCB0Y19jYnFfY2FsY19vZmZ0aW1lKHVuc2lnbmVkIGJuZHcsIHVuc2lnbmVkIHJhdGUsIHVuc2lnbmVkIGF2cGt0LAorCQkJICAgICBpbnQgZXdtYV9sb2csIHVuc2lnbmVkIG1pbmJ1cnN0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy90Y19jbGFzcy5jIGIvaXByb3V0ZTIvdGMvdGNfY2xhc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWNkMDMwCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGMvdGNfY2xhc3MuYwpAQCAtMCwwICsxLDUwMCBAQAorLyoKKyAqIHRjX2NsYXNzLmMJCSJ0YyBjbGFzcyIuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0Y191dGlsLmgiCisjaW5jbHVkZSAidGNfY29tbW9uLmgiCisjaW5jbHVkZSAiaGxpc3QuaCIKKworc3RydWN0IGdyYXBoX25vZGUgeworCXN0cnVjdCBobGlzdF9ub2RlIGhsaXN0OworCV9fdTMyIGlkOworCV9fdTMyIHBhcmVudF9pZDsKKwlzdHJ1Y3QgZ3JhcGhfbm9kZSAqcGFyZW50X25vZGU7CisJc3RydWN0IGdyYXBoX25vZGUgKnJpZ2h0X25vZGU7CisJdm9pZCAqZGF0YTsKKwlpbnQgZGF0YV9sZW47CisJaW50IG5vZGVzX2NvdW50OworfTsKKworc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkIGNsc19saXN0ID0ge307CitzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQgcm9vdF9jbHNfbGlzdCA9IHt9OworCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKTsKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiB0YyBjbGFzcyBbIGFkZCB8IGRlbCB8IGNoYW5nZSB8IHJlcGxhY2UgfCBzaG93IF0gZGV2IFNUUklOR1xuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgWyBjbGFzc2lkIENMQVNTSUQgXSBbIHJvb3QgfCBwYXJlbnQgQ0xBU1NJRCBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBbIFsgUURJU0NfS0lORCBdIFsgaGVscCB8IE9QVElPTlMgXSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgdGMgY2xhc3Mgc2hvdyBbIGRldiBTVFJJTkcgXSBbIHJvb3QgfCBwYXJlbnQgQ0xBU1NJRCBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIldoZXJlOlxuIik7CisJZnByaW50ZihzdGRlcnIsICJRRElTQ19LSU5EIDo9IHsgcHJpbyB8IGNicSB8IGV0Yy4gfVxuIik7CisJZnByaW50ZihzdGRlcnIsICJPUFRJT05TIDo9IC4uLiB0cnkgdGMgY2xhc3MgYWRkIDxkZXNpcmVkIFFESVNDX0tJTkQ+IGhlbHBcbiIpOworCXJldHVybjsKK30KKworc3RhdGljIGludCB0Y19jbGFzc19tb2RpZnkoaW50IGNtZCwgdW5zaWduZWQgZmxhZ3MsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgbmxtc2doZHIgCW47CisJCXN0cnVjdCB0Y21zZyAJCXQ7CisJCWNoYXIgICAJCQlidWZbNDA5Nl07CisJfSByZXE7CisJc3RydWN0IHFkaXNjX3V0aWwgKnEgPSBOVUxMOworCXN0cnVjdCB0Y19lc3RpbWF0b3IgZXN0OworCWNoYXIgIGRbMTZdOworCWNoYXIgIGtbMTZdOworCisJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKwltZW1zZXQoJmVzdCwgMCwgc2l6ZW9mKGVzdCkpOworCW1lbXNldChkLCAwLCBzaXplb2YoZCkpOworCW1lbXNldChrLCAwLCBzaXplb2YoaykpOworCisJcmVxLm4ubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgdGNtc2cpKTsKKwlyZXEubi5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1R8ZmxhZ3M7CisJcmVxLm4ubmxtc2dfdHlwZSA9IGNtZDsKKwlyZXEudC50Y21fZmFtaWx5ID0gQUZfVU5TUEVDOworCisJd2hpbGUgKGFyZ2MgPiAwKSB7CisJCWlmIChzdHJjbXAoKmFyZ3YsICJkZXYiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGRbMF0pCisJCQkJZHVwYXJnKCJkZXYiLCAqYXJndik7CisJCQlzdHJuY3B5KGQsICphcmd2LCBzaXplb2YoZCktMSk7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiY2xhc3NpZCIpID09IDApIHsKKwkJCV9fdTMyIGhhbmRsZTsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocmVxLnQudGNtX2hhbmRsZSkKKwkJCQlkdXBhcmcoImNsYXNzaWQiLCAqYXJndik7CisJCQlpZiAoZ2V0X3RjX2NsYXNzaWQoJmhhbmRsZSwgKmFyZ3YpKQorCQkJCWludmFyZygiaW52YWxpZCBjbGFzcyBJRCIsICphcmd2KTsKKwkJCXJlcS50LnRjbV9oYW5kbGUgPSBoYW5kbGU7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaGFuZGxlIikgPT0gMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJFcnJvcjogdHJ5IFwiY2xhc3NpZFwiIGluc3RlYWQgb2YgXCJoYW5kbGVcIlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAicm9vdCIpID09IDApIHsKKwkJCWlmIChyZXEudC50Y21fcGFyZW50KSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJFcnJvcjogXCJyb290XCIgaXMgZHVwbGljYXRlIHBhcmVudCBJRC5cbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXJlcS50LnRjbV9wYXJlbnQgPSBUQ19IX1JPT1Q7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAicGFyZW50IikgPT0gMCkgeworCQkJX191MzIgaGFuZGxlOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChyZXEudC50Y21fcGFyZW50KQorCQkJCWR1cGFyZygicGFyZW50IiwgKmFyZ3YpOworCQkJaWYgKGdldF90Y19jbGFzc2lkKCZoYW5kbGUsICphcmd2KSkKKwkJCQlpbnZhcmcoImludmFsaWQgcGFyZW50IElEIiwgKmFyZ3YpOworCQkJcmVxLnQudGNtX3BhcmVudCA9IGhhbmRsZTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiZXN0aW1hdG9yIikgPT0gMCkgeworCQkJaWYgKHBhcnNlX2VzdGltYXRvcigmYXJnYywgJmFyZ3YsICZlc3QpKQorCQkJCXJldHVybiAtMTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiaGVscCIpID09IDApIHsKKwkJCXVzYWdlKCk7CisJCX0gZWxzZSB7CisJCQlzdHJuY3B5KGssICphcmd2LCBzaXplb2YoayktMSk7CisKKwkJCXEgPSBnZXRfcWRpc2Nfa2luZChrKTsKKwkJCWFyZ2MtLTsgYXJndisrOworCQkJYnJlYWs7CisJCX0KKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJaWYgKGtbMF0pCisJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBUQ0FfS0lORCwgaywgc3RybGVuKGspKzEpOworCWlmIChlc3QuZXdtYV9sb2cpCisJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBUQ0FfUkFURSwgJmVzdCwgc2l6ZW9mKGVzdCkpOworCisJaWYgKHEpIHsKKwkJaWYgKHEtPnBhcnNlX2NvcHQgPT0gTlVMTCkgeworCQkJZnByaW50ZihzdGRlcnIsICJFcnJvcjogUWRpc2MgXCIlc1wiIGlzIGNsYXNzbGVzcy5cbiIsIGspOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKHEtPnBhcnNlX2NvcHQocSwgYXJnYywgYXJndiwgJnJlcS5uKSkKKwkJCXJldHVybiAxOworCX0gZWxzZSB7CisJCWlmIChhcmdjKSB7CisJCQlpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKQorCQkJCXVzYWdlKCk7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkdhcmJhZ2UgaW5zdGVhZCBvZiBhcmd1bWVudHMgXCIlcyAuLi5cIi4gVHJ5IFwidGMgY2xhc3MgaGVscFwiLiIsICphcmd2KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWlmIChkWzBdKSAgeworCQlsbF9pbml0X21hcCgmcnRoKTsKKworCQlpZiAoKHJlcS50LnRjbV9pZmluZGV4ID0gbGxfbmFtZV90b19pbmRleChkKSkgPT0gMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJDYW5ub3QgZmluZCBkZXZpY2UgXCIlc1wiXG4iLCBkKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJaWYgKHJ0bmxfdGFsaygmcnRoLCAmcmVxLm4sIE5VTEwsIDApIDwgMCkKKwkJcmV0dXJuIDI7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGZpbHRlcl9pZmluZGV4OworX191MzIgZmlsdGVyX3FkaXNjOworX191MzIgZmlsdGVyX2NsYXNzaWQ7CisKK3N0YXRpYyB2b2lkIGdyYXBoX25vZGVfYWRkKF9fdTMyIHBhcmVudF9pZCwgX191MzIgaWQsIHZvaWQgKmRhdGEsCisJCWludCBsZW4pCit7CisJc3RydWN0IGdyYXBoX25vZGUgKm5vZGUgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBncmFwaF9ub2RlKSk7CisKKwltZW1zZXQobm9kZSwgMCwgc2l6ZW9mKCpub2RlKSk7CisJbm9kZS0+aWQgICAgICAgICA9IGlkOworCW5vZGUtPnBhcmVudF9pZCAgPSBwYXJlbnRfaWQ7CisKKwlpZiAoZGF0YSAmJiBsZW4pIHsKKwkJbm9kZS0+ZGF0YSAgICAgICA9IG1hbGxvYyhsZW4pOworCQlub2RlLT5kYXRhX2xlbiAgID0gbGVuOworCQltZW1jcHkobm9kZS0+ZGF0YSwgZGF0YSwgbGVuKTsKKwl9CisKKwlpZiAocGFyZW50X2lkID09IFRDX0hfUk9PVCkKKwkJaGxpc3RfYWRkX2hlYWQoJm5vZGUtPmhsaXN0LCAmcm9vdF9jbHNfbGlzdCk7CisJZWxzZQorCQlobGlzdF9hZGRfaGVhZCgmbm9kZS0+aGxpc3QsICZjbHNfbGlzdCk7Cit9CisKK3N0YXRpYyB2b2lkIGdyYXBoX2luZGVudChjaGFyICpidWYsIHN0cnVjdCBncmFwaF9ub2RlICpub2RlLCBpbnQgaXNfbmV3bGluZSwKKwkJaW50IGFkZF9zcGFjZXMpCit7CisJY2hhciBzcGFjZXNbMTAwXSA9IHswfTsKKworCXdoaWxlIChub2RlICYmIG5vZGUtPnBhcmVudF9ub2RlKSB7CisJCW5vZGUtPnBhcmVudF9ub2RlLT5yaWdodF9ub2RlID0gbm9kZTsKKwkJbm9kZSA9IG5vZGUtPnBhcmVudF9ub2RlOworCX0KKwl3aGlsZSAobm9kZSAmJiBub2RlLT5yaWdodF9ub2RlKSB7CisJCWlmIChub2RlLT5obGlzdC5uZXh0KQorCQkJc3RyY2F0KGJ1ZiwgInwgICAgIik7CisJCWVsc2UKKwkJCXN0cmNhdChidWYsICIgICAgICIpOworCisJCW5vZGUgPSBub2RlLT5yaWdodF9ub2RlOworCX0KKworCWlmIChpc19uZXdsaW5lKSB7CisJCWlmIChub2RlLT5obGlzdC5uZXh0ICYmIG5vZGUtPm5vZGVzX2NvdW50KQorCQkJc3RyY2F0KGJ1ZiwgInwgICAgfCIpOworCQllbHNlIGlmIChub2RlLT5obGlzdC5uZXh0KQorCQkJc3RyY2F0KGJ1ZiwgInwgICAgICIpOworCQllbHNlIGlmIChub2RlLT5ub2Rlc19jb3VudCkKKwkJCXN0cmNhdChidWYsICIgICAgIHwiKTsKKwkJZWxzZSBpZiAoIW5vZGUtPmhsaXN0Lm5leHQpCisJCQlzdHJjYXQoYnVmLCAiICAgICAgIik7CisJfQorCWlmIChhZGRfc3BhY2VzID4gMCkgeworCQlzcHJpbnRmKHNwYWNlcywgIiUtKnMiLCBhZGRfc3BhY2VzLCAiIik7CisJCXN0cmNhdChidWYsIHNwYWNlcyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBncmFwaF9jbHNfc2hvdyhGSUxFICpmcCwgY2hhciAqYnVmLCBzdHJ1Y3QgaGxpc3RfaGVhZCAqcm9vdF9saXN0LAorCQlpbnQgbGV2ZWwpCit7CisJc3RydWN0IGhsaXN0X25vZGUgKm4sICp0bXBfY2xzOworCWNoYXIgY2xzX2lkX3N0clsyNTZdID0ge307CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX01BWCArIDFdID0ge307CisJc3RydWN0IHFkaXNjX3V0aWwgKnE7CisJY2hhciBzdHJbMTAwXSA9IHt9OworCisJaGxpc3RfZm9yX2VhY2hfc2FmZShuLCB0bXBfY2xzLCByb290X2xpc3QpIHsKKwkJc3RydWN0IGhsaXN0X25vZGUgKmMsICp0bXBfY2hsZDsKKwkJc3RydWN0IGhsaXN0X2hlYWQgY2hpbGRyZW4gPSB7fTsKKwkJc3RydWN0IGdyYXBoX25vZGUgKmNscyA9IGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgZ3JhcGhfbm9kZSwKKwkJCQlobGlzdCk7CisKKwkJaGxpc3RfZm9yX2VhY2hfc2FmZShjLCB0bXBfY2hsZCwgJmNsc19saXN0KSB7CisJCQlzdHJ1Y3QgZ3JhcGhfbm9kZSAqY2hpbGQgPSBjb250YWluZXJfb2YoYywKKwkJCQkJc3RydWN0IGdyYXBoX25vZGUsIGhsaXN0KTsKKworCQkJaWYgKGNscy0+aWQgPT0gY2hpbGQtPnBhcmVudF9pZCkgeworCQkJCWhsaXN0X2RlbChjKTsKKwkJCQlobGlzdF9hZGRfaGVhZChjLCAmY2hpbGRyZW4pOworCQkJCWNscy0+bm9kZXNfY291bnQrKzsKKwkJCQljaGlsZC0+cGFyZW50X25vZGUgPSBjbHM7CisJCQl9CisJCX0KKworCQlncmFwaF9pbmRlbnQoYnVmLCBjbHMsIDAsIDApOworCisJCXByaW50X3RjX2NsYXNzaWQoY2xzX2lkX3N0ciwgc2l6ZW9mKGNsc19pZF9zdHIpLCBjbHMtPmlkKTsKKwkJc3ByaW50ZihzdHIsICIrLS0tKCVzKSIsIGNsc19pZF9zdHIpOworCQlzdHJjYXQoYnVmLCBzdHIpOworCisJCXBhcnNlX3J0YXR0cih0YiwgVENBX01BWCwgKHN0cnVjdCBydGF0dHIgKiljbHMtPmRhdGEsCisJCQkJY2xzLT5kYXRhX2xlbik7CisKKwkJaWYgKHRiW1RDQV9LSU5EXSA9PSBOVUxMKSB7CisJCQlzdHJjYXQoYnVmLCAiIFt1bmtub3duIHFkaXNjIGtpbmRdICIpOworCQl9IGVsc2UgeworCQkJY29uc3QgY2hhciAqa2luZCA9IHJ0YV9nZXRhdHRyX3N0cih0YltUQ0FfS0lORF0pOworCisJCQlzcHJpbnRmKHN0ciwgIiAlcyAiLCBraW5kKTsKKwkJCXN0cmNhdChidWYsIHN0cik7CisJCQlmcHJpbnRmKGZwLCAiJXMiLCBidWYpOworCQkJYnVmWzBdID0gJ1wwJzsKKworCQkJcSA9IGdldF9xZGlzY19raW5kKGtpbmQpOworCQkJaWYgKHEgJiYgcS0+cHJpbnRfY29wdCkgeworCQkJCXEtPnByaW50X2NvcHQocSwgZnAsIHRiW1RDQV9PUFRJT05TXSk7CisJCQl9CisJCQlpZiAocSAmJiBzaG93X3N0YXRzKSB7CisJCQkJaW50IGNsc19pbmRlbnQgPSBzdHJsZW4ocS0+aWQpIC0gMiArCisJCQkJCXN0cmxlbihjbHNfaWRfc3RyKTsKKwkJCQlzdHJ1Y3QgcnRhdHRyICpzdGF0cyA9IE5VTEw7CisKKwkJCQlncmFwaF9pbmRlbnQoYnVmLCBjbHMsIDEsIGNsc19pbmRlbnQpOworCisJCQkJaWYgKHRiW1RDQV9TVEFUU10gfHwgdGJbVENBX1NUQVRTMl0pIHsKKwkJCQkJZnByaW50ZihmcCwgIlxuIik7CisJCQkJCXByaW50X3Rjc3RhdHNfYXR0cihmcCwgdGIsIGJ1ZiwgJnN0YXRzKTsKKwkJCQkJYnVmWzBdID0gJ1wwJzsKKwkJCQl9CisJCQkJaWYgKGNscy0+aGxpc3QubmV4dCB8fCBjbHMtPm5vZGVzX2NvdW50KSB7CisJCQkJCXN0cmNhdChidWYsICJcbiIpOworCQkJCQlncmFwaF9pbmRlbnQoYnVmLCBjbHMsIDEsIDApOworCQkJCX0KKwkJCX0KKwkJfQorCQlmcmVlKGNscy0+ZGF0YSk7CisJCWZwcmludGYoZnAsICIlc1xuIiwgYnVmKTsKKwkJYnVmWzBdID0gJ1wwJzsKKworCQlncmFwaF9jbHNfc2hvdyhmcCwgYnVmLCAmY2hpbGRyZW4sIGxldmVsICsgMSk7CisJCWlmICghY2xzLT5obGlzdC5uZXh0KSB7CisJCQlncmFwaF9pbmRlbnQoYnVmLCBjbHMsIDAsIDApOworCQkJc3RyY2F0KGJ1ZiwgIlxuIik7CisJCX0KKworCQlmcHJpbnRmKGZwLCAiJXMiLCBidWYpOworCQlidWZbMF0gPSAnXDAnOworCQlmcmVlKGNscyk7CisJfQorfQorCitpbnQgcHJpbnRfY2xhc3MoY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8sCisJCSAgICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZykKK3sKKwlGSUxFICpmcCA9IChGSUxFKilhcmc7CisJc3RydWN0IHRjbXNnICp0ID0gTkxNU0dfREFUQShuKTsKKwlpbnQgbGVuID0gbi0+bmxtc2dfbGVuOworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9NQVggKyAxXSA9IHt9OworCXN0cnVjdCBxZGlzY191dGlsICpxOworCWNoYXIgYWJ1ZlsyNTZdOworCisJaWYgKG4tPm5sbXNnX3R5cGUgIT0gUlRNX05FV1RDTEFTUyAmJiBuLT5ubG1zZ190eXBlICE9IFJUTV9ERUxUQ0xBU1MpIHsKKwkJZnByaW50ZihzdGRlcnIsICJOb3QgYSBjbGFzc1xuIik7CisJCXJldHVybiAwOworCX0KKwlsZW4gLT0gTkxNU0dfTEVOR1RIKHNpemVvZigqdCkpOworCWlmIChsZW4gPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiV3JvbmcgbGVuICVkXG4iLCBsZW4pOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHNob3dfZ3JhcGgpIHsKKwkJZ3JhcGhfbm9kZV9hZGQodC0+dGNtX3BhcmVudCwgdC0+dGNtX2hhbmRsZSwgVENBX1JUQSh0KSwgbGVuKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGZpbHRlcl9xZGlzYyAmJiBUQ19IX01BSih0LT50Y21faGFuZGxlXmZpbHRlcl9xZGlzYykpCisJCXJldHVybiAwOworCisJaWYgKGZpbHRlcl9jbGFzc2lkICYmIHQtPnRjbV9oYW5kbGUgIT0gZmlsdGVyX2NsYXNzaWQpCisJCXJldHVybiAwOworCisJcGFyc2VfcnRhdHRyKHRiLCBUQ0FfTUFYLCBUQ0FfUlRBKHQpLCBsZW4pOworCisJaWYgKHRiW1RDQV9LSU5EXSA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAicHJpbnRfY2xhc3M6IE5VTEwga2luZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAobi0+bmxtc2dfdHlwZSA9PSBSVE1fREVMVENMQVNTKQorCQlmcHJpbnRmKGZwLCAiZGVsZXRlZCAiKTsKKworCWFidWZbMF0gPSAwOworCWlmICh0LT50Y21faGFuZGxlKSB7CisJCWlmIChmaWx0ZXJfcWRpc2MpCisJCQlwcmludF90Y19jbGFzc2lkKGFidWYsIHNpemVvZihhYnVmKSwgVENfSF9NSU4odC0+dGNtX2hhbmRsZSkpOworCQllbHNlCisJCQlwcmludF90Y19jbGFzc2lkKGFidWYsIHNpemVvZihhYnVmKSwgdC0+dGNtX2hhbmRsZSk7CisJfQorCWZwcmludGYoZnAsICJjbGFzcyAlcyAlcyAiLCBydGFfZ2V0YXR0cl9zdHIodGJbVENBX0tJTkRdKSwgYWJ1Zik7CisKKwlpZiAoZmlsdGVyX2lmaW5kZXggPT0gMCkKKwkJZnByaW50ZihmcCwgImRldiAlcyAiLCBsbF9pbmRleF90b19uYW1lKHQtPnRjbV9pZmluZGV4KSk7CisKKwlpZiAodC0+dGNtX3BhcmVudCA9PSBUQ19IX1JPT1QpCisJCWZwcmludGYoZnAsICJyb290ICIpOworCWVsc2UgeworCQlpZiAoZmlsdGVyX3FkaXNjKQorCQkJcHJpbnRfdGNfY2xhc3NpZChhYnVmLCBzaXplb2YoYWJ1ZiksIFRDX0hfTUlOKHQtPnRjbV9wYXJlbnQpKTsKKwkJZWxzZQorCQkJcHJpbnRfdGNfY2xhc3NpZChhYnVmLCBzaXplb2YoYWJ1ZiksIHQtPnRjbV9wYXJlbnQpOworCQlmcHJpbnRmKGZwLCAicGFyZW50ICVzICIsIGFidWYpOworCX0KKwlpZiAodC0+dGNtX2luZm8pCisJCWZwcmludGYoZnAsICJsZWFmICV4OiAiLCB0LT50Y21faW5mbz4+MTYpOworCXEgPSBnZXRfcWRpc2Nfa2luZChSVEFfREFUQSh0YltUQ0FfS0lORF0pKTsKKwlpZiAodGJbVENBX09QVElPTlNdKSB7CisJCWlmIChxICYmIHEtPnByaW50X2NvcHQpCisJCQlxLT5wcmludF9jb3B0KHEsIGZwLCB0YltUQ0FfT1BUSU9OU10pOworCQllbHNlCisJCQlmcHJpbnRmKGZwLCAiW2Nhbm5vdCBwYXJzZSBjbGFzcyBwYXJhbWV0ZXJzXSIpOworCX0KKwlmcHJpbnRmKGZwLCAiXG4iKTsKKwlpZiAoc2hvd19zdGF0cykgeworCQlzdHJ1Y3QgcnRhdHRyICp4c3RhdHMgPSBOVUxMOworCisJCWlmICh0YltUQ0FfU1RBVFNdIHx8IHRiW1RDQV9TVEFUUzJdKSB7CisJCQlwcmludF90Y3N0YXRzX2F0dHIoZnAsIHRiLCAiICIsICZ4c3RhdHMpOworCQkJZnByaW50ZihmcCwgIlxuIik7CisJCX0KKwkJaWYgKHEgJiYgKHhzdGF0cyB8fCB0YltUQ0FfWFNUQVRTXSkgJiYgcS0+cHJpbnRfeHN0YXRzKSB7CisJCQlxLT5wcmludF94c3RhdHMocSwgZnAsIHhzdGF0cyA/IDogdGJbVENBX1hTVEFUU10pOworCQkJZnByaW50ZihmcCwgIlxuIik7CisJCX0KKwl9CisJZmZsdXNoKGZwKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHRjX2NsYXNzX2xpc3QoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCB0Y21zZyB0OworCWNoYXIgZFsxNl07CisJY2hhciBidWZbMTAyNF0gPSB7MH07CisKKwltZW1zZXQoJnQsIDAsIHNpemVvZih0KSk7CisJdC50Y21fZmFtaWx5ID0gQUZfVU5TUEVDOworCW1lbXNldChkLCAwLCBzaXplb2YoZCkpOworCisJZmlsdGVyX3FkaXNjID0gMDsKKwlmaWx0ZXJfY2xhc3NpZCA9IDA7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgImRldiIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZFswXSkKKwkJCQlkdXBhcmcoImRldiIsICphcmd2KTsKKwkJCXN0cm5jcHkoZCwgKmFyZ3YsIHNpemVvZihkKS0xKTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJxZGlzYyIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZmlsdGVyX3FkaXNjKQorCQkJCWR1cGFyZygicWRpc2MiLCAqYXJndik7CisJCQlpZiAoZ2V0X3FkaXNjX2hhbmRsZSgmZmlsdGVyX3FkaXNjLCAqYXJndikpCisJCQkJaW52YXJnKCJpbnZhbGlkIHFkaXNjIElEIiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImNsYXNzaWQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGZpbHRlcl9jbGFzc2lkKQorCQkJCWR1cGFyZygiY2xhc3NpZCIsICphcmd2KTsKKwkJCWlmIChnZXRfdGNfY2xhc3NpZCgmZmlsdGVyX2NsYXNzaWQsICphcmd2KSkKKwkJCQlpbnZhcmcoImludmFsaWQgY2xhc3MgSUQiLCAqYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAicm9vdCIpID09IDApIHsKKwkJCWlmICh0LnRjbV9wYXJlbnQpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBcInJvb3RcIiBpcyBkdXBsaWNhdGUgcGFyZW50IElEXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQl0LnRjbV9wYXJlbnQgPSBUQ19IX1JPT1Q7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAicGFyZW50IikgPT0gMCkgeworCQkJX191MzIgaGFuZGxlOworCQkJaWYgKHQudGNtX3BhcmVudCkKKwkJCQlkdXBhcmcoInBhcmVudCIsICphcmd2KTsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X3RjX2NsYXNzaWQoJmhhbmRsZSwgKmFyZ3YpKQorCQkJCWludmFyZygiaW52YWxpZCBwYXJlbnQgSUQiLCAqYXJndik7CisJCQl0LnRjbV9wYXJlbnQgPSBoYW5kbGU7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKSB7CisJCQl1c2FnZSgpOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJXaGF0IGlzIFwiJXNcIj8gVHJ5IFwidGMgY2xhc3MgaGVscFwiLlxuIiwgKmFyZ3YpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJbGxfaW5pdF9tYXAoJnJ0aCk7CisKKwlpZiAoZFswXSkgeworCQlpZiAoKHQudGNtX2lmaW5kZXggPSBsbF9uYW1lX3RvX2luZGV4KGQpKSA9PSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBmaW5kIGRldmljZSBcIiVzXCJcbiIsIGQpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZmlsdGVyX2lmaW5kZXggPSB0LnRjbV9pZmluZGV4OworCX0KKworCWlmIChydG5sX2R1bXBfcmVxdWVzdCgmcnRoLCBSVE1fR0VUVENMQVNTLCAmdCwgc2l6ZW9mKHQpKSA8IDApIHsKKwkJcGVycm9yKCJDYW5ub3Qgc2VuZCBkdW1wIHJlcXVlc3QiKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHJ0bmxfZHVtcF9maWx0ZXIoJnJ0aCwgcHJpbnRfY2xhc3MsIHN0ZG91dCkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRHVtcCB0ZXJtaW5hdGVkXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHNob3dfZ3JhcGgpCisJCWdyYXBoX2Nsc19zaG93KHN0ZG91dCwgJmJ1ZlswXSwgJnJvb3RfY2xzX2xpc3QsIDApOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkb19jbGFzcyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaWYgKGFyZ2MgPCAxKQorCQlyZXR1cm4gdGNfY2xhc3NfbGlzdCgwLCBOVUxMKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgImFkZCIpID09IDApCisJCXJldHVybiB0Y19jbGFzc19tb2RpZnkoUlRNX05FV1RDTEFTUywgTkxNX0ZfRVhDTHxOTE1fRl9DUkVBVEUsIGFyZ2MtMSwgYXJndisxKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgImNoYW5nZSIpID09IDApCisJCXJldHVybiB0Y19jbGFzc19tb2RpZnkoUlRNX05FV1RDTEFTUywgMCwgYXJnYy0xLCBhcmd2KzEpOworCWlmIChtYXRjaGVzKCphcmd2LCAicmVwbGFjZSIpID09IDApCisJCXJldHVybiB0Y19jbGFzc19tb2RpZnkoUlRNX05FV1RDTEFTUywgTkxNX0ZfQ1JFQVRFLCBhcmdjLTEsIGFyZ3YrMSk7CisJaWYgKG1hdGNoZXMoKmFyZ3YsICJkZWxldGUiKSA9PSAwKQorCQlyZXR1cm4gdGNfY2xhc3NfbW9kaWZ5KFJUTV9ERUxUQ0xBU1MsIDAsICBhcmdjLTEsIGFyZ3YrMSk7CisjaWYgMAorCWlmIChtYXRjaGVzKCphcmd2LCAiZ2V0IikgPT0gMCkKKwkJcmV0dXJuIHRjX2NsYXNzX2dldChSVE1fR0VUVENMQVNTLCAwLCAgYXJnYy0xLCBhcmd2KzEpOworI2VuZGlmCisJaWYgKG1hdGNoZXMoKmFyZ3YsICJsaXN0IikgPT0gMCB8fCBtYXRjaGVzKCphcmd2LCAic2hvdyIpID09IDAKKwkgICAgfHwgbWF0Y2hlcygqYXJndiwgImxzdCIpID09IDApCisJCXJldHVybiB0Y19jbGFzc19saXN0KGFyZ2MtMSwgYXJndisxKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKSB7CisJCXVzYWdlKCk7CisJCXJldHVybiAwOworCX0KKwlmcHJpbnRmKHN0ZGVyciwgIkNvbW1hbmQgXCIlc1wiIGlzIHVua25vd24sIHRyeSBcInRjIGNsYXNzIGhlbHBcIi5cbiIsICphcmd2KTsKKwlyZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy90Y19jb21tb24uaCBiL2lwcm91dGUyL3RjL3RjX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZjM4OTgKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy90Y19jb21tb24uaApAQCAtMCwwICsxLDI3IEBACisKKyNkZWZpbmUgVENBX0JVRl9NQVgJKDY0KjEwMjQpCisKK2V4dGVybiBzdHJ1Y3QgcnRubF9oYW5kbGUgcnRoOworCitleHRlcm4gaW50IGRvX3FkaXNjKGludCBhcmdjLCBjaGFyICoqYXJndik7CitleHRlcm4gaW50IGRvX2NsYXNzKGludCBhcmdjLCBjaGFyICoqYXJndik7CitleHRlcm4gaW50IGRvX2ZpbHRlcihpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworZXh0ZXJuIGludCBkb19hY3Rpb24oaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKK2V4dGVybiBpbnQgZG9fdGNtb25pdG9yKGludCBhcmdjLCBjaGFyICoqYXJndik7CitleHRlcm4gaW50IGRvX2V4ZWMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKKworZXh0ZXJuIGludCBwcmludF9hY3Rpb24oY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8sIHN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqYXJnKTsKK2V4dGVybiBpbnQgcHJpbnRfZmlsdGVyKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZyk7CitleHRlcm4gaW50IHByaW50X3FkaXNjKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZyk7CitleHRlcm4gaW50IHByaW50X2NsYXNzKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZyk7CitleHRlcm4gdm9pZCBwcmludF9zaXplX3RhYmxlKEZJTEUgKmZwLCBjb25zdCBjaGFyICpwcmVmaXgsIHN0cnVjdCBydGF0dHIgKnJ0YSk7CisKK3N0cnVjdCB0Y19lc3RpbWF0b3I7CitleHRlcm4gaW50IHBhcnNlX2VzdGltYXRvcihpbnQgKnBfYXJnYywgY2hhciAqKipwX2FyZ3YsIHN0cnVjdCB0Y19lc3RpbWF0b3IgKmVzdCk7CisKK3N0cnVjdCB0Y19zaXplc3BlYzsKK2V4dGVybiBpbnQgcGFyc2Vfc2l6ZV90YWJsZShpbnQgKnBfYXJnYywgY2hhciAqKipwX2FyZ3YsIHN0cnVjdCB0Y19zaXplc3BlYyAqcyk7CitleHRlcm4gaW50IGNoZWNrX3NpemVfdGFibGVfb3B0cyhzdHJ1Y3QgdGNfc2l6ZXNwZWMgKnMpOworCitleHRlcm4gaW50IHNob3dfZ3JhcGg7CitleHRlcm4gYm9vbCB1c2VfbmFtZXM7CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy90Y19jb3JlLmMgYi9pcHJvdXRlMi90Yy90Y19jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZlYWVmYgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL3RjX2NvcmUuYwpAQCAtMCwwICsxLDIyNyBAQAorLyoKKyAqIHRjX2NvcmUuYwkJVEMgY29yZSBsaWJyYXJ5LgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInRjX2NvcmUuaCIKKyNpbmNsdWRlIDxsaW51eC9hdG0uaD4KKworc3RhdGljIGRvdWJsZSB0aWNrX2luX3VzZWMgPSAxOworc3RhdGljIGRvdWJsZSBjbG9ja19mYWN0b3IgPSAxOworCitpbnQgdGNfY29yZV90aW1lMmJpZyh1bnNpZ25lZCB0aW1lKQoreworCV9fdTY0IHQgPSB0aW1lOworCisJdCAqPSB0aWNrX2luX3VzZWM7CisJcmV0dXJuICh0ID4+IDMyKSAhPSAwOworfQorCisKK3Vuc2lnbmVkIHRjX2NvcmVfdGltZTJ0aWNrKHVuc2lnbmVkIHRpbWUpCit7CisJcmV0dXJuIHRpbWUqdGlja19pbl91c2VjOworfQorCit1bnNpZ25lZCB0Y19jb3JlX3RpY2sydGltZSh1bnNpZ25lZCB0aWNrKQoreworCXJldHVybiB0aWNrL3RpY2tfaW5fdXNlYzsKK30KKwordW5zaWduZWQgdGNfY29yZV90aW1lMmt0aW1lKHVuc2lnbmVkIHRpbWUpCit7CisJcmV0dXJuIHRpbWUgKiBjbG9ja19mYWN0b3I7Cit9CisKK3Vuc2lnbmVkIHRjX2NvcmVfa3RpbWUydGltZSh1bnNpZ25lZCBrdGltZSkKK3sKKwlyZXR1cm4ga3RpbWUgLyBjbG9ja19mYWN0b3I7Cit9CisKK3Vuc2lnbmVkIHRjX2NhbGNfeG1pdHRpbWUoX191NjQgcmF0ZSwgdW5zaWduZWQgc2l6ZSkKK3sKKwlyZXR1cm4gdGNfY29yZV90aW1lMnRpY2soVElNRV9VTklUU19QRVJfU0VDKigoZG91YmxlKXNpemUvKGRvdWJsZSlyYXRlKSk7Cit9CisKK3Vuc2lnbmVkIHRjX2NhbGNfeG1pdHNpemUoX191NjQgcmF0ZSwgdW5zaWduZWQgdGlja3MpCit7CisJcmV0dXJuICgoZG91YmxlKXJhdGUqdGNfY29yZV90aWNrMnRpbWUodGlja3MpKS9USU1FX1VOSVRTX1BFUl9TRUM7Cit9CisKKy8qCisgKiBUaGUgYWxpZ24gdG8gQVRNIGNlbGxzIGlzIHVzZWQgZm9yIGRldGVybWluaW5nIHRoZSAoQVRNKSBTQVIKKyAqIGFsaWdubWVudCBvdmVyaGVhZCBhdCB0aGUgQVRNIGxheWVyLiAoU0FSID0gU2VnbWVudGF0aW9uIEFuZAorICogUmVhc3NlbWJseSkuICBUaGlzIGlzIGZvciBleGFtcGxlIG5lZWRlZCB3aGVuIHNjaGVkdWxpbmcgcGFja2V0IG9uCisgKiBhbiBBRFNMIGNvbm5lY3Rpb24uICBOb3RlIHRoYXQgdGhlIGV4dHJhIEFUTS1BQUwgb3ZlcmhlYWQgaXMgX25vdF8KKyAqIGluY2x1ZGVkIGluIHRoaXMgY2FsY3VsYXRpb24uIFRoaXMgb3ZlcmhlYWQgaXMgYWRkZWQgaW4gdGhlIGtlcm5lbAorICogYmVmb3JlIGRvaW5nIHRoZSByYXRlIHRhYmxlIGxvb2t1cCwgYXMgdGhpcyBnaXZlcyBiZXR0ZXIgcHJlY2lzaW9uCisgKiAoYXMgdGhlIHRhYmxlIHdpbGwgYWx3YXlzIGJlIGFsaWduZWQgZm9yIDQ4IGJ5dGVzKS4KKyAqICAtLUhhd2ssIGQuNy8xMS0yMDA0LiA8aGF3a0BkaWt1LmRrPgorICovCitzdGF0aWMgdW5zaWduZWQgdGNfYWxpZ25fdG9fYXRtKHVuc2lnbmVkIHNpemUpCit7CisJaW50IGxpbmtzaXplLCBjZWxsczsKKwljZWxscyA9IHNpemUgLyBBVE1fQ0VMTF9QQVlMT0FEOworCWlmICgoc2l6ZSAlIEFUTV9DRUxMX1BBWUxPQUQpID4gMCkKKwkJY2VsbHMrKzsKKworCWxpbmtzaXplID0gY2VsbHMgKiBBVE1fQ0VMTF9TSVpFOyAvKiBVc2UgZnVsbCBjZWxsIHNpemUgdG8gYWRkIEFUTSB0YXggKi8KKwlyZXR1cm4gbGlua3NpemU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCB0Y19hZGp1c3Rfc2l6ZSh1bnNpZ25lZCBzeiwgdW5zaWduZWQgbXB1LCBlbnVtIGxpbmtfbGF5ZXIgbGlua2xheWVyKQoreworCWlmIChzeiA8IG1wdSkKKwkJc3ogPSBtcHU7CisKKwlzd2l0Y2ggKGxpbmtsYXllcikgeworCWNhc2UgTElOS0xBWUVSX0FUTToKKwkJcmV0dXJuIHRjX2FsaWduX3RvX2F0bShzeik7CisJY2FzZSBMSU5LTEFZRVJfRVRIRVJORVQ6CisJZGVmYXVsdDoKKwkJLy8gTm8gc2l6ZSBhZGp1c3RtZW50cyBvbiBFdGhlcm5ldAorCQlyZXR1cm4gc3o7CisJfQorfQorCisvKiBOb3RpY2UsIHRoZSByYXRlIHRhYmxlIGNhbGN1bGF0ZWQgaGVyZSwgaGF2ZSBnb3R0ZW4gcmVwbGFjZWQgaW4gdGhlCisgKiBrZXJuZWwgYW5kIGlzIG5vLWxvbmdlciB1c2VkIGZvciBsb29rdXBzLgorICoKKyAqIFRoaXMgaGFwcGVuZWQgaW4ga2VybmVsIHJlbGVhc2UgdjMuOCBjYXVzZWQgYnkga2VybmVsCisgKiAgLSBjb21taXQgNTZiNzY1Yjc5ICgiaHRiOiBpbXByb3ZlZCBhY2N1cmFjeSBhdCBoaWdoIHJhdGVzIikuCisgKiBUaGlzIGNoYW5nZSB1bmZvcnR1bmF0ZWx5IGNhdXNlZCBicmVha2FnZSBvZiB0YyBvdmVyaGVhZCBhbmQKKyAqIGxpbmtsYXllciBwYXJhbWV0ZXJzLgorICoKKyAqIEtlcm5lbCBvdmVyaGVhZCBoYW5kbGluZyBnb3QgZml4ZWQgaW4ga2VybmVsIHYzLjEwIGJ5CisgKiAtIGNvbW1pdCAwMWNiNzFkMmQ0NyAobmV0X3NjaGVkOiByZXN0b3JlICJvdmVyaGVhZCB4eHgiIGhhbmRsaW5nKQorICoKKyAqIEtlcm5lbCBsaW5rbGF5ZXIgaGFuZGxpbmcgZ290IGZpeGVkIGluIGtlcm5lbCB2My4xMSBieQorICogLSBjb21taXQgOGE4ZTNkODRiMTcgKG5ldF9zY2hlZDogcmVzdG9yZSAibGlua2xheWVyIGF0bSIgaGFuZGxpbmcpCisgKi8KKworLyoKKyAgIHJ0YWJbcGt0X2xlbj4+Y2VsbF9sb2ddID0gcGt0X3htaXRfdGltZQorICovCisKK2ludCB0Y19jYWxjX3J0YWJsZShzdHJ1Y3QgdGNfcmF0ZXNwZWMgKnIsIF9fdTMyICpydGFiLAorCQkgICBpbnQgY2VsbF9sb2csIHVuc2lnbmVkIG10dSwKKwkJICAgZW51bSBsaW5rX2xheWVyIGxpbmtsYXllcikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBzejsKKwl1bnNpZ25lZCBicHMgPSByLT5yYXRlOworCXVuc2lnbmVkIG1wdSA9IHItPm1wdTsKKworCWlmIChtdHUgPT0gMCkKKwkJbXR1ID0gMjA0NzsKKworCWlmIChjZWxsX2xvZyA8IDApIHsKKwkJY2VsbF9sb2cgPSAwOworCQl3aGlsZSAoKG10dSA+PiBjZWxsX2xvZykgPiAyNTUpCisJCQljZWxsX2xvZysrOworCX0KKworCWZvciAoaT0wOyBpPDI1NjsgaSsrKSB7CisJCXN6ID0gdGNfYWRqdXN0X3NpemUoKGkgKyAxKSA8PCBjZWxsX2xvZywgbXB1LCBsaW5rbGF5ZXIpOworCQlydGFiW2ldID0gdGNfY2FsY194bWl0dGltZShicHMsIHN6KTsKKwl9CisKKwlyLT5jZWxsX2FsaWduPS0xOyAvLyBEdWUgdG8gdGhlIHN6IGNhbGMKKwlyLT5jZWxsX2xvZz1jZWxsX2xvZzsKKwlyLT5saW5rbGF5ZXIgPSAobGlua2xheWVyICYgVENfTElOS0xBWUVSX01BU0spOworCXJldHVybiBjZWxsX2xvZzsKK30KKworLyoKKyAgIHN0YWJbcGt0X2xlbj4+Y2VsbF9sb2ddID0gcGt0X3htaXRfc2l6ZT4+c2l6ZV9sb2cKKyAqLworCitpbnQgdGNfY2FsY19zaXplX3RhYmxlKHN0cnVjdCB0Y19zaXplc3BlYyAqcywgX191MTYgKipzdGFiKQoreworCWludCBpOworCWVudW0gbGlua19sYXllciBsaW5rbGF5ZXIgPSBzLT5saW5rbGF5ZXI7CisJdW5zaWduZWQgaW50IHN6OworCisJaWYgKGxpbmtsYXllciA8PSBMSU5LTEFZRVJfRVRIRVJORVQgJiYgcy0+bXB1ID09IDApIHsKKwkJLyogZG9uJ3QgbmVlZCBkYXRhIHRhYmxlIGluIHRoaXMgY2FzZSAob25seSBvdmVyaGVhZCBzZXQpICovCisJCXMtPm10dSA9IDA7CisJCXMtPnRzaXplID0gMDsKKwkJcy0+Y2VsbF9sb2cgPSAwOworCQlzLT5jZWxsX2FsaWduID0gMDsKKwkJKnN0YWIgPSBOVUxMOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocy0+bXR1ID09IDApCisJCXMtPm10dSA9IDIwNDc7CisJaWYgKHMtPnRzaXplID09IDApCisJCXMtPnRzaXplID0gNTEyOworCisJcy0+Y2VsbF9sb2cgPSAwOworCXdoaWxlICgocy0+bXR1ID4+IHMtPmNlbGxfbG9nKSA+IHMtPnRzaXplIC0gMSkKKwkJcy0+Y2VsbF9sb2crKzsKKworCSpzdGFiID0gbWFsbG9jKHMtPnRzaXplICogc2l6ZW9mKF9fdTE2KSk7CisJaWYgKCEqc3RhYikKKwkJcmV0dXJuIC0xOworCithZ2FpbjoKKwlmb3IgKGkgPSBzLT50c2l6ZSAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCXN6ID0gdGNfYWRqdXN0X3NpemUoKGkgKyAxKSA8PCBzLT5jZWxsX2xvZywgcy0+bXB1LCBsaW5rbGF5ZXIpOworCQlpZiAoKHN6ID4+IHMtPnNpemVfbG9nKSA+IFVJTlQxNl9NQVgpIHsKKwkJCXMtPnNpemVfbG9nKys7CisJCQlnb3RvIGFnYWluOworCQl9CisJCSgqc3RhYilbaV0gPSBzeiA+PiBzLT5zaXplX2xvZzsKKwl9CisKKwlzLT5jZWxsX2FsaWduID0gLTE7IC8vIER1ZSB0byB0aGUgc3ogY2FsYworCXJldHVybiAwOworfQorCitpbnQgdGNfY29yZV9pbml0KHZvaWQpCit7CisJRklMRSAqZnA7CisJX191MzIgY2xvY2tfcmVzOworCV9fdTMyIHQydXM7CisJX191MzIgdXMydDsKKworCWZwID0gZm9wZW4oIi9wcm9jL25ldC9wc2NoZWQiLCAiciIpOworCWlmIChmcCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoZnNjYW5mKGZwLCAiJTA4eCUwOHglMDh4IiwgJnQydXMsICZ1czJ0LCAmY2xvY2tfcmVzKSAhPSAzKSB7CisJCWZjbG9zZShmcCk7CisJCXJldHVybiAtMTsKKwl9CisJZmNsb3NlKGZwKTsKKworCS8qIGNvbXBhdGliaWxpdHkgaGFjazogZm9yIG9sZCBpcHJvdXRlIGJpbmFyaWVzIChpZ25vcmluZworCSAqIHRoZSBrZXJuZWwgY2xvY2sgcmVzb2x1dGlvbikgdGhlIGtlcm5lbCBhZHZlcnRpc2VzIGEKKwkgKiB0aWNrIG11bHRpcGxpZXIgb2YgMTAwMCBpbiBjYXNlIG9mIG5hbm8tc2Vjb25kIHJlc29sdXRpb24sCisJICogd2hpY2ggcmVhbGx5IGlzIDEuICovCisJaWYgKGNsb2NrX3JlcyA9PSAxMDAwMDAwMDAwKQorCQl0MnVzID0gdXMydDsKKworCWNsb2NrX2ZhY3RvciAgPSAoZG91YmxlKWNsb2NrX3JlcyAvIFRJTUVfVU5JVFNfUEVSX1NFQzsKKwl0aWNrX2luX3VzZWMgPSAoZG91YmxlKXQydXMgLyB1czJ0ICogY2xvY2tfZmFjdG9yOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvdGNfY29yZS5oIGIvaXByb3V0ZTIvdGMvdGNfY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNjNiNzkKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy90Y19jb3JlLmgKQEAgLTAsMCArMSwzNCBAQAorI2lmbmRlZiBfVENfQ09SRV9IXworI2RlZmluZSBfVENfQ09SRV9IXyAxCisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wa3Rfc2NoZWQuaD4KKworI2RlZmluZSBUSU1FX1VOSVRTX1BFUl9TRUMJMTAwMDAwMAorCitlbnVtIGxpbmtfbGF5ZXIgeworCUxJTktMQVlFUl9VTlNQRUMsCisJTElOS0xBWUVSX0VUSEVSTkVULAorCUxJTktMQVlFUl9BVE0sCit9OworCisKK2ludCAgdGNfY29yZV90aW1lMmJpZyh1bnNpZ25lZCB0aW1lKTsKK3Vuc2lnbmVkIHRjX2NvcmVfdGltZTJ0aWNrKHVuc2lnbmVkIHRpbWUpOwordW5zaWduZWQgdGNfY29yZV90aWNrMnRpbWUodW5zaWduZWQgdGljayk7Cit1bnNpZ25lZCB0Y19jb3JlX3RpbWUya3RpbWUodW5zaWduZWQgdGltZSk7Cit1bnNpZ25lZCB0Y19jb3JlX2t0aW1lMnRpbWUodW5zaWduZWQga3RpbWUpOwordW5zaWduZWQgdGNfY2FsY194bWl0dGltZShfX3U2NCByYXRlLCB1bnNpZ25lZCBzaXplKTsKK3Vuc2lnbmVkIHRjX2NhbGNfeG1pdHNpemUoX191NjQgcmF0ZSwgdW5zaWduZWQgdGlja3MpOworaW50IHRjX2NhbGNfcnRhYmxlKHN0cnVjdCB0Y19yYXRlc3BlYyAqciwgX191MzIgKnJ0YWIsCisJCSAgIGludCBjZWxsX2xvZywgdW5zaWduZWQgbXR1LCBlbnVtIGxpbmtfbGF5ZXIgbGlua19sYXllcik7CitpbnQgdGNfY2FsY19zaXplX3RhYmxlKHN0cnVjdCB0Y19zaXplc3BlYyAqcywgX191MTYgKipzdGFiKTsKKworaW50IHRjX3NldHVwX2VzdGltYXRvcih1bnNpZ25lZCBBLCB1bnNpZ25lZCB0aW1lX2NvbnN0LCBzdHJ1Y3QgdGNfZXN0aW1hdG9yICplc3QpOworCitpbnQgdGNfY29yZV9pbml0KHZvaWQpOworCitleHRlcm4gc3RydWN0IHJ0bmxfaGFuZGxlIGdfcnRoOworZXh0ZXJuIGludCBpc19iYXRjaF9tb2RlOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RjL3RjX2VzdGltYXRvci5jIGIvaXByb3V0ZTIvdGMvdGNfZXN0aW1hdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU1OWFkZAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL3RjX2VzdGltYXRvci5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiB0Y19jb3JlLmMJCVRDIGNvcmUgbGlicmFyeS4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ0Y19jb3JlLmgiCisKK2ludCB0Y19zZXR1cF9lc3RpbWF0b3IodW5zaWduZWQgQSwgdW5zaWduZWQgdGltZV9jb25zdCwgc3RydWN0IHRjX2VzdGltYXRvciAqZXN0KQoreworCWZvciAoZXN0LT5pbnRlcnZhbD0wOyBlc3QtPmludGVydmFsPD01OyBlc3QtPmludGVydmFsKyspIHsKKwkJaWYgKEEgPD0gKDE8PGVzdC0+aW50ZXJ2YWwpKihUSU1FX1VOSVRTX1BFUl9TRUMvNCkpCisJCQlicmVhazsKKwl9CisJaWYgKGVzdC0+aW50ZXJ2YWwgPiA1KQorCQlyZXR1cm4gLTE7CisJZXN0LT5pbnRlcnZhbCAtPSAyOworCWZvciAoZXN0LT5ld21hX2xvZz0xOyBlc3QtPmV3bWFfbG9nPDMyOyBlc3QtPmV3bWFfbG9nKyspIHsKKwkJZG91YmxlIHcgPSAxLjAgLSAxLjAvKDE8PGVzdC0+ZXdtYV9sb2cpOworCQlpZiAoQS8oLWxvZyh3KSkgPiB0aW1lX2NvbnN0KQorCQkJYnJlYWs7CisJfQorCWVzdC0+ZXdtYV9sb2ctLTsKKwlpZiAoZXN0LT5ld21hX2xvZz09MCB8fCBlc3QtPmV3bWFfbG9nID49IDMxKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy90Y19leGVjLmMgYi9pcHJvdXRlMi90Yy90Y19leGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFiZTY3MgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL3RjX2V4ZWMuYwpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIHRjX2V4ZWMuYwkidGMgZXhlYyIuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJRGFuaWVsIEJvcmttYW5uIDxkYW5pZWxAaW9nZWFyYm94Lm5ldD4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKworI2luY2x1ZGUgInRjX3V0aWwuaCIKKyNpbmNsdWRlICJ0Y19jb21tb24uaCIKKworc3RhdGljIHN0cnVjdCBleGVjX3V0aWwgKmV4ZWNfbGlzdDsKK3N0YXRpYyB2b2lkICpCT0RZID0gTlVMTDsKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiB0YyBleGVjIFsgRVhFQ19UWVBFIF0gWyBoZWxwIHwgT1BUSU9OUyBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIldoZXJlOlxuIik7CisJZnByaW50ZihzdGRlcnIsICJFWEVDX1RZUEUgOj0geyBicGYgfCBldGMuIH1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiT1BUSU9OUyA6PSAuLi4gdHJ5IHRjIGV4ZWMgPGRlc2lyZWQgRVhFQ19LSU5EPiBoZWxwXG4iKTsKK30KKworc3RhdGljIGludCBwYXJzZV9ub2VvcHQoc3RydWN0IGV4ZWNfdXRpbCAqZXUsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpZiAoYXJnYykgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gZXhlYyBcIiVzXCIsIGhlbmNlIG9wdGlvbiBcIiVzXCIgIgorCQkJImlzIHVucGFyc2FibGVcbiIsIGV1LT5pZCwgKmFyZ3YpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXhlY191dGlsICpnZXRfZXhlY19raW5kKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGV4ZWNfdXRpbCAqZXU7CisJY2hhciBidWZbMjU2XTsKKwl2b2lkICpkbGg7CisKKwlmb3IgKGV1ID0gZXhlY19saXN0OyBldTsgZXUgPSBldS0+bmV4dCkKKwkJaWYgKHN0cmNtcChldS0+aWQsIG5hbWUpID09IDApCisJCQlyZXR1cm4gZXU7CisKKwlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMvZV8lcy5zbyIsIGdldF90Y19saWIoKSwgbmFtZSk7CisJZGxoID0gZGxvcGVuKGJ1ZiwgUlRMRF9MQVpZKTsKKwlpZiAoZGxoID09IE5VTEwpIHsKKwkJZGxoID0gQk9EWTsKKwkJaWYgKGRsaCA9PSBOVUxMKSB7CisJCQlkbGggPSBCT0RZID0gZGxvcGVuKE5VTEwsIFJUTERfTEFaWSk7CisJCQlpZiAoZGxoID09IE5VTEwpCisJCQkJZ290byBub2V4aXN0OworCQl9CisJfQorCisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzX2V4ZWNfdXRpbCIsIG5hbWUpOworCWV1ID0gZGxzeW0oZGxoLCBidWYpOworCWlmIChldSA9PSBOVUxMKQorCQlnb3RvIG5vZXhpc3Q7CityZWc6CisJZXUtPm5leHQgPSBleGVjX2xpc3Q7CisJZXhlY19saXN0ID0gZXU7CisKKwlyZXR1cm4gZXU7Citub2V4aXN0OgorCWV1ID0gbWFsbG9jKHNpemVvZigqZXUpKTsKKwlpZiAoZXUpIHsKKwkJbWVtc2V0KGV1LCAwLCBzaXplb2YoKmV1KSk7CisJCXN0cm5jcHkoZXUtPmlkLCBuYW1lLCBzaXplb2YoZXUtPmlkKSAtIDEpOworCQlldS0+cGFyc2VfZW9wdCA9IHBhcnNlX25vZW9wdDsKKwkJZ290byByZWc7CisJfQorCisJcmV0dXJuIGV1OworfQorCitpbnQgZG9fZXhlYyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGV4ZWNfdXRpbCAqZXU7CisJY2hhciBraW5kWzE2XTsKKworCWlmIChhcmdjIDwgMSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vIGNvbW1hbmQgZ2l2ZW4sIHRyeSBcInRjIGV4ZWMgaGVscFwiLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKSB7CisJCXVzYWdlKCk7CisJCXJldHVybiAwOworCX0KKworCW1lbXNldChraW5kLCAwLCBzaXplb2Yoa2luZCkpOworCXN0cm5jcHkoa2luZCwgKmFyZ3YsIHNpemVvZihraW5kKSAtIDEpOworCisJZXUgPSBnZXRfZXhlY19raW5kKGtpbmQpOworCisJYXJnYy0tOworCWFyZ3YrKzsKKworCXJldHVybiBldS0+cGFyc2VfZW9wdChldSwgYXJnYywgYXJndik7Cit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy90Y19maWx0ZXIuYyBiL2lwcm91dGUyL3RjL3RjX2ZpbHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMTA4MmIKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy90Y19maWx0ZXIuYwpAQCAtMCwwICsxLDQwNyBAQAorLyoKKyAqIHRjX2ZpbHRlci5jCQkidGMgZmlsdGVyIi4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorCisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInRjX3V0aWwuaCIKKyNpbmNsdWRlICJ0Y19jb21tb24uaCIKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiB0YyBmaWx0ZXIgWyBhZGQgfCBkZWwgfCBjaGFuZ2UgfCByZXBsYWNlIHwgc2hvdyBdIGRldiBTVFJJTkdcbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgIFsgcHJlZiBQUklPIF0gcHJvdG9jb2wgUFJPVE9cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgIFsgZXN0aW1hdG9yIElOVEVSVkFMIFRJTUVfQ09OU1RBTlQgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgWyByb290IHwgaW5ncmVzcyB8IGVncmVzcyB8IHBhcmVudCBDTEFTU0lEIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgIFsgaGFuZGxlIEZJTFRFUklEIF0gWyBbIEZJTFRFUl9UWVBFIF0gWyBoZWxwIHwgT1BUSU9OUyBdIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICB0YyBmaWx0ZXIgc2hvdyBbIGRldiBTVFJJTkcgXSBbIHJvb3QgfCBpbmdyZXNzIHwgZWdyZXNzIHwgcGFyZW50IENMQVNTSUQgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICJXaGVyZTpcbiIpOworCWZwcmludGYoc3RkZXJyLCAiRklMVEVSX1RZUEUgOj0geyByc3ZwIHwgdTMyIHwgYnBmIHwgZncgfCByb3V0ZSB8IGV0Yy4gfVxuIik7CisJZnByaW50ZihzdGRlcnIsICJGSUxURVJJRCA6PSAuLi4gZm9ybWF0IGRlcGVuZHMgb24gY2xhc3NpZmllciwgc2VlIHRoZXJlXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIk9QVElPTlMgOj0gLi4uIHRyeSB0YyBmaWx0ZXIgYWRkIDxkZXNpcmVkIEZJTFRFUl9LSU5EPiBoZWxwXG4iKTsKK30KKworc3RhdGljIGludCB0Y19maWx0ZXJfbW9kaWZ5KGludCBjbWQsIHVuc2lnbmVkIGZsYWdzLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyIAluOworCQlzdHJ1Y3QgdGNtc2cgCQl0OworCQljaGFyICAgCQkJYnVmW01BWF9NU0ddOworCX0gcmVxOworCXN0cnVjdCBmaWx0ZXJfdXRpbCAqcSA9IE5VTEw7CisJX191MzIgcHJpbyA9IDA7CisJX191MzIgcHJvdG9jb2wgPSAwOworCWludCBwcm90b2NvbF9zZXQgPSAwOworCWNoYXIgKmZoYW5kbGUgPSBOVUxMOworCWNoYXIgIGRbMTZdOworCWNoYXIgIGtbMTZdOworCXN0cnVjdCB0Y19lc3RpbWF0b3IgZXN0OworCisJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKwltZW1zZXQoJmVzdCwgMCwgc2l6ZW9mKGVzdCkpOworCW1lbXNldChkLCAwLCBzaXplb2YoZCkpOworCW1lbXNldChrLCAwLCBzaXplb2YoaykpOworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisKKwlyZXEubi5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCB0Y21zZykpOworCXJlcS5uLm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVHxmbGFnczsKKwlyZXEubi5ubG1zZ190eXBlID0gY21kOworCXJlcS50LnRjbV9mYW1pbHkgPSBBRl9VTlNQRUM7CisKKwlpZiAoY21kID09IFJUTV9ORVdURklMVEVSICYmIGZsYWdzICYgTkxNX0ZfQ1JFQVRFKQorCQlwcm90b2NvbCA9IGh0b25zKEVUSF9QX0FMTCk7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgImRldiIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZFswXSkKKwkJCQlkdXBhcmcoImRldiIsICphcmd2KTsKKwkJCXN0cm5jcHkoZCwgKmFyZ3YsIHNpemVvZihkKS0xKTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJyb290IikgPT0gMCkgeworCQkJaWYgKHJlcS50LnRjbV9wYXJlbnQpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBcInJvb3RcIiBpcyBkdXBsaWNhdGUgcGFyZW50IElEXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlyZXEudC50Y21fcGFyZW50ID0gVENfSF9ST09UOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImluZ3Jlc3MiKSA9PSAwKSB7CisJCQlpZiAocmVxLnQudGNtX3BhcmVudCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiRXJyb3I6IFwiaW5ncmVzc1wiIGlzIGR1cGxpY2F0ZSBwYXJlbnQgSURcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXJlcS50LnRjbV9wYXJlbnQgPSBUQ19IX01BS0UoVENfSF9DTFNBQ1QsCisJCQkJCQkgICAgIFRDX0hfTUlOX0lOR1JFU1MpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImVncmVzcyIpID09IDApIHsKKwkJCWlmIChyZXEudC50Y21fcGFyZW50KSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJFcnJvcjogXCJlZ3Jlc3NcIiBpcyBkdXBsaWNhdGUgcGFyZW50IElEXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlyZXEudC50Y21fcGFyZW50ID0gVENfSF9NQUtFKFRDX0hfQ0xTQUNULAorCQkJCQkJICAgICBUQ19IX01JTl9FR1JFU1MpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInBhcmVudCIpID09IDApIHsKKwkJCV9fdTMyIGhhbmRsZTsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocmVxLnQudGNtX3BhcmVudCkKKwkJCQlkdXBhcmcoInBhcmVudCIsICphcmd2KTsKKwkJCWlmIChnZXRfdGNfY2xhc3NpZCgmaGFuZGxlLCAqYXJndikpCisJCQkJaW52YXJnKCJJbnZhbGlkIHBhcmVudCBJRCIsICphcmd2KTsKKwkJCXJlcS50LnRjbV9wYXJlbnQgPSBoYW5kbGU7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaGFuZGxlIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChmaGFuZGxlKQorCQkJCWR1cGFyZygiaGFuZGxlIiwgKmFyZ3YpOworCQkJZmhhbmRsZSA9ICphcmd2OworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJwcmVmZXJlbmNlIikgPT0gMCB8fAorCQkJICAgbWF0Y2hlcygqYXJndiwgInByaW9yaXR5IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChwcmlvKQorCQkJCWR1cGFyZygicHJpb3JpdHkiLCAqYXJndik7CisJCQlpZiAoZ2V0X3UzMigmcHJpbywgKmFyZ3YsIDApIHx8IHByaW8gPiAweEZGRkYpCisJCQkJaW52YXJnKCJpbnZhbGlkIHByaW9yaXR5IHZhbHVlIiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJwcm90b2NvbCIpID09IDApIHsKKwkJCV9fdTE2IGlkOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChwcm90b2NvbF9zZXQpCisJCQkJZHVwYXJnKCJwcm90b2NvbCIsICphcmd2KTsKKwkJCWlmIChsbF9wcm90b19hMm4oJmlkLCAqYXJndikpCisJCQkJaW52YXJnKCJpbnZhbGlkIHByb3RvY29sIiwgKmFyZ3YpOworCQkJcHJvdG9jb2wgPSBpZDsKKwkJCXByb3RvY29sX3NldCA9IDE7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImVzdGltYXRvciIpID09IDApIHsKKwkJCWlmIChwYXJzZV9lc3RpbWF0b3IoJmFyZ2MsICZhcmd2LCAmZXN0KSA8IDApCisJCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJdXNhZ2UoKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJc3RybmNweShrLCAqYXJndiwgc2l6ZW9mKGspLTEpOworCisJCQlxID0gZ2V0X2ZpbHRlcl9raW5kKGspOworCQkJYXJnYy0tOyBhcmd2Kys7CisJCQlicmVhazsKKwkJfQorCisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCXJlcS50LnRjbV9pbmZvID0gVENfSF9NQUtFKHByaW88PDE2LCBwcm90b2NvbCk7CisKKwlpZiAoa1swXSkKKwkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIFRDQV9LSU5ELCBrLCBzdHJsZW4oaykrMSk7CisKKwlpZiAocSkgeworCQlpZiAocS0+cGFyc2VfZm9wdChxLCBmaGFuZGxlLCBhcmdjLCBhcmd2LCAmcmVxLm4pKQorCQkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJaWYgKGZoYW5kbGUpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiTXVzdCBzcGVjaWZ5IGZpbHRlciB0eXBlIHdoZW4gdXNpbmcgIgorCQkJCSJcImhhbmRsZVwiXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAoYXJnYykgeworCQkJaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkKKwkJCQl1c2FnZSgpOworCQkJZnByaW50ZihzdGRlcnIsICJHYXJiYWdlIGluc3RlYWQgb2YgYXJndW1lbnRzIFwiJXMgLi4uXCIuIFRyeSBcInRjIGZpbHRlciBoZWxwXCIuXG4iLCAqYXJndik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJaWYgKGVzdC5ld21hX2xvZykKKwkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIFRDQV9SQVRFLCAmZXN0LCBzaXplb2YoZXN0KSk7CisKKworCWlmIChkWzBdKSAgeworCQlsbF9pbml0X21hcCgmcnRoKTsKKworCQlpZiAoKHJlcS50LnRjbV9pZmluZGV4ID0gbGxfbmFtZV90b19pbmRleChkKSkgPT0gMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJDYW5ub3QgZmluZCBkZXZpY2UgXCIlc1wiXG4iLCBkKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJaWYgKHJ0bmxfdGFsaygmcnRoLCAmcmVxLm4sIE5VTEwsIDApIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIldlIGhhdmUgYW4gZXJyb3IgdGFsa2luZyB0byB0aGUga2VybmVsXG4iKTsKKwkJcmV0dXJuIDI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX3UzMiBmaWx0ZXJfcGFyZW50Oworc3RhdGljIGludCBmaWx0ZXJfaWZpbmRleDsKK3N0YXRpYyBfX3UzMiBmaWx0ZXJfcHJpbzsKK3N0YXRpYyBfX3UzMiBmaWx0ZXJfcHJvdG9jb2w7CitfX3UxNiBmX3Byb3RvID0gMDsKKworaW50IHByaW50X2ZpbHRlcihjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobywKKwkJCXN0cnVjdCBubG1zZ2hkciAqbiwKKwkJCXZvaWQgKmFyZykKK3sKKwlGSUxFICpmcCA9IChGSUxFKilhcmc7CisJc3RydWN0IHRjbXNnICp0ID0gTkxNU0dfREFUQShuKTsKKwlpbnQgbGVuID0gbi0+bmxtc2dfbGVuOworCXN0cnVjdCBydGF0dHIgKiB0YltUQ0FfTUFYKzFdOworCXN0cnVjdCBmaWx0ZXJfdXRpbCAqcTsKKwljaGFyIGFidWZbMjU2XTsKKworCWlmIChuLT5ubG1zZ190eXBlICE9IFJUTV9ORVdURklMVEVSICYmIG4tPm5sbXNnX3R5cGUgIT0gUlRNX0RFTFRGSUxURVIpIHsKKwkJZnByaW50ZihzdGRlcnIsICJOb3QgYSBmaWx0ZXJcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJbGVuIC09IE5MTVNHX0xFTkdUSChzaXplb2YoKnQpKTsKKwlpZiAobGVuIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIldyb25nIGxlbiAlZFxuIiwgbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW1lbXNldCh0YiwgMCwgc2l6ZW9mKHRiKSk7CisJcGFyc2VfcnRhdHRyKHRiLCBUQ0FfTUFYLCBUQ0FfUlRBKHQpLCBsZW4pOworCisJaWYgKHRiW1RDQV9LSU5EXSA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAicHJpbnRfZmlsdGVyOiBOVUxMIGtpbmRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKG4tPm5sbXNnX3R5cGUgPT0gUlRNX0RFTFRGSUxURVIpCisJCWZwcmludGYoZnAsICJkZWxldGVkICIpOworCisJZnByaW50ZihmcCwgImZpbHRlciAiKTsKKwlpZiAoIWZpbHRlcl9pZmluZGV4IHx8IGZpbHRlcl9pZmluZGV4ICE9IHQtPnRjbV9pZmluZGV4KQorCQlmcHJpbnRmKGZwLCAiZGV2ICVzICIsIGxsX2luZGV4X3RvX25hbWUodC0+dGNtX2lmaW5kZXgpKTsKKworCWlmICghZmlsdGVyX3BhcmVudCB8fCBmaWx0ZXJfcGFyZW50ICE9IHQtPnRjbV9wYXJlbnQpIHsKKwkJaWYgKHQtPnRjbV9wYXJlbnQgPT0gVENfSF9ST09UKQorCQkJZnByaW50ZihmcCwgInJvb3QgIik7CisJCWVsc2UgaWYgKHQtPnRjbV9wYXJlbnQgPT0gVENfSF9NQUtFKFRDX0hfQ0xTQUNULCBUQ19IX01JTl9JTkdSRVNTKSkKKwkJCWZwcmludGYoZnAsICJpbmdyZXNzICIpOworCQllbHNlIGlmICh0LT50Y21fcGFyZW50ID09IFRDX0hfTUFLRShUQ19IX0NMU0FDVCwgVENfSF9NSU5fRUdSRVNTKSkKKwkJCWZwcmludGYoZnAsICJlZ3Jlc3MgIik7CisJCWVsc2UgeworCQkJcHJpbnRfdGNfY2xhc3NpZChhYnVmLCBzaXplb2YoYWJ1ZiksIHQtPnRjbV9wYXJlbnQpOworCQkJZnByaW50ZihmcCwgInBhcmVudCAlcyAiLCBhYnVmKTsKKwkJfQorCX0KKworCWlmICh0LT50Y21faW5mbykgeworCQlmX3Byb3RvID0gVENfSF9NSU4odC0+dGNtX2luZm8pOworCQlfX3UzMiBwcmlvID0gVENfSF9NQUoodC0+dGNtX2luZm8pPj4xNjsKKwkJaWYgKCFmaWx0ZXJfcHJvdG9jb2wgfHwgZmlsdGVyX3Byb3RvY29sICE9IGZfcHJvdG8pIHsKKwkJCWlmIChmX3Byb3RvKSB7CisJCQkJU1BSSU5UX0JVRihiMSk7CisJCQkJZnByaW50ZihmcCwgInByb3RvY29sICVzICIsCisJCQkJCWxsX3Byb3RvX24yYShmX3Byb3RvLCBiMSwgc2l6ZW9mKGIxKSkpOworCQkJfQorCQl9CisJCWlmICghZmlsdGVyX3ByaW8gfHwgZmlsdGVyX3ByaW8gIT0gcHJpbykgeworCQkJaWYgKHByaW8pCisJCQkJZnByaW50ZihmcCwgInByZWYgJXUgIiwgcHJpbyk7CisJCX0KKwl9CisJZnByaW50ZihmcCwgIiVzICIsIHJ0YV9nZXRhdHRyX3N0cih0YltUQ0FfS0lORF0pKTsKKwlxID0gZ2V0X2ZpbHRlcl9raW5kKFJUQV9EQVRBKHRiW1RDQV9LSU5EXSkpOworCWlmICh0YltUQ0FfT1BUSU9OU10pIHsKKwkJaWYgKHEpCisJCQlxLT5wcmludF9mb3B0KHEsIGZwLCB0YltUQ0FfT1BUSU9OU10sIHQtPnRjbV9oYW5kbGUpOworCQllbHNlCisJCQlmcHJpbnRmKGZwLCAiW2Nhbm5vdCBwYXJzZSBwYXJhbWV0ZXJzXSIpOworCX0KKwlmcHJpbnRmKGZwLCAiXG4iKTsKKworCWlmIChzaG93X3N0YXRzICYmICh0YltUQ0FfU1RBVFNdIHx8IHRiW1RDQV9TVEFUUzJdKSkgeworCQlwcmludF90Y3N0YXRzX2F0dHIoZnAsIHRiLCAiICIsIE5VTEwpOworCQlmcHJpbnRmKGZwLCAiXG4iKTsKKwl9CisKKwlmZmx1c2goZnApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRjX2ZpbHRlcl9saXN0KGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgdGNtc2cgdDsKKwljaGFyIGRbMTZdOworCV9fdTMyIHByaW8gPSAwOworCV9fdTMyIHByb3RvY29sID0gMDsKKwljaGFyICpmaGFuZGxlID0gTlVMTDsKKworCW1lbXNldCgmdCwgMCwgc2l6ZW9mKHQpKTsKKwl0LnRjbV9mYW1pbHkgPSBBRl9VTlNQRUM7CisJbWVtc2V0KGQsIDAsIHNpemVvZihkKSk7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgImRldiIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZFswXSkKKwkJCQlkdXBhcmcoImRldiIsICphcmd2KTsKKwkJCXN0cm5jcHkoZCwgKmFyZ3YsIHNpemVvZihkKS0xKTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJyb290IikgPT0gMCkgeworCQkJaWYgKHQudGNtX3BhcmVudCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiRXJyb3I6IFwicm9vdFwiIGlzIGR1cGxpY2F0ZSBwYXJlbnQgSURcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWZpbHRlcl9wYXJlbnQgPSB0LnRjbV9wYXJlbnQgPSBUQ19IX1JPT1Q7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaW5ncmVzcyIpID09IDApIHsKKwkJCWlmICh0LnRjbV9wYXJlbnQpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBcImluZ3Jlc3NcIiBpcyBkdXBsaWNhdGUgcGFyZW50IElEXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlmaWx0ZXJfcGFyZW50ID0gVENfSF9NQUtFKFRDX0hfQ0xTQUNULAorCQkJCQkJICBUQ19IX01JTl9JTkdSRVNTKTsKKwkJCXQudGNtX3BhcmVudCA9IGZpbHRlcl9wYXJlbnQ7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZWdyZXNzIikgPT0gMCkgeworCQkJaWYgKHQudGNtX3BhcmVudCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiRXJyb3I6IFwiZWdyZXNzXCIgaXMgZHVwbGljYXRlIHBhcmVudCBJRFxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJZmlsdGVyX3BhcmVudCA9IFRDX0hfTUFLRShUQ19IX0NMU0FDVCwKKwkJCQkJCSAgVENfSF9NSU5fRUdSRVNTKTsKKwkJCXQudGNtX3BhcmVudCA9IGZpbHRlcl9wYXJlbnQ7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAicGFyZW50IikgPT0gMCkgeworCQkJX191MzIgaGFuZGxlOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmICh0LnRjbV9wYXJlbnQpCisJCQkJZHVwYXJnKCJwYXJlbnQiLCAqYXJndik7CisJCQlpZiAoZ2V0X3RjX2NsYXNzaWQoJmhhbmRsZSwgKmFyZ3YpKQorCQkJCWludmFyZygiaW52YWxpZCBwYXJlbnQgSUQiLCAqYXJndik7CisJCQlmaWx0ZXJfcGFyZW50ID0gdC50Y21fcGFyZW50ID0gaGFuZGxlOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImhhbmRsZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZmhhbmRsZSkKKwkJCQlkdXBhcmcoImhhbmRsZSIsICphcmd2KTsKKwkJCWZoYW5kbGUgPSAqYXJndjsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAicHJlZmVyZW5jZSIpID09IDAgfHwKKwkJCSAgIG1hdGNoZXMoKmFyZ3YsICJwcmlvcml0eSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocHJpbykKKwkJCQlkdXBhcmcoInByaW9yaXR5IiwgKmFyZ3YpOworCQkJaWYgKGdldF91MzIoJnByaW8sICphcmd2LCAwKSkKKwkJCQlpbnZhcmcoImludmFsaWQgcHJlZmVyZW5jZSIsICphcmd2KTsKKwkJCWZpbHRlcl9wcmlvID0gcHJpbzsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAicHJvdG9jb2wiKSA9PSAwKSB7CisJCQlfX3UxNiByZXM7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHByb3RvY29sKQorCQkJCWR1cGFyZygicHJvdG9jb2wiLCAqYXJndik7CisJCQlpZiAobGxfcHJvdG9fYTJuKCZyZXMsICphcmd2KSkKKwkJCQlpbnZhcmcoImludmFsaWQgcHJvdG9jb2wiLCAqYXJndik7CisJCQlwcm90b2NvbCA9IHJlczsKKwkJCWZpbHRlcl9wcm90b2NvbCA9IHByb3RvY29sOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJdXNhZ2UoKTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiIFdoYXQgaXMgXCIlc1wiPyBUcnkgXCJ0YyBmaWx0ZXIgaGVscFwiXG4iLCAqYXJndik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisKKwl0LnRjbV9pbmZvID0gVENfSF9NQUtFKHByaW88PDE2LCBwcm90b2NvbCk7CisKKwlsbF9pbml0X21hcCgmcnRoKTsKKworCWlmIChkWzBdKSB7CisJCWlmICgodC50Y21faWZpbmRleCA9IGxsX25hbWVfdG9faW5kZXgoZCkpID09IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IGZpbmQgZGV2aWNlIFwiJXNcIlxuIiwgZCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlmaWx0ZXJfaWZpbmRleCA9IHQudGNtX2lmaW5kZXg7CisJfQorCisJaWYgKHJ0bmxfZHVtcF9yZXF1ZXN0KCZydGgsIFJUTV9HRVRURklMVEVSLCAmdCwgc2l6ZW9mKHQpKSA8IDApIHsKKwkJcGVycm9yKCJDYW5ub3Qgc2VuZCBkdW1wIHJlcXVlc3QiKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHJ0bmxfZHVtcF9maWx0ZXIoJnJ0aCwgcHJpbnRfZmlsdGVyLCBzdGRvdXQpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkR1bXAgdGVybWluYXRlZFxuIik7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgZG9fZmlsdGVyKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpZiAoYXJnYyA8IDEpCisJCXJldHVybiB0Y19maWx0ZXJfbGlzdCgwLCBOVUxMKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgImFkZCIpID09IDApCisJCXJldHVybiB0Y19maWx0ZXJfbW9kaWZ5KFJUTV9ORVdURklMVEVSLCBOTE1fRl9FWENMfE5MTV9GX0NSRUFURSwgYXJnYy0xLCBhcmd2KzEpOworCWlmIChtYXRjaGVzKCphcmd2LCAiY2hhbmdlIikgPT0gMCkKKwkJcmV0dXJuIHRjX2ZpbHRlcl9tb2RpZnkoUlRNX05FV1RGSUxURVIsIDAsIGFyZ2MtMSwgYXJndisxKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgInJlcGxhY2UiKSA9PSAwKQorCQlyZXR1cm4gdGNfZmlsdGVyX21vZGlmeShSVE1fTkVXVEZJTFRFUiwgTkxNX0ZfQ1JFQVRFLCBhcmdjLTEsIGFyZ3YrMSk7CisJaWYgKG1hdGNoZXMoKmFyZ3YsICJkZWxldGUiKSA9PSAwKQorCQlyZXR1cm4gdGNfZmlsdGVyX21vZGlmeShSVE1fREVMVEZJTFRFUiwgMCwgIGFyZ2MtMSwgYXJndisxKTsKKyNpZiAwCisJaWYgKG1hdGNoZXMoKmFyZ3YsICJnZXQiKSA9PSAwKQorCQlyZXR1cm4gdGNfZmlsdGVyX2dldChSVE1fR0VUVEZJTFRFUiwgMCwgIGFyZ2MtMSwgYXJndisxKTsKKyNlbmRpZgorCWlmIChtYXRjaGVzKCphcmd2LCAibGlzdCIpID09IDAgfHwgbWF0Y2hlcygqYXJndiwgInNob3ciKSA9PSAwCisJICAgIHx8IG1hdGNoZXMoKmFyZ3YsICJsc3QiKSA9PSAwKQorCQlyZXR1cm4gdGNfZmlsdGVyX2xpc3QoYXJnYy0xLCBhcmd2KzEpOworCWlmIChtYXRjaGVzKCphcmd2LCAiaGVscCIpID09IDApIHsKKwkJdXNhZ2UoKTsKKwkJcmV0dXJuIDA7CisgICAgICAgIH0KKwlmcHJpbnRmKHN0ZGVyciwgIkNvbW1hbmQgXCIlc1wiIGlzIHVua25vd24sIHRyeSBcInRjIGZpbHRlciBoZWxwXCIuXG4iLCAqYXJndik7CisJcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvdGNfbW9uaXRvci5jIGIvaXByb3V0ZTIvdGMvdGNfbW9uaXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYjk0MzIKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy90Y19tb25pdG9yLmMKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiB0Y19tb25pdG9yLmMJCSJ0YyBtb25pdG9yIi4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglKYW1hbCBIYWRpIFNhbGltCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInRjX3V0aWwuaCIKKyNpbmNsdWRlICJ0Y19jb21tb24uaCIKKworCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IHRjIFstdGltZXN0YW1wIFstdHNob3J0XSBtb25pdG9yXG4iKTsKKwlleGl0KC0xKTsKK30KKworCitzdGF0aWMgaW50IGFjY2VwdF90Y21zZyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobywKKwkJCXN0cnVjdCBydG5sX2N0cmxfZGF0YSAqY3RybCwKKwkJCXN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqYXJnKQoreworCUZJTEUgKmZwID0gKEZJTEUqKWFyZzsKKworCWlmICh0aW1lc3RhbXApCisJCXByaW50X3RpbWVzdGFtcChmcCk7CisKKwlpZiAobi0+bmxtc2dfdHlwZSA9PSBSVE1fTkVXVEZJTFRFUiB8fCBuLT5ubG1zZ190eXBlID09IFJUTV9ERUxURklMVEVSKSB7CisJCXByaW50X2ZpbHRlcih3aG8sIG4sIGFyZyk7CisJCXJldHVybiAwOworCX0KKwlpZiAobi0+bmxtc2dfdHlwZSA9PSBSVE1fTkVXVENMQVNTIHx8IG4tPm5sbXNnX3R5cGUgPT0gUlRNX0RFTFRDTEFTUykgeworCQlwcmludF9jbGFzcyh3aG8sIG4sIGFyZyk7CisJCXJldHVybiAwOworCX0KKwlpZiAobi0+bmxtc2dfdHlwZSA9PSBSVE1fTkVXUURJU0MgfHwgbi0+bmxtc2dfdHlwZSA9PSBSVE1fREVMUURJU0MpIHsKKwkJcHJpbnRfcWRpc2Mod2hvLCBuLCBhcmcpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKG4tPm5sbXNnX3R5cGUgPT0gUlRNX0dFVEFDVElPTiB8fCBuLT5ubG1zZ190eXBlID09IFJUTV9ORVdBQ1RJT04gfHwKKwkgICAgbi0+bmxtc2dfdHlwZSA9PSBSVE1fREVMQUNUSU9OKSB7CisJCXByaW50X2FjdGlvbih3aG8sIG4sIGFyZyk7CisJCXJldHVybiAwOworCX0KKwlpZiAobi0+bmxtc2dfdHlwZSAhPSBOTE1TR19FUlJPUiAmJiBuLT5ubG1zZ190eXBlICE9IE5MTVNHX05PT1AgJiYKKwkgICAgbi0+bmxtc2dfdHlwZSAhPSBOTE1TR19ET05FKSB7CisJCWZwcmludGYoZnAsICJVbmtub3duIG1lc3NhZ2U6IGxlbmd0aCAlMDhkIHR5cGUgJTA4eCBmbGFncyAlMDh4XG4iLAorCQkJbi0+bmxtc2dfbGVuLCBuLT5ubG1zZ190eXBlLCBuLT5ubG1zZ19mbGFncyk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgZG9fdGNtb25pdG9yKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgcnRubF9oYW5kbGUgcnRoOworCWNoYXIgKmZpbGUgPSBOVUxMOworCXVuc2lnbmVkIGdyb3VwcyA9IG5sX21ncnAoUlROTEdSUF9UQyk7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKG1hdGNoZXMoKmFyZ3YsICJmaWxlIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWZpbGUgPSAqYXJndjsKKwkJfSBlbHNlIHsKKwkJCWlmIChtYXRjaGVzKCphcmd2LCAiaGVscCIpID09IDApIHsKKwkJCQl1c2FnZSgpOworCQkJfSBlbHNlIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkFyZ3VtZW50IFwiJXNcIiBpcyB1bmtub3duLCB0cnkgXCJ0YyBtb25pdG9yIGhlbHBcIi5cbiIsICphcmd2KTsKKwkJCQlleGl0KC0xKTsKKwkJCX0KKwkJfQorCQlhcmdjLS07CWFyZ3YrKzsKKwl9CisKKwlpZiAoZmlsZSkgeworCQlGSUxFICpmcCA9IGZvcGVuKGZpbGUsICJyIik7CisJCWludCByZXQ7CisKKwkJaWYgKGZwID09IE5VTEwpIHsKKwkJCXBlcnJvcigiQ2Fubm90IGZvcGVuIik7CisJCQlleGl0KC0xKTsKKwkJfQorCisJCXJldCA9IHJ0bmxfZnJvbV9maWxlKGZwLCBhY2NlcHRfdGNtc2csIHN0ZG91dCk7CisJCWZjbG9zZShmcCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHJ0bmxfb3BlbigmcnRoLCBncm91cHMpIDwgMCkKKwkJZXhpdCgxKTsKKworCWxsX2luaXRfbWFwKCZydGgpOworCisJaWYgKHJ0bmxfbGlzdGVuKCZydGgsIGFjY2VwdF90Y21zZywgKHZvaWQqKXN0ZG91dCkgPCAwKSB7CisJCXJ0bmxfY2xvc2UoJnJ0aCk7CisJCWV4aXQoMik7CisJfQorCisJcnRubF9jbG9zZSgmcnRoKTsKKwlleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvdGNfcWRpc2MuYyBiL2lwcm91dGUyL3RjL3RjX3FkaXNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I4NjFlMAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RjL3RjX3FkaXNjLmMKQEAgLTAsMCArMSwzNjYgQEAKKy8qCisgKiB0Y19xZGlzYy5jCQkidGMgcWRpc2MiLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCQlKIEhhZGkgU2FsaW06IEV4dGVuc2lvbiB0byBpbmdyZXNzCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKworI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAidGNfdXRpbC5oIgorI2luY2x1ZGUgInRjX2NvbW1vbi5oIgorCitzdGF0aWMgaW50IHVzYWdlKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogdGMgcWRpc2MgWyBhZGQgfCBkZWwgfCByZXBsYWNlIHwgY2hhbmdlIHwgc2hvdyBdIGRldiBTVFJJTkdcbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgIFsgaGFuZGxlIFFIQU5ETEUgXSBbIHJvb3QgfCBpbmdyZXNzIHwgY2xzYWN0IHwgcGFyZW50IENMQVNTSUQgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgWyBlc3RpbWF0b3IgSU5URVJWQUwgVElNRV9DT05TVEFOVCBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBbIHN0YWIgWyBoZWxwIHwgU1RBQl9PUFRJT05TXSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBbIFsgUURJU0NfS0lORCBdIFsgaGVscCB8IE9QVElPTlMgXSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgdGMgcWRpc2Mgc2hvdyBbIGRldiBTVFJJTkcgXSBbIGluZ3Jlc3MgfCBjbHNhY3QgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICJXaGVyZTpcbiIpOworCWZwcmludGYoc3RkZXJyLCAiUURJU0NfS0lORCA6PSB7IFtwfGJdZmlmbyB8IHRiZiB8IHByaW8gfCBjYnEgfCByZWQgfCBldGMuIH1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiT1BUSU9OUyA6PSAuLi4gdHJ5IHRjIHFkaXNjIGFkZCA8ZGVzaXJlZCBRRElTQ19LSU5EPiBoZWxwXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlNUQUJfT1BUSU9OUyA6PSAuLi4gdHJ5IHRjIHFkaXNjIGFkZCBzdGFiIGhlbHBcbiIpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCB0Y19xZGlzY19tb2RpZnkoaW50IGNtZCwgdW5zaWduZWQgZmxhZ3MsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgcWRpc2NfdXRpbCAqcSA9IE5VTEw7CisJc3RydWN0IHRjX2VzdGltYXRvciBlc3Q7CisJc3RydWN0IHsKKwkJc3RydWN0IHRjX3NpemVzcGVjCXN6b3B0czsKKwkJX191MTYJCQkqZGF0YTsKKwl9IHN0YWI7CisJY2hhciAgZFsxNl07CisJY2hhciAga1sxNl07CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyIAluOworCQlzdHJ1Y3QgdGNtc2cgCQl0OworCQljaGFyICAgCQkJYnVmW1RDQV9CVUZfTUFYXTsKKwl9IHJlcTsKKworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisJbWVtc2V0KCZzdGFiLCAwLCBzaXplb2Yoc3RhYikpOworCW1lbXNldCgmZXN0LCAwLCBzaXplb2YoZXN0KSk7CisJbWVtc2V0KCZkLCAwLCBzaXplb2YoZCkpOworCW1lbXNldCgmaywgMCwgc2l6ZW9mKGspKTsKKworCXJlcS5uLm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IHRjbXNnKSk7CisJcmVxLm4ubmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUfGZsYWdzOworCXJlcS5uLm5sbXNnX3R5cGUgPSBjbWQ7CisJcmVxLnQudGNtX2ZhbWlseSA9IEFGX1VOU1BFQzsKKworCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAoc3RyY21wKCphcmd2LCAiZGV2IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChkWzBdKQorCQkJCWR1cGFyZygiZGV2IiwgKmFyZ3YpOworCQkJc3RybmNweShkLCAqYXJndiwgc2l6ZW9mKGQpLTEpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImhhbmRsZSIpID09IDApIHsKKwkJCV9fdTMyIGhhbmRsZTsKKwkJCWlmIChyZXEudC50Y21faGFuZGxlKQorCQkJCWR1cGFyZygiaGFuZGxlIiwgKmFyZ3YpOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfcWRpc2NfaGFuZGxlKCZoYW5kbGUsICphcmd2KSkKKwkJCQlpbnZhcmcoImludmFsaWQgcWRpc2MgSUQiLCAqYXJndik7CisJCQlyZXEudC50Y21faGFuZGxlID0gaGFuZGxlOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInJvb3QiKSA9PSAwKSB7CisJCQlpZiAocmVxLnQudGNtX3BhcmVudCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiRXJyb3I6IFwicm9vdFwiIGlzIGR1cGxpY2F0ZSBwYXJlbnQgSURcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXJlcS50LnRjbV9wYXJlbnQgPSBUQ19IX1JPT1Q7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiY2xzYWN0IikgPT0gMCkgeworCQkJaWYgKHJlcS50LnRjbV9wYXJlbnQpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBcImNsc2FjdFwiIGlzIGEgZHVwbGljYXRlIHBhcmVudCBJRFxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcmVxLnQudGNtX3BhcmVudCA9IFRDX0hfQ0xTQUNUOworCQkJc3RybmNweShrLCAiY2xzYWN0Iiwgc2l6ZW9mKGspIC0gMSk7CisJCQlxID0gZ2V0X3FkaXNjX2tpbmQoayk7CisJCQlyZXEudC50Y21faGFuZGxlID0gVENfSF9NQUtFKFRDX0hfQ0xTQUNULCAwKTsKKwkJCU5FWFRfQVJHX0ZXRCgpOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiaW5ncmVzcyIpID09IDApIHsKKwkJCWlmIChyZXEudC50Y21fcGFyZW50KSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJFcnJvcjogXCJpbmdyZXNzXCIgaXMgYSBkdXBsaWNhdGUgcGFyZW50IElEXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlyZXEudC50Y21fcGFyZW50ID0gVENfSF9JTkdSRVNTOworCQkJc3RybmNweShrLCAiaW5ncmVzcyIsIHNpemVvZihrKSAtIDEpOworCQkJcSA9IGdldF9xZGlzY19raW5kKGspOworCQkJcmVxLnQudGNtX2hhbmRsZSA9IFRDX0hfTUFLRShUQ19IX0lOR1JFU1MsIDApOworCQkJTkVYVF9BUkdfRldEKCk7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJwYXJlbnQiKSA9PSAwKSB7CisJCQlfX3UzMiBoYW5kbGU7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHJlcS50LnRjbV9wYXJlbnQpCisJCQkJZHVwYXJnKCJwYXJlbnQiLCAqYXJndik7CisJCQlpZiAoZ2V0X3RjX2NsYXNzaWQoJmhhbmRsZSwgKmFyZ3YpKQorCQkJCWludmFyZygiaW52YWxpZCBwYXJlbnQgSUQiLCAqYXJndik7CisJCQlyZXEudC50Y21fcGFyZW50ID0gaGFuZGxlOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJlc3RpbWF0b3IiKSA9PSAwKSB7CisJCQlpZiAocGFyc2VfZXN0aW1hdG9yKCZhcmdjLCAmYXJndiwgJmVzdCkpCisJCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJzdGFiIikgPT0gMCkgeworCQkJaWYgKHBhcnNlX3NpemVfdGFibGUoJmFyZ2MsICZhcmd2LCAmc3RhYi5zem9wdHMpIDwgMCkKKwkJCQlyZXR1cm4gLTE7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiaGVscCIpID09IDApIHsKKwkJCXVzYWdlKCk7CisJCX0gZWxzZSB7CisJCQlzdHJuY3B5KGssICphcmd2LCBzaXplb2YoayktMSk7CisKKwkJCXEgPSBnZXRfcWRpc2Nfa2luZChrKTsKKwkJCWFyZ2MtLTsgYXJndisrOworCQkJYnJlYWs7CisJCX0KKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJaWYgKGtbMF0pCisJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBUQ0FfS0lORCwgaywgc3RybGVuKGspKzEpOworCWlmIChlc3QuZXdtYV9sb2cpCisJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBUQ0FfUkFURSwgJmVzdCwgc2l6ZW9mKGVzdCkpOworCisJaWYgKHEpIHsKKwkJaWYgKHEtPnBhcnNlX3FvcHQpIHsKKwkJCWlmIChxLT5wYXJzZV9xb3B0KHEsIGFyZ2MsIGFyZ3YsICZyZXEubikpCisJCQkJcmV0dXJuIDE7CisJCX0gZWxzZSBpZiAoYXJnYykgeworCQkJZnByaW50ZihzdGRlcnIsICJxZGlzYyAnJXMnIGRvZXMgbm90IHN1cHBvcnQgb3B0aW9uIHBhcnNpbmdcbiIsIGspOworCQkJcmV0dXJuIC0xOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGFyZ2MpIHsKKwkJCWlmIChtYXRjaGVzKCphcmd2LCAiaGVscCIpID09IDApCisJCQkJdXNhZ2UoKTsKKworCQkJZnByaW50ZihzdGRlcnIsICJHYXJiYWdlIGluc3RlYWQgb2YgYXJndW1lbnRzIFwiJXMgLi4uXCIuIFRyeSBcInRjIHFkaXNjIGhlbHBcIi5cbiIsICphcmd2KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWlmIChjaGVja19zaXplX3RhYmxlX29wdHMoJnN0YWIuc3pvcHRzKSkgeworCQlzdHJ1Y3QgcnRhdHRyICp0YWlsOworCisJCWlmICh0Y19jYWxjX3NpemVfdGFibGUoJnN0YWIuc3pvcHRzLCAmc3RhYi5kYXRhKSA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIGNhbGN1bGF0ZSBzaXplIHRhYmxlLlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQl0YWlsID0gTkxNU0dfVEFJTCgmcmVxLm4pOworCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgVENBX1NUQUIsIE5VTEwsIDApOworCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgVENBX1NUQUJfQkFTRSwgJnN0YWIuc3pvcHRzLAorCQkJICBzaXplb2Yoc3RhYi5zem9wdHMpKTsKKwkJaWYgKHN0YWIuZGF0YSkKKwkJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBUQ0FfU1RBQl9EQVRBLCBzdGFiLmRhdGEsCisJCQkJICBzdGFiLnN6b3B0cy50c2l6ZSAqIHNpemVvZihfX3UxNikpOworCQl0YWlsLT5ydGFfbGVuID0gKHZvaWQgKilOTE1TR19UQUlMKCZyZXEubikgLSAodm9pZCAqKXRhaWw7CisJCWlmIChzdGFiLmRhdGEpCisJCQlmcmVlKHN0YWIuZGF0YSk7CisJfQorCisJaWYgKGRbMF0pICB7CisJCWludCBpZHg7CisKKwkJbGxfaW5pdF9tYXAoJnJ0aCk7CisKKwkJaWYgKChpZHggPSBsbF9uYW1lX3RvX2luZGV4KGQpKSA9PSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBmaW5kIGRldmljZSBcIiVzXCJcbiIsIGQpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcmVxLnQudGNtX2lmaW5kZXggPSBpZHg7CisJfQorCisJaWYgKHJ0bmxfdGFsaygmcnRoLCAmcmVxLm4sIE5VTEwsIDApIDwgMCkKKwkJcmV0dXJuIDI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfaWZpbmRleDsKKworaW50IHByaW50X3FkaXNjKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLAorCQkgICAgICAgc3RydWN0IG5sbXNnaGRyICpuLAorCQkgICAgICAgdm9pZCAqYXJnKQoreworCUZJTEUgKmZwID0gKEZJTEUqKWFyZzsKKwlzdHJ1Y3QgdGNtc2cgKnQgPSBOTE1TR19EQVRBKG4pOworCWludCBsZW4gPSBuLT5ubG1zZ19sZW47CisJc3RydWN0IHJ0YXR0ciAqIHRiW1RDQV9NQVgrMV07CisJc3RydWN0IHFkaXNjX3V0aWwgKnE7CisJY2hhciBhYnVmWzI1Nl07CisKKwlpZiAobi0+bmxtc2dfdHlwZSAhPSBSVE1fTkVXUURJU0MgJiYgbi0+bmxtc2dfdHlwZSAhPSBSVE1fREVMUURJU0MpIHsKKwkJZnByaW50ZihzdGRlcnIsICJOb3QgYSBxZGlzY1xuIik7CisJCXJldHVybiAwOworCX0KKwlsZW4gLT0gTkxNU0dfTEVOR1RIKHNpemVvZigqdCkpOworCWlmIChsZW4gPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiV3JvbmcgbGVuICVkXG4iLCBsZW4pOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGZpbHRlcl9pZmluZGV4ICYmIGZpbHRlcl9pZmluZGV4ICE9IHQtPnRjbV9pZmluZGV4KQorCQlyZXR1cm4gMDsKKworCW1lbXNldCh0YiwgMCwgc2l6ZW9mKHRiKSk7CisJcGFyc2VfcnRhdHRyKHRiLCBUQ0FfTUFYLCBUQ0FfUlRBKHQpLCBsZW4pOworCisJaWYgKHRiW1RDQV9LSU5EXSA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAicHJpbnRfcWRpc2M6IE5VTEwga2luZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAobi0+bmxtc2dfdHlwZSA9PSBSVE1fREVMUURJU0MpCisJCWZwcmludGYoZnAsICJkZWxldGVkICIpOworCisJZnByaW50ZihmcCwgInFkaXNjICVzICV4OiAiLCBydGFfZ2V0YXR0cl9zdHIodGJbVENBX0tJTkRdKSwgdC0+dGNtX2hhbmRsZT4+MTYpOworCWlmIChmaWx0ZXJfaWZpbmRleCA9PSAwKQorCQlmcHJpbnRmKGZwLCAiZGV2ICVzICIsIGxsX2luZGV4X3RvX25hbWUodC0+dGNtX2lmaW5kZXgpKTsKKwlpZiAodC0+dGNtX3BhcmVudCA9PSBUQ19IX1JPT1QpCisJCWZwcmludGYoZnAsICJyb290ICIpOworCWVsc2UgaWYgKHQtPnRjbV9wYXJlbnQpIHsKKwkJcHJpbnRfdGNfY2xhc3NpZChhYnVmLCBzaXplb2YoYWJ1ZiksIHQtPnRjbV9wYXJlbnQpOworCQlmcHJpbnRmKGZwLCAicGFyZW50ICVzICIsIGFidWYpOworCX0KKwlpZiAodC0+dGNtX2luZm8gIT0gMSkgeworCQlmcHJpbnRmKGZwLCAicmVmY250ICVkICIsIHQtPnRjbV9pbmZvKTsKKwl9CisJLyogcGZpZm9fZmFzdCBpcyBnZW5lcmljIGVub3VnaCB0byB3YXJyYW50IHRoZSBoYXJkY29kaW5nIC0tSkhTICovCisKKwlpZiAoMCA9PSBzdHJjbXAoInBmaWZvX2Zhc3QiLCBSVEFfREFUQSh0YltUQ0FfS0lORF0pKSkKKwkJcSA9IGdldF9xZGlzY19raW5kKCJwcmlvIik7CisJZWxzZQorCQlxID0gZ2V0X3FkaXNjX2tpbmQoUlRBX0RBVEEodGJbVENBX0tJTkRdKSk7CisKKwlpZiAodGJbVENBX09QVElPTlNdKSB7CisJCWlmIChxKQorCQkJcS0+cHJpbnRfcW9wdChxLCBmcCwgdGJbVENBX09QVElPTlNdKTsKKwkJZWxzZQorCQkJZnByaW50ZihmcCwgIltjYW5ub3QgcGFyc2UgcWRpc2MgcGFyYW1ldGVyc10iKTsKKwl9CisJZnByaW50ZihmcCwgIlxuIik7CisJaWYgKHNob3dfZGV0YWlscyAmJiB0YltUQ0FfU1RBQl0pIHsKKwkJcHJpbnRfc2l6ZV90YWJsZShmcCwgIiAiLCB0YltUQ0FfU1RBQl0pOworCQlmcHJpbnRmKGZwLCAiXG4iKTsKKwl9CisJaWYgKHNob3dfc3RhdHMpIHsKKwkJc3RydWN0IHJ0YXR0ciAqeHN0YXRzID0gTlVMTDsKKworCQlpZiAodGJbVENBX1NUQVRTXSB8fCB0YltUQ0FfU1RBVFMyXSB8fCB0YltUQ0FfWFNUQVRTXSkgeworCQkJcHJpbnRfdGNzdGF0c19hdHRyKGZwLCB0YiwgIiAiLCAmeHN0YXRzKTsKKwkJCWZwcmludGYoZnAsICJcbiIpOworCQl9CisKKwkJaWYgKHEgJiYgeHN0YXRzICYmIHEtPnByaW50X3hzdGF0cykgeworCQkJcS0+cHJpbnRfeHN0YXRzKHEsIGZwLCB4c3RhdHMpOworCQkJZnByaW50ZihmcCwgIlxuIik7CisJCX0KKwl9CisJZmZsdXNoKGZwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0Y19xZGlzY19saXN0KGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgdGNtc2cgdDsKKwljaGFyIGRbMTZdOworCisJbWVtc2V0KCZ0LCAwLCBzaXplb2YodCkpOworCXQudGNtX2ZhbWlseSA9IEFGX1VOU1BFQzsKKwltZW1zZXQoJmQsIDAsIHNpemVvZihkKSk7CisKKwl3aGlsZSAoYXJnYyA+IDApIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgImRldiIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlzdHJuY3B5KGQsICphcmd2LCBzaXplb2YoZCktMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJpbmdyZXNzIikgPT0gMCB8fAorCQkJICAgc3RyY21wKCphcmd2LCAiY2xzYWN0IikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC50Y21fcGFyZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJEdXBsaWNhdGUgcGFyZW50IElEXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudGNtX3BhcmVudCA9IFRDX0hfSU5HUkVTUzsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiaGVscCIpID09IDApIHsKKwkJCXVzYWdlKCk7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIldoYXQgaXMgXCIlc1wiPyBUcnkgXCJ0YyBxZGlzYyBoZWxwXCIuXG4iLCAqYXJndik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisKKwlsbF9pbml0X21hcCgmcnRoKTsKKworCWlmIChkWzBdKSB7CisJCWlmICgodC50Y21faWZpbmRleCA9IGxsX25hbWVfdG9faW5kZXgoZCkpID09IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IGZpbmQgZGV2aWNlIFwiJXNcIlxuIiwgZCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlmaWx0ZXJfaWZpbmRleCA9IHQudGNtX2lmaW5kZXg7CisJfQorCisJaWYgKHJ0bmxfZHVtcF9yZXF1ZXN0KCZydGgsIFJUTV9HRVRRRElTQywgJnQsIHNpemVvZih0KSkgPCAwKSB7CisJCXBlcnJvcigiQ2Fubm90IHNlbmQgZHVtcCByZXF1ZXN0Iik7CisJCXJldHVybiAxOworCX0KKworCWlmIChydG5sX2R1bXBfZmlsdGVyKCZydGgsIHByaW50X3FkaXNjLCBzdGRvdXQpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkR1bXAgdGVybWluYXRlZFxuIik7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgZG9fcWRpc2MoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWlmIChhcmdjIDwgMSkKKwkJcmV0dXJuIHRjX3FkaXNjX2xpc3QoMCwgTlVMTCk7CisJaWYgKG1hdGNoZXMoKmFyZ3YsICJhZGQiKSA9PSAwKQorCQlyZXR1cm4gdGNfcWRpc2NfbW9kaWZ5KFJUTV9ORVdRRElTQywgTkxNX0ZfRVhDTHxOTE1fRl9DUkVBVEUsIGFyZ2MtMSwgYXJndisxKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgImNoYW5nZSIpID09IDApCisJCXJldHVybiB0Y19xZGlzY19tb2RpZnkoUlRNX05FV1FESVNDLCAwLCBhcmdjLTEsIGFyZ3YrMSk7CisJaWYgKG1hdGNoZXMoKmFyZ3YsICJyZXBsYWNlIikgPT0gMCkKKwkJcmV0dXJuIHRjX3FkaXNjX21vZGlmeShSVE1fTkVXUURJU0MsIE5MTV9GX0NSRUFURXxOTE1fRl9SRVBMQUNFLCBhcmdjLTEsIGFyZ3YrMSk7CisJaWYgKG1hdGNoZXMoKmFyZ3YsICJsaW5rIikgPT0gMCkKKwkJcmV0dXJuIHRjX3FkaXNjX21vZGlmeShSVE1fTkVXUURJU0MsIE5MTV9GX1JFUExBQ0UsIGFyZ2MtMSwgYXJndisxKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgImRlbGV0ZSIpID09IDApCisJCXJldHVybiB0Y19xZGlzY19tb2RpZnkoUlRNX0RFTFFESVNDLCAwLCAgYXJnYy0xLCBhcmd2KzEpOworI2lmIDAKKwlpZiAobWF0Y2hlcygqYXJndiwgImdldCIpID09IDApCisJCXJldHVybiB0Y19xZGlzY19nZXQoUlRNX0dFVFFESVNDLCAwLCAgYXJnYy0xLCBhcmd2KzEpOworI2VuZGlmCisJaWYgKG1hdGNoZXMoKmFyZ3YsICJsaXN0IikgPT0gMCB8fCBtYXRjaGVzKCphcmd2LCAic2hvdyIpID09IDAKKwkgICAgfHwgbWF0Y2hlcygqYXJndiwgImxzdCIpID09IDApCisJCXJldHVybiB0Y19xZGlzY19saXN0KGFyZ2MtMSwgYXJndisxKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKSB7CisJCXVzYWdlKCk7CisJCXJldHVybiAwOworICAgICAgICB9CisJZnByaW50ZihzdGRlcnIsICJDb21tYW5kIFwiJXNcIiBpcyB1bmtub3duLCB0cnkgXCJ0YyBxZGlzYyBoZWxwXCIuXG4iLCAqYXJndik7CisJcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvdGNfcmVkLmMgYi9pcHJvdXRlMi90Yy90Y19yZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWE4M2JkCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGMvdGNfcmVkLmMKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIHRjX3JlZC5jCQlSRUQgbWFpbnRhbmFuY2Ugcm91dGluZXMuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAidGNfY29yZS5oIgorI2luY2x1ZGUgInRjX3JlZC5oIgorCisvKgorICAgUGxvZyA9IGxvZyhwcm9iLyhxbWF4IC0gcW1pbikpCisgKi8KK2ludCB0Y19yZWRfZXZhbF9QKHVuc2lnbmVkIHFtaW4sIHVuc2lnbmVkIHFtYXgsIGRvdWJsZSBwcm9iKQoreworCWludCBpID0gcW1heCAtIHFtaW47CisKKwlpZiAoaSA8PSAwKQorCQlyZXR1cm4gLTE7CisKKwlwcm9iIC89IGk7CisKKwlmb3IgKGk9MDsgaTwzMjsgaSsrKSB7CisJCWlmIChwcm9iID4gMS4wKQorCQkJYnJlYWs7CisJCXByb2IgKj0gMjsKKwl9CisJaWYgKGk+PTMyKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIGk7Cit9CisKKy8qCisgICBidXJzdCArIDEgLSBxbWluL2F2cGt0IDwgKDEtKDEtVyleYnVyc3QpL1cKKyAqLworCitpbnQgdGNfcmVkX2V2YWxfZXdtYSh1bnNpZ25lZCBxbWluLCB1bnNpZ25lZCBidXJzdCwgdW5zaWduZWQgYXZwa3QpCit7CisJaW50IHdsb2cgPSAxOworCWRvdWJsZSBXID0gMC41OworCWRvdWJsZSBhID0gKGRvdWJsZSlidXJzdCArIDEgLSAoZG91YmxlKXFtaW4vYXZwa3Q7CisKKwlpZiAoYSA8IDEuMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInRjX3JlZF9ldmFsX2V3bWEoKSBidXJzdCAldSBpcyB0b28gc21hbGwgPyIKKwkJCQkiIFRyeSBidXJzdCAldVxuIiwgYnVyc3QsIDEgKyBxbWluL2F2cGt0KTsKKwkJcmV0dXJuIC0xOworCX0KKwlmb3IgKHdsb2c9MTsgd2xvZzwzMjsgd2xvZysrLCBXIC89IDIpIHsKKwkJaWYgKGEgPD0gKDEgLSBwb3coMS1XLCBidXJzdCkpL1cpCisJCQlyZXR1cm4gd2xvZzsKKwl9CisJcmV0dXJuIC0xOworfQorCisvKgorICAgU3RhYlt0Pj5TY2VsbF9sb2ddID0gLWxvZygxLVcpICogdC94bWl0X3RpbWUKKyAqLworCitpbnQgdGNfcmVkX2V2YWxfaWRsZV9kYW1waW5nKGludCBXbG9nLCB1bnNpZ25lZCBhdnBrdCwgdW5zaWduZWQgYnBzLCBfX3U4ICpzYnVmKQoreworCWRvdWJsZSB4bWl0X3RpbWUgPSB0Y19jYWxjX3htaXR0aW1lKGJwcywgYXZwa3QpOworCWRvdWJsZSBsVyA9IC1sb2coMS4wIC0gMS4wLygxPDxXbG9nKSkveG1pdF90aW1lOworCWRvdWJsZSBtYXh0aW1lID0gMzEvbFc7CisJaW50IGNsb2c7CisJaW50IGk7CisKKwlmb3IgKGNsb2c9MDsgY2xvZzwzMjsgY2xvZysrKSB7CisJCWlmIChtYXh0aW1lLygxPDxjbG9nKSA8IDUxMikKKwkJCWJyZWFrOworCX0KKwlpZiAoY2xvZyA+PSAzMikKKwkJcmV0dXJuIC0xOworCisJc2J1ZlswXSA9IDA7CisJZm9yIChpPTE7IGk8MjU1OyBpKyspIHsKKwkJc2J1ZltpXSA9IChpPDxjbG9nKSpsVzsKKwkJaWYgKHNidWZbaV0gPiAzMSkKKwkJCXNidWZbaV0gPSAzMTsKKwl9CisJc2J1ZlsyNTVdID0gMzE7CisJcmV0dXJuIGNsb2c7Cit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90Yy90Y19yZWQuaCBiL2lwcm91dGUyL3RjL3RjX3JlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNmIwOWUKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy90Y19yZWQuaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgX1RDX1JFRF9IXworI2RlZmluZSBfVENfUkVEX0hfIDEKKworZXh0ZXJuIGludCB0Y19yZWRfZXZhbF9QKHVuc2lnbmVkIHFtaW4sIHVuc2lnbmVkIHFtYXgsIGRvdWJsZSBwcm9iKTsKK2V4dGVybiBpbnQgdGNfcmVkX2V2YWxfZXdtYSh1bnNpZ25lZCBxbWluLCB1bnNpZ25lZCBidXJzdCwgdW5zaWduZWQgYXZwa3QpOworZXh0ZXJuIGludCB0Y19yZWRfZXZhbF9pZGxlX2RhbXBpbmcoaW50IHdsb2csIHVuc2lnbmVkIGF2cGt0LCB1bnNpZ25lZCBiYW5kd2lkdGgsIF9fdTggKnNidWYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RjL3RjX3N0YWIuYyBiL2lwcm91dGUyL3RjL3RjX3N0YWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmE4YWU4Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGMvdGNfc3RhYi5jCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogdGNfc3RhYi5jCQkidGMgcWRpc2MgLi4uIHN0YWIgKiIuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJSnVzc2kgS2l2aWxpbm5hLCA8anVzc2kua2l2aWxpbm5hQG1ibmV0LmZpPgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0Y191dGlsLmgiCisjaW5jbHVkZSAidGNfY29yZS5oIgorI2luY2x1ZGUgInRjX2NvbW1vbi5oIgorCitzdGF0aWMgdm9pZCBzdGFiX2hlbHAodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwKKwkJIlVzYWdlOiAuLi4gc3RhYiBbIG10dSBCWVRFUyBdIFsgdHNpemUgU0xPVFMgXSBbIG1wdSBCWVRFUyBdIFxuIgorCQkiICAgICAgICAgICAgICAgIFsgb3ZlcmhlYWQgQllURVMgXSBbIGxpbmtsYXllciBUWVBFIF0gLi4uXG4iCisJCSIgICBtdHUgICAgICAgOiBtYXggcGFja2V0IHNpemUgd2UgY3JlYXRlIHJhdGUgbWFwIGZvciB7MjA0N31cbiIKKwkJIiAgIHRzaXplICAgICA6IGhvdyBtYW55IHNsb3RzIHNob3VsZCBzaXplIHRhYmxlIGhhdmUgezUxMn1cbiIKKwkJIiAgIG1wdSAgICAgICA6IG1pbmltdW0gcGFja2V0IHNpemUgdXNlZCBpbiByYXRlIGNvbXB1dGF0aW9uc1xuIgorCQkiICAgb3ZlcmhlYWQgIDogcGVyLXBhY2tldCBzaXplIG92ZXJoZWFkIHVzZWQgaW4gcmF0ZSBjb21wdXRhdGlvbnNcbiIKKwkJIiAgIGxpbmtsYXllciA6IGFkYXB0aW5nIHRvIGEgbGlua2xheWVyIGUuZy4gYXRtXG4iCisJCSJFeGFtcGxlOiAuLi4gc3RhYiBvdmVyaGVhZCAyMCBsaW5rbGF5ZXIgYXRtXG4iKTsKKworCXJldHVybjsKK30KKworaW50IGNoZWNrX3NpemVfdGFibGVfb3B0cyhzdHJ1Y3QgdGNfc2l6ZXNwZWMgKnMpCit7CisJcmV0dXJuIHMtPmxpbmtsYXllciA+PSBMSU5LTEFZRVJfRVRIRVJORVQgfHwgcy0+bXB1ICE9IDAgfHwKKwkJCQkJCQlzLT5vdmVyaGVhZCAhPSAwOworfQorCitpbnQgcGFyc2Vfc2l6ZV90YWJsZShpbnQgKmFyZ2NwLCBjaGFyICoqKmFyZ3ZwLCBzdHJ1Y3QgdGNfc2l6ZXNwZWMgKnNwKQoreworCWNoYXIgKiphcmd2ID0gKmFyZ3ZwOworCWludCBhcmdjID0gKmFyZ2NwOworCXN0cnVjdCB0Y19zaXplc3BlYyBzOworCisJbWVtc2V0KCZzLCAwLCBzaXplb2YocykpOworCisJTkVYVF9BUkcoKTsKKwlpZiAobWF0Y2hlcygqYXJndiwgImhlbHAiKSA9PSAwKSB7CisJCXN0YWJfaGVscCgpOworCQlyZXR1cm4gLTE7CisJfQorCXdoaWxlIChhcmdjID4gMCkgeworCQlpZiAobWF0Y2hlcygqYXJndiwgIm10dSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocy5tdHUpCisJCQkJZHVwYXJnKCJtdHUiLCAqYXJndik7CisJCQlpZiAoZ2V0X3UzMigmcy5tdHUsICphcmd2LCAxMCkpCisJCQkJaW52YXJnKCJtdHUiLCAiaW52YWxpZCBtdHUiKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAibXB1IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChzLm1wdSkKKwkJCQlkdXBhcmcoIm1wdSIsICphcmd2KTsKKwkJCWlmIChnZXRfdTMyKCZzLm1wdSwgKmFyZ3YsIDEwKSkKKwkJCQlpbnZhcmcoIm1wdSIsICJpbnZhbGlkIG1wdSIpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJvdmVyaGVhZCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocy5vdmVyaGVhZCkKKwkJCQlkdXBhcmcoIm92ZXJoZWFkIiwgKmFyZ3YpOworCQkJaWYgKGdldF9pbnRlZ2VyKCZzLm92ZXJoZWFkLCAqYXJndiwgMTApKQorCQkJCWludmFyZygib3ZlcmhlYWQiLCAiaW52YWxpZCBvdmVyaGVhZCIpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJ0c2l6ZSIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocy50c2l6ZSkKKwkJCQlkdXBhcmcoInRzaXplIiwgKmFyZ3YpOworCQkJaWYgKGdldF91MzIoJnMudHNpemUsICphcmd2LCAxMCkpCisJCQkJaW52YXJnKCJ0c2l6ZSIsICJpbnZhbGlkIHRhYmxlIHNpemUiKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAibGlua2xheWVyIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChzLmxpbmtsYXllciAhPSBMSU5LTEFZRVJfVU5TUEVDKQorCQkJCWR1cGFyZygibGlua2xheWVyIiwgKmFyZ3YpOworCQkJaWYgKGdldF9saW5rbGF5ZXIoJnMubGlua2xheWVyLCAqYXJndikpCisJCQkJaW52YXJnKCJsaW5rbGF5ZXIiLCAiaW52YWxpZCBsaW5rbGF5ZXIiKTsKKwkJfSBlbHNlCisJCQlicmVhazsKKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJaWYgKCFjaGVja19zaXplX3RhYmxlX29wdHMoJnMpKQorCQlyZXR1cm4gLTE7CisKKwkqc3AgPSBzOworCSphcmd2cCA9IGFyZ3Y7CisJKmFyZ2NwID0gYXJnYzsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBwcmludF9zaXplX3RhYmxlKEZJTEUgKmZwLCBjb25zdCBjaGFyICpwcmVmaXgsIHN0cnVjdCBydGF0dHIgKnJ0YSkKK3sKKwlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfU1RBQl9NQVggKyAxXTsKKwlTUFJJTlRfQlVGKGIxKTsKKworCXBhcnNlX3J0YXR0cl9uZXN0ZWQodGIsIFRDQV9TVEFCX01BWCwgcnRhKTsKKworCWlmICh0YltUQ0FfU1RBQl9CQVNFXSkgeworCQlzdHJ1Y3QgdGNfc2l6ZXNwZWMgcyA9IHswfTsKKwkJbWVtY3B5KCZzLCBSVEFfREFUQSh0YltUQ0FfU1RBQl9CQVNFXSksCisJCQkJTUlOKFJUQV9QQVlMT0FEKHRiW1RDQV9TVEFCX0JBU0VdKSwgc2l6ZW9mKHMpKSk7CisKKwkJZnByaW50ZihmcCwgIiVzIiwgcHJlZml4KTsKKwkJaWYgKHMubGlua2xheWVyKQorCQkJZnByaW50ZihmcCwgImxpbmtsYXllciAlcyAiLAorCQkJCQlzcHJpbnRfbGlua2xheWVyKHMubGlua2xheWVyLCBiMSkpOworCQlpZiAocy5vdmVyaGVhZCkKKwkJCWZwcmludGYoZnAsICJvdmVyaGVhZCAlZCAiLCBzLm92ZXJoZWFkKTsKKwkJaWYgKHMubXB1KQorCQkJZnByaW50ZihmcCwgIm1wdSAldSAiLCBzLm1wdSk7CisJCWlmIChzLm10dSkKKwkJCWZwcmludGYoZnAsICJtdHUgJXUgIiwgcy5tdHUpOworCQlpZiAocy50c2l6ZSkKKwkJCWZwcmludGYoZnAsICJ0c2l6ZSAldSAiLCBzLnRzaXplKTsKKwl9CisKKyNpZiAwCisJaWYgKHRiW1RDQV9TVEFCX0RBVEFdKSB7CisJCXVuc2lnbmVkIGksIGosIGRsZW47CisJCV9fdTE2ICpkYXRhID0gUlRBX0RBVEEodGJbVENBX1NUQUJfREFUQV0pOworCQlkbGVuID0gUlRBX1BBWUxPQUQodGJbVENBX1NUQUJfREFUQV0pIC8gc2l6ZW9mKF9fdTE2KTsKKworCQlmcHJpbnRmKGZwLCAiXG4lc3N0YWIgZGF0YToiLCBwcmVmaXgpOworCQlmb3IgKGkgPSAwOyBpIDwgZGxlbi8xMjsgaSsrKSB7CisJCQlmcHJpbnRmKGZwLCAiXG4lcyAlM3U6IiwgcHJlZml4LCBpICogMTIpOworCQkJZm9yIChqID0gMDsgaSAqIDEyICsgaiA8IGRsZW47IGorKykKKwkJCQlmcHJpbnRmKGZwLCAiICUwNXgiLCBkYXRhW2kgKiAxMiArIGpdKTsKKwkJfQorCX0KKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvdGNfdXRpbC5jIGIvaXByb3V0ZTIvdGMvdGNfdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NjRlY2MKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy90Y191dGlsLmMKQEAgLTAsMCArMSw2MTAgQEAKKy8qCisgKiB0Y191dGlsLmMJCU1pc2MgVEMgdXRpbGl0eSBmdW5jdGlvbnMuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgIm5hbWVzLmgiCisjaW5jbHVkZSAidGNfdXRpbC5oIgorI2luY2x1ZGUgInRjX2NvbW1vbi5oIgorCisjaWZuZGVmIExJQkRJUgorI2RlZmluZSBMSUJESVIgIi91c3IvbGliIgorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgZGJfbmFtZXMgKmNsc19uYW1lcyA9IE5VTEw7CisKKyNkZWZpbmUgTkFNRVNfREIgIi9ldGMvaXByb3V0ZTIvdGNfY2xzIgorCitpbnQgY2xzX25hbWVzX2luaXQoY2hhciAqcGF0aCkKK3sKKwlpbnQgcmV0OworCisJY2xzX25hbWVzID0gZGJfbmFtZXNfYWxsb2MoKTsKKwlpZiAoIWNsc19uYW1lcykKKwkJcmV0dXJuIC0xOworCisJcmV0ID0gZGJfbmFtZXNfbG9hZChjbHNfbmFtZXMsIHBhdGggPzogTkFNRVNfREIpOworCWlmIChyZXQgPT0gLUVOT0VOVCAmJiBwYXRoKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ2FuJ3Qgb3BlbiBjbGFzcyBuYW1lcyBmaWxlOiAlc1xuIiwgcGF0aCk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHJldCkgeworCQlkYl9uYW1lc19mcmVlKGNsc19uYW1lcyk7CisJCWNsc19uYW1lcyA9IE5VTEw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xzX25hbWVzX3VuaW5pdCh2b2lkKQoreworCWRiX25hbWVzX2ZyZWUoY2xzX25hbWVzKTsKK30KKworY29uc3QgY2hhciAqZ2V0X3RjX2xpYih2b2lkKQoreworCWNvbnN0IGNoYXIgKmxpYl9kaXI7CisKKwlsaWJfZGlyID0gZ2V0ZW52KCJUQ19MSUJfRElSIik7CisJaWYgKCFsaWJfZGlyKQorCQlsaWJfZGlyID0gTElCRElSICIvdGMvIjsKKworCXJldHVybiBsaWJfZGlyOworfQorCitpbnQgZ2V0X3FkaXNjX2hhbmRsZShfX3UzMiAqaCwgY29uc3QgY2hhciAqc3RyKQoreworCV9fdTMyIG1hajsKKwljaGFyICpwOworCisJbWFqID0gVENfSF9VTlNQRUM7CisJaWYgKHN0cmNtcChzdHIsICJub25lIikgPT0gMCkKKwkJZ290byBvazsKKwltYWogPSBzdHJ0b3VsKHN0ciwgJnAsIDE2KTsKKwlpZiAocCA9PSBzdHIpCisJCXJldHVybiAtMTsKKwltYWogPDw9IDE2OworCWlmICgqcCAhPSAnOicgJiYgKnAhPTApCisJCXJldHVybiAtMTsKK29rOgorCSpoID0gbWFqOworCXJldHVybiAwOworfQorCitpbnQgZ2V0X3RjX2NsYXNzaWQoX191MzIgKmgsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlfX3UzMiBtYWosIG1pbjsKKwljaGFyICpwOworCisJbWFqID0gVENfSF9ST09UOworCWlmIChzdHJjbXAoc3RyLCAicm9vdCIpID09IDApCisJCWdvdG8gb2s7CisJbWFqID0gVENfSF9VTlNQRUM7CisJaWYgKHN0cmNtcChzdHIsICJub25lIikgPT0gMCkKKwkJZ290byBvazsKKwltYWogPSBzdHJ0b3VsKHN0ciwgJnAsIDE2KTsKKwlpZiAocCA9PSBzdHIpIHsKKwkJbWFqID0gMDsKKwkJaWYgKCpwICE9ICc6JykKKwkJCXJldHVybiAtMTsKKwl9CisJaWYgKCpwID09ICc6JykgeworCQlpZiAobWFqID49ICgxPDwxNikpCisJCQlyZXR1cm4gLTE7CisJCW1haiA8PD0gMTY7CisJCXN0ciA9IHArMTsKKwkJbWluID0gc3RydG91bChzdHIsICZwLCAxNik7CisJCWlmICgqcCAhPSAwKQorCQkJcmV0dXJuIC0xOworCQlpZiAobWluID49ICgxPDwxNikpCisJCQlyZXR1cm4gLTE7CisJCW1haiB8PSBtaW47CisJfSBlbHNlIGlmICgqcCAhPSAwKQorCQlyZXR1cm4gLTE7CisKK29rOgorCSpoID0gbWFqOworCXJldHVybiAwOworfQorCitpbnQgcHJpbnRfdGNfY2xhc3NpZChjaGFyICpidWYsIGludCBibGVuLCBfX3UzMiBoKQoreworCVNQUklOVF9CVUYoaGFuZGxlKSA9IHt9OworCWludCBobGVuID0gU1BSSU5UX0JTSVpFIC0gMTsKKworCWlmIChoID09IFRDX0hfUk9PVCkKKwkJc3ByaW50ZihoYW5kbGUsICJyb290Iik7CisJZWxzZSBpZiAoaCA9PSBUQ19IX1VOU1BFQykKKwkJc25wcmludGYoaGFuZGxlLCBobGVuLCAibm9uZSIpOworCWVsc2UgaWYgKFRDX0hfTUFKKGgpID09IDApCisJCXNucHJpbnRmKGhhbmRsZSwgaGxlbiwgIjoleCIsIFRDX0hfTUlOKGgpKTsKKwllbHNlIGlmIChUQ19IX01JTihoKSA9PSAwKQorCQlzbnByaW50ZihoYW5kbGUsIGhsZW4sICIleDoiLCBUQ19IX01BSihoKSA+PiAxNik7CisJZWxzZQorCQlzbnByaW50ZihoYW5kbGUsIGhsZW4sICIleDoleCIsIFRDX0hfTUFKKGgpID4+IDE2LCBUQ19IX01JTihoKSk7CisKKwlpZiAodXNlX25hbWVzKSB7CisJCWNoYXIgY2xuYW1lW0lETkFNRV9NQVhdID0ge307CisKKwkJaWYgKGlkX3RvX25hbWUoY2xzX25hbWVzLCBoLCBjbG5hbWUpKQorCQkJc25wcmludGYoYnVmLCBibGVuLCAiJXMjJXMiLCBjbG5hbWUsIGhhbmRsZSk7CisJCWVsc2UKKwkJCXNucHJpbnRmKGJ1ZiwgYmxlbiwgIiVzIiwgaGFuZGxlKTsKKwl9IGVsc2UgeworCQlzbnByaW50ZihidWYsIGJsZW4sICIlcyIsIGhhbmRsZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2NoYXIgKnNwcmludF90Y19jbGFzc2lkKF9fdTMyIGgsIGNoYXIgKmJ1ZikKK3sKKwlpZiAocHJpbnRfdGNfY2xhc3NpZChidWYsIFNQUklOVF9CU0laRS0xLCBoKSkKKwkJc3RyY3B5KGJ1ZiwgIj8/PyIpOworCXJldHVybiBidWY7Cit9CisKKy8qIFNlZSBodHRwOi8vcGh5c2ljcy5uaXN0Lmdvdi9jdXUvVW5pdHMvYmluYXJ5Lmh0bWwgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmF0ZV9zdWZmaXggeworCWNvbnN0IGNoYXIgKm5hbWU7CisJZG91YmxlIHNjYWxlOworfSBzdWZmaXhlc1tdID0geworCXsgImJpdCIsCTEuIH0sCisJeyAiS2liaXQiLAkxMDI0LiB9LAorCXsgImtiaXQiLAkxMDAwLiB9LAorCXsgIm1pYml0IiwJMTAyNC4qMTAyNC4gfSwKKwl7ICJtYml0IiwJMTAwMDAwMC4gfSwKKwl7ICJnaWJpdCIsCTEwMjQuKjEwMjQuKjEwMjQuIH0sCisJeyAiZ2JpdCIsCTEwMDAwMDAwMDAuIH0sCisJeyAidGliaXQiLAkxMDI0LioxMDI0LioxMDI0LioxMDI0LiB9LAorCXsgInRiaXQiLAkxMDAwMDAwMDAwMDAwLiB9LAorCXsgIkJwcyIsCTguIH0sCisJeyAiS2lCcHMiLAk4LioxMDI0LiB9LAorCXsgIktCcHMiLAk4MDAwLiB9LAorCXsgIk1pQnBzIiwJOC4qMTAyNCoxMDI0LiB9LAorCXsgIk1CcHMiLAk4MDAwMDAwLiB9LAorCXsgIkdpQnBzIiwJOC4qMTAyNC4qMTAyNC4qMTAyNC4gfSwKKwl7ICJHQnBzIiwJODAwMDAwMDAwMC4gfSwKKwl7ICJUaUJwcyIsCTguKjEwMjQuKjEwMjQuKjEwMjQuKjEwMjQuIH0sCisJeyAiVEJwcyIsCTgwMDAwMDAwMDAwMDAuIH0sCisJeyBOVUxMIH0KK307CisKKworaW50IGdldF9yYXRlKHVuc2lnbmVkICpyYXRlLCBjb25zdCBjaGFyICpzdHIpCit7CisJY2hhciAqcDsKKwlkb3VibGUgYnBzID0gc3RydG9kKHN0ciwgJnApOworCWNvbnN0IHN0cnVjdCByYXRlX3N1ZmZpeCAqczsKKworCWlmIChwID09IHN0cikKKwkJcmV0dXJuIC0xOworCisJZm9yIChzID0gc3VmZml4ZXM7IHMtPm5hbWU7ICsrcykgeworCQlpZiAoc3RyY2FzZWNtcChzLT5uYW1lLCBwKSA9PSAwKSB7CisJCQlicHMgKj0gcy0+c2NhbGU7CisJCQlwICs9IHN0cmxlbihwKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCpwKQorCQlyZXR1cm4gLTE7IC8qIHVua25vd24gc3VmZml4ICovCisKKwlicHMgLz0gODsgLyogLT4gYnl0ZXMgcGVyIHNlY29uZCAqLworCSpyYXRlID0gYnBzOworCS8qIGRldGVjdCBpZiBhbiBvdmVyZmxvdyBoYXBwZW5lZCAqLworCWlmICgqcmF0ZSAhPSBmbG9vcihicHMpKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBnZXRfcmF0ZTY0KF9fdTY0ICpyYXRlLCBjb25zdCBjaGFyICpzdHIpCit7CisJY2hhciAqcDsKKwlkb3VibGUgYnBzID0gc3RydG9kKHN0ciwgJnApOworCWNvbnN0IHN0cnVjdCByYXRlX3N1ZmZpeCAqczsKKworCWlmIChwID09IHN0cikKKwkJcmV0dXJuIC0xOworCisJZm9yIChzID0gc3VmZml4ZXM7IHMtPm5hbWU7ICsrcykgeworCQlpZiAoc3RyY2FzZWNtcChzLT5uYW1lLCBwKSA9PSAwKSB7CisJCQlicHMgKj0gcy0+c2NhbGU7CisJCQlwICs9IHN0cmxlbihwKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCpwKQorCQlyZXR1cm4gLTE7IC8qIHVua25vd24gc3VmZml4ICovCisKKwlicHMgLz0gODsgLyogLT4gYnl0ZXMgcGVyIHNlY29uZCAqLworCSpyYXRlID0gYnBzOworCXJldHVybiAwOworfQorCit2b2lkIHByaW50X3JhdGUoY2hhciAqYnVmLCBpbnQgbGVuLCBfX3U2NCByYXRlKQoreworCWV4dGVybiBpbnQgdXNlX2llYzsKKwl1bnNpZ25lZCBsb25nIGtpbG8gPSB1c2VfaWVjID8gMTAyNCA6IDEwMDA7CisJY29uc3QgY2hhciAqc3RyID0gdXNlX2llYyA/ICJpIiA6ICIiOworCXN0YXRpYyBjaGFyICp1bml0c1s1XSA9IHsiIiwgIksiLCAiTSIsICJHIiwgIlQifTsKKwlpbnQgaTsKKworCXJhdGUgPDw9IDM7IC8qIGJ5dGVzL3NlYyAtPiBiaXRzL3NlYyAqLworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodW5pdHMpIC0gMTsgaSsrKSAgeworCQlpZiAocmF0ZSA8IGtpbG8pCisJCQlicmVhazsKKwkJaWYgKCgocmF0ZSAlIGtpbG8pICE9IDApICYmIHJhdGUgPCAxMDAwKmtpbG8pCisJCQlicmVhazsKKwkJcmF0ZSAvPSBraWxvOworCX0KKworCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJS4wZiVzJXNiaXQiLCAoZG91YmxlKXJhdGUsIHVuaXRzW2ldLCBzdHIpOworfQorCitjaGFyICogc3ByaW50X3JhdGUoX191NjQgcmF0ZSwgY2hhciAqYnVmKQoreworCXByaW50X3JhdGUoYnVmLCBTUFJJTlRfQlNJWkUtMSwgcmF0ZSk7CisJcmV0dXJuIGJ1ZjsKK30KKworaW50IGdldF90aW1lKHVuc2lnbmVkICp0aW1lLCBjb25zdCBjaGFyICpzdHIpCit7CisJZG91YmxlIHQ7CisJY2hhciAqcDsKKworCXQgPSBzdHJ0b2Qoc3RyLCAmcCk7CisJaWYgKHAgPT0gc3RyKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoKnApIHsKKwkJaWYgKHN0cmNhc2VjbXAocCwgInMiKSA9PSAwIHx8IHN0cmNhc2VjbXAocCwgInNlYyIpPT0wIHx8CisJCSAgICBzdHJjYXNlY21wKHAsICJzZWNzIik9PTApCisJCQl0ICo9IFRJTUVfVU5JVFNfUEVSX1NFQzsKKwkJZWxzZSBpZiAoc3RyY2FzZWNtcChwLCAibXMiKSA9PSAwIHx8IHN0cmNhc2VjbXAocCwgIm1zZWMiKT09MCB8fAorCQkJIHN0cmNhc2VjbXAocCwgIm1zZWNzIikgPT0gMCkKKwkJCXQgKj0gVElNRV9VTklUU19QRVJfU0VDLzEwMDA7CisJCWVsc2UgaWYgKHN0cmNhc2VjbXAocCwgInVzIikgPT0gMCB8fCBzdHJjYXNlY21wKHAsICJ1c2VjIik9PTAgfHwKKwkJCSBzdHJjYXNlY21wKHAsICJ1c2VjcyIpID09IDApCisJCQl0ICo9IFRJTUVfVU5JVFNfUEVSX1NFQy8xMDAwMDAwOworCQllbHNlCisJCQlyZXR1cm4gLTE7CisJfQorCisJKnRpbWUgPSB0OworCXJldHVybiAwOworfQorCisKK3ZvaWQgcHJpbnRfdGltZShjaGFyICpidWYsIGludCBsZW4sIF9fdTMyIHRpbWUpCit7CisJZG91YmxlIHRtcCA9IHRpbWU7CisKKwlpZiAodG1wID49IFRJTUVfVU5JVFNfUEVSX1NFQykKKwkJc25wcmludGYoYnVmLCBsZW4sICIlLjFmcyIsIHRtcC9USU1FX1VOSVRTX1BFUl9TRUMpOworCWVsc2UgaWYgKHRtcCA+PSBUSU1FX1VOSVRTX1BFUl9TRUMvMTAwMCkKKwkJc25wcmludGYoYnVmLCBsZW4sICIlLjFmbXMiLCB0bXAvKFRJTUVfVU5JVFNfUEVSX1NFQy8xMDAwKSk7CisJZWxzZQorCQlzbnByaW50ZihidWYsIGxlbiwgIiV1dXMiLCB0aW1lKTsKK30KKworY2hhciAqIHNwcmludF90aW1lKF9fdTMyIHRpbWUsIGNoYXIgKmJ1ZikKK3sKKwlwcmludF90aW1lKGJ1ZiwgU1BSSU5UX0JTSVpFLTEsIHRpbWUpOworCXJldHVybiBidWY7Cit9CisKK2NoYXIgKiBzcHJpbnRfdGlja3MoX191MzIgdGlja3MsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50X3RpbWUodGNfY29yZV90aWNrMnRpbWUodGlja3MpLCBidWYpOworfQorCitpbnQgZ2V0X3NpemUodW5zaWduZWQgKnNpemUsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlkb3VibGUgc3o7CisJY2hhciAqcDsKKworCXN6ID0gc3RydG9kKHN0ciwgJnApOworCWlmIChwID09IHN0cikKKwkJcmV0dXJuIC0xOworCisJaWYgKCpwKSB7CisJCWlmIChzdHJjYXNlY21wKHAsICJrYiIpID09IDAgfHwgc3RyY2FzZWNtcChwLCAiayIpPT0wKQorCQkJc3ogKj0gMTAyNDsKKwkJZWxzZSBpZiAoc3RyY2FzZWNtcChwLCAiZ2IiKSA9PSAwIHx8IHN0cmNhc2VjbXAocCwgImciKT09MCkKKwkJCXN6ICo9IDEwMjQqMTAyNCoxMDI0OworCQllbHNlIGlmIChzdHJjYXNlY21wKHAsICJnYml0IikgPT0gMCkKKwkJCXN6ICo9IDEwMjQqMTAyNCoxMDI0Lzg7CisJCWVsc2UgaWYgKHN0cmNhc2VjbXAocCwgIm1iIikgPT0gMCB8fCBzdHJjYXNlY21wKHAsICJtIik9PTApCisJCQlzeiAqPSAxMDI0KjEwMjQ7CisJCWVsc2UgaWYgKHN0cmNhc2VjbXAocCwgIm1iaXQiKSA9PSAwKQorCQkJc3ogKj0gMTAyNCoxMDI0Lzg7CisJCWVsc2UgaWYgKHN0cmNhc2VjbXAocCwgImtiaXQiKSA9PSAwKQorCQkJc3ogKj0gMTAyNC84OworCQllbHNlIGlmIChzdHJjYXNlY21wKHAsICJiIikgIT0gMCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwkqc2l6ZSA9IHN6OworCXJldHVybiAwOworfQorCitpbnQgZ2V0X3NpemVfYW5kX2NlbGwodW5zaWduZWQgKnNpemUsIGludCAqY2VsbF9sb2csIGNoYXIgKnN0cikKK3sKKwljaGFyICogc2xhc2ggPSBzdHJjaHIoc3RyLCAnLycpOworCisJaWYgKHNsYXNoKQorCQkqc2xhc2ggPSAwOworCisJaWYgKGdldF9zaXplKHNpemUsIHN0cikpCisJCXJldHVybiAtMTsKKworCWlmIChzbGFzaCkgeworCQlpbnQgY2VsbDsKKwkJaW50IGk7CisKKwkJaWYgKGdldF9pbnRlZ2VyKCZjZWxsLCBzbGFzaCsxLCAwKSkKKwkJCXJldHVybiAtMTsKKwkJKnNsYXNoID0gJy8nOworCisJCWZvciAoaT0wOyBpPDMyOyBpKyspIHsKKwkJCWlmICgoMTw8aSkgPT0gY2VsbCkgeworCQkJCSpjZWxsX2xvZyA9IGk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBwcmludF9zaXplKGNoYXIgKmJ1ZiwgaW50IGxlbiwgX191MzIgc3opCit7CisJZG91YmxlIHRtcCA9IHN6OworCisJaWYgKHN6ID49IDEwMjQqMTAyNCAmJiBmYWJzKDEwMjQqMTAyNCpyaW50KHRtcC8oMTAyNCoxMDI0KSkgLSBzeikgPCAxMDI0KQorCQlzbnByaW50ZihidWYsIGxlbiwgIiVnTWIiLCByaW50KHRtcC8oMTAyNCoxMDI0KSkpOworCWVsc2UgaWYgKHN6ID49IDEwMjQgJiYgZmFicygxMDI0KnJpbnQodG1wLzEwMjQpIC0gc3opIDwgMTYpCisJCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJWdLYiIsIHJpbnQodG1wLzEwMjQpKTsKKwllbHNlCisJCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJXViIiwgc3opOworfQorCitjaGFyICogc3ByaW50X3NpemUoX191MzIgc2l6ZSwgY2hhciAqYnVmKQoreworCXByaW50X3NpemUoYnVmLCBTUFJJTlRfQlNJWkUtMSwgc2l6ZSk7CisJcmV0dXJuIGJ1ZjsKK30KKwordm9pZCBwcmludF9xZGlzY19oYW5kbGUoY2hhciAqYnVmLCBpbnQgbGVuLCBfX3UzMiBoKQoreworCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJXg6IiwgVENfSF9NQUooaCk+PjE2KTsKK30KKworY2hhciAqIHNwcmludF9xZGlzY19oYW5kbGUoX191MzIgaCwgY2hhciAqYnVmKQoreworCXByaW50X3FkaXNjX2hhbmRsZShidWYsIFNQUklOVF9CU0laRS0xLCBoKTsKKwlyZXR1cm4gYnVmOworfQorCitjaGFyICogYWN0aW9uX24yYShpbnQgYWN0aW9uLCBjaGFyICpidWYsIGludCBsZW4pCit7CisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIC0xOgorCQlyZXR1cm4gImNvbnRpbnVlIjsKKwkJYnJlYWs7CisJY2FzZSBUQ19BQ1RfT0s6CisJCXJldHVybiAicGFzcyI7CisJCWJyZWFrOworCWNhc2UgVENfQUNUX1NIT1Q6CisJCXJldHVybiAiZHJvcCI7CisJCWJyZWFrOworCWNhc2UgVENfQUNUX1JFQ0xBU1NJRlk6CisJCXJldHVybiAicmVjbGFzc2lmeSI7CisJY2FzZSBUQ19BQ1RfUElQRToKKwkJcmV0dXJuICJwaXBlIjsKKwljYXNlIFRDX0FDVF9TVE9MRU46CisJCXJldHVybiAic3RvbGVuIjsKKwlkZWZhdWx0OgorCQlzbnByaW50ZihidWYsIGxlbiwgIiVkIiwgYWN0aW9uKTsKKwkJcmV0dXJuIGJ1ZjsKKwl9Cit9CisKK2ludCBhY3Rpb25fYTJuKGNoYXIgKmFyZywgaW50ICpyZXN1bHQpCit7CisJaW50IHJlczsKKworCWlmIChtYXRjaGVzKGFyZywgImNvbnRpbnVlIikgPT0gMCkKKwkJcmVzID0gLTE7CisJZWxzZSBpZiAobWF0Y2hlcyhhcmcsICJkcm9wIikgPT0gMCkKKwkJcmVzID0gVENfQUNUX1NIT1Q7CisJZWxzZSBpZiAobWF0Y2hlcyhhcmcsICJzaG90IikgPT0gMCkKKwkJcmVzID0gVENfQUNUX1NIT1Q7CisJZWxzZSBpZiAobWF0Y2hlcyhhcmcsICJwYXNzIikgPT0gMCkKKwkJcmVzID0gVENfQUNUX09LOworCWVsc2UgaWYgKHN0cmNtcChhcmcsICJvayIpID09IDApCisJCXJlcyA9IFRDX0FDVF9PSzsKKwllbHNlIGlmIChtYXRjaGVzKGFyZywgInJlY2xhc3NpZnkiKSA9PSAwKQorCQlyZXMgPSBUQ19BQ1RfUkVDTEFTU0lGWTsKKwllbHNlIHsKKwkJY2hhciBkdW1teTsKKwkJaWYgKHNzY2FuZihhcmcsICIlZCVjIiwgJnJlcywgJmR1bW15KSAhPSAxKQorCQkJcmV0dXJuIC0xOworCX0KKwkqcmVzdWx0ID0gcmVzOworCXJldHVybiAwOworfQorCitpbnQgZ2V0X2xpbmtsYXllcih1bnNpZ25lZCAqdmFsLCBjb25zdCBjaGFyICphcmcpCit7CisJaW50IHJlczsKKworCWlmIChtYXRjaGVzKGFyZywgImV0aGVybmV0IikgPT0gMCkKKwkJcmVzID0gTElOS0xBWUVSX0VUSEVSTkVUOworCWVsc2UgaWYgKG1hdGNoZXMoYXJnLCAiYXRtIikgPT0gMCkKKwkJcmVzID0gTElOS0xBWUVSX0FUTTsKKwllbHNlIGlmIChtYXRjaGVzKGFyZywgImFkc2wiKSA9PSAwKQorCQlyZXMgPSBMSU5LTEFZRVJfQVRNOworCWVsc2UKKwkJcmV0dXJuIC0xOyAvKiBJbmRpY2F0ZSBlcnJvciAqLworCisJKnZhbCA9IHJlczsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBwcmludF9saW5rbGF5ZXIoY2hhciAqYnVmLCBpbnQgbGVuLCB1bnNpZ25lZCBsaW5rbGF5ZXIpCit7CisJc3dpdGNoIChsaW5rbGF5ZXIpIHsKKwljYXNlIExJTktMQVlFUl9VTlNQRUM6CisJCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJXMiLCAidW5zcGVjIik7CisJCXJldHVybjsKKwljYXNlIExJTktMQVlFUl9FVEhFUk5FVDoKKwkJc25wcmludGYoYnVmLCBsZW4sICIlcyIsICJldGhlcm5ldCIpOworCQlyZXR1cm47CisJY2FzZSBMSU5LTEFZRVJfQVRNOgorCQlzbnByaW50ZihidWYsIGxlbiwgIiVzIiwgImF0bSIpOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJc25wcmludGYoYnVmLCBsZW4sICIlcyIsICJ1bmtub3duIik7CisJCXJldHVybjsKKwl9Cit9CisKK2NoYXIgKnNwcmludF9saW5rbGF5ZXIodW5zaWduZWQgbGlua2xheWVyLCBjaGFyICpidWYpCit7CisJcHJpbnRfbGlua2xheWVyKGJ1ZiwgU1BSSU5UX0JTSVpFLTEsIGxpbmtsYXllcik7CisJcmV0dXJuIGJ1ZjsKK30KKwordm9pZCBwcmludF90bShGSUxFICogZiwgY29uc3Qgc3RydWN0IHRjZl90ICp0bSkKK3sKKwlpbnQgaHogPSBnZXRfdXNlcl9oeigpOworCWlmICh0bS0+aW5zdGFsbCAhPSAwKQorCQlmcHJpbnRmKGYsICIgaW5zdGFsbGVkICV1IHNlYyIsICh1bnNpZ25lZCkodG0tPmluc3RhbGwvaHopKTsKKwlpZiAodG0tPmxhc3R1c2UgIT0gMCkKKwkJZnByaW50ZihmLCAiIHVzZWQgJXUgc2VjIiwgKHVuc2lnbmVkKSh0bS0+bGFzdHVzZS9oeikpOworCWlmICh0bS0+ZXhwaXJlcyAhPSAwKQorCQlmcHJpbnRmKGYsICIgZXhwaXJlcyAldSBzZWMiLCAodW5zaWduZWQpKHRtLT5leHBpcmVzL2h6KSk7Cit9CisKK3ZvaWQgcHJpbnRfdGNzdGF0czJfYXR0cihGSUxFICpmcCwgc3RydWN0IHJ0YXR0ciAqcnRhLCBjaGFyICpwcmVmaXgsIHN0cnVjdCBydGF0dHIgKip4c3RhdHMpCit7CisJU1BSSU5UX0JVRihiMSk7CisJc3RydWN0IHJ0YXR0ciAqdGJzW1RDQV9TVEFUU19NQVggKyAxXTsKKworCXBhcnNlX3J0YXR0cl9uZXN0ZWQodGJzLCBUQ0FfU1RBVFNfTUFYLCBydGEpOworCisJaWYgKHRic1tUQ0FfU1RBVFNfQkFTSUNdKSB7CisJCXN0cnVjdCBnbmV0X3N0YXRzX2Jhc2ljIGJzID0gezB9OworCQltZW1jcHkoJmJzLCBSVEFfREFUQSh0YnNbVENBX1NUQVRTX0JBU0lDXSksIE1JTihSVEFfUEFZTE9BRCh0YnNbVENBX1NUQVRTX0JBU0lDXSksIHNpemVvZihicykpKTsKKwkJZnByaW50ZihmcCwgIiVzU2VudCAlbGx1IGJ5dGVzICV1IHBrdCIsCisJCQlwcmVmaXgsICh1bnNpZ25lZCBsb25nIGxvbmcpIGJzLmJ5dGVzLCBicy5wYWNrZXRzKTsKKwl9CisKKwlpZiAodGJzW1RDQV9TVEFUU19RVUVVRV0pIHsKKwkJc3RydWN0IGduZXRfc3RhdHNfcXVldWUgcSA9IHswfTsKKwkJbWVtY3B5KCZxLCBSVEFfREFUQSh0YnNbVENBX1NUQVRTX1FVRVVFXSksIE1JTihSVEFfUEFZTE9BRCh0YnNbVENBX1NUQVRTX1FVRVVFXSksIHNpemVvZihxKSkpOworCQlmcHJpbnRmKGZwLCAiIChkcm9wcGVkICV1LCBvdmVybGltaXRzICV1IHJlcXVldWVzICV1KSAiLAorCQkJcS5kcm9wcywgcS5vdmVybGltaXRzLCBxLnJlcXVldWVzKTsKKwl9CisKKwlpZiAodGJzW1RDQV9TVEFUU19SQVRFX0VTVDY0XSkgeworCQlzdHJ1Y3QgZ25ldF9zdGF0c19yYXRlX2VzdDY0IHJlID0gezB9OworCisJCW1lbWNweSgmcmUsIFJUQV9EQVRBKHRic1tUQ0FfU1RBVFNfUkFURV9FU1Q2NF0pLAorCQkgICAgICAgTUlOKFJUQV9QQVlMT0FEKHRic1tUQ0FfU1RBVFNfUkFURV9FU1Q2NF0pLAorCQkJICAgc2l6ZW9mKHJlKSkpOworCQlmcHJpbnRmKGZwLCAiXG4lc3JhdGUgJXMgJWxsdXBwcyAiLAorCQkJcHJlZml4LCBzcHJpbnRfcmF0ZShyZS5icHMsIGIxKSwgcmUucHBzKTsKKwl9IGVsc2UgaWYgKHRic1tUQ0FfU1RBVFNfUkFURV9FU1RdKSB7CisJCXN0cnVjdCBnbmV0X3N0YXRzX3JhdGVfZXN0IHJlID0gezB9OworCisJCW1lbWNweSgmcmUsIFJUQV9EQVRBKHRic1tUQ0FfU1RBVFNfUkFURV9FU1RdKSwKKwkJICAgICAgIE1JTihSVEFfUEFZTE9BRCh0YnNbVENBX1NUQVRTX1JBVEVfRVNUXSksIHNpemVvZihyZSkpKTsKKwkJZnByaW50ZihmcCwgIlxuJXNyYXRlICVzICV1cHBzICIsCisJCQlwcmVmaXgsIHNwcmludF9yYXRlKHJlLmJwcywgYjEpLCByZS5wcHMpOworCX0KKworCWlmICh0YnNbVENBX1NUQVRTX1FVRVVFXSkgeworCQlzdHJ1Y3QgZ25ldF9zdGF0c19xdWV1ZSBxID0gezB9OworCQltZW1jcHkoJnEsIFJUQV9EQVRBKHRic1tUQ0FfU1RBVFNfUVVFVUVdKSwgTUlOKFJUQV9QQVlMT0FEKHRic1tUQ0FfU1RBVFNfUVVFVUVdKSwgc2l6ZW9mKHEpKSk7CisJCWlmICghdGJzW1RDQV9TVEFUU19SQVRFX0VTVF0pCisJCQlmcHJpbnRmKGZwLCAiXG4lcyIsIHByZWZpeCk7CisJCWZwcmludGYoZnAsICJiYWNrbG9nICVzICV1cCByZXF1ZXVlcyAldSAiLAorCQkJc3ByaW50X3NpemUocS5iYWNrbG9nLCBiMSksIHEucWxlbiwgcS5yZXF1ZXVlcyk7CisJfQorCisJaWYgKHhzdGF0cykKKwkJKnhzdGF0cyA9IHRic1tUQ0FfU1RBVFNfQVBQXSA/IDogTlVMTDsKK30KKwordm9pZCBwcmludF90Y3N0YXRzX2F0dHIoRklMRSAqZnAsIHN0cnVjdCBydGF0dHIgKnRiW10sIGNoYXIgKnByZWZpeCwgc3RydWN0IHJ0YXR0ciAqKnhzdGF0cykKK3sKKwlTUFJJTlRfQlVGKGIxKTsKKworCWlmICh0YltUQ0FfU1RBVFMyXSkgeworCQlwcmludF90Y3N0YXRzMl9hdHRyKGZwLCB0YltUQ0FfU1RBVFMyXSwgcHJlZml4LCB4c3RhdHMpOworCQlpZiAoeHN0YXRzICYmIE5VTEwgPT0gKnhzdGF0cykKKwkJCWdvdG8gY29tcGF0X3hzdGF0czsKKwkJcmV0dXJuOworCX0KKwkvKiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisJaWYgKHRiW1RDQV9TVEFUU10pIHsKKwkJc3RydWN0IHRjX3N0YXRzIHN0OworCisJCS8qIGhhbmRsZSBjYXNlIHdoZXJlIGtlcm5lbCByZXR1cm5zIG1vcmUvbGVzcyB0aGFuIHdlIGtub3cgYWJvdXQgKi8KKwkJbWVtc2V0KCZzdCwgMCwgc2l6ZW9mKHN0KSk7CisJCW1lbWNweSgmc3QsIFJUQV9EQVRBKHRiW1RDQV9TVEFUU10pLCBNSU4oUlRBX1BBWUxPQUQodGJbVENBX1NUQVRTXSksIHNpemVvZihzdCkpKTsKKworCQlmcHJpbnRmKGZwLCAiJXNTZW50ICVsbHUgYnl0ZXMgJXUgcGt0cyAoZHJvcHBlZCAldSwgb3ZlcmxpbWl0cyAldSkgIiwKKwkJCXByZWZpeCwgKHVuc2lnbmVkIGxvbmcgbG9uZylzdC5ieXRlcywgc3QucGFja2V0cywgc3QuZHJvcHMsCisJCQlzdC5vdmVybGltaXRzKTsKKworCQlpZiAoc3QuYnBzIHx8IHN0LnBwcyB8fCBzdC5xbGVuIHx8IHN0LmJhY2tsb2cpIHsKKwkJCWZwcmludGYoZnAsICJcbiVzIiwgcHJlZml4KTsKKwkJCWlmIChzdC5icHMgfHwgc3QucHBzKSB7CisJCQkJZnByaW50ZihmcCwgInJhdGUgIik7CisJCQkJaWYgKHN0LmJwcykKKwkJCQkJZnByaW50ZihmcCwgIiVzICIsIHNwcmludF9yYXRlKHN0LmJwcywgYjEpKTsKKwkJCQlpZiAoc3QucHBzKQorCQkJCQlmcHJpbnRmKGZwLCAiJXVwcHMgIiwgc3QucHBzKTsKKwkJCX0KKwkJCWlmIChzdC5xbGVuIHx8IHN0LmJhY2tsb2cpIHsKKwkJCQlmcHJpbnRmKGZwLCAiYmFja2xvZyAiKTsKKwkJCQlpZiAoc3QuYmFja2xvZykKKwkJCQkJZnByaW50ZihmcCwgIiVzICIsIHNwcmludF9zaXplKHN0LmJhY2tsb2csIGIxKSk7CisJCQkJaWYgKHN0LnFsZW4pCisJCQkJCWZwcmludGYoZnAsICIldXAgIiwgc3QucWxlbik7CisJCQl9CisJCX0KKwl9CisKK2NvbXBhdF94c3RhdHM6CisJaWYgKHRiW1RDQV9YU1RBVFNdICYmIHhzdGF0cykKKwkJKnhzdGF0cyA9IHRiW1RDQV9YU1RBVFNdOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGMvdGNfdXRpbC5oIGIvaXByb3V0ZTIvdGMvdGNfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZTYwYjEKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90Yy90Y191dGlsLmgKQEAgLTAsMCArMSwxMTAgQEAKKyNpZm5kZWYgX1RDX1VUSUxfSF8KKyNkZWZpbmUgX1RDX1VUSUxfSF8gMQorCisjZGVmaW5lIE1BWF9NU0cgMTYzODQKKyNpbmNsdWRlIDxsaW51eC9wa3Rfc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wa3RfY2xzLmg+CisjaW5jbHVkZSA8bGludXgvZ2VuX3N0YXRzLmg+CisjaW5jbHVkZSAidGNfY29yZS5oIgorCisvKiBUaGlzIGlzIHRoZSBkZXByZWNhdGVkIG11bHRpcXVldWUgaW50ZXJmYWNlICovCisjaWZuZGVmIFRDQV9QUklPX01BWAorZW51bQoreworCVRDQV9QUklPX1VOU1BFQywKKwlUQ0FfUFJJT19NUSwKKwlfX1RDQV9QUklPX01BWAorfTsKKworI2RlZmluZSBUQ0FfUFJJT19NQVggICAgKF9fVENBX1BSSU9fTUFYIC0gMSkKKyNlbmRpZgorCitzdHJ1Y3QgcWRpc2NfdXRpbCB7CisJc3RydWN0ICBxZGlzY191dGlsICpuZXh0OworCWNvbnN0IGNoYXIgKmlkOworCWludAkoKnBhcnNlX3FvcHQpKHN0cnVjdCBxZGlzY191dGlsICpxdSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3Qgbmxtc2doZHIgKm4pOworCWludAkoKnByaW50X3FvcHQpKHN0cnVjdCBxZGlzY191dGlsICpxdSwgRklMRSAqZiwgc3RydWN0IHJ0YXR0ciAqb3B0KTsKKwlpbnQgCSgqcHJpbnRfeHN0YXRzKShzdHJ1Y3QgcWRpc2NfdXRpbCAqcXUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKnhzdGF0cyk7CisKKwlpbnQJKCpwYXJzZV9jb3B0KShzdHJ1Y3QgcWRpc2NfdXRpbCAqcXUsIGludCBhcmdjLCBjaGFyICoqYXJndiwgc3RydWN0IG5sbXNnaGRyICpuKTsKKwlpbnQJKCpwcmludF9jb3B0KShzdHJ1Y3QgcWRpc2NfdXRpbCAqcXUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKm9wdCk7Cit9OworCitleHRlcm4gX191MTYgZl9wcm90bzsKK3N0cnVjdCBmaWx0ZXJfdXRpbCB7CisJc3RydWN0IGZpbHRlcl91dGlsICpuZXh0OworCWNoYXIJaWRbMTZdOworCWludAkoKnBhcnNlX2ZvcHQpKHN0cnVjdCBmaWx0ZXJfdXRpbCAqcXUsIGNoYXIgKmZoYW5kbGUsIGludCBhcmdjLAorCQkJICAgICAgY2hhciAqKmFyZ3YsIHN0cnVjdCBubG1zZ2hkciAqbik7CisJaW50CSgqcHJpbnRfZm9wdCkoc3RydWN0IGZpbHRlcl91dGlsICpxdSwgRklMRSAqZiwgc3RydWN0IHJ0YXR0ciAqb3B0LCBfX3UzMiBmaGFuZGxlKTsKK307CisKK3N0cnVjdCBhY3Rpb25fdXRpbCB7CisJc3RydWN0ICBhY3Rpb25fdXRpbCAqbmV4dDsKKwljaGFyICAgIGlkWzE2XTsKKwlpbnQgICAgICgqcGFyc2VfYW9wdCkoc3RydWN0IGFjdGlvbl91dGlsICphLCBpbnQgKmFyZ2MsIGNoYXIgKioqYXJndiwKKwkJCSAgICAgIGludCBjb2RlLCBzdHJ1Y3Qgbmxtc2doZHIgKm4pOworCWludCAgICAgKCpwcmludF9hb3B0KShzdHJ1Y3QgYWN0aW9uX3V0aWwgKmF1LCBGSUxFICpmLCBzdHJ1Y3QgcnRhdHRyICpvcHQpOworCWludCAgICAgKCpwcmludF94c3RhdHMpKHN0cnVjdCBhY3Rpb25fdXRpbCAqYXUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKnhzdGF0cyk7Cit9OworCitzdHJ1Y3QgZXhlY191dGlsIHsKKwlzdHJ1Y3QJZXhlY191dGlsICpuZXh0OworCWNoYXIJaWRbMTZdOworCWludAkoKnBhcnNlX2VvcHQpKHN0cnVjdCBleGVjX3V0aWwgKmV1LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworfTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKmdldF90Y19saWIodm9pZCk7CisKK2V4dGVybiBzdHJ1Y3QgcWRpc2NfdXRpbCAqZ2V0X3FkaXNjX2tpbmQoY29uc3QgY2hhciAqc3RyKTsKK2V4dGVybiBzdHJ1Y3QgZmlsdGVyX3V0aWwgKmdldF9maWx0ZXJfa2luZChjb25zdCBjaGFyICpzdHIpOworCitleHRlcm4gaW50IGdldF9xZGlzY19oYW5kbGUoX191MzIgKmgsIGNvbnN0IGNoYXIgKnN0cik7CitleHRlcm4gaW50IGdldF9yYXRlKHVuc2lnbmVkICpyYXRlLCBjb25zdCBjaGFyICpzdHIpOworZXh0ZXJuIGludCBnZXRfcmF0ZTY0KF9fdTY0ICpyYXRlLCBjb25zdCBjaGFyICpzdHIpOworZXh0ZXJuIGludCBnZXRfc2l6ZSh1bnNpZ25lZCAqc2l6ZSwgY29uc3QgY2hhciAqc3RyKTsKK2V4dGVybiBpbnQgZ2V0X3NpemVfYW5kX2NlbGwodW5zaWduZWQgKnNpemUsIGludCAqY2VsbF9sb2csIGNoYXIgKnN0cik7CitleHRlcm4gaW50IGdldF90aW1lKHVuc2lnbmVkICp0aW1lLCBjb25zdCBjaGFyICpzdHIpOworZXh0ZXJuIGludCBnZXRfbGlua2xheWVyKHVuc2lnbmVkICp2YWwsIGNvbnN0IGNoYXIgKmFyZyk7CisKK2V4dGVybiB2b2lkIHByaW50X3JhdGUoY2hhciAqYnVmLCBpbnQgbGVuLCBfX3U2NCByYXRlKTsKK2V4dGVybiB2b2lkIHByaW50X3NpemUoY2hhciAqYnVmLCBpbnQgbGVuLCBfX3UzMiBzaXplKTsKK2V4dGVybiB2b2lkIHByaW50X3FkaXNjX2hhbmRsZShjaGFyICpidWYsIGludCBsZW4sIF9fdTMyIGgpOworZXh0ZXJuIHZvaWQgcHJpbnRfdGltZShjaGFyICpidWYsIGludCBsZW4sIF9fdTMyIHRpbWUpOworZXh0ZXJuIHZvaWQgcHJpbnRfbGlua2xheWVyKGNoYXIgKmJ1ZiwgaW50IGxlbiwgdW5zaWduZWQgbGlua2xheWVyKTsKKworZXh0ZXJuIGNoYXIgKiBzcHJpbnRfcmF0ZShfX3U2NCByYXRlLCBjaGFyICpidWYpOworZXh0ZXJuIGNoYXIgKiBzcHJpbnRfc2l6ZShfX3UzMiBzaXplLCBjaGFyICpidWYpOworZXh0ZXJuIGNoYXIgKiBzcHJpbnRfcWRpc2NfaGFuZGxlKF9fdTMyIGgsIGNoYXIgKmJ1Zik7CitleHRlcm4gY2hhciAqIHNwcmludF90Y19jbGFzc2lkKF9fdTMyIGgsIGNoYXIgKmJ1Zik7CitleHRlcm4gY2hhciAqIHNwcmludF90aW1lKF9fdTMyIHRpbWUsIGNoYXIgKmJ1Zik7CitleHRlcm4gY2hhciAqIHNwcmludF90aWNrcyhfX3UzMiB0aWNrcywgY2hhciAqYnVmKTsKK2V4dGVybiBjaGFyICogc3ByaW50X2xpbmtsYXllcih1bnNpZ25lZCBsaW5rbGF5ZXIsIGNoYXIgKmJ1Zik7CisKK2V4dGVybiB2b2lkIHByaW50X3Rjc3RhdHNfYXR0cihGSUxFICpmcCwgc3RydWN0IHJ0YXR0ciAqdGJbXSwgY2hhciAqcHJlZml4LCBzdHJ1Y3QgcnRhdHRyICoqeHN0YXRzKTsKK2V4dGVybiB2b2lkIHByaW50X3Rjc3RhdHMyX2F0dHIoRklMRSAqZnAsIHN0cnVjdCBydGF0dHIgKnJ0YSwgY2hhciAqcHJlZml4LCBzdHJ1Y3QgcnRhdHRyICoqeHN0YXRzKTsKKworZXh0ZXJuIGludCBnZXRfdGNfY2xhc3NpZChfX3UzMiAqaCwgY29uc3QgY2hhciAqc3RyKTsKK2V4dGVybiBpbnQgcHJpbnRfdGNfY2xhc3NpZChjaGFyICpidWYsIGludCBsZW4sIF9fdTMyIGgpOworZXh0ZXJuIGNoYXIgKiBzcHJpbnRfdGNfY2xhc3NpZChfX3UzMiBoLCBjaGFyICpidWYpOworCitleHRlcm4gaW50IHRjX3ByaW50X3BvbGljZShGSUxFICpmLCBzdHJ1Y3QgcnRhdHRyICp0Yik7CitleHRlcm4gaW50IHBhcnNlX3BvbGljZShpbnQgKiwgY2hhciAqKiosIGludCwgc3RydWN0IG5sbXNnaGRyICopOworCitleHRlcm4gY2hhciAqYWN0aW9uX24yYShpbnQgYWN0aW9uLCBjaGFyICpidWYsIGludCBsZW4pOworZXh0ZXJuIGludCAgYWN0aW9uX2EybihjaGFyICphcmcsIGludCAqcmVzdWx0KTsKK2V4dGVybiBpbnQgIGFjdF9wYXJzZV9wb2xpY2Uoc3RydWN0IGFjdGlvbl91dGlsICphLGludCAqLCBjaGFyICoqKiwgaW50LCBzdHJ1Y3Qgbmxtc2doZHIgKik7CitleHRlcm4gaW50ICBwcmludF9wb2xpY2Uoc3RydWN0IGFjdGlvbl91dGlsICphLCBGSUxFICpmLAorCQkJIHN0cnVjdCBydGF0dHIgKnRiKTsKK2V4dGVybiBpbnQgIHBvbGljZV9wcmludF94c3RhdHMoc3RydWN0IGFjdGlvbl91dGlsICphLEZJTEUgKmYsCisJCQkJc3RydWN0IHJ0YXR0ciAqdGIpOworZXh0ZXJuIGludCAgdGNfcHJpbnRfYWN0aW9uKEZJTEUgKmYsIGNvbnN0IHN0cnVjdCBydGF0dHIgKnRiKTsKK2V4dGVybiBpbnQgIHRjX3ByaW50X2lwdChGSUxFICpmLCBjb25zdCBzdHJ1Y3QgcnRhdHRyICp0Yik7CitleHRlcm4gaW50ICBwYXJzZV9hY3Rpb24oaW50ICosIGNoYXIgKioqLCBpbnQsIHN0cnVjdCBubG1zZ2hkciAqKTsKK2V4dGVybiB2b2lkIHByaW50X3RtKEZJTEUgKmYsIGNvbnN0IHN0cnVjdCB0Y2ZfdCAqdG0pOworZXh0ZXJuIGludCBwcmlvX3ByaW50X29wdChzdHJ1Y3QgcWRpc2NfdXRpbCAqcXUsIEZJTEUgKmYsIHN0cnVjdCBydGF0dHIgKm9wdCk7CisKK2V4dGVybiBpbnQgY2xzX25hbWVzX2luaXQoY2hhciAqcGF0aCk7CitleHRlcm4gdm9pZCBjbHNfbmFtZXNfdW5pbml0KHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3Rlc3RzdWl0ZS9NYWtlZmlsZSBiL2lwcm91dGUyL3Rlc3RzdWl0ZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDI3NjUwCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGVzdHN1aXRlL01ha2VmaWxlCkBAIC0wLDAgKzEsNjkgQEAKKyMjIC0tIENvbmZpZyAtLQorREVWIDo9IGxvCitQUkVGSVggOj0gc3VkbyAtRSB1bnNoYXJlIC1uCitSRVNVTFRTX0RJUiA6PSByZXN1bHRzCisjIyAtLSBFbmQgQ29uZmlnIC0tCisKK0hBVkVfVU5TSEFSRURfVVRJTCA6PSAkKHNoZWxsIHVuc2hhcmUgLS12ZXJzaW9uIDI+IC9kZXYvbnVsbCkKKworcndpbGRjYXJkPSQod2lsZGNhcmQgJDEkMikgJChmb3JlYWNoIGQsJCh3aWxkY2FyZCAkMSopLCQoY2FsbCByd2lsZGNhcmQsJGQvLCQyKSkKKworVEVTVFMgOj0gJChwYXRzdWJzdCB0ZXN0cy8lLCUsJChjYWxsIHJ3aWxkY2FyZCx0ZXN0cy8sKi50KSkKK1RFU1RTX0RJUiA6PSAkKGRpciAkKFRFU1RTKSkKKworSVBWRVJTIDo9ICQoZmlsdGVyLW91dCBpcHJvdXRlMi9NYWtlZmlsZSwkKHdpbGRjYXJkIGlwcm91dGUyLyopKQorCitpZm5lcSAoLCQod2lsZGNhcmQgL3Byb2MvY29uZmlnLmd6KSkKKwlLRU5WIDo9ICQoc2hlbGwgY2F0IC9wcm9jL2NvbmZpZy5neiB8IGd1bnppcCB8IGdyZXAgXkNPTkZJRykKK2VuZGlmCisKKy5QSE9OWTogY29tcGlsZSBsaXN0dGVzdHMgYWxsdGVzdHMgY29uZmlndXJlICQoVEVTVFMpCisKK2NvbmZpZ3VyZToKKwllY2hvICJFbnRlcmluZyBpcHJvdXRlMiIgJiYgY2QgaXByb3V0ZTIgJiYgJChNQUtFKSBjb25maWd1cmUgJiYgY2QgLi47CisKK2NvbXBpbGU6IGNvbmZpZ3VyZQorCWVjaG8gIkVudGVyaW5nIGlwcm91dGUyIiAmJiBjZCBpcHJvdXRlMiAmJiAkKE1BS0UpICYmIGNkIC4uOworCitsaXN0dGVzdHM6CisJQGZvciB0IGluICQoVEVTVFMpOyBkbyBcCisJCWVjaG8gIiQkdCI7IFwKKwlkb25lCisKK2FsbHRlc3RzOiAkKFRFU1RTKQorCitjbGVhbjoKKwlAZWNobyAiUmVtb3ZpbmcgJChSRVNVTFRTX0RJUikgZGlyIC4uLiIKKwlAcm0gLXJmICQoUkVTVUxUU19ESVIpCisKK2Rpc3RjbGVhbjogY2xlYW4KKwllY2hvICJFbnRlcmluZyBpcHJvdXRlMiIgJiYgY2QgaXByb3V0ZTIgJiYgJChNQUtFKSBkaXN0Y2xlYW4gJiYgY2QgLi47CisKKyQoVEVTVFMpOiBjbGVhbgoraWZlcSAoLCQoSEFWRV9VTlNIQVJFRF9VVElMKSkKKwkkKGVycm9yIFBsZWFzZSBpbnN0YWxsIHV0aWwtbGludXggdG9vbHMgdG8gcnVuIHRlc3RzIGluIHNlcGFyYXRlZCBuZXR3b3JrIG5hbWVzcGFjZSkKK2VuZGlmCisJQG1rZGlyIC1wICQoUkVTVUxUU19ESVIpCisJCisJQGZvciBkIGluICQoVEVTVFNfRElSKTsgZG8gXAorCSAgICBta2RpciAtcCAkKFJFU1VMVFNfRElSKS8kJGQ7IFwKKwlkb25lCisJCisJQGZvciBpIGluICQoSVBWRVJTKTsgZG8gXAorCQlvPWBlY2hvICQkaSB8IHNlZCAtZSAncy9pcHJvdXRlMlwvLy8nYDsgXAorCQllY2hvIC1uICJSdW5uaW5nICRAIFskJG8vYHVuYW1lIC1yYF06ICI7IFwKKwkJVE1QX0VSUj1gbWt0ZW1wIC90bXAvdGNfdGVzdHN1aXRlLlhYWFhYWGA7IFwKKwkJVE1QX09VVD1gbWt0ZW1wIC90bXAvdGNfdGVzdHN1aXRlLlhYWFhYWGA7IFwKKwkJU1REX0VSUj0iJCRUTVBfRVJSIiBTVERfT1VUPSIkJFRNUF9PVVQiIFwKKwkJVEM9IiQkaS90Yy90YyIgSVA9IiQkaS9pcC9pcCIgREVWPSIkKERFVikiIElQVkVSPSIkQCIgU05BTUU9IiQkaSIgXAorCQlFUlJGPSIkKFJFU1VMVFNfRElSKS8kQC4kJG8uZXJyIiAkKEtFTlYpICQoUFJFRklYKSB0ZXN0cy8kQCA+ICQoUkVTVUxUU19ESVIpLyRALiQkby5vdXQ7IFwKKwkJaWYgWyAiJCQ/IiA9ICIxMjciIF07IHRoZW4gXAorCQkJZWNobyAiU0tJUFBFRCI7IFwKKwkJZWxpZiBbIC1lICIkKFJFU1VMVFNfRElSKS8kQC4kJG8uZXJyIiBdOyB0aGVuIFwKKwkJCWVjaG8gIkZBSUxFRCI7IFwKKwkJZWxzZSBcCisJCQllY2hvICJQQVNTIjsgXAorCQlmaTsgXAorCQlybSAiJCRUTVBfRVJSIiAiJCRUTVBfT1VUIjsgXAorCQlkbWVzZyA+ICQoUkVTVUxUU19ESVIpLyRALiQkby5kbWVzZzsgXAorCWRvbmUKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3Rlc3RzdWl0ZS9jb25maWdzL2FsbC0yLjQgYi9pcHJvdXRlMi90ZXN0c3VpdGUvY29uZmlncy9hbGwtMi40Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNDEzMWMKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90ZXN0c3VpdGUvY29uZmlncy9hbGwtMi40CkBAIC0wLDAgKzEsODQ4IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IG1ha2UgbWVudWNvbmZpZzogZG9uJ3QgZWRpdAorIworQ09ORklHX1g4Nj15CisjIENPTkZJR19TQlVTIGlzIG5vdCBzZXQKK0NPTkZJR19VSUQxNj15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFZFUlNJT05TPXkKK0NPTkZJR19LTU9EPXkKKworIworIyBQcm9jZXNzb3IgdHlwZSBhbmQgZmVhdHVyZXMKKyMKKyMgQ09ORklHX00zODYgaXMgbm90IHNldAorIyBDT05GSUdfTTQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19NNTg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX001ODZUU0MgaXMgbm90IHNldAorIyBDT05GSUdfTTU4Nk1NWCBpcyBub3Qgc2V0CisjIENPTkZJR19NNjg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01QRU5USVVNSUlJIGlzIG5vdCBzZXQKK0NPTkZJR19NUEVOVElVTTQ9eQorIyBDT05GSUdfTUs2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01LNyBpcyBub3Qgc2V0CisjIENPTkZJR19NSzggaXMgbm90IHNldAorIyBDT05GSUdfTUVMQU4gaXMgbm90IHNldAorIyBDT05GSUdfTUNSVVNPRSBpcyBub3Qgc2V0CisjIENPTkZJR19NV0lOQ0hJUEM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01XSU5DSElQMiBpcyBub3Qgc2V0CisjIENPTkZJR19NV0lOQ0hJUDNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01DWVJJWElJSSBpcyBub3Qgc2V0CisjIENPTkZJR19NVklBQzNfMiBpcyBub3Qgc2V0CitDT05GSUdfWDg2X1dQX1dPUktTX09LPXkKK0NPTkZJR19YODZfSU5WTFBHPXkKK0NPTkZJR19YODZfQ01QWENIRz15CitDT05GSUdfWDg2X1hBREQ9eQorQ09ORklHX1g4Nl9CU1dBUD15CitDT05GSUdfWDg2X1BPUEFEX09LPXkKKyMgQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0sgaXMgbm90IHNldAorQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKK0NPTkZJR19YODZfTDFfQ0FDSEVfU0hJRlQ9NworQ09ORklHX1g4Nl9IQVNfVFNDPXkKK0NPTkZJR19YODZfR09PRF9BUElDPXkKK0NPTkZJR19YODZfUEdFPXkKK0NPTkZJR19YODZfVVNFX1BQUk9fQ0hFQ0tTVU09eQorQ09ORklHX1g4Nl9GMDBGX1dPUktTX09LPXkKK0NPTkZJR19YODZfTUNFPXkKKyMgQ09ORklHX1RPU0hJQkEgaXMgbm90IHNldAorIyBDT05GSUdfSThLIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JQ1JPQ09ERSBpcyBub3Qgc2V0CisjIENPTkZJR19YODZfTVNSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1g4Nl9DUFVJRCBpcyBub3Qgc2V0CisjIENPTkZJR19FREQgaXMgbm90IHNldAorQ09ORklHX05PSElHSE1FTT15CisjIENPTkZJR19ISUdITUVNNEcgaXMgbm90IHNldAorIyBDT05GSUdfSElHSE1FTTY0RyBpcyBub3Qgc2V0CisjIENPTkZJR19ISUdITUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BVEhfRU1VTEFUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01UUlIgaXMgbm90IHNldAorQ09ORklHX1NNUD15CitDT05GSUdfTlJfQ1BVUz0zMgorIyBDT05GSUdfWDg2X05VTUEgaXMgbm90IHNldAorIyBDT05GSUdfWDg2X1RTQ19ESVNBQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19YODZfVFNDPXkKK0NPTkZJR19IQVZFX0RFQ19MT0NLPXkKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTkVUPXkKK0NPTkZJR19YODZfSU9fQVBJQz15CitDT05GSUdfWDg2X0xPQ0FMX0FQSUM9eQorQ09ORklHX1BDST15CisjIENPTkZJR19QQ0lfR09CSU9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDSV9HT0RJUkVDVCBpcyBub3Qgc2V0CitDT05GSUdfUENJX0dPQU5ZPXkKK0NPTkZJR19QQ0lfQklPUz15CitDT05GSUdfUENJX0RJUkVDVD15CitDT05GSUdfSVNBPXkKK0NPTkZJR19QQ0lfTkFNRVM9eQorIyBDT05GSUdfRUlTQSBpcyBub3Qgc2V0CisjIENPTkZJR19NQ0EgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorCisjCisjIFBDTUNJQS9DYXJkQnVzIHN1cHBvcnQKKyMKK0NPTkZJR19QQ01DSUE9eQorQ09ORklHX0NBUkRCVVM9eQorIyBDT05GSUdfVENJQyBpcyBub3Qgc2V0CisjIENPTkZJR19JODIwOTIgaXMgbm90IHNldAorIyBDT05GSUdfSTgyMzY1IGlzIG5vdCBzZXQKKworIworIyBQQ0kgSG90cGx1ZyBTdXBwb3J0CisjCisjIENPTkZJR19IT1RQTFVHX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19IT1RQTFVHX1BDSV9DT01QQVEgaXMgbm90IHNldAorIyBDT05GSUdfSE9UUExVR19QQ0lfQ09NUEFRX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUdfUENJX0lCTSBpcyBub3Qgc2V0CisjIENPTkZJR19IT1RQTFVHX1BDSV9TSFBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUdfUENJX1NIUENfUE9MTF9FVkVOVF9NT0RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUdfUENJX1NIUENfUEhQUk1fTEVHQUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUdfUENJX1BDSUUgaXMgbm90IHNldAorIyBDT05GSUdfSE9UUExVR19QQ0lfUENJRV9QT0xMX0VWRU5UX01PREUgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKK0NPTkZJR19LQ09SRV9FTEY9eQorIyBDT05GSUdfS0NPUkVfQU9VVCBpcyBub3Qgc2V0CitDT05GSUdfQklORk1UX0FPVVQ9eQorQ09ORklHX0JJTkZNVF9FTEY9eQorQ09ORklHX0JJTkZNVF9NSVNDPXkKKyMgQ09ORklHX09PTV9LSUxMRVIgaXMgbm90IHNldAorQ09ORklHX1BNPXkKKyMgQ09ORklHX0FQTSBpcyBub3Qgc2V0CisKKyMKKyMgQUNQSSBTdXBwb3J0CisjCisjIENPTkZJR19BQ1BJIGlzIG5vdCBzZXQKK0NPTkZJR19BQ1BJX0JPT1Q9eQorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKKyMgQ09ORklHX01URCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IGNvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19QTlA9eQorQ09ORklHX0lTQVBOUD15CisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworQ09ORklHX0JMS19ERVZfRkQ9eQorIyBDT05GSUdfQkxLX0RFVl9YRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVJJREUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAorIyBDT05GSUdfQ0lTU19TQ1NJX1RBUEUgaXMgbm90IHNldAorIyBDT05GSUdfQ0lTU19NT05JVE9SX1RIUkVBRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19TVEFUUyBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTUQgaXMgbm90IHNldAorIyBDT05GSUdfTURfTElORUFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EX1JBSUQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EX1JBSUQxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EX1JBSUQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX01EX01VTFRJUEFUSCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0xWTSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19GSUxURVIgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CitDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSPXkKK0NPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVM9eQorQ09ORklHX0lQX1JPVVRFX05BVD15CitDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIPXkKK0NPTkZJR19JUF9ST1VURV9UT1M9eQorIyBDT05GSUdfSVBfUk9VVEVfVkVSQk9TRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX01ST1VURSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRUNOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfS0hUVFBEIGlzIG5vdCBzZXQKKworIworIyAgICBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorQ09ORklHX0FUTT15CitDT05GSUdfQVRNX0NMSVA9eQorIyBDT05GSUdfQVRNX0NMSVBfTk9fSUNNUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fTEFORSBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fQlIyNjg0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKworIworIyBBcHBsZXRhbGsgZGV2aWNlcworIworIyBDT05GSUdfREVWX0FQUExFVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9GQVNUUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0hXX0ZMT1dDT05UUk9MIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKK0NPTkZJR19ORVRfU0NIRUQ9eQorQ09ORklHX05FVF9TQ0hfQ0JRPXkKK0NPTkZJR19ORVRfU0NIX0hUQj15CitDT05GSUdfTkVUX1NDSF9DU1o9eQorQ09ORklHX05FVF9TQ0hfSEZTQz15CitDT05GSUdfTkVUX1NDSF9BVE09eQorQ09ORklHX05FVF9TQ0hfUFJJTz15CitDT05GSUdfTkVUX1NDSF9SRUQ9eQorQ09ORklHX05FVF9TQ0hfU0ZRPXkKK0NPTkZJR19ORVRfU0NIX1RFUUw9eQorQ09ORklHX05FVF9TQ0hfVEJGPXkKK0NPTkZJR19ORVRfU0NIX0dSRUQ9eQorQ09ORklHX05FVF9TQ0hfTkVURU09eQorQ09ORklHX05FVF9TQ0hfRFNNQVJLPXkKK0NPTkZJR19ORVRfUU9TPXkKK0NPTkZJR19ORVRfRVNUSU1BVE9SPXkKK0NPTkZJR19ORVRfQ0xTPXkKK0NPTkZJR19ORVRfQ0xTX1RDSU5ERVg9eQorQ09ORklHX05FVF9DTFNfUk9VVEU0PXkKK0NPTkZJR19ORVRfQ0xTX1JPVVRFPXkKK0NPTkZJR19ORVRfQ0xTX0ZXPXkKK0NPTkZJR19ORVRfQ0xTX1UzMj15CitDT05GSUdfTkVUX0NMU19SU1ZQPXkKK0NPTkZJR19ORVRfQ0xTX1JTVlA2PXkKK0NPTkZJR19ORVRfQ0xTX1BPTElDRT15CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKworIworIyBUZWxlcGhvbnkgU3VwcG9ydAorIworIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAorIyBDT05GSUdfUEhPTkVfSVhKIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIT05FX0lYSl9QQ01DSUEgaXMgbm90IHNldAorCisjCisjIEFUQS9JREUvTUZNL1JMTCBzdXBwb3J0CisjCitDT05GSUdfSURFPXkKKworIworIyBJREUsIEFUQSBhbmQgQVRBUEkgQmxvY2sgZGV2aWNlcworIworQ09ORklHX0JMS19ERVZfSURFPXkKKyMgQ09ORklHX0JMS19ERVZfSERfSURFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVfU0FUQSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVESVNLPXkKK0NPTkZJR19JREVESVNLX01VTFRJX01PREU9eQorIyBDT05GSUdfSURFRElTS19TVFJPS0UgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVDUyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0RFTEtJTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVDRD15CisjIENPTkZJR19CTEtfREVWX0lERVRBUEUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVGTE9QUFkgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVTQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERV9UQVNLX0lPQ1RMIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0NNRDY0MD15CisjIENPTkZJR19CTEtfREVWX0NNRDY0MF9FTkhBTkNFRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lTQVBOUCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVQQ0k9eQorIyBDT05GSUdfQkxLX0RFVl9HRU5FUklDIGlzIG5vdCBzZXQKK0NPTkZJR19JREVQQ0lfU0hBUkVfSVJRPXkKK0NPTkZJR19CTEtfREVWX0lERURNQV9QQ0k9eQorIyBDT05GSUdfQkxLX0RFVl9PRkZCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERURNQV9GT1JDRUQgaXMgbm90IHNldAorQ09ORklHX0lERURNQV9QQ0lfQVVUTz15CisjIENPTkZJR19JREVETUFfT05MWURJU0sgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRE1BPXkKKyMgQ09ORklHX0lERURNQV9QQ0lfV0lQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQURNQTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0FFQzYyWFggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9BTEkxNVgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dEQ19BTEkxNVgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQU1ENzRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BTUQ3NFhYX09WRVJSSURFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQVRJSVhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ01ENjRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVFJJRkxFWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NZODJDNjkzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ1M1NTMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSFBUMzRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQVDM0WF9BVVRPRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSFBUMzY2IGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1BJSVg9eQorIyBDT05GSUdfQkxLX0RFVl9OUzg3NDE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfT1BUSTYyMSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX09MRCBpcyBub3Qgc2V0CisjIENPTkZJR19QREMyMDJYWF9CVVJTVCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX05FVyBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SWjEwMDA9eQorIyBDT05GSUdfQkxLX0RFVl9TQzEyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TVldLUyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NJSU1BR0UgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TSVM1NTEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU0xDOTBFNjYgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9UUk0yOTAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9WSUE4MkNYWFggaXMgbm90IHNldAorIyBDT05GSUdfSURFX0NISVBTRVRTIGlzIG5vdCBzZXQKK0NPTkZJR19JREVETUFfQVVUTz15CisjIENPTkZJR19JREVETUFfSVZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQV9OT05QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9BVEFSQUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQVRBUkFJRF9QREMgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9BVEFSQUlEX0hQVCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0FUQVJBSURfTUVETEVZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQVRBUkFJRF9TSUkgaXMgbm90IHNldAorCisjCisjIFNDU0kgc3VwcG9ydAorIworIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9CT09UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9JU0VOU0UgaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX0NUTCBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNJT05fTEFOIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0IChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0CisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19JMk8gaXMgbm90IHNldAorIyBDT05GSUdfSTJPX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19JMk9fQkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSTJPX0xBTiBpcyBub3Qgc2V0CisjIENPTkZJR19JMk9fU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19JMk9fUFJPQyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX05FVERFVklDRVM9eQorCisjCisjIEFSQ25ldCBkZXZpY2VzCisjCisjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAorQ09ORklHX0RVTU1ZPW0KKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisjIENPTkZJR19FVEhFUlRBUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfU0IxMDAwIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorIyBDT05GSUdfU1VOTEFOQ0UgaXMgbm90IHNldAorIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkJNQUMgaXMgbm90IHNldAorIyBDT05GSUdfU1VOUUUgaXMgbm90IHNldAorIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CisjIENPTkZJR19MQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1NNQyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1JBQ0FMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUMTcwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVBDQSBpcyBub3Qgc2V0CisjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVNBIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfUENJPXkKKyMgQ09ORklHX1BDTkVUMzIgaXMgbm90IHNldAorIyBDT05GSUdfQU1EODExMV9FVEggaXMgbm90IHNldAorIyBDT05GSUdfQURBUFRFQ19TVEFSRklSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BQzMyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVBSSUNPVCBpcyBub3Qgc2V0CisjIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfQ1M4OXgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFNFg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0RHUlMgaXMgbm90IHNldAorIyBDT05GSUdfRE05MTAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VFUFJPMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VFUFJPMTAwX1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xORTM5MCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFMTlggaXMgbm90IHNldAorIyBDT05GSUdfTkFUU0VNSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORTJLX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAorIyBDT05GSUdfTkUzMjEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VTMzIxMCBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5Q1AgaXMgbm90IHNldAorQ09ORklHXzgxMzlUT089eQorQ09ORklHXzgxMzlUT09fUElPPXkKKyMgQ09ORklHXzgxMzlUT09fVFVORV9UV0lTVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlUT09fODEyOSBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5X09MRF9SWF9SRVNFVCBpcyBub3Qgc2V0CisjIENPTkZJR19TSVM5MDAgaXMgbm90IHNldAorIyBDT05GSUdfRVBJQzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5EQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5EQU5DRV9NTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1JISU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9SSElORV9NTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJTkJPTkRfODQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0NLRVQgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisjIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAorIyBDT05GSUdfREwySyBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NWVJJX1NCVVMgaXMgbm90IHNldAorIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CisjIENPTkZJR19SODE2OSBpcyBub3Qgc2V0CisjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CisjIENPTkZJR19GRERJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BMSVAgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBUb2tlbiBSaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1RSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9GQyBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorCisjCisjIFBDTUNJQSBuZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ORVRfUENNQ0lBIGlzIG5vdCBzZXQKKworIworIyBBVE0gZHJpdmVycworIworIyBDT05GSUdfQVRNX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fTEFOQUkgaXMgbm90IHNldAorIyBDT05GSUdfQVRNX0VOSSBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fRklSRVNUUkVBTSBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fWkFUTSBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fTklDU1RBUiBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fSURUNzcyNTIgaXMgbm90IHNldAorIyBDT05GSUdfQVRNX0FNQkFTU0FET1IgaXMgbm90IHNldAorIyBDT05GSUdfQVRNX0hPUklaT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRNX0lBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTV9GT1JFMjAwRV9NQVlCRSBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fSEUgaXMgbm90IHNldAorCisjCisjIEFtYXRldXIgUmFkaW8gc3VwcG9ydAorIworIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorCisjCisjIElyREEgKGluZnJhcmVkKSBzdXBwb3J0CisjCisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgT2xkIENELVJPTSBkcml2ZXJzIChub3QgU0NTSSwgbm90IElERSkKKyMKKyMgQ09ORklHX0NEX05PX0lERVNDU0kgaXMgbm90IHNldAorCisjCisjIElucHV0IGNvcmUgc3VwcG9ydAorIworIyBDT05GSUdfSU5QVVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfS0VZQkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVUlOUFVUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1ZUPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUw9eQorIyBDT05GSUdfU0VSSUFMX0NPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX0VYVEVOREVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX1VOSVg5OF9QVFlfQ09VTlQ9MjU2CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgTWljZQorIworIyBDT05GSUdfQlVTTU9VU0UgaXMgbm90IHNldAorQ09ORklHX01PVVNFPXkKK0NPTkZJR19QU01PVVNFPXkKKyMgQ09ORklHXzgyQzcxMF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19QQzExMF9QQUQgaXMgbm90IHNldAorIyBDT05GSUdfTUs3MTJfTU9VU0UgaXMgbm90IHNldAorCisjCisjIEpveXN0aWNrcworIworIyBDT05GSUdfSU5QVVRfR0FNRVBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfUUlDMDJfVEFQRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSVBNSV9QQU5JQ19FVkVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUE1JX0RFVklDRV9JTlRFUkZBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfSVBNSV9LQ1MgaXMgbm90IHNldAorIyBDT05GSUdfSVBNSV9XQVRDSERPRyBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDeDIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ3gyMDBfR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19BTURfUk5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOVEVMX1JORyBpcyBub3Qgc2V0CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorIyBDT05GSUdfQU1EX1BNNzY4IGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPTllQSSBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19GVEFQRSBpcyBub3Qgc2V0CisjIENPTkZJR19BR1AgaXMgbm90IHNldAorCisjCisjIERpcmVjdCBSZW5kZXJpbmcgTWFuYWdlciAoWEZyZWU4NiBEUkkgc3VwcG9ydCkKKyMKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisKKyMKKyMgUENNQ0lBIGNoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19QQ01DSUFfU0VSSUFMX0NTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTkNMSU5LX0NTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01XQVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX09CTU9VU0UgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FGTVRfVjIgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19BVVRPRlM0X0ZTPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX1BST0NfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FERlNfRlNfUlcgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19GQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVU1TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKK0NPTkZJR19UTVBGUz15CitDT05GSUdfUkFNRlM9eQorQ09ORklHX0lTTzk2NjBfRlM9eQorIyBDT05GSUdfSk9MSUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1pJU09GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19TVEFUSVNUSUNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX1JXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorQ09ORklHX1BST0NfRlM9eQorIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNfTU9VTlQgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0RFVlBUU19GUz15CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX1JXIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9SVyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTX1dSSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGU19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfREVCVUcgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOVEVSTUVaWk9fRlMgaXMgbm90IHNldAorQ09ORklHX05GU19GUz15CisjIENPTkZJR19ORlNfVjMgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPT1RfTkZTIGlzIG5vdCBzZXQKK0NPTkZJR19ORlNEPXkKKyMgQ09ORklHX05GU0RfVjMgaXMgbm90IHNldAorQ09ORklHX05GU0RfVENQPXkKK0NPTkZJR19TVU5SUEM9eQorQ09ORklHX0xPQ0tEPXkKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQRlNfUEFDS0VUX1NJR05JTkcgaXMgbm90IHNldAorIyBDT05GSUdfTkNQRlNfSU9DVExfTE9DS0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BGU19TVFJPTkcgaXMgbm90IHNldAorIyBDT05GSUdfTkNQRlNfTkZTX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUEZTX09TMl9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BGU19TTUFMTERPUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BGU19OTFMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQRlNfRVhUUkFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1pJU09GU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisjIENPTkZJR19TTUJfTkxTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkcml2ZXJzCisjCitDT05GSUdfVkdBX0NPTlNPTEU9eQorIyBDT05GSUdfVklERU9fU0VMRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EQV9DT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBGcmFtZS1idWZmZXIgc3VwcG9ydAorIworIyBDT05GSUdfRkIgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCitDT05GSUdfU09VTkQ9eQorIyBDT05GSUdfU09VTkRfQUxJNTQ1NSBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9CVDg3OCBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9DTVBDSSBpcyBub3Qgc2V0CitDT05GSUdfU09VTkRfRU1VMTBLMT15CitDT05GSUdfTUlESV9FTVUxMEsxPXkKKyMgQ09ORklHX1NPVU5EX0ZVU0lPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9DUzQyODEgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfRVMxMzcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0VTMTM3MSBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9FU1NTT0xPMSBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9NQUVTVFJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX01BRVNUUk8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0ZPUlRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0lDSCBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9STUU5NlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX1NPTklDVklCRVMgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfVFJJREVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9NU05EQ0xBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9NU05EUElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX1ZJQTgyQ1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19NSURJX1ZJQTgyQ1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9PU1MgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfVFZNSVhFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9BRDE5ODAgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfV005N1hYIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQj15CisjIENPTkZJR19VU0JfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0RFVklDRUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9CQU5EV0lEVEggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VIQ0lfSENEIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfVUhDSV9BTFQ9eQorIyBDT05GSUdfVVNCX09IQ0kgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NMODExSFNfQUxUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TTDgxMUhTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRU1JMjYgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0JMVUVUT09USCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTUlESSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSVNEMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RQQ00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSFA4MjAwZSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSMDkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BQ00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BSSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0hJRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSElESU5QVVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0hJRERFViBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQUlQVEVLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9XQUNPTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0JUQUIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BPV0VSTUFURSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfREMyWFggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01EQzgwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0NBTk5FUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0hQVVNCU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEVHQVNVUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUlRMODE1MCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DQVRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DRENFVEhFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVVNCTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9VU1M3MjAgaXMgbm90IHNldAorCisjCisjIFVTQiBTZXJpYWwgQ29udmVydGVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9TRVJJQUwgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JJTzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVVFUlNXQUxEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9USUdMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9CUkxWR0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NQRUVEVE9VQ0ggaXMgbm90IHNldAorCisjCisjIFN1cHBvcnQgZm9yIFVTQiBnYWRnZXRzCisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBCbHVldG9vdGggc3VwcG9ydAorIworIyBDT05GSUdfQkxVRVogaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCitDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XPXkKK0NPTkZJR19ERUJVR19ISUdITUVNPXkKK0NPTkZJR19ERUJVR19TTEFCPXkKK0NPTkZJR19ERUJVR19JT1ZJUlQ9eQorQ09ORklHX01BR0lDX1NZU1JRPXkKK0NPTkZJR19ERUJVR19TUElOTE9DSz15CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CitDT05GSUdfTE9HX0JVRl9TSElGVD0wCisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19aTElCX0lORkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfWkxJQl9ERUZMQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90ZXN0c3VpdGUvY29uZmlncy9hbGwtbm8tYWN0IGIvaXByb3V0ZTIvdGVzdHN1aXRlL2NvbmZpZ3MvYWxsLW5vLWFjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWVlZDQzCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGVzdHN1aXRlL2NvbmZpZ3MvYWxsLW5vLWFjdApAQCAtMCwwICsxLDE0OTkgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMC1yYzItYmsxMworIyBXZWQgRGVjICA4IDE0OjQzOjA3IDIwMDQKKyMKK0NPTkZJR19YODY9eQorQ09ORklHX01NVT15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX0dFTkVSSUNfSVNBX0RNQT15CitDT05GSUdfR0VORVJJQ19JT01BUD15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19DTEVBTl9DT01QSUxFPXkKK0NPTkZJR19MT0NLX0tFUk5FTD15CisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0ibm8tYWN0IgorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1BPU0lYX01RVUVVRT15CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorQ09ORklHX0FVRElUPXkKK0NPTkZJR19BVURJVFNZU0NBTEw9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19LT0JKRUNUX1VFVkVOVD15CitDT05GSUdfSUtDT05GSUc9eQorQ09ORklHX0lLQ09ORklHX1BST0M9eQorIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CitDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRD15CitDT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorQ09ORklHX1NUT1BfTUFDSElORT15CisKKyMKKyMgUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzCisjCitDT05GSUdfWDg2X1BDPXkKKyMgQ09ORklHX1g4Nl9FTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1g4Nl9WT1lBR0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1g4Nl9OVU1BUSBpcyBub3Qgc2V0CisjIENPTkZJR19YODZfU1VNTUlUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1g4Nl9CSUdTTVAgaXMgbm90IHNldAorIyBDT05GSUdfWDg2X1ZJU1dTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1g4Nl9HRU5FUklDQVJDSCBpcyBub3Qgc2V0CisjIENPTkZJR19YODZfRVM3MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX00zODYgaXMgbm90IHNldAorIyBDT05GSUdfTTQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19NNTg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX001ODZUU0MgaXMgbm90IHNldAorIyBDT05GSUdfTTU4Nk1NWCBpcyBub3Qgc2V0CisjIENPTkZJR19NNjg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01QRU5USVVNSUkgaXMgbm90IHNldAorIyBDT05GSUdfTVBFTlRJVU1JSUkgaXMgbm90IHNldAorIyBDT05GSUdfTVBFTlRJVU1NIGlzIG5vdCBzZXQKK0NPTkZJR19NUEVOVElVTTQ9eQorIyBDT05GSUdfTUs2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01LNyBpcyBub3Qgc2V0CisjIENPTkZJR19NSzggaXMgbm90IHNldAorIyBDT05GSUdfTUNSVVNPRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRUZGSUNFT04gaXMgbm90IHNldAorIyBDT05GSUdfTVdJTkNISVBDNiBpcyBub3Qgc2V0CisjIENPTkZJR19NV0lOQ0hJUDIgaXMgbm90IHNldAorIyBDT05GSUdfTVdJTkNISVAzRCBpcyBub3Qgc2V0CisjIENPTkZJR19NQ1lSSVhJSUkgaXMgbm90IHNldAorIyBDT05GSUdfTVZJQUMzXzIgaXMgbm90IHNldAorIyBDT05GSUdfWDg2X0dFTkVSSUMgaXMgbm90IHNldAorQ09ORklHX1g4Nl9DTVBYQ0hHPXkKK0NPTkZJR19YODZfWEFERD15CitDT05GSUdfWDg2X0wxX0NBQ0hFX1NISUZUPTcKK0NPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15CitDT05GSUdfWDg2X1dQX1dPUktTX09LPXkKK0NPTkZJR19YODZfSU5WTFBHPXkKK0NPTkZJR19YODZfQlNXQVA9eQorQ09ORklHX1g4Nl9QT1BBRF9PSz15CitDT05GSUdfWDg2X0dPT0RfQVBJQz15CitDT05GSUdfWDg2X0lOVEVMX1VTRVJDT1BZPXkKK0NPTkZJR19YODZfVVNFX1BQUk9fQ0hFQ0tTVU09eQorIyBDT05GSUdfSFBFVF9USU1FUiBpcyBub3Qgc2V0CitDT05GSUdfU01QPXkKK0NPTkZJR19OUl9DUFVTPTgKKyMgQ09ORklHX1NDSEVEX1NNVCBpcyBub3Qgc2V0CitDT05GSUdfUFJFRU1QVD15CitDT05GSUdfWDg2X0xPQ0FMX0FQSUM9eQorQ09ORklHX1g4Nl9JT19BUElDPXkKK0NPTkZJR19YODZfVFNDPXkKK0NPTkZJR19YODZfTUNFPXkKK0NPTkZJR19YODZfTUNFX05PTkZBVEFMPXkKKyMgQ09ORklHX1g4Nl9NQ0VfUDRUSEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPU0hJQkEgaXMgbm90IHNldAorIyBDT05GSUdfSThLIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JQ1JPQ09ERSBpcyBub3Qgc2V0CisjIENPTkZJR19YODZfTVNSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1g4Nl9DUFVJRCBpcyBub3Qgc2V0CisKKyMKKyMgRmlybXdhcmUgRHJpdmVycworIworIyBDT05GSUdfRUREIGlzIG5vdCBzZXQKK0NPTkZJR19OT0hJR0hNRU09eQorIyBDT05GSUdfSElHSE1FTTRHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJR0hNRU02NEcgaXMgbm90IHNldAorIyBDT05GSUdfTUFUSF9FTVVMQVRJT04gaXMgbm90IHNldAorQ09ORklHX01UUlI9eQorIyBDT05GSUdfRUZJIGlzIG5vdCBzZXQKK0NPTkZJR19JUlFCQUxBTkNFPXkKK0NPTkZJR19IQVZFX0RFQ19MT0NLPXkKKyMgQ09ORklHX1JFR1BBUk0gaXMgbm90IHNldAorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucyAoQUNQSSwgQVBNKQorIworQ09ORklHX1BNPXkKKyMgQ09ORklHX1BNX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19TT0ZUV0FSRV9TVVNQRU5EPXkKK0NPTkZJR19QTV9TVERfUEFSVElUSU9OPSIiCisKKyMKKyMgQUNQSSAoQWR2YW5jZWQgQ29uZmlndXJhdGlvbiBhbmQgUG93ZXIgSW50ZXJmYWNlKSBTdXBwb3J0CisjCitDT05GSUdfQUNQST15CitDT05GSUdfQUNQSV9CT09UPXkKK0NPTkZJR19BQ1BJX0lOVEVSUFJFVEVSPXkKK0NPTkZJR19BQ1BJX1NMRUVQPXkKK0NPTkZJR19BQ1BJX1NMRUVQX1BST0NfRlM9eQorQ09ORklHX0FDUElfQUM9eQorQ09ORklHX0FDUElfQkFUVEVSWT15CitDT05GSUdfQUNQSV9CVVRUT049eQorQ09ORklHX0FDUElfVklERU89eQorQ09ORklHX0FDUElfRkFOPXkKK0NPTkZJR19BQ1BJX1BST0NFU1NPUj15CitDT05GSUdfQUNQSV9USEVSTUFMPXkKKyMgQ09ORklHX0FDUElfQVNVUyBpcyBub3Qgc2V0CisjIENPTkZJR19BQ1BJX0lCTSBpcyBub3Qgc2V0CisjIENPTkZJR19BQ1BJX1RPU0hJQkEgaXMgbm90IHNldAorIyBDT05GSUdfQUNQSV9DVVNUT01fRFNEVCBpcyBub3Qgc2V0CitDT05GSUdfQUNQSV9CTEFDS0xJU1RfWUVBUj0wCisjIENPTkZJR19BQ1BJX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19BQ1BJX0JVUz15CitDT05GSUdfQUNQSV9FQz15CitDT05GSUdfQUNQSV9QT1dFUj15CitDT05GSUdfQUNQSV9QQ0k9eQorQ09ORklHX0FDUElfU1lTVEVNPXkKKyMgQ09ORklHX1g4Nl9QTV9USU1FUiBpcyBub3Qgc2V0CisKKyMKKyMgQVBNIChBZHZhbmNlZCBQb3dlciBNYW5hZ2VtZW50KSBCSU9TIFN1cHBvcnQKKyMKKyMgQ09ORklHX0FQTSBpcyBub3Qgc2V0CisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisKKyMKKyMgQnVzIG9wdGlvbnMgKFBDSSwgUENNQ0lBLCBFSVNBLCBNQ0EsIElTQSkKKyMKK0NPTkZJR19QQ0k9eQorIyBDT05GSUdfUENJX0dPQklPUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0lfR09NTUNPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0lfR09ESVJFQ1QgaXMgbm90IHNldAorQ09ORklHX1BDSV9HT0FOWT15CitDT05GSUdfUENJX0JJT1M9eQorQ09ORklHX1BDSV9ESVJFQ1Q9eQorQ09ORklHX1BDSV9NTUNPTkZJRz15CisjIENPTkZJR19QQ0lfTVNJIGlzIG5vdCBzZXQKK0NPTkZJR19QQ0lfTEVHQUNZX1BST0M9eQorQ09ORklHX1BDSV9OQU1FUz15CitDT05GSUdfSVNBPXkKKyMgQ09ORklHX0VJU0EgaXMgbm90IHNldAorIyBDT05GSUdfTUNBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDeDIwMCBpcyBub3Qgc2V0CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBQQy1jYXJkIGJyaWRnZXMKKyMKK0NPTkZJR19QQ01DSUFfUFJPQkU9eQorCisjCisjIFBDSSBIb3RwbHVnIFN1cHBvcnQKKyMKKyMgQ09ORklHX0hPVFBMVUdfUENJIGlzIG5vdCBzZXQKKworIworIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorQ09ORklHX0JJTkZNVF9BT1VUPXkKK0NPTkZJR19CSU5GTVRfTUlTQz15CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCisjIENPTkZJR19TVEFOREFMT05FIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKK0NPTkZJR19GV19MT0FERVI9bQorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCisjIENPTkZJR19NVEQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCitDT05GSUdfUE5QPXkKKyMgQ09ORklHX1BOUF9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgUHJvdG9jb2xzCisjCisjIENPTkZJR19JU0FQTlAgaXMgbm90IHNldAorIyBDT05GSUdfUE5QQklPUyBpcyBub3Qgc2V0CitDT05GSUdfUE5QQUNQST15CisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworQ09ORklHX0JMS19ERVZfRkQ9eQorIyBDT05GSUdfQkxLX0RFVl9YRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTE9PUD15CitDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QPXkKK0NPTkZJR19CTEtfREVWX05CRD15CisjIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VCIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2CisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorQ09ORklHX0xCRD15CitDT05GSUdfQ0RST01fUEtUQ0RWRD15CitDT05GSUdfQ0RST01fUEtUQ0RWRF9CVUZGRVJTPTgKKyMgQ09ORklHX0NEUk9NX1BLVENEVkRfV0NBQ0hFIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisKKyMKKyMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAorIworQ09ORklHX0lERT15CitDT05GSUdfQkxLX0RFVl9JREU9eQorCisjCisjIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9pZGUudHh0IGZvciBoZWxwL2luZm8gb24gSURFIGRyaXZlcworIworIyBDT05GSUdfQkxLX0RFVl9JREVfU0FUQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hEX0lERSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVESVNLPXkKK0NPTkZJR19JREVESVNLX01VTFRJX01PREU9eQorQ09ORklHX0JMS19ERVZfSURFQ0Q9eQorIyBDT05GSUdfQkxLX0RFVl9JREVUQVBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFRkxPUFBZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19JREVfVEFTS19JT0NUTCBpcyBub3Qgc2V0CisKKyMKKyMgSURFIGNoaXBzZXQgc3VwcG9ydC9idWdmaXhlcworIworQ09ORklHX0lERV9HRU5FUklDPXkKK0NPTkZJR19CTEtfREVWX0NNRDY0MD15CisjIENPTkZJR19CTEtfREVWX0NNRDY0MF9FTkhBTkNFRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERVBOUCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVQQ0k9eQorQ09ORklHX0lERVBDSV9TSEFSRV9JUlE9eQorIyBDT05GSUdfQkxLX0RFVl9PRkZCT0FSRCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9HRU5FUklDPXkKKyMgQ09ORklHX0JMS19ERVZfT1BUSTYyMSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1JaMTAwMCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVETUFfUENJPXkKKyMgQ09ORklHX0JMS19ERVZfSURFRE1BX0ZPUkNFRCBpcyBub3Qgc2V0CitDT05GSUdfSURFRE1BX1BDSV9BVVRPPXkKKyMgQ09ORklHX0lERURNQV9PTkxZRElTSyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0FFQzYyWFggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9BTEkxNVgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQU1ENzRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0FUSUlYUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NNRDY0WCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1RSSUZMRVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DWTgyQzY5MyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NTNTUyMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NTNTUzMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hQVDM0WCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hQVDM2NiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NDMTIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BJSVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OUzg3NDE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfTkVXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1ZXS1MgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TSUlNQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1NJUzU1MTM9eQorIyBDT05GSUdfQkxLX0RFVl9TTEM5MEU2NiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1RSTTI5MCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1ZJQTgyQ1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19JREVfQVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERV9DSElQU0VUUyBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVETUE9eQorIyBDT05GSUdfSURFRE1BX0lWQiBpcyBub3Qgc2V0CitDT05GSUdfSURFRE1BX0FVVE89eQorIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX1NDU0k9eQorIyBDT05GSUdfU0NTSV9QUk9DX0ZTIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQorIworIyBDT05GSUdfQkxLX0RFVl9TRCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfT1NTVCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfU0cgaXMgbm90IHNldAorCisjCisjIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcworIworIyBDT05GSUdfU0NTSV9NVUxUSV9MVU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9DT05TVEFOVFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIFRyYW5zcG9ydCBBdHRyaWJ1dGVzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCisjCisjIENPTkZJR19CTEtfREVWXzNXX1hYWFhfUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJXzNXXzlYWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV83MDAwRkFTU1QgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FIQTE1MlggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSEExNTQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUFDUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzdYWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3WFhYX09MRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzc5WFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EUFRfSTJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU4yMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX05FV0dFTiBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9MRUdBQ1kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQlVTTE9HSUMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RUQzMyODAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9FQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRUFUQV9QSU8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfR0RUSCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0dFTkVSSUNfTkNSNTM4MCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0dFTkVSSUNfTkNSNTM4MF9NTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05DUjUzQzQwNkEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TWU01M0M4WFhfMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lQUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1BBUzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUFNJMjQwSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMT0dJQ19GQVMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTE9HSUNfSVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDXzEyODAgaXMgbm90IHNldAorQ09ORklHX1NDU0lfUUxBMlhYWD15CisjIENPTkZJR19TQ1NJX1FMQTIxWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEEyMlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBMjMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQTIzMjIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEE2MzEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBNjMyMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NZTTUzQzQxNiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzk1eCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1QxMjggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9VMTRfMzRGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfVUxUUkFTVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgT2xkIENELVJPTSBkcml2ZXJzIChub3QgU0NTSSwgbm90IElERSkKKyMKKyMgQ09ORklHX0NEX05PX0lERVNDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisjIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0CisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSTJPPXkKK0NPTkZJR19JMk9fQ09ORklHPXkKK0NPTkZJR19JMk9fQkxPQ0s9eQorIyBDT05GSUdfSTJPX1NDU0kgaXMgbm90IHNldAorQ09ORklHX0kyT19QUk9DPXkKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CitDT05GSUdfUEFDS0VUX01NQVA9eQorIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorQ09ORklHX05FVF9LRVk9eQorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CitDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSPXkKK0NPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVM9eQorQ09ORklHX0lQX1JPVVRFX0ZXTUFSSz15CitDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIPXkKK0NPTkZJR19JUF9ST1VURV9WRVJCT1NFPXkKKyMgQ09ORklHX0lQX1BOUCBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0lQSVA9eQorQ09ORklHX05FVF9JUEdSRT15CitDT05GSUdfTkVUX0lQR1JFX0JST0FEQ0FTVD15CitDT05GSUdfSVBfTVJPVVRFPXkKK0NPTkZJR19JUF9QSU1TTV9WMT15CitDT05GSUdfSVBfUElNU01fVjI9eQorQ09ORklHX0FSUEQ9eQorQ09ORklHX1NZTl9DT09LSUVTPXkKK0NPTkZJR19JTkVUX0FIPXkKK0NPTkZJR19JTkVUX0VTUD15CitDT05GSUdfSU5FVF9JUENPTVA9eQorQ09ORklHX0lORVRfVFVOTkVMPXkKK0NPTkZJR19JUF9UQ1BESUFHPXkKK0NPTkZJR19JUF9UQ1BESUFHX0lQVjY9eQorCisjCisjIElQOiBWaXJ0dWFsIFNlcnZlciBDb25maWd1cmF0aW9uCisjCisjIENPTkZJR19JUF9WUyBpcyBub3Qgc2V0CitDT05GSUdfSVBWNj15CitDT05GSUdfSVBWNl9QUklWQUNZPXkKK0NPTkZJR19JTkVUNl9BSD15CitDT05GSUdfSU5FVDZfRVNQPXkKK0NPTkZJR19JTkVUNl9JUENPTVA9eQorQ09ORklHX0lORVQ2X1RVTk5FTD15CitDT05GSUdfSVBWNl9UVU5ORUw9eQorQ09ORklHX05FVEZJTFRFUj15CisjIENPTkZJR19ORVRGSUxURVJfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0JSSURHRV9ORVRGSUxURVI9eQorCisjCisjIElQOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgorIworQ09ORklHX0lQX05GX0NPTk5UUkFDSz15CitDT05GSUdfSVBfTkZfQ1RfQUNDVD15CitDT05GSUdfSVBfTkZfQ09OTlRSQUNLX01BUks9eQorIyBDT05GSUdfSVBfTkZfQ1RfUFJPVE9fU0NUUCBpcyBub3Qgc2V0CitDT05GSUdfSVBfTkZfRlRQPXkKK0NPTkZJR19JUF9ORl9JUkM9eQorQ09ORklHX0lQX05GX1RGVFA9eQorIyBDT05GSUdfSVBfTkZfQU1BTkRBIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9RVUVVRT15CitDT05GSUdfSVBfTkZfSVBUQUJMRVM9eQorQ09ORklHX0lQX05GX01BVENIX0xJTUlUPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9JUFJBTkdFPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9NQUM9eQorQ09ORklHX0lQX05GX01BVENIX1BLVFRZUEU9eQorQ09ORklHX0lQX05GX01BVENIX01BUks9eQorQ09ORklHX0lQX05GX01BVENIX01VTFRJUE9SVD15CitDT05GSUdfSVBfTkZfTUFUQ0hfVE9TPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9SRUNFTlQ9eQorQ09ORklHX0lQX05GX01BVENIX0VDTj15CitDT05GSUdfSVBfTkZfTUFUQ0hfRFNDUD15CitDT05GSUdfSVBfTkZfTUFUQ0hfQUhfRVNQPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9MRU5HVEg9eQorQ09ORklHX0lQX05GX01BVENIX1RUTD15CitDT05GSUdfSVBfTkZfTUFUQ0hfVENQTVNTPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9IRUxQRVI9eQorQ09ORklHX0lQX05GX01BVENIX1NUQVRFPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9DT05OVFJBQ0s9eQorQ09ORklHX0lQX05GX01BVENIX09XTkVSPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9QSFlTREVWPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9BRERSVFlQRT15CitDT05GSUdfSVBfTkZfTUFUQ0hfUkVBTE09eQorIyBDT05GSUdfSVBfTkZfTUFUQ0hfU0NUUCBpcyBub3Qgc2V0CitDT05GSUdfSVBfTkZfTUFUQ0hfQ09NTUVOVD15CitDT05GSUdfSVBfTkZfTUFUQ0hfQ09OTk1BUks9eQorQ09ORklHX0lQX05GX01BVENIX0hBU0hMSU1JVD15CitDT05GSUdfSVBfTkZfRklMVEVSPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfUkVKRUNUPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfTE9HPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfVUxPRz15CitDT05GSUdfSVBfTkZfVEFSR0VUX1RDUE1TUz15CitDT05GSUdfSVBfTkZfTkFUPXkKK0NPTkZJR19JUF9ORl9OQVRfTkVFREVEPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfTUFTUVVFUkFERT15CitDT05GSUdfSVBfTkZfVEFSR0VUX1JFRElSRUNUPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfTkVUTUFQPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfU0FNRT15CisjIENPTkZJR19JUF9ORl9OQVRfTE9DQUwgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfTkFUX1NOTVBfQkFTSUMgaXMgbm90IHNldAorQ09ORklHX0lQX05GX05BVF9JUkM9eQorQ09ORklHX0lQX05GX05BVF9GVFA9eQorQ09ORklHX0lQX05GX05BVF9URlRQPXkKK0NPTkZJR19JUF9ORl9NQU5HTEU9eQorQ09ORklHX0lQX05GX1RBUkdFVF9UT1M9eQorQ09ORklHX0lQX05GX1RBUkdFVF9FQ049eQorQ09ORklHX0lQX05GX1RBUkdFVF9EU0NQPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfTUFSSz15CitDT05GSUdfSVBfTkZfVEFSR0VUX0NMQVNTSUZZPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfQ09OTk1BUks9eQorQ09ORklHX0lQX05GX1RBUkdFVF9DTFVTVEVSSVA9eQorQ09ORklHX0lQX05GX1JBVz15CitDT05GSUdfSVBfTkZfVEFSR0VUX05PVFJBQ0s9eQorQ09ORklHX0lQX05GX0FSUFRBQkxFUz15CitDT05GSUdfSVBfTkZfQVJQRklMVEVSPXkKK0NPTkZJR19JUF9ORl9BUlBfTUFOR0xFPXkKKworIworIyBJUHY2OiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgorIworQ09ORklHX0lQNl9ORl9RVUVVRT15CitDT05GSUdfSVA2X05GX0lQVEFCTEVTPXkKK0NPTkZJR19JUDZfTkZfTUFUQ0hfTElNSVQ9eQorQ09ORklHX0lQNl9ORl9NQVRDSF9NQUM9eQorQ09ORklHX0lQNl9ORl9NQVRDSF9SVD15CitDT05GSUdfSVA2X05GX01BVENIX09QVFM9eQorQ09ORklHX0lQNl9ORl9NQVRDSF9GUkFHPXkKK0NPTkZJR19JUDZfTkZfTUFUQ0hfSEw9eQorQ09ORklHX0lQNl9ORl9NQVRDSF9NVUxUSVBPUlQ9eQorQ09ORklHX0lQNl9ORl9NQVRDSF9PV05FUj15CitDT05GSUdfSVA2X05GX01BVENIX01BUks9eQorQ09ORklHX0lQNl9ORl9NQVRDSF9JUFY2SEVBREVSPXkKK0NPTkZJR19JUDZfTkZfTUFUQ0hfQUhFU1A9eQorQ09ORklHX0lQNl9ORl9NQVRDSF9MRU5HVEg9eQorQ09ORklHX0lQNl9ORl9NQVRDSF9FVUk2ND15CitDT05GSUdfSVA2X05GX01BVENIX1BIWVNERVY9eQorQ09ORklHX0lQNl9ORl9GSUxURVI9eQorQ09ORklHX0lQNl9ORl9UQVJHRVRfTE9HPXkKK0NPTkZJR19JUDZfTkZfTUFOR0xFPXkKK0NPTkZJR19JUDZfTkZfVEFSR0VUX01BUks9eQorQ09ORklHX0lQNl9ORl9SQVc9eQorCisjCisjIEJyaWRnZTogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX0JSSURHRV9ORl9FQlRBQkxFUyBpcyBub3Qgc2V0CitDT05GSUdfWEZSTT15CitDT05GSUdfWEZSTV9VU0VSPXkKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorQ09ORklHX0FUTT15CisjIENPTkZJR19BVE1fQ0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fTEFORSBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fQlIyNjg0IGlzIG5vdCBzZXQKK0NPTkZJR19CUklER0U9eQorQ09ORklHX1ZMQU5fODAyMVE9eQorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19MTEM9eQorQ09ORklHX0xMQzI9eQorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorCisjCisjIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZworIworQ09ORklHX05FVF9TQ0hFRD15CitDT05GSUdfTkVUX1NDSF9DTEtfSklGRklFUz15CisjIENPTkZJR19ORVRfU0NIX0NMS19HRVRUSU1FT0ZEQVkgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1NDSF9DTEtfQ1BVIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfU0NIX0NCUT15CitDT05GSUdfTkVUX1NDSF9IVEI9eQorQ09ORklHX05FVF9TQ0hfSEZTQz15CitDT05GSUdfTkVUX1NDSF9BVE09eQorQ09ORklHX05FVF9TQ0hfUFJJTz15CitDT05GSUdfTkVUX1NDSF9SRUQ9eQorQ09ORklHX05FVF9TQ0hfU0ZRPXkKK0NPTkZJR19ORVRfU0NIX1RFUUw9eQorQ09ORklHX05FVF9TQ0hfVEJGPXkKK0NPTkZJR19ORVRfU0NIX0dSRUQ9eQorQ09ORklHX05FVF9TQ0hfRFNNQVJLPXkKK0NPTkZJR19ORVRfU0NIX05FVEVNPXkKK0NPTkZJR19ORVRfU0NIX0lOR1JFU1M9eQorQ09ORklHX05FVF9RT1M9eQorQ09ORklHX05FVF9FU1RJTUFUT1I9eQorQ09ORklHX05FVF9DTFM9eQorQ09ORklHX05FVF9DTFNfVENJTkRFWD15CitDT05GSUdfTkVUX0NMU19ST1VURTQ9eQorQ09ORklHX05FVF9DTFNfUk9VVEU9eQorQ09ORklHX05FVF9DTFNfRlc9eQorQ09ORklHX05FVF9DTFNfVTMyPXkKK0NPTkZJR19ORVRfQ0xTX0VHUD15CitDT05GSUdfRUdQX0RFQlVHPXkKK0NPTkZJR19ORVRfQ0xTX0VHUF9TSU1QTEVfQ01QPXkKK0NPTkZJR19ORVRfQ0xTX0VHUF9OQllURT15CitDT05GSUdfTkVUX0NMU19FR1BfS01QPXkKK0NPTkZJR19ORVRfQ0xTX0VHUF9SRUdFWFA9eQorQ09ORklHX05FVF9DTFNfRUdQX0NNRD15CitDT05GSUdfRUdQX0NNRF9CQUNLX1RUTD00MDk2CitDT05GSUdfQ0xTX1UzMl9QRVJGPXkKK0NPTkZJR19ORVRfQ0xTX0lORD15CitDT05GSUdfTkVUX0NMU19SU1ZQPXkKK0NPTkZJR19ORVRfQ0xTX1JTVlA2PXkKKyMgQ09ORklHX05FVF9DTFNfQUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfQ0xTX1BPTElDRT15CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCitDT05GSUdfTkVUX1BLVEdFTj15CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfRFVNTVk9eQorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorQ09ORklHX1RVTj15CisjIENPTkZJR19ORVRfU0IxMDAwIGlzIG5vdCBzZXQKKworIworIyBBUkNuZXQgZGV2aWNlcworIworIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CisjIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CisjIENPTkZJR19MQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1NNQyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1JBQ0FMIGlzIG5vdCBzZXQKKworIworIyBUdWxpcCBmYW1pbHkgbmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUMTcwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVBDQSBpcyBub3Qgc2V0CisjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVNBIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfUENJPXkKKyMgQ09ORklHX1BDTkVUMzIgaXMgbm90IHNldAorIyBDT05GSUdfQU1EODExMV9FVEggaXMgbm90IHNldAorIyBDT05GSUdfQURBUFRFQ19TVEFSRklSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BQzMyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVBSSUNPVCBpcyBub3Qgc2V0CisjIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfRk9SQ0VERVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NTODl4MCBpcyBub3Qgc2V0CisjIENPTkZJR19ER1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VFUFJPMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBTE5YIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BVFNFTUkgaXMgbm90IHNldAorIyBDT05GSUdfTkUyS19QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfODEzOUNQIGlzIG5vdCBzZXQKK0NPTkZJR184MTM5VE9PPXkKK0NPTkZJR184MTM5VE9PX1BJTz15CisjIENPTkZJR184MTM5VE9PX1RVTkVfVFdJU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5VE9PXzgxMjkgaXMgbm90IHNldAorIyBDT05GSUdfODEzOV9PTERfUlhfUkVTRVQgaXMgbm90IHNldAorIyBDT05GSUdfU0lTOTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VQSUMxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU1VOREFOQ0UgaXMgbm90IHNldAorIyBDT05GSUdfVExBTiBpcyBub3Qgc2V0CisjIENPTkZJR19WSUFfUkhJTkUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPQ0tFVCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMKKyMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0CisjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAorIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CisjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAorIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAorIyBDT05GSUdfU0s5OExJTiBpcyBub3Qgc2V0CisjIENPTkZJR19WSUFfVkVMT0NJVFkgaXMgbm90IHNldAorIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKyMgQ09ORklHX0lYR0IgaXMgbm90IHNldAorIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorCisjCisjIEFUTSBkcml2ZXJzCisjCisjIENPTkZJR19BVE1fVENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTV9MQU5BSSBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fRU5JIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTV9GSVJFU1RSRUFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTV9aQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTV9OSUNTVEFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTV9JRFQ3NzI1MiBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fQU1CQVNTQURPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fSE9SSVpPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fSUEgaXMgbm90IHNldAorIyBDT05GSUdfQVRNX0ZPUkUyMDBFX01BWUJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTV9IRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRERJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKK0NPTkZJR19QUFA9eQorQ09ORklHX1BQUF9NVUxUSUxJTks9eQorQ09ORklHX1BQUF9GSUxURVI9eQorIyBDT05GSUdfUFBQX0FTWU5DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUF9TWU5DX1RUWSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFBfREVGTEFURSBpcyBub3Qgc2V0CitDT05GSUdfUFBQX0JTRENPTVA9eQorIyBDT05GSUdfUFBQT0UgaXMgbm90IHNldAorIyBDT05GSUdfUFBQT0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9GQyBpcyBub3Qgc2V0CitDT05GSUdfU0hBUEVSPXkKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBUZWxlcGhvbnkgU3VwcG9ydAorIworIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgSS9PIGRyaXZlcnMKKyMKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORF9HQU1FUE9SVD15CitDT05GSUdfU0VSSU89eQorQ09ORklHX1NFUklPX0k4MDQyPXkKKyMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU9fQ1Q4MkM3MTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU9fUENJUFMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKK0NPTkZJR19JTlBVVF9LRVlCT0FSRD15CitDT05GSUdfS0VZQk9BUkRfQVRLQkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTU9VU0U9eQorQ09ORklHX01PVVNFX1BTMj15CisjIENPTkZJR19NT1VTRV9TRVJJQUwgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfSU5QT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX0xPR0lCTSBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9QQzExMFBBRCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9WU1hYWEFBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworQ09ORklHX1NFUklBTF84MjUwPXkKKyMgQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMXzgyNTBfQUNQSSBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9NAorIyBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPTllQSSBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19BR1AgaXMgbm90IHNldAorIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01XQVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfSFBFVCBpcyBub3Qgc2V0CisjIENPTkZJR19IQU5HQ0hFQ0tfVElNRVIgaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj15CisKKyMKKyMgSTJDIEFsZ29yaXRobXMKKyMKK0NPTkZJR19JMkNfQUxHT0JJVD15CisjIENPTkZJR19JMkNfQUxHT1BDRiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxHT1BDQSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCisjIENPTkZJR19JMkNfQUxJMTUzNSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTU2MyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTVYMyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQU1ENzU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTUQ4MTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JODAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JODEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JU0EgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX05GT1JDRTIgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BJSVg0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QUk9TQVZBR0UgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NBVkFHRTQgaXMgbm90IHNldAorIyBDT05GSUdfU0N4MjAwX0FDQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTNTU5NSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTNjMwIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfU0lTOTZYPXkKKyMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZJQVBSTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVk9PRE9PMyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUENBX0lTQSBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgU2Vuc29ycyBDaGlwIHN1cHBvcnQKKyMKK0NPTkZJR19JMkNfU0VOU09SPXkKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVNCMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDSEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVklBNjg2QSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CisKKyMKKyMgT3RoZXIgSTJDIENoaXAgc3VwcG9ydAorIworQ09ORklHX1NFTlNPUlNfRUVQUk9NPXkKKyMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19SVEM4NTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIERhbGxhcydzIDEtd2lyZSBidXMKKyMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKyMgQ09ORklHX0lCTV9BU00gaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX1NFTEVDVCBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCitDT05GSUdfVkdBX0NPTlNPTEU9eQorIyBDT05GSUdfTURBX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQorCisjCisjIFNvdW5kCisjCitDT05GSUdfU09VTkQ9eQorCisjCisjIEFkdmFuY2VkIExpbnV4IFNvdW5kIEFyY2hpdGVjdHVyZQorIworQ09ORklHX1NORD15CitDT05GSUdfU05EX1RJTUVSPXkKK0NPTkZJR19TTkRfUENNPXkKK0NPTkZJR19TTkRfSFdERVA9eQorQ09ORklHX1NORF9SQVdNSURJPXkKK0NPTkZJR19TTkRfU0VRVUVOQ0VSPXkKKyMgQ09ORklHX1NORF9TRVFfRFVNTVkgaXMgbm90IHNldAorQ09ORklHX1NORF9PU1NFTVVMPXkKK0NPTkZJR19TTkRfTUlYRVJfT1NTPXkKK0NPTkZJR19TTkRfUENNX09TUz15CitDT05GSUdfU05EX1NFUVVFTkNFUl9PU1M9eQorIyBDT05GSUdfU05EX1ZFUkJPU0VfUFJJTlRLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgR2VuZXJpYyBkZXZpY2VzCisjCisjIENPTkZJR19TTkRfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1ZJUk1JREkgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01UUEFWIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TRVJJQUxfVTE2NTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NUFU0MDEgaXMgbm90IHNldAorCisjCisjIElTQSBkZXZpY2VzCisjCisjIENPTkZJR19TTkRfQUQxODQ4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9DUzQyMzEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0NTNDIzMiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQ1M0MjM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9FUzE2ODggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VTMThYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfR1VTQ0xBU1NJQyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfR1VTRVhUUkVNRSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfR1VTTUFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9JTlRFUldBVkUgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0lOVEVSV0FWRV9TVEIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX09QVEk5MlhfQUQxODQ4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9PUFRJOTJYX0NTNDIzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfT1BUSTkzWCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU0I4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TQjE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TQkFXRSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfV0FWRUZST05UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9DTUk4MzMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9PUEwzU0EyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TR0FMQVhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TU0NBUEUgaXMgbm90IHNldAorCisjCisjIFBDSSBkZXZpY2VzCisjCitDT05GSUdfU05EX0FDOTdfQ09ERUM9eQorIyBDT05GSUdfU05EX0FMSTU0NTEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FUSUlYUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVRJSVhQX01PREVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BVTg4MTAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FVODgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVU4ODMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BWlQzMzI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9CVDg3WCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQ1M0NlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9DUzQyODEgaXMgbm90IHNldAorQ09ORklHX1NORF9FTVUxMEsxPXkKKyMgQ09ORklHX1NORF9LT1JHMTIxMiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTUlYQVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9OTTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfUk1FMzIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1JNRTk2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9STUU5NjUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9IRFNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9UUklERU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9ZTUZQQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FMUzQwMDAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0NNSVBDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRU5TMTM3MCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRU5TMTM3MSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRVMxOTM4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9FUzE5NjggaXMgbm90IHNldAorIyBDT05GSUdfU05EX01BRVNUUk8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9GTTgwMSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSUNFMTcxMiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSUNFMTcyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSU5URUw4WDAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0lOVEVMOFgwTSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU09OSUNWSUJFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfVklBODJYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfVlgyMjIgaXMgbm90IHNldAorCisjCisjIFVTQiBkZXZpY2VzCisjCisjIENPTkZJR19TTkRfVVNCX0FVRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9VU0JfVVNYMlkgaXMgbm90IHNldAorCisjCisjIE9wZW4gU291bmQgU3lzdGVtCisjCisjIENPTkZJR19TT1VORF9QUklNRSBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0I9eQorIyBDT05GSUdfVVNCX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIFVTQiBvcHRpb25zCisjCitDT05GSUdfVVNCX0RFVklDRUZTPXkKKyMgQ09ORklHX1VTQl9CQU5EV0lEVEggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVVNQRU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEcgaXMgbm90IHNldAorQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKKworIworIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKKyMKK0NPTkZJR19VU0JfRUhDSV9IQ0Q9eQorIyBDT05GSUdfVVNCX0VIQ0lfU1BMSVRfSVNPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FSENJX1JPT1RfSFVCX1RUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PSENJX0hDRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1VIQ0lfSENEPXkKKworIworIyBVU0IgRGV2aWNlIENsYXNzIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9BVURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQkxVRVRPT1RIX1RUWSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTUlESSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQUNNIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfUFJJTlRFUj15CitDT05GSUdfVVNCX1NUT1JBR0U9eQorIyBDT05GSUdfVVNCX1NUT1JBR0VfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfUldfREVURUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RBVEFGQUIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfRlJFRUNPTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9JU0QyMDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfRFBDTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9IUDgyMDBlIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFIwOSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSNTUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSlVNUFNIT1QgaXMgbm90IHNldAorCisjCisjIFVTQiBJbnB1dCBEZXZpY2VzCisjCitDT05GSUdfVVNCX0hJRD15CitDT05GSUdfVVNCX0hJRElOUFVUPXkKKyMgQ09ORklHX0hJRF9GRiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSElEREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BSVBURUsgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1dBQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LQlRBQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUE9XRVJNQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NVE9VQ0ggaXMgbm90IHNldAorQ09ORklHX1VTQl9FR0FMQVg9bQorIyBDT05GSUdfVVNCX1hQQUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FUSV9SRU1PVEUgaXMgbm90IHNldAorCisjCisjIFVTQiBJbWFnaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01JQ1JPVEVLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9IUFVTQlNDU0kgaXMgbm90IHNldAorCisjCisjIFVTQiBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1VTQl9EQUJVU0IgaXMgbm90IHNldAorCisjCisjIFZpZGVvNExpbnV4IHN1cHBvcnQgaXMgbmVlZGVkIGZvciBVU0IgTXVsdGltZWRpYSBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCisjCisjIENPTkZJR19VU0JfQ0FUQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QRUdBU1VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90IHNldAorCisjCisjIFVTQiBwb3J0IGRyaXZlcnMKKyMKKworIworIyBVU0IgU2VyaWFsIENvbnZlcnRlciBzdXBwb3J0CisjCisjIENPTkZJR19VU0JfU0VSSUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgTWlzY2VsbGFuZW91cyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9USUdMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVUVSU1dBTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JJTzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEVHT1RPV0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0NZVEhFUk09bQorIyBDT05GSUdfVVNCX1BISURHRVRLSVQgaXMgbm90IHNldAorQ09ORklHX1VTQl9QSElER0VUU0VSVk89bQorIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAorCisjCisjIFVTQiBBVE0vRFNMIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9BVE0gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NQRUVEVE9VQ0ggaXMgbm90IHNldAorCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKKyMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorQ09ORklHX0pCRD15CisjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0ZTX01CQ0FDSEU9eQorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0FVVE9GUzRfRlM9eQorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19JU085NjYwX0ZTPXkKK0NPTkZJR19KT0xJRVQ9eQorIyBDT05GSUdfWklTT0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19VREZfRlM9eQorQ09ORklHX1VERl9OTFM9eQorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19GQVRfRlM9eQorQ09ORklHX01TRE9TX0ZTPXkKK0NPTkZJR19WRkFUX0ZTPXkKK0NPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT00MzcKK0NPTkZJR19GQVRfREVGQVVMVF9JT0NIQVJTRVQ9Imlzbzg4NTktMSIKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1BST0NfS0NPUkU9eQorQ09ORklHX1NZU0ZTPXkKKyMgQ09ORklHX0RFVkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfVE1QRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQkZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKKyMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKK0NPTkZJR19ORlNEPXkKKyMgQ09ORklHX05GU0RfVjMgaXMgbm90IHNldAorQ09ORklHX05GU0RfVENQPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfRVhQT1JURlM9eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCitDT05GSUdfTkxTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0lTTzg4NTlfMT15CisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CisKKyMKKyMgUHJvZmlsaW5nIHN1cHBvcnQKKyMKK0NPTkZJR19QUk9GSUxJTkc9eQorQ09ORklHX09QUk9GSUxFPXkKKworIworIyBLZXJuZWwgaGFja2luZworIworQ09ORklHX0RFQlVHX0tFUk5FTD15CitDT05GSUdfTUFHSUNfU1lTUlE9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfU0xBQj15CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0VBUkxZX1BSSU5USz15CisjIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUEFHRUFMTE9DIGlzIG5vdCBzZXQKKyMgQ09ORklHXzRLU1RBQ0tTIGlzIG5vdCBzZXQKK0NPTkZJR19YODZfRklORF9TTVBfQ09ORklHPXkKK0NPTkZJR19YODZfTVBQQVJTRT15CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CitDT05GSUdfU0VDVVJJVFk9eQorQ09ORklHX1NFQ1VSSVRZX05FVFdPUks9eQorQ09ORklHX1NFQ1VSSVRZX0NBUEFCSUxJVElFUz1tCitDT05GSUdfU0VDVVJJVFlfUk9PVFBMVUc9bQorIyBDT05GSUdfU0VDVVJJVFlfU0VDTFZMIGlzIG5vdCBzZXQKK0NPTkZJR19TRUNVUklUWV9TRUxJTlVYPXkKKyMgQ09ORklHX1NFQ1VSSVRZX1NFTElOVVhfQk9PVFBBUkFNIGlzIG5vdCBzZXQKK0NPTkZJR19TRUNVUklUWV9TRUxJTlVYX0RJU0FCTEU9eQorQ09ORklHX1NFQ1VSSVRZX1NFTElOVVhfREVWRUxPUD15CisjIENPTkZJR19TRUNVUklUWV9TRUxJTlVYX01MUyBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCitDT05GSUdfQ1JZUFRPPXkKK0NPTkZJR19DUllQVE9fSE1BQz15CitDT05GSUdfQ1JZUFRPX05VTEw9eQorQ09ORklHX0NSWVBUT19NRDQ9eQorQ09ORklHX0NSWVBUT19NRDU9eQorQ09ORklHX0NSWVBUT19TSEExPXkKK0NPTkZJR19DUllQVE9fU0hBMjU2PXkKK0NPTkZJR19DUllQVE9fU0hBNTEyPXkKK0NPTkZJR19DUllQVE9fV1A1MTI9eQorQ09ORklHX0NSWVBUT19ERVM9eQorQ09ORklHX0NSWVBUT19CTE9XRklTSD15CitDT05GSUdfQ1JZUFRPX1RXT0ZJU0g9eQorQ09ORklHX0NSWVBUT19TRVJQRU5UPXkKK0NPTkZJR19DUllQVE9fQUVTXzU4Nj15CitDT05GSUdfQ1JZUFRPX0NBU1Q1PXkKK0NPTkZJR19DUllQVE9fQ0FTVDY9eQorQ09ORklHX0NSWVBUT19URUE9eQorQ09ORklHX0NSWVBUT19BUkM0PXkKK0NPTkZJR19DUllQVE9fS0hBWkFEPXkKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19ERUZMQVRFPXkKK0NPTkZJR19DUllQVE9fTUlDSEFFTF9NSUM9eQorQ09ORklHX0NSWVBUT19DUkMzMkM9eQorQ09ORklHX0NSWVBUT19URVNUPXkKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKK0NPTkZJR19MSUJDUkMzMkM9eQorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfWkxJQl9ERUZMQVRFPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfWDg2X1NNUD15CitDT05GSUdfWDg2X0hUPXkKK0NPTkZJR19YODZfQklPU19SRUJPT1Q9eQorQ09ORklHX1g4Nl9UUkFNUE9MSU5FPXkKK0NPTkZJR19QQz15CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90ZXN0c3VpdGUvY29uZmlncy9hbGwtcG9saWNlLWFjdCBiL2lwcm91dGUyL3Rlc3RzdWl0ZS9jb25maWdzL2FsbC1wb2xpY2UtYWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjODQyODIKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90ZXN0c3VpdGUvY29uZmlncy9hbGwtcG9saWNlLWFjdApAQCAtMCwwICsxLDE1MDQgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMC1yYzItYmsxMworIyBXZWQgRGVjICA4IDE0OjE5OjE3IDIwMDQKKyMKK0NPTkZJR19YODY9eQorQ09ORklHX01NVT15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX0dFTkVSSUNfSVNBX0RNQT15CitDT05GSUdfR0VORVJJQ19JT01BUD15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19DTEVBTl9DT01QSUxFPXkKK0NPTkZJR19MT0NLX0tFUk5FTD15CisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1BPU0lYX01RVUVVRT15CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorQ09ORklHX0FVRElUPXkKK0NPTkZJR19BVURJVFNZU0NBTEw9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19LT0JKRUNUX1VFVkVOVD15CitDT05GSUdfSUtDT05GSUc9eQorQ09ORklHX0lLQ09ORklHX1BST0M9eQorIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CitDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRD15CitDT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorQ09ORklHX1NUT1BfTUFDSElORT15CisKKyMKKyMgUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzCisjCitDT05GSUdfWDg2X1BDPXkKKyMgQ09ORklHX1g4Nl9FTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1g4Nl9WT1lBR0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1g4Nl9OVU1BUSBpcyBub3Qgc2V0CisjIENPTkZJR19YODZfU1VNTUlUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1g4Nl9CSUdTTVAgaXMgbm90IHNldAorIyBDT05GSUdfWDg2X1ZJU1dTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1g4Nl9HRU5FUklDQVJDSCBpcyBub3Qgc2V0CisjIENPTkZJR19YODZfRVM3MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX00zODYgaXMgbm90IHNldAorIyBDT05GSUdfTTQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19NNTg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX001ODZUU0MgaXMgbm90IHNldAorIyBDT05GSUdfTTU4Nk1NWCBpcyBub3Qgc2V0CisjIENPTkZJR19NNjg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01QRU5USVVNSUkgaXMgbm90IHNldAorIyBDT05GSUdfTVBFTlRJVU1JSUkgaXMgbm90IHNldAorIyBDT05GSUdfTVBFTlRJVU1NIGlzIG5vdCBzZXQKK0NPTkZJR19NUEVOVElVTTQ9eQorIyBDT05GSUdfTUs2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01LNyBpcyBub3Qgc2V0CisjIENPTkZJR19NSzggaXMgbm90IHNldAorIyBDT05GSUdfTUNSVVNPRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRUZGSUNFT04gaXMgbm90IHNldAorIyBDT05GSUdfTVdJTkNISVBDNiBpcyBub3Qgc2V0CisjIENPTkZJR19NV0lOQ0hJUDIgaXMgbm90IHNldAorIyBDT05GSUdfTVdJTkNISVAzRCBpcyBub3Qgc2V0CisjIENPTkZJR19NQ1lSSVhJSUkgaXMgbm90IHNldAorIyBDT05GSUdfTVZJQUMzXzIgaXMgbm90IHNldAorIyBDT05GSUdfWDg2X0dFTkVSSUMgaXMgbm90IHNldAorQ09ORklHX1g4Nl9DTVBYQ0hHPXkKK0NPTkZJR19YODZfWEFERD15CitDT05GSUdfWDg2X0wxX0NBQ0hFX1NISUZUPTcKK0NPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15CitDT05GSUdfWDg2X1dQX1dPUktTX09LPXkKK0NPTkZJR19YODZfSU5WTFBHPXkKK0NPTkZJR19YODZfQlNXQVA9eQorQ09ORklHX1g4Nl9QT1BBRF9PSz15CitDT05GSUdfWDg2X0dPT0RfQVBJQz15CitDT05GSUdfWDg2X0lOVEVMX1VTRVJDT1BZPXkKK0NPTkZJR19YODZfVVNFX1BQUk9fQ0hFQ0tTVU09eQorIyBDT05GSUdfSFBFVF9USU1FUiBpcyBub3Qgc2V0CitDT05GSUdfU01QPXkKK0NPTkZJR19OUl9DUFVTPTgKKyMgQ09ORklHX1NDSEVEX1NNVCBpcyBub3Qgc2V0CitDT05GSUdfUFJFRU1QVD15CitDT05GSUdfWDg2X0xPQ0FMX0FQSUM9eQorQ09ORklHX1g4Nl9JT19BUElDPXkKK0NPTkZJR19YODZfVFNDPXkKK0NPTkZJR19YODZfTUNFPXkKK0NPTkZJR19YODZfTUNFX05PTkZBVEFMPXkKKyMgQ09ORklHX1g4Nl9NQ0VfUDRUSEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPU0hJQkEgaXMgbm90IHNldAorIyBDT05GSUdfSThLIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JQ1JPQ09ERSBpcyBub3Qgc2V0CisjIENPTkZJR19YODZfTVNSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1g4Nl9DUFVJRCBpcyBub3Qgc2V0CisKKyMKKyMgRmlybXdhcmUgRHJpdmVycworIworIyBDT05GSUdfRUREIGlzIG5vdCBzZXQKK0NPTkZJR19OT0hJR0hNRU09eQorIyBDT05GSUdfSElHSE1FTTRHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJR0hNRU02NEcgaXMgbm90IHNldAorIyBDT05GSUdfTUFUSF9FTVVMQVRJT04gaXMgbm90IHNldAorQ09ORklHX01UUlI9eQorIyBDT05GSUdfRUZJIGlzIG5vdCBzZXQKK0NPTkZJR19JUlFCQUxBTkNFPXkKK0NPTkZJR19IQVZFX0RFQ19MT0NLPXkKKyMgQ09ORklHX1JFR1BBUk0gaXMgbm90IHNldAorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucyAoQUNQSSwgQVBNKQorIworQ09ORklHX1BNPXkKKyMgQ09ORklHX1BNX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19TT0ZUV0FSRV9TVVNQRU5EPXkKK0NPTkZJR19QTV9TVERfUEFSVElUSU9OPSIiCisKKyMKKyMgQUNQSSAoQWR2YW5jZWQgQ29uZmlndXJhdGlvbiBhbmQgUG93ZXIgSW50ZXJmYWNlKSBTdXBwb3J0CisjCitDT05GSUdfQUNQST15CitDT05GSUdfQUNQSV9CT09UPXkKK0NPTkZJR19BQ1BJX0lOVEVSUFJFVEVSPXkKK0NPTkZJR19BQ1BJX1NMRUVQPXkKK0NPTkZJR19BQ1BJX1NMRUVQX1BST0NfRlM9eQorQ09ORklHX0FDUElfQUM9eQorQ09ORklHX0FDUElfQkFUVEVSWT15CitDT05GSUdfQUNQSV9CVVRUT049eQorQ09ORklHX0FDUElfVklERU89eQorQ09ORklHX0FDUElfRkFOPXkKK0NPTkZJR19BQ1BJX1BST0NFU1NPUj15CitDT05GSUdfQUNQSV9USEVSTUFMPXkKKyMgQ09ORklHX0FDUElfQVNVUyBpcyBub3Qgc2V0CisjIENPTkZJR19BQ1BJX0lCTSBpcyBub3Qgc2V0CisjIENPTkZJR19BQ1BJX1RPU0hJQkEgaXMgbm90IHNldAorIyBDT05GSUdfQUNQSV9DVVNUT01fRFNEVCBpcyBub3Qgc2V0CitDT05GSUdfQUNQSV9CTEFDS0xJU1RfWUVBUj0wCisjIENPTkZJR19BQ1BJX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19BQ1BJX0JVUz15CitDT05GSUdfQUNQSV9FQz15CitDT05GSUdfQUNQSV9QT1dFUj15CitDT05GSUdfQUNQSV9QQ0k9eQorQ09ORklHX0FDUElfU1lTVEVNPXkKKyMgQ09ORklHX1g4Nl9QTV9USU1FUiBpcyBub3Qgc2V0CisKKyMKKyMgQVBNIChBZHZhbmNlZCBQb3dlciBNYW5hZ2VtZW50KSBCSU9TIFN1cHBvcnQKKyMKKyMgQ09ORklHX0FQTSBpcyBub3Qgc2V0CisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisKKyMKKyMgQnVzIG9wdGlvbnMgKFBDSSwgUENNQ0lBLCBFSVNBLCBNQ0EsIElTQSkKKyMKK0NPTkZJR19QQ0k9eQorIyBDT05GSUdfUENJX0dPQklPUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0lfR09NTUNPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0lfR09ESVJFQ1QgaXMgbm90IHNldAorQ09ORklHX1BDSV9HT0FOWT15CitDT05GSUdfUENJX0JJT1M9eQorQ09ORklHX1BDSV9ESVJFQ1Q9eQorQ09ORklHX1BDSV9NTUNPTkZJRz15CisjIENPTkZJR19QQ0lfTVNJIGlzIG5vdCBzZXQKK0NPTkZJR19QQ0lfTEVHQUNZX1BST0M9eQorQ09ORklHX1BDSV9OQU1FUz15CitDT05GSUdfSVNBPXkKKyMgQ09ORklHX0VJU0EgaXMgbm90IHNldAorIyBDT05GSUdfTUNBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDeDIwMCBpcyBub3Qgc2V0CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBQQy1jYXJkIGJyaWRnZXMKKyMKK0NPTkZJR19QQ01DSUFfUFJPQkU9eQorCisjCisjIFBDSSBIb3RwbHVnIFN1cHBvcnQKKyMKKyMgQ09ORklHX0hPVFBMVUdfUENJIGlzIG5vdCBzZXQKKworIworIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorQ09ORklHX0JJTkZNVF9BT1VUPXkKK0NPTkZJR19CSU5GTVRfTUlTQz15CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCisjIENPTkZJR19TVEFOREFMT05FIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKK0NPTkZJR19GV19MT0FERVI9bQorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCisjIENPTkZJR19NVEQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCitDT05GSUdfUE5QPXkKKyMgQ09ORklHX1BOUF9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgUHJvdG9jb2xzCisjCisjIENPTkZJR19JU0FQTlAgaXMgbm90IHNldAorIyBDT05GSUdfUE5QQklPUyBpcyBub3Qgc2V0CitDT05GSUdfUE5QQUNQST15CisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworQ09ORklHX0JMS19ERVZfRkQ9eQorIyBDT05GSUdfQkxLX0RFVl9YRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTE9PUD15CitDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QPXkKK0NPTkZJR19CTEtfREVWX05CRD15CisjIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VCIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2CisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorQ09ORklHX0xCRD15CitDT05GSUdfQ0RST01fUEtUQ0RWRD15CitDT05GSUdfQ0RST01fUEtUQ0RWRF9CVUZGRVJTPTgKKyMgQ09ORklHX0NEUk9NX1BLVENEVkRfV0NBQ0hFIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisKKyMKKyMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAorIworQ09ORklHX0lERT15CitDT05GSUdfQkxLX0RFVl9JREU9eQorCisjCisjIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9pZGUudHh0IGZvciBoZWxwL2luZm8gb24gSURFIGRyaXZlcworIworIyBDT05GSUdfQkxLX0RFVl9JREVfU0FUQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hEX0lERSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVESVNLPXkKK0NPTkZJR19JREVESVNLX01VTFRJX01PREU9eQorQ09ORklHX0JMS19ERVZfSURFQ0Q9eQorIyBDT05GSUdfQkxLX0RFVl9JREVUQVBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFRkxPUFBZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19JREVfVEFTS19JT0NUTCBpcyBub3Qgc2V0CisKKyMKKyMgSURFIGNoaXBzZXQgc3VwcG9ydC9idWdmaXhlcworIworQ09ORklHX0lERV9HRU5FUklDPXkKK0NPTkZJR19CTEtfREVWX0NNRDY0MD15CisjIENPTkZJR19CTEtfREVWX0NNRDY0MF9FTkhBTkNFRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERVBOUCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVQQ0k9eQorQ09ORklHX0lERVBDSV9TSEFSRV9JUlE9eQorIyBDT05GSUdfQkxLX0RFVl9PRkZCT0FSRCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9HRU5FUklDPXkKKyMgQ09ORklHX0JMS19ERVZfT1BUSTYyMSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1JaMTAwMCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVETUFfUENJPXkKKyMgQ09ORklHX0JMS19ERVZfSURFRE1BX0ZPUkNFRCBpcyBub3Qgc2V0CitDT05GSUdfSURFRE1BX1BDSV9BVVRPPXkKKyMgQ09ORklHX0lERURNQV9PTkxZRElTSyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0FFQzYyWFggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9BTEkxNVgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQU1ENzRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0FUSUlYUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NNRDY0WCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1RSSUZMRVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DWTgyQzY5MyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NTNTUyMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NTNTUzMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hQVDM0WCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hQVDM2NiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NDMTIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BJSVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OUzg3NDE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfTkVXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1ZXS1MgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TSUlNQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1NJUzU1MTM9eQorIyBDT05GSUdfQkxLX0RFVl9TTEM5MEU2NiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1RSTTI5MCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1ZJQTgyQ1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19JREVfQVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERV9DSElQU0VUUyBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVETUE9eQorIyBDT05GSUdfSURFRE1BX0lWQiBpcyBub3Qgc2V0CitDT05GSUdfSURFRE1BX0FVVE89eQorIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX1NDU0k9eQorIyBDT05GSUdfU0NTSV9QUk9DX0ZTIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQorIworIyBDT05GSUdfQkxLX0RFVl9TRCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfT1NTVCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfU0cgaXMgbm90IHNldAorCisjCisjIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcworIworIyBDT05GSUdfU0NTSV9NVUxUSV9MVU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9DT05TVEFOVFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIFRyYW5zcG9ydCBBdHRyaWJ1dGVzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCisjCisjIENPTkZJR19CTEtfREVWXzNXX1hYWFhfUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJXzNXXzlYWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV83MDAwRkFTU1QgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FIQTE1MlggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSEExNTQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUFDUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzdYWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3WFhYX09MRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzc5WFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EUFRfSTJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU4yMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX05FV0dFTiBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9MRUdBQ1kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQlVTTE9HSUMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RUQzMyODAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9FQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRUFUQV9QSU8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfR0RUSCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0dFTkVSSUNfTkNSNTM4MCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0dFTkVSSUNfTkNSNTM4MF9NTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05DUjUzQzQwNkEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TWU01M0M4WFhfMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lQUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1BBUzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUFNJMjQwSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMT0dJQ19GQVMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTE9HSUNfSVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDXzEyODAgaXMgbm90IHNldAorQ09ORklHX1NDU0lfUUxBMlhYWD15CisjIENPTkZJR19TQ1NJX1FMQTIxWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEEyMlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBMjMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQTIzMjIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEE2MzEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBNjMyMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NZTTUzQzQxNiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzk1eCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1QxMjggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9VMTRfMzRGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfVUxUUkFTVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgT2xkIENELVJPTSBkcml2ZXJzIChub3QgU0NTSSwgbm90IElERSkKKyMKKyMgQ09ORklHX0NEX05PX0lERVNDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisjIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0CisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSTJPPXkKK0NPTkZJR19JMk9fQ09ORklHPXkKK0NPTkZJR19JMk9fQkxPQ0s9eQorIyBDT05GSUdfSTJPX1NDU0kgaXMgbm90IHNldAorQ09ORklHX0kyT19QUk9DPXkKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CitDT05GSUdfUEFDS0VUX01NQVA9eQorIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorQ09ORklHX05FVF9LRVk9eQorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CitDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSPXkKK0NPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVM9eQorQ09ORklHX0lQX1JPVVRFX0ZXTUFSSz15CitDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIPXkKK0NPTkZJR19JUF9ST1VURV9WRVJCT1NFPXkKKyMgQ09ORklHX0lQX1BOUCBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0lQSVA9eQorQ09ORklHX05FVF9JUEdSRT15CitDT05GSUdfTkVUX0lQR1JFX0JST0FEQ0FTVD15CitDT05GSUdfSVBfTVJPVVRFPXkKK0NPTkZJR19JUF9QSU1TTV9WMT15CitDT05GSUdfSVBfUElNU01fVjI9eQorQ09ORklHX0FSUEQ9eQorQ09ORklHX1NZTl9DT09LSUVTPXkKK0NPTkZJR19JTkVUX0FIPXkKK0NPTkZJR19JTkVUX0VTUD15CitDT05GSUdfSU5FVF9JUENPTVA9eQorQ09ORklHX0lORVRfVFVOTkVMPXkKK0NPTkZJR19JUF9UQ1BESUFHPXkKK0NPTkZJR19JUF9UQ1BESUFHX0lQVjY9eQorCisjCisjIElQOiBWaXJ0dWFsIFNlcnZlciBDb25maWd1cmF0aW9uCisjCisjIENPTkZJR19JUF9WUyBpcyBub3Qgc2V0CitDT05GSUdfSVBWNj15CitDT05GSUdfSVBWNl9QUklWQUNZPXkKK0NPTkZJR19JTkVUNl9BSD15CitDT05GSUdfSU5FVDZfRVNQPXkKK0NPTkZJR19JTkVUNl9JUENPTVA9eQorQ09ORklHX0lORVQ2X1RVTk5FTD15CitDT05GSUdfSVBWNl9UVU5ORUw9eQorQ09ORklHX05FVEZJTFRFUj15CisjIENPTkZJR19ORVRGSUxURVJfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0JSSURHRV9ORVRGSUxURVI9eQorCisjCisjIElQOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgorIworQ09ORklHX0lQX05GX0NPTk5UUkFDSz15CitDT05GSUdfSVBfTkZfQ1RfQUNDVD15CitDT05GSUdfSVBfTkZfQ09OTlRSQUNLX01BUks9eQorIyBDT05GSUdfSVBfTkZfQ1RfUFJPVE9fU0NUUCBpcyBub3Qgc2V0CitDT05GSUdfSVBfTkZfRlRQPXkKK0NPTkZJR19JUF9ORl9JUkM9eQorQ09ORklHX0lQX05GX1RGVFA9eQorIyBDT05GSUdfSVBfTkZfQU1BTkRBIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9RVUVVRT15CitDT05GSUdfSVBfTkZfSVBUQUJMRVM9eQorQ09ORklHX0lQX05GX01BVENIX0xJTUlUPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9JUFJBTkdFPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9NQUM9eQorQ09ORklHX0lQX05GX01BVENIX1BLVFRZUEU9eQorQ09ORklHX0lQX05GX01BVENIX01BUks9eQorQ09ORklHX0lQX05GX01BVENIX01VTFRJUE9SVD15CitDT05GSUdfSVBfTkZfTUFUQ0hfVE9TPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9SRUNFTlQ9eQorQ09ORklHX0lQX05GX01BVENIX0VDTj15CitDT05GSUdfSVBfTkZfTUFUQ0hfRFNDUD15CitDT05GSUdfSVBfTkZfTUFUQ0hfQUhfRVNQPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9MRU5HVEg9eQorQ09ORklHX0lQX05GX01BVENIX1RUTD15CitDT05GSUdfSVBfTkZfTUFUQ0hfVENQTVNTPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9IRUxQRVI9eQorQ09ORklHX0lQX05GX01BVENIX1NUQVRFPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9DT05OVFJBQ0s9eQorQ09ORklHX0lQX05GX01BVENIX09XTkVSPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9QSFlTREVWPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9BRERSVFlQRT15CitDT05GSUdfSVBfTkZfTUFUQ0hfUkVBTE09eQorIyBDT05GSUdfSVBfTkZfTUFUQ0hfU0NUUCBpcyBub3Qgc2V0CitDT05GSUdfSVBfTkZfTUFUQ0hfQ09NTUVOVD15CitDT05GSUdfSVBfTkZfTUFUQ0hfQ09OTk1BUks9eQorQ09ORklHX0lQX05GX01BVENIX0hBU0hMSU1JVD15CitDT05GSUdfSVBfTkZfRklMVEVSPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfUkVKRUNUPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfTE9HPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfVUxPRz15CitDT05GSUdfSVBfTkZfVEFSR0VUX1RDUE1TUz15CitDT05GSUdfSVBfTkZfTkFUPXkKK0NPTkZJR19JUF9ORl9OQVRfTkVFREVEPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfTUFTUVVFUkFERT15CitDT05GSUdfSVBfTkZfVEFSR0VUX1JFRElSRUNUPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfTkVUTUFQPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfU0FNRT15CisjIENPTkZJR19JUF9ORl9OQVRfTE9DQUwgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfTkFUX1NOTVBfQkFTSUMgaXMgbm90IHNldAorQ09ORklHX0lQX05GX05BVF9JUkM9eQorQ09ORklHX0lQX05GX05BVF9GVFA9eQorQ09ORklHX0lQX05GX05BVF9URlRQPXkKK0NPTkZJR19JUF9ORl9NQU5HTEU9eQorQ09ORklHX0lQX05GX1RBUkdFVF9UT1M9eQorQ09ORklHX0lQX05GX1RBUkdFVF9FQ049eQorQ09ORklHX0lQX05GX1RBUkdFVF9EU0NQPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfTUFSSz15CitDT05GSUdfSVBfTkZfVEFSR0VUX0NMQVNTSUZZPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfQ09OTk1BUks9eQorQ09ORklHX0lQX05GX1RBUkdFVF9DTFVTVEVSSVA9eQorQ09ORklHX0lQX05GX1JBVz15CitDT05GSUdfSVBfTkZfVEFSR0VUX05PVFJBQ0s9eQorQ09ORklHX0lQX05GX0FSUFRBQkxFUz15CitDT05GSUdfSVBfTkZfQVJQRklMVEVSPXkKK0NPTkZJR19JUF9ORl9BUlBfTUFOR0xFPXkKKworIworIyBJUHY2OiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgorIworQ09ORklHX0lQNl9ORl9RVUVVRT15CitDT05GSUdfSVA2X05GX0lQVEFCTEVTPXkKK0NPTkZJR19JUDZfTkZfTUFUQ0hfTElNSVQ9eQorQ09ORklHX0lQNl9ORl9NQVRDSF9NQUM9eQorQ09ORklHX0lQNl9ORl9NQVRDSF9SVD15CitDT05GSUdfSVA2X05GX01BVENIX09QVFM9eQorQ09ORklHX0lQNl9ORl9NQVRDSF9GUkFHPXkKK0NPTkZJR19JUDZfTkZfTUFUQ0hfSEw9eQorQ09ORklHX0lQNl9ORl9NQVRDSF9NVUxUSVBPUlQ9eQorQ09ORklHX0lQNl9ORl9NQVRDSF9PV05FUj15CitDT05GSUdfSVA2X05GX01BVENIX01BUks9eQorQ09ORklHX0lQNl9ORl9NQVRDSF9JUFY2SEVBREVSPXkKK0NPTkZJR19JUDZfTkZfTUFUQ0hfQUhFU1A9eQorQ09ORklHX0lQNl9ORl9NQVRDSF9MRU5HVEg9eQorQ09ORklHX0lQNl9ORl9NQVRDSF9FVUk2ND15CitDT05GSUdfSVA2X05GX01BVENIX1BIWVNERVY9eQorQ09ORklHX0lQNl9ORl9GSUxURVI9eQorQ09ORklHX0lQNl9ORl9UQVJHRVRfTE9HPXkKK0NPTkZJR19JUDZfTkZfTUFOR0xFPXkKK0NPTkZJR19JUDZfTkZfVEFSR0VUX01BUks9eQorQ09ORklHX0lQNl9ORl9SQVc9eQorCisjCisjIEJyaWRnZTogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX0JSSURHRV9ORl9FQlRBQkxFUyBpcyBub3Qgc2V0CitDT05GSUdfWEZSTT15CitDT05GSUdfWEZSTV9VU0VSPXkKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorQ09ORklHX0FUTT15CisjIENPTkZJR19BVE1fQ0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fTEFORSBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fQlIyNjg0IGlzIG5vdCBzZXQKK0NPTkZJR19CUklER0U9eQorQ09ORklHX1ZMQU5fODAyMVE9eQorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19MTEM9eQorQ09ORklHX0xMQzI9eQorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorCisjCisjIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZworIworQ09ORklHX05FVF9TQ0hFRD15CitDT05GSUdfTkVUX1NDSF9DTEtfSklGRklFUz15CisjIENPTkZJR19ORVRfU0NIX0NMS19HRVRUSU1FT0ZEQVkgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1NDSF9DTEtfQ1BVIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfU0NIX0NCUT15CitDT05GSUdfTkVUX1NDSF9IVEI9eQorQ09ORklHX05FVF9TQ0hfSEZTQz15CitDT05GSUdfTkVUX1NDSF9BVE09eQorQ09ORklHX05FVF9TQ0hfUFJJTz15CitDT05GSUdfTkVUX1NDSF9SRUQ9eQorQ09ORklHX05FVF9TQ0hfU0ZRPXkKK0NPTkZJR19ORVRfU0NIX1RFUUw9eQorQ09ORklHX05FVF9TQ0hfVEJGPXkKK0NPTkZJR19ORVRfU0NIX0dSRUQ9eQorQ09ORklHX05FVF9TQ0hfRFNNQVJLPXkKK0NPTkZJR19ORVRfU0NIX05FVEVNPXkKK0NPTkZJR19ORVRfU0NIX0lOR1JFU1M9eQorQ09ORklHX05FVF9RT1M9eQorQ09ORklHX05FVF9FU1RJTUFUT1I9eQorQ09ORklHX05FVF9DTFM9eQorQ09ORklHX05FVF9DTFNfVENJTkRFWD15CitDT05GSUdfTkVUX0NMU19ST1VURTQ9eQorQ09ORklHX05FVF9DTFNfUk9VVEU9eQorQ09ORklHX05FVF9DTFNfRlc9eQorQ09ORklHX05FVF9DTFNfVTMyPXkKK0NPTkZJR19ORVRfQ0xTX0VHUD15CitDT05GSUdfRUdQX0RFQlVHPXkKK0NPTkZJR19ORVRfQ0xTX0VHUF9TSU1QTEVfQ01QPXkKK0NPTkZJR19ORVRfQ0xTX0VHUF9OQllURT15CitDT05GSUdfTkVUX0NMU19FR1BfS01QPXkKK0NPTkZJR19ORVRfQ0xTX0VHUF9SRUdFWFA9eQorQ09ORklHX05FVF9DTFNfRUdQX0NNRD15CitDT05GSUdfRUdQX0NNRF9CQUNLX1RUTD00MDk2CitDT05GSUdfQ0xTX1UzMl9QRVJGPXkKK0NPTkZJR19ORVRfQ0xTX0lORD15CitDT05GSUdfTkVUX0NMU19SU1ZQPXkKK0NPTkZJR19ORVRfQ0xTX1JTVlA2PXkKK0NPTkZJR19ORVRfQ0xTX0FDVD15CitDT05GSUdfTkVUX0FDVF9QT0xJQ0U9eQorQ09ORklHX05FVF9BQ1RfR0FDVD15CitDT05GSUdfR0FDVF9QUk9CPXkKK0NPTkZJR19ORVRfQUNUX01JUlJFRD15CitDT05GSUdfTkVUX0FDVF9JUFQ9eQorQ09ORklHX05FVF9BQ1RfUEVESVQ9eQorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworQ09ORklHX05FVF9QS1RHRU49eQorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorQ09ORklHX0RVTU1ZPXkKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKK0NPTkZJR19UVU49eQorIyBDT05GSUdfTkVUX1NCMTAwMCBpcyBub3Qgc2V0CisKKyMKKyMgQVJDbmV0IGRldmljZXMKKyMKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAorIyBDT05GSUdfTEFOQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9TTUMgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9SQUNBTCBpcyBub3Qgc2V0CisKKyMKKyMgVHVsaXAgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX05FVF9UVUxJUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVDE3MDAgaXMgbm90IHNldAorIyBDT05GSUdfREVQQ0EgaXMgbm90IHNldAorIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lTQSBpcyBub3Qgc2V0CitDT05GSUdfTkVUX1BDST15CisjIENPTkZJR19QQ05FVDMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNRDgxMTFfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FEQVBURUNfU1RBUkZJUkUgaXMgbm90IHNldAorIyBDT05GSUdfQUMzMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQUklDT1QgaXMgbm90IHNldAorIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPUkNFREVUSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUzg5eDAgaXMgbm90IHNldAorIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRVBSTzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQUxOWCBpcyBub3Qgc2V0CisjIENPTkZJR19OQVRTRU1JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FMktfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlDUCBpcyBub3Qgc2V0CitDT05GSUdfODEzOVRPTz15CitDT05GSUdfODEzOVRPT19QSU89eQorIyBDT05GSUdfODEzOVRPT19UVU5FX1RXSVNURVIgaXMgbm90IHNldAorIyBDT05GSUdfODEzOVRPT184MTI5IGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlfT0xEX1JYX1JFU0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJUzkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FUElDMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkRBTkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1JISU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0NLRVQgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisjIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAorIyBDT05GSUdfREwySyBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAorIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1I4MTY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1MySU8gaXMgbm90IHNldAorCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKworIworIyBBVE0gZHJpdmVycworIworIyBDT05GSUdfQVRNX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fTEFOQUkgaXMgbm90IHNldAorIyBDT05GSUdfQVRNX0VOSSBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fRklSRVNUUkVBTSBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fWkFUTSBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fTklDU1RBUiBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fSURUNzcyNTIgaXMgbm90IHNldAorIyBDT05GSUdfQVRNX0FNQkFTU0FET1IgaXMgbm90IHNldAorIyBDT05GSUdfQVRNX0hPUklaT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRNX0lBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTV9GT1JFMjAwRV9NQVlCRSBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fSEUgaXMgbm90IHNldAorIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CisjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0CitDT05GSUdfUFBQPXkKK0NPTkZJR19QUFBfTVVMVElMSU5LPXkKK0NPTkZJR19QUFBfRklMVEVSPXkKKyMgQ09ORklHX1BQUF9BU1lOQyBpcyBub3Qgc2V0CisjIENPTkZJR19QUFBfU1lOQ19UVFkgaXMgbm90IHNldAorIyBDT05GSUdfUFBQX0RFRkxBVEUgaXMgbm90IHNldAorQ09ORklHX1BQUF9CU0RDT01QPXkKKyMgQ09ORklHX1BQUE9FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUE9BVE0gaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRkMgaXMgbm90IHNldAorQ09ORklHX1NIQVBFUj15CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgVGVsZXBob255IFN1cHBvcnQKKyMKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IEkvTyBkcml2ZXJzCisjCisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU09VTkRfR0FNRVBPUlQ9eQorQ09ORklHX1NFUklPPXkKK0NPTkZJR19TRVJJT19JODA0Mj15CisjIENPTkZJR19TRVJJT19TRVJQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX0NUODJDNzEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX1BDSVBTMiBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCitDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQorQ09ORklHX0tFWUJPQVJEX0FUS0JEPXkKKyMgQ09ORklHX0tFWUJPQVJEX1NVTktCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9MS0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFPXkKK0NPTkZJR19NT1VTRV9QUzI9eQorIyBDT05GSUdfTU9VU0VfU0VSSUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX0lOUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9MT0dJQk0gaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfUEMxMTBQQUQgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfVlNYWFhBQSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1ZUPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKK0NPTkZJR19TRVJJQUxfODI1MD15CisjIENPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF84MjUwX0FDUEkgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTQKKyMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorIyBDT05GSUdfUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TT05ZUEkgaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfQUdQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19NV0FWRSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRVQgaXMgbm90IHNldAorIyBDT05GSUdfSEFOR0NIRUNLX1RJTUVSIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0NIQVJERVY9eQorCisjCisjIEkyQyBBbGdvcml0aG1zCisjCitDT05GSUdfSTJDX0FMR09CSVQ9eQorIyBDT05GSUdfSTJDX0FMR09QQ0YgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMR09QQ0EgaXMgbm90IHNldAorCisjCisjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDX0FMSTE1MzUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMSTE1NjMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMSTE1WDMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FNRDc1NiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQU1EODExMSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSTgwMSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSTgxMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSVNBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ORk9SQ0UyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QSUlYNCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUFJPU0FWQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TQVZBR0U0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDeDIwMF9BQ0IgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzYzMCBpcyBub3Qgc2V0CitDT05GSUdfSTJDX1NJUzk2WD15CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUFQUk8gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZPT0RPTzMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BDQV9JU0EgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIFNlbnNvcnMgQ2hpcCBzdXBwb3J0CisjCitDT05GSUdfSTJDX1NFTlNPUj15CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FTQjEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ0hFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTE4U00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZJQTY4NkEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQyBDaGlwIHN1cHBvcnQKKyMKK0NPTkZJR19TRU5TT1JTX0VFUFJPTT15CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUlRDODU2NCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBEYWxsYXMncyAxLXdpcmUgYnVzCisjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisjIENPTkZJR19JQk1fQVNNIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19TRUxFQ1QgaXMgbm90IHNldAorCisjCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAorIworQ09ORklHX1ZHQV9DT05TT0xFPXkKKyMgQ09ORklHX01EQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKworIworIyBTb3VuZAorIworQ09ORklHX1NPVU5EPXkKKworIworIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKKyMKK0NPTkZJR19TTkQ9eQorQ09ORklHX1NORF9USU1FUj15CitDT05GSUdfU05EX1BDTT15CitDT05GSUdfU05EX0hXREVQPXkKK0NPTkZJR19TTkRfUkFXTUlEST15CitDT05GSUdfU05EX1NFUVVFTkNFUj15CisjIENPTkZJR19TTkRfU0VRX0RVTU1ZIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfT1NTRU1VTD15CitDT05GSUdfU05EX01JWEVSX09TUz15CitDT05GSUdfU05EX1BDTV9PU1M9eQorQ09ORklHX1NORF9TRVFVRU5DRVJfT1NTPXkKKyMgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfREVCVUcgaXMgbm90IHNldAorCisjCisjIEdlbmVyaWMgZGV2aWNlcworIworIyBDT05GSUdfU05EX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9WSVJNSURJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NVFBBViBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU0VSSUFMX1UxNjU1MCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTVBVNDAxIGlzIG5vdCBzZXQKKworIworIyBJU0EgZGV2aWNlcworIworIyBDT05GSUdfU05EX0FEMTg0OCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQ1M0MjMxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9DUzQyMzIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0NTNDIzNiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRVMxNjg4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9FUzE4WFggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0dVU0NMQVNTSUMgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0dVU0VYVFJFTUUgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0dVU01BWCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSU5URVJXQVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9JTlRFUldBVkVfU1RCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9PUFRJOTJYX0FEMTg0OCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfT1BUSTkyWF9DUzQyMzEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX09QVEk5M1ggaXMgbm90IHNldAorIyBDT05GSUdfU05EX1NCOCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU0IxNiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU0JBV0UgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1dBVkVGUk9OVCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQ01JODMzMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfT1BMM1NBMiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU0dBTEFYWSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU1NDQVBFIGlzIG5vdCBzZXQKKworIworIyBQQ0kgZGV2aWNlcworIworQ09ORklHX1NORF9BQzk3X0NPREVDPXkKKyMgQ09ORklHX1NORF9BTEk1NDUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BVElJWFAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FUSUlYUF9NT0RFTSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVU4ODEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BVTg4MjAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FVODgzMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVpUMzMyOCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQlQ4N1ggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0NTNDZYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQ1M0MjgxIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfRU1VMTBLMT15CisjIENPTkZJR19TTkRfS09SRzEyMTIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01JWEFSVCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTk0yNTYgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1JNRTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9STUU5NiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfUk1FOTY1MiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSERTUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfVFJJREVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfWU1GUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BTFM0MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9DTUlQQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VOUzEzNzAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VOUzEzNzEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VTMTkzOCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRVMxOTY4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NQUVTVFJPMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRk04MDEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0lDRTE3MTIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0lDRTE3MjQgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0lOVEVMOFgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9JTlRFTDhYME0gaXMgbm90IHNldAorIyBDT05GSUdfU05EX1NPTklDVklCRVMgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1ZJQTgyWFggaXMgbm90IHNldAorIyBDT05GSUdfU05EX1ZYMjIyIGlzIG5vdCBzZXQKKworIworIyBVU0IgZGV2aWNlcworIworIyBDT05GSUdfU05EX1VTQl9BVURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfVVNCX1VTWDJZIGlzIG5vdCBzZXQKKworIworIyBPcGVuIFNvdW5kIFN5c3RlbQorIworIyBDT05GSUdfU09VTkRfUFJJTUUgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCPXkKKyMgQ09ORklHX1VTQl9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBVU0Igb3B0aW9ucworIworQ09ORklHX1VTQl9ERVZJQ0VGUz15CisjIENPTkZJR19VU0JfQkFORFdJRFRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1VTUEVORCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CisKKyMKKyMgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCisjCitDT05GSUdfVVNCX0VIQ0lfSENEPXkKKyMgQ09ORklHX1VTQl9FSENJX1NQTElUX0lTTyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRUhDSV9ST09UX0hVQl9UVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT0hDSV9IQ0QgaXMgbm90IHNldAorQ09ORklHX1VTQl9VSENJX0hDRD15CisKKyMKKyMgVVNCIERldmljZSBDbGFzcyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfQVVESU8gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0JMVUVUT09USF9UVFkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01JREkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FDTSBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1BSSU5URVI9eQorQ09ORklHX1VTQl9TVE9SQUdFPXkKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1JXX0RFVEVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSVNEMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RQQ00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSFA4MjAwZSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSMDkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW5wdXQgRGV2aWNlcworIworQ09ORklHX1VTQl9ISUQ9eQorQ09ORklHX1VTQl9ISURJTlBVVD15CisjIENPTkZJR19ISURfRkYgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0hJRERFViBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQUlQVEVLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9XQUNPTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0JUQUIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BPV0VSTUFURSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTVRPVUNIIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfRUdBTEFYPW0KKyMgQ09ORklHX1VTQl9YUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVElfUkVNT1RFIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW1hZ2luZyBkZXZpY2VzCisjCisjIENPTkZJR19VU0JfTURDODAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NSUNST1RFSyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSFBVU0JTQ1NJIGlzIG5vdCBzZXQKKworIworIyBVU0IgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19VU0JfREFCVVNCIGlzIG5vdCBzZXQKKworIworIyBWaWRlbzRMaW51eCBzdXBwb3J0IGlzIG5lZWRlZCBmb3IgVVNCIE11bHRpbWVkaWEgZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBVU0IgTmV0d29yayBBZGFwdGVycworIworIyBDT05GSUdfVVNCX0NBVEMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tBV0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEVHQVNVUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUlRMODE1MCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVVNCTkVUIGlzIG5vdCBzZXQKKworIworIyBVU0IgcG9ydCBkcml2ZXJzCisjCisKKyMKKyMgVVNCIFNlcmlhbCBDb252ZXJ0ZXIgc3VwcG9ydAorIworIyBDT05GSUdfVVNCX1NFUklBTCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIE1pc2NlbGxhbmVvdXMgZHJpdmVycworIworIyBDT05GSUdfVVNCX0VNSTYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FTUkyNiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVElHTCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVVFUlNXQUxEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAorQ09ORklHX1VTQl9DWVRIRVJNPW0KKyMgQ09ORklHX1VTQl9QSElER0VUS0lUIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfUEhJREdFVFNFUlZPPW0KKyMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKKworIworIyBVU0IgQVRNL0RTTCBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TUEVFRFRPVUNIIGlzIG5vdCBzZXQKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfRVhUM19GUz15CitDT05GSUdfRVhUM19GU19YQVRUUj15CisjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19GU19NQkNBQ0hFPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19BVVRPRlM0X0ZTPXkKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfSVNPOTY2MF9GUz15CitDT05GSUdfSk9MSUVUPXkKKyMgQ09ORklHX1pJU09GUyBpcyBub3Qgc2V0CitDT05GSUdfVURGX0ZTPXkKK0NPTkZJR19VREZfTkxTPXkKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPXkKK0NPTkZJR19NU0RPU19GUz15CitDT05GSUdfVkZBVF9GUz15CitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3CitDT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19TWVNGUz15CisjIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CisjIENPTkZJR19ORlNfVjMgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CitDT05GSUdfTkZTRD15CisjIENPTkZJR19ORlNEX1YzIGlzIG5vdCBzZXQKK0NPTkZJR19ORlNEX1RDUD15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0VYUE9SVEZTPXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworQ09ORklHX05MUz15CitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKK0NPTkZJR19OTFNfQ09ERVBBR0VfNDM3PXkKKyMgQ09ORklHX05MU19DT0RFUEFHRV83MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzc3NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQVNDSUkgaXMgbm90IHNldAorQ09ORklHX05MU19JU084ODU5XzE9eQorIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCitDT05GSUdfUFJPRklMSU5HPXkKK0NPTkZJR19PUFJPRklMRT15CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKK0NPTkZJR19ERUJVR19LRVJORUw9eQorQ09ORklHX01BR0lDX1NZU1JRPXkKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1NMQUI9eQorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKK0NPTkZJR19FQVJMWV9QUklOVEs9eQorIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CisjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1BBR0VBTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR180S1NUQUNLUyBpcyBub3Qgc2V0CitDT05GSUdfWDg2X0ZJTkRfU01QX0NPTkZJRz15CitDT05GSUdfWDg2X01QUEFSU0U9eQorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorQ09ORklHX1NFQ1VSSVRZPXkKK0NPTkZJR19TRUNVUklUWV9ORVRXT1JLPXkKK0NPTkZJR19TRUNVUklUWV9DQVBBQklMSVRJRVM9bQorQ09ORklHX1NFQ1VSSVRZX1JPT1RQTFVHPW0KKyMgQ09ORklHX1NFQ1VSSVRZX1NFQ0xWTCBpcyBub3Qgc2V0CitDT05GSUdfU0VDVVJJVFlfU0VMSU5VWD15CisjIENPTkZJR19TRUNVUklUWV9TRUxJTlVYX0JPT1RQQVJBTSBpcyBub3Qgc2V0CitDT05GSUdfU0VDVVJJVFlfU0VMSU5VWF9ESVNBQkxFPXkKK0NPTkZJR19TRUNVUklUWV9TRUxJTlVYX0RFVkVMT1A9eQorIyBDT05GSUdfU0VDVVJJVFlfU0VMSU5VWF9NTFMgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworQ09ORklHX0NSWVBUTz15CitDT05GSUdfQ1JZUFRPX0hNQUM9eQorQ09ORklHX0NSWVBUT19OVUxMPXkKK0NPTkZJR19DUllQVE9fTUQ0PXkKK0NPTkZJR19DUllQVE9fTUQ1PXkKK0NPTkZJR19DUllQVE9fU0hBMT15CitDT05GSUdfQ1JZUFRPX1NIQTI1Nj15CitDT05GSUdfQ1JZUFRPX1NIQTUxMj15CitDT05GSUdfQ1JZUFRPX1dQNTEyPXkKK0NPTkZJR19DUllQVE9fREVTPXkKK0NPTkZJR19DUllQVE9fQkxPV0ZJU0g9eQorQ09ORklHX0NSWVBUT19UV09GSVNIPXkKK0NPTkZJR19DUllQVE9fU0VSUEVOVD15CitDT05GSUdfQ1JZUFRPX0FFU181ODY9eQorQ09ORklHX0NSWVBUT19DQVNUNT15CitDT05GSUdfQ1JZUFRPX0NBU1Q2PXkKK0NPTkZJR19DUllQVE9fVEVBPXkKK0NPTkZJR19DUllQVE9fQVJDND15CitDT05GSUdfQ1JZUFRPX0tIQVpBRD15CisjIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fREVGTEFURT15CitDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDPXkKK0NPTkZJR19DUllQVE9fQ1JDMzJDPXkKK0NPTkZJR19DUllQVE9fVEVTVD15CisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CitDT05GSUdfTElCQ1JDMzJDPXkKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1pMSUJfREVGTEFURT15CitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX1g4Nl9TTVA9eQorQ09ORklHX1g4Nl9IVD15CitDT05GSUdfWDg2X0JJT1NfUkVCT09UPXkKK0NPTkZJR19YODZfVFJBTVBPTElORT15CitDT05GSUdfUEM9eQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGVzdHN1aXRlL2lwcm91dGUyL01ha2VmaWxlIGIvaXByb3V0ZTIvdGVzdHN1aXRlL2lwcm91dGUyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMTI4YWEKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90ZXN0c3VpdGUvaXByb3V0ZTIvTWFrZWZpbGUKQEAgLTAsMCArMSwzMyBAQAorU1VCRElSUyA6PSAkKGZpbHRlci1vdXQgTWFrZWZpbGUsJCh3aWxkY2FyZCAqKSkKKy5QSE9OWTogYWxsIGNvbmZpZ3VyZSBjbGVhbiBkaXN0Y2xlYW4gc2hvdyAkKFNVQkRJUlMpCisKK2FsbDogY29uZmlndXJlCisJQGZvciBkaXIgaW4gJChTVUJESVJTKTsgZG8gXAorCQllY2hvICJFbnRlcmluZyAkJGRpciIgJiYgY2QgJCRkaXIgJiYgJChNQUtFKSAmJiBjZCAuLjsgXAorCWRvbmUKKworbGluazoKKwlAaWYgWyAhIC1MIGlwcm91dGUyLXRoaXMgXTsgdGhlbiBcCisJCWxuIC1zIC4uLy4uIGlwcm91dGUyLXRoaXM7IFwKKwlmaQorCitjb25maWd1cmU6IGxpbmsKKwlAZm9yIGRpciBpbiAkKFNVQkRJUlMpOyBkbyBcCisJCWVjaG8gIkVudGVyaW5nICQkZGlyIiAmJiBjZCAkJGRpciAmJiBpZiBbIC1mIGNvbmZpZ3VyZSBdOyB0aGVuIC4vY29uZmlndXJlOyBmaSAmJiBjZCAuLjsgXAorCWRvbmUKKworY2xlYW46IGxpbmsKKwlAZm9yIGRpciBpbiAkKFNVQkRJUlMpOyBkbyBcCisJCWVjaG8gIkVudGVyaW5nICQkZGlyIiAmJiBjZCAkJGRpciAmJiAkKE1BS0UpIGNsZWFuICYmIGNkIC4uOyBcCisJZG9uZQorCitkaXN0Y2xlYW46IGNsZWFuCisJQGZvciBkaXIgaW4gJChTVUJESVJTKTsgZG8gXAorCQllY2hvICJFbnRlcmluZyAkJGRpciIgJiYgY2QgJCRkaXIgJiYgJChNQUtFKSBkaXN0Y2xlYW4gJiYgY2QgLi47IFwKKwlkb25lCisKK3Nob3c6IGxpbmsKKwlAZWNobyAiJChTVUJESVJTKSIKKworJChTVUJESVJTKToKKwljZCAkQCAmJiAkKE1BS0UpCmRpZmYgLS1naXQgYS9pcHJvdXRlMi90ZXN0c3VpdGUvbGliL2dlbmVyaWMuc2ggYi9pcHJvdXRlMi90ZXN0c3VpdGUvbGliL2dlbmVyaWMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdkZTcwNAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3Rlc3RzdWl0ZS9saWIvZ2VuZXJpYy5zaApAQCAtMCwwICsxLDEzNSBAQAorCitleHBvcnQgREVTVD0iMTI3LjAuMC4xIgorCit0c19sb2coKQoreworCWVjaG8gIiRAIgorfQorCit0c19lcnIoKQoreworCXRzX2xvZyAiJEAiIHwgdGVlID4+ICRFUlJGCit9CisKK3RzX2NhdCgpCit7CisJY2F0ICIkQCIKK30KKwordHNfZXJyX2NhdCgpCit7CisJdHNfY2F0ICIkQCIgfCB0ZWUgPj4gJEVSUkYKK30KKwordHNfc2tpcCgpCit7CisgICAgZXhpdCAxMjcKK30KKwordHNfdGMoKQoreworCVNDUklQVD0kMTsgc2hpZnQKKwlERVNDPSQxOyBzaGlmdAorCisJJFRDICRAIDI+ICRTVERfRVJSID4gJFNURF9PVVQKKworCWlmIFsgLXMgJFNURF9FUlIgXTsgdGhlbgorCQl0c19lcnIgIiR7U0NSSVBUfTogJHtERVNDfSBmYWlsZWQ6IgorCQl0c19lcnIgImNvbW1hbmQ6ICRUQyAkQCIKKwkJdHNfZXJyICJzdGRlcnIgb3V0cHV0OiIKKwkJdHNfZXJyX2NhdCAkU1REX0VSUgorCQlpZiBbIC1zICRTVERfT1VUIF07IHRoZW4KKwkJCXRzX2VyciAic3Rkb3V0IG91dHB1dDoiCisJCQl0c19lcnJfY2F0ICRTVERfT1VUCisJCWZpCisJZWxpZiBbIC1zICRTVERfT1VUIF07IHRoZW4KKwkJZWNobyAiJHtTQ1JJUFR9OiAke0RFU0N9IHN1Y2NlZWRlZCB3aXRoIG91dHB1dDoiCisJCWNhdCAkU1REX09VVAorCWVsc2UKKwkJZWNobyAiJHtTQ1JJUFR9OiAke0RFU0N9IHN1Y2NlZWRlZCIKKwlmaQorfQorCit0c19pcCgpCit7CisJU0NSSVBUPSQxOyBzaGlmdAorCURFU0M9JDE7IHNoaWZ0CisKKwkkSVAgJEAgMj4gJFNURF9FUlIgPiAkU1REX09VVAorICAgICAgICBSRVQ9JD8KKworCWlmIFsgLXMgJFNURF9FUlIgXSB8fCBbICIkUkVUIiAhPSAiMCIgXTsgdGhlbgorCQl0c19lcnIgIiR7U0NSSVBUfTogJHtERVNDfSBmYWlsZWQ6IgorCQl0c19lcnIgImNvbW1hbmQ6ICRJUCAkQCIKKwkJdHNfZXJyICJzdGRlcnIgb3V0cHV0OiIKKwkJdHNfZXJyX2NhdCAkU1REX0VSUgorCQlpZiBbIC1zICRTVERfT1VUIF07IHRoZW4KKwkJCXRzX2VyciAic3Rkb3V0IG91dHB1dDoiCisJCQl0c19lcnJfY2F0ICRTVERfT1VUCisJCWZpCisJZWxpZiBbIC1zICRTVERfT1VUIF07IHRoZW4KKwkJZWNobyAiJHtTQ1JJUFR9OiAke0RFU0N9IHN1Y2NlZWRlZCB3aXRoIG91dHB1dDoiCisJCWNhdCAkU1REX09VVAorCWVsc2UKKwkJZWNobyAiJHtTQ1JJUFR9OiAke0RFU0N9IHN1Y2NlZWRlZCIKKwlmaQorfQorCit0c19xZGlzY19hdmFpbGFibGUoKQoreworCUhFTFBPVVQ9YCRUQyBxZGlzYyBhZGQgJDEgaGVscCAyPiYxYAorCWlmIFsgImBlY2hvICRIRUxQT1VUIHwgZ3JlcCBcIl5Vbmtub3duIHFkaXNjXCJgIiBdOyB0aGVuCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIDE7CisJZmkKK30KKworcmFuZF9kZXYoKQoreworICAgIGVjaG8gImRldi0kKHRyIC1kYyAiWzphbHBoYTpdIiA8IC9kZXYvdXJhbmRvbSB8IGhlYWQgLWMgNikiCit9CisKK3ByX2ZhaWxlZCgpCit7CisJZWNobyAiIFtGQUlMRURdIgorCXRzX2VyciAibWF0Y2hpbmcgZmFpbGVkIgorfQorCitwcl9zdWNjZXNzKCkKK3sKKwllY2hvICIgW1NVQ0NFU1NdIgorfQorCit0ZXN0X29uKCkKK3sKKwllY2hvIC1uICJ0ZXN0IG9uOiBcIiQxXCIiCisJaWYgY2F0ICIkU1REX09VVCIgfCBncmVwIC1xRSAiJDEiCisJdGhlbgorCQlwcl9zdWNjZXNzCisJZWxzZQorCQlwcl9mYWlsZWQKKwlmaQorfQorCit0ZXN0X29uX25vdCgpCit7CisJZWNobyAtbiAidGVzdCBvbjogXCIkMVwiIgorCWlmIGNhdCAiJFNURF9PVVQiIHwgZ3JlcCAtdnFFICIkMSIKKwl0aGVuCisJCXByX3N1Y2Nlc3MKKwllbHNlCisJCXByX2ZhaWxlZAorCWZpCit9CisKK3Rlc3RfbGluZXNfY291bnQoKQoreworCWVjaG8gLW4gInRlc3Qgb24gbGluZXMgY291bnQgKCQxKTogIgorCWlmIGNhdCAiJFNURF9PVVQiIHwgd2MgLWwgfCBncmVwIC1xICIkMSIKKwl0aGVuCisJCXByX3N1Y2Nlc3MKKwllbHNlCisJCXByX2ZhaWxlZAorCWZpCit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90ZXN0c3VpdGUvdGVzdHMvaXAvbGluay9kZXZfd29fdmZfcmF0ZS5ubCBiL2lwcm91dGUyL3Rlc3RzdWl0ZS90ZXN0cy9pcC9saW5rL2Rldl93b192Zl9yYXRlLm5sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZmE4N2YKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90ZXN0c3VpdGUvdGVzdHMvaXAvbGluay9kZXZfd29fdmZfcmF0ZS5ubApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9pcHJvdXRlMi90ZXN0c3VpdGUvdGVzdHMvaXAvbGluay9uZXdfbGluay50IGIvaXByb3V0ZTIvdGVzdHN1aXRlL3Rlc3RzL2lwL2xpbmsvbmV3X2xpbmsudApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OTlhZGJjCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGVzdHN1aXRlL3Rlc3RzL2lwL2xpbmsvbmV3X2xpbmsudApAQCAtMCwwICsxLDE1IEBACisjIS9iaW4vc2gKKworc291cmNlIGxpYi9nZW5lcmljLnNoCisKK3RzX2xvZyAiW1Rlc3RpbmcgYWRkL2RlbCB2aXJ0dWFsIGxpbmtzXSIKKworTkVXX0RFVj0iJChyYW5kX2RldikiCisKK3RzX2lwICIkMCIgIkFkZCAkTkVXX0RFViBkdW1teSBpbnRlcmZhY2UiICBsaW5rIGFkZCBkZXYgJE5FV19ERVYgdHlwZSBkdW1teQorCit0c19pcCAiJDAiICJTaG93ICRORVdfREVWIGR1bW15IGludGVyZmFjZSIgbGluayBzaG93IGRldiAkTkVXX0RFVgordGVzdF9vbiAiJE5FV19ERVYiCit0ZXN0X2xpbmVzX2NvdW50IDIKKwordHNfaXAgIiQwIiAiRGVsICRORVdfREVWIGR1bW15IGludGVyZmFjZSIgIGxpbmsgZGVsIGRldiAkTkVXX0RFVgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGVzdHN1aXRlL3Rlc3RzL2lwL2xpbmsvc2hvd19kZXZfd29fdmZfcmF0ZS50IGIvaXByb3V0ZTIvdGVzdHN1aXRlL3Rlc3RzL2lwL2xpbmsvc2hvd19kZXZfd29fdmZfcmF0ZS50Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE2MDBiYTYKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90ZXN0c3VpdGUvdGVzdHMvaXAvbGluay9zaG93X2Rldl93b192Zl9yYXRlLnQKQEAgLTAsMCArMSw2IEBACisjIS9iaW4vc2gKKworc291cmNlIGxpYi9nZW5lcmljLnNoCisKK05MX0ZJTEU9InRlc3RzL2lwL2xpbmsvZGV2X3dvX3ZmX3JhdGUubmwiCit0c19pcCAiJDAiICJTaG93IFZGIGRldmljZXMgdy9vIFZGIHJhdGUgaW5mbyIgLWQgbW9uaXRvciBmaWxlICROTF9GSUxFCmRpZmYgLS1naXQgYS9pcHJvdXRlMi90ZXN0c3VpdGUvdGVzdHMvaXAvcm91dGUvYWRkX2RlZmF1bHRfcm91dGUudCBiL2lwcm91dGUyL3Rlc3RzdWl0ZS90ZXN0cy9pcC9yb3V0ZS9hZGRfZGVmYXVsdF9yb3V0ZS50Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU1ZWE2NDcKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90ZXN0c3VpdGUvdGVzdHMvaXAvcm91dGUvYWRkX2RlZmF1bHRfcm91dGUudApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vc2gKKworc291cmNlIGxpYi9nZW5lcmljLnNoCisKK3RzX2xvZyAiW1Rlc3RpbmcgYWRkIGRlZmF1bHQgcm91dGVdIgorCitERVY9ZHVtbXkwCisKK3RzX2lwICIkMCIgIkFkZCBuZXcgaW50ZXJmYWNlICRERVYiIGxpbmsgYWRkICRERVYgdHlwZSBkdW1teQordHNfaXAgIiQwIiAiU2V0ICRERVYgaW50byBVUCBzdGF0ZSIgbGluayBzZXQgdXAgZGV2ICRERVYKKwordHNfaXAgIiQwIiAiQWRkIDEuMS4xLjEvMjQgYWRkciBvbiAkREVWIiBhZGRyIGFkZCAxLjEuMS4xLzI0IGRldiAkREVWCit0c19pcCAiJDAiICJBZGQgZGVmYXVsdCByb3V0ZSB2aWEgMS4xLjEuMiIgcm91dGUgYWRkIGRlZmF1bHQgdmlhIDEuMS4xLjIKKwordHNfaXAgIiQwIiAiU2hvdyBJUHY0IGRlZmF1bHQgcm91dGUiIC00IHJvdXRlIHNob3cgZGVmYXVsdAordGVzdF9vbiAiZGVmYXVsdCB2aWEgMS4xLjEuMiBkZXYgJERFViIKK3Rlc3RfbGluZXNfY291bnQgMQorCit0c19pcCAiJDAiICJBZGQgYW5vdGhlciBJUHY0IHJvdXRlIGRzdCAyLjIuMi4wLzI0IiAtNCByb3V0ZSBhZGQgMi4yLjIuMC8yNCBkZXYgJERFVgordHNfaXAgIiQwIiAiU2hvdyBJUHY0IGRlZmF1bHQgcm91dGUiIC00IHJvdXRlIHNob3cgZGVmYXVsdAordGVzdF9vbiAiZGVmYXVsdCB2aWEgMS4xLjEuMiBkZXYgJERFViIKK3Rlc3RfbGluZXNfY291bnQgMQorCit0c19pcCAiJDAiICJBZGQgZGVhZDpiZWVmOjoxLzY0IGFkZHIgb24gJERFViIgLTYgYWRkciBhZGQgZGVhZDpiZWVmOjoxLzY0IGRldiAkREVWCit0c19pcCAiJDAiICJBZGQgZGVmYXVsdCByb3V0ZSB2aWEgZGVhZDpiZWVmOjoyIiByb3V0ZSBhZGQgZGVmYXVsdCB2aWEgZGVhZDpiZWVmOjoyCit0c19pcCAiJDAiICJTaG93IElQdjYgZGVmYXVsdCByb3V0ZSIgLTYgcm91dGUgc2hvdyBkZWZhdWx0Cit0ZXN0X29uICJkZWZhdWx0IHZpYSBkZWFkOmJlZWY6OjIgZGV2ICRERVYiCit0ZXN0X2xpbmVzX2NvdW50IDEKKwordHNfaXAgIiQwIiAiQWRkIGFub3RoZXIgSVB2NiByb3V0ZSBkc3QgY2FmZTpiYWJlOjovNjQiIC02IHJvdXRlIGFkZCBjYWZlOmJhYmU6Oi82NCBkZXYgJERFVgordHNfaXAgIiQwIiAiU2hvdyBJUHY2IGRlZmF1bHQgcm91dGUiIC02IHJvdXRlIHNob3cgZGVmYXVsdAordGVzdF9vbiAiZGVmYXVsdCB2aWEgZGVhZDpiZWVmOjoyIGRldiAkREVWIgordGVzdF9saW5lc19jb3VudCAxCmRpZmYgLS1naXQgYS9pcHJvdXRlMi90ZXN0c3VpdGUvdGVzdHMvaXAvdHVubmVsL2FkZF90dW5uZWwudCBiL2lwcm91dGUyL3Rlc3RzdWl0ZS90ZXN0cy9pcC90dW5uZWwvYWRkX3R1bm5lbC50Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE4ZjZlMzcKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90ZXN0c3VpdGUvdGVzdHMvaXAvdHVubmVsL2FkZF90dW5uZWwudApAQCAtMCwwICsxLDE0IEBACisjIS9iaW4vc2gKKworc291cmNlIGxpYi9nZW5lcmljLnNoCisKK1RVTk5FTF9OQU1FPSJ0dW5uZWxfdGVzdF9pcCIKKwordHNfbG9nICJbVGVzdGluZyBhZGQvZGVsIHR1bm5lbHNdIgorCit0c19pcCAiJDAiICJBZGQgR1JFIHR1bm5lbCBvdmVyIElQdjQiIHR1bm5lbCBhZGQgbmFtZSAkVFVOTkVMX05BTUUgbW9kZSBncmUgbG9jYWwgMS4xLjEuMSByZW1vdGUgMi4yLjIuMgordHNfaXAgIiQwIiAiRGVsIEdSRSB0dW5uZWwgb3ZlciBJUHY0IiB0dW5uZWwgZGVsICRUVU5ORUxfTkFNRQorCit0c19pcCAiJDAiICJBZGQgR1JFIHR1bm5lbCBvdmVyIElQdjYiIHR1bm5lbCBhZGQgbmFtZSAkVFVOTkVMX05BTUUgbW9kZSBpcDZncmUgbG9jYWwgZGVhZDpiZWVmOjoxIHJlbW90ZSBkZWFkOmJlZWY6OjIKK3RzX2lwICIkMCIgIkRlbCBHUkUgdHVubmVsIG92ZXIgSVB2NiIgdHVubmVsIGRlbCAkVFVOTkVMX05BTUUKKwpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGVzdHN1aXRlL3Rlc3RzL3RjL2NicS50IGIvaXByb3V0ZTIvdGVzdHN1aXRlL3Rlc3RzL3RjL2NicS50Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJmZjgxNGIKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90ZXN0c3VpdGUvdGVzdHMvdGMvY2JxLnQKQEAgLTAsMCArMSwxMCBAQAorIyEvYmluL3NoCiskVEMgcWRpc2MgZGVsIGRldiAkREVWIHJvb3QgPi9kZXYvbnVsbCAyPiYxCiskVEMgcWRpc2MgYWRkIGRldiAkREVWIHJvb3QgaGFuZGxlIDEwOjAgY2JxIGJhbmR3aWR0aCAxMDBNYml0IGF2cGt0IDE0MDAgbXB1IDY0CiskVEMgY2xhc3MgYWRkIGRldiAkREVWIHBhcmVudCAxMDowICBjbGFzc2lkIDEwOjEyICAgY2JxIGJhbmR3aWR0aCAxMDBtYml0IHJhdGUgMTAwbWJpdCBhbGxvdCAxNTE0IHByaW8gMyBtYXhidXJzdCAxIGF2cGt0ICA1MDAgYm91bmRlZAorJFRDIHFkaXNjIGxpc3QgZGV2ICRERVYKKyRUQyBxZGlzYyBkZWwgZGV2ICRERVYgcm9vdAorJFRDIHFkaXNjIGxpc3QgZGV2ICRERVYKKyRUQyBxZGlzYyBhZGQgZGV2ICRERVYgcm9vdCBoYW5kbGUgMTA6MCBjYnEgYmFuZHdpZHRoIDEwME1iaXQgYXZwa3QgMTQwMCBtcHUgNjQKKyRUQyBjbGFzcyBhZGQgZGV2ICRERVYgcGFyZW50IDEwOjAgIGNsYXNzaWQgMTA6MTIgICBjYnEgYmFuZHdpZHRoIDEwMG1iaXQgcmF0ZSAxMDBtYml0IGFsbG90IDE1MTQgcHJpbyAzIG1heGJ1cnN0IDEgYXZwa3QgIDUwMCBib3VuZGVkCiskVEMgcWRpc2MgZGVsIGRldiAkREVWIHJvb3QKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3Rlc3RzdWl0ZS90ZXN0cy90Yy9jbHMtdGVzdGJlZC50IGIvaXByb3V0ZTIvdGVzdHN1aXRlL3Rlc3RzL3RjL2Nscy10ZXN0YmVkLnQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmFmYzI2ZgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3Rlc3RzdWl0ZS90ZXN0cy90Yy9jbHMtdGVzdGJlZC50CkBAIC0wLDAgKzEsNzMgQEAKKyMhL2Jpbi9iYXNoCisjIHZpbTogZnQ9c2gKKworc291cmNlIGxpYi9nZW5lcmljLnNoCisKK1FESVNDUz0iY2JxIGh0YiBkc21hcmsiCisKK2lmIFsgISAtZCB0ZXN0cy9jbHMgXTsgdGhlbgorICAgIHRzX2xvZyAidGVzdHMvY2xzIGZvbGRlciBkb2VzIG5vdCBleGlzdCIKKyAgICB0c19za2lwCitmaQorCitmb3IgcSBpbiAke1FESVNDU307IGRvCisJdHNfbG9nICJQcmVwYXJpbmcgY2xhc3NpZmllciB0ZXN0YmVkIHdpdGggcWRpc2MgJHEiCisKKwlmb3IgYyBpbiB0ZXN0cy9jbHMvKi5jOyBkbworCisJCWNhc2UgIiRxIiBpbgorCQljYnEpCisJCQl0c190YyAiY2xzLXRlc3RiZWQiICJjYnEgcm9vdCBxZGlzYyBjcmVhdGlvbiIgXAorCQkJCXFkaXNjIGFkZCBkZXYgJERFViByb290IGhhbmRsZSAxMDowIFwKKwkJCQljYnEgYmFuZHdpZHRoIDEwME1iaXQgYXZwa3QgMTQwMCBtcHUgNjQKKwkJCXRzX3RjICJjbHMtdGVzdGJlZCIgImNicSByb290IGNsYXNzIGNyZWF0aW9uIiBcCisJCQkJY2xhc3MgYWRkIGRldiAkREVWIHBhcmVudCAxMDowICBjbGFzc2lkIDEwOjEyIFwKKwkJCQljYnEgYmFuZHdpZHRoIDEwMG1iaXQgcmF0ZSAxMDBtYml0IGFsbG90IDE1MTQgcHJpbyAzIFwKKwkJCQltYXhidXJzdCAxIGF2cGt0ICA1MDAgYm91bmRlZAorCQkJOzsKKwkJaHRiKQorCQkJdHNfcWRpc2NfYXZhaWxhYmxlICJodGIiCisJCQlpZiBbICQ/IC1lcSAwIF07IHRoZW4KKwkJCQl0c19sb2cgImNscy10ZXN0YmVkOiBIVEIgaXMgdW5zdXBwb3J0ZWQgYnkgJFRDLCBza2lwcGluZyIKKwkJCQljb250aW51ZTsKKwkJCWZpCisJCQl0c190YyAiY2xzLXRlc3RiZWQiICJodGIgcm9vdCBxZGlzYyBjcmVhdGlvbiIgXAorCQkJCXFkaXNjIGFkZCBkZXYgJERFViByb290IGhhbmRsZSAxMDowIGh0YgorCQkJdHNfdGMgImNscy10ZXN0YmVkIiAiaHRiIHJvb3QgY2xhc3MgY3JlYXRpb24iIFwKKwkJCQljbGFzcyBhZGQgZGV2ICRERVYgcGFyZW50IDEwOjAgY2xhc3NpZCAxMDoxMiBcCisJCQkJaHRiIHJhdGUgMTAwTWJpdCBxdWFudHVtIDE1MTQKKwkJCTs7CisJCWRzbWFyaykKKwkJCXRzX3FkaXNjX2F2YWlsYWJsZSAiZHNtYXJrIgorCQkJaWYgWyAkPyAtZXEgMCBdOyB0aGVuCisJCQkJdHNfbG9nICJjbHMtdGVzdGJlZDogZHNtYXJrIGlzIHVuc3VwcG9ydGVkIGJ5ICRUQywgc2tpcHBpbmciCisJCQkJY29udGludWU7CisJCQlmaQorCQkJdHNfdGMgImNscy10ZXN0YmVkIiAiZHNtYXJrIHJvb3QgcWRpc2MgY3JlYXRpb24iIFwKKwkJCQlxZGlzYyBhZGQgZGV2ICRERVYgcm9vdCBoYW5kbGUgMjA6MCBcCisJCQkJZHNtYXJrIGluZGljZXMgNjQgZGVmYXVsdF9pbmRleCAxIHNldF90Y19pbmRleAorCQkJdHNfdGMgImNscy10ZXN0YmVkIiAiZHNtYXJrIGNsYXNzIGNyZWF0aW9uIiBcCisJCQkJY2xhc3MgY2hhbmdlIGRldiAkREVWIHBhcmVudCAyMDowIGNsYXNzaWQgMjA6MTIgXAorCQkJCWRzbWFyayBtYXNrIDB4ZmYgdmFsdWUgMgorCQkJdHNfdGMgImNscy10ZXN0YmVkIiAicHJpbyBpbm5lciBxZGlzYyBjcmVhdGlvbiIgXAorCQkJCXFkaXNjIGFkZCBkZXYgJERFViBwYXJlbnQgMjA6MCBoYW5kbGUgMTA6MCBwcmlvCisJCQk7OworCQkqKQorCQkJdHNfZXJyICJjbHMtdGVzdGJlZDogbm8gdGVzdGJlZCBjb25maWd1cmF0aW9uIGZvdW5kIGZvciBxZGlzYyAkcSIKKwkJCWNvbnRpbnVlCisJCQk7OworCQllc2FjCisKKwkJdHNfdGMgImNscy10ZXN0YmVkIiAidHJlZSBsaXN0aW5nIiBxZGlzYyBsaXN0IGRldiBldGgwCisJCXRzX3RjICJjbHMtdGVzdGJlZCIgInRyZWUgY2xhc3MgbGlzdGluZyIgY2xhc3MgbGlzdCBkZXYgZXRoMAorCQl0c19sb2cgImNscy10ZXN0YmVkOiBzdGFydGluZyBjbGFzc2lmaWVyIHRlc3QgJGMiCisJCSRjIAorCisJCWNhc2UgIiRxIiBpbgorCQkqKQorCQkJdHNfdGMgImNscy10ZXN0YmVkIiAiZ2VuZXJpYyBxZGlzYyB0cmVlIGRlbGV0aW9uIiBcCisJCQkJcWRpc2MgZGVsIGRldiAkREVWIHJvb3QKKwkJCTs7CisJCWVzYWMKKwlkb25lCitkb25lCmRpZmYgLS1naXQgYS9pcHJvdXRlMi90ZXN0c3VpdGUvdGVzdHMvdGMvZHNtYXJrLnQgYi9pcHJvdXRlMi90ZXN0c3VpdGUvdGVzdHMvdGMvZHNtYXJrLnQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjkzNDE2NQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3Rlc3RzdWl0ZS90ZXN0cy90Yy9kc21hcmsudApAQCAtMCwwICsxLDMxIEBACisjIS9iaW4vYmFzaAorIyB2aW06IGZ0PXNoCisKK3NvdXJjZSBsaWIvZ2VuZXJpYy5zaAorCit0c19xZGlzY19hdmFpbGFibGUgImRzbWFyayIKK2lmIFsgJD8gLWVxIDAgXTsgdGhlbgorCXRzX2xvZyAiZHNtYXJrOiBVbnN1cHBvcnRlZCBieSAkVEMsIHNraXBwaW5nIgorCWV4aXQgMTI3CitmaQorCit0c190YyAiZHNtYXJrIiAiZHNtYXJrIHJvb3QgcWRpc2MgY3JlYXRpb24iIFwKKwlxZGlzYyBhZGQgZGV2ICRERVYgcm9vdCBoYW5kbGUgMTA6MCBcCisJZHNtYXJrIGluZGljZXMgNjQgZGVmYXVsdF9pbmRleCAxIHNldF90Y19pbmRleAorCit0c190YyAiZHNtYXJrIiAiZHNtYXJrIGNsYXNzIDEgY3JlYXRpb24iIFwKKwljbGFzcyBjaGFuZ2UgZGV2ICRERVYgcGFyZW50IDEwOjAgY2xhc3NpZCAxMDoxMiBcCisJZHNtYXJrIG1hc2sgMHhmZiB2YWx1ZSAyCisKK3RzX3RjICJkc21hcmsiICJkc21hcmsgY2xhc3MgMiBjcmVhdGlvbiIgXAorCWNsYXNzIGNoYW5nZSBkZXYgJERFViBwYXJlbnQgMTA6MCBjbGFzc2lkIDEwOjEzIFwKKwlkc21hcmsgbWFzayAweGZjIHZhbHVlIDQKKwordHNfdGMgImRzbWFyayIgImRzbWFyayBkdW1wIHFkaXNjIiBcCisJcWRpc2MgbGlzdCBkZXYgJERFVgorCit0c190YyAiZHNtYXJrIiAiZHNtYXJrIGR1bXAgY2xhc3MiIFwKKwljbGFzcyBsaXN0IGRldiAkREVWIHBhcmVudCAxMDowCisKK3RzX3RjICJkc21hcmsiICJnZW5lcmljIHFkaXNjIHRyZWUgZGVsZXRpb24iIFwKKwlxZGlzYyBkZWwgZGV2ICRERVYgcm9vdApkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGVzdHN1aXRlL3Rlc3RzL3RjL3BvbGljZXIudCBiL2lwcm91dGUyL3Rlc3RzdWl0ZS90ZXN0cy90Yy9wb2xpY2VyLnQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWFmMTZhYwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3Rlc3RzdWl0ZS90ZXN0cy90Yy9wb2xpY2VyLnQKQEAgLTAsMCArMSwxMyBAQAorIyEvYmluL3NoCiskVEMgcWRpc2MgZGVsIGRldiAkREVWIHJvb3QgPi9kZXYvbnVsbCAyPiYxCiskVEMgcWRpc2MgYWRkIGRldiAkREVWIHJvb3QgaGFuZGxlIDEwOjAgY2JxIGJhbmR3aWR0aCAxMDBNYml0IGF2cGt0IDE0MDAgbXB1IDY0CiskVEMgY2xhc3MgYWRkIGRldiAkREVWIHBhcmVudCAxMDowICBjbGFzc2lkIDEwOjEyICAgY2JxIGJhbmR3aWR0aCAxMDBtYml0IHJhdGUgMTAwbWJpdCBhbGxvdCAxNTE0IHByaW8gMyBtYXhidXJzdCAxIGF2cGt0ICA1MDAgYm91bmRlZAorJFRDIGZpbHRlciBhZGQgZGV2ICRERVYgcGFyZW50IDEwOjAgcHJvdG9jb2wgaXAgcHJpbyAxMCB1MzIgbWF0Y2ggaXAgcHJvdG9jb2wgMSAweGZmIHBvbGljZSByYXRlIDJrYml0IGJ1ZmZlciAxMGsgZHJvcCBmbG93aWQgMTA6MTIKKyRUQyBxZGlzYyBsaXN0IGRldiAkREVWCiskVEMgZmlsdGVyIGxpc3QgZGV2ICRERVYgcGFyZW50IDEwOjAKKyRUQyBxZGlzYyBkZWwgZGV2ICRERVYgcm9vdAorJFRDIHFkaXNjIGxpc3QgZGV2ICRERVYKKyRUQyBxZGlzYyBhZGQgZGV2ICRERVYgcm9vdCBoYW5kbGUgMTA6MCBjYnEgYmFuZHdpZHRoIDEwME1iaXQgYXZwa3QgMTQwMCBtcHUgNjQKKyRUQyBjbGFzcyBhZGQgZGV2ICRERVYgcGFyZW50IDEwOjAgIGNsYXNzaWQgMTA6MTIgICBjYnEgYmFuZHdpZHRoIDEwMG1iaXQgcmF0ZSAxMDBtYml0IGFsbG90IDE1MTQgcHJpbyAzIG1heGJ1cnN0IDEgYXZwa3QgIDUwMCBib3VuZGVkCiskVEMgZmlsdGVyIGFkZCBkZXYgJERFViBwYXJlbnQgMTA6MCBwcm90b2NvbCBpcCBwcmlvIDEwIHUzMiBtYXRjaCBpcCBwcm90b2NvbCAxIDB4ZmYgcG9saWNlIHJhdGUgMmtiaXQgYnVmZmVyIDEwayBkcm9wIGZsb3dpZCAxMDoxMgorJFRDIHFkaXNjIGRlbCBkZXYgJERFViByb290CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90aXBjL01ha2VmaWxlIGIvaXByb3V0ZTIvdGlwYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDZkY2IxCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGlwYy9NYWtlZmlsZQpAQCAtMCwwICsxLDI3IEBACitpbmNsdWRlIC4uL0NvbmZpZworaWZlcSAoJChIQVZFX01OTCkseSkKKworVElQQ09CSj1iZWFyZXIubyBcCisgICAgY21kbC5vIGxpbmsubyBcCisgICAgbWVkaWEubyBtaXNjLm8gXAorICAgIG1zZy5vIG5hbWV0YWJsZS5vIFwKKyAgICBub2RlLm8gc29ja2V0Lm8gXAorICAgIHBlZXIubyB0aXBjLm8KKworaW5jbHVkZSAuLi9Db25maWcKKworVEFSR0VUUz10aXBjCitDRkxBR1MgKz0gJChzaGVsbCAkKFBLR19DT05GSUcpIGxpYm1ubCAtLWNmbGFncykKK0xETElCUyArPSAkKHNoZWxsICQoUEtHX0NPTkZJRykgbGlibW5sIC0tbGlicykKKworZW5kaWYKKworYWxsOiAkKFRBUkdFVFMpICQoTElCUykKKwordGlwYzogJChUSVBDT0JKKQorCitpbnN0YWxsOiBhbGwKKwlpbnN0YWxsIC1tIDA3NTUgJChUQVJHRVRTKSAkKERFU1RESVIpJChTQklORElSKQorCitjbGVhbjoKKwlybSAtZiAkKFRJUENPQkopICQoVEFSR0VUUykKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RpcGMvUkVBRE1FIGIvaXByb3V0ZTIvdGlwYy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc4YTBiNwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RpcGMvUkVBRE1FCkBAIC0wLDAgKzEsNjMgQEAKK0RFU0lHTiBERUNJU0lPTlMKKy0tLS0tLS0tLS0tLS0tLS0KKworSEVMUAorfn5+fgorLS1oZWxwIG9yIC1oIGlzIHVzZWQgZm9yIGhlbHAuIFdlIGRvIG5vdCByZXNlcnZlIHRoZSBiYXJlIHdvcmQgImhlbHAiLCB3aGljaAorZm9yIGV4YW1wbGUgdGhlIGlwIGNvbW1hbmQgZG9lcy4gUmVzZXJ2aW5nIGEgYmFyZSB3b3JkIGxpa2UgaGVscCBxdWlja2x5CitiZWNvbWVzIGN1bWJlcnNvbWUgdG8gaGFuZGxlIGluIHRoZSBjb2RlLiBJdCBtaWdodCBiZSBzaW1wbGUgdG8gaGFuZGxlCit3aGVuIGl0J3MgcGFzc2VkIGVhcmx5IGluIHRoZSBjb21tYW5kIGNoYWluIGxpa2UgImlwIGFkZHIgaGVscCIuIEJ1dCB3aGVuCit0aGUgdXNlciB0cmllcyB0byBwYXNzICJoZWxwIiBmdXJ0aGVyIGRvd24gdGhpcyByZXF1aXJlcyBtYW51YWwgY2hlY2tzIGFuZAorc3BlY2lhbCB0cmVhdG1lbnQuIEZvciBleGFtcGxlLCBhdCB0aGUgdGltZSBvZiB3cml0aW5nIHRoaXMgdG9vbCwgaXQncworcG9zc2libGUgdG8gY3JlYXRlIGEgdmxhbiBuYW1lZCAiaGVscCIgd2l0aCB0aGUgaXAgdG9vbCwgYnV0IGl0J3MgaW1wb3NzaWJsZQordG8gcmVtb3ZlIGl0LCB0aGUgY29tbWFuZCBqdXN0IHNob3dzIGhlbHAuIFRoaXMgaXMgYW4gZWZmZWN0IG9mIHRyZWF0aW5nCitiYXJlIHdvcmRzIHNwZWNpYWxseS4KKworSGVscCB0ZXh0cyBhcmUgbm90IGR5bmFtaWNhbGx5IGdlbmVyYXRlZC4gVGhhdCBpcywgd2UgZG8gbm90IHBhc3MgZGF0YXN0cnVjdHVyZXMKK2xpa2UgY29tbWFuZCBsaXN0IG9yIG9wdGlvbiBsaXN0cyBhbmQgcHJpbnQgdGhlbSBkeW5hbWljYWxseS4gVGhpcyBpcworaW50ZW50aW9uYWwuIFRoZXJlIGlzIGFsd2F5cyB0aGF0IGV4Y2VwdGlvbiBhbmQgd2hlbiBpdCBjb21lcyB0byBoZWxwIHRleHRzCit0aGVzZSBleGNlcHRpb25zIGFyZSBub3JtYWxseSBuZWdsZWN0ZWQgYXQgdGhlIGV4cGVuY2Ugb2YgdXNhYmlsaXR5LgorCitLRVktVkFMVUUKK35+fn5+fn5+fgorQWxsIG9wdGlvbnMgYXJlIGtleS12YWx1ZXMuIFRoZXJlIGFyZSBib3RoIGRyYXdiYWNrcyBhbmQgYmVuZWZpdHMgdG8gdGhpcy4KK1RoZSBtYWluIGRyYXdiYWNrIGlzIHRoYXQgaXQgYmVjb21lcyBtb3JlIHRvIHdyaXRlIGZvciB0aGUgdXNlciBhbmQKK2luZm9ybWF0aW9uIG1pZ2h0IHNlZW0gcmVkdW5kYW50LiBUaGUgbWFpbiBiZW5lZml0cyBpcyBzY2FsYWJpbGl0eSBhbmQgY29kZQorc2ltcGxpZmljYXRpb24uIENvbnNpc3RlbmN5IGlzIGltcG9ydGFudC4KKworQ29uc2lkZXIgdGhpcy4KKzEuIHRpcGMgbGluayBzZXQgcHJpb3JpdHkgUFJJTyBsaW5rIExJTksKKzIuIHRpcGMgbGluayBzZXQgTElOSyBwcmlvcml0eSBQUklPCisKK0xpbmsgbWlnaHQgc2VlbSByZWR1bmRhbnQgaW4gKDEpLiBIb3dldmVyLCBpZiB0aGUgY29tbWFuZCBzaG91bGQgbGl2ZSBmb3IgbWFueQoreWVhcnMgYW5kIGJlIGFibGUgdG8gZXZvbHZlIGV4YW1wbGUgKDIpIGxpbWl0cyB0aGUgc2V0IGNvbW1hbmQgdG8gb25seSB3b3JrIG9uIGEKK3NpbmdsZSBsaW5rIHdpdGggbm8gYWJpbGl0eSB0byBleHRlbmQuIEFzIGFuIGV4YW1wbGUsIGxldHMgc2F5IHdlIGludHJvZHVjZQorZ3JvdXBpbmcgb24gdGhlIGtlcm5lbCBzaWRlLgorCisxLiB0aXBjIGxpbmsgc2V0IHByaW9yaXR5IFBSSU8gZ3JvdXAgR1JPVVAKKzIuIHRpcGMgbGluayBzZXQgPz8/IHByaW9yaXR5IFBSSU8gZ3JvdXAgR1JPVVAKKworMi4gYnJlYWtzLCB3ZSBjYW4ndCBleHRlbmQgdGhlIGNvbW1hbmQgdG8gY292ZXIgYSBncm91cC4KKworUEFSU0lORworfn5+fn5+fgorQ29tbWFuZHMgYXJlIHNpbmdsZSB3b3Jkcy4gQXMgYW4gZXhhbXBsZSwgYWxsIHdvcmRzIGluICJ0aXBjIGxpbmsgbGlzdCIgYXJlCitjb21tYW5kcy4gT3B0aW9ucyBhcmUga2V5LXZhbHVlcyB0aGF0IGNhbiBiZSBnaXZlbiBpbiBhbnkgb3JkZXIuIEluCisidGlwYyBsaW5rIHNldCBwcmlvcml0eSBQUklPIGxpbmsgTElOSyIgInRpcGMgbGluayBzZXQiIGFyZSBjb21tYW5kcyB3aGlsZQorcHJpb3JpdHkgYW5kIGxpbmsgYXJlIG9wdGlvbnMuIE1lYW5pbmcgdGhhdCB0aGV5IGNhbiBiZSBnaXZlbiBsaWtlCisidGlwYyBsaW5rIHNldCBsaW5rIExJTksgcHJpb3JpdHkgUFJJTyIuCisKK0FiYnJldmlhdGlvbiBtYXRjaGluZyB3b3JrcyBmb3IgYm90aCBjb21tYW5kIGFuZCBvcHRpb25zLiBNZWFuaW5nIHRoYXQKKyJ0aXBjIGxpbmsgc2V0IHByaW9yaXR5IFBSSU8gbGluayBMSU5LIiBjb3VsZCBiZSBnaXZlbiBhcworInRpcGMgbCBzIHAgUFJJTyBsIExJTksiIGFuZCAidGlwYyBsaW5rIGxpc3QiIGFzICJ0aXBjIGwgbCIuCisKK01FTU9SWQorfn5+fn5+CitUaGUgdG9vbCBzdHJpdmVzIHRvIGF2b2lkIGFsbG9jYXRpbmcgbWVtb3J5IG9uIHRoZSBoZWFwLiBNb3N0IChpZiBub3QgYWxsKQorbWVtb3J5IGFsbG9jYXRpb25zIGFyZSBvbiB0aGUgc3RhY2suCisKK1JFVFVSTklORworfn5+fn5+fn5+CitUaGUgdG9vbCBjb3VsZCB0aHJvdyBleGl0KCkgZGVlcCBkb3duIGluIGZ1bmN0aW9ucyBidXQgZG9pbmcgc28gYWx3YXlzIHNlZW1zCit0byBsaW1pdCB0aGUgcHJvZ3JhbSBpbiB0aGUgbG9uZyBydW4uIFNvIHdlIG91dHB1dCB0aGUgZXJyb3IgYW5kIHJldHVybiBhbgorYXBwcm9wcmlhdGUgZXJyb3IgY29kZSB1cG9uIGZhaWx1cmUuCmRpZmYgLS1naXQgYS9pcHJvdXRlMi90aXBjL2JlYXJlci5jIGIvaXByb3V0ZTIvdGlwYy9iZWFyZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGI1NGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGlwYy9iZWFyZXIuYwpAQCAtMCwwICsxLDcyNSBAQAorLyoKKyAqIGJlYXJlci5jCVRJUEMgYmVhcmVyIGZ1bmN0aW9uYWxpdHkuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJUmljaGFyZCBBbHBlIDxyaWNoYXJkLmFscGVAZXJpY3Nzb24uY29tPgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPGxpbnV4L3RpcGNfbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3RpcGMuaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5ldGxpbmsuaD4KKworI2luY2x1ZGUgPGxpYm1ubC9saWJtbmwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyNpbmNsdWRlICJjbWRsLmgiCisjaW5jbHVkZSAibXNnLmgiCisjaW5jbHVkZSAiYmVhcmVyLmgiCisKK3N0YXRpYyB2b2lkIF9wcmludF9iZWFyZXJfb3B0cyh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLAorCQkiXG5PUFRJT05TXG4iCisJCSIgcHJpb3JpdHkgICAgICAgICAgICAgIC0gQmVhcmVyIGxpbmsgcHJpb3JpdHlcbiIKKwkJIiB0b2xlcmFuY2UgICAgICAgICAgICAgLSBCZWFyZXIgbGluayB0b2xlcmFuY2VcbiIKKwkJIiB3aW5kb3cgICAgICAgICAgICAgICAgLSBCZWFyZXIgbGluayB3aW5kb3dcbiIpOworfQorCitzdGF0aWMgdm9pZCBfcHJpbnRfYmVhcmVyX21lZGlhKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsCisJCSJcbk1FRElBXG4iCisJCSIgdWRwICAgICAgICAgICAgICAgICAgIC0gVXNlciBEYXRhZ3JhbSBQcm90b2NvbFxuIgorCQkiIGliICAgICAgICAgICAgICAgICAgICAtIEluZmluaWJhbmRcbiIKKwkJIiBldGggICAgICAgICAgICAgICAgICAgLSBFdGhlcm5ldFxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGNtZF9iZWFyZXJfZW5hYmxlX2wyX2hlbHAoc3RydWN0IGNtZGwgKmNtZGwpCit7CisJZnByaW50ZihzdGRlcnIsCisJCSJVc2FnZTogJXMgYmVhcmVyIGVuYWJsZSBtZWRpYSBNRURJQSBkZXZpY2UgREVWSUNFIFtPUFRJT05TXVxuIgorCQkiXG5PUFRJT05TXG4iCisJCSIgZG9tYWluIERPTUFJTiAgICAgICAgIC0gRGlzY292ZXJ5IGRvbWFpblxuIgorCQkiIHByaW9yaXR5IFBSSU9SSVRZICAgICAtIEJlYXJlciBwcmlvcml0eVxuIiwKKwkJY21kbC0+YXJndlswXSk7Cit9CisKK3N0YXRpYyB2b2lkIGNtZF9iZWFyZXJfZW5hYmxlX3VkcF9oZWxwKHN0cnVjdCBjbWRsICpjbWRsKQoreworCWZwcmludGYoc3RkZXJyLAorCQkiVXNhZ2U6ICVzIGJlYXJlciBlbmFibGUgbWVkaWEgdWRwIG5hbWUgTkFNRSBsb2NhbGlwIElQIFtPUFRJT05TXVxuIgorCQkiXG5PUFRJT05TXG4iCisJCSIgZG9tYWluIERPTUFJTiAgICAgICAgIC0gRGlzY292ZXJ5IGRvbWFpblxuIgorCQkiIHByaW9yaXR5IFBSSU9SSVRZICAgICAtIEJlYXJlciBwcmlvcml0eVxuIgorCQkiIGxvY2FscG9ydCBQT1JUICAgICAgICAtIExvY2FsIFVEUCBwb3J0IChkZWZhdWx0IDYxMTgpXG4iCisJCSIgcmVtb3RlaXAgSVAgICAgICAgICAgIC0gUmVtb3RlIElQIGFkZHJlc3NcbiIKKwkJIiByZW1vdGVwb3J0IElQICAgICAgICAgLSBSZW1vdGUgVURQIHBvcnQgKGRlZmF1bHQgNjExOClcbiIsCisJCWNtZGwtPmFyZ3ZbMF0pOworfQorCitzdGF0aWMgaW50IGVuYWJsZV9sMl9iZWFyZXIoc3RydWN0IG5sbXNnaGRyICpubGgsIHN0cnVjdCBvcHQgKm9wdHMsCisJCQkgICAgc3RydWN0IGNtZGwgKmNtZGwpCit7CisJc3RydWN0IG9wdCAqb3B0OworCWNoYXIgaWRbVElQQ19NQVhfQkVBUkVSX05BTUVdOworCisJaWYgKCEob3B0ID0gZ2V0X29wdChvcHRzLCAiZGV2aWNlIikpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3I6IG1pc3NpbmcgYmVhcmVyIGRldmljZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzbnByaW50ZihpZCwgc2l6ZW9mKGlkKSwgImV0aDolcyIsIG9wdC0+dmFsKTsKKwltbmxfYXR0cl9wdXRfc3RyeihubGgsIFRJUENfTkxBX0JFQVJFUl9OQU1FLCBpZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfbmV0aWRfY2IoY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdlbmxtc2doZHIgKmdlbmwgPSBtbmxfbmxtc2dfZ2V0X3BheWxvYWQobmxoKTsKKwlzdHJ1Y3QgbmxhdHRyICppbmZvW1RJUENfTkxBX01BWCArIDFdID0ge307CisJc3RydWN0IG5sYXR0ciAqYXR0cnNbVElQQ19OTEFfTkVUX01BWCArIDFdID0ge307CisJaW50ICpuZXRpZCA9IChpbnQqKWRhdGE7CisKKwltbmxfYXR0cl9wYXJzZShubGgsIHNpemVvZigqZ2VubCksIHBhcnNlX2F0dHJzLCBpbmZvKTsKKwlpZiAoIWluZm9bVElQQ19OTEFfTkVUXSkKKwkJcmV0dXJuIE1OTF9DQl9FUlJPUjsKKwltbmxfYXR0cl9wYXJzZV9uZXN0ZWQoaW5mb1tUSVBDX05MQV9ORVRdLCBwYXJzZV9hdHRycywgYXR0cnMpOworCWlmICghYXR0cnNbVElQQ19OTEFfTkVUX0lEXSkKKwkJcmV0dXJuIE1OTF9DQl9FUlJPUjsKKwkqbmV0aWQgPSBtbmxfYXR0cl9nZXRfdTMyKGF0dHJzW1RJUENfTkxBX05FVF9JRF0pOworCisJcmV0dXJuIE1OTF9DQl9PSzsKK30KKworc3RhdGljIGludCBnZW5lcmF0ZV9tdWx0aWNhc3Qoc2hvcnQgYWYsIGNoYXIgKmJ1ZiwgaW50IGJ1ZnNpemUpCit7CisJaW50IG5ldGlkOworCWNoYXIgbW5sX21zZ1tNTkxfU09DS0VUX0JVRkZFUl9TSVpFXTsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKworCWlmICghKG5saCA9IG1zZ19pbml0KG1ubF9tc2csIFRJUENfTkxfTkVUX0dFVCkpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3IsIG1lc3NhZ2UgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAobXNnX2R1bXBpdChubGgsIGdldF9uZXRpZF9jYiwgJm5ldGlkKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yLCBmYWlsZWQgdG8gZmV0Y2ggVElQQyBuZXR3b3JrIGlkIGZyb20ga2VybmVsXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChhZiA9PSBBRl9JTkVUKQorCQlzbnByaW50ZihidWYsIGJ1ZnNpemUsICIyMjguMC4ldS4ldSIsIChuZXRpZD4+OCkgJiAweEZGLCBuZXRpZCAmIDB4RkYpOworCWVsc2UKKwkJc25wcmludGYoYnVmLCBidWZzaXplLCAiZmYwMjo6JXUiLCBuZXRpZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmFibGVfdWRwX2JlYXJlcihzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG9wdCAqb3B0cywKKwkJCSAgICAgc3RydWN0IGNtZGwgKmNtZGwpCit7CisJaW50IGVycjsKKwlzdHJ1Y3Qgb3B0ICpvcHQ7CisJc3RydWN0IG5sYXR0ciAqbmVzdDsKKwljaGFyIGJ1ZltJTkVUNl9BRERSU1RSTEVOXTsKKwljaGFyICpsb2Nwb3J0ID0gIjYxMTgiOworCWNoYXIgKnJlbXBvcnQgPSAiNjExOCI7CisJY2hhciAqbG9jaXAgPSBOVUxMOworCWNoYXIgKnJlbWlwID0gTlVMTDsKKwljaGFyIG5hbWVbVElQQ19NQVhfQkVBUkVSX05BTUVdOworCXN0cnVjdCBhZGRyaW5mbyAqbG9jID0gTlVMTDsKKwlzdHJ1Y3QgYWRkcmluZm8gKnJlbSA9IE5VTEw7CisJc3RydWN0IGFkZHJpbmZvIGhpbnRzID0geworCQkuYWlfZmFtaWx5ID0gQUZfVU5TUEVDLAorCQkuYWlfc29ja3R5cGUgPSBTT0NLX0RHUkFNCisJfTsKKworCWlmIChoZWxwX2ZsYWcpIHsKKwkJY21kX2JlYXJlcl9lbmFibGVfdWRwX2hlbHAoY21kbCk7CisJCS8qIFRPRE8gZmluZCBhIGJldHRlciBlcnJvciBjb2RlPyAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIShvcHQgPSBnZXRfb3B0KG9wdHMsICJuYW1lIikpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3IsIHVkcCBiZWFyZXIgbmFtZSBtaXNzaW5nXG4iKTsKKwkJY21kX2JlYXJlcl9lbmFibGVfdWRwX2hlbHAoY21kbCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJ1ZHA6JXMiLCBvcHQtPnZhbCk7CisKKwlpZiAoIShvcHQgPSBnZXRfb3B0KG9wdHMsICJsb2NhbGlwIikpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3IsIHVkcCBiZWFyZXIgbG9jYWxpcCBtaXNzaW5nXG4iKTsKKwkJY21kX2JlYXJlcl9lbmFibGVfdWRwX2hlbHAoY21kbCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlsb2NpcCA9IG9wdC0+dmFsOworCisJaWYgKChvcHQgPSBnZXRfb3B0KG9wdHMsICJyZW1vdGVpcCIpKSkKKwkJcmVtaXAgPSBvcHQtPnZhbDsKKworCWlmICgob3B0ID0gZ2V0X29wdChvcHRzLCAibG9jYWxwb3J0IikpKQorCQlsb2Nwb3J0ID0gb3B0LT52YWw7CisKKwlpZiAoKG9wdCA9IGdldF9vcHQob3B0cywgInJlbW90ZXBvcnQiKSkpCisJCXJlbXBvcnQgPSBvcHQtPnZhbDsKKworCWlmICgoZXJyID0gZ2V0YWRkcmluZm8obG9jaXAsIGxvY3BvcnQsICZoaW50cywgJmxvYykpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVURQIGxvY2FsIGFkZHJlc3MgZXJyb3I6ICVzXG4iLAorCQkJZ2FpX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICghcmVtaXApIHsKKwkJaWYgKGdlbmVyYXRlX211bHRpY2FzdChsb2MtPmFpX2ZhbWlseSwgYnVmLCBzaXplb2YoYnVmKSkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGdlbmVyYXRlIG11bHRpY2FzdCBhZGRyZXNzXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJlbWlwID0gYnVmOworCX0KKworCWlmICgoZXJyID0gZ2V0YWRkcmluZm8ocmVtaXAsIHJlbXBvcnQsICZoaW50cywgJnJlbSkpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVURQIHJlbW90ZSBhZGRyZXNzIGVycm9yOiAlc1xuIiwKKwkJCWdhaV9zdHJlcnJvcihlcnIpKTsKKwkJZnJlZWFkZHJpbmZvKGxvYyk7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKHJlbS0+YWlfZmFtaWx5ICE9IGxvYy0+YWlfZmFtaWx5KSB7CisJCWZwcmludGYoc3RkZXJyLCAiVURQIGxvY2FsIGFuZCByZW1vdGUgQUYgbWlzbWF0Y2hcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltbmxfYXR0cl9wdXRfc3RyeihubGgsIFRJUENfTkxBX0JFQVJFUl9OQU1FLCBuYW1lKTsKKworCW5lc3QgPSBtbmxfYXR0cl9uZXN0X3N0YXJ0KG5saCwgVElQQ19OTEFfQkVBUkVSX1VEUF9PUFRTKTsKKwltbmxfYXR0cl9wdXQobmxoLCBUSVBDX05MQV9VRFBfTE9DQUwsIGxvYy0+YWlfYWRkcmxlbiwgbG9jLT5haV9hZGRyKTsKKwltbmxfYXR0cl9wdXQobmxoLCBUSVBDX05MQV9VRFBfUkVNT1RFLCByZW0tPmFpX2FkZHJsZW4sIHJlbS0+YWlfYWRkcik7CisJbW5sX2F0dHJfbmVzdF9lbmQobmxoLCBuZXN0KTsKKworCWZyZWVhZGRyaW5mbyhyZW0pOworCWZyZWVhZGRyaW5mbyhsb2MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNtZF9iZWFyZXJfZW5hYmxlX2hlbHAoc3RydWN0IGNtZGwgKmNtZGwpCit7CisJZnByaW50ZihzdGRlcnIsCisJCSJVc2FnZTogJXMgYmVhcmVyIGVuYWJsZSBbT1BUSU9OU10gbWVkaWEgTUVESUEgQVJHUy4uLlxuXG4iCisJCSJPUFRJT05TXG4iCisJCSIgZG9tYWluIERPTUFJTiAgICAgICAgIC0gRGlzY292ZXJ5IGRvbWFpblxuIgorCQkiIHByaW9yaXR5IFBSSU9SSVRZICAgICAtIEJlYXJlciBwcmlvcml0eVxuIiwKKwkJY21kbC0+YXJndlswXSk7CisJX3ByaW50X2JlYXJlcl9tZWRpYSgpOworfQorCitzdGF0aWMgaW50IGNtZF9iZWFyZXJfZW5hYmxlKHN0cnVjdCBubG1zZ2hkciAqbmxoLCBjb25zdCBzdHJ1Y3QgY21kICpjbWQsCisJCQkgICAgIHN0cnVjdCBjbWRsICpjbWRsLCB2b2lkICpkYXRhKQoreworCWludCBlcnI7CisJc3RydWN0IG9wdCAqb3B0OworCXN0cnVjdCBubGF0dHIgKm5lc3Q7CisJY2hhciBidWZbTU5MX1NPQ0tFVF9CVUZGRVJfU0laRV07CisJY2hhciAqbWVkaWE7CisJc3RydWN0IG9wdCBvcHRzW10gPSB7CisJCXsgImRldmljZSIsCQlOVUxMIH0sCisJCXsgImRvbWFpbiIsCQlOVUxMIH0sCisJCXsgImxvY2FsaXAiLAkJTlVMTCB9LAorCQl7ICJsb2NhbHBvcnQiLAkJTlVMTCB9LAorCQl7ICJtZWRpYSIsCQlOVUxMIH0sCisJCXsgIm5hbWUiLAkJTlVMTCB9LAorCQl7ICJwcmlvcml0eSIsCQlOVUxMIH0sCisJCXsgInJlbW90ZWlwIiwJCU5VTEwgfSwKKwkJeyAicmVtb3RlcG9ydCIsCQlOVUxMIH0sCisJCXsgTlVMTCB9CisJfTsKKworCWlmIChwYXJzZV9vcHRzKG9wdHMsIGNtZGwpIDwgMCkgeworCQlpZiAoaGVscF9mbGFnKQorCQkJKGNtZC0+aGVscCkoY21kbCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghKG9wdCA9IGdldF9vcHQob3B0cywgIm1lZGlhIikpKSB7CisJCWlmIChoZWxwX2ZsYWcpCisJCQkoY21kLT5oZWxwKShjbWRsKTsKKwkJZWxzZQorCQkJZnByaW50ZihzdGRlcnIsICJlcnJvciwgbWlzc2luZyBiZWFyZXIgbWVkaWFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbWVkaWEgPSBvcHQtPnZhbDsKKworCWlmICghKG5saCA9IG1zZ19pbml0KGJ1ZiwgVElQQ19OTF9CRUFSRVJfRU5BQkxFKSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvcjogbWVzc2FnZSBpbml0aWFsaXNhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCW5lc3QgPSBtbmxfYXR0cl9uZXN0X3N0YXJ0KG5saCwgVElQQ19OTEFfQkVBUkVSKTsKKworCWlmICgob3B0ID0gZ2V0X29wdChvcHRzLCAiZG9tYWluIikpKQorCQltbmxfYXR0cl9wdXRfdTMyKG5saCwgVElQQ19OTEFfQkVBUkVSX0RPTUFJTiwgYXRvaShvcHQtPnZhbCkpOworCisJaWYgKChvcHQgPSBnZXRfb3B0KG9wdHMsICJwcmlvcml0eSIpKSkgeworCQlzdHJ1Y3QgbmxhdHRyICpwcm9wczsKKworCQlwcm9wcyA9IG1ubF9hdHRyX25lc3Rfc3RhcnQobmxoLCBUSVBDX05MQV9CRUFSRVJfUFJPUCk7CisJCW1ubF9hdHRyX3B1dF91MzIobmxoLCBUSVBDX05MQV9QUk9QX1BSSU8sIGF0b2kob3B0LT52YWwpKTsKKwkJbW5sX2F0dHJfbmVzdF9lbmQobmxoLCBwcm9wcyk7CisJfQorCisJaWYgKHN0cmNtcChtZWRpYSwgInVkcCIpID09IDApIHsKKwkJaWYgKGhlbHBfZmxhZykgeworCQkJY21kX2JlYXJlcl9lbmFibGVfdWRwX2hlbHAoY21kbCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoKGVyciA9IGVuYWJsZV91ZHBfYmVhcmVyKG5saCwgb3B0cywgY21kbCkpKQorCQkJcmV0dXJuIGVycjsKKwl9IGVsc2UgaWYgKChzdHJjbXAobWVkaWEsICJldGgiKSA9PSAwKSB8fCAoc3RyY21wKG1lZGlhLCAidWRwIikgPT0gMCkpIHsKKwkJaWYgKGhlbHBfZmxhZykgeworCQkJY21kX2JlYXJlcl9lbmFibGVfbDJfaGVscChjbWRsKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmICgoZXJyID0gZW5hYmxlX2wyX2JlYXJlcihubGgsIG9wdHMsIGNtZGwpKSkKKwkJCXJldHVybiBlcnI7CisJfSBlbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvciwgaW52YWxpZCBtZWRpYSB0eXBlIFwiJXNcIlxuIiwgbWVkaWEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltbmxfYXR0cl9uZXN0X2VuZChubGgsIG5lc3QpOworCisJcmV0dXJuIG1zZ19kb2l0KG5saCwgTlVMTCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgYWRkX2wyX2JlYXJlcihzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG9wdCAqb3B0cykKK3sKKwlzdHJ1Y3Qgb3B0ICpvcHQ7CisJY2hhciBpZFtUSVBDX01BWF9CRUFSRVJfTkFNRV07CisKKwlpZiAoIShvcHQgPSBnZXRfb3B0KG9wdHMsICJkZXZpY2UiKSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvcjogbWlzc2luZyBiZWFyZXIgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXNucHJpbnRmKGlkLCBzaXplb2YoaWQpLCAiZXRoOiVzIiwgb3B0LT52YWwpOworCisJbW5sX2F0dHJfcHV0X3N0cnoobmxoLCBUSVBDX05MQV9CRUFSRVJfTkFNRSwgaWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3VkcF9iZWFyZXIoc3RydWN0IG5sbXNnaGRyICpubGgsIHN0cnVjdCBvcHQgKm9wdHMpCit7CisJc3RydWN0IG9wdCAqb3B0OworCWNoYXIgaWRbVElQQ19NQVhfQkVBUkVSX05BTUVdOworCisJaWYgKCEob3B0ID0gZ2V0X29wdChvcHRzLCAibmFtZSIpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yOiBtaXNzaW5nIGJlYXJlciBuYW1lXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXNucHJpbnRmKGlkLCBzaXplb2YoaWQpLCAidWRwOiVzIiwgb3B0LT52YWwpOworCisJbW5sX2F0dHJfcHV0X3N0cnoobmxoLCBUSVBDX05MQV9CRUFSRVJfTkFNRSwgaWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNtZF9iZWFyZXJfZGlzYWJsZV9sMl9oZWxwKHN0cnVjdCBjbWRsICpjbWRsKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIGJlYXJlciBkaXNhYmxlIG1lZGlhIHVkcCBkZXZpY2UgREVWSUNFXG4iLAorCQljbWRsLT5hcmd2WzBdKTsKK30KKworc3RhdGljIHZvaWQgY21kX2JlYXJlcl9kaXNhYmxlX3VkcF9oZWxwKHN0cnVjdCBjbWRsICpjbWRsKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIGJlYXJlciBkaXNhYmxlIG1lZGlhIHVkcCBuYW1lIE5BTUVcbiIsCisJCWNtZGwtPmFyZ3ZbMF0pOworfQorCitzdGF0aWMgdm9pZCBjbWRfYmVhcmVyX2Rpc2FibGVfaGVscChzdHJ1Y3QgY21kbCAqY21kbCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBiZWFyZXIgZGlzYWJsZSBtZWRpYSBNRURJQSBBUkdTLi4uXG4iLAorCQljbWRsLT5hcmd2WzBdKTsKKwlfcHJpbnRfYmVhcmVyX21lZGlhKCk7Cit9CisKK3N0YXRpYyBpbnQgY21kX2JlYXJlcl9kaXNhYmxlKHN0cnVjdCBubG1zZ2hkciAqbmxoLCBjb25zdCBzdHJ1Y3QgY21kICpjbWQsCisJCQkgICAgICBzdHJ1Y3QgY21kbCAqY21kbCwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgZXJyOworCWNoYXIgKm1lZGlhOworCWNoYXIgYnVmW01OTF9TT0NLRVRfQlVGRkVSX1NJWkVdOworCXN0cnVjdCBubGF0dHIgKm5lc3Q7CisJc3RydWN0IG9wdCAqb3B0OworCXN0cnVjdCBvcHQgb3B0c1tdID0geworCQl7ICJkZXZpY2UiLAkJTlVMTCB9LAorCQl7ICJuYW1lIiwJCU5VTEwgfSwKKwkJeyAibWVkaWEiLAkJTlVMTCB9LAorCQl7IE5VTEwgfQorCX07CisKKwlpZiAocGFyc2Vfb3B0cyhvcHRzLCBjbWRsKSA8IDApIHsKKwkJaWYgKGhlbHBfZmxhZykKKwkJCShjbWQtPmhlbHApKGNtZGwpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIShvcHQgPSBnZXRfb3B0KG9wdHMsICJtZWRpYSIpKSkgeworCQlpZiAoaGVscF9mbGFnKQorCQkJKGNtZC0+aGVscCkoY21kbCk7CisJCWVsc2UKKwkJCWZwcmludGYoc3RkZXJyLCAiZXJyb3IsIG1pc3NpbmcgYmVhcmVyIG1lZGlhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1lZGlhID0gb3B0LT52YWw7CisKKwlpZiAoIShubGggPSBtc2dfaW5pdChidWYsIFRJUENfTkxfQkVBUkVSX0RJU0FCTEUpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yLCBtZXNzYWdlIGluaXRpYWxpc2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwluZXN0ID0gbW5sX2F0dHJfbmVzdF9zdGFydChubGgsIFRJUENfTkxBX0JFQVJFUik7CisKKwlpZiAoc3RyY21wKG1lZGlhLCAidWRwIikgPT0gMCkgeworCQlpZiAoaGVscF9mbGFnKSB7CisJCQljbWRfYmVhcmVyX2Rpc2FibGVfdWRwX2hlbHAoY21kbCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoKGVyciA9IGFkZF91ZHBfYmVhcmVyKG5saCwgb3B0cykpKQorCQkJcmV0dXJuIGVycjsKKwl9IGVsc2UgaWYgKChzdHJjbXAobWVkaWEsICJldGgiKSA9PSAwKSB8fCAoc3RyY21wKG1lZGlhLCAidWRwIikgPT0gMCkpIHsKKwkJaWYgKGhlbHBfZmxhZykgeworCQkJY21kX2JlYXJlcl9kaXNhYmxlX2wyX2hlbHAoY21kbCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoKGVyciA9IGFkZF9sMl9iZWFyZXIobmxoLCBvcHRzKSkpCisJCQlyZXR1cm4gZXJyOworCX0gZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3IsIGludmFsaWQgbWVkaWEgdHlwZSBcIiVzXCJcbiIsIG1lZGlhKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1ubF9hdHRyX25lc3RfZW5kKG5saCwgbmVzdCk7CisKKwlyZXR1cm4gbXNnX2RvaXQobmxoLCBOVUxMLCBOVUxMKTsKKworfQorCitzdGF0aWMgdm9pZCBjbWRfYmVhcmVyX3NldF9oZWxwKHN0cnVjdCBjbWRsICpjbWRsKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIGJlYXJlciBzZXQgT1BUSU9OIG1lZGlhIE1FRElBIEFSR1MuLi5cbiIsCisJCWNtZGwtPmFyZ3ZbMF0pOworCV9wcmludF9iZWFyZXJfb3B0cygpOworCV9wcmludF9iZWFyZXJfbWVkaWEoKTsKK30KKworc3RhdGljIHZvaWQgY21kX2JlYXJlcl9zZXRfdWRwX2hlbHAoc3RydWN0IGNtZGwgKmNtZGwpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgYmVhcmVyIHNldCBPUFRJT04gbWVkaWEgdWRwIG5hbWUgTkFNRVxuXG4iLAorCQljbWRsLT5hcmd2WzBdKTsKKwlfcHJpbnRfYmVhcmVyX29wdHMoKTsKK30KKworc3RhdGljIHZvaWQgY21kX2JlYXJlcl9zZXRfbDJfaGVscChzdHJ1Y3QgY21kbCAqY21kbCwgY2hhciAqbWVkaWEpCit7CisJZnByaW50ZihzdGRlcnIsCisJCSJVc2FnZTogJXMgYmVhcmVyIHNldCBbT1BUSU9OXS4uLiBtZWRpYSAlcyBkZXZpY2UgREVWSUNFXG4iLAorCQljbWRsLT5hcmd2WzBdLCBtZWRpYSk7CisJX3ByaW50X2JlYXJlcl9vcHRzKCk7Cit9CisKK3N0YXRpYyBpbnQgY21kX2JlYXJlcl9zZXRfcHJvcChzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgY29uc3Qgc3RydWN0IGNtZCAqY21kLAorCQkJIHN0cnVjdCBjbWRsICpjbWRsLCB2b2lkICpkYXRhKQoreworCWludCBlcnI7CisJaW50IHZhbDsKKwlpbnQgcHJvcDsKKwljaGFyICptZWRpYTsKKwljaGFyIGJ1ZltNTkxfU09DS0VUX0JVRkZFUl9TSVpFXTsKKwlzdHJ1Y3QgbmxhdHRyICpwcm9wczsKKwlzdHJ1Y3QgbmxhdHRyICphdHRyczsKKwlzdHJ1Y3Qgb3B0ICpvcHQ7CisJc3RydWN0IG9wdCBvcHRzW10gPSB7CisJCXsgImRldmljZSIsCQlOVUxMIH0sCisJCXsgIm1lZGlhIiwJCU5VTEwgfSwKKwkJeyAibmFtZSIsCQlOVUxMIH0sCisJCXsgTlVMTCB9CisJfTsKKworCWlmIChzdHJjbXAoY21kLT5jbWQsICJwcmlvcml0eSIpID09IDApCisJCXByb3AgPSBUSVBDX05MQV9QUk9QX1BSSU87CisJZWxzZSBpZiAoKHN0cmNtcChjbWQtPmNtZCwgInRvbGVyYW5jZSIpID09IDApKQorCQlwcm9wID0gVElQQ19OTEFfUFJPUF9UT0w7CisJZWxzZSBpZiAoKHN0cmNtcChjbWQtPmNtZCwgIndpbmRvdyIpID09IDApKQorCQlwcm9wID0gVElQQ19OTEFfUFJPUF9XSU47CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChoZWxwX2ZsYWcpIHsKKwkJKGNtZC0+aGVscCkoY21kbCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjbWRsLT5vcHRpbmQgPj0gY21kbC0+YXJnYykgeworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yLCBtaXNzaW5nIHZhbHVlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXZhbCA9IGF0b2koc2hpZnRfY21kbChjbWRsKSk7CisKKwlpZiAocGFyc2Vfb3B0cyhvcHRzLCBjbWRsKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCEobmxoID0gbXNnX2luaXQoYnVmLCBUSVBDX05MX0JFQVJFUl9TRVQpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yLCBtZXNzYWdlIGluaXRpYWxpc2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisJYXR0cnMgPSBtbmxfYXR0cl9uZXN0X3N0YXJ0KG5saCwgVElQQ19OTEFfQkVBUkVSKTsKKworCXByb3BzID0gbW5sX2F0dHJfbmVzdF9zdGFydChubGgsIFRJUENfTkxBX0JFQVJFUl9QUk9QKTsKKwltbmxfYXR0cl9wdXRfdTMyKG5saCwgcHJvcCwgdmFsKTsKKwltbmxfYXR0cl9uZXN0X2VuZChubGgsIHByb3BzKTsKKworCWlmICghKG9wdCA9IGdldF9vcHQob3B0cywgIm1lZGlhIikpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3IsIG1pc3NpbmcgbWVkaWFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbWVkaWEgPSBvcHQtPnZhbDsKKworCWlmIChzdHJjbXAobWVkaWEsICJ1ZHAiKSA9PSAwKSB7CisJCWlmIChoZWxwX2ZsYWcpIHsKKwkJCWNtZF9iZWFyZXJfc2V0X3VkcF9oZWxwKGNtZGwpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKChlcnIgPSBhZGRfdWRwX2JlYXJlcihubGgsIG9wdHMpKSkKKwkJCXJldHVybiBlcnI7CisJfSBlbHNlIGlmICgoc3RyY21wKG1lZGlhLCAiZXRoIikgPT0gMCkgfHwgKHN0cmNtcChtZWRpYSwgInVkcCIpID09IDApKSB7CisJCWlmIChoZWxwX2ZsYWcpIHsKKwkJCWNtZF9iZWFyZXJfc2V0X2wyX2hlbHAoY21kbCwgbWVkaWEpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKChlcnIgPSBhZGRfbDJfYmVhcmVyKG5saCwgb3B0cykpKQorCQkJcmV0dXJuIGVycjsKKwl9IGVsc2UgeworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yLCBpbnZhbGlkIG1lZGlhIHR5cGUgXCIlc1wiXG4iLCBtZWRpYSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltbmxfYXR0cl9uZXN0X2VuZChubGgsIGF0dHJzKTsKKworCXJldHVybiBtc2dfZG9pdChubGgsIE5VTEwsIE5VTEwpOworfQorCitzdGF0aWMgaW50IGNtZF9iZWFyZXJfc2V0KHN0cnVjdCBubG1zZ2hkciAqbmxoLCBjb25zdCBzdHJ1Y3QgY21kICpjbWQsCisJCQkgIHN0cnVjdCBjbWRsICpjbWRsLCB2b2lkICpkYXRhKQoreworCWNvbnN0IHN0cnVjdCBjbWQgY21kc1tdID0geworCQl7ICJwcmlvcml0eSIsCWNtZF9iZWFyZXJfc2V0X3Byb3AsCWNtZF9iZWFyZXJfc2V0X2hlbHAgfSwKKwkJeyAidG9sZXJhbmNlIiwJY21kX2JlYXJlcl9zZXRfcHJvcCwJY21kX2JlYXJlcl9zZXRfaGVscCB9LAorCQl7ICJ3aW5kb3ciLAljbWRfYmVhcmVyX3NldF9wcm9wLAljbWRfYmVhcmVyX3NldF9oZWxwIH0sCisJCXsgTlVMTCB9CisJfTsKKworCXJldHVybiBydW5fY21kKG5saCwgY21kLCBjbWRzLCBjbWRsLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgY21kX2JlYXJlcl9nZXRfaGVscChzdHJ1Y3QgY21kbCAqY21kbCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBiZWFyZXIgZ2V0IE9QVElPTiBtZWRpYSBNRURJQSBBUkdTLi4uXG4iLAorCQljbWRsLT5hcmd2WzBdKTsKKwlfcHJpbnRfYmVhcmVyX29wdHMoKTsKKwlfcHJpbnRfYmVhcmVyX21lZGlhKCk7Cit9CisKK3N0YXRpYyB2b2lkIGNtZF9iZWFyZXJfZ2V0X3VkcF9oZWxwKHN0cnVjdCBjbWRsICpjbWRsKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIGJlYXJlciBnZXQgT1BUSU9OIG1lZGlhIHVkcCBuYW1lIE5BTUVcblxuIiwKKwkJY21kbC0+YXJndlswXSk7CisJX3ByaW50X2JlYXJlcl9vcHRzKCk7Cit9CisKK3N0YXRpYyB2b2lkIGNtZF9iZWFyZXJfZ2V0X2wyX2hlbHAoc3RydWN0IGNtZGwgKmNtZGwsIGNoYXIgKm1lZGlhKQoreworCWZwcmludGYoc3RkZXJyLAorCQkiVXNhZ2U6ICVzIGJlYXJlciBnZXQgW09QVElPTl0uLi4gbWVkaWEgJXMgZGV2aWNlIERFVklDRVxuIiwKKwkJY21kbC0+YXJndlswXSwgbWVkaWEpOworCV9wcmludF9iZWFyZXJfb3B0cygpOworfQorCitzdGF0aWMgaW50IGJlYXJlcl9nZXRfY2IoY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKmRhdGEpCit7CisJaW50ICpwcm9wID0gZGF0YTsKKwlzdHJ1Y3QgZ2VubG1zZ2hkciAqZ2VubCA9IG1ubF9ubG1zZ19nZXRfcGF5bG9hZChubGgpOworCXN0cnVjdCBubGF0dHIgKmluZm9bVElQQ19OTEFfTUFYICsgMV0gPSB7fTsKKwlzdHJ1Y3QgbmxhdHRyICphdHRyc1tUSVBDX05MQV9CRUFSRVJfTUFYICsgMV0gPSB7fTsKKwlzdHJ1Y3QgbmxhdHRyICpwcm9wc1tUSVBDX05MQV9QUk9QX01BWCArIDFdID0ge307CisKKwltbmxfYXR0cl9wYXJzZShubGgsIHNpemVvZigqZ2VubCksIHBhcnNlX2F0dHJzLCBpbmZvKTsKKwlpZiAoIWluZm9bVElQQ19OTEFfQkVBUkVSXSkKKwkJcmV0dXJuIE1OTF9DQl9FUlJPUjsKKworCW1ubF9hdHRyX3BhcnNlX25lc3RlZChpbmZvW1RJUENfTkxBX0JFQVJFUl0sIHBhcnNlX2F0dHJzLCBhdHRycyk7CisJaWYgKCFhdHRyc1tUSVBDX05MQV9CRUFSRVJfUFJPUF0pCisJCXJldHVybiBNTkxfQ0JfRVJST1I7CisKKwltbmxfYXR0cl9wYXJzZV9uZXN0ZWQoYXR0cnNbVElQQ19OTEFfQkVBUkVSX1BST1BdLCBwYXJzZV9hdHRycywgcHJvcHMpOworCWlmICghcHJvcHNbKnByb3BdKQorCQlyZXR1cm4gTU5MX0NCX0VSUk9SOworCisJcHJpbnRmKCIldVxuIiwgbW5sX2F0dHJfZ2V0X3UzMihwcm9wc1sqcHJvcF0pKTsKKworCXJldHVybiBNTkxfQ0JfT0s7Cit9CisKK3N0YXRpYyBpbnQgY21kX2JlYXJlcl9nZXRfcHJvcChzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgY29uc3Qgc3RydWN0IGNtZCAqY21kLAorCQkJICAgICAgIHN0cnVjdCBjbWRsICpjbWRsLCB2b2lkICpkYXRhKQoreworCWludCBlcnI7CisJaW50IHByb3A7CisJY2hhciAqbWVkaWE7CisJY2hhciBidWZbTU5MX1NPQ0tFVF9CVUZGRVJfU0laRV07CisJc3RydWN0IG5sYXR0ciAqYXR0cnM7CisJc3RydWN0IG9wdCAqb3B0OworCXN0cnVjdCBvcHQgb3B0c1tdID0geworCQl7ICJkZXZpY2UiLAkJTlVMTCB9LAorCQl7ICJtZWRpYSIsCQlOVUxMIH0sCisJCXsgIm5hbWUiLAkJTlVMTCB9LAorCQl7IE5VTEwgfQorCX07CisKKwlpZiAoc3RyY21wKGNtZC0+Y21kLCAicHJpb3JpdHkiKSA9PSAwKQorCQlwcm9wID0gVElQQ19OTEFfUFJPUF9QUklPOworCWVsc2UgaWYgKChzdHJjbXAoY21kLT5jbWQsICJ0b2xlcmFuY2UiKSA9PSAwKSkKKwkJcHJvcCA9IFRJUENfTkxBX1BST1BfVE9MOworCWVsc2UgaWYgKChzdHJjbXAoY21kLT5jbWQsICJ3aW5kb3ciKSA9PSAwKSkKKwkJcHJvcCA9IFRJUENfTkxBX1BST1BfV0lOOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoaGVscF9mbGFnKSB7CisJCShjbWQtPmhlbHApKGNtZGwpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocGFyc2Vfb3B0cyhvcHRzLCBjbWRsKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCEobmxoID0gbXNnX2luaXQoYnVmLCBUSVBDX05MX0JFQVJFUl9HRVQpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yLCBtZXNzYWdlIGluaXRpYWxpc2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoIShvcHQgPSBnZXRfb3B0KG9wdHMsICJtZWRpYSIpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yLCBtaXNzaW5nIG1lZGlhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1lZGlhID0gb3B0LT52YWw7CisKKwlhdHRycyA9IG1ubF9hdHRyX25lc3Rfc3RhcnQobmxoLCBUSVBDX05MQV9CRUFSRVIpOworCWlmIChzdHJjbXAobWVkaWEsICJ1ZHAiKSA9PSAwKSB7CisJCWlmIChoZWxwX2ZsYWcpIHsKKwkJCWNtZF9iZWFyZXJfZ2V0X3VkcF9oZWxwKGNtZGwpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKChlcnIgPSBhZGRfdWRwX2JlYXJlcihubGgsIG9wdHMpKSkKKwkJCXJldHVybiBlcnI7CisJfSBlbHNlIGlmICgoc3RyY21wKG1lZGlhLCAiZXRoIikgPT0gMCkgfHwgKHN0cmNtcChtZWRpYSwgInVkcCIpID09IDApKSB7CisJCWlmIChoZWxwX2ZsYWcpIHsKKwkJCWNtZF9iZWFyZXJfZ2V0X2wyX2hlbHAoY21kbCwgbWVkaWEpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKChlcnIgPSBhZGRfbDJfYmVhcmVyKG5saCwgb3B0cykpKQorCQkJcmV0dXJuIGVycjsKKwl9IGVsc2UgeworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yLCBpbnZhbGlkIG1lZGlhIHR5cGUgXCIlc1wiXG4iLCBtZWRpYSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltbmxfYXR0cl9uZXN0X2VuZChubGgsIGF0dHJzKTsKKworCXJldHVybiBtc2dfZG9pdChubGgsIGJlYXJlcl9nZXRfY2IsICZwcm9wKTsKK30KKworc3RhdGljIGludCBjbWRfYmVhcmVyX2dldChzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgY29uc3Qgc3RydWN0IGNtZCAqY21kLAorCQkJICBzdHJ1Y3QgY21kbCAqY21kbCwgdm9pZCAqZGF0YSkKK3sKKwljb25zdCBzdHJ1Y3QgY21kIGNtZHNbXSA9IHsKKwkJeyAicHJpb3JpdHkiLAljbWRfYmVhcmVyX2dldF9wcm9wLAljbWRfYmVhcmVyX2dldF9oZWxwIH0sCisJCXsgInRvbGVyYW5jZSIsCWNtZF9iZWFyZXJfZ2V0X3Byb3AsCWNtZF9iZWFyZXJfZ2V0X2hlbHAgfSwKKwkJeyAid2luZG93IiwJY21kX2JlYXJlcl9nZXRfcHJvcCwJY21kX2JlYXJlcl9nZXRfaGVscCB9LAorCQl7IE5VTEwgfQorCX07CisKKwlyZXR1cm4gcnVuX2NtZChubGgsIGNtZCwgY21kcywgY21kbCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgYmVhcmVyX2xpc3RfY2IoY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdlbmxtc2doZHIgKmdlbmwgPSBtbmxfbmxtc2dfZ2V0X3BheWxvYWQobmxoKTsKKwlzdHJ1Y3QgbmxhdHRyICppbmZvW1RJUENfTkxBX01BWCArIDFdID0ge307CisJc3RydWN0IG5sYXR0ciAqYXR0cnNbVElQQ19OTEFfQkVBUkVSX01BWCArIDFdID0ge307CisKKwltbmxfYXR0cl9wYXJzZShubGgsIHNpemVvZigqZ2VubCksIHBhcnNlX2F0dHJzLCBpbmZvKTsKKwlpZiAoIWluZm9bVElQQ19OTEFfQkVBUkVSXSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vIGJlYXJlciBpbiBuZXRsaW5rIHJlc3BvbnNlXG4iKTsKKwkJcmV0dXJuIE1OTF9DQl9FUlJPUjsKKwl9CisKKwltbmxfYXR0cl9wYXJzZV9uZXN0ZWQoaW5mb1tUSVBDX05MQV9CRUFSRVJdLCBwYXJzZV9hdHRycywgYXR0cnMpOworCWlmICghYXR0cnNbVElQQ19OTEFfQkVBUkVSX05BTUVdKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQmVhcmVyIG5hbWUgbWlzc2luZyBpbiBuZXRsaW5rIHJlc3BvbnNlXG4iKTsKKwkJcmV0dXJuIE1OTF9DQl9FUlJPUjsKKwl9CisKKwlwcmludGYoIiVzXG4iLCBtbmxfYXR0cl9nZXRfc3RyKGF0dHJzW1RJUENfTkxBX0JFQVJFUl9OQU1FXSkpOworCisJcmV0dXJuIE1OTF9DQl9PSzsKK30KKworc3RhdGljIGludCBjbWRfYmVhcmVyX2xpc3Qoc3RydWN0IG5sbXNnaGRyICpubGgsIGNvbnN0IHN0cnVjdCBjbWQgKmNtZCwKKwkJCSAgIHN0cnVjdCBjbWRsICpjbWRsLCB2b2lkICpkYXRhKQoreworCWNoYXIgYnVmW01OTF9TT0NLRVRfQlVGRkVSX1NJWkVdOworCisJaWYgKGhlbHBfZmxhZykgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBiZWFyZXIgbGlzdFxuIiwgY21kbC0+YXJndlswXSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghKG5saCA9IG1zZ19pbml0KGJ1ZiwgVElQQ19OTF9CRUFSRVJfR0VUKSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvciwgbWVzc2FnZSBpbml0aWFsaXNhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIG1zZ19kdW1waXQobmxoLCBiZWFyZXJfbGlzdF9jYiwgTlVMTCk7Cit9CisKK3ZvaWQgY21kX2JlYXJlcl9oZWxwKHN0cnVjdCBjbWRsICpjbWRsKQoreworCWZwcmludGYoc3RkZXJyLAorCQkiVXNhZ2U6ICVzIGJlYXJlciBDT01NQU5EIFtBUkdTXSAuLi5cbiIKKwkJIlxuIgorCQkiQ09NTUFORFNcbiIKKwkJIiBlbmFibGUgICAgICAgICAgICAgICAgLSBFbmFibGUgYSBiZWFyZXJcbiIKKwkJIiBkaXNhYmxlICAgICAgICAgICAgICAgLSBEaXNhYmxlIGEgYmVhcmVyXG4iCisJCSIgc2V0ICAgICAgICAgICAgICAgICAgIC0gU2V0IHZhcmlvdXMgYmVhcmVyIHByb3BlcnRpZXNcbiIKKwkJIiBnZXQgICAgICAgICAgICAgICAgICAgLSBHZXQgdmFyaW91cyBiZWFyZXIgcHJvcGVydGllc1xuIgorCQkiIGxpc3QgICAgICAgICAgICAgICAgICAtIExpc3QgYmVhcmVyc1xuIiwgY21kbC0+YXJndlswXSk7Cit9CisKK2ludCBjbWRfYmVhcmVyKHN0cnVjdCBubG1zZ2hkciAqbmxoLCBjb25zdCBzdHJ1Y3QgY21kICpjbWQsIHN0cnVjdCBjbWRsICpjbWRsLAorCSAgICAgICB2b2lkICpkYXRhKQoreworCWNvbnN0IHN0cnVjdCBjbWQgY21kc1tdID0geworCQl7ICJkaXNhYmxlIiwJY21kX2JlYXJlcl9kaXNhYmxlLAljbWRfYmVhcmVyX2Rpc2FibGVfaGVscCB9LAorCQl7ICJlbmFibGUiLAljbWRfYmVhcmVyX2VuYWJsZSwJY21kX2JlYXJlcl9lbmFibGVfaGVscCB9LAorCQl7ICJnZXQiLAljbWRfYmVhcmVyX2dldCwJCWNtZF9iZWFyZXJfZ2V0X2hlbHAgfSwKKwkJeyAibGlzdCIsCWNtZF9iZWFyZXJfbGlzdCwJTlVMTCB9LAorCQl7ICJzZXQiLAljbWRfYmVhcmVyX3NldCwJCWNtZF9iZWFyZXJfc2V0X2hlbHAgfSwKKwkJeyBOVUxMIH0KKwl9OworCisJcmV0dXJuIHJ1bl9jbWQobmxoLCBjbWQsIGNtZHMsIGNtZGwsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGlwYy9iZWFyZXIuaCBiL2lwcm91dGUyL3RpcGMvYmVhcmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ1OWQ2NQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RpcGMvYmVhcmVyLmgKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIGJlYXJlci5oCVRJUEMgYmVhcmVyIGZ1bmN0aW9uYWxpdHkuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJUmljaGFyZCBBbHBlIDxyaWNoYXJkLmFscGVAZXJpY3Nzb24uY29tPgorICovCisKKyNpZm5kZWYgX1RJUENfQkVBUkVSX0gKKyNkZWZpbmUgX1RJUENfQkVBUkVSX0gKKworI2luY2x1ZGUgImNtZGwuaCIKKworZXh0ZXJuIGludCBoZWxwX2ZsYWc7CisKK2ludCBjbWRfYmVhcmVyKHN0cnVjdCBubG1zZ2hkciAqbmxoLCBjb25zdCBzdHJ1Y3QgY21kICpjbWQsIHN0cnVjdCBjbWRsICpjbWRsLCB2b2lkICpkYXRhKTsKK3ZvaWQgY21kX2JlYXJlcl9oZWxwKHN0cnVjdCBjbWRsICpjbWRsKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pcHJvdXRlMi90aXBjL2NtZGwuYyBiL2lwcm91dGUyL3RpcGMvY21kbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MTZmN2QKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90aXBjL2NtZGwuYwpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIGNtZGwuYwlGcmFtZXdvcmsgZm9yIGhhbmRsaW5nIGNvbW1hbmQgbGluZSBvcHRpb25zLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CVJpY2hhcmQgQWxwZSA8cmljaGFyZC5hbHBlQGVyaWNzc29uLmNvbT4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8bGlibW5sL2xpYm1ubC5oPgorCisjaW5jbHVkZSAiY21kbC5oIgorCitjb25zdCBzdHJ1Y3QgY21kICpmaW5kX2NtZChjb25zdCBzdHJ1Y3QgY21kICpjbWRzLCBjaGFyICpzdHIpCit7CisJY29uc3Qgc3RydWN0IGNtZCAqYzsKKwljb25zdCBzdHJ1Y3QgY21kICptYXRjaCA9IE5VTEw7CisKKwlmb3IgKGMgPSBjbWRzOyBjLT5jbWQ7IGMrKykgeworCQlpZiAoc3Ryc3RyKGMtPmNtZCwgc3RyKSAhPSBjLT5jbWQpCisJCQljb250aW51ZTsKKwkJaWYgKG1hdGNoKQorCQkJcmV0dXJuIE5VTEw7CisJCW1hdGNoID0gYzsKKwl9CisKKwlyZXR1cm4gbWF0Y2g7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3B0ICpmaW5kX29wdChzdHJ1Y3Qgb3B0ICpvcHRzLCBjaGFyICpzdHIpCit7CisJc3RydWN0IG9wdCAqbzsKKwlzdHJ1Y3Qgb3B0ICptYXRjaCA9IE5VTEw7CisKKwlmb3IgKG8gPSBvcHRzOyBvLT5rZXk7IG8rKykgeworCQlpZiAoc3Ryc3RyKG8tPmtleSwgc3RyKSAhPSBvLT5rZXkpCisJCQljb250aW51ZTsKKwkJaWYgKG1hdGNoKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJbWF0Y2ggPSBvOworCX0KKworCXJldHVybiBtYXRjaDsKK30KKworc3RydWN0IG9wdCAqZ2V0X29wdChzdHJ1Y3Qgb3B0ICpvcHRzLCBjaGFyICprZXkpCit7CisJc3RydWN0IG9wdCAqbzsKKworCWZvciAobyA9IG9wdHM7IG8tPmtleTsgbysrKSB7CisJCWlmIChzdHJjbXAoby0+a2V5LCBrZXkpID09IDAgJiYgby0+dmFsKQorCQkJcmV0dXJuIG87CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK2NoYXIgKnNoaWZ0X2NtZGwoc3RydWN0IGNtZGwgKmNtZGwpCit7CisJaW50IG5leHQ7CisKKwlpZiAoY21kbC0+b3B0aW5kIDwgY21kbC0+YXJnYykKKwkJbmV4dCA9IChjbWRsLT5vcHRpbmQpKys7CisJZWxzZQorCQluZXh0ID0gY21kbC0+YXJnYzsKKworCXJldHVybiBjbWRsLT5hcmd2W25leHRdOworfQorCisvKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygb3B0aW9ucyBwYXJzZWQgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIHVwb24gZmFpbHVyZSAqLworaW50IHBhcnNlX29wdHMoc3RydWN0IG9wdCAqb3B0cywgc3RydWN0IGNtZGwgKmNtZGwpCit7CisJaW50IGk7CisJaW50IGNudCA9IDA7CisKKwlmb3IgKGkgPSBjbWRsLT5vcHRpbmQ7IGkgPCBjbWRsLT5hcmdjOyBpICs9IDIpIHsKKwkJc3RydWN0IG9wdCAqbzsKKworCQlvID0gZmluZF9vcHQob3B0cywgY21kbC0+YXJndltpXSk7CisJCWlmICghbykgeworCQkJZnByaW50ZihzdGRlcnIsICJlcnJvciwgaW52YWxpZCBvcHRpb24gXCIlc1wiXG4iLAorCQkJCQljbWRsLT5hcmd2W2ldKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWNudCsrOworCQlvLT52YWwgPSBjbWRsLT5hcmd2W2kgKyAxXTsKKwkJY21kbC0+b3B0aW5kICs9IDI7CisJfQorCisJcmV0dXJuIGNudDsKK30KKworaW50IHJ1bl9jbWQoc3RydWN0IG5sbXNnaGRyICpubGgsIGNvbnN0IHN0cnVjdCBjbWQgKmNhbGxlciwKKwkgICAgY29uc3Qgc3RydWN0IGNtZCAqY21kcywgc3RydWN0IGNtZGwgKmNtZGwsIHZvaWQgKmRhdGEpCit7CisJY2hhciAqbmFtZTsKKwljb25zdCBzdHJ1Y3QgY21kICpjbWQ7CisKKwlpZiAoKGNtZGwtPm9wdGluZCkgPj0gY21kbC0+YXJnYykgeworCQlpZiAoY2FsbGVyLT5oZWxwKQorCQkJKGNhbGxlci0+aGVscCkoY21kbCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwluYW1lID0gY21kbC0+YXJndltjbWRsLT5vcHRpbmRdOworCShjbWRsLT5vcHRpbmQpKys7CisKKwljbWQgPSBmaW5kX2NtZChjbWRzLCBuYW1lKTsKKwlpZiAoIWNtZCkgeworCQkvKiBTaG93IGhlbHAgYWJvdXQgbGFzdCBjb21tYW5kIGlmIHdlIGRvbid0IGZpbmQgdGhpcyBvbmUgKi8KKwkJaWYgKGhlbHBfZmxhZyAmJiBjYWxsZXItPmhlbHApIHsKKwkJCShjYWxsZXItPmhlbHApKGNtZGwpOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJlcnJvciwgaW52YWxpZCBjb21tYW5kIFwiJXNcIlxuIiwgbmFtZSk7CisJCQlmcHJpbnRmKHN0ZGVyciwgInVzZSAtLWhlbHAgZm9yIGNvbW1hbmQgaGVscFxuIik7CisJCX0KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIChjbWQtPmZ1bmMpKG5saCwgY21kLCBjbWRsLCBkYXRhKTsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RpcGMvY21kbC5oIGIvaXByb3V0ZTIvdGlwYy9jbWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYyNjY2ZgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RpcGMvY21kbC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBjbWRsLmgJRnJhbWV3b3JrIGZvciBoYW5kbGluZyBjb21tYW5kIGxpbmUgb3B0aW9ucy4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglSaWNoYXJkIEFscGUgPHJpY2hhcmQuYWxwZUBlcmljc3Nvbi5jb20+CisgKi8KKworI2lmbmRlZiBfVElQQ19DTURMX0gKKyNkZWZpbmUgX1RJUENfQ01ETF9ICisKKyNpbmNsdWRlIDxsaWJtbmwvbGlibW5sLmg+CisKK2V4dGVybiBpbnQgaGVscF9mbGFnOworCitzdHJ1Y3QgY21kbCB7CisJaW50IG9wdGluZDsKKwlpbnQgYXJnYzsKKwljaGFyICoqYXJndjsKK307CisKK3N0cnVjdCBjbWQgeworCWNvbnN0IGNoYXIgKmNtZDsKKwlpbnQgKCpmdW5jKShzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgY29uc3Qgc3RydWN0IGNtZCAqY21kLAorCQkgICAgc3RydWN0IGNtZGwgKmNtZGwsIHZvaWQgKmRhdGEpOworCXZvaWQgKCpoZWxwKShzdHJ1Y3QgY21kbCAqY21kbCk7Cit9OworCitzdHJ1Y3Qgb3B0IHsKKwljb25zdCBjaGFyICprZXk7CisJY2hhciAqdmFsOworfTsKKworc3RydWN0IG9wdCAqZ2V0X29wdChzdHJ1Y3Qgb3B0ICpvcHRzLCBjaGFyICprZXkpOworaW50IHBhcnNlX29wdHMoc3RydWN0IG9wdCAqb3B0cywgc3RydWN0IGNtZGwgKmNtZGwpOworY2hhciAqc2hpZnRfY21kbChzdHJ1Y3QgY21kbCAqY21kbCk7CisKK2ludCBydW5fY21kKHN0cnVjdCBubG1zZ2hkciAqbmxoLCBjb25zdCBzdHJ1Y3QgY21kICpjYWxsZXIsCisJICAgIGNvbnN0IHN0cnVjdCBjbWQgKmNtZHMsIHN0cnVjdCBjbWRsICpjbWRsLCB2b2lkICpkYXRhKTsKKworY29uc3Qgc3RydWN0IGNtZCAqZmluZF9jbWQoY29uc3Qgc3RydWN0IGNtZCAqY21kcywgY2hhciAqc3RyKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pcHJvdXRlMi90aXBjL2xpbmsuYyBiL2lwcm91dGUyL3RpcGMvbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZmI0ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90aXBjL2xpbmsuYwpAQCAtMCwwICsxLDUyMCBAQAorLyoKKyAqIGxpbmsuYwlUSVBDIGxpbmsgZnVuY3Rpb25hbGl0eS4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglSaWNoYXJkIEFscGUgPHJpY2hhcmQuYWxwZUBlcmljc3Nvbi5jb20+CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPGxpbnV4L3RpcGNfbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3RpcGMuaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaWJtbmwvbGlibW5sLmg+CisKKyNpbmNsdWRlICJjbWRsLmgiCisjaW5jbHVkZSAibXNnLmgiCisjaW5jbHVkZSAibGluay5oIgorCitzdGF0aWMgaW50IGxpbmtfbGlzdF9jYihjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ2VubG1zZ2hkciAqZ2VubCA9IG1ubF9ubG1zZ19nZXRfcGF5bG9hZChubGgpOworCXN0cnVjdCBubGF0dHIgKmluZm9bVElQQ19OTEFfTUFYICsgMV0gPSB7fTsKKwlzdHJ1Y3QgbmxhdHRyICphdHRyc1tUSVBDX05MQV9MSU5LX01BWCArIDFdID0ge307CisKKwltbmxfYXR0cl9wYXJzZShubGgsIHNpemVvZigqZ2VubCksIHBhcnNlX2F0dHJzLCBpbmZvKTsKKwlpZiAoIWluZm9bVElQQ19OTEFfTElOS10pCisJCXJldHVybiBNTkxfQ0JfRVJST1I7CisKKwltbmxfYXR0cl9wYXJzZV9uZXN0ZWQoaW5mb1tUSVBDX05MQV9MSU5LXSwgcGFyc2VfYXR0cnMsIGF0dHJzKTsKKwlpZiAoIWF0dHJzW1RJUENfTkxBX0xJTktfTkFNRV0pCisJCXJldHVybiBNTkxfQ0JfRVJST1I7CisKKwlwcmludGYoIiVzOiAiLCBtbmxfYXR0cl9nZXRfc3RyKGF0dHJzW1RJUENfTkxBX0xJTktfTkFNRV0pKTsKKworCWlmIChhdHRyc1tUSVBDX05MQV9MSU5LX1VQXSkKKwkJcHJpbnRmKCJ1cFxuIik7CisJZWxzZQorCQlwcmludGYoImRvd25cbiIpOworCisJcmV0dXJuIE1OTF9DQl9PSzsKK30KKworc3RhdGljIGludCBjbWRfbGlua19saXN0KHN0cnVjdCBubG1zZ2hkciAqbmxoLCBjb25zdCBzdHJ1Y3QgY21kICpjbWQsCisJCQkgc3RydWN0IGNtZGwgKmNtZGwsIHZvaWQgKmRhdGEpCit7CisJY2hhciBidWZbTU5MX1NPQ0tFVF9CVUZGRVJfU0laRV07CisKKwlpZiAoaGVscF9mbGFnKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIGxpbmsgbGlzdFxuIiwgY21kbC0+YXJndlswXSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghKG5saCA9IG1zZ19pbml0KGJ1ZiwgVElQQ19OTF9MSU5LX0dFVCkpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3IsIG1lc3NhZ2UgaW5pdGlhbGlzYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiBtc2dfZHVtcGl0KG5saCwgbGlua19saXN0X2NiLCBOVUxMKTsKK30KKworc3RhdGljIGludCBsaW5rX2dldF9jYihjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgKnByb3AgPSBkYXRhOworCXN0cnVjdCBnZW5sbXNnaGRyICpnZW5sID0gbW5sX25sbXNnX2dldF9wYXlsb2FkKG5saCk7CisJc3RydWN0IG5sYXR0ciAqaW5mb1tUSVBDX05MQV9NQVggKyAxXSA9IHt9OworCXN0cnVjdCBubGF0dHIgKmF0dHJzW1RJUENfTkxBX0xJTktfTUFYICsgMV0gPSB7fTsKKwlzdHJ1Y3QgbmxhdHRyICpwcm9wc1tUSVBDX05MQV9QUk9QX01BWCArIDFdID0ge307CisKKwltbmxfYXR0cl9wYXJzZShubGgsIHNpemVvZigqZ2VubCksIHBhcnNlX2F0dHJzLCBpbmZvKTsKKwlpZiAoIWluZm9bVElQQ19OTEFfTElOS10pCisJCXJldHVybiBNTkxfQ0JfRVJST1I7CisKKwltbmxfYXR0cl9wYXJzZV9uZXN0ZWQoaW5mb1tUSVBDX05MQV9MSU5LXSwgcGFyc2VfYXR0cnMsIGF0dHJzKTsKKwlpZiAoIWF0dHJzW1RJUENfTkxBX0xJTktfUFJPUF0pCisJCXJldHVybiBNTkxfQ0JfRVJST1I7CisKKwltbmxfYXR0cl9wYXJzZV9uZXN0ZWQoYXR0cnNbVElQQ19OTEFfTElOS19QUk9QXSwgcGFyc2VfYXR0cnMsIHByb3BzKTsKKwlpZiAoIXByb3BzWypwcm9wXSkKKwkJcmV0dXJuIE1OTF9DQl9FUlJPUjsKKworCXByaW50ZigiJXVcbiIsIG1ubF9hdHRyX2dldF91MzIocHJvcHNbKnByb3BdKSk7CisKKwlyZXR1cm4gTU5MX0NCX09LOworfQorCisKK3N0YXRpYyBpbnQgY21kX2xpbmtfZ2V0X3Byb3Aoc3RydWN0IG5sbXNnaGRyICpubGgsIGNvbnN0IHN0cnVjdCBjbWQgKmNtZCwKKwkJCSAgICAgc3RydWN0IGNtZGwgKmNtZGwsIHZvaWQgKmRhdGEpCit7CisJaW50IHByb3A7CisJY2hhciBidWZbTU5MX1NPQ0tFVF9CVUZGRVJfU0laRV07CisJc3RydWN0IG9wdCAqb3B0OworCXN0cnVjdCBvcHQgb3B0c1tdID0geworCQl7ICJsaW5rIiwJCU5VTEwgfSwKKwkJeyBOVUxMIH0KKwl9OworCisJaWYgKHN0cmNtcChjbWQtPmNtZCwgInByaW9yaXR5IikgPT0gMCkKKwkJcHJvcCA9IFRJUENfTkxBX1BST1BfUFJJTzsKKwllbHNlIGlmICgoc3RyY21wKGNtZC0+Y21kLCAidG9sZXJhbmNlIikgPT0gMCkpCisJCXByb3AgPSBUSVBDX05MQV9QUk9QX1RPTDsKKwllbHNlIGlmICgoc3RyY21wKGNtZC0+Y21kLCAid2luZG93IikgPT0gMCkpCisJCXByb3AgPSBUSVBDX05MQV9QUk9QX1dJTjsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGhlbHBfZmxhZykgeworCQkoY21kLT5oZWxwKShjbWRsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHBhcnNlX29wdHMob3B0cywgY21kbCkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghKG5saCA9IG1zZ19pbml0KGJ1ZiwgVElQQ19OTF9MSU5LX0dFVCkpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3IsIG1lc3NhZ2UgaW5pdGlhbGlzYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICghKG9wdCA9IGdldF9vcHQob3B0cywgImxpbmsiKSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvciwgbWlzc2luZyBsaW5rXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1ubF9hdHRyX3B1dF9zdHJ6KG5saCwgVElQQ19OTEFfTElOS19OQU1FLCBvcHQtPnZhbCk7CisKKwlyZXR1cm4gbXNnX2RvaXQobmxoLCBsaW5rX2dldF9jYiwgJnByb3ApOworfQorCitzdGF0aWMgdm9pZCBjbWRfbGlua19nZXRfaGVscChzdHJ1Y3QgY21kbCAqY21kbCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBsaW5rIGdldCBQUFJPUEVSVFkgbGluayBMSU5LXG5cbiIKKwkJIlBST1BFUlRJRVNcbiIKKwkJIiB0b2xlcmFuY2UgICAgICAgICAgICAgLSBHZXQgbGluayB0b2xlcmFuY2VcbiIKKwkJIiBwcmlvcml0eSAgICAgICAgICAgICAgLSBHZXQgbGluayBwcmlvcml0eVxuIgorCQkiIHdpbmRvdyAgICAgICAgICAgICAgICAtIEdldCBsaW5rIHdpbmRvd1xuIiwKKwkJY21kbC0+YXJndlswXSk7Cit9CisKK3N0YXRpYyBpbnQgY21kX2xpbmtfZ2V0KHN0cnVjdCBubG1zZ2hkciAqbmxoLCBjb25zdCBzdHJ1Y3QgY21kICpjbWQsCisJCQlzdHJ1Y3QgY21kbCAqY21kbCwgdm9pZCAqZGF0YSkKK3sKKwljb25zdCBzdHJ1Y3QgY21kIGNtZHNbXSA9IHsKKwkJeyAicHJpb3JpdHkiLAljbWRfbGlua19nZXRfcHJvcCwJY21kX2xpbmtfZ2V0X2hlbHAgfSwKKwkJeyAidG9sZXJhbmNlIiwJY21kX2xpbmtfZ2V0X3Byb3AsCWNtZF9saW5rX2dldF9oZWxwIH0sCisJCXsgIndpbmRvdyIsCWNtZF9saW5rX2dldF9wcm9wLAljbWRfbGlua19nZXRfaGVscCB9LAorCQl7IE5VTEwgfQorCX07CisKKwlyZXR1cm4gcnVuX2NtZChubGgsIGNtZCwgY21kcywgY21kbCwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGNtZF9saW5rX3N0YXRfcmVzZXRfaGVscChzdHJ1Y3QgY21kbCAqY21kbCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBsaW5rIHN0YXQgcmVzZXQgbGluayBMSU5LXG5cbiIsIGNtZGwtPmFyZ3ZbMF0pOworfQorCitzdGF0aWMgaW50IGNtZF9saW5rX3N0YXRfcmVzZXQoc3RydWN0IG5sbXNnaGRyICpubGgsIGNvbnN0IHN0cnVjdCBjbWQgKmNtZCwKKwkJCSAgICAgICBzdHJ1Y3QgY21kbCAqY21kbCwgdm9pZCAqZGF0YSkKK3sKKwljaGFyICpsaW5rOworCWNoYXIgYnVmW01OTF9TT0NLRVRfQlVGRkVSX1NJWkVdOworCXN0cnVjdCBvcHQgKm9wdDsKKwlzdHJ1Y3QgbmxhdHRyICpuZXN0OworCXN0cnVjdCBvcHQgb3B0c1tdID0geworCQl7ICJsaW5rIiwJCU5VTEwgfSwKKwkJeyBOVUxMIH0KKwl9OworCisJaWYgKGhlbHBfZmxhZykgeworCQkoY21kLT5oZWxwKShjbWRsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHBhcnNlX29wdHMob3B0cywgY21kbCkgIT0gMSkgeworCQkoY21kLT5oZWxwKShjbWRsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCEobmxoID0gbXNnX2luaXQoYnVmLCBUSVBDX05MX0xJTktfUkVTRVRfU1RBVFMpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yLCBtZXNzYWdlIGluaXRpYWxpc2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoIShvcHQgPSBnZXRfb3B0KG9wdHMsICJsaW5rIikpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3IsIG1pc3NpbmcgbGlua1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlsaW5rID0gb3B0LT52YWw7CisKKwluZXN0ID0gbW5sX2F0dHJfbmVzdF9zdGFydChubGgsIFRJUENfTkxBX0xJTkspOworCW1ubF9hdHRyX3B1dF9zdHJ6KG5saCwgVElQQ19OTEFfTElOS19OQU1FLCBsaW5rKTsKKwltbmxfYXR0cl9uZXN0X2VuZChubGgsIG5lc3QpOworCisJcmV0dXJuIG1zZ19kb2l0KG5saCwgTlVMTCwgTlVMTCk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBwZXJjKHVpbnQzMl90IGNvdW50LCB1aW50MzJfdCB0b3RhbCkKK3sKKwlyZXR1cm4gKGNvdW50ICogMTAwICsgKHRvdGFsIC8gMikpIC8gdG90YWw7Cit9CisKK3N0YXRpYyBpbnQgX3Nob3dfbGlua19zdGF0KHN0cnVjdCBubGF0dHIgKmF0dHJzW10sIHN0cnVjdCBubGF0dHIgKnByb3BbXSwKKwkJCSAgIHN0cnVjdCBubGF0dHIgKnN0YXRzW10pCit7CisJdWludDMyX3QgcHJvZnQ7CisKKwlpZiAoYXR0cnNbVElQQ19OTEFfTElOS19BQ1RJVkVdKQorCQlwcmludGYoIiAgQUNUSVZFIik7CisJZWxzZSBpZiAoYXR0cnNbVElQQ19OTEFfTElOS19VUF0pCisJCXByaW50ZigiICBTVEFOREJZIik7CisJZWxzZQorCQlwcmludGYoIiAgREVGVU5DVCIpOworCisJcHJpbnRmKCIgIE1UVToldSAgUHJpb3JpdHk6JXUgIFRvbGVyYW5jZToldSBtcyAgV2luZG93OiV1IHBhY2tldHNcbiIsCisJICAgICAgIG1ubF9hdHRyX2dldF91MzIoYXR0cnNbVElQQ19OTEFfTElOS19NVFVdKSwKKwkgICAgICAgbW5sX2F0dHJfZ2V0X3UzMihwcm9wW1RJUENfTkxBX1BST1BfUFJJT10pLAorCSAgICAgICBtbmxfYXR0cl9nZXRfdTMyKHByb3BbVElQQ19OTEFfUFJPUF9UT0xdKSwKKwkgICAgICAgbW5sX2F0dHJfZ2V0X3UzMihwcm9wW1RJUENfTkxBX1BST1BfV0lOXSkpOworCisJcHJpbnRmKCIgIFJYIHBhY2tldHM6JXUgZnJhZ21lbnRzOiV1LyV1IGJ1bmRsZXM6JXUvJXVcbiIsCisJICAgICAgIG1ubF9hdHRyX2dldF91MzIoYXR0cnNbVElQQ19OTEFfTElOS19SWF0pIC0KKwkgICAgICAgbW5sX2F0dHJfZ2V0X3UzMihzdGF0c1tUSVBDX05MQV9TVEFUU19SWF9JTkZPXSksCisJICAgICAgIG1ubF9hdHRyX2dldF91MzIoc3RhdHNbVElQQ19OTEFfU1RBVFNfUlhfRlJBR01FTlRTXSksCisJICAgICAgIG1ubF9hdHRyX2dldF91MzIoc3RhdHNbVElQQ19OTEFfU1RBVFNfUlhfRlJBR01FTlRFRF0pLAorCSAgICAgICBtbmxfYXR0cl9nZXRfdTMyKHN0YXRzW1RJUENfTkxBX1NUQVRTX1JYX0JVTkRMRVNdKSwKKwkgICAgICAgbW5sX2F0dHJfZ2V0X3UzMihzdGF0c1tUSVBDX05MQV9TVEFUU19SWF9CVU5ETEVEXSkpOworCisJcHJpbnRmKCIgIFRYIHBhY2tldHM6JXUgZnJhZ21lbnRzOiV1LyV1IGJ1bmRsZXM6JXUvJXVcbiIsCisJICAgICAgIG1ubF9hdHRyX2dldF91MzIoYXR0cnNbVElQQ19OTEFfTElOS19UWF0pIC0KKwkgICAgICAgbW5sX2F0dHJfZ2V0X3UzMihzdGF0c1tUSVBDX05MQV9TVEFUU19UWF9JTkZPXSksCisJICAgICAgIG1ubF9hdHRyX2dldF91MzIoc3RhdHNbVElQQ19OTEFfU1RBVFNfVFhfRlJBR01FTlRTXSksCisJICAgICAgIG1ubF9hdHRyX2dldF91MzIoc3RhdHNbVElQQ19OTEFfU1RBVFNfVFhfRlJBR01FTlRFRF0pLAorCSAgICAgICBtbmxfYXR0cl9nZXRfdTMyKHN0YXRzW1RJUENfTkxBX1NUQVRTX1RYX0JVTkRMRVNdKSwKKwkgICAgICAgbW5sX2F0dHJfZ2V0X3UzMihzdGF0c1tUSVBDX05MQV9TVEFUU19UWF9CVU5ETEVEXSkpOworCisJcHJvZnQgPSBtbmxfYXR0cl9nZXRfdTMyKHN0YXRzW1RJUENfTkxBX1NUQVRTX01TR19QUk9GX1RPVF0pOworCXByaW50ZigiICBUWCBwcm9maWxlIHNhbXBsZToldSBwYWNrZXRzICBhdmVyYWdlOiV1IG9jdGV0c1xuIiwKKwkgICAgICAgbW5sX2F0dHJfZ2V0X3UzMihzdGF0c1tUSVBDX05MQV9TVEFUU19NU0dfTEVOX0NOVF0pLAorCSAgICAgICBtbmxfYXR0cl9nZXRfdTMyKHN0YXRzW1RJUENfTkxBX1NUQVRTX01TR19MRU5fVE9UXSkgLyBwcm9mdCk7CisKKwlwcmludGYoIiAgMC02NDoldSUlIC0yNTY6JXUlJSAtMTAyNDoldSUlIC00MDk2OiV1JSUgIgorCSAgICAgICAiLTE2Mzg0OiV1JSUgLTMyNzY4OiV1JSUgLTY2MDAwOiV1JSVcbiIsCisJICAgICAgIHBlcmMobW5sX2F0dHJfZ2V0X3UzMihzdGF0c1tUSVBDX05MQV9TVEFUU19NU0dfTEVOX1AwXSksIHByb2Z0KSwKKwkgICAgICAgcGVyYyhtbmxfYXR0cl9nZXRfdTMyKHN0YXRzW1RJUENfTkxBX1NUQVRTX01TR19MRU5fUDFdKSwgcHJvZnQpLAorCSAgICAgICBwZXJjKG1ubF9hdHRyX2dldF91MzIoc3RhdHNbVElQQ19OTEFfU1RBVFNfTVNHX0xFTl9QMl0pLCBwcm9mdCksCisJICAgICAgIHBlcmMobW5sX2F0dHJfZ2V0X3UzMihzdGF0c1tUSVBDX05MQV9TVEFUU19NU0dfTEVOX1AzXSksIHByb2Z0KSwKKwkgICAgICAgcGVyYyhtbmxfYXR0cl9nZXRfdTMyKHN0YXRzW1RJUENfTkxBX1NUQVRTX01TR19MRU5fUDRdKSwgcHJvZnQpLAorCSAgICAgICBwZXJjKG1ubF9hdHRyX2dldF91MzIoc3RhdHNbVElQQ19OTEFfU1RBVFNfTVNHX0xFTl9QNV0pLCBwcm9mdCksCisJICAgICAgIHBlcmMobW5sX2F0dHJfZ2V0X3UzMihzdGF0c1tUSVBDX05MQV9TVEFUU19NU0dfTEVOX1A2XSksIHByb2Z0KSk7CisKKwlwcmludGYoIiAgUlggc3RhdGVzOiV1IHByb2JlczoldSBuYWtzOiV1IGRlZnM6JXUgZHVwczoldVxuIiwKKwkgICAgICAgbW5sX2F0dHJfZ2V0X3UzMihzdGF0c1tUSVBDX05MQV9TVEFUU19SWF9TVEFURVNdKSwKKwkgICAgICAgbW5sX2F0dHJfZ2V0X3UzMihzdGF0c1tUSVBDX05MQV9TVEFUU19SWF9QUk9CRVNdKSwKKwkgICAgICAgbW5sX2F0dHJfZ2V0X3UzMihzdGF0c1tUSVBDX05MQV9TVEFUU19SWF9OQUNLU10pLAorCSAgICAgICBtbmxfYXR0cl9nZXRfdTMyKHN0YXRzW1RJUENfTkxBX1NUQVRTX1JYX0RFRkVSUkVEXSksCisJICAgICAgIG1ubF9hdHRyX2dldF91MzIoc3RhdHNbVElQQ19OTEFfU1RBVFNfRFVQTElDQVRFU10pKTsKKworCXByaW50ZigiICBUWCBzdGF0ZXM6JXUgcHJvYmVzOiV1IG5ha3M6JXUgYWNrczoldSBkdXBzOiV1XG4iLAorCSAgICAgICBtbmxfYXR0cl9nZXRfdTMyKHN0YXRzW1RJUENfTkxBX1NUQVRTX1RYX1NUQVRFU10pLAorCSAgICAgICBtbmxfYXR0cl9nZXRfdTMyKHN0YXRzW1RJUENfTkxBX1NUQVRTX1RYX1BST0JFU10pLAorCSAgICAgICBtbmxfYXR0cl9nZXRfdTMyKHN0YXRzW1RJUENfTkxBX1NUQVRTX1RYX05BQ0tTXSksCisJICAgICAgIG1ubF9hdHRyX2dldF91MzIoc3RhdHNbVElQQ19OTEFfU1RBVFNfVFhfQUNLU10pLAorCSAgICAgICBtbmxfYXR0cl9nZXRfdTMyKHN0YXRzW1RJUENfTkxBX1NUQVRTX1JFVFJBTlNNSVRURURdKSk7CisKKwlwcmludGYoIiAgQ29uZ2VzdGlvbiBsaW5rOiV1ICBTZW5kIHF1ZXVlIG1heDoldSBhdmc6JXVcbiIsCisJICAgICAgIG1ubF9hdHRyX2dldF91MzIoc3RhdHNbVElQQ19OTEFfU1RBVFNfTElOS19DT05HU10pLAorCSAgICAgICBtbmxfYXR0cl9nZXRfdTMyKHN0YXRzW1RJUENfTkxBX1NUQVRTX01BWF9RVUVVRV0pLAorCSAgICAgICBtbmxfYXR0cl9nZXRfdTMyKHN0YXRzW1RJUENfTkxBX1NUQVRTX0FWR19RVUVVRV0pKTsKKworCXJldHVybiBNTkxfQ0JfT0s7Cit9CisKK3N0YXRpYyBpbnQgX3Nob3dfYmNfbGlua19zdGF0KHN0cnVjdCBubGF0dHIgKnByb3BbXSwgc3RydWN0IG5sYXR0ciAqc3RhdHNbXSkKK3sKKwlwcmludGYoIiAgV2luZG93OiV1IHBhY2tldHNcbiIsCisJICAgICAgIG1ubF9hdHRyX2dldF91MzIocHJvcFtUSVBDX05MQV9QUk9QX1dJTl0pKTsKKworCXByaW50ZigiICBSWCBwYWNrZXRzOiV1IGZyYWdtZW50czoldS8ldSBidW5kbGVzOiV1LyV1XG4iLAorCSAgICAgICBtbmxfYXR0cl9nZXRfdTMyKHN0YXRzW1RJUENfTkxBX1NUQVRTX1JYX0lORk9dKSwKKwkgICAgICAgbW5sX2F0dHJfZ2V0X3UzMihzdGF0c1tUSVBDX05MQV9TVEFUU19SWF9GUkFHTUVOVFNdKSwKKwkgICAgICAgbW5sX2F0dHJfZ2V0X3UzMihzdGF0c1tUSVBDX05MQV9TVEFUU19SWF9GUkFHTUVOVEVEXSksCisJICAgICAgIG1ubF9hdHRyX2dldF91MzIoc3RhdHNbVElQQ19OTEFfU1RBVFNfUlhfQlVORExFU10pLAorCSAgICAgICBtbmxfYXR0cl9nZXRfdTMyKHN0YXRzW1RJUENfTkxBX1NUQVRTX1JYX0JVTkRMRURdKSk7CisKKwlwcmludGYoIiAgVFggcGFja2V0czoldSBmcmFnbWVudHM6JXUvJXUgYnVuZGxlczoldS8ldVxuIiwKKwkgICAgICAgbW5sX2F0dHJfZ2V0X3UzMihzdGF0c1tUSVBDX05MQV9TVEFUU19UWF9JTkZPXSksCisJICAgICAgIG1ubF9hdHRyX2dldF91MzIoc3RhdHNbVElQQ19OTEFfU1RBVFNfVFhfRlJBR01FTlRTXSksCisJICAgICAgIG1ubF9hdHRyX2dldF91MzIoc3RhdHNbVElQQ19OTEFfU1RBVFNfVFhfRlJBR01FTlRFRF0pLAorCSAgICAgICBtbmxfYXR0cl9nZXRfdTMyKHN0YXRzW1RJUENfTkxBX1NUQVRTX1RYX0JVTkRMRVNdKSwKKwkgICAgICAgbW5sX2F0dHJfZ2V0X3UzMihzdGF0c1tUSVBDX05MQV9TVEFUU19UWF9CVU5ETEVEXSkpOworCisJcHJpbnRmKCIgIFJYIG5ha3M6JXUgZGVmczoldSBkdXBzOiV1XG4iLAorCSAgICAgICBtbmxfYXR0cl9nZXRfdTMyKHN0YXRzW1RJUENfTkxBX1NUQVRTX1JYX05BQ0tTXSksCisJICAgICAgIG1ubF9hdHRyX2dldF91MzIoc3RhdHNbVElQQ19OTEFfU1RBVFNfUlhfREVGRVJSRURdKSwKKwkgICAgICAgbW5sX2F0dHJfZ2V0X3UzMihzdGF0c1tUSVBDX05MQV9TVEFUU19EVVBMSUNBVEVTXSkpOworCisJcHJpbnRmKCIgIFRYIG5ha3M6JXUgYWNrczoldSBkdXBzOiV1XG4iLAorCSAgICAgICBtbmxfYXR0cl9nZXRfdTMyKHN0YXRzW1RJUENfTkxBX1NUQVRTX1RYX05BQ0tTXSksCisJICAgICAgIG1ubF9hdHRyX2dldF91MzIoc3RhdHNbVElQQ19OTEFfU1RBVFNfVFhfQUNLU10pLAorCSAgICAgICBtbmxfYXR0cl9nZXRfdTMyKHN0YXRzW1RJUENfTkxBX1NUQVRTX1JFVFJBTlNNSVRURURdKSk7CisKKwlwcmludGYoIiAgQ29uZ2VzdGlvbiBsaW5rOiV1ICBTZW5kIHF1ZXVlIG1heDoldSBhdmc6JXVcbiIsCisJICAgICAgIG1ubF9hdHRyX2dldF91MzIoc3RhdHNbVElQQ19OTEFfU1RBVFNfTElOS19DT05HU10pLAorCSAgICAgICBtbmxfYXR0cl9nZXRfdTMyKHN0YXRzW1RJUENfTkxBX1NUQVRTX01BWF9RVUVVRV0pLAorCSAgICAgICBtbmxfYXR0cl9nZXRfdTMyKHN0YXRzW1RJUENfTkxBX1NUQVRTX0FWR19RVUVVRV0pKTsKKworCXJldHVybiBNTkxfQ0JfT0s7Cit9CisKK3N0YXRpYyBpbnQgbGlua19zdGF0X3Nob3dfY2IoY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKmRhdGEpCit7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpsaW5rID0gZGF0YTsKKwlzdHJ1Y3QgZ2VubG1zZ2hkciAqZ2VubCA9IG1ubF9ubG1zZ19nZXRfcGF5bG9hZChubGgpOworCXN0cnVjdCBubGF0dHIgKmluZm9bVElQQ19OTEFfTUFYICsgMV0gPSB7fTsKKwlzdHJ1Y3QgbmxhdHRyICphdHRyc1tUSVBDX05MQV9MSU5LX01BWCArIDFdID0ge307CisJc3RydWN0IG5sYXR0ciAqcHJvcFtUSVBDX05MQV9QUk9QX01BWCArIDFdID0ge307CisJc3RydWN0IG5sYXR0ciAqc3RhdHNbVElQQ19OTEFfU1RBVFNfTUFYICsgMV0gPSB7fTsKKworCW1ubF9hdHRyX3BhcnNlKG5saCwgc2l6ZW9mKCpnZW5sKSwgcGFyc2VfYXR0cnMsIGluZm8pOworCWlmICghaW5mb1tUSVBDX05MQV9MSU5LXSkKKwkJcmV0dXJuIE1OTF9DQl9FUlJPUjsKKworCW1ubF9hdHRyX3BhcnNlX25lc3RlZChpbmZvW1RJUENfTkxBX0xJTktdLCBwYXJzZV9hdHRycywgYXR0cnMpOworCWlmICghYXR0cnNbVElQQ19OTEFfTElOS19OQU1FXSB8fCAhYXR0cnNbVElQQ19OTEFfTElOS19QUk9QXSB8fAorCSAgICAhYXR0cnNbVElQQ19OTEFfTElOS19TVEFUU10pCisJCXJldHVybiBNTkxfQ0JfRVJST1I7CisKKwltbmxfYXR0cl9wYXJzZV9uZXN0ZWQoYXR0cnNbVElQQ19OTEFfTElOS19QUk9QXSwgcGFyc2VfYXR0cnMsIHByb3ApOworCW1ubF9hdHRyX3BhcnNlX25lc3RlZChhdHRyc1tUSVBDX05MQV9MSU5LX1NUQVRTXSwgcGFyc2VfYXR0cnMsIHN0YXRzKTsKKworCW5hbWUgPSBtbmxfYXR0cl9nZXRfc3RyKGF0dHJzW1RJUENfTkxBX0xJTktfTkFNRV0pOworCisJLyogSWYgYSBsaW5rIGlzIHBhc3NlZCwgc2tpcCBhbGwgYnV0IHRoYXQgbGluayAqLworCWlmIChsaW5rICYmIChzdHJjbXAobmFtZSwgbGluaykgIT0gMCkpCisJCXJldHVybiBNTkxfQ0JfT0s7CisKKwlpZiAoYXR0cnNbVElQQ19OTEFfTElOS19CUk9BRENBU1RdKSB7CisJCXByaW50ZigiTGluayA8JXM+XG4iLCBuYW1lKTsKKwkJcmV0dXJuIF9zaG93X2JjX2xpbmtfc3RhdChwcm9wLCBzdGF0cyk7CisJfQorCisJcHJpbnRmKCJcbkxpbmsgPCVzPlxuIiwgbmFtZSk7CisKKwlyZXR1cm4gX3Nob3dfbGlua19zdGF0KGF0dHJzLCBwcm9wLCBzdGF0cyk7Cit9CisKK3N0YXRpYyB2b2lkIGNtZF9saW5rX3N0YXRfc2hvd19oZWxwKHN0cnVjdCBjbWRsICpjbWRsKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIGxpbmsgc3RhdCBzaG93IFsgbGluayBMSU5LIF1cbiIsCisJCWNtZGwtPmFyZ3ZbMF0pOworfQorCitzdGF0aWMgaW50IGNtZF9saW5rX3N0YXRfc2hvdyhzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgY29uc3Qgc3RydWN0IGNtZCAqY21kLAorCQkJICAgICAgc3RydWN0IGNtZGwgKmNtZGwsIHZvaWQgKmRhdGEpCit7CisJY2hhciAqbGluayA9IE5VTEw7CisJY2hhciBidWZbTU5MX1NPQ0tFVF9CVUZGRVJfU0laRV07CisJc3RydWN0IG9wdCAqb3B0OworCXN0cnVjdCBvcHQgb3B0c1tdID0geworCQl7ICJsaW5rIiwJCU5VTEwgfSwKKwkJeyBOVUxMIH0KKwl9OworCisJaWYgKGhlbHBfZmxhZykgeworCQkoY21kLT5oZWxwKShjbWRsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCEobmxoID0gbXNnX2luaXQoYnVmLCBUSVBDX05MX0xJTktfR0VUKSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvciwgbWVzc2FnZSBpbml0aWFsaXNhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHBhcnNlX29wdHMob3B0cywgY21kbCkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgob3B0ID0gZ2V0X29wdChvcHRzLCAibGluayIpKSkKKwkJbGluayA9IG9wdC0+dmFsOworCisJcmV0dXJuIG1zZ19kdW1waXQobmxoLCBsaW5rX3N0YXRfc2hvd19jYiwgbGluayk7Cit9CisKK3N0YXRpYyB2b2lkIGNtZF9saW5rX3N0YXRfaGVscChzdHJ1Y3QgY21kbCAqY21kbCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBsaW5rIHN0YXQgQ09NTUFORCBbQVJHU11cblxuIgorCQkiQ09NTUFORFM6XG4iCisJCSIgcmVzZXQgICAgICAgICAgICAgICAgIC0gUmVzZXQgbGluayBzdGF0aXN0aWNzIGZvciBsaW5rXG4iCisJCSIgc2hvdyAgICAgICAgICAgICAgICAgIC0gR2V0IGxpbmsgcHJpb3JpdHlcbiIsCisJCWNtZGwtPmFyZ3ZbMF0pOworfQorCitzdGF0aWMgaW50IGNtZF9saW5rX3N0YXQoc3RydWN0IG5sbXNnaGRyICpubGgsIGNvbnN0IHN0cnVjdCBjbWQgKmNtZCwKKwkJCSBzdHJ1Y3QgY21kbCAqY21kbCwgdm9pZCAqZGF0YSkKK3sKKwljb25zdCBzdHJ1Y3QgY21kIGNtZHNbXSA9IHsKKwkJeyAicmVzZXQiLAljbWRfbGlua19zdGF0X3Jlc2V0LAljbWRfbGlua19zdGF0X3Jlc2V0X2hlbHAgfSwKKwkJeyAic2hvdyIsCWNtZF9saW5rX3N0YXRfc2hvdywJY21kX2xpbmtfc3RhdF9zaG93X2hlbHAgfSwKKwkJeyBOVUxMIH0KKwl9OworCisJcmV0dXJuIHJ1bl9jbWQobmxoLCBjbWQsIGNtZHMsIGNtZGwsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBjbWRfbGlua19zZXRfaGVscChzdHJ1Y3QgY21kbCAqY21kbCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBsaW5rIHNldCBQUFJPUEVSVFkgbGluayBMSU5LXG5cbiIKKwkJIlBST1BFUlRJRVNcbiIKKwkJIiB0b2xlcmFuY2UgVE9MRVJBTkNFICAgLSBTZXQgbGluayB0b2xlcmFuY2VcbiIKKwkJIiBwcmlvcml0eSBQUklPUklUWSAgICAgLSBTZXQgbGluayBwcmlvcml0eVxuIgorCQkiIHdpbmRvdyBXSU5ET1cgICAgICAgICAtIFNldCBsaW5rIHdpbmRvd1xuIiwKKwkJY21kbC0+YXJndlswXSk7Cit9CisKK3N0YXRpYyBpbnQgY21kX2xpbmtfc2V0X3Byb3Aoc3RydWN0IG5sbXNnaGRyICpubGgsIGNvbnN0IHN0cnVjdCBjbWQgKmNtZCwKKwkJCSAgICAgc3RydWN0IGNtZGwgKmNtZGwsIHZvaWQgKmRhdGEpCit7CisJaW50IHZhbDsKKwlpbnQgcHJvcDsKKwljaGFyIGJ1ZltNTkxfU09DS0VUX0JVRkZFUl9TSVpFXTsKKwlzdHJ1Y3QgbmxhdHRyICpwcm9wczsKKwlzdHJ1Y3QgbmxhdHRyICphdHRyczsKKwlzdHJ1Y3Qgb3B0ICpvcHQ7CisJc3RydWN0IG9wdCBvcHRzW10gPSB7CisJCXsgImxpbmsiLAlOVUxMIH0sCisJCXsgTlVMTCB9CisJfTsKKworCWlmIChzdHJjbXAoY21kLT5jbWQsICJwcmlvcml0eSIpID09IDApCisJCXByb3AgPSBUSVBDX05MQV9QUk9QX1BSSU87CisJZWxzZSBpZiAoKHN0cmNtcChjbWQtPmNtZCwgInRvbGVyYW5jZSIpID09IDApKQorCQlwcm9wID0gVElQQ19OTEFfUFJPUF9UT0w7CisJZWxzZSBpZiAoKHN0cmNtcChjbWQtPmNtZCwgIndpbmRvdyIpID09IDApKQorCQlwcm9wID0gVElQQ19OTEFfUFJPUF9XSU47CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChoZWxwX2ZsYWcpIHsKKwkJKGNtZC0+aGVscCkoY21kbCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjbWRsLT5vcHRpbmQgPj0gY21kbC0+YXJnYykgeworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yLCBtaXNzaW5nIHZhbHVlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXZhbCA9IGF0b2koc2hpZnRfY21kbChjbWRsKSk7CisKKwlpZiAocGFyc2Vfb3B0cyhvcHRzLCBjbWRsKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCEobmxoID0gbXNnX2luaXQoYnVmLCBUSVBDX05MX0xJTktfU0VUKSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvciwgbWVzc2FnZSBpbml0aWFsaXNhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWF0dHJzID0gbW5sX2F0dHJfbmVzdF9zdGFydChubGgsIFRJUENfTkxBX0xJTkspOworCisJaWYgKCEob3B0ID0gZ2V0X29wdChvcHRzLCAibGluayIpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yLCBtaXNzaW5nIGxpbmtcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbW5sX2F0dHJfcHV0X3N0cnoobmxoLCBUSVBDX05MQV9MSU5LX05BTUUsIG9wdC0+dmFsKTsKKworCXByb3BzID0gbW5sX2F0dHJfbmVzdF9zdGFydChubGgsIFRJUENfTkxBX0xJTktfUFJPUCk7CisJbW5sX2F0dHJfcHV0X3UzMihubGgsIHByb3AsIHZhbCk7CisJbW5sX2F0dHJfbmVzdF9lbmQobmxoLCBwcm9wcyk7CisKKwltbmxfYXR0cl9uZXN0X2VuZChubGgsIGF0dHJzKTsKKworCXJldHVybiBtc2dfZG9pdChubGgsIGxpbmtfZ2V0X2NiLCAmcHJvcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjbWRfbGlua19zZXQoc3RydWN0IG5sbXNnaGRyICpubGgsIGNvbnN0IHN0cnVjdCBjbWQgKmNtZCwKKwkJCXN0cnVjdCBjbWRsICpjbWRsLCB2b2lkICpkYXRhKQoreworCWNvbnN0IHN0cnVjdCBjbWQgY21kc1tdID0geworCQl7ICJwcmlvcml0eSIsCWNtZF9saW5rX3NldF9wcm9wLAljbWRfbGlua19zZXRfaGVscCB9LAorCQl7ICJ0b2xlcmFuY2UiLAljbWRfbGlua19zZXRfcHJvcCwJY21kX2xpbmtfc2V0X2hlbHAgfSwKKwkJeyAid2luZG93IiwJY21kX2xpbmtfc2V0X3Byb3AsCWNtZF9saW5rX3NldF9oZWxwIH0sCisJCXsgTlVMTCB9CisJfTsKKworCXJldHVybiBydW5fY21kKG5saCwgY21kLCBjbWRzLCBjbWRsLCBOVUxMKTsKK30KKwordm9pZCBjbWRfbGlua19oZWxwKHN0cnVjdCBjbWRsICpjbWRsKQoreworCWZwcmludGYoc3RkZXJyLAorCQkiVXNhZ2U6ICVzIGxpbmsgQ09NTUFORCBbQVJHU10gLi4uXG4iCisJCSJcbiIKKwkJIkNPTU1BTkRTXG4iCisJCSIgbGlzdCAgICAgICAgICAgICAgICAgIC0gTGlzdCBsaW5rc1xuIgorCQkiIGdldCAgICAgICAgICAgICAgICAgICAtIEdldCB2YXJpb3VzIGxpbmsgcHJvcGVydGllc1xuIgorCQkiIHNldCAgICAgICAgICAgICAgICAgICAtIFNldCB2YXJpb3VzIGxpbmsgcHJvcGVydGllc1xuIgorCQkiIHN0YXRpc3RpY3MgICAgICAgICAgICAtIFNob3cgb3IgcmVzZXQgc3RhdGlzdGljc1xuIiwKKwkJY21kbC0+YXJndlswXSk7Cit9CisKK2ludCBjbWRfbGluayhzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgY29uc3Qgc3RydWN0IGNtZCAqY21kLCBzdHJ1Y3QgY21kbCAqY21kbCwKKwkgICAgIHZvaWQgKmRhdGEpCit7CisJY29uc3Qgc3RydWN0IGNtZCBjbWRzW10gPSB7CisJCXsgImdldCIsCWNtZF9saW5rX2dldCwJY21kX2xpbmtfZ2V0X2hlbHAgfSwKKwkJeyAibGlzdCIsCWNtZF9saW5rX2xpc3QsCU5VTEwgfSwKKwkJeyAic2V0IiwJY21kX2xpbmtfc2V0LAljbWRfbGlua19zZXRfaGVscCB9LAorCQl7ICJzdGF0aXN0aWNzIiwgY21kX2xpbmtfc3RhdCwJY21kX2xpbmtfc3RhdF9oZWxwIH0sCisJCXsgTlVMTCB9CisJfTsKKworCXJldHVybiBydW5fY21kKG5saCwgY21kLCBjbWRzLCBjbWRsLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RpcGMvbGluay5oIGIvaXByb3V0ZTIvdGlwYy9saW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRjOTVlNQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RpcGMvbGluay5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBsaW5rLmMJVElQQyBsaW5rIGZ1bmN0aW9uYWxpdHkuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJUmljaGFyZCBBbHBlIDxyaWNoYXJkLmFscGVAZXJpY3Nzb24uY29tPgorICovCisKKyNpZm5kZWYgX1RJUENfTElOS19ICisjZGVmaW5lIF9USVBDX0xJTktfSAorCitleHRlcm4gaW50IGhlbHBfZmxhZzsKKworaW50IGNtZF9saW5rKHN0cnVjdCBubG1zZ2hkciAqbmxoLCBjb25zdCBzdHJ1Y3QgY21kICpjbWQsIHN0cnVjdCBjbWRsICpjbWRsLAorCSAgICAgdm9pZCAqZGF0YSk7Cit2b2lkIGNtZF9saW5rX2hlbHAoc3RydWN0IGNtZGwgKmNtZGwpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RpcGMvbWVkaWEuYyBiL2lwcm91dGUyL3RpcGMvbWVkaWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTAyYWI3Ci0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGlwYy9tZWRpYS5jCkBAIC0wLDAgKzEsMjYwIEBACisvKgorICogbWVkaWEuYwlUSVBDIGxpbmsgZnVuY3Rpb25hbGl0eS4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglSaWNoYXJkIEFscGUgPHJpY2hhcmQuYWxwZUBlcmljc3Nvbi5jb20+CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPGxpbnV4L3RpcGNfbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3RpcGMuaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaWJtbmwvbGlibW5sLmg+CisKKyNpbmNsdWRlICJjbWRsLmgiCisjaW5jbHVkZSAibXNnLmgiCisjaW5jbHVkZSAibWVkaWEuaCIKKworc3RhdGljIGludCBtZWRpYV9saXN0X2NiKGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBnZW5sbXNnaGRyICpnZW5sID0gbW5sX25sbXNnX2dldF9wYXlsb2FkKG5saCk7CisJc3RydWN0IG5sYXR0ciAqaW5mb1tUSVBDX05MQV9NQVggKyAxXSA9IHt9OworCXN0cnVjdCBubGF0dHIgKmF0dHJzW1RJUENfTkxBX01FRElBX01BWCArIDFdID0ge307CisKKwltbmxfYXR0cl9wYXJzZShubGgsIHNpemVvZigqZ2VubCksIHBhcnNlX2F0dHJzLCBpbmZvKTsKKwlpZiAoIWluZm9bVElQQ19OTEFfTUVESUFdKQorCQlyZXR1cm4gTU5MX0NCX0VSUk9SOworCisJbW5sX2F0dHJfcGFyc2VfbmVzdGVkKGluZm9bVElQQ19OTEFfTUVESUFdLCBwYXJzZV9hdHRycywgYXR0cnMpOworCWlmICghYXR0cnNbVElQQ19OTEFfTUVESUFfTkFNRV0pCisJCXJldHVybiBNTkxfQ0JfRVJST1I7CisKKwlwcmludGYoIiVzXG4iLCBtbmxfYXR0cl9nZXRfc3RyKGF0dHJzW1RJUENfTkxBX01FRElBX05BTUVdKSk7CisKKwlyZXR1cm4gTU5MX0NCX09LOworfQorCitzdGF0aWMgaW50IGNtZF9tZWRpYV9saXN0KHN0cnVjdCBubG1zZ2hkciAqbmxoLCBjb25zdCBzdHJ1Y3QgY21kICpjbWQsCisJCQkgc3RydWN0IGNtZGwgKmNtZGwsIHZvaWQgKmRhdGEpCit7CisJY2hhciBidWZbTU5MX1NPQ0tFVF9CVUZGRVJfU0laRV07CisKKwlpZiAoaGVscF9mbGFnKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIG1lZGlhIGxpc3RcbiIsIGNtZGwtPmFyZ3ZbMF0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIShubGggPSBtc2dfaW5pdChidWYsIFRJUENfTkxfTUVESUFfR0VUKSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvciwgbWVzc2FnZSBpbml0aWFsaXNhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIG1zZ19kdW1waXQobmxoLCBtZWRpYV9saXN0X2NiLCBOVUxMKTsKK30KKworc3RhdGljIGludCBtZWRpYV9nZXRfY2IoY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKmRhdGEpCit7CisJaW50ICpwcm9wID0gZGF0YTsKKwlzdHJ1Y3QgZ2VubG1zZ2hkciAqZ2VubCA9IG1ubF9ubG1zZ19nZXRfcGF5bG9hZChubGgpOworCXN0cnVjdCBubGF0dHIgKmluZm9bVElQQ19OTEFfTUFYICsgMV0gPSB7fTsKKwlzdHJ1Y3QgbmxhdHRyICphdHRyc1tUSVBDX05MQV9NRURJQV9NQVggKyAxXSA9IHt9OworCXN0cnVjdCBubGF0dHIgKnByb3BzW1RJUENfTkxBX1BST1BfTUFYICsgMV0gPSB7fTsKKworCW1ubF9hdHRyX3BhcnNlKG5saCwgc2l6ZW9mKCpnZW5sKSwgcGFyc2VfYXR0cnMsIGluZm8pOworCWlmICghaW5mb1tUSVBDX05MQV9NRURJQV0pCisJCXJldHVybiBNTkxfQ0JfRVJST1I7CisKKwltbmxfYXR0cl9wYXJzZV9uZXN0ZWQoaW5mb1tUSVBDX05MQV9NRURJQV0sIHBhcnNlX2F0dHJzLCBhdHRycyk7CisJaWYgKCFhdHRyc1tUSVBDX05MQV9NRURJQV9QUk9QXSkKKwkJcmV0dXJuIE1OTF9DQl9FUlJPUjsKKworCW1ubF9hdHRyX3BhcnNlX25lc3RlZChhdHRyc1tUSVBDX05MQV9NRURJQV9QUk9QXSwgcGFyc2VfYXR0cnMsIHByb3BzKTsKKwlpZiAoIXByb3BzWypwcm9wXSkKKwkJcmV0dXJuIE1OTF9DQl9FUlJPUjsKKworCXByaW50ZigiJXVcbiIsIG1ubF9hdHRyX2dldF91MzIocHJvcHNbKnByb3BdKSk7CisKKwlyZXR1cm4gTU5MX0NCX09LOworfQorCitzdGF0aWMgaW50IGNtZF9tZWRpYV9nZXRfcHJvcChzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgY29uc3Qgc3RydWN0IGNtZCAqY21kLAorCQkJICAgICAgc3RydWN0IGNtZGwgKmNtZGwsIHZvaWQgKmRhdGEpCit7CisJaW50IHByb3A7CisJY2hhciBidWZbTU5MX1NPQ0tFVF9CVUZGRVJfU0laRV07CisJc3RydWN0IG5sYXR0ciAqbmVzdDsKKwlzdHJ1Y3Qgb3B0ICpvcHQ7CisJc3RydWN0IG9wdCBvcHRzW10gPSB7CisJCXsgIm1lZGlhIiwJCU5VTEwgfSwKKwkJeyBOVUxMIH0KKwl9OworCisJaWYgKHN0cmNtcChjbWQtPmNtZCwgInByaW9yaXR5IikgPT0gMCkKKwkJcHJvcCA9IFRJUENfTkxBX1BST1BfUFJJTzsKKwllbHNlIGlmICgoc3RyY21wKGNtZC0+Y21kLCAidG9sZXJhbmNlIikgPT0gMCkpCisJCXByb3AgPSBUSVBDX05MQV9QUk9QX1RPTDsKKwllbHNlIGlmICgoc3RyY21wKGNtZC0+Y21kLCAid2luZG93IikgPT0gMCkpCisJCXByb3AgPSBUSVBDX05MQV9QUk9QX1dJTjsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGhlbHBfZmxhZykgeworCQkoY21kLT5oZWxwKShjbWRsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHBhcnNlX29wdHMob3B0cywgY21kbCkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghKG5saCA9IG1zZ19pbml0KGJ1ZiwgVElQQ19OTF9NRURJQV9HRVQpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yLCBtZXNzYWdlIGluaXRpYWxpc2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoIShvcHQgPSBnZXRfb3B0KG9wdHMsICJtZWRpYSIpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yLCBtaXNzaW5nIG1lZGlhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW5lc3QgPSBtbmxfYXR0cl9uZXN0X3N0YXJ0KG5saCwgVElQQ19OTEFfTUVESUEpOworCW1ubF9hdHRyX3B1dF9zdHJ6KG5saCwgVElQQ19OTEFfTUVESUFfTkFNRSwgb3B0LT52YWwpOworCW1ubF9hdHRyX25lc3RfZW5kKG5saCwgbmVzdCk7CisKKwlyZXR1cm4gbXNnX2RvaXQobmxoLCBtZWRpYV9nZXRfY2IsICZwcm9wKTsKK30KKworc3RhdGljIHZvaWQgY21kX21lZGlhX2dldF9oZWxwKHN0cnVjdCBjbWRsICpjbWRsKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIG1lZGlhIGdldCBQUFJPUEVSVFkgbWVkaWEgTUVESUFcblxuIgorCQkiUFJPUEVSVElFU1xuIgorCQkiIHRvbGVyYW5jZSAgICAgICAgICAgICAtIEdldCBtZWRpYSB0b2xlcmFuY2VcbiIKKwkJIiBwcmlvcml0eSAgICAgICAgICAgICAgLSBHZXQgbWVkaWEgcHJpb3JpdHlcbiIKKwkJIiB3aW5kb3cgICAgICAgICAgICAgICAgLSBHZXQgbWVkaWEgd2luZG93XG4iLAorCQljbWRsLT5hcmd2WzBdKTsKK30KKworc3RhdGljIGludCBjbWRfbWVkaWFfZ2V0KHN0cnVjdCBubG1zZ2hkciAqbmxoLCBjb25zdCBzdHJ1Y3QgY21kICpjbWQsCisJCQlzdHJ1Y3QgY21kbCAqY21kbCwgdm9pZCAqZGF0YSkKK3sKKwljb25zdCBzdHJ1Y3QgY21kIGNtZHNbXSA9IHsKKwkJeyAicHJpb3JpdHkiLAljbWRfbWVkaWFfZ2V0X3Byb3AsCWNtZF9tZWRpYV9nZXRfaGVscCB9LAorCQl7ICJ0b2xlcmFuY2UiLAljbWRfbWVkaWFfZ2V0X3Byb3AsCWNtZF9tZWRpYV9nZXRfaGVscCB9LAorCQl7ICJ3aW5kb3ciLAljbWRfbWVkaWFfZ2V0X3Byb3AsCWNtZF9tZWRpYV9nZXRfaGVscCB9LAorCQl7IE5VTEwgfQorCX07CisKKwlyZXR1cm4gcnVuX2NtZChubGgsIGNtZCwgY21kcywgY21kbCwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGNtZF9tZWRpYV9zZXRfaGVscChzdHJ1Y3QgY21kbCAqY21kbCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBtZWRpYSBzZXQgUFBST1BFUlRZIG1lZGlhIE1FRElBXG5cbiIKKwkJIlBST1BFUlRJRVNcbiIKKwkJIiB0b2xlcmFuY2UgVE9MRVJBTkNFICAgLSBTZXQgbWVkaWEgdG9sZXJhbmNlXG4iCisJCSIgcHJpb3JpdHkgUFJJT1JJVFkgICAgIC0gU2V0IG1lZGlhIHByaW9yaXR5XG4iCisJCSIgd2luZG93IFdJTkRPVyAgICAgICAgIC0gU2V0IG1lZGlhIHdpbmRvd1xuIiwKKwkJY21kbC0+YXJndlswXSk7Cit9CisKK3N0YXRpYyBpbnQgY21kX21lZGlhX3NldF9wcm9wKHN0cnVjdCBubG1zZ2hkciAqbmxoLCBjb25zdCBzdHJ1Y3QgY21kICpjbWQsCisJCQkgc3RydWN0IGNtZGwgKmNtZGwsIHZvaWQgKmRhdGEpCit7CisJaW50IHZhbDsKKwlpbnQgcHJvcDsKKwljaGFyIGJ1ZltNTkxfU09DS0VUX0JVRkZFUl9TSVpFXTsKKwlzdHJ1Y3QgbmxhdHRyICpwcm9wczsKKwlzdHJ1Y3QgbmxhdHRyICphdHRyczsKKwlzdHJ1Y3Qgb3B0ICpvcHQ7CisJc3RydWN0IG9wdCBvcHRzW10gPSB7CisJCXsgIm1lZGlhIiwJCU5VTEwgfSwKKwkJeyBOVUxMIH0KKwl9OworCisJaWYgKHN0cmNtcChjbWQtPmNtZCwgInByaW9yaXR5IikgPT0gMCkKKwkJcHJvcCA9IFRJUENfTkxBX1BST1BfUFJJTzsKKwllbHNlIGlmICgoc3RyY21wKGNtZC0+Y21kLCAidG9sZXJhbmNlIikgPT0gMCkpCisJCXByb3AgPSBUSVBDX05MQV9QUk9QX1RPTDsKKwllbHNlIGlmICgoc3RyY21wKGNtZC0+Y21kLCAid2luZG93IikgPT0gMCkpCisJCXByb3AgPSBUSVBDX05MQV9QUk9QX1dJTjsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGhlbHBfZmxhZykgeworCQkoY21kLT5oZWxwKShjbWRsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNtZGwtPm9wdGluZCA+PSBjbWRsLT5hcmdjKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3IsIG1pc3NpbmcgdmFsdWVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdmFsID0gYXRvaShzaGlmdF9jbWRsKGNtZGwpKTsKKworCWlmIChwYXJzZV9vcHRzKG9wdHMsIGNtZGwpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIShubGggPSBtc2dfaW5pdChidWYsIFRJUENfTkxfTUVESUFfU0VUKSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvciwgbWVzc2FnZSBpbml0aWFsaXNhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWF0dHJzID0gbW5sX2F0dHJfbmVzdF9zdGFydChubGgsIFRJUENfTkxBX01FRElBKTsKKworCWlmICghKG9wdCA9IGdldF9vcHQob3B0cywgIm1lZGlhIikpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3IsIG1pc3NpbmcgbWVkaWFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbW5sX2F0dHJfcHV0X3N0cnoobmxoLCBUSVBDX05MQV9NRURJQV9OQU1FLCBvcHQtPnZhbCk7CisKKwlwcm9wcyA9IG1ubF9hdHRyX25lc3Rfc3RhcnQobmxoLCBUSVBDX05MQV9NRURJQV9QUk9QKTsKKwltbmxfYXR0cl9wdXRfdTMyKG5saCwgcHJvcCwgdmFsKTsKKwltbmxfYXR0cl9uZXN0X2VuZChubGgsIHByb3BzKTsKKworCW1ubF9hdHRyX25lc3RfZW5kKG5saCwgYXR0cnMpOworCisJcmV0dXJuIG1zZ19kb2l0KG5saCwgTlVMTCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgY21kX21lZGlhX3NldChzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgY29uc3Qgc3RydWN0IGNtZCAqY21kLAorCQkJIHN0cnVjdCBjbWRsICpjbWRsLCB2b2lkICpkYXRhKQoreworCWNvbnN0IHN0cnVjdCBjbWQgY21kc1tdID0geworCQl7ICJwcmlvcml0eSIsCWNtZF9tZWRpYV9zZXRfcHJvcCwJY21kX21lZGlhX3NldF9oZWxwIH0sCisJCXsgInRvbGVyYW5jZSIsCWNtZF9tZWRpYV9zZXRfcHJvcCwJY21kX21lZGlhX3NldF9oZWxwIH0sCisJCXsgIndpbmRvdyIsCWNtZF9tZWRpYV9zZXRfcHJvcCwJY21kX21lZGlhX3NldF9oZWxwIH0sCisJCXsgTlVMTCB9CisJfTsKKworCXJldHVybiBydW5fY21kKG5saCwgY21kLCBjbWRzLCBjbWRsLCBOVUxMKTsKK30KKwordm9pZCBjbWRfbWVkaWFfaGVscChzdHJ1Y3QgY21kbCAqY21kbCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwKKwkJIlVzYWdlOiAlcyBtZWRpYSBDT01NQU5EIFtBUkdTXSAuLi5cbiIKKwkJIlxuIgorCQkiQ29tbWFuZHM6XG4iCisJCSIgbGlzdCAgICAgICAgICAgICAgICAgIC0gTGlzdCBhY3RpdmUgbWVkaWEgdHlwZXNcbiIKKwkJIiBnZXQgICAgICAgICAgICAgICAgICAgLSBHZXQgdmFyaW91cyBtZWRpYSBwcm9wZXJ0aWVzXG4iCisJCSIgc2V0ICAgICAgICAgICAgICAgICAgIC0gU2V0IHZhcmlvdXMgbWVkaWEgcHJvcGVydGllc1xuIiwKKwkJY21kbC0+YXJndlswXSk7Cit9CisKK2ludCBjbWRfbWVkaWEoc3RydWN0IG5sbXNnaGRyICpubGgsIGNvbnN0IHN0cnVjdCBjbWQgKmNtZCwgc3RydWN0IGNtZGwgKmNtZGwsCisJICAgICB2b2lkICpkYXRhKQoreworCWNvbnN0IHN0cnVjdCBjbWQgY21kc1tdID0geworCQl7ICJnZXQiLAljbWRfbWVkaWFfZ2V0LAljbWRfbWVkaWFfZ2V0X2hlbHAgfSwKKwkJeyAibGlzdCIsCWNtZF9tZWRpYV9saXN0LAlOVUxMIH0sCisJCXsgInNldCIsCWNtZF9tZWRpYV9zZXQsCWNtZF9tZWRpYV9zZXRfaGVscCB9LAorCQl7IE5VTEwgfQorCX07CisKKwlyZXR1cm4gcnVuX2NtZChubGgsIGNtZCwgY21kcywgY21kbCwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90aXBjL21lZGlhLmggYi9pcHJvdXRlMi90aXBjL21lZGlhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU4NGFmNwotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RpcGMvbWVkaWEuaApAQCAtMCwwICsxLDIxIEBACisvKgorICogbWVkaWEuaAlUSVBDIGxpbmsgZnVuY3Rpb25hbGl0eS4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglSaWNoYXJkIEFscGUgPHJpY2hhcmQuYWxwZUBlcmljc3Nvbi5jb20+CisgKi8KKworI2lmbmRlZiBfVElQQ19NRURJQV9ICisjZGVmaW5lIF9USVBDX01FRElBX0gKKworZXh0ZXJuIGludCBoZWxwX2ZsYWc7CisKK2ludCBjbWRfbWVkaWEoc3RydWN0IG5sbXNnaGRyICpubGgsIGNvbnN0IHN0cnVjdCBjbWQgKmNtZCwgc3RydWN0IGNtZGwgKmNtZGwsCisJICAgICB2b2lkICpkYXRhKTsKK3ZvaWQgY21kX21lZGlhX2hlbHAoc3RydWN0IGNtZGwgKmNtZGwpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RpcGMvbWlzYy5jIGIvaXByb3V0ZTIvdGlwYy9taXNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA5MTIyMgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RpcGMvbWlzYy5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBtaXNjLmMJTWlzY2VsbGFuZW91cyBUSVBDIGhlbHBlciBmdW5jdGlvbnMuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJUmljaGFyZCBBbHBlIDxyaWNoYXJkLmFscGVAZXJpY3Nzb24uY29tPgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpcGMuaD4KKworI2luY2x1ZGUgIm1pc2MuaCIKKworI2RlZmluZSBJTl9SQU5HRSh2YWwsIGxvdywgaGlnaCkgKCh2YWwpIDw9IChoaWdoKSAmJiAodmFsKSA+PSAobG93KSkKKwordWludDMyX3Qgc3RyMmFkZHIoY2hhciAqc3RyKQoreworCXVuc2lnbmVkIGludCB6LCBjLCBuOworCWNoYXIgZHVtbXk7CisKKwlpZiAoc3NjYW5mKHN0ciwgIiV1LiV1LiV1JWMiLCAmeiwgJmMsICZuLCAmZHVtbXkpICE9IDMpIHsKKwkJZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIG5ldHdvcmsgYWRkcmVzcywgc3ludGF4OiBaLkMuTlxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChJTl9SQU5HRSh6LCAwLCAyNTUpICYmIElOX1JBTkdFKGMsIDAsIDQwOTUpICYmIElOX1JBTkdFKG4sIDAsIDQwOTUpKQorCQlyZXR1cm4gdGlwY19hZGRyKHosIGMsIG4pOworCisJZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIG5ldHdvcmsgYWRkcmVzcyBcIiVzXCJcbiIsIHN0cik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90aXBjL21pc2MuaCBiL2lwcm91dGUyL3RpcGMvbWlzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NWRmNzQKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90aXBjL21pc2MuaApAQCAtMCwwICsxLDE5IEBACisvKgorICogbWlzYy5oCU1pc2NlbGxhbmVvdXMgVElQQyBoZWxwZXIgZnVuY3Rpb25zLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CVJpY2hhcmQgQWxwZSA8cmljaGFyZC5hbHBlQGVyaWNzc29uLmNvbT4KKyAqLworCisjaWZuZGVmIF9USVBDX01JU0NfSAorI2RlZmluZSBfVElQQ19NSVNDX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCit1aW50MzJfdCBzdHIyYWRkcihjaGFyICpzdHIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RpcGMvbXNnLmMgYi9pcHJvdXRlMi90aXBjL21zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYzIyMjIKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90aXBjL21zZy5jCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogbXNnLmMJTWVzc2FnaW5nIChuZXRsaW5rKSBoZWxwZXIgZnVuY3Rpb25zLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CVJpY2hhcmQgQWxwZSA8cmljaGFyZC5hbHBlQGVyaWNzc29uLmNvbT4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPGxpbnV4L3RpcGNfbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3RpcGMuaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaWJtbmwvbGlibW5sLmg+CisKKyNpbmNsdWRlICJtc2cuaCIKKworaW50IHBhcnNlX2F0dHJzKGNvbnN0IHN0cnVjdCBubGF0dHIgKmF0dHIsIHZvaWQgKmRhdGEpCit7CisJY29uc3Qgc3RydWN0IG5sYXR0ciAqKnRiID0gZGF0YTsKKwlpbnQgdHlwZSA9IG1ubF9hdHRyX2dldF90eXBlKGF0dHIpOworCisJdGJbdHlwZV0gPSBhdHRyOworCisJcmV0dXJuIE1OTF9DQl9PSzsKK30KKworc3RhdGljIGludCBmYW1pbHlfaWRfY2IoY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5sYXR0ciAqdGJbQ1RSTF9BVFRSX01BWCArIDFdID0ge307CisJc3RydWN0IGdlbmxtc2doZHIgKmdlbmwgPSBtbmxfbmxtc2dfZ2V0X3BheWxvYWQobmxoKTsKKwlpbnQgKmlkID0gZGF0YTsKKworCW1ubF9hdHRyX3BhcnNlKG5saCwgc2l6ZW9mKCpnZW5sKSwgcGFyc2VfYXR0cnMsIHRiKTsKKwlpZiAoIXRiW0NUUkxfQVRUUl9GQU1JTFlfSURdKQorCQlyZXR1cm4gTU5MX0NCX0VSUk9SOworCisJKmlkID0gbW5sX2F0dHJfZ2V0X3UxNih0YltDVFJMX0FUVFJfRkFNSUxZX0lEXSk7CisKKwlyZXR1cm4gTU5MX0NCX09LOworfQorCitzdGF0aWMgc3RydWN0IG1ubF9zb2NrZXQgKm1zZ19zZW5kKHN0cnVjdCBubG1zZ2hkciAqbmxoKQoreworCWludCByZXQ7CisJc3RydWN0IG1ubF9zb2NrZXQgKm5sOworCisJbmwgPSBtbmxfc29ja2V0X29wZW4oTkVUTElOS19HRU5FUklDKTsKKwlpZiAobmwgPT0gTlVMTCkgeworCQlwZXJyb3IoIm1ubF9zb2NrZXRfb3BlbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXQgPSBtbmxfc29ja2V0X2JpbmQobmwsIDAsIE1OTF9TT0NLRVRfQVVUT1BJRCk7CisJaWYgKHJldCA8IDApIHsKKwkJcGVycm9yKCJtbmxfc29ja2V0X2JpbmQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0ID0gbW5sX3NvY2tldF9zZW5kdG8obmwsIG5saCwgbmxoLT5ubG1zZ19sZW4pOworCWlmIChyZXQgPCAwKSB7CisJCXBlcnJvcigibW5sX3NvY2tldF9zZW5kIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBubDsKK30KKworc3RhdGljIGludCBtc2dfcmVjdihzdHJ1Y3QgbW5sX3NvY2tldCAqbmwsIG1ubF9jYl90IGNhbGxiYWNrLCB2b2lkICpkYXRhLCBpbnQgc2VxKQoreworCWludCByZXQ7CisJdW5zaWduZWQgaW50IHBvcnRpZDsKKwljaGFyIGJ1ZltNTkxfU09DS0VUX0JVRkZFUl9TSVpFXTsKKworCXBvcnRpZCA9IG1ubF9zb2NrZXRfZ2V0X3BvcnRpZChubCk7CisKKwlyZXQgPSBtbmxfc29ja2V0X3JlY3Zmcm9tKG5sLCBidWYsIHNpemVvZihidWYpKTsKKwl3aGlsZSAocmV0ID4gMCkgeworCQlyZXQgPSBtbmxfY2JfcnVuKGJ1ZiwgcmV0LCBzZXEsIHBvcnRpZCwgY2FsbGJhY2ssIGRhdGEpOworCQlpZiAocmV0IDw9IDApCisJCQlicmVhazsKKwkJcmV0ID0gbW5sX3NvY2tldF9yZWN2ZnJvbShubCwgYnVmLCBzaXplb2YoYnVmKSk7CisJfQorCWlmIChyZXQgPT0gLTEpCisJCXBlcnJvcigiZXJyb3IiKTsKKworCW1ubF9zb2NrZXRfY2xvc2UobmwpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc2dfcXVlcnkoc3RydWN0IG5sbXNnaGRyICpubGgsIG1ubF9jYl90IGNhbGxiYWNrLCB2b2lkICpkYXRhKQoreworCXVuc2lnbmVkIGludCBzZXE7CisJc3RydWN0IG1ubF9zb2NrZXQgKm5sOworCisJc2VxID0gdGltZShOVUxMKTsKKwlubGgtPm5sbXNnX3NlcSA9IHNlcTsKKworCW5sID0gbXNnX3NlbmQobmxoKTsKKwlpZiAoIW5sKQorCQlyZXR1cm4gLUVOT1RTVVA7CisKKwlyZXR1cm4gbXNnX3JlY3YobmwsIGNhbGxiYWNrLCBkYXRhLCBzZXEpOworfQorCitzdGF0aWMgaW50IGdldF9mYW1pbHkodm9pZCkKK3sKKwlpbnQgZXJyOworCWludCBubF9mYW1pbHk7CisJc3RydWN0IG5sbXNnaGRyICpubGg7CisJc3RydWN0IGdlbmxtc2doZHIgKmdlbmw7CisJY2hhciBidWZbTU5MX1NPQ0tFVF9CVUZGRVJfU0laRV07CisKKwlubGggPSBtbmxfbmxtc2dfcHV0X2hlYWRlcihidWYpOworCW5saC0+bmxtc2dfdHlwZQk9IEdFTkxfSURfQ1RSTDsKKwlubGgtPm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVCB8IE5MTV9GX0FDSzsKKworCWdlbmwgPSBtbmxfbmxtc2dfcHV0X2V4dHJhX2hlYWRlcihubGgsIHNpemVvZihzdHJ1Y3QgZ2VubG1zZ2hkcikpOworCWdlbmwtPmNtZCA9IENUUkxfQ01EX0dFVEZBTUlMWTsKKwlnZW5sLT52ZXJzaW9uID0gMTsKKworCW1ubF9hdHRyX3B1dF91MzIobmxoLCBDVFJMX0FUVFJfRkFNSUxZX0lELCBHRU5MX0lEX0NUUkwpOworCW1ubF9hdHRyX3B1dF9zdHJ6KG5saCwgQ1RSTF9BVFRSX0ZBTUlMWV9OQU1FLCBUSVBDX0dFTkxfVjJfTkFNRSk7CisKKwlpZiAoKGVyciA9IG1zZ19xdWVyeShubGgsIGZhbWlseV9pZF9jYiwgJm5sX2ZhbWlseSkpKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIG5sX2ZhbWlseTsKK30KKworaW50IG1zZ19kb2l0KHN0cnVjdCBubG1zZ2hkciAqbmxoLCBtbmxfY2JfdCBjYWxsYmFjaywgdm9pZCAqZGF0YSkKK3sKKwlubGgtPm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVCB8IE5MTV9GX0FDSzsKKwlyZXR1cm4gbXNnX3F1ZXJ5KG5saCwgY2FsbGJhY2ssIGRhdGEpOworfQorCitpbnQgbXNnX2R1bXBpdChzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgbW5sX2NiX3QgY2FsbGJhY2ssIHZvaWQgKmRhdGEpCit7CisJbmxoLT5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1QgfCBOTE1fRl9EVU1QOworCXJldHVybiBtc2dfcXVlcnkobmxoLCBjYWxsYmFjaywgZGF0YSk7Cit9CisKK3N0cnVjdCBubG1zZ2hkciAqbXNnX2luaXQoY2hhciAqYnVmLCBpbnQgY21kKQoreworCWludCBmYW1pbHk7CisJc3RydWN0IG5sbXNnaGRyICpubGg7CisJc3RydWN0IGdlbmxtc2doZHIgKmdlbmw7CisKKwlmYW1pbHkgPSBnZXRfZmFtaWx5KCk7CisJaWYgKGZhbWlseSA8PSAwKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIlVuYWJsZSB0byBnZXQgVElQQyBubCBmYW1pbHkgaWQgKG1vZHVsZSBsb2FkZWQ/KVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW5saCA9IG1ubF9ubG1zZ19wdXRfaGVhZGVyKGJ1Zik7CisJbmxoLT5ubG1zZ190eXBlCT0gZmFtaWx5OworCisJZ2VubCA9IG1ubF9ubG1zZ19wdXRfZXh0cmFfaGVhZGVyKG5saCwgc2l6ZW9mKHN0cnVjdCBnZW5sbXNnaGRyKSk7CisJZ2VubC0+Y21kID0gY21kOworCWdlbmwtPnZlcnNpb24gPSAxOworCisJcmV0dXJuIG5saDsKK30KZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RpcGMvbXNnLmggYi9pcHJvdXRlMi90aXBjL21zZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZmQxYWQKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90aXBjL21zZy5oCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBtc2cuaAlNZXNzYWdpbmcgKG5ldGxpbmspIGhlbHBlciBmdW5jdGlvbnMuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJUmljaGFyZCBBbHBlIDxyaWNoYXJkLmFscGVAZXJpY3Nzb24uY29tPgorICovCisKKyNpZm5kZWYgX1RJUENfTVNHX0gKKyNkZWZpbmUgX1RJUENfTVNHX0gKKworc3RydWN0IG5sbXNnaGRyICptc2dfaW5pdChjaGFyICpidWYsIGludCBjbWQpOworaW50IG1zZ19kb2l0KHN0cnVjdCBubG1zZ2hkciAqbmxoLCBtbmxfY2JfdCBjYWxsYmFjaywgdm9pZCAqZGF0YSk7CitpbnQgbXNnX2R1bXBpdChzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgbW5sX2NiX3QgY2FsbGJhY2ssIHZvaWQgKmRhdGEpOworaW50IHBhcnNlX2F0dHJzKGNvbnN0IHN0cnVjdCBubGF0dHIgKmF0dHIsIHZvaWQgKmRhdGEpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RpcGMvbmFtZXRhYmxlLmMgYi9pcHJvdXRlMi90aXBjL25hbWV0YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MGE2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9pcHJvdXRlMi90aXBjL25hbWV0YWJsZS5jCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogbmFtZXRhYmxlLmMJVElQQyBuYW1ldGFibGUgZnVuY3Rpb25hbGl0eS4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglSaWNoYXJkIEFscGUgPHJpY2hhcmQuYWxwZUBlcmljc3Nvbi5jb20+CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPGxpbnV4L3RpcGNfbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3RpcGMuaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaWJtbmwvbGlibW5sLmg+CisKKyNpbmNsdWRlICJjbWRsLmgiCisjaW5jbHVkZSAibXNnLmgiCisjaW5jbHVkZSAibmFtZXRhYmxlLmgiCisKKyNkZWZpbmUgUE9SVElEX1NUUl9MRU4gNDUgLyogRm91ciB1MzIgYW5kIGZpdmUgZGVsaW1pdGVyIGNoYXJzICovCisKK3N0YXRpYyBpbnQgbmFtZXRhYmxlX3Nob3dfY2IoY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKmRhdGEpCit7CisJaW50ICppdGVyYXRpb24gPSBkYXRhOworCWNoYXIgcG9ydF9pZFtQT1JUSURfU1RSX0xFTl07CisJc3RydWN0IGdlbmxtc2doZHIgKmdlbmwgPSBtbmxfbmxtc2dfZ2V0X3BheWxvYWQobmxoKTsKKwlzdHJ1Y3QgbmxhdHRyICppbmZvW1RJUENfTkxBX01BWCArIDFdID0ge307CisJc3RydWN0IG5sYXR0ciAqYXR0cnNbVElQQ19OTEFfTkFNRV9UQUJMRV9NQVggKyAxXSA9IHt9OworCXN0cnVjdCBubGF0dHIgKnB1YmxbVElQQ19OTEFfUFVCTF9NQVggKyAxXSA9IHt9OworCWNvbnN0IGNoYXIgKnNjb3BlW10gPSB7ICIiLCAiem9uZSIsICJjbHVzdGVyIiwgIm5vZGUiIH07CisKKwltbmxfYXR0cl9wYXJzZShubGgsIHNpemVvZigqZ2VubCksIHBhcnNlX2F0dHJzLCBpbmZvKTsKKwlpZiAoIWluZm9bVElQQ19OTEFfTkFNRV9UQUJMRV0pCisJCXJldHVybiBNTkxfQ0JfRVJST1I7CisKKwltbmxfYXR0cl9wYXJzZV9uZXN0ZWQoaW5mb1tUSVBDX05MQV9OQU1FX1RBQkxFXSwgcGFyc2VfYXR0cnMsIGF0dHJzKTsKKwlpZiAoIWF0dHJzW1RJUENfTkxBX05BTUVfVEFCTEVfUFVCTF0pCisJCXJldHVybiBNTkxfQ0JfRVJST1I7CisKKwltbmxfYXR0cl9wYXJzZV9uZXN0ZWQoYXR0cnNbVElQQ19OTEFfTkFNRV9UQUJMRV9QVUJMXSwgcGFyc2VfYXR0cnMsIHB1YmwpOworCWlmICghcHVibFtUSVBDX05MQV9OQU1FX1RBQkxFX1BVQkxdKQorCQlyZXR1cm4gTU5MX0NCX0VSUk9SOworCisJaWYgKCEqaXRlcmF0aW9uKQorCQlwcmludGYoIiUtMTBzICUtMTBzICUtMTBzICUtMjZzICUtMTBzXG4iLAorCQkgICAgICAgIlR5cGUiLCAiTG93ZXIiLCAiVXBwZXIiLCAiUG9ydCBJZGVudGl0eSIsCisJCSAgICAgICAiUHVibGljYXRpb24gU2NvcGUiKTsKKwkoKml0ZXJhdGlvbikrKzsKKworCXNucHJpbnRmKHBvcnRfaWQsIHNpemVvZihwb3J0X2lkKSwgIjwldS4ldS4ldToldT4iLAorCQkgdGlwY196b25lKG1ubF9hdHRyX2dldF91MzIocHVibFtUSVBDX05MQV9QVUJMX05PREVdKSksCisJCSB0aXBjX2NsdXN0ZXIobW5sX2F0dHJfZ2V0X3UzMihwdWJsW1RJUENfTkxBX1BVQkxfTk9ERV0pKSwKKwkJIHRpcGNfbm9kZShtbmxfYXR0cl9nZXRfdTMyKHB1YmxbVElQQ19OTEFfUFVCTF9OT0RFXSkpLAorCQkgbW5sX2F0dHJfZ2V0X3UzMihwdWJsW1RJUENfTkxBX1BVQkxfUkVGXSkpOworCisJcHJpbnRmKCIlLTEwdSAlLTEwdSAlLTEwdSAlLTI2cyAlLTEydSIsCisJICAgICAgIG1ubF9hdHRyX2dldF91MzIocHVibFtUSVBDX05MQV9QVUJMX1RZUEVdKSwKKwkgICAgICAgbW5sX2F0dHJfZ2V0X3UzMihwdWJsW1RJUENfTkxBX1BVQkxfTE9XRVJdKSwKKwkgICAgICAgbW5sX2F0dHJfZ2V0X3UzMihwdWJsW1RJUENfTkxBX1BVQkxfVVBQRVJdKSwKKwkgICAgICAgcG9ydF9pZCwKKwkgICAgICAgbW5sX2F0dHJfZ2V0X3UzMihwdWJsW1RJUENfTkxBX1BVQkxfS0VZXSkpOworCisJcHJpbnRmKCIlc1xuIiwgc2NvcGVbbW5sX2F0dHJfZ2V0X3UzMihwdWJsW1RJUENfTkxBX1BVQkxfU0NPUEVdKV0pOworCisJcmV0dXJuIE1OTF9DQl9PSzsKK30KKworc3RhdGljIGludCBjbWRfbmFtZXRhYmxlX3Nob3coc3RydWN0IG5sbXNnaGRyICpubGgsIGNvbnN0IHN0cnVjdCBjbWQgKmNtZCwKKwkJCSAgICAgIHN0cnVjdCBjbWRsICpjbWRsLCB2b2lkICpkYXRhKQoreworCWludCBpdGVyYXRpb24gPSAwOworCWNoYXIgYnVmW01OTF9TT0NLRVRfQlVGRkVSX1NJWkVdOworCisJaWYgKGhlbHBfZmxhZykgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBuYW1ldGFibGUgc2hvd1xuIiwgY21kbC0+YXJndlswXSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghKG5saCA9IG1zZ19pbml0KGJ1ZiwgVElQQ19OTF9OQU1FX1RBQkxFX0dFVCkpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3IsIG1lc3NhZ2UgaW5pdGlhbGlzYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiBtc2dfZHVtcGl0KG5saCwgbmFtZXRhYmxlX3Nob3dfY2IsICZpdGVyYXRpb24pOworfQorCit2b2lkIGNtZF9uYW1ldGFibGVfaGVscChzdHJ1Y3QgY21kbCAqY21kbCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwKKwkJIlVzYWdlOiAlcyBuYW1ldGFibGUgQ09NTUFORFxuXG4iCisJCSJDT01NQU5EU1xuIgorCQkiIHNob3cgICAgICAgICAgICAgICAgICAtIFNob3cgbmFtZXRhYmxlXG4iLAorCQljbWRsLT5hcmd2WzBdKTsKK30KKworaW50IGNtZF9uYW1ldGFibGUoc3RydWN0IG5sbXNnaGRyICpubGgsIGNvbnN0IHN0cnVjdCBjbWQgKmNtZCwgc3RydWN0IGNtZGwgKmNtZGwsCisJCSAgdm9pZCAqZGF0YSkKK3sKKwljb25zdCBzdHJ1Y3QgY21kIGNtZHNbXSA9IHsKKwkJeyAic2hvdyIsCWNtZF9uYW1ldGFibGVfc2hvdywJTlVMTCB9LAorCQl7IE5VTEwgfQorCX07CisKKwlyZXR1cm4gcnVuX2NtZChubGgsIGNtZCwgY21kcywgY21kbCwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9pcHJvdXRlMi90aXBjL25hbWV0YWJsZS5oIGIvaXByb3V0ZTIvdGlwYy9uYW1ldGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDQ3M2UxCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGlwYy9uYW1ldGFibGUuaApAQCAtMCwwICsxLDIxIEBACisvKgorICogbmFtZXRhYmxlLmgJVElQQyBuYW1ldGFibGUgZnVuY3Rpb25hbGl0eS4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglSaWNoYXJkIEFscGUgPHJpY2hhcmQuYWxwZUBlcmljc3Nvbi5jb20+CisgKi8KKworI2lmbmRlZiBfVElQQ19OQU1FVEFCTEVfSAorI2RlZmluZSBfVElQQ19OQU1FVEFCTEVfSAorCitleHRlcm4gaW50IGhlbHBfZmxhZzsKKwordm9pZCBjbWRfbmFtZXRhYmxlX2hlbHAoc3RydWN0IGNtZGwgKmNtZGwpOworaW50IGNtZF9uYW1ldGFibGUoc3RydWN0IG5sbXNnaGRyICpubGgsIGNvbnN0IHN0cnVjdCBjbWQgKmNtZCwgc3RydWN0IGNtZGwgKmNtZGwsCisJCSAgdm9pZCAqZGF0YSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGlwYy9ub2RlLmMgYi9pcHJvdXRlMi90aXBjL25vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDFmZTFhCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGlwYy9ub2RlLmMKQEAgLTAsMCArMSwyNjcgQEAKKy8qCisgKiBub2RlLmMJVElQQyBub2RlIGZ1bmN0aW9uYWxpdHkuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJUmljaGFyZCBBbHBlIDxyaWNoYXJkLmFscGVAZXJpY3Nzb24uY29tPgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxsaW51eC90aXBjX25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC90aXBjLmg+CisjaW5jbHVkZSA8bGludXgvZ2VuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGlibW5sL2xpYm1ubC5oPgorCisjaW5jbHVkZSAiY21kbC5oIgorI2luY2x1ZGUgIm1zZy5oIgorI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICJub2RlLmgiCisKK3N0YXRpYyBpbnQgbm9kZV9saXN0X2NiKGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICpkYXRhKQoreworCXVpbnQzMl90IGFkZHI7CisJc3RydWN0IGdlbmxtc2doZHIgKmdlbmwgPSBtbmxfbmxtc2dfZ2V0X3BheWxvYWQobmxoKTsKKwlzdHJ1Y3QgbmxhdHRyICppbmZvW1RJUENfTkxBX01BWCArIDFdID0ge307CisJc3RydWN0IG5sYXR0ciAqYXR0cnNbVElQQ19OTEFfTk9ERV9NQVggKyAxXSA9IHt9OworCisJbW5sX2F0dHJfcGFyc2UobmxoLCBzaXplb2YoKmdlbmwpLCBwYXJzZV9hdHRycywgaW5mbyk7CisJaWYgKCFpbmZvW1RJUENfTkxBX05PREVdKQorCQlyZXR1cm4gTU5MX0NCX0VSUk9SOworCisJbW5sX2F0dHJfcGFyc2VfbmVzdGVkKGluZm9bVElQQ19OTEFfTk9ERV0sIHBhcnNlX2F0dHJzLCBhdHRycyk7CisJaWYgKCFhdHRyc1tUSVBDX05MQV9OT0RFX0FERFJdKQorCQlyZXR1cm4gTU5MX0NCX0VSUk9SOworCisJYWRkciA9IG1ubF9hdHRyX2dldF91MzIoYXR0cnNbVElQQ19OTEFfTk9ERV9BRERSXSk7CisJcHJpbnRmKCI8JXUuJXUuJXU+OiAiLAorCQl0aXBjX3pvbmUoYWRkciksCisJCXRpcGNfY2x1c3RlcihhZGRyKSwKKwkJdGlwY19ub2RlKGFkZHIpKTsKKworCWlmIChhdHRyc1tUSVBDX05MQV9OT0RFX1VQXSkKKwkJcHJpbnRmKCJ1cFxuIik7CisJZWxzZQorCQlwcmludGYoImRvd25cbiIpOworCisJcmV0dXJuIE1OTF9DQl9PSzsKK30KKworc3RhdGljIGludCBjbWRfbm9kZV9saXN0KHN0cnVjdCBubG1zZ2hkciAqbmxoLCBjb25zdCBzdHJ1Y3QgY21kICpjbWQsCisJCQkgc3RydWN0IGNtZGwgKmNtZGwsIHZvaWQgKmRhdGEpCit7CisJY2hhciBidWZbTU5MX1NPQ0tFVF9CVUZGRVJfU0laRV07CisKKwlpZiAoaGVscF9mbGFnKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIG5vZGUgbGlzdFxuIiwgY21kbC0+YXJndlswXSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghKG5saCA9IG1zZ19pbml0KGJ1ZiwgVElQQ19OTF9OT0RFX0dFVCkpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3IsIG1lc3NhZ2UgaW5pdGlhbGlzYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiBtc2dfZHVtcGl0KG5saCwgbm9kZV9saXN0X2NiLCBOVUxMKTsKK30KKworc3RhdGljIGludCBjbWRfbm9kZV9zZXRfYWRkcihzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgY29uc3Qgc3RydWN0IGNtZCAqY21kLAorCQkJICAgICBzdHJ1Y3QgY21kbCAqY21kbCwgdm9pZCAqZGF0YSkKK3sKKwljaGFyICpzdHI7CisJdWludDMyX3QgYWRkcjsKKwlzdHJ1Y3QgbmxhdHRyICpuZXN0OworCWNoYXIgYnVmW01OTF9TT0NLRVRfQlVGRkVSX1NJWkVdOworCisJaWYgKGNtZGwtPmFyZ2MgIT0gY21kbC0+b3B0aW5kICsgMSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBub2RlIHNldCBhZGRyZXNzIEFERFJFU1NcbiIsCisJCQljbWRsLT5hcmd2WzBdKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RyID0gc2hpZnRfY21kbChjbWRsKTsKKwlhZGRyID0gc3RyMmFkZHIoc3RyKTsKKwlpZiAoIWFkZHIpCisJCXJldHVybiAtMTsKKworCWlmICghKG5saCA9IG1zZ19pbml0KGJ1ZiwgVElQQ19OTF9ORVRfU0VUKSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvciwgbWVzc2FnZSBpbml0aWFsaXNhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJbmVzdCA9IG1ubF9hdHRyX25lc3Rfc3RhcnQobmxoLCBUSVBDX05MQV9ORVQpOworCW1ubF9hdHRyX3B1dF91MzIobmxoLCBUSVBDX05MQV9ORVRfQUREUiwgYWRkcik7CisJbW5sX2F0dHJfbmVzdF9lbmQobmxoLCBuZXN0KTsKKworCXJldHVybiBtc2dfZG9pdChubGgsIE5VTEwsIE5VTEwpOworfQorCitzdGF0aWMgaW50IGNtZF9ub2RlX2dldF9hZGRyKHN0cnVjdCBubG1zZ2hkciAqbmxoLCBjb25zdCBzdHJ1Y3QgY21kICpjbWQsCisJCQkgICAgIHN0cnVjdCBjbWRsICpjbWRsLCB2b2lkICpkYXRhKQoreworCWludCBzazsKKwlzb2NrbGVuX3Qgc3ogPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3RpcGMpOworCXN0cnVjdCBzb2NrYWRkcl90aXBjIGFkZHI7CisKKwlpZiAoIShzayA9IHNvY2tldChBRl9USVBDLCBTT0NLX1JETSwgMCkpKSB7CisJCWZwcmludGYoc3RkZXJyLCAib3BlbmluZyBUSVBDIHNvY2tldDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoZ2V0c29ja25hbWUoc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgJnN6KSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJnZXR0aW5nIFRJUEMgc29ja2V0IGFkZHJlc3M6ICVzXG4iLAorCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2Uoc2spOworCQlyZXR1cm4gLTE7CisJfQorCWNsb3NlKHNrKTsKKworCXByaW50ZigiPCV1LiV1LiV1PlxuIiwKKwkJdGlwY196b25lKGFkZHIuYWRkci5pZC5ub2RlKSwKKwkJdGlwY19jbHVzdGVyKGFkZHIuYWRkci5pZC5ub2RlKSwKKwkJdGlwY19ub2RlKGFkZHIuYWRkci5pZC5ub2RlKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXRpZF9nZXRfY2IoY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdlbmxtc2doZHIgKmdlbmwgPSBtbmxfbmxtc2dfZ2V0X3BheWxvYWQobmxoKTsKKwlzdHJ1Y3QgbmxhdHRyICppbmZvW1RJUENfTkxBX01BWCArIDFdID0ge307CisJc3RydWN0IG5sYXR0ciAqYXR0cnNbVElQQ19OTEFfTkVUX01BWCArIDFdID0ge307CisKKwltbmxfYXR0cl9wYXJzZShubGgsIHNpemVvZigqZ2VubCksIHBhcnNlX2F0dHJzLCBpbmZvKTsKKwlpZiAoIWluZm9bVElQQ19OTEFfTkVUXSkKKwkJcmV0dXJuIE1OTF9DQl9FUlJPUjsKKworCW1ubF9hdHRyX3BhcnNlX25lc3RlZChpbmZvW1RJUENfTkxBX05FVF0sIHBhcnNlX2F0dHJzLCBhdHRycyk7CisJaWYgKCFhdHRyc1tUSVBDX05MQV9ORVRfSURdKQorCQlyZXR1cm4gTU5MX0NCX0VSUk9SOworCisJcHJpbnRmKCIldVxuIiwgbW5sX2F0dHJfZ2V0X3UzMihhdHRyc1tUSVBDX05MQV9ORVRfSURdKSk7CisKKwlyZXR1cm4gTU5MX0NCX09LOworfQorCitzdGF0aWMgaW50IGNtZF9ub2RlX2dldF9uZXRpZChzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgY29uc3Qgc3RydWN0IGNtZCAqY21kLAorCQkJICAgICAgc3RydWN0IGNtZGwgKmNtZGwsIHZvaWQgKmRhdGEpCit7CisJY2hhciBidWZbTU5MX1NPQ0tFVF9CVUZGRVJfU0laRV07CisKKwlpZiAoaGVscF9mbGFnKSB7CisJCShjbWQtPmhlbHApKGNtZGwpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIShubGggPSBtc2dfaW5pdChidWYsIFRJUENfTkxfTkVUX0dFVCkpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3IsIG1lc3NhZ2UgaW5pdGlhbGlzYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiBtc2dfZHVtcGl0KG5saCwgbmV0aWRfZ2V0X2NiLCBOVUxMKTsKK30KKworc3RhdGljIGludCBjbWRfbm9kZV9zZXRfbmV0aWQoc3RydWN0IG5sbXNnaGRyICpubGgsIGNvbnN0IHN0cnVjdCBjbWQgKmNtZCwKKwkJCSAgICAgIHN0cnVjdCBjbWRsICpjbWRsLCB2b2lkICpkYXRhKQoreworCWludCBuZXRpZDsKKwljaGFyIGJ1ZltNTkxfU09DS0VUX0JVRkZFUl9TSVpFXTsKKwlzdHJ1Y3QgbmxhdHRyICpuZXN0OworCisJaWYgKGhlbHBfZmxhZykgeworCQkoY21kLT5oZWxwKShjbWRsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCEobmxoID0gbXNnX2luaXQoYnVmLCBUSVBDX05MX05FVF9TRVQpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yLCBtZXNzYWdlIGluaXRpYWxpc2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoY21kbC0+YXJnYyAhPSBjbWRsLT5vcHRpbmQgKyAxKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIG5vZGUgc2V0IG5ldGlkIE5FVElEXG4iLAorCQkJY21kbC0+YXJndlswXSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwluZXRpZCA9IGF0b2koc2hpZnRfY21kbChjbWRsKSk7CisKKwluZXN0ID0gbW5sX2F0dHJfbmVzdF9zdGFydChubGgsIFRJUENfTkxBX05FVCk7CisJbW5sX2F0dHJfcHV0X3UzMihubGgsIFRJUENfTkxBX05FVF9JRCwgbmV0aWQpOworCW1ubF9hdHRyX25lc3RfZW5kKG5saCwgbmVzdCk7CisKKwlyZXR1cm4gbXNnX2RvaXQobmxoLCBOVUxMLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgY21kX25vZGVfc2V0X2hlbHAoc3RydWN0IGNtZGwgKmNtZGwpCit7CisJZnByaW50ZihzdGRlcnIsCisJCSJVc2FnZTogJXMgbm9kZSBzZXQgUFJPUEVSVFlcblxuIgorCQkiUFJPUEVSVElFU1xuIgorCQkiIGFkZHJlc3MgQUREUkVTUyAgICAgICAtIFNldCBsb2NhbCBhZGRyZXNzXG4iCisJCSIgbmV0aWQgTkVUSUQgICAgICAgICAgIC0gU2V0IGxvY2FsIG5ldGlkXG4iLAorCQljbWRsLT5hcmd2WzBdKTsKK30KKworc3RhdGljIGludCBjbWRfbm9kZV9zZXQoc3RydWN0IG5sbXNnaGRyICpubGgsIGNvbnN0IHN0cnVjdCBjbWQgKmNtZCwKKwkJCXN0cnVjdCBjbWRsICpjbWRsLCB2b2lkICpkYXRhKQoreworCWNvbnN0IHN0cnVjdCBjbWQgY21kc1tdID0geworCQl7ICJhZGRyZXNzIiwJY21kX25vZGVfc2V0X2FkZHIsCU5VTEwgfSwKKwkJeyAibmV0aWQiLAljbWRfbm9kZV9zZXRfbmV0aWQsCU5VTEwgfSwKKwkJeyBOVUxMIH0KKwl9OworCisJcmV0dXJuIHJ1bl9jbWQobmxoLCBjbWQsIGNtZHMsIGNtZGwsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBjbWRfbm9kZV9nZXRfaGVscChzdHJ1Y3QgY21kbCAqY21kbCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwKKwkJIlVzYWdlOiAlcyBub2RlIGdldCBQUk9QRVJUWVxuXG4iCisJCSJQUk9QRVJUSUVTXG4iCisJCSIgYWRkcmVzcyAgICAgICAgICAgICAgIC0gR2V0IGxvY2FsIGFkZHJlc3NcbiIKKwkJIiBuZXRpZCAgICAgICAgICAgICAgICAgLSBHZXQgbG9jYWwgbmV0aWRcbiIsCisJCWNtZGwtPmFyZ3ZbMF0pOworfQorCitzdGF0aWMgaW50IGNtZF9ub2RlX2dldChzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgY29uc3Qgc3RydWN0IGNtZCAqY21kLAorCQkJc3RydWN0IGNtZGwgKmNtZGwsIHZvaWQgKmRhdGEpCit7CisJY29uc3Qgc3RydWN0IGNtZCBjbWRzW10gPSB7CisJCXsgImFkZHJlc3MiLAljbWRfbm9kZV9nZXRfYWRkciwJTlVMTCB9LAorCQl7ICJuZXRpZCIsCWNtZF9ub2RlX2dldF9uZXRpZCwJTlVMTCB9LAorCQl7IE5VTEwgfQorCX07CisKKwlyZXR1cm4gcnVuX2NtZChubGgsIGNtZCwgY21kcywgY21kbCwgTlVMTCk7Cit9CisKK3ZvaWQgY21kX25vZGVfaGVscChzdHJ1Y3QgY21kbCAqY21kbCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwKKwkJIlVzYWdlOiAlcyBub2RlIENPTU1BTkQgW0FSR1NdIC4uLlxuXG4iCisJCSJDT01NQU5EU1xuIgorCQkiIGxpc3QgICAgICAgICAgICAgICAgICAtIExpc3QgcmVtb3RlIG5vZGVzXG4iCisJCSIgZ2V0ICAgICAgICAgICAgICAgICAgIC0gR2V0IGxvY2FsIG5vZGUgcGFyYW1ldGVyc1xuIgorCQkiIHNldCAgICAgICAgICAgICAgICAgICAtIFNldCBsb2NhbCBub2RlIHBhcmFtZXRlcnNcbiIsCisJCWNtZGwtPmFyZ3ZbMF0pOworfQorCitpbnQgY21kX25vZGUoc3RydWN0IG5sbXNnaGRyICpubGgsIGNvbnN0IHN0cnVjdCBjbWQgKmNtZCwgc3RydWN0IGNtZGwgKmNtZGwsCisJICAgICB2b2lkICpkYXRhKQoreworCWNvbnN0IHN0cnVjdCBjbWQgY21kc1tdID0geworCQl7ICJsaXN0IiwJY21kX25vZGVfbGlzdCwJTlVMTCB9LAorCQl7ICJnZXQiLAljbWRfbm9kZV9nZXQsCWNtZF9ub2RlX2dldF9oZWxwIH0sCisJCXsgInNldCIsCWNtZF9ub2RlX3NldCwJY21kX25vZGVfc2V0X2hlbHAgfSwKKwkJeyBOVUxMIH0KKwl9OworCisJcmV0dXJuIHJ1bl9jbWQobmxoLCBjbWQsIGNtZHMsIGNtZGwsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGlwYy9ub2RlLmggYi9pcHJvdXRlMi90aXBjL25vZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmVlMWZkCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGlwYy9ub2RlLmgKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIG5vZGUuaAlUSVBDIG5vZGUgZnVuY3Rpb25hbGl0eS4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglSaWNoYXJkIEFscGUgPHJpY2hhcmQuYWxwZUBlcmljc3Nvbi5jb20+CisgKi8KKworI2lmbmRlZiBfVElQQ19OT0RFX0gKKyNkZWZpbmUgX1RJUENfTk9ERV9ICisKK2V4dGVybiBpbnQgaGVscF9mbGFnOworCitpbnQgY21kX25vZGUoc3RydWN0IG5sbXNnaGRyICpubGgsIGNvbnN0IHN0cnVjdCBjbWQgKmNtZCwgc3RydWN0IGNtZGwgKmNtZGwsCisJICAgICB2b2lkICpkYXRhKTsKK3ZvaWQgY21kX25vZGVfaGVscChzdHJ1Y3QgY21kbCAqY21kbCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGlwYy9wZWVyLmMgYi9pcHJvdXRlMi90aXBjL3BlZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTBjNzNjCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGlwYy9wZWVyLmMKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIHBlZXIuYwlUSVBDIHBlZXIgZnVuY3Rpb25hbGl0eS4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglSaWNoYXJkIEFscGUgPHJpY2hhcmQuYWxwZUBlcmljc3Nvbi5jb20+CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPGxpbnV4L3RpcGNfbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3RpcGMuaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaWJtbmwvbGlibW5sLmg+CisKKyNpbmNsdWRlICJjbWRsLmgiCisjaW5jbHVkZSAibXNnLmgiCisjaW5jbHVkZSAibWlzYy5oIgorI2luY2x1ZGUgInBlZXIuaCIKKworc3RhdGljIGludCBjbWRfcGVlcl9ybV9hZGRyKHN0cnVjdCBubG1zZ2hkciAqbmxoLCBjb25zdCBzdHJ1Y3QgY21kICpjbWQsCisJCQkgICAgc3RydWN0IGNtZGwgKmNtZGwsIHZvaWQgKmRhdGEpCit7CisJY2hhciAqc3RyOworCXVpbnQzMl90IGFkZHI7CisJc3RydWN0IG5sYXR0ciAqbmVzdDsKKwljaGFyIGJ1ZltNTkxfU09DS0VUX0JVRkZFUl9TSVpFXTsKKworCWlmICgoY21kbC0+YXJnYyAhPSBjbWRsLT5vcHRpbmQgKyAxKSB8fCBoZWxwX2ZsYWcpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgcGVlciByZW1vdmUgYWRkcmVzcyBBRERSRVNTXG4iLAorCQkJY21kbC0+YXJndlswXSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN0ciA9IHNoaWZ0X2NtZGwoY21kbCk7CisJYWRkciA9IHN0cjJhZGRyKHN0cik7CisJaWYgKCFhZGRyKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoIShubGggPSBtc2dfaW5pdChidWYsIFRJUENfTkxfUEVFUl9SRU1PVkUpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yLCBtZXNzYWdlIGluaXRpYWxpc2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwluZXN0ID0gbW5sX2F0dHJfbmVzdF9zdGFydChubGgsIFRJUENfTkxBX05FVCk7CisJbW5sX2F0dHJfcHV0X3UzMihubGgsIFRJUENfTkxBX05FVF9BRERSLCBhZGRyKTsKKwltbmxfYXR0cl9uZXN0X2VuZChubGgsIG5lc3QpOworCisJcmV0dXJuIG1zZ19kb2l0KG5saCwgTlVMTCwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGNtZF9wZWVyX3JtX2hlbHAoc3RydWN0IGNtZGwgKmNtZGwpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgcGVlciByZW1vdmUgYWRkcmVzcyBBRERSRVNTXG4iLAorCQljbWRsLT5hcmd2WzBdKTsKK30KKworc3RhdGljIGludCBjbWRfcGVlcl9ybShzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgY29uc3Qgc3RydWN0IGNtZCAqY21kLAorCQkJc3RydWN0IGNtZGwgKmNtZGwsIHZvaWQgKmRhdGEpCit7CisJY29uc3Qgc3RydWN0IGNtZCBjbWRzW10gPSB7CisJCXsgImFkZHJlc3MiLAljbWRfcGVlcl9ybV9hZGRyLAljbWRfcGVlcl9ybV9oZWxwIH0sCisJCXsgTlVMTCB9CisJfTsKKworCXJldHVybiBydW5fY21kKG5saCwgY21kLCBjbWRzLCBjbWRsLCBOVUxMKTsKK30KKwordm9pZCBjbWRfcGVlcl9oZWxwKHN0cnVjdCBjbWRsICpjbWRsKQoreworCWZwcmludGYoc3RkZXJyLAorCQkiVXNhZ2U6ICVzIHBlZXIgQ09NTUFORCBbQVJHU10gLi4uXG5cbiIKKwkJIkNPTU1BTkRTXG4iCisJCSIgcmVtb3ZlICAgICAgICAgICAgICAgIC0gUmVtb3ZlIGFuIG9mZmxpbmUgcGVlciBub2RlXG4iLAorCQljbWRsLT5hcmd2WzBdKTsKK30KKworaW50IGNtZF9wZWVyKHN0cnVjdCBubG1zZ2hkciAqbmxoLCBjb25zdCBzdHJ1Y3QgY21kICpjbWQsIHN0cnVjdCBjbWRsICpjbWRsLAorCSAgICAgdm9pZCAqZGF0YSkKK3sKKwljb25zdCBzdHJ1Y3QgY21kIGNtZHNbXSA9IHsKKwkJeyAicmVtb3ZlIiwJY21kX3BlZXJfcm0sCWNtZF9wZWVyX3JtX2hlbHAgfSwKKwkJeyBOVUxMIH0KKwl9OworCisJcmV0dXJuIHJ1bl9jbWQobmxoLCBjbWQsIGNtZHMsIGNtZGwsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGlwYy9wZWVyLmggYi9pcHJvdXRlMi90aXBjL3BlZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTcyMjYxCi0tLSAvZGV2L251bGwKKysrIGIvaXByb3V0ZTIvdGlwYy9wZWVyLmgKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIHBlZXIuaAlUSVBDIHBlZXIgZnVuY3Rpb25hbGl0eS4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglSaWNoYXJkIEFscGUgPHJpY2hhcmQuYWxwZUBlcmljc3Nvbi5jb20+CisgKi8KKworI2lmbmRlZiBfVElQQ19QRUVSX0gKKyNkZWZpbmUgX1RJUENfUEVFUl9ICisKK2V4dGVybiBpbnQgaGVscF9mbGFnOworCitpbnQgY21kX3BlZXIoc3RydWN0IG5sbXNnaGRyICpubGgsIGNvbnN0IHN0cnVjdCBjbWQgKmNtZCwgc3RydWN0IGNtZGwgKmNtZGwsCisJICAgICB2b2lkICpkYXRhKTsKK3ZvaWQgY21kX3BlZXJfaGVscChzdHJ1Y3QgY21kbCAqY21kbCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGlwYy9zb2NrZXQuYyBiL2lwcm91dGUyL3RpcGMvc29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhiYTgyMQotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RpcGMvc29ja2V0LmMKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBzb2NrZXQuYwlUSVBDIHNvY2tldCBmdW5jdGlvbmFsaXR5LgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CVJpY2hhcmQgQWxwZSA8cmljaGFyZC5hbHBlQGVyaWNzc29uLmNvbT4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8bGludXgvdGlwYy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpcGNfbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2dlbmV0bGluay5oPgorI2luY2x1ZGUgPGxpYm1ubC9saWJtbmwuaD4KKworI2luY2x1ZGUgImNtZGwuaCIKKyNpbmNsdWRlICJtc2cuaCIKKyNpbmNsdWRlICJzb2NrZXQuaCIKKworI2RlZmluZSBQT1JUSURfU1RSX0xFTiA0NSAvKiBGb3VyIHUzMiBhbmQgZml2ZSBkZWxpbWl0ZXIgY2hhcnMgKi8KKworc3RhdGljIGludCBwdWJsX2xpc3RfY2IoY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdlbmxtc2doZHIgKmdlbmwgPSBtbmxfbmxtc2dfZ2V0X3BheWxvYWQobmxoKTsKKwlzdHJ1Y3QgbmxhdHRyICppbmZvW1RJUENfTkxBX01BWCArIDFdID0ge307CisJc3RydWN0IG5sYXR0ciAqYXR0cnNbVElQQ19OTEFfU09DS19NQVggKyAxXSA9IHt9OworCisJbW5sX2F0dHJfcGFyc2UobmxoLCBzaXplb2YoKmdlbmwpLCBwYXJzZV9hdHRycywgaW5mbyk7CisJaWYgKCFpbmZvW1RJUENfTkxBX1BVQkxdKQorCQlyZXR1cm4gTU5MX0NCX0VSUk9SOworCisJbW5sX2F0dHJfcGFyc2VfbmVzdGVkKGluZm9bVElQQ19OTEFfUFVCTF0sIHBhcnNlX2F0dHJzLCBhdHRycyk7CisKKwlwcmludGYoIiAgYm91bmQgdG8geyV1LCV1LCV1fVxuIiwKKwkgICAgICAgbW5sX2F0dHJfZ2V0X3UzMihhdHRyc1tUSVBDX05MQV9QVUJMX1RZUEVdKSwKKwkgICAgICAgbW5sX2F0dHJfZ2V0X3UzMihhdHRyc1tUSVBDX05MQV9QVUJMX0xPV0VSXSksCisJICAgICAgIG1ubF9hdHRyX2dldF91MzIoYXR0cnNbVElQQ19OTEFfUFVCTF9VUFBFUl0pKTsKKworCXJldHVybiBNTkxfQ0JfT0s7Cit9CisKK3N0YXRpYyBpbnQgcHVibF9saXN0KHVpbnQzMl90IHNvY2spCit7CisJc3RydWN0IG5sbXNnaGRyICpubGg7CisJY2hhciBidWZbTU5MX1NPQ0tFVF9CVUZGRVJfU0laRV07CisJc3RydWN0IG5sYXR0ciAqbmVzdDsKKworCWlmICghKG5saCA9IG1zZ19pbml0KGJ1ZiwgVElQQ19OTF9QVUJMX0dFVCkpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3IsIG1lc3NhZ2UgaW5pdGlhbGlzYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW5lc3QgPSBtbmxfYXR0cl9uZXN0X3N0YXJ0KG5saCwgVElQQ19OTEFfU09DSyk7CisJbW5sX2F0dHJfcHV0X3UzMihubGgsIFRJUENfTkxBX1NPQ0tfUkVGLCBzb2NrKTsKKwltbmxfYXR0cl9uZXN0X2VuZChubGgsIG5lc3QpOworCisJcmV0dXJuIG1zZ19kdW1waXQobmxoLCBwdWJsX2xpc3RfY2IsIE5VTEwpOworfQorCitzdGF0aWMgaW50IHNvY2tfbGlzdF9jYihjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ2VubG1zZ2hkciAqZ2VubCA9IG1ubF9ubG1zZ19nZXRfcGF5bG9hZChubGgpOworCXN0cnVjdCBubGF0dHIgKmluZm9bVElQQ19OTEFfTUFYICsgMV0gPSB7fTsKKwlzdHJ1Y3QgbmxhdHRyICphdHRyc1tUSVBDX05MQV9TT0NLX01BWCArIDFdID0ge307CisKKwltbmxfYXR0cl9wYXJzZShubGgsIHNpemVvZigqZ2VubCksIHBhcnNlX2F0dHJzLCBpbmZvKTsKKwlpZiAoIWluZm9bVElQQ19OTEFfU09DS10pCisJCXJldHVybiBNTkxfQ0JfRVJST1I7CisKKwltbmxfYXR0cl9wYXJzZV9uZXN0ZWQoaW5mb1tUSVBDX05MQV9TT0NLXSwgcGFyc2VfYXR0cnMsIGF0dHJzKTsKKwlpZiAoIWF0dHJzW1RJUENfTkxBX1NPQ0tfUkVGXSkKKwkJcmV0dXJuIE1OTF9DQl9FUlJPUjsKKworCXByaW50Zigic29ja2V0ICV1XG4iLCBtbmxfYXR0cl9nZXRfdTMyKGF0dHJzW1RJUENfTkxBX1NPQ0tfUkVGXSkpOworCisJaWYgKGF0dHJzW1RJUENfTkxBX1NPQ0tfQ09OXSkgeworCQl1aW50MzJfdCBub2RlOworCQlzdHJ1Y3QgbmxhdHRyICpjb25bVElQQ19OTEFfQ09OX01BWCArIDFdID0ge307CisKKwkJbW5sX2F0dHJfcGFyc2VfbmVzdGVkKGF0dHJzW1RJUENfTkxBX1NPQ0tfQ09OXSwgcGFyc2VfYXR0cnMsIGNvbik7CisJCW5vZGUgPSBtbmxfYXR0cl9nZXRfdTMyKGNvbltUSVBDX05MQV9DT05fTk9ERV0pOworCisJCXByaW50ZigiICBjb25uZWN0ZWQgdG8gPCV1LiV1LiV1OiV1PiIsIHRpcGNfem9uZShub2RlKSwKKwkJCXRpcGNfY2x1c3Rlcihub2RlKSwgdGlwY19ub2RlKG5vZGUpLAorCQkJbW5sX2F0dHJfZ2V0X3UzMihjb25bVElQQ19OTEFfQ09OX1NPQ0tdKSk7CisKKwkJaWYgKGNvbltUSVBDX05MQV9DT05fRkxBR10pCisJCQlwcmludGYoIiB2aWEgeyV1LCV1fVxuIiwKKwkJCQltbmxfYXR0cl9nZXRfdTMyKGNvbltUSVBDX05MQV9DT05fVFlQRV0pLAorCQkJCW1ubF9hdHRyX2dldF91MzIoY29uW1RJUENfTkxBX0NPTl9JTlNUXSkpOworCQllbHNlCisJCQlwcmludGYoIlxuIik7CisJfSBlbHNlIGlmIChhdHRyc1tUSVBDX05MQV9TT0NLX0hBU19QVUJMXSkgeworCQlwdWJsX2xpc3QobW5sX2F0dHJfZ2V0X3UzMihhdHRyc1tUSVBDX05MQV9TT0NLX1JFRl0pKTsKKwl9CisKKwlyZXR1cm4gTU5MX0NCX09LOworfQorCitzdGF0aWMgaW50IGNtZF9zb2NrZXRfbGlzdChzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgY29uc3Qgc3RydWN0IGNtZCAqY21kLAorCQkJICAgc3RydWN0IGNtZGwgKmNtZGwsIHZvaWQgKmRhdGEpCit7CisJY2hhciBidWZbTU5MX1NPQ0tFVF9CVUZGRVJfU0laRV07CisKKwlpZiAoaGVscF9mbGFnKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIHNvY2tldCBsaXN0XG4iLCBjbWRsLT5hcmd2WzBdKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCEobmxoID0gbXNnX2luaXQoYnVmLCBUSVBDX05MX1NPQ0tfR0VUKSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvciwgbWVzc2FnZSBpbml0aWFsaXNhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIG1zZ19kdW1waXQobmxoLCBzb2NrX2xpc3RfY2IsIE5VTEwpOworfQorCit2b2lkIGNtZF9zb2NrZXRfaGVscChzdHJ1Y3QgY21kbCAqY21kbCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwKKwkJIlVzYWdlOiAlcyBzb2NrZXQgQ09NTUFORFxuXG4iCisJCSJDb21tYW5kczpcbiIKKwkJIiBsaXN0ICAgICAgICAgICAgICAgICAgLSBMaXN0IHNvY2tldHMgKHBvcnRzKVxuIiwKKwkJY21kbC0+YXJndlswXSk7Cit9CisKK2ludCBjbWRfc29ja2V0KHN0cnVjdCBubG1zZ2hkciAqbmxoLCBjb25zdCBzdHJ1Y3QgY21kICpjbWQsIHN0cnVjdCBjbWRsICpjbWRsLAorCQkgIHZvaWQgKmRhdGEpCit7CisJY29uc3Qgc3RydWN0IGNtZCBjbWRzW10gPSB7CisJCXsgImxpc3QiLAljbWRfc29ja2V0X2xpc3QsCU5VTEwgfSwKKwkJeyBOVUxMIH0KKwl9OworCisJcmV0dXJuIHJ1bl9jbWQobmxoLCBjbWQsIGNtZHMsIGNtZGwsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvaXByb3V0ZTIvdGlwYy9zb2NrZXQuaCBiL2lwcm91dGUyL3RpcGMvc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQxYjY0OAotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RpcGMvc29ja2V0LmgKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIHNvY2tldC5oCVRJUEMgc29ja2V0IGZ1bmN0aW9uYWxpdHkuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJUmljaGFyZCBBbHBlIDxyaWNoYXJkLmFscGVAZXJpY3Nzb24uY29tPgorICovCisKKyNpZm5kZWYgX1RJUENfU09DS0VUX0gKKyNkZWZpbmUgX1RJUENfU09DS0VUX0gKKworZXh0ZXJuIGludCBoZWxwX2ZsYWc7CisKK3ZvaWQgY21kX3NvY2tldF9oZWxwKHN0cnVjdCBjbWRsICpjbWRsKTsKK2ludCBjbWRfc29ja2V0KHN0cnVjdCBubG1zZ2hkciAqbmxoLCBjb25zdCBzdHJ1Y3QgY21kICpjbWQsIHN0cnVjdCBjbWRsICpjbWRsLAorCQkgIHZvaWQgKmRhdGEpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2lwcm91dGUyL3RpcGMvdGlwYy5jIGIvaXByb3V0ZTIvdGlwYy90aXBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAwZDVlMgotLS0gL2Rldi9udWxsCisrKyBiL2lwcm91dGUyL3RpcGMvdGlwYy5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiB0aXBjLglUSVBDIHV0aWxpdHkgZnJvbnRlbmQuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJUmljaGFyZCBBbHBlIDxyaWNoYXJkLmFscGVAZXJpY3Nzb24uY29tPgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiYmVhcmVyLmgiCisjaW5jbHVkZSAibGluay5oIgorI2luY2x1ZGUgIm5hbWV0YWJsZS5oIgorI2luY2x1ZGUgInNvY2tldC5oIgorI2luY2x1ZGUgIm1lZGlhLmgiCisjaW5jbHVkZSAibm9kZS5oIgorI2luY2x1ZGUgInBlZXIuaCIKKyNpbmNsdWRlICJjbWRsLmgiCisKK2ludCBoZWxwX2ZsYWc7CisKK3N0YXRpYyB2b2lkIGFib3V0KHN0cnVjdCBjbWRsICpjbWRsKQoreworCWZwcmludGYoc3RkZXJyLAorCQkiVHJhbnNwYXJlbnQgSW50ZXItUHJvY2VzcyBDb21tdW5pY2F0aW9uIFByb3RvY29sXG4iCisJCSJVc2FnZTogJXMgW09QVElPTlNdIENPTU1BTkQgW0FSR1NdIC4uLlxuIgorCQkiXG4iCisJCSJPcHRpb25zOlxuIgorCQkiIC1oLCAtLWhlbHAgXHRcdFByaW50IGhlbHAgZm9yIGxhc3QgZ2l2ZW4gY29tbWFuZFxuIgorCQkiXG4iCisJCSJDb21tYW5kczpcbiIKKwkJIiBiZWFyZXIgICAgICAgICAgICAgICAgLSBTaG93IG9yIG1vZGlmeSBiZWFyZXJzXG4iCisJCSIgbGluayAgICAgICAgICAgICAgICAgIC0gU2hvdyBvciBtb2RpZnkgbGlua3NcbiIKKwkJIiBtZWRpYSAgICAgICAgICAgICAgICAgLSBTaG93IG9yIG1vZGlmeSBtZWRpYVxuIgorCQkiIG5hbWV0YWJsZSAgICAgICAgICAgICAtIFNob3cgbmFtZXRhYmxlXG4iCisJCSIgbm9kZSAgICAgICAgICAgICAgICAgIC0gU2hvdyBvciBtb2RpZnkgbm9kZSByZWxhdGVkIHBhcmFtZXRlcnNcbiIKKwkJIiBwZWVyICAgICAgICAgICAgICAgICAgLSBQZWVyIHJlbGF0ZWQgb3BlcmF0aW9uc1xuIgorCQkiIHNvY2tldCAgICAgICAgICAgICAgICAtIFNob3cgc29ja2V0c1xuIiwKKwkJY21kbC0+YXJndlswXSk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGk7CisJaW50IHJlczsKKwlzdHJ1Y3QgY21kbCBjbWRsOworCWNvbnN0IHN0cnVjdCBjbWQgY21kID0geyJ0aXBjIiwgTlVMTCwgYWJvdXR9OworCXN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisJCXsiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCd9LAorCQl7MCwgMCwgMCwgMH0KKwl9OworCWNvbnN0IHN0cnVjdCBjbWQgY21kc1tdID0geworCQl7ICJiZWFyZXIiLAljbWRfYmVhcmVyLAljbWRfYmVhcmVyX2hlbHB9LAorCQl7ICJsaW5rIiwJY21kX2xpbmssCWNtZF9saW5rX2hlbHB9LAorCQl7ICJtZWRpYSIsCWNtZF9tZWRpYSwJY21kX21lZGlhX2hlbHB9LAorCQl7ICJuYW1ldGFibGUiLAljbWRfbmFtZXRhYmxlLAljbWRfbmFtZXRhYmxlX2hlbHB9LAorCQl7ICJub2RlIiwJY21kX25vZGUsCWNtZF9ub2RlX2hlbHB9LAorCQl7ICJwZWVyIiwJY21kX3BlZXIsCWNtZF9wZWVyX2hlbHB9LAorCQl7ICJzb2NrZXQiLAljbWRfc29ja2V0LAljbWRfc29ja2V0X2hlbHB9LAorCQl7IE5VTEwgfQorCX07CisKKwlkbyB7CisJCWludCBvcHRpb25faW5kZXggPSAwOworCisJCWkgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiaCIsIGxvbmdfb3B0aW9ucywgJm9wdGlvbl9pbmRleCk7CisKKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgJ2gnOgorCQkJLyoKKwkJCSAqIFdlIHdhbnQgdGhlIGhlbHAgZm9yIHRoZSBsYXN0IGNvbW1hbmQsIHNvIHdlIGZsYWcKKwkJCSAqIGhlcmUgaW4gb3JkZXIgdG8gcHJpbnQgbGF0ZXIuCisJCQkgKi8KKwkJCWhlbHBfZmxhZyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAtMToKKwkJCS8qIEVuZCBvZiBvcHRpb25zICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIEludmFsaWQgb3B0aW9uLCBlcnJvciBtc2cgaXMgcHJpbnRlZCBieSBnZXRvcHRzICovCisJCQlyZXR1cm4gMTsKKwkJfQorCX0gd2hpbGUgKGkgIT0gLTEpOworCisJY21kbC5vcHRpbmQgPSBvcHRpbmQ7CisJY21kbC5hcmdjID0gYXJnYzsKKwljbWRsLmFyZ3YgPSBhcmd2OworCisJaWYgKChyZXMgPSBydW5fY21kKE5VTEwsICZjbWQsIGNtZHMsICZjbWRsLCBOVUxMKSkgIT0gMCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30K